Files
a_long/miniprogram/app.js
2026-06-27 01:26:11 +08:00

386 lines
12 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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';
}
});