diff --git a/pages/fighter-recharge/fighter-recharge.js b/pages/fighter-recharge/fighter-recharge.js index 0c2ded2..1043084 100644 --- a/pages/fighter-recharge/fighter-recharge.js +++ b/pages/fighter-recharge/fighter-recharge.js @@ -4,6 +4,7 @@ import PopupService from '../../services/popupService.js'; import { ensurePhoneAuth } from '../../utils/phone-auth.js'; import { ICON_KEYS, resolveConfiguredIcon, resolveMiniappIcon, ICON_FOLDER, refreshPindaoConfig } from '../../utils/miniapp-icons.js'; import { resolveAvatarFromStorage, onAvatarImageError } from '../../utils/avatar.js'; +import { refreshDashouMembership } from '../../utils/dashou-profile.js'; const app = getApp(); @@ -753,10 +754,11 @@ onHide() { break; case 'huiyuan': - if (responseData && responseData.huiyuan) { + if (responseData && responseData.jifen !== undefined) { app.globalData.jinfen = responseData.jifen; - await this.updateClubmberData(responseData.huiyuan); } + // 从服务端拉完整 clumber(含总会员子类型展开),避免本地只写总会员 ID + await refreshDashouMembership(app); await this.refreshHuiyuanData(extraData); break; } @@ -776,34 +778,29 @@ onHide() { // ========== 刷新会员数据 ========== async refreshHuiyuanData(huiyuanId) { + await refreshDashouMembership(app); this.loadFromGlobalData(); await this.fetchHuiyuanList(); }, - // ========== 更新会员数据到全局变量 ========== + // ========== 更新会员数据到全局变量(兼容旧回调;优先服务端 clumber) ========== async updateClubmberData(huiyuanData) { - const app = getApp(); + const clumber = await refreshDashouMembership(app); + if (clumber && clumber.length) { + this.setData({ clubmber: [...clumber] }); + return; + } const globalClubmber = app.globalData.clumber || []; - - const { huiyuanid, huiyuanming, daoqi } = huiyuanData; - - const index = globalClubmber.findIndex(item => item.huiyuanid === huiyuanid); - + const { huiyuanid, huiyuanming, daoqi } = huiyuanData || {}; + if (!huiyuanid) return; + const index = globalClubmber.findIndex((item) => item.huiyuanid === huiyuanid); if (index >= 0) { globalClubmber[index].daoqi = daoqi; } else { - globalClubmber.push({ - huiyuanid: huiyuanid, - huiyuanming: huiyuanming, - daoqi: daoqi - }); + globalClubmber.push({ huiyuanid, huiyuanming, daoqi }); } - app.globalData.clumber = globalClubmber; - - this.setData({ - clubmber: [...globalClubmber] - }); + this.setData({ clubmber: [...globalClubmber] }); }, // ========== 检查并刷新数据 ========== diff --git a/pages/fighter/fighter.js b/pages/fighter/fighter.js index af464d7..eceb432 100644 --- a/pages/fighter/fighter.js +++ b/pages/fighter/fighter.js @@ -399,6 +399,7 @@ Page(createPage({ this.loadMyZhidingOrders(), ]); this.checkRoleStatuses(); + this.syncConfiguredAssets(); const dashouOk = results[0].status === 'fulfilled'; if (showToast) { wx.showToast({ @@ -491,16 +492,22 @@ Page(createPage({ throw new Error('打手信息获取失败'); }, + _applyRoleStatusFromApi(field, active) { + const val = active ? 1 : 0; + wx.setStorageSync(field, val); + getApp().globalData[field] = val; + return val; + }, + async _fetchGuanshiInfoSilent() { const res = await request({ url: '/yonghu/guanshixinxi', method: 'POST' }); if (res && this._isApiSuccess(res.data)) { const data = this._extractUserData(res.data); + // guanshixinxi 成功即表示已是管事;接口不返回 guanshistatus,不能依赖本地旧缓存 if (data.guanshistatus !== undefined) { - wx.setStorageSync('guanshistatus', data.guanshistatus); - getApp().globalData.guanshistatus = data.guanshistatus; - } - if (!isRoleStatusActive(data.guanshistatus ?? wx.getStorageSync('guanshistatus'))) { - return; + this._applyRoleStatusFromApi('guanshistatus', isRoleStatusActive(data.guanshistatus)); + } else { + this._applyRoleStatusFromApi('guanshistatus', true); } const app = getApp(); if (!app.globalData.guanshi) app.globalData.guanshi = {}; @@ -519,18 +526,19 @@ Page(createPage({ this._updateTotalAssets(); return; } + this._applyRoleStatusFromApi('guanshistatus', false); + this.setData({ isGuanshi: false }); }, async _fetchZuzhangInfoSilent() { const res = await request({ url: '/yonghu/zuzhangxinxi', method: 'POST' }); if (res && res.data.code === 200) { const data = res.data.data || {}; + // zuzhangxinxi 成功即表示已是组长;后台新增组长后本地缓存可能仍为 0 if (data.zuzhangstatus !== undefined) { - wx.setStorageSync('zuzhangstatus', data.zuzhangstatus); - getApp().globalData.zuzhangstatus = data.zuzhangstatus; - } - if (!isRoleStatusActive(data.zuzhangstatus ?? wx.getStorageSync('zuzhangstatus'))) { - return; + this._applyRoleStatusFromApi('zuzhangstatus', isRoleStatusActive(data.zuzhangstatus)); + } else { + this._applyRoleStatusFromApi('zuzhangstatus', true); } this.setData({ isZuzhang: true, @@ -541,6 +549,8 @@ Page(createPage({ this._updateTotalAssets(); return; } + this._applyRoleStatusFromApi('zuzhangstatus', false); + this.setData({ isZuzhang: false }); }, async _fetchKaoheguanInfoSilent() { diff --git a/pages/order-pool/order-pool.js b/pages/order-pool/order-pool.js index f6429ed..58c7eb2 100644 --- a/pages/order-pool/order-pool.js +++ b/pages/order-pool/order-pool.js @@ -2,6 +2,7 @@ const app = getApp(); import request from '../../utils/request.js'; import PopupService from '../../services/popupService.js'; +import { refreshDashouMembership, userHasHuiyuan } from '../../utils/dashou-profile.js'; Page({ data: { @@ -64,6 +65,7 @@ Page({ this.syncShopBannerFromGlobal(); this.registerNotificationComponent(); this.loadGlobalStatus(); + this.syncDashouProfileFromServer(); this.checkAuthorization(); }, @@ -108,6 +110,18 @@ Page({ }); }, + /** 拉取最新打手会员(含总会员子类型展开)并刷新订单卡片展示 */ + async syncDashouProfileFromServer() { + if (!wx.getStorageSync('token')) return; + await refreshDashouMembership(app); + this.loadGlobalStatus(); + if (this.data.dingdanList && this.data.dingdanList.length) { + this.setData({ + dingdanList: this.data.dingdanList.map((item) => this.processDingdanItem(item)), + }); + } + }, + checkAuthorization() { const { dashoustatus, zhuanghaoStatus } = this.data; @@ -244,6 +258,11 @@ Page({ if (res.data.code === 200 || res.data.code === 0) { const newList = res.data.data.list || []; const hasMore = res.data.data.has_more || false; + const serverClumber = res.data.data.clumber; + if (Array.isArray(serverClumber) && serverClumber.length) { + app.globalData.clumber = serverClumber; + this.setData({ huiyuanList: serverClumber }); + } const processedList = newList.map(item => this.processDingdanItem(item)); @@ -292,6 +311,15 @@ Page({ } const zhidingNicheng = item.zhiding_nicheng || ''; + let hasRequiredMember = true; + if (item.hasRequiredMember !== undefined) { + hasRequiredMember = !!item.hasRequiredMember; + } else if (item.has_required_member !== undefined) { + hasRequiredMember = !!item.has_required_member; + } else if (item.yaoqiuleixing == 1 && item.huiyuan_id) { + hasRequiredMember = userHasHuiyuan(this.data.huiyuanList, item.huiyuan_id); + } + return { ...item, full_tupian_url: fullTupianUrl, @@ -299,7 +327,8 @@ Page({ isPingtai: item.pingtai == 1, isShangjia: item.pingtai == 2, zhiding_avatar_full: zhidingAvatar, - zhiding_nicheng: zhidingNicheng + zhiding_nicheng: zhidingNicheng, + hasRequiredMember, }; }, @@ -355,7 +384,9 @@ Page({ } } if (dingdanItem.yaoqiuleixing == 1) { - const hasHuiyuan = this.data.huiyuanList.some(h => h.huiyuanid == dingdanItem.huiyuan_id); + const hasHuiyuan = dingdanItem.hasRequiredMember !== undefined + ? !!dingdanItem.hasRequiredMember + : userHasHuiyuan(this.data.huiyuanList, dingdanItem.huiyuan_id); if (!hasHuiyuan) { wx.showToast({ title: '未开通对应会员,无法抢单', icon: 'none', duration: 2000 }); setTimeout(() => this.goToChongzhiPage('huiyuan', dingdanItem.huiyuan_id), 500); @@ -460,12 +491,14 @@ Page({ scrollViewRefreshing: true, lastRefreshTime: now }); - if (this.data.xuanzhongLeixingId) { - this.setData({ page: 1, hasMore: true }); - this.loadDingdanList(true); - } else { - this.setData({ scrollViewRefreshing: false }); - } + this.syncDashouProfileFromServer().finally(() => { + if (this.data.xuanzhongLeixingId) { + this.setData({ page: 1, hasMore: true }); + this.loadDingdanList(true); + } else { + this.setData({ scrollViewRefreshing: false }); + } + }); }, goToDashouRegister() { diff --git a/utils/dashou-profile.js b/utils/dashou-profile.js index ee93a3d..cf0509d 100644 --- a/utils/dashou-profile.js +++ b/utils/dashou-profile.js @@ -23,14 +23,30 @@ export async function refreshDashouMembership(app) { return app.globalData.clumber || []; } -/** 用户是否持有某会员类型(与抢单卡片判断一致;支持总会员 covers) */ +/** 会员 ID 等价比较(001 与 1 视为相同,与后端 huiyuan_ids_match 一致) */ +export function huiyuanIdMatch(a, b) { + const left = String(a ?? '').trim(); + const right = String(b ?? '').trim(); + if (!left || !right) return false; + if (left === right) return true; + const leftCore = left.replace(/^0+/, '') || '0'; + const rightCore = right.replace(/^0+/, '') || '0'; + return leftCore === rightCore; +} + +/** 用户是否持有某会员类型(与抢单卡片判断一致;支持总会员 included_huiyuan_ids / from_bundle) */ export function userHasHuiyuan(huiyuanList, huiyuanId) { - if (!huiyuanId) return true; + if (!huiyuanId && huiyuanId !== 0) return true; const list = huiyuanList || []; const req = String(huiyuanId); return list.some((h) => { - if (String(h.huiyuanid) === req || String(h.huiyuan_id) === req) return true; + if (huiyuanIdMatch(h.huiyuanid, req) || huiyuanIdMatch(h.huiyuan_id, req)) { + return true; + } const covers = h.included_huiyuan_ids || h.covers || []; - return Array.isArray(covers) && covers.some((id) => String(id) === req); + if (Array.isArray(covers) && covers.some((id) => huiyuanIdMatch(id, req))) { + return true; + } + return false; }); }