548 lines
18 KiB
JavaScript
548 lines
18 KiB
JavaScript
// 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' }); }
|
||
}); |