386 lines
12 KiB
JavaScript
386 lines
12 KiB
JavaScript
// app.js - 优化生产版本(修复重连机制和用户ID问题)
|
||
import { check } from './utils/phone-auth';
|
||
|
||
// 【聊天总开关】GoEasy 续费/开通后保持 true;未开通时改为 false 避免 SDK 报错
|
||
const IM_SERVICE_ENABLED = true;
|
||
|
||
|
||
// ===== 角色 → 默认首页(与 custom-tab-bar 完全一致) =====
|
||
const roleDefaultPage = {
|
||
normal: '/pages/index/index',
|
||
dashou: '/pages/jiedan/jiedan',
|
||
shangjia: '/pages/shangjiaduan/shangjiaduan',
|
||
guanshi: '/pages/guanshiduan/guanshiduan',
|
||
zuzhang: '/pages/zuzhangduan/zuzhangduan',
|
||
kaoheguan: '/pages/kaoheguan/kaoheguan'
|
||
};
|
||
|
||
// 【暂时下线】组长/考核官身份已统一迁移为打手
|
||
const DEPRECATED_ROLES = ['zuzhang', 'kaoheguan'];
|
||
|
||
App({
|
||
globalData: {
|
||
|
||
hasShownPopupOnColdStart: false,
|
||
|
||
apiBaseUrl: 'https://wenhe.nmslb.com/hqhd',
|
||
ossImageUrl: '',
|
||
morentouxiang: '',
|
||
dashouguize: '',
|
||
|
||
shangpinliebiao: [],
|
||
shangpinzhuanqu: [],
|
||
shangpinleixing: [],
|
||
shangpinlunbo: [],
|
||
shangpingonggao: '',
|
||
lunbozhanwei: '/images/lunbozhanwei.jpg',
|
||
|
||
dingdanTiaoshu: {
|
||
daifuwu: 0,
|
||
fuwuzhong: 0,
|
||
yiwancheng: 0,
|
||
yituikuan: 0
|
||
},
|
||
|
||
dashouqun: '',
|
||
dashouqunid: '',
|
||
guanshiqun: '',
|
||
guanshiqunid: '',
|
||
|
||
appId:'wx568f9b618bfa7578',
|
||
|
||
shangjiastatus: 0,
|
||
dashoustatus: 0,
|
||
guanshistatus: 0,
|
||
dashouNicheng: '',
|
||
zhanghaoStatus: null,
|
||
dashouzhuangtai: null,
|
||
yongjin: null,
|
||
zonge: null,
|
||
yajin: null,
|
||
chenghao: '',
|
||
jinfen: null,
|
||
clumber: [{
|
||
huiyuanid: '',
|
||
huiyuanming: '',
|
||
daoqi: ''
|
||
}],
|
||
chengjiaoliang: null,
|
||
zaixianZhuangtai: null,
|
||
|
||
guanshi: {
|
||
nicheng: '',
|
||
uid: '',
|
||
touxiang: '',
|
||
gszhstatus: '',
|
||
yaoqingzongshu: 0,
|
||
fenyongzonge: '0.00',
|
||
fenyongtixian: '0.00'
|
||
},
|
||
|
||
shangjia: {
|
||
sjzhzhuangtai: '',
|
||
sjyue: '',
|
||
fadanzong: null,
|
||
tuikuanzong: null,
|
||
riliushui: '',
|
||
yueliushui: ''
|
||
},
|
||
|
||
paihangAssets: null,
|
||
pageAssets: null,
|
||
xshenfen: 1,
|
||
|
||
goEasyConfig: null,
|
||
chatEnabled: false,
|
||
kefuConfig: {
|
||
link: '',
|
||
enterpriseId: ''
|
||
},
|
||
|
||
cosConfig: {
|
||
bucket: '',
|
||
region: 'ap-shanghai',
|
||
uploadPathPrefix: 'order/'
|
||
},
|
||
|
||
goEasyConnection: {
|
||
status: 'disconnected',
|
||
userId: '',
|
||
identityType: '',
|
||
lastConnectTime: 0,
|
||
autoReconnect: true,
|
||
reconnectAttempts: 0,
|
||
maxReconnectAttempts: 5,
|
||
heartbeatInterval: null,
|
||
cacheKeys: {
|
||
savedConnection: 'savedGoEasyConnection',
|
||
userId: 'goEasyUserId',
|
||
identityType: 'currentGoEasyIdentity',
|
||
connectTime: 'goEasyConnectTime'
|
||
},
|
||
config: {
|
||
heartbeatInterval: 20000,
|
||
reconnectDelay: 3000,
|
||
offlineTimeout: 30000,
|
||
cacheValidityHours: 12
|
||
}
|
||
},
|
||
|
||
messageManager: {
|
||
unreadTotal: 0,
|
||
unreadMap: {},
|
||
latestMessages: [],
|
||
notificationQueue: [],
|
||
notificationVisible: false,
|
||
lastNotificationTime: 0,
|
||
notificationCooldown: 3000,
|
||
tabBarIndex: 2,
|
||
showTabBarBadge: true,
|
||
customTabBar: true,
|
||
tabBarBadgeText: 0,
|
||
soundEnabled: true,
|
||
vibrationEnabled: true,
|
||
doNotDisturb: false,
|
||
doNotDisturbStart: '22:00',
|
||
doNotDisturbEnd: '08:00',
|
||
notificationStyle: {
|
||
position: 'top',
|
||
duration: 3000,
|
||
backgroundColor: '#00f7ff',
|
||
textColor: '#ffffff',
|
||
borderRadius: '16rpx',
|
||
boxShadow: '0 10rpx 30rpx rgba(0, 247, 255, 0.3)'
|
||
},
|
||
currentNotification: null,
|
||
cacheKeys: {
|
||
messageSettings: 'messageSettings',
|
||
unreadTotal: 'messageUnreadTotal',
|
||
latestMessages: 'latestMessages',
|
||
notificationMuted: 'notificationMuted'
|
||
}
|
||
},
|
||
|
||
pageState: {
|
||
currentPage: '',
|
||
isInChatPage: false,
|
||
currentChatId: '',
|
||
lastPageUpdate: 0
|
||
},
|
||
|
||
eventListeners: {},
|
||
debugMode: false,
|
||
currentUser: null,
|
||
currentRole: 'normal' // 当前角色,默认老板
|
||
},
|
||
|
||
// ========== 仅修改 onLaunch,其余未动 ==========
|
||
async onLaunch() {
|
||
wx.hideHomeButton();
|
||
wx.onAppRoute(() => {
|
||
wx.hideHomeButton();
|
||
});
|
||
|
||
this.initChatStubs();
|
||
|
||
// 冷启动进入商城首页,但保留身份用于 IM(勿把 currentRole 强行改成 normal)
|
||
const savedRole = wx.getStorageSync('currentRole') || 'normal';
|
||
const normalizedRole = this.normalizeRole(savedRole);
|
||
this.globalData.currentRole = normalizedRole;
|
||
wx.setStorageSync('currentRole', normalizedRole);
|
||
|
||
setTimeout(() => {
|
||
wx.reLaunch({ url: '/pages/index/index' });
|
||
}, 0);
|
||
|
||
this.fetchDynamicConfig()
|
||
.then(config => {
|
||
this.applyDynamicConfig(config);
|
||
if (IM_SERVICE_ENABLED) {
|
||
this.initGoEasyWithConfig();
|
||
const ChatCore = require('./utils/chat-core');
|
||
ChatCore.initGlobalMessageSystem(this);
|
||
this.bootstrapImListening();
|
||
}
|
||
this.initCurrentUser();
|
||
})
|
||
.catch(error => {
|
||
console.error('获取动态配置失败:', error);
|
||
this.initCurrentUser();
|
||
});
|
||
|
||
try {
|
||
const needAuth = await check();
|
||
if (needAuth) {
|
||
wx.reLaunch({ url: '/pages/phone-auth/phone-auth' });
|
||
return;
|
||
}
|
||
} catch (e) {}
|
||
},
|
||
|
||
onShow() {
|
||
if (this.globalData.chatEnabled && typeof this.ensureConnection === 'function') {
|
||
this.ensureConnection();
|
||
}
|
||
},
|
||
|
||
/** 配置加载完成后立即启动 IM 监听(有 uid 即连) */
|
||
bootstrapImListening() {
|
||
const uid = wx.getStorageSync('uid');
|
||
if (!uid || !this.globalData.chatEnabled) return;
|
||
try {
|
||
this.ensureConnection();
|
||
} catch (e) {
|
||
console.warn('IM 启动失败:', e);
|
||
}
|
||
},
|
||
|
||
initChatStubs() {
|
||
this.globalData.chatEnabled = false;
|
||
wx.goEasy = null;
|
||
this.disconnectGoEasy = () => Promise.resolve();
|
||
this.ensureConnection = () => {};
|
||
this.connectWithIdentity = () => Promise.reject(new Error('聊天未启用'));
|
||
this.connectForCurrentRole = () => {};
|
||
this.switchRoleAndReconnect = () => Promise.resolve(false);
|
||
this.loadConversations = () => {};
|
||
this.updateUnreadCount = () => {};
|
||
this.getSavedConnection = () => null;
|
||
this.clearSavedConnection = () => {};
|
||
this.saveConnectionState = () => {};
|
||
this.handleNewMessage = () => {};
|
||
this.toggleDoNotDisturb = () => {};
|
||
this.toggleNotificationMute = () => {};
|
||
this.closeNotification = () => {};
|
||
this.updateCurrentPageState = () => {};
|
||
},
|
||
|
||
|
||
|
||
|
||
// 以下三个方法完全保持原样
|
||
fetchDynamicConfig() {
|
||
return new Promise((resolve, reject) => {
|
||
wx.request({
|
||
url: this.globalData.apiBaseUrl + '/peizhi/qdpzhq',
|
||
method: 'POST',
|
||
header: { 'content-type': 'application/json' },
|
||
success: (res) => {
|
||
if (res.statusCode >= 500) {
|
||
reject(new Error('服务器错误 ' + res.statusCode));
|
||
return;
|
||
}
|
||
if (res.statusCode === 200 && res.data && res.data.code === 0) {
|
||
resolve(res.data.data);
|
||
} else {
|
||
reject(new Error(res.data?.msg || '接口返回错误'));
|
||
}
|
||
},
|
||
fail: reject
|
||
});
|
||
});
|
||
},
|
||
|
||
applyDynamicConfig(config) {
|
||
if (config.cos) {
|
||
this.globalData.ossImageUrl = config.cos.ossImageUrl || '';
|
||
this.globalData.cosConfig = {
|
||
bucket: config.cos.bucket || '',
|
||
region: config.cos.region || 'ap-shanghai',
|
||
uploadPathPrefix: config.cos.uploadPathPrefix || 'order/'
|
||
};
|
||
}
|
||
if (config.goEasy) {
|
||
this.globalData.goEasyConfig = {
|
||
host: config.goEasy.host || 'hangzhou.goeasy.io',
|
||
appkey: config.goEasy.appkey || ''
|
||
};
|
||
}
|
||
if (config.otherConfig) {
|
||
this.globalData.morentouxiang = config.otherConfig.morentouxiang || '';
|
||
this.globalData.dashouguize = config.otherConfig.dashouguize || '';
|
||
this.globalData.paihangAssets = config.otherConfig.paihangAssets || null;
|
||
}
|
||
if (config.pageAssets) {
|
||
this.globalData.pageAssets = config.pageAssets;
|
||
}
|
||
if (config.kefu) {
|
||
this.globalData.kefuConfig = {
|
||
link: config.kefu.link || '',
|
||
enterpriseId: config.kefu.enterpriseId || ''
|
||
};
|
||
}
|
||
this.emitEvent('configReady', config);
|
||
},
|
||
|
||
initGoEasyWithConfig() {
|
||
if (!IM_SERVICE_ENABLED) return;
|
||
const GoEasy = require('./static/lib/goeasy-2.13.24.esm.min').default;
|
||
wx.GoEasy = GoEasy;
|
||
const cfg = this.globalData.goEasyConfig;
|
||
if (!cfg || !cfg.appkey) {
|
||
this.globalData.chatEnabled = false;
|
||
return;
|
||
}
|
||
try {
|
||
wx.goEasy = GoEasy.getInstance({
|
||
host: cfg.host || 'hangzhou.goeasy.io',
|
||
appkey: cfg.appkey,
|
||
modules: ['im', 'pubsub']
|
||
});
|
||
const imReady = !!(wx.goEasy?.im && typeof wx.goEasy.im.on === 'function');
|
||
this.globalData.chatEnabled = imReady;
|
||
if (!imReady) {
|
||
wx.goEasy = null;
|
||
}
|
||
} catch (e) {
|
||
console.warn('GoEasy 初始化失败:', e);
|
||
this.globalData.chatEnabled = false;
|
||
wx.goEasy = null;
|
||
}
|
||
},
|
||
|
||
initCurrentUser() {
|
||
const uid = wx.getStorageSync('uid');
|
||
if (uid) {
|
||
this.globalData.currentUser = {
|
||
id: uid,
|
||
name: '用户' + uid.substring(0, 6),
|
||
avatar: this.globalData.ossImageUrl + this.globalData.morentouxiang
|
||
};
|
||
}
|
||
},
|
||
|
||
emitEvent(eventName, data) {
|
||
if (this.globalData.eventListeners[eventName]) {
|
||
this.globalData.eventListeners[eventName].forEach(callback => {
|
||
try { callback(data); } catch (error) { console.error(error); }
|
||
});
|
||
}
|
||
},
|
||
|
||
on(eventName, callback) {
|
||
if (!this.globalData.eventListeners[eventName]) {
|
||
this.globalData.eventListeners[eventName] = [];
|
||
}
|
||
this.globalData.eventListeners[eventName].push(callback);
|
||
},
|
||
|
||
off(eventName, callback) {
|
||
if (this.globalData.eventListeners[eventName]) {
|
||
const index = this.globalData.eventListeners[eventName].indexOf(callback);
|
||
if (index > -1) {
|
||
this.globalData.eventListeners[eventName].splice(index, 1);
|
||
}
|
||
}
|
||
},
|
||
|
||
normalizeRole(role) {
|
||
if (DEPRECATED_ROLES.includes(role)) return 'dashou';
|
||
return role || 'normal';
|
||
},
|
||
|
||
getDashouEntryPage() {
|
||
return '/pages/jiedan/jiedan';
|
||
}
|
||
}); |