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 { ensurePhoneAuth } from '../../utils/phone-auth.js';
import { ICON_KEYS, resolveConfiguredIcon, resolveMiniappIcon, ICON_FOLDER, refreshPindaoConfig } from '../../utils/miniapp-icons.js'; import { ICON_KEYS, resolveConfiguredIcon, resolveMiniappIcon, ICON_FOLDER, refreshPindaoConfig } from '../../utils/miniapp-icons.js';
import { resolveAvatarFromStorage, onAvatarImageError } from '../../utils/avatar.js'; import { resolveAvatarFromStorage, onAvatarImageError } from '../../utils/avatar.js';
import { refreshDashouMembership } from '../../utils/dashou-profile.js';
const app = getApp(); const app = getApp();
@@ -764,10 +765,11 @@ onHide() {
break; break;
case 'huiyuan': case 'huiyuan':
if (responseData && responseData.huiyuan) { if (responseData && responseData.jifen !== undefined) {
app.globalData.jinfen = responseData.jifen; app.globalData.jinfen = responseData.jifen;
await this.updateClubmberData(responseData.huiyuan);
} }
// 从服务端拉完整 clumber含总会员子类型展开避免本地只写总会员 ID
await refreshDashouMembership(app);
await this.refreshHuiyuanData(extraData); await this.refreshHuiyuanData(extraData);
break; break;
} }
@@ -787,34 +789,29 @@ onHide() {
// ========== 刷新会员数据 ========== // ========== 刷新会员数据 ==========
async refreshHuiyuanData(huiyuanId) { async refreshHuiyuanData(huiyuanId) {
await refreshDashouMembership(app);
this.loadFromGlobalData(); this.loadFromGlobalData();
await this.fetchHuiyuanList(); await this.fetchHuiyuanList();
}, },
// ========== 更新会员数据到全局变量 ========== // ========== 更新会员数据到全局变量(兼容旧回调;优先服务端 clumber ==========
async updateClubmberData(huiyuanData) { 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 globalClubmber = app.globalData.clumber || [];
const { huiyuanid, huiyuanming, daoqi } = huiyuanData || {};
const { huiyuanid, huiyuanming, daoqi } = huiyuanData; if (!huiyuanid) return;
const index = globalClubmber.findIndex((item) => item.huiyuanid === huiyuanid);
const index = globalClubmber.findIndex(item => item.huiyuanid === huiyuanid);
if (index >= 0) { if (index >= 0) {
globalClubmber[index].daoqi = daoqi; globalClubmber[index].daoqi = daoqi;
} else { } else {
globalClubmber.push({ globalClubmber.push({ huiyuanid, huiyuanming, daoqi });
huiyuanid: huiyuanid,
huiyuanming: huiyuanming,
daoqi: daoqi
});
} }
app.globalData.clumber = globalClubmber; app.globalData.clumber = globalClubmber;
this.setData({ clubmber: [...globalClubmber] });
this.setData({
clubmber: [...globalClubmber]
});
}, },
// ========== 检查并刷新数据 ========== // ========== 检查并刷新数据 ==========

View File

@@ -399,6 +399,7 @@ Page(createPage({
this.loadMyZhidingOrders(), this.loadMyZhidingOrders(),
]); ]);
this.checkRoleStatuses(); this.checkRoleStatuses();
this.syncConfiguredAssets();
const dashouOk = results[0].status === 'fulfilled'; const dashouOk = results[0].status === 'fulfilled';
if (showToast) { if (showToast) {
wx.showToast({ wx.showToast({
@@ -491,16 +492,22 @@ Page(createPage({
throw new Error('打手信息获取失败'); throw new Error('打手信息获取失败');
}, },
_applyRoleStatusFromApi(field, active) {
const val = active ? 1 : 0;
wx.setStorageSync(field, val);
getApp().globalData[field] = val;
return val;
},
async _fetchGuanshiInfoSilent() { async _fetchGuanshiInfoSilent() {
const res = await request({ url: '/yonghu/guanshixinxi', method: 'POST' }); const res = await request({ url: '/yonghu/guanshixinxi', method: 'POST' });
if (res && this._isApiSuccess(res.data)) { if (res && this._isApiSuccess(res.data)) {
const data = this._extractUserData(res.data); const data = this._extractUserData(res.data);
// guanshixinxi 成功即表示已是管事;接口不返回 guanshistatus不能依赖本地旧缓存
if (data.guanshistatus !== undefined) { if (data.guanshistatus !== undefined) {
wx.setStorageSync('guanshistatus', data.guanshistatus); this._applyRoleStatusFromApi('guanshistatus', isRoleStatusActive(data.guanshistatus));
getApp().globalData.guanshistatus = data.guanshistatus; } else {
} this._applyRoleStatusFromApi('guanshistatus', true);
if (!isRoleStatusActive(data.guanshistatus ?? wx.getStorageSync('guanshistatus'))) {
return;
} }
const app = getApp(); const app = getApp();
if (!app.globalData.guanshi) app.globalData.guanshi = {}; if (!app.globalData.guanshi) app.globalData.guanshi = {};
@@ -519,18 +526,19 @@ Page(createPage({
this._updateTotalAssets(); this._updateTotalAssets();
return; return;
} }
this._applyRoleStatusFromApi('guanshistatus', false);
this.setData({ isGuanshi: false });
}, },
async _fetchZuzhangInfoSilent() { async _fetchZuzhangInfoSilent() {
const res = await request({ url: '/yonghu/zuzhangxinxi', method: 'POST' }); const res = await request({ url: '/yonghu/zuzhangxinxi', method: 'POST' });
if (res && res.data.code === 200) { if (res && res.data.code === 200) {
const data = res.data.data || {}; const data = res.data.data || {};
// zuzhangxinxi 成功即表示已是组长;后台新增组长后本地缓存可能仍为 0
if (data.zuzhangstatus !== undefined) { if (data.zuzhangstatus !== undefined) {
wx.setStorageSync('zuzhangstatus', data.zuzhangstatus); this._applyRoleStatusFromApi('zuzhangstatus', isRoleStatusActive(data.zuzhangstatus));
getApp().globalData.zuzhangstatus = data.zuzhangstatus; } else {
} this._applyRoleStatusFromApi('zuzhangstatus', true);
if (!isRoleStatusActive(data.zuzhangstatus ?? wx.getStorageSync('zuzhangstatus'))) {
return;
} }
this.setData({ this.setData({
isZuzhang: true, isZuzhang: true,
@@ -541,6 +549,8 @@ Page(createPage({
this._updateTotalAssets(); this._updateTotalAssets();
return; return;
} }
this._applyRoleStatusFromApi('zuzhangstatus', false);
this.setData({ isZuzhang: false });
}, },
async _fetchKaoheguanInfoSilent() { async _fetchKaoheguanInfoSilent() {

View File

@@ -2,6 +2,7 @@
const app = getApp(); const app = getApp();
import request from '../../utils/request.js'; import request from '../../utils/request.js';
import PopupService from '../../services/popupService.js'; import PopupService from '../../services/popupService.js';
import { refreshDashouMembership, userHasHuiyuan } from '../../utils/dashou-profile.js';
Page({ Page({
data: { data: {
@@ -64,6 +65,7 @@ Page({
this.syncShopBannerFromGlobal(); this.syncShopBannerFromGlobal();
this.registerNotificationComponent(); this.registerNotificationComponent();
this.loadGlobalStatus(); this.loadGlobalStatus();
this.syncDashouProfileFromServer();
this.checkAuthorization(); 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() { checkAuthorization() {
const { dashoustatus, zhuanghaoStatus } = this.data; const { dashoustatus, zhuanghaoStatus } = this.data;
@@ -244,6 +258,11 @@ Page({
if (res.data.code === 200 || res.data.code === 0) { if (res.data.code === 200 || res.data.code === 0) {
const newList = res.data.data.list || []; const newList = res.data.data.list || [];
const hasMore = res.data.data.has_more || false; 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)); const processedList = newList.map(item => this.processDingdanItem(item));
@@ -292,6 +311,15 @@ Page({
} }
const zhidingNicheng = item.zhiding_nicheng || ''; 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 { return {
...item, ...item,
full_tupian_url: fullTupianUrl, full_tupian_url: fullTupianUrl,
@@ -299,7 +327,8 @@ Page({
isPingtai: item.pingtai == 1, isPingtai: item.pingtai == 1,
isShangjia: item.pingtai == 2, isShangjia: item.pingtai == 2,
zhiding_avatar_full: zhidingAvatar, zhiding_avatar_full: zhidingAvatar,
zhiding_nicheng: zhidingNicheng zhiding_nicheng: zhidingNicheng,
hasRequiredMember,
}; };
}, },
@@ -355,7 +384,9 @@ Page({
} }
} }
if (dingdanItem.yaoqiuleixing == 1) { 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) { if (!hasHuiyuan) {
wx.showToast({ title: '未开通对应会员,无法抢单', icon: 'none', duration: 2000 }); wx.showToast({ title: '未开通对应会员,无法抢单', icon: 'none', duration: 2000 });
setTimeout(() => this.goToChongzhiPage('huiyuan', dingdanItem.huiyuan_id), 500); setTimeout(() => this.goToChongzhiPage('huiyuan', dingdanItem.huiyuan_id), 500);
@@ -460,12 +491,14 @@ Page({
scrollViewRefreshing: true, scrollViewRefreshing: true,
lastRefreshTime: now lastRefreshTime: now
}); });
if (this.data.xuanzhongLeixingId) { this.syncDashouProfileFromServer().finally(() => {
this.setData({ page: 1, hasMore: true }); if (this.data.xuanzhongLeixingId) {
this.loadDingdanList(true); this.setData({ page: 1, hasMore: true });
} else { this.loadDingdanList(true);
this.setData({ scrollViewRefreshing: false }); } else {
} this.setData({ scrollViewRefreshing: false });
}
});
}, },
goToDashouRegister() { goToDashouRegister() {

View File

@@ -23,14 +23,30 @@ export async function refreshDashouMembership(app) {
return app.globalData.clumber || []; 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) { export function userHasHuiyuan(huiyuanList, huiyuanId) {
if (!huiyuanId) return true; if (!huiyuanId && huiyuanId !== 0) return true;
const list = huiyuanList || []; const list = huiyuanList || [];
const req = String(huiyuanId); const req = String(huiyuanId);
return list.some((h) => { 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 || []; 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;
}); });
} }