446 lines
14 KiB
JavaScript
446 lines
14 KiB
JavaScript
// pages/shangjiazhongxin/shangjiiazhongxin.js
|
|
|
|
import { createPage, ensureRoleOnCenterPage, lockPrimaryRole, parseSceneOptions, request } from '../../utils/base-page.js';
|
|
import { ensureLogin } from '../../utils/login.js';
|
|
import {
|
|
STAFF_API, isStaffMode, isMerchantPortalUser, refreshStaffContext, syncStaffUi, getStaffContext,
|
|
restoreStaffContextAfterAuth, applyStaffStatsToPage, guardMerchantOwnerAction, clearStaffSession,
|
|
} from '../../utils/staff-api.js';
|
|
import { clearCacheAndEnterNormal } from '../../utils/base-page.js';
|
|
|
|
const app = getApp();
|
|
|
|
Page(createPage({
|
|
data: {
|
|
// 图片资源
|
|
imgUrls: {
|
|
pageBg: '',
|
|
avatarCardBg: '',
|
|
assetCardBg: '',
|
|
statCardBg: '',
|
|
funcItemBg: '',
|
|
primaryFuncBg: '',
|
|
highlightFuncBg: '',
|
|
iconRelease: '',
|
|
iconFast: '',
|
|
iconOrders: '',
|
|
iconService: '',
|
|
iconPunish: '',
|
|
iconRank: '',
|
|
iconRecharge: '',
|
|
iconWithdraw: '',
|
|
iconRefresh: '',
|
|
iconCopy: '',
|
|
avatarFrame: '',
|
|
iconClear: '',
|
|
},
|
|
|
|
// 商家状态
|
|
isShangjia: false,
|
|
isStaffMode: false,
|
|
staffRoleName: '',
|
|
quotaAvailable: '0.00',
|
|
canDispatch: true,
|
|
canStaffManage: true,
|
|
canAudit: true,
|
|
showRechargeWithdraw: true,
|
|
isAutoRegistering: false,
|
|
staffBooting: false,
|
|
|
|
// 用户基础信息
|
|
uid: '',
|
|
avatarUrl: '',
|
|
nicheng: '',
|
|
|
|
// 商家核心数据
|
|
sjyue: '0.00',
|
|
fabu: 0,
|
|
tuikuan: 0,
|
|
jinriliushui: '0.00',
|
|
jinyueliushui: '0.00',
|
|
jinridingdan: 0,
|
|
jinrituikuan: 0,
|
|
chenghaoList: [],
|
|
|
|
// 交互控制
|
|
inviteCode: '',
|
|
pendingCount: 0,
|
|
punishPending: 0,
|
|
scrollRefreshing: false,
|
|
statusBar: 20,
|
|
navBar: 44,
|
|
},
|
|
|
|
async onLoad(options) {
|
|
const sys = wx.getSystemInfoSync();
|
|
this.setData({
|
|
statusBar: sys.statusBarHeight || 20,
|
|
navBar: (sys.statusBarHeight || 20) + 44,
|
|
});
|
|
const parsed = parseSceneOptions(options);
|
|
this.setupImageUrls();
|
|
if (wx.getStorageSync('token')) {
|
|
await restoreStaffContextAfterAuth();
|
|
}
|
|
this.checkRoleStatus();
|
|
|
|
const inviteCode = parsed.inviteCode;
|
|
if (inviteCode) {
|
|
this.setData({ inviteCode });
|
|
setTimeout(() => this.handleInviteCodeWithLoginCheck({
|
|
inviteCode,
|
|
role: 'shangjia',
|
|
statusKey: 'shangjiastatus',
|
|
alreadyMsg: '您已是商家',
|
|
onNeedLogin: (code) => {
|
|
this.setData({ inviteCode: code });
|
|
ensureLogin({ silent: false, page: this })
|
|
.then(() => {
|
|
if (!this.data.isShangjia) {
|
|
wx.showLoading({ title: '商家注册中...', mask: true });
|
|
this.setData({ isAutoRegistering: true });
|
|
this.onRegister();
|
|
}
|
|
})
|
|
.catch(() => {});
|
|
},
|
|
onAlreadyRegistered: () => {
|
|
wx.showToast({ title: '您已是商家', icon: 'success' });
|
|
ensureRoleOnCenterPage(this, 'shangjia');
|
|
},
|
|
}), 500);
|
|
}
|
|
|
|
this.checkColdStartPopup('shangjiaduan');
|
|
},
|
|
|
|
async onShow() {
|
|
this.registerNotificationComponent();
|
|
try {
|
|
const token = wx.getStorageSync('token');
|
|
const isOwner = Number(wx.getStorageSync('shangjiastatus')) === 1;
|
|
if (token && !isOwner) {
|
|
await restoreStaffContextAfterAuth();
|
|
}
|
|
this.checkRoleStatus();
|
|
syncStaffUi(this);
|
|
if (this.data.isShangjia) {
|
|
ensureRoleOnCenterPage(this, 'shangjia');
|
|
this.applyCachedShangjiaFromGlobal();
|
|
}
|
|
} catch (err) {
|
|
console.error('商家个人中心 onShow', err);
|
|
this.setData({ isLoading: false, staffBooting: false });
|
|
}
|
|
},
|
|
|
|
applyCachedShangjiaFromGlobal() {
|
|
const cached = app.globalData.shangjia || {};
|
|
const ctx = getStaffContext();
|
|
if (isStaffMode() && ctx) {
|
|
syncStaffUi(this);
|
|
return;
|
|
}
|
|
if (!cached.nicheng && !cached.sjyue) return;
|
|
this.setData({
|
|
nicheng: cached.nicheng || this.data.nicheng || '',
|
|
sjyue: cached.sjyue || this.data.sjyue || '0.00',
|
|
fabu: cached.fadanzong ?? this.data.fabu ?? 0,
|
|
tuikuan: cached.tuikuanzong ?? this.data.tuikuan ?? 0,
|
|
jinriliushui: cached.riliushui || this.data.jinriliushui || '0.00',
|
|
jinyueliushui: cached.yueliushui || this.data.jinyueliushui || '0.00',
|
|
jinridingdan: cached.jinripaidan ?? this.data.jinridingdan ?? 0,
|
|
jinrituikuan: cached.jinrituikuan ?? this.data.jinrituikuan ?? 0,
|
|
chenghaoList: cached.chenghao_list || this.data.chenghaoList || [],
|
|
});
|
|
},
|
|
|
|
async onPullDownRefresh() {
|
|
if (this._pullRefreshing) return;
|
|
this._pullRefreshing = true;
|
|
this.setData({ scrollRefreshing: true });
|
|
try {
|
|
if (isStaffMode()) {
|
|
await refreshStaffContext(request);
|
|
await this.loadStaffProfile();
|
|
} else {
|
|
await this.getShangjiaInfo();
|
|
await Promise.allSettled([this.loadPendingCount(), this.loadPunishPending()]);
|
|
}
|
|
syncStaffUi(this);
|
|
wx.showToast({ title: '已更新', icon: 'success', duration: 1200 });
|
|
} catch (e) {
|
|
wx.showToast({ title: '刷新失败', icon: 'none' });
|
|
} finally {
|
|
this._pullRefreshing = false;
|
|
this.setData({ scrollRefreshing: false });
|
|
}
|
|
},
|
|
|
|
// 图片路径初始化
|
|
setupImageUrls() {
|
|
const ossBase = app.globalData.ossImageUrl || '';
|
|
const imgDir = `${ossBase}beijing/shangjiaduan/`;
|
|
this.setData({
|
|
imgUrls: this.initImageUrls({
|
|
pageBg: `${imgDir}page_bg.png`,
|
|
avatarCardBg: `${imgDir}avatar_card_bg.png`,
|
|
assetCardBg: `${imgDir}asset_card_bg.png`,
|
|
statCardBg: `${imgDir}stat_card_bg.png`,
|
|
funcItemBg: `${imgDir}func_item_bg.png`,
|
|
primaryFuncBg: `${imgDir}primary_func_bg.png`,
|
|
highlightFuncBg: `${imgDir}highlight_func_bg.png`,
|
|
iconRelease: `${imgDir}icon_release.png`,
|
|
iconFast: `${imgDir}icon_fast.png`,
|
|
iconOrders: `${imgDir}icon_orders.png`,
|
|
iconService: `${imgDir}icon_service.png`,
|
|
iconPunish: `${imgDir}icon_punish.png`,
|
|
iconRank: `${imgDir}icon_rank.png`,
|
|
iconRecharge: `${imgDir}icon_recharge.png`,
|
|
iconWithdraw: `${imgDir}icon_withdraw.png`,
|
|
iconRefresh: `${imgDir}icon_refresh.png`,
|
|
iconCopy: `${imgDir}icon_copy.png`,
|
|
avatarFrame: `${imgDir}avatar_frame.png`,
|
|
iconClear: `${ossBase}beijing/tubiao/grzx_qingchu.jpg`,
|
|
iconSwitch: '/images/_exit.png',
|
|
})
|
|
});
|
|
},
|
|
|
|
// 商家状态检查(子客服与老板均可进入;子客服绝不走商家注册接口)
|
|
checkRoleStatus() {
|
|
try {
|
|
const uid = wx.getStorageSync('uid');
|
|
const portal = isMerchantPortalUser();
|
|
const staffFlag = Number(wx.getStorageSync('staffstatus')) === 1;
|
|
|
|
if (portal) {
|
|
this.setData({ isShangjia: true, uid: uid || '', staffBooting: false, isLoading: false });
|
|
syncStaffUi(this);
|
|
if (isStaffMode()) {
|
|
this.loadStaffProfile();
|
|
} else if (Number(wx.getStorageSync('shangjiastatus')) === 1) {
|
|
this.loadAvatar();
|
|
this.getShangjiaInfo();
|
|
} else if (staffFlag) {
|
|
this.bootStaffPortal(uid);
|
|
}
|
|
ensureRoleOnCenterPage(this, 'shangjia');
|
|
return;
|
|
}
|
|
|
|
if (staffFlag) {
|
|
this.bootStaffPortal(uid);
|
|
return;
|
|
}
|
|
|
|
this.setData({ isShangjia: false, staffBooting: false, isLoading: false });
|
|
syncStaffUi(this);
|
|
} catch (error) {
|
|
console.error('读取商家状态失败', error);
|
|
this.setData({ isShangjia: false, staffBooting: false, isLoading: false });
|
|
syncStaffUi(this);
|
|
}
|
|
},
|
|
|
|
/** 已绑定客服、尚未拉到 context 时恢复身份(不展示商家邀请码) */
|
|
async bootStaffPortal(uid) {
|
|
this.setData({ staffBooting: true, isLoading: true, uid: uid || '' });
|
|
syncStaffUi(this);
|
|
await restoreStaffContextAfterAuth();
|
|
if (isMerchantPortalUser()) {
|
|
this.setData({ isShangjia: true, staffBooting: false, isLoading: false });
|
|
syncStaffUi(this);
|
|
if (isStaffMode()) {
|
|
await this.loadStaffProfile();
|
|
}
|
|
ensureRoleOnCenterPage(this, 'shangjia');
|
|
return;
|
|
}
|
|
this.setData({ staffBooting: false, isLoading: false, isShangjia: false });
|
|
syncStaffUi(this);
|
|
wx.showToast({ title: '客服身份已失效,请联系商家老板', icon: 'none' });
|
|
},
|
|
|
|
onInviteCodeInput(e) {
|
|
this.setData({ inviteCode: (e.detail.value || '').trim() });
|
|
},
|
|
|
|
goToStaffJoin() {
|
|
wx.navigateTo({ url: '/pages/staff-join/staff-join' });
|
|
},
|
|
|
|
clearCache() {
|
|
wx.showModal({
|
|
title: '清除缓存',
|
|
content: '将清除所有登录与身份数据,并回到点单端,确定继续?',
|
|
confirmText: '确定',
|
|
cancelText: '取消',
|
|
success: (r) => {
|
|
if (!r.confirm) return;
|
|
clearStaffSession();
|
|
clearCacheAndEnterNormal(this);
|
|
},
|
|
});
|
|
},
|
|
|
|
async loadStaffProfile() {
|
|
const ctx = await refreshStaffContext(request);
|
|
const profile = wx.getStorageSync('nicheng') || (ctx && ctx.display_name) || '商家客服';
|
|
this.loadAvatar();
|
|
this.setData({
|
|
nicheng: (ctx && ctx.display_name) || profile,
|
|
sjyue: (ctx && ctx.wallet && ctx.wallet.quota_available) || '0.00',
|
|
chenghaoList: [],
|
|
isLoading: false,
|
|
});
|
|
syncStaffUi(this);
|
|
applyStaffStatsToPage(this, ctx);
|
|
},
|
|
|
|
// 获取商家信息(仅商家老板;子客服禁止调用)
|
|
async getShangjiaInfo() {
|
|
if (isStaffMode() || Number(wx.getStorageSync('staffstatus')) === 1) {
|
|
return this.loadStaffProfile();
|
|
}
|
|
return this.loadData({
|
|
url: '/yonghu/shangjiaxinxi',
|
|
method: 'POST',
|
|
successCode: 200,
|
|
errorMsg: '获取商家信息失败',
|
|
onSuccess: (data) => {
|
|
// 更新全局缓存
|
|
app.globalData.shangjia = data;
|
|
wx.setStorageSync('shangjiastatus', 1);
|
|
|
|
const chenghaoList = data.chenghao_list || [];
|
|
|
|
this.setData({
|
|
nicheng: data.nicheng || '',
|
|
sjyue: data.sjyue || '0.00',
|
|
fabu: data.fadanzong || 0,
|
|
tuikuan: data.tuikuanzong || 0,
|
|
jinriliushui: data.riliushui || '0.00',
|
|
jinyueliushui: data.yueliushui || '0.00',
|
|
jinridingdan: data.jinripaidan || 0,
|
|
jinrituikuan: data.jinrituikuan || 0,
|
|
chenghaoList: chenghaoList,
|
|
isLoading: false,
|
|
});
|
|
|
|
if (this.data.isAutoRegistering) {
|
|
this.setData({ isAutoRegistering: false });
|
|
wx.showToast({ title: '商家注册成功', icon: 'success' });
|
|
}
|
|
},
|
|
});
|
|
},
|
|
|
|
refreshShangjiaInfo() {
|
|
if (isStaffMode()) {
|
|
this.throttledRefresh(() => this.loadStaffProfile());
|
|
return;
|
|
}
|
|
this.throttledRefresh(() => this.getShangjiaInfo());
|
|
},
|
|
|
|
async loadPendingCount() {
|
|
try {
|
|
const res = await request({
|
|
url: isStaffMode() ? STAFF_API.orderList : '/dingdan/sjdingdanhq',
|
|
method: 'POST',
|
|
data: { zhuangtai_list: [8], page: 1, page_size: 1 },
|
|
});
|
|
if (res && res.data && (res.data.code === 0 || res.data.code === 200)) {
|
|
this.setData({ pendingCount: res.data.data.pending_count || 0 });
|
|
}
|
|
} catch (e) {
|
|
console.error('待结算数量失败', e);
|
|
}
|
|
},
|
|
|
|
async loadPunishPending() {
|
|
try {
|
|
const res = await request({
|
|
url: '/yonghu/sjcfjlhq',
|
|
method: 'POST',
|
|
data: { page: 1, page_size: 1, zhuangtai: 0 },
|
|
});
|
|
if (res && res.data && (res.data.code === 0 || res.data.code === 200)) {
|
|
const d = res.data.data || {};
|
|
this.setData({ punishPending: d.daichuli_count || d.pending_count || 0 });
|
|
}
|
|
} catch (e) {
|
|
/* 接口字段未定时静默 */
|
|
}
|
|
},
|
|
|
|
async onRegister() {
|
|
const { inviteCode } = this.data;
|
|
await this.registerWithInviteCode({
|
|
inviteCode,
|
|
apiUrl: '/yonghu/shangjiahuce',
|
|
role: 'shangjia',
|
|
statusKey: 'shangjiastatus',
|
|
successMsg: '商家注册成功',
|
|
onSuccess: (userData) => {
|
|
app.globalData.shangjia = userData;
|
|
const chenghaoList = userData.chenghao_list || [];
|
|
this.setData({
|
|
isShangjia: true,
|
|
nicheng: userData.nicheng || '',
|
|
sjyue: userData.sjyue || '0.00',
|
|
fabu: userData.fabu || 0,
|
|
tuikuan: userData.tuikuan || 0,
|
|
jinriliushui: userData.jinriliushui || '0.00',
|
|
jinyueliushui: userData.jinyueliushui || '0.00',
|
|
jinridingdan: userData.jinridingdan || 0,
|
|
chenghaoList: chenghaoList,
|
|
isAutoRegistering: false,
|
|
});
|
|
this.loadAvatar();
|
|
ensureRoleOnCenterPage(this, 'shangjia');
|
|
lockPrimaryRole('shangjia');
|
|
},
|
|
});
|
|
},
|
|
|
|
previewAvatar() {
|
|
if (this.data.avatarUrl) {
|
|
wx.previewImage({ urls: [this.data.avatarUrl] });
|
|
}
|
|
},
|
|
|
|
// 页面跳转
|
|
goToPaiDan() { wx.navigateTo({ url: '/pages/merchant-dispatch/merchant-dispatch' }); },
|
|
goToJiSuPaiDan() {
|
|
wx.vibrateShort({ type: 'medium' });
|
|
wx.navigateTo({ url: '/pages/express-order/express-order' });
|
|
},
|
|
goToMyOrders() { wx.redirectTo({ url: '/pages/merchant-orders/merchant-orders' }); },
|
|
goToPendingOrders() { wx.redirectTo({ url: '/pages/merchant-orders/merchant-orders' }); },
|
|
goToHome() { wx.redirectTo({ url: '/pages/merchant-home/merchant-home' }); },
|
|
goToKefuKey() { wx.navigateTo({ url: '/pages/merchant-kefu-key/merchant-kefu-key' }); },
|
|
goToKefuList() { wx.navigateTo({ url: '/pages/merchant-kefu-list/merchant-kefu-list' }); },
|
|
goToAuditLog() { wx.navigateTo({ url: '/pages/merchant-staff-audit/merchant-staff-audit' }); },
|
|
goToStaffRank() { wx.navigateTo({ url: '/pages/merchant-staff-audit/merchant-staff-audit?tab=rank' }); },
|
|
goToRecharge() {
|
|
if (!guardMerchantOwnerAction('子客服无法充值,请联系商家老板')) return;
|
|
wx.navigateTo({ url: '/pages/merchant-recharge/merchant-recharge' });
|
|
},
|
|
goToWithdraw() {
|
|
if (!guardMerchantOwnerAction('子客服无法提现,请联系商家老板')) return;
|
|
wx.navigateTo({ url: '/pages/withdraw/withdraw' });
|
|
},
|
|
goToRanking() { wx.navigateTo({ url: '/pages/fighter-rank/fighter-rank?type=shangjia' }); },
|
|
goToMessages() { wx.navigateTo({ url: '/pages/merchant-msg/merchant-msg' }); },
|
|
}, {
|
|
roleConfig: {
|
|
role: 'shangjia',
|
|
statusKey: 'shangjiastatus',
|
|
dataFlag: 'isShangjia',
|
|
pageId: 'shangjiaduan',
|
|
apiUrl: '/yonghu/shangjiaxinxi',
|
|
},
|
|
}));
|