Files
xingque/pages/manager/manager.js

497 lines
16 KiB
JavaScript

// pages/guanshizhongxin/guanshizhongxin.js
import {
createPage, request, isRoleStatusActive, syncRoleStatuses, syncProfileFields,
syncGroupFields, ensureRoleOnCenterPage, refreshTabBar, parseSceneOptions,
isApiSuccess, getApiMsg, extractUserData
} from '../../utils/base-page.js';
import { buildInviterPeerId } from '../../utils/im-user.js';
Page(createPage({
data: {
// 图片路径对象
imgUrls: {},
isGuanshi: false,
inviteCode: '',
uid: '',
nicheng: '',
avatarUrl: '',
// 管事信息
gszhstatus: '',
yaoqingzongshu: 0,
fenyongzonge: '0.00',
fenyongtixian: '0.00',
yichongzhiDashou: 0,
zhuanhualv: 0,
// 称号列表
chenghaoList: [],
// 邀请人缓存
inviterCache: null,
},
onLoad(options) {
let url = '/pages/fighter/fighter?registerType=guanshi';
const parsed = parseSceneOptions(options);
if (parsed.inviteCode) {
url += '&inviteCode=' + encodeURIComponent(parsed.inviteCode);
}
wx.redirectTo({ url });
return;
// 以下保留供恢复参考
// 拼接所有图片完整路径
const app = getApp();
const ossImageUrl = app.globalData.ossImageUrl || '';
const imgBase = ossImageUrl + 'beijing/guanshiduan/';
this.setData({
imgUrls: this.initImageUrls({
pageBg: imgBase + 'page-bg.jpg',
topDecor: imgBase + 'top-decor.png',
cardBg1: imgBase + 'card-bg1.png',
cardBg2: imgBase + 'card-bg2.png',
iconRefresh: imgBase + 'icon-refresh.png',
iconCopy: imgBase + 'icon-copy.png',
avatarDefault: ossImageUrl + 'avatar/default.jpg',
iconInvite: imgBase + 'icon-invite.png',
iconSub: imgBase + 'icon-sub.png',
iconRecord: imgBase + 'icon-record.png',
iconRank: imgBase + 'icon-rank.png',
iconPoster: imgBase + 'icon-poster.png',
iconWithdraw: imgBase + 'icon-withdraw.png',
iconContact: imgBase + 'icon-contact.png',
iconArrow: imgBase + 'icon-arrow.png',
})
});
this.checkRoleStatus();
const inviteCode = parsed.inviteCode;
if (inviteCode) {
this.setData({ inviteCode });
setTimeout(() => {
this.handleInviteCodeWithLoginCheck({
inviteCode,
role: 'dashou',
statusKey: 'guanshistatus',
alreadyMsg: '已是管事',
onNeedLogin: (code) => this.loginAndRegisterWithInviteCode({
inviteCode: code,
onLoginSuccess: (wxCode, invCode) => this.callLoginRegisterApi(wxCode, invCode),
}),
onAlreadyRegistered: () => this._enterRegisteredGuanshiState('您已是管事'),
});
}, 500);
}
this.checkColdStartPopup('guanshiduan');
},
onShow() {
const inviterCache = wx.getStorageSync('inviterCache') || null;
this.setData({ inviterCache });
this.registerNotificationComponent();
if (this._isGuanshiPageActive()) {
if (!this.data.isGuanshi) {
this.setData({ isGuanshi: true });
}
ensureRoleOnCenterPage(this, 'guanshi');
setTimeout(() => {
this.getGuanshiInfo();
this.fetchChenghaoList();
}, 300);
}
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const options = currentPage.options || {};
if (options.inviteCode && !this._isGuanshiPageActive()) {
setTimeout(() => {
this.handleInviteCodeWithLoginCheck({
inviteCode: options.inviteCode,
role: 'dashou',
statusKey: 'guanshistatus',
alreadyMsg: '已是管事',
onNeedLogin: (code) => this.loginAndRegisterWithInviteCode({
inviteCode: code,
onLoginSuccess: (wxCode, invCode) => this.callLoginRegisterApi(wxCode, invCode),
}),
onAlreadyRegistered: () => this._enterRegisteredGuanshiState('您已是管事'),
});
}, 300);
}
},
// 称号列表
async fetchChenghaoList() {
try {
const res = await request({
url: '/dengji/chenghao',
method: 'POST',
data: { role: 'guanshi' }
});
if (res && res.data.code === 0 && res.data.data) {
this.setData({ chenghaoList: res.data.data.chenghao_list || [] });
}
} catch (e) {
console.error('获取称号失败', e);
}
},
// 联系组长
async contactInviter() {
wx.showLoading({ title: '获取组长信息...', mask: true });
try {
const res = await request({
url: '/yonghu/guanshi_contact',
method: 'POST'
});
if (res && res.data.code === 200 && res.data.data) {
const inviter = res.data.data;
const ossImageUrl = getApp().globalData.ossImageUrl || '';
const fullAvatar = inviter.touxiang
? (inviter.touxiang.startsWith('http') ? inviter.touxiang : ossImageUrl + inviter.touxiang)
: '';
// 缓存邀请人信息
const cacheData = {
uid: inviter.uid,
nicheng: inviter.nicheng || '',
avatar: fullAvatar
};
wx.setStorageSync('inviterCache', cacheData);
this.setData({ inviterCache: cacheData });
// 联系邀请人
const param = {
toUserId: buildInviterPeerId(inviter.uid),
toName: inviter.nicheng || '邀请人',
toAvatar: fullAvatar
};
wx.navigateTo({
url: '/pages/chat/chat?data=' + encodeURIComponent(JSON.stringify(param))
});
} else {
wx.showToast({ title: '未绑定邀请人', icon: 'none' });
}
} catch (e) {
wx.showToast({ title: '网络错误', icon: 'none' });
} finally {
wx.hideLoading();
}
},
// 管事状态辅助
_isAlreadyGuanshiMsg(msg) {
if (!msg || typeof msg !== 'string') return false;
return msg.includes('已是管事') || msg.includes('已经是管事');
},
_syncGuanshiCache() {
const app = getApp();
wx.setStorageSync('guanshistatus', 1);
app.globalData.guanshistatus = 1;
},
// 后端若返回打手详情字段则写入 globalData
_syncDashouGlobalData(data) {
const app = getApp();
const map = {
dashouNicheng: data.dashounicheng,
zhanghaoStatus: data.zhanghaostatus,
yongjin: data.yongjin,
zonge: data.zonge,
yajin: data.yajin,
chenghao: data.chenghao,
jinfen: data.jinfen,
clumber: data.clumber,
chengjiaoliang: data.chengjiaoliang,
zaixianZhuangtai: data.zaixianzhuangtai,
dashouzhuangtai: data.dashouzhuangtai,
};
Object.keys(map).forEach(key => {
if (map[key] !== undefined) {
app.globalData[key] = map[key];
}
});
},
_isGuanshiPageActive() {
return this.data.isGuanshi || isRoleStatusActive(wx.getStorageSync('guanshistatus'));
},
_applyRegisterSuccess(userData, toastMsg) {
const app = getApp();
const data = userData || {};
if (data.token) wx.setStorageSync('token', data.token);
if (data.token) app.globalData.token = data.token;
syncProfileFields(data);
syncRoleStatuses(data);
if (!Object.prototype.hasOwnProperty.call(data, 'guanshistatus') &&
!isRoleStatusActive(wx.getStorageSync('guanshistatus'))) {
this._syncGuanshiCache();
}
this._syncDashouGlobalData(data);
syncGroupFields(data);
const guanshiData = {
gszhstatus: data.gszhstatus ?? '',
yaoqingzongshu: data.yaoqingzongshu ?? 0,
fenyongzonge: data.fenyongzonge ?? '0.00',
fenyongtixian: data.fenyongtixian ?? '0.00',
yichongzhiDashou: data.yichongzhiDashou ?? 0
};
if (!app.globalData.guanshi) app.globalData.guanshi = {};
Object.assign(app.globalData.guanshi, guanshiData);
const zhuanhualv = guanshiData.yaoqingzongshu > 0
? (guanshiData.yichongzhiDashou / guanshiData.yaoqingzongshu * 100).toFixed(1)
: 0;
this.setData({
isGuanshi: true,
uid: data.uid || wx.getStorageSync('uid') || '',
nicheng: data.nicheng || app.globalData.nicheng || wx.getStorageSync('nicheng') || '',
...guanshiData,
zhuanhualv,
isLoading: false
});
this.loadUserInfo();
this.switchToGuanshiRole();
wx.hideLoading();
if (toastMsg) {
wx.showToast({ title: toastMsg, icon: 'success', duration: 2000 });
}
},
_enterRegisteredGuanshiState(toastMsg, userData) {
if (userData && typeof userData === 'object') {
this._applyRegisterSuccess(userData, toastMsg);
return;
}
this._syncGuanshiCache();
this.setData({ isGuanshi: true, isLoading: false });
this.loadUserInfo();
this.switchToGuanshiRole();
this.getGuanshiInfo(false);
this.fetchChenghaoList();
wx.hideLoading();
if (toastMsg) {
wx.showToast({ title: toastMsg, icon: 'success', duration: 2000 });
}
},
callLoginRegisterApi(code, inviteCode) {
const that = this;
const app = getApp();
const apiBaseUrl = app.globalData.apiBaseUrl;
if (!apiBaseUrl) {
wx.hideLoading();
wx.showToast({ title: '服务器配置错误', icon: 'none' });
return;
}
wx.request({
url: apiBaseUrl + '/yonghu/zuzhangyqmzc',
method: 'POST',
data: { code: code, inviteCode: inviteCode },
header: { 'content-type': 'application/json' },
success: (res) => {
const body = res.data || {};
if (res.statusCode === 200 && isApiSuccess(body)) {
const userData = extractUserData(body);
const toastMsg = that._isAlreadyGuanshiMsg(getApiMsg(body))
? getApiMsg(body)
: '注册成功!';
that._applyRegisterSuccess(userData, toastMsg);
} else if (res.statusCode === 200 && that._isAlreadyGuanshiMsg(getApiMsg(body))) {
that._enterRegisteredGuanshiState(getApiMsg(body) || '您已是管事', extractUserData(body));
} else {
wx.hideLoading();
that.setData({ isLoading: false });
wx.showToast({ title: getApiMsg(body) || '注册失败', icon: 'none' });
}
},
fail: () => {
wx.hideLoading();
wx.showToast({ title: '网络请求失败', icon: 'none' });
}
});
},
async callRegisterApi(inviteCode) {
try {
const res = await request({
url: '/yonghu/guanshizhuce',
method: 'POST',
data: { inviteCode }
});
const body = res?.data || {};
if (res && isApiSuccess(body)) {
const userData = extractUserData(body);
const toastMsg = this._isAlreadyGuanshiMsg(getApiMsg(body))
? getApiMsg(body)
: '注册成功!';
this._applyRegisterSuccess(userData, toastMsg);
} else if (this._isAlreadyGuanshiMsg(getApiMsg(body))) {
this._enterRegisteredGuanshiState(getApiMsg(body) || '您已是管事', extractUserData(body));
} else {
wx.hideLoading();
this.setData({ isLoading: false });
wx.showToast({ title: getApiMsg(body) || '注册失败', icon: 'none' });
}
} catch (e) {
console.error('注册失败:', e);
wx.hideLoading();
this.setData({ isLoading: false });
wx.showToast({ title: e.message || '注册失败', icon: 'error' });
}
},
switchToGuanshiRole() {
ensureRoleOnCenterPage(this, 'guanshi');
},
checkGlobalData() {
const app = getApp();
const gd = app.globalData.guanshi || {};
const needRefresh = !gd.yaoqingzongshu && !gd.fenyongzonge && !gd.fenyongtixian;
if (needRefresh) {
this.getGuanshiInfo();
} else {
this.setDataFromGlobalData();
}
},
setDataFromGlobalData() {
const gd = getApp().globalData.guanshi || {};
const zhuanhualv = gd.yaoqingzongshu > 0
? (gd.yichongzhiDashou / gd.yaoqingzongshu * 100).toFixed(1)
: 0;
this.setData({
gszhstatus: gd.gszhstatus || '',
yaoqingzongshu: gd.yaoqingzongshu || 0,
fenyongzonge: gd.fenyongzonge || '0.00',
fenyongtixian: gd.fenyongtixian || '0.00',
yichongzhiDashou: gd.yichongzhiDashou || 0,
zhuanhualv,
isLoading: false
});
},
async getGuanshiInfo(showToast = true) {
this.setData({ isLoading: true });
try {
const res = await request({
url: '/yonghu/guanshixinxi',
method: 'POST'
});
if (res && isApiSuccess(res.data)) {
const data = extractUserData(res.data);
const app = getApp();
this._syncGuanshiCache();
if (!app.globalData.guanshi) app.globalData.guanshi = {};
const updateData = {
gszhstatus: data.gszhstatus || '',
yaoqingzongshu: data.yaoqingzongshu || 0,
fenyongzonge: data.fenyongzonge || '0.00',
fenyongtixian: data.fenyongtixian || '0.00',
yichongzhiDashou: data.yichongzhiDashou || 0
};
Object.assign(app.globalData.guanshi, updateData);
const zhuanhualv = updateData.yaoqingzongshu > 0
? (updateData.yichongzhiDashou / updateData.yaoqingzongshu * 100).toFixed(1)
: 0;
this.setData({
isGuanshi: true,
...updateData,
zhuanhualv,
isLoading: false
});
if (showToast) {
wx.showToast({ title: '信息已更新', icon: 'success', duration: 1500 });
}
} else {
this.setData({ isLoading: false });
if (showToast) {
wx.showToast({ title: getApiMsg(res?.data) || '获取失败', icon: 'none' });
}
}
} catch (e) {
this.setData({ isLoading: false });
if (showToast) {
wx.showToast({ title: e.message || '获取失败', icon: 'error' });
}
}
},
refreshGuanshiInfo() {
this.throttledRefresh(() => {
this.getGuanshiInfo();
this.fetchChenghaoList();
});
},
onInviteCodeInput(e) {
this.setData({ inviteCode: e.detail.value.trim() });
},
async onRegister() {
const { inviteCode } = this.data;
if (!inviteCode) {
wx.showToast({ title: '请输入邀请码', icon: 'none' });
return;
}
if (inviteCode.length > 100) {
wx.showToast({ title: '邀请码过长', icon: 'none' });
return;
}
this.setData({ isLoading: true });
try {
const res = await request({
url: '/yonghu/guanshizhuce',
method: 'POST',
data: { inviteCode }
});
const body = res?.data || {};
if (res && isApiSuccess(body)) {
const userData = extractUserData(body);
const toastMsg = this._isAlreadyGuanshiMsg(getApiMsg(body))
? getApiMsg(body)
: '注册成功!';
this._applyRegisterSuccess(userData, toastMsg);
} else if (this._isAlreadyGuanshiMsg(getApiMsg(body))) {
this._enterRegisteredGuanshiState(getApiMsg(body) || '您已是管事', extractUserData(body));
} else {
this.setData({ isLoading: false });
wx.showToast({ title: getApiMsg(body) || '注册失败', icon: 'none' });
}
} catch (e) {
this.setData({ isLoading: false });
wx.showToast({ title: e.message || '注册失败', icon: 'error' });
}
},
// 页面跳转
goToWithdraw() { wx.navigateTo({ url: '/pages/withdraw/withdraw' }); },
goToInviteUser() { wx.navigateTo({ url: '/pages/invite-fighter/invite-fighter' }); },
goToMySubordinate() { wx.navigateTo({ url: '/pages/my-fighter/my-fighter' }); },
goToRechargeRecord() { wx.navigateTo({ url: '/pages/recharge-log/recharge-log' }); },
goToGuanshiRanking() { wx.navigateTo({ url: '/pages/manager-rank/manager-rank' }); },
goToPromoPoster() { wx.navigateTo({ url: '/pages/poster/poster' }); }
}, {
roleConfig: {
role: 'dashou',
statusKey: 'guanshistatus',
dataFlag: 'isGuanshi',
pageId: 'guanshiduan',
apiUrl: '/yonghu/guanshixinxi'
}
}));