375 lines
12 KiB
JavaScript
375 lines
12 KiB
JavaScript
// pages/merchant-regular-dispatch/merchant-regular-dispatch.js
|
|
import { createPage, request } from '../../utils/base-page.js';
|
|
import {
|
|
STAFF_API, isStaffMode, refreshStaffContext, getStaffContext,
|
|
restoreStaffContextAfterAuth, isMerchantPortalUser, staffOrOwner,
|
|
} from '../../utils/staff-api.js';
|
|
|
|
const PAGE_SIZE = 50;
|
|
|
|
function apiOk(res) {
|
|
const code = res && res.data && res.data.code;
|
|
return code === 200 || code === 0;
|
|
}
|
|
|
|
Page(createPage({
|
|
data: {
|
|
sjyue: '0.00',
|
|
isStaffMode: false,
|
|
balanceLabel: '可用余额',
|
|
balanceTip: '派单将从此余额扣除',
|
|
|
|
shangpinList: [],
|
|
selectedTypeId: null,
|
|
selectedHuiyuanId: null,
|
|
selectedYaoqiuleixing: null,
|
|
currentTypeChenghaoList: [],
|
|
|
|
dingdanJieshao: '',
|
|
dingdanBeizhu: '',
|
|
laobanName: '',
|
|
waibuDingdanId: '',
|
|
zhidingUid: '',
|
|
jiage: '',
|
|
selectedLabelId: '',
|
|
selectedLabelName: '',
|
|
commissionEnabled: false,
|
|
commissionValue: '',
|
|
|
|
showTemplateSheet: false,
|
|
templateKeyword: '',
|
|
templateList: [],
|
|
templatePage: 1,
|
|
templateHasMore: true,
|
|
templateLoading: false,
|
|
|
|
isLoading: false,
|
|
isSubmitting: false,
|
|
},
|
|
|
|
async onLoad() {
|
|
if (wx.getStorageSync('token')) {
|
|
await restoreStaffContextAfterAuth();
|
|
}
|
|
if (!isMerchantPortalUser()) {
|
|
wx.showToast({ title: '请先成为商家或绑定客服', icon: 'none' });
|
|
setTimeout(() => wx.navigateBack(), 1500);
|
|
return;
|
|
}
|
|
this.loadShangjiaYue();
|
|
this.loadShangpinTypes();
|
|
},
|
|
|
|
onShow() {
|
|
this.loadShangjiaYue();
|
|
this.registerNotificationComponent();
|
|
},
|
|
|
|
loadShangjiaYue() {
|
|
const staff = isStaffMode();
|
|
this.setData({
|
|
isStaffMode: staff,
|
|
balanceLabel: staff ? '可用额度' : '可用余额',
|
|
balanceTip: staff ? '派单将从您的客服额度扣除(需老板先划额度)' : '派单将从此余额扣除',
|
|
});
|
|
if (staff) {
|
|
const ctx = getStaffContext() || {};
|
|
const wallet = ctx.wallet || {};
|
|
this.setData({ sjyue: wallet.quota_available || '0.00' });
|
|
refreshStaffContext(request).then((fresh) => {
|
|
const w = (fresh && fresh.wallet) || wallet;
|
|
this.setData({ sjyue: w.quota_available || '0.00' });
|
|
}).catch(() => {});
|
|
return;
|
|
}
|
|
const app = getApp();
|
|
const shangjiaData = app.globalData.shangjia || {};
|
|
this.setData({ sjyue: shangjiaData.sjyue || '0.00' });
|
|
},
|
|
|
|
async loadShangpinTypes() {
|
|
this.setData({ isLoading: true });
|
|
const staff = isStaffMode();
|
|
try {
|
|
const res = await request({
|
|
url: staff ? STAFF_API.productTypes : '/dingdan/sjspleixing',
|
|
method: 'POST',
|
|
});
|
|
if (apiOk(res)) {
|
|
let list = res.data.data || [];
|
|
if (!Array.isArray(list) && list.list) list = list.list;
|
|
list.reverse();
|
|
this.setData({ shangpinList: list, isLoading: false });
|
|
if (list.length > 0) {
|
|
this.setSelectedType(list[0]);
|
|
}
|
|
} else {
|
|
throw new Error((res.data && res.data.msg) || '加载失败');
|
|
}
|
|
} catch (error) {
|
|
console.error('加载商品类型失败:', error);
|
|
this.setData({ isLoading: false });
|
|
wx.showToast({ title: error.message || '加载类型失败', icon: 'none' });
|
|
}
|
|
},
|
|
|
|
setSelectedType(item) {
|
|
this.setData({
|
|
selectedTypeId: item.id,
|
|
selectedHuiyuanId: item.huiyuan_id,
|
|
selectedYaoqiuleixing: item.yaoqiuleixing,
|
|
currentTypeChenghaoList: item.chenghaoList || [],
|
|
dingdanJieshao: '',
|
|
jiage: '',
|
|
selectedLabelId: '',
|
|
selectedLabelName: '',
|
|
commissionEnabled: false,
|
|
commissionValue: '',
|
|
});
|
|
},
|
|
|
|
onSelectType(e) {
|
|
const { item } = e.currentTarget.dataset;
|
|
this.setSelectedType(item);
|
|
},
|
|
|
|
openTemplateSheet() {
|
|
if (!this.data.selectedTypeId) {
|
|
wx.showToast({ title: '请先选择订单类型', icon: 'none' });
|
|
return;
|
|
}
|
|
this.setData({
|
|
showTemplateSheet: true,
|
|
templateKeyword: '',
|
|
templateList: [],
|
|
templatePage: 1,
|
|
templateHasMore: true,
|
|
}, () => this.loadTemplates(true));
|
|
},
|
|
|
|
closeTemplateSheet() {
|
|
this.setData({ showTemplateSheet: false });
|
|
},
|
|
|
|
onTemplateKeywordInput(e) {
|
|
this.setData({ templateKeyword: e.detail.value });
|
|
},
|
|
|
|
onTemplateSearch() {
|
|
this.setData({ templateList: [], templatePage: 1, templateHasMore: true }, () => {
|
|
this.loadTemplates(true);
|
|
});
|
|
},
|
|
|
|
onTemplateScrollLower() {
|
|
const { templateHasMore, templateLoading } = this.data;
|
|
if (!templateHasMore || templateLoading) return;
|
|
this.setData({ templatePage: this.data.templatePage + 1 }, () => this.loadTemplates(false));
|
|
},
|
|
|
|
async loadTemplates(reset) {
|
|
const { selectedTypeId, templatePage, templateKeyword } = this.data;
|
|
if (!selectedTypeId) return;
|
|
this.setData({ templateLoading: true });
|
|
try {
|
|
const postData = {
|
|
shangpinTypeId: selectedTypeId,
|
|
page: templatePage,
|
|
pageSize: PAGE_SIZE,
|
|
getType: 1,
|
|
};
|
|
if (templateKeyword.trim()) {
|
|
postData.keyword = templateKeyword.trim();
|
|
}
|
|
const res = await request({
|
|
url: staffOrOwner(STAFF_API.templateList, '/peizhi/sjddmblb'),
|
|
method: 'POST',
|
|
data: postData,
|
|
});
|
|
if (apiOk(res)) {
|
|
const data = res.data.data || {};
|
|
const newTemplates = (data.list || []).map((item) => ({
|
|
mobanId: item.mobanId || item.id,
|
|
jieshao: item.jieshao || item.moban_jieshao || '',
|
|
jiage: item.jiage || item.price || '',
|
|
labelId: item.labelId || '',
|
|
labelName: item.labelName || '',
|
|
commissionEnabled: !!item.commissionEnabled,
|
|
commissionValue: item.commissionValue || '',
|
|
}));
|
|
const merged = reset || templatePage === 1
|
|
? newTemplates
|
|
: [...this.data.templateList, ...newTemplates];
|
|
this.setData({
|
|
templateList: merged,
|
|
templateHasMore: data.hasMore !== false && newTemplates.length === PAGE_SIZE,
|
|
templateLoading: false,
|
|
});
|
|
} else {
|
|
this.setData({ templateLoading: false, templateHasMore: false });
|
|
}
|
|
} catch (e) {
|
|
console.error(e);
|
|
this.setData({ templateLoading: false });
|
|
wx.showToast({ title: '加载模板失败', icon: 'none' });
|
|
}
|
|
},
|
|
|
|
onSelectTemplate(e) {
|
|
const { item } = e.currentTarget.dataset;
|
|
if (!item) return;
|
|
this.setData({
|
|
dingdanJieshao: item.jieshao || '',
|
|
jiage: String(item.jiage || ''),
|
|
selectedLabelId: item.labelId || '',
|
|
selectedLabelName: item.labelName || this.getLabelNameById(item.labelId),
|
|
commissionEnabled: !!item.commissionEnabled,
|
|
commissionValue: item.commissionValue || '',
|
|
showTemplateSheet: false,
|
|
});
|
|
},
|
|
|
|
getLabelNameById(labelId) {
|
|
if (!labelId) return '';
|
|
const found = this.data.currentTypeChenghaoList.find((x) => x.id == labelId);
|
|
return found ? found.mingcheng : '';
|
|
},
|
|
|
|
onDingdanBeizhuInput(e) { this.setData({ dingdanBeizhu: e.detail.value }); },
|
|
onLaobanNameInput(e) { this.setData({ laobanName: e.detail.value }); },
|
|
onWaibuDingdanIdInput(e) { this.setData({ waibuDingdanId: e.detail.value }); },
|
|
onZhidingUidInput(e) { this.setData({ zhidingUid: e.detail.value }); },
|
|
|
|
validateForm() {
|
|
const { selectedTypeId, dingdanJieshao, laobanName, jiage, sjyue } = this.data;
|
|
if (!selectedTypeId) {
|
|
wx.showToast({ title: '请选择订单类型', icon: 'none' });
|
|
return false;
|
|
}
|
|
if (!dingdanJieshao.trim()) {
|
|
wx.showToast({ title: '请选择订单模板', icon: 'none' });
|
|
return false;
|
|
}
|
|
if (!laobanName.trim()) {
|
|
wx.showToast({ title: '请输入老板游戏昵称', icon: 'none' });
|
|
return false;
|
|
}
|
|
if (!jiage) {
|
|
wx.showToast({ title: '模板价格无效', icon: 'none' });
|
|
return false;
|
|
}
|
|
const price = parseFloat(jiage);
|
|
if (isNaN(price) || price < 0.1 || price > 10000) {
|
|
wx.showToast({ title: '价格需在0.1-10000元之间', icon: 'none' });
|
|
return false;
|
|
}
|
|
const balance = parseFloat(sjyue);
|
|
if (price > balance) {
|
|
if (this.data.isStaffMode) {
|
|
wx.showModal({
|
|
title: '额度不足',
|
|
content: `当前可用额度${sjyue}元,需要${jiage}元。请联系商家老板划额度。`,
|
|
showCancel: false,
|
|
});
|
|
} else {
|
|
wx.showModal({
|
|
title: '余额不足',
|
|
content: `当前余额${sjyue}元,需要${jiage}元。请先充值。`,
|
|
confirmText: '去充值',
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
wx.navigateTo({ url: '/pages/merchant-recharge/merchant-recharge' });
|
|
}
|
|
},
|
|
});
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
|
|
resetForm() {
|
|
this.setData({
|
|
dingdanJieshao: '',
|
|
dingdanBeizhu: '',
|
|
laobanName: '',
|
|
waibuDingdanId: '',
|
|
zhidingUid: '',
|
|
jiage: '',
|
|
selectedLabelId: '',
|
|
selectedLabelName: '',
|
|
commissionEnabled: false,
|
|
commissionValue: '',
|
|
});
|
|
if (this.data.shangpinList.length > 0) {
|
|
this.setSelectedType(this.data.shangpinList[0]);
|
|
}
|
|
},
|
|
|
|
async onSubmit() {
|
|
if (this.data.isSubmitting) return;
|
|
if (!this.validateForm()) return;
|
|
this.setData({ isSubmitting: true });
|
|
|
|
const postData = {
|
|
shangpinTypeId: this.data.selectedTypeId,
|
|
huiyuanId: this.data.selectedHuiyuanId,
|
|
yaoqiuleixing: this.data.selectedYaoqiuleixing,
|
|
dingdanJieshao: this.data.dingdanJieshao.trim(),
|
|
dingdanBeizhu: this.data.dingdanBeizhu.trim() || '',
|
|
laobanName: this.data.laobanName.trim(),
|
|
zhidingUid: this.data.zhidingUid.trim() || '',
|
|
waibuDingdanId: this.data.waibuDingdanId.trim() || '',
|
|
jiage: this.data.jiage,
|
|
labelId: this.data.selectedLabelId || '',
|
|
labelName: this.data.selectedLabelName || '',
|
|
commissionEnabled: this.data.commissionEnabled,
|
|
commissionValue: this.data.commissionEnabled ? this.data.commissionValue : '',
|
|
};
|
|
|
|
try {
|
|
const res = await request({
|
|
url: isStaffMode() ? STAFF_API.orderDispatch : '/dingdan/sjpaifa',
|
|
method: 'POST',
|
|
data: postData,
|
|
});
|
|
if (res && res.data.code === 200) {
|
|
wx.showToast({ title: '派单成功', icon: 'success', duration: 2000 });
|
|
const orderAmount = parseFloat(this.data.jiage);
|
|
if (this.data.isStaffMode) {
|
|
this.loadShangjiaYue();
|
|
} else {
|
|
const app = getApp();
|
|
if (app.globalData.shangjia) {
|
|
const newBalance = parseFloat(app.globalData.shangjia.sjyue || '0') - orderAmount;
|
|
app.globalData.shangjia.sjyue = newBalance.toFixed(2);
|
|
app.globalData.shangjia.fadanzong = (parseInt(app.globalData.shangjia.fadanzong || '0') + 1).toString();
|
|
app.globalData.shangjia.riliushui = (parseFloat(app.globalData.shangjia.riliushui || '0') + orderAmount).toFixed(2);
|
|
app.globalData.shangjia.yueliushui = (parseFloat(app.globalData.shangjia.yueliushui || '0') + orderAmount).toFixed(2);
|
|
this.setData({ sjyue: app.globalData.shangjia.sjyue });
|
|
}
|
|
}
|
|
setTimeout(() => {
|
|
this.resetForm();
|
|
this.setData({ isSubmitting: false });
|
|
}, 1500);
|
|
} else {
|
|
wx.showModal({
|
|
title: '派单失败',
|
|
content: res.data.msg || '请稍后重试',
|
|
showCancel: false,
|
|
});
|
|
this.setData({ isSubmitting: false });
|
|
}
|
|
} catch (error) {
|
|
console.error('派单请求失败:', error);
|
|
wx.showModal({
|
|
title: '请求失败',
|
|
content: error.message || '网络错误,请检查连接',
|
|
showCancel: false,
|
|
});
|
|
this.setData({ isSubmitting: false });
|
|
}
|
|
},
|
|
}));
|