Merge branch 'main' of https://git.gvsds.com/XingQue/xingque
This commit is contained in:
@@ -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] });
|
||||
},
|
||||
|
||||
// ========== 检查并刷新数据 ==========
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user