// pages/guanshizhongxin/guanshizhongxin.js import request from '../../utils/request.js'; import popupService from '../../services/popupService.js'; import { getDefaultInviteCode } from '../../utils/default-invite-code.js'; import { getGroupImgUrls, GUANSHIDUAN_DEFAULTS, buildOssUrl } from '../../utils/page-assets.js'; Page({ data: { // 图片路径对象(逻辑层拼接完整URL) imgUrls: {}, isGuanshi: false, isLoading: false, inviteCode: '', uid: '', nicheng: '', avatarUrl: '', // 管事信息 gszhstatus: '', yaoqingzongshu: 0, fenyongzonge: '0.00', fenyongtixian: '0.00', yichongzhiDashou: 0, zhuanhualv: 0, // 称号列表 chenghaoList: [], // 邀请人(组长)缓存 inviterCache: null, }, onLoad(options) { const app = getApp(); this._onConfigReady = () => this.initImageUrls(); app.on('configReady', this._onConfigReady); this.initImageUrls(); // 处理扫码 scene if (options.scene) { try { const scene = decodeURIComponent(options.scene); options.inviteCode = scene; } catch (e) { console.error('scene解码失败', e); } } this.checkGuanshiStatus(); const { inviteCode } = options || {}; if (inviteCode) { this.setData({ inviteCode }); setTimeout(() => { this.handleInviteCodeWithLoginCheck(inviteCode); }, 500); } if (!app.globalData.hasShownPopupOnColdStart) { app.globalData.hasShownPopupOnColdStart = true; setTimeout(() => { popupService.checkAndShow(this, 'guanshiduan'); }, 300); } }, onHide() { const popupComp = this.selectComponent('#popupNotice'); if (popupComp && popupComp.cleanup) { popupComp.cleanup(); } }, onUnload() { if (this._onConfigReady) { getApp().off('configReady', this._onConfigReady); } }, initImageUrls() { const urls = getGroupImgUrls('guanshiduan', GUANSHIDUAN_DEFAULTS); const g = getApp().globalData; urls.avatarDefault = buildOssUrl(g.morentouxiang || GUANSHIDUAN_DEFAULTS.avatarDefault); this.setData({ imgUrls: urls }); }, onShow() { this.initImageUrls(); const inviterCache = wx.getStorageSync('inviterCache') || null; this.setData({ inviterCache }); this.registerNotificationComponent(); if (this.data.isGuanshi) { setTimeout(() => { this.getGuanshiInfo(); this.fetchChenghaoList(); }, 300); } const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; const options = currentPage.options || {}; if (options.inviteCode && !this.data.isGuanshi) { setTimeout(() => { this.handleInviteCodeWithLoginCheck(options.inviteCode); }, 300); } }, // ========== 全局通知注册 ========== registerNotificationComponent() { const app = getApp(); const comp = this.selectComponent('#global-notification'); if (comp && comp.showNotification) { app.globalData.globalNotification = { show: (data) => comp.showNotification(data), hide: () => comp.hideNotification() }; } }, // ========== 称号列表(新接口,区分管事) ========== 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 }); // 跳转聊天(组长前缀请确认,默认 'Zz') const param = { toUserId: 'Zz' + inviter.uid, toName: inviter.nicheng || '组长', toAvatar: fullAvatar }; wx.navigateTo({ url: '/pages/liaotian/liaotian?data=' + encodeURIComponent(JSON.stringify(param)) }); } else { wx.showToast({ title: '未绑定邀请人', icon: 'none' }); } } catch (e) { wx.showToast({ title: '网络错误', icon: 'none' }); } finally { wx.hideLoading(); } }, // ========== 邀请码处理(完全照搬打手端) ========== handleInviteCodeWithLoginCheck(inviteCode) { const token = wx.getStorageSync('token'); const uid = wx.getStorageSync('uid'); if (!token || !uid) { this.loginAndRegisterWithInviteCode(inviteCode); } else { if (!this.data.isGuanshi) { wx.showLoading({ title: '自动注册中...', mask: true }); this.callRegisterApi(inviteCode); } else { wx.showToast({ title: '您已是管事', icon: 'success' }); } } }, loginAndRegisterWithInviteCode(inviteCode) { const that = this; wx.showLoading({ title: '登录注册中...', mask: true }); wx.login({ success: (loginRes) => { if (loginRes.code) { that.callLoginRegisterApi(loginRes.code, inviteCode); } else { wx.hideLoading(); wx.showToast({ title: '微信登录失败', icon: 'none' }); } }, fail: () => { wx.hideLoading(); wx.reLaunch({ url: '/pages/gerenzhongxin/gerenzhongxin' }); } }); }, 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) => { if (res.statusCode === 200 && res.data && res.data.code === 200 && res.data.data) { const userData = res.data.data; if (userData.token) wx.setStorageSync('token', userData.token); const identityFields = ['nicheng', 'uid', 'touxiang', 'dashoustatus', 'guanshistatus', 'shangjiastatus', 'zuzhangstatus']; identityFields.forEach(field => { if (userData[field] !== undefined) { wx.setStorageSync(field, userData[field]); app.globalData[field] = userData[field]; } }); if (userData.guanshistatus === undefined) { wx.setStorageSync('guanshistatus', 1); app.globalData.guanshistatus = 1; } const groupFields = ['dashouqun', 'dashouqunid', 'guanshiqun', 'guanshiqunid']; groupFields.forEach(field => { if (userData[field] !== undefined) { wx.setStorageSync(field, userData[field]); app.globalData[field] = userData[field]; } }); const guanshiData = { gszhstatus: userData.gszhstatus || '', yaoqingzongshu: userData.yaoqingzongshu || 0, fenyongzonge: userData.fenyongzonge || '0.00', fenyongtixian: userData.fenyongtixian || '0.00', yichongzhiDashou: userData.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; that.setData({ isGuanshi: true, uid: userData.uid || '', nicheng: userData.nicheng || '', ...guanshiData, zhuanhualv, isLoading: false }); that.loadUserInfo(); that.switchToGuanshiRole(); wx.hideLoading(); wx.showToast({ title: '注册成功!', icon: 'success', duration: 2000 }); } else { wx.hideLoading(); wx.showToast({ title: (res.data && res.data.msg) || '注册失败', 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 } }); if (res && res.data.code === 200 && res.data.data) { const userData = res.data.data; const identityFields = ['nicheng', 'uid', 'touxiang', 'dashoustatus', 'guanshistatus', 'shangjiastatus', 'zuzhangstatus']; const app = getApp(); identityFields.forEach(field => { if (userData[field] !== undefined) { wx.setStorageSync(field, userData[field]); app.globalData[field] = userData[field]; } }); if (userData.guanshistatus === undefined) { wx.setStorageSync('guanshistatus', 1); app.globalData.guanshistatus = 1; } const guanshiData = { gszhstatus: userData.gszhstatus || '', yaoqingzongshu: userData.yaoqingzongshu || 0, fenyongzonge: userData.fenyongzonge || '0.00', fenyongtixian: userData.fenyongtixian || '0.00', yichongzhiDashou: userData.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: userData.uid || '', nicheng: userData.nicheng || '', ...guanshiData, zhuanhualv, isLoading: false }); this.loadUserInfo(); this.switchToGuanshiRole(); wx.hideLoading(); wx.showToast({ title: '注册成功!', icon: 'success', duration: 2000 }); } else { wx.hideLoading(); wx.showToast({ title: res?.data?.msg || '注册失败', icon: 'none' }); } } catch (e) { console.error('注册失败:', e); wx.hideLoading(); wx.showToast({ title: e.message || '注册失败', icon: 'error' }); } }, switchToGuanshiRole() { const app = getApp(); app.globalData.currentRole = 'guanshi'; wx.setStorageSync('currentRole', 'guanshi'); const tabBar = this.getTabBar(); if (tabBar && tabBar.refresh) tabBar.refresh(); if (app.connectForCurrentRole) { app.connectForCurrentRole(); } else if (app.ensureConnection) { app.ensureConnection(); } }, checkGuanshiStatus() { try { const status = wx.getStorageSync('guanshistatus'); if (status === 1) { this.setData({ isGuanshi: true }); this.loadUserInfo(); this.checkGlobalData(); } else { this.setData({ isGuanshi: false }); } } catch (e) { this.setData({ isGuanshi: false }); } }, loadUserInfo() { const app = getApp(); const globalData = app.globalData || {}; const touxiang = wx.getStorageSync('touxiang'); const ossImageUrl = globalData.ossImageUrl || ''; const morentouxiang = 'avatar/default.jpg'; let avatarUrl = ''; if (touxiang) { avatarUrl = ossImageUrl + (touxiang.startsWith('/') ? touxiang : '/' + touxiang); } else { avatarUrl = ossImageUrl + (morentouxiang.startsWith('/') ? morentouxiang : '/' + morentouxiang); } this.setData({ avatarUrl, uid: wx.getStorageSync('uid') || '', nicheng: globalData.nicheng || '' }); }, 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() { this.setData({ isLoading: true }); try { const res = await request({ url: '/yonghu/guanshixinxi', method: 'POST' }); if (res && res.data.code === 200) { const data = res.data.data; const app = getApp(); 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({ ...updateData, zhuanhualv, isLoading: false }); wx.showToast({ title: '信息已更新', icon: 'success', duration: 1500 }); } } catch (e) { this.setData({ isLoading: false }); wx.showToast({ title: e.message || '获取失败', icon: 'error' }); } }, refreshGuanshiInfo() { 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 } }); if (res && res.data.code === 200) { const userData = res.data.data; const identityFields = ['dashoustatus', 'guanshistatus', 'shangjiastatus', 'zuzhangstatus']; const app = getApp(); identityFields.forEach(field => { if (userData[field] !== undefined) { wx.setStorageSync(field, userData[field]); app.globalData[field] = userData[field]; } }); if (userData.guanshistatus === undefined) { wx.setStorageSync('guanshistatus', 1); app.globalData.guanshistatus = 1; } if (!app.globalData.guanshi) app.globalData.guanshi = {}; const updateData = { gszhstatus: userData.gszhstatus || '', yaoqingzongshu: userData.yaoqingzongshu || 0, fenyongzonge: userData.fenyongzonge || '0.00', fenyongtixian: userData.fenyongtixian || '0.00', yichongzhiDashou: userData.yichongzhiDashou || 0 }; Object.assign(app.globalData.guanshi, updateData); this.setData({ isGuanshi: true, ...updateData, isLoading: false }); this.loadUserInfo(); wx.showToast({ title: '注册成功!', icon: 'success', duration: 2000 }); } } catch (e) { this.setData({ isLoading: false }); wx.showToast({ title: e.message || '注册失败', icon: 'error' }); } }, onQuickRegister() { const code = getDefaultInviteCode('guanshi'); if (!code) { wx.showToast({ title: '暂不支持无邀请码注册', icon: 'none' }); return; } this.setData({ inviteCode: code }); this.onRegister(); }, copyUid() { const { uid } = this.data; if (!uid) return; wx.setClipboardData({ data: uid, success: () => wx.showToast({ title: '已复制', icon: 'success' }) }); }, // ========== 页面跳转 ========== goToWithdraw() { wx.navigateTo({ url: '/pages/tixian/tixian' }); }, goToInviteUser() { wx.navigateTo({ url: '/pages/yaoqingdashou/yaoqingdashou' }); }, goToMySubordinate() { wx.navigateTo({ url: '/pages/wodedashou/wodedashou' }); }, goToRechargeRecord() { wx.navigateTo({ url: '/pages/czjilu/czjilu' }); }, goToGuanshiRanking() { wx.navigateTo({ url: '/pages/dashoupaihang/dashoupaihang?type=guanshi' }) }, goToPromoPoster() { wx.navigateTo({ url: '/pages/haibao/haibao' }); } });