This commit is contained in:
2026-07-10 14:01:55 +08:00
4 changed files with 97 additions and 41 deletions

View File

@@ -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();
@@ -764,10 +765,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;
}
@@ -787,34 +789,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] });
},
// ========== 检查并刷新数据 ==========

View File

@@ -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() {

View File

@@ -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() {

View File

@@ -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;
});
}