365 lines
11 KiB
JavaScript
365 lines
11 KiB
JavaScript
import { createPage, request, ensureRoleOnCenterPage } from '../../utils/base-page.js';
|
|
import { getOrderStatusText } from '../../utils/api-helper.js';
|
|
import {
|
|
STAFF_API, isStaffMode, isMerchantPortalUser, refreshStaffContext, syncStaffUi,
|
|
restoreStaffContextAfterAuth, applyStaffStatsToPage, getStaffContext,
|
|
} from '../../utils/staff-api.js';
|
|
import { ensurePhoneAuth } from '../../utils/phone-auth.js';
|
|
import { fetchGonggaoLunbo, isGonggaoCacheValid } from '../../utils/display-config';
|
|
import { ICON_KEYS, resolveMiniappIcon } from '../../utils/miniapp-icons.js';
|
|
import { fetchMerchantOrderStats, applyOrderStatsToHome } from '../../utils/merchant-order-stats.js';
|
|
|
|
const app = getApp();
|
|
|
|
const XYM_HOME_FALLBACK = {
|
|
noticeIco: 'https://bintao.xmxym88.com/xcx/bintao/38.png',
|
|
statCardBg: 'https://bintao.xmxym88.com/xcx/bintao/3.png',
|
|
kefuKeyBtn: 'https://bintao.xmxym88.com/xcx/bintao/13.png',
|
|
kefuListBtn: 'https://bintao.xmxym88.com/xcx/bintao/21.png',
|
|
iconRegular: 'https://bintao.xmxym88.com/xcx/bintao/74.png',
|
|
iconCustom: 'https://bintao.xmxym88.com/xcx/bintao/76.png',
|
|
};
|
|
|
|
/** 与订单页「全部」Tab 一致的状态筛选 */
|
|
const ALL_ORDER_ZHUANGTAI = [1, 2, 3, 4, 5, 6, 7, 8];
|
|
const RECENT_ORDER_SIZE = 5;
|
|
|
|
Page(createPage({
|
|
data: {
|
|
statusBar: 20,
|
|
navBar: 44,
|
|
isShangjia: false,
|
|
isStaffMode: false,
|
|
staffRoleName: '',
|
|
quotaAvailable: '0.00',
|
|
canDispatch: true,
|
|
canStaffManage: true,
|
|
lunboList: [],
|
|
lunbozhanwei: '/images/lunbozhanwei.jpg',
|
|
gonggao: '',
|
|
swiperCurrent: 0,
|
|
imgUrls: {
|
|
noticeIco: XYM_HOME_FALLBACK.noticeIco,
|
|
statCardBg: XYM_HOME_FALLBACK.statCardBg,
|
|
kefuKeyBtn: XYM_HOME_FALLBACK.kefuKeyBtn,
|
|
kefuListBtn: XYM_HOME_FALLBACK.kefuListBtn,
|
|
iconRegular: XYM_HOME_FALLBACK.iconRegular,
|
|
iconCustom: XYM_HOME_FALLBACK.iconCustom,
|
|
},
|
|
stats: {
|
|
pendingCount: 0,
|
|
pendingAmount: '0.00',
|
|
todayDispatch: 0,
|
|
todayRefund: 0,
|
|
completedCount: 0,
|
|
completedAmount: '0.00',
|
|
refundCount: 0,
|
|
refundAmount: '0.00',
|
|
dispatchCount: 0,
|
|
dispatchAmount: '0.00',
|
|
},
|
|
recentOrders: [],
|
|
recentLoading: false,
|
|
},
|
|
|
|
async onLoad() {
|
|
const sys = wx.getSystemInfoSync();
|
|
this.setData({
|
|
statusBar: sys.statusBarHeight || 20,
|
|
navBar: (sys.statusBarHeight || 20) + 44,
|
|
lunbozhanwei: app.globalData.lunbozhanwei || '/images/lunbozhanwei.jpg',
|
|
});
|
|
if (wx.getStorageSync('token')) {
|
|
await restoreStaffContextAfterAuth();
|
|
}
|
|
this.checkRole();
|
|
syncStaffUi(this);
|
|
this.setupImageUrls();
|
|
await this.waitForConfigAndLoadBanner();
|
|
if (this.data.isShangjia) {
|
|
await this.loadDashboard(false);
|
|
}
|
|
this._merchantHomeSessionReady = true;
|
|
this._skipShowRefresh = true;
|
|
this.checkColdStartPopup('shangjiaduan');
|
|
},
|
|
|
|
async onShow() {
|
|
if (!app.globalData._shangjiaPhoneChecked) {
|
|
const phoneOk = await ensurePhoneAuth({ redirect: true, role: 'shangjia' });
|
|
if (!phoneOk) return;
|
|
app.globalData._shangjiaPhoneChecked = true;
|
|
}
|
|
|
|
this.registerNotificationComponent();
|
|
// 先用本地缓存渲染,再向服务端同步子客服身份
|
|
this.checkRole();
|
|
syncStaffUi(this);
|
|
if (app.globalData.ossImageUrl || app.globalData.miniappIcons) {
|
|
this.setupImageUrls();
|
|
}
|
|
const token = wx.getStorageSync('token');
|
|
const isOwner = Number(wx.getStorageSync('shangjiastatus')) === 1;
|
|
if (token && !isOwner) {
|
|
await restoreStaffContextAfterAuth();
|
|
this.checkRole();
|
|
syncStaffUi(this);
|
|
} else if (isStaffMode()) {
|
|
await refreshStaffContext(request);
|
|
this.checkRole();
|
|
syncStaffUi(this);
|
|
applyStaffStatsToPage(this, getStaffContext());
|
|
}
|
|
|
|
if (this.data.isShangjia) {
|
|
ensureRoleOnCenterPage(this, 'shangjia');
|
|
}
|
|
if (app.startImWhenReady) app.startImWhenReady();
|
|
|
|
if (this._skipShowRefresh) {
|
|
this._skipShowRefresh = false;
|
|
return;
|
|
}
|
|
|
|
const silent = this._merchantHomeSessionReady;
|
|
if (this.data.isShangjia) {
|
|
this.loadDashboard(silent);
|
|
}
|
|
if (silent) {
|
|
this.loadBannerData(true, true);
|
|
} else {
|
|
this.loadBannerData(false);
|
|
}
|
|
},
|
|
|
|
onPullDownRefresh() {
|
|
Promise.all([
|
|
this.loadBannerData(true),
|
|
this.data.isShangjia ? this.loadDashboard() : Promise.resolve(),
|
|
]).finally(() => {
|
|
wx.stopPullDownRefresh();
|
|
});
|
|
},
|
|
|
|
waitForConfigAndLoadBanner() {
|
|
if (app.globalData.ossImageUrl || app.globalData.apiBaseUrl) {
|
|
this.setupImageUrls();
|
|
return this.loadBannerData(true);
|
|
}
|
|
return new Promise((resolve) => {
|
|
const tick = () => {
|
|
if (app.globalData.ossImageUrl || app.globalData.apiBaseUrl) {
|
|
this.setupImageUrls();
|
|
this.loadBannerData(true).finally(resolve);
|
|
} else {
|
|
setTimeout(tick, 100);
|
|
}
|
|
};
|
|
tick();
|
|
});
|
|
},
|
|
|
|
setupImageUrls() {
|
|
const ossBase = app.globalData.ossImageUrl || '';
|
|
const homeDir = `${ossBase}beijing/shangjiaduan/home/`;
|
|
const icon = (key, fallback) => resolveMiniappIcon(app, key, fallback);
|
|
this.setData({
|
|
imgUrls: {
|
|
noticeIco: icon(ICON_KEYS.MERCHANT_HOME_NOTICE, XYM_HOME_FALLBACK.noticeIco),
|
|
statCardBg: icon(ICON_KEYS.MERCHANT_HOME_STAT_BG, `${ossBase}beijing/shangjiaduan/stat_card_bg.png`) || XYM_HOME_FALLBACK.statCardBg,
|
|
kefuKeyBtn: icon(ICON_KEYS.MERCHANT_HOME_KEFU_KEY, XYM_HOME_FALLBACK.kefuKeyBtn),
|
|
kefuListBtn: icon(ICON_KEYS.MERCHANT_HOME_KEFU_LIST, XYM_HOME_FALLBACK.kefuListBtn),
|
|
iconRegular: icon(ICON_KEYS.MERCHANT_HOME_REGULAR, XYM_HOME_FALLBACK.iconRegular),
|
|
iconCustom: icon(ICON_KEYS.MERCHANT_HOME_CUSTOM, XYM_HOME_FALLBACK.iconCustom),
|
|
},
|
|
});
|
|
},
|
|
|
|
processImageUrls(urlList) {
|
|
if (!urlList || !Array.isArray(urlList)) return [];
|
|
const oss = app.globalData.ossImageUrl || '';
|
|
return urlList.map((url) => (url && url.startsWith('http') ? url : oss + url));
|
|
},
|
|
|
|
checkRole() {
|
|
syncStaffUi(this);
|
|
},
|
|
|
|
loadBannerData(forceFetch, silent) {
|
|
const g = app.globalData || {};
|
|
const cachedList = g.shangpinlunbo || [];
|
|
if (!forceFetch && isGonggaoCacheValid(app) && cachedList.length) {
|
|
this.setData({
|
|
lunboList: this.processImageUrls(cachedList),
|
|
gonggao: g.shangpingonggao || '',
|
|
lunbozhanwei: g.lunbozhanwei || this.data.lunbozhanwei,
|
|
});
|
|
return Promise.resolve();
|
|
}
|
|
return fetchGonggaoLunbo(app, 'merchant_home').then((data) => {
|
|
if (!data) return;
|
|
this.setData({
|
|
lunboList: this.processImageUrls(app.globalData.shangpinlunbo),
|
|
gonggao: app.globalData.shangpingonggao || '',
|
|
});
|
|
}).catch(() => {});
|
|
},
|
|
|
|
async loadDashboard(silent = false) {
|
|
await Promise.all([
|
|
this.loadShangjiaBrief(),
|
|
this.loadPendingStats(),
|
|
this.loadRecentOrders(silent),
|
|
]);
|
|
},
|
|
|
|
async loadShangjiaBrief() {
|
|
if (isStaffMode()) {
|
|
const ctx = await refreshStaffContext(request);
|
|
syncStaffUi(this);
|
|
applyStaffStatsToPage(this, ctx);
|
|
return;
|
|
}
|
|
try {
|
|
const res = await request({
|
|
url: '/yonghu/shangjiaxinxi',
|
|
method: 'POST',
|
|
});
|
|
if (res.data && res.data.code === 200) {
|
|
const d = res.data.data || {};
|
|
app.globalData.shangjia = d;
|
|
this.setData({
|
|
stats: {
|
|
...this.data.stats,
|
|
todayDispatch: d.jinripaidan || 0,
|
|
todayRefund: d.jinrituikuan || 0,
|
|
},
|
|
});
|
|
}
|
|
} catch (e) {
|
|
console.error('商家信息加载失败', e);
|
|
}
|
|
},
|
|
|
|
async loadPendingStats() {
|
|
try {
|
|
const data = await fetchMerchantOrderStats(request, {});
|
|
applyOrderStatsToHome(this, data);
|
|
} catch (e) {
|
|
console.warn('待结算统计失败', e);
|
|
}
|
|
},
|
|
|
|
/** 最近订单:同订单页「全部」筛选,取最新若干条 */
|
|
async loadRecentOrders(silent = false) {
|
|
if (this.data.recentLoading && !silent) return;
|
|
if (silent && this._recentOrdersRequesting) return;
|
|
if (!silent) {
|
|
this.setData({ recentLoading: true });
|
|
}
|
|
this._recentOrdersRequesting = true;
|
|
try {
|
|
const res = await request({
|
|
url: isStaffMode() ? STAFF_API.orderList : '/dingdan/sjdingdanhq',
|
|
method: 'POST',
|
|
data: {
|
|
zhuangtai_list: ALL_ORDER_ZHUANGTAI,
|
|
page: 1,
|
|
page_size: RECENT_ORDER_SIZE,
|
|
},
|
|
});
|
|
if (res.data && (res.data.code === 0 || res.data.code === 200)) {
|
|
const oss = app.globalData.ossImageUrl || '';
|
|
const list = (res.data.data.list || []).map((item) => {
|
|
let tupian = item.tupian || '';
|
|
if (tupian && !tupian.startsWith('http')) {
|
|
tupian = oss + tupian;
|
|
}
|
|
const raw = { ...item, tupian };
|
|
return {
|
|
dingdan_id: item.dingdan_id,
|
|
title: item.jieshao || '暂无描述',
|
|
time: item.create_time || item.CreateTime || '',
|
|
status: getOrderStatusText(item.zhuangtai),
|
|
money: item.jine || '0.00',
|
|
raw,
|
|
};
|
|
});
|
|
this.setData({ recentOrders: list });
|
|
}
|
|
} catch (e) {
|
|
console.error('最近订单加载失败', e);
|
|
} finally {
|
|
this._recentOrdersRequesting = false;
|
|
if (!silent) {
|
|
this.setData({ recentLoading: false });
|
|
}
|
|
}
|
|
},
|
|
|
|
onSwiperChange(e) {
|
|
this.setData({ swiperCurrent: e.detail.current });
|
|
},
|
|
|
|
goRegularDispatch() {
|
|
wx.navigateTo({ url: '/pages/merchant-regular-dispatch/merchant-regular-dispatch' });
|
|
},
|
|
|
|
goLinkDispatch() {
|
|
wx.navigateTo({ url: '/pages/express-order/express-order' });
|
|
},
|
|
|
|
goCustomDispatch() {
|
|
wx.navigateTo({ url: '/pages/merchant-dispatch/merchant-dispatch' });
|
|
},
|
|
|
|
goDispatch() {
|
|
this.goCustomDispatch();
|
|
},
|
|
|
|
goExpress() {
|
|
this.goLinkDispatch();
|
|
},
|
|
|
|
goOrdersTab() {
|
|
wx.redirectTo({ url: '/pages/merchant-orders/merchant-orders' });
|
|
},
|
|
|
|
goPendingOrders() {
|
|
wx.redirectTo({ url: '/pages/merchant-orders/merchant-orders' });
|
|
},
|
|
|
|
goOrderDetail(e) {
|
|
const index = e.currentTarget.dataset.index;
|
|
const row = this.data.recentOrders[index];
|
|
if (!row || !row.raw) return;
|
|
const dataStr = encodeURIComponent(JSON.stringify(row.raw));
|
|
wx.navigateTo({
|
|
url: `/pages/merchant-order-detail/merchant-order-detail?dingdanData=${dataStr}`,
|
|
});
|
|
},
|
|
|
|
goKefuKey() {
|
|
wx.navigateTo({ url: '/pages/merchant-kefu-key/merchant-kefu-key' });
|
|
},
|
|
|
|
goKefuList() {
|
|
wx.navigateTo({ url: '/pages/merchant-kefu-list/merchant-kefu-list' });
|
|
},
|
|
|
|
goMerchantProfile() {
|
|
wx.redirectTo({ url: '/pages/merchant/merchant' });
|
|
},
|
|
|
|
goRegister() {
|
|
wx.redirectTo({ url: '/pages/merchant/merchant' });
|
|
},
|
|
}, {
|
|
roleConfig: {
|
|
role: 'shangjia',
|
|
statusKey: 'shangjiastatus',
|
|
dataFlag: 'isShangjia',
|
|
pageId: 'shangjiaduan',
|
|
},
|
|
}));
|