// pages/home/home.js const storage = require('../../utils/storage.js'); const { get, post } = require('../../api/request.js'); const config = require('../../api/config.js'); const { PROJECT_CONFIG } = require('../../utils/projectConfig.js'); const { ENV } = require('../../api/env.js'); Page({ /** * 页面的初始数据 */ data: { sessionId: "", showConfirm: false, myItem: {}, waterIntakeName: "", image: "/images/ic_head_bg.jpg", userPhone: "", userName: "请点击登录", scrollViewHeight: 0, listData: [], isRefreshing: false, isWXRefreshing: false, errorData: '', //错误内容 showErrorDialog: false, confirmBtn: { content: '确认' }, errorDialogTitle: "关阀错误", showForceConfirm: false, //是否强制开阀 lastIntakeName: "", showProjectDialog: false, selectedProject: '', avatarTapCount: 0, isFromLogin: false, showTipDialog: '', projectConfig: PROJECT_CONFIG, // 添加项目配置到data中 showInfoDialog: false, projectList: [] }, openValve: function (e) { const app = getApp(); if (app.globalData.isLoggedIn) { wx.navigateTo({ url: '/pages/waterIntake/waterIntake', }) } else { wx.showToast({ title: '请先登录', icon: 'error' }) } }, // calculateScrollViewHeight: function () { // wx.createSelectorQuery().selectAll('.list-item').boundingClientRect((rects) => { // let totalHeight = rects.reduce((sum, rect) => sum + rect.height, 0); // this.setData({ // scrollViewHeight: totalHeight, // }); // }).exec(); // }, startPullDownRefresh() { if (getApp().globalData.isLoggedIn) { if (!this.data.isWXRefreshing) { var self = this; console.log(this.data.isRefreshing); this.setData({ isRefreshing: true }); this.getOpenList(); } } else { wx.showToast({ title: '请先登录', icon: 'error' }) } }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { console.log('home页面onLoad开始,参数:', options); // 初始化项目列表数据 this.initProjectList(); //当开阀成功后调用刷新 if (options.param === "1" || options.param === "2") { this.setData({ options: options }) } // 检查是否从登录页面返回 let fromLogin = false; // 检查URL参数 if (options && options.fromLogin === 'true') { console.log('检测到URL参数fromLogin=true'); fromLogin = true; } console.log('home页面加载,fromLogin:', fromLogin, '参数:', options); // 设置fromLogin标志 if (fromLogin) { console.log('设置isFromLogin=true'); this.setData({ isFromLogin: true }); } // 延迟执行剩余的初始化过程,以确保临时标记和URL参数能被正确处理 setTimeout(() => { this.initializePage(options, fromLogin); }, 100); }, // 初始化项目列表数据 initProjectList() { // 将PROJECT_CONFIG对象转换为数组,方便在视图中遍历 const projectList = Object.entries(PROJECT_CONFIG).map(([key, config]) => ({ key: key, // 使用key作为项目标识(JYG、MQ等) tag: config.tag, // 保留tag字段(原配置中已有的标识,如ym、mq等) displayName: config.displayName, // 显示名称 ...config // 其他配置属性 })); // 获取当前已选择的项目,默认为JYG let currentSelectedProject = 'JYG'; // 尝试从全局变量获取 const app = getApp(); if (app && app.globalData && app.globalData.selectedProject) { currentSelectedProject = app.globalData.selectedProject; } else { // 尝试从本地存储获取 try { const savedProject = wx.getStorageSync('selectedProject'); if (savedProject) { currentSelectedProject = savedProject; } } catch (e) { console.error('从本地存储获取项目失败:', e); } } // 设置到页面数据中 this.setData({ projectList, selectedProject: currentSelectedProject }); console.log('项目列表已初始化:', projectList, '当前选中项目:', currentSelectedProject); }, // 新增的初始化页面辅助函数,分离出onLoad中的逻辑以便延迟执行 initializePage(options, fromLogin) { // 检查是否已选择项目 const { PROJECT_URLS } = require('../../api/config.js'); // 确保全局变量存在 getApp().globalData = getApp().globalData || {}; storage.getItemSafe('selectedProject') .then((project) => { if (project) { this.setData({ selectedProject: project }); // 设置 baseUrl const serverUrl = PROJECT_CONFIG[project]?.serverUrl; if (serverUrl) { getApp().globalData.baseUrl = serverUrl; getApp().globalData.selectedProject = project; console.log('设置baseUrl:', serverUrl); } // 根据项目设置对应的tag const projectConfig = PROJECT_CONFIG[project]; if (projectConfig) { getApp().globalData.tag = projectConfig.tag; this.setData({ userName: projectConfig.displayName }); } // 根据项目设置对应的operator和clientId if (projectConfig && projectConfig.operatorId) { getApp().globalData.operator = projectConfig.operatorId; getApp().globalData.clientId = projectConfig.operatorId; getApp().globalData.isLoggedIn = true; getApp().globalData.sessionId = projectConfig.operatorId; // 如果有vcId,也设置 if (projectConfig.vcId) { getApp().globalData.vcId = projectConfig.vcId; } // 持久化存储项目参数 const params = { operator: projectConfig.operatorId, clientId: projectConfig.operatorId, isLoggedIn: true, sessionId: projectConfig.operatorId }; if (projectConfig.vcId) { params.vcId = projectConfig.vcId; } storage.setItem(`${project}_params`, params); } // 继续初始化页面 this.continueInitPage(options); } else { // 首次进入,显示项目选择弹窗 this.setData({ showProjectDialog: true }); return Promise.reject({ type: 'project_not_selected', message: '未选择项目' }); // 终止后续处理 } }) .then(() => { // 继续初始化页面 this.continueInitPage(options); }) .catch(err => { // 将错误对象规范化 const error = typeof err === 'object' ? err : { type: 'unknown', message: String(err) }; console.log('获取存储数据中断:', error.message); // 如果是从登录页返回或已登录,不再跳转 if (fromLogin) { console.log('从登录页返回或已登录,继续初始化页面'); this.continueInitPage(options); return; } // 处理未选择项目的情况 if (error.type === 'project_not_selected') { console.log('未选择项目,显示项目选择弹窗'); this.setData({ showProjectDialog: true }); return; } // 其他未知错误,尝试继续初始化页面 console.warn('未知错误,尝试继续初始化页面:', error); this.continueInitPage(options); }); }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady() { // 检查是否有options和param if (this.data.options && this.data.options.param) { if (this.data.options.param === "1" || this.data.options.param === "2") { this.getOpenList(); } } }, /** * 生命周期函数--监听页面显示 */ onShow() { console.log('home页面onShow开始'); // 获取当前页面的参数 const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; let fromLogin = false; // 检查是否有fromLogin参数 if (currentPage && currentPage.options && currentPage.options.fromLogin === 'true') { console.log('onShow: 检测到fromLogin参数,设置isFromLogin标记'); fromLogin = true; this.setData({ isFromLogin: true }); } // 初始化处理 if (fromLogin || this.data.isFromLogin) { console.log('onShow: 从登录页返回,不进行登录检查'); } else { console.log('onShow: 正常显示页面'); // 延迟检查登录状态,确保能正确识别临时标记 setTimeout(() => { this.checkLoginStatusIfNeeded(); }, 300); } }, // 检查登录状态(仅在需要时) checkLoginStatusIfNeeded() { // 再次确认是否从登录页返回 if (this.getFromLogin()) { console.log('检测到从登录页返回的标记,不进行登录检查'); return; } console.log('执行登录状态检查'); this.checkLoginStatus(); }, /** * 生命周期函数--监听页面隐藏 */ onHide() { // 页面隐藏时考虑清理临时标记 this.cleanupTempMarkers(); }, /** * 生命周期函数--监听页面卸载 */ onUnload() { // 页面卸载时清理临时标记 this.cleanupTempMarkers(); }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { // 下拉刷新触发的逻辑,可以是请求数据等操作 // 例如,请求数据后更新页面内容 console.log(this.data.isRefreshing); this.setData({ isWXRefreshing: true }); console.log(this.data.isRefreshing); // 数据请求完成后,停止下拉刷新的动画 this.getOpenList(); }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { }, /** * 用户点击右上角分享 */ onShareAppMessage() { }, recharge() { // wx.navigateTo({ // url: '/pages/rechargeCard/rechargeCard', // }) wx.showToast({ title: '暂未开放', icon: 'none' }) }, openValveList() { const app = getApp(); if (app.globalData.isLoggedIn) { wx.navigateTo({ url: '/pages/valveList/valveList', }) } else { wx.showToast({ title: '请先登录', icon: 'error' }) } }, feedBack() { wx.showToast({ title: '暂未开放', icon: 'none' }) }, //解绑用户 unbind() { // 检查当前项目是否需要登录 const currentProject = getApp().globalData.selectedProject; const projectConfig = PROJECT_CONFIG[currentProject]; // 如果当前项目配置为不需要登录,则提示用户并打开项目选择弹窗 if (projectConfig && !projectConfig.needLogin) { wx.showModal({ title: '切换项目', content: '是否确定解绑?', confirmText: '确认', cancelText: '取消', success: (res) => { if (res.confirm) { // 显示项目选择弹窗 this.setData({ showProjectDialog: true }); } } }); return; } // 如果已登录,显示解绑确认对话框 if (getApp().globalData.isLoggedIn) { wx.showModal({ title: '解绑确认', content: '确定要解绑当前账号吗?解绑后将无法使用相关功能,需重新绑定。', confirmText: '确认解绑', confirmColor: '#e34d59', cancelText: '取消', success: (res) => { if (res.confirm) { this.unBindPost(); } } }); } else { wx.showToast({ title: '还未绑定', icon: 'error' }); } }, //轮灌 irrigation() { if (getApp().globalData.isLoggedIn) { wx.navigateTo({ url: '/pages/irrigation/irrigation', }) } else { wx.showToast({ title: '请先登录', icon: 'error' }) } }, handleChange(e) { const item = e.currentTarget.dataset.item; console.log(item); this.setData({ showConfirm: true, waterIntakeName: item.intakeNum, myItem: item }); }, closeDialog() { console.log("closeDialog"); this.setData({ showConfirm: false, showErrorDialog: false, showForceConfirm: false }); }, cancelDialog() { this.setData({ showForceConfirm: false, showConfirm: false }); }, /** * 关闭阀门 * @param {*} orderNo 订单号 * @param {*} rtuAddr 阀控器地址 * @param {*} vcNum 虚拟卡编号 */ postCloseValaue(orderNo, rtuAddr, vcNum) { wx.showLoading({ title: '正在关阀请稍候...', // 加载提示文字 mask: true // 是否显示透明蒙层,防止触摸穿透,默认为 false }); const app = getApp(); const data = { rtuAddr: rtuAddr, vcNum: vcNum, //虚拟卡ID orderNo: orderNo, operator: app.globalData.clientId //操作员 }; console.log("postCloseValaue" + data); post({ url: "wx/valve/close_wx", data: data, isShowLoding: false, timeout: 185000 }).then(response => { // 处理成功响应 console.log('请求成功:', response); // 加载完成后隐藏加载动画 wx.hideLoading(); this.getOpenList(); wx.showToast({ title: '关阀成功', icon: 'success', duration: 3000 }) }).catch(error => { wx.hideLoading(); // 处理错误响应 console.error('请求失败:', error); if (error.code === "ECONNABORTED" || error.message?.includes('timeout')) { // 处理超时错误 this.setData({ showErrorDialog: true, errorData: "通信超时,请稍后再试", errorDialogTitle: "关阀错误" }) } else { this.setData({ showErrorDialog: true, errorData: error.msg, errorDialogTitle: "关阀错误" }) } }); }, /** * 获取为关阀记录 */ getOpenList() { const app = getApp(); if (!getApp().globalData.isLoggedIn) { wx.showToast({ title: '请先登录', icon: 'error' }) this.setData({ isRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 isWXRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 }); return; } // 检查是否从登录页返回 const fromLogin = this.getFromLogin(); // 检查clientId是否存在 if (!app.globalData.clientId) { console.log('getOpenList: clientId不存在,不执行API请求'); // 如果是从登录页返回,就显示空列表而不是错误提示 this.setData({ listData: [], isRefreshing: false, isWXRefreshing: false }); // 如果不是从登录页返回且不处于刷新状态,考虑检查登录状态 if (!fromLogin && !this.data.isRefreshing && !this.data.isWXRefreshing) { console.log('getOpenList: 非刷新状态下检测到无clientId,尝试自动登录'); // 延迟调用微信登录,尝试自动恢复会话 setTimeout(() => { if (!getApp().globalData.clientId && !this.getFromLogin()) { this.wxLogin(); } }, 1000); } return; } console.log('getOpenList: 开始获取列表数据, clientId:', app.globalData.clientId); const params = { url: 'wx/valve/get', data: { operator: app.globalData.clientId } }; get(params).then(data => { console.log('获取列表数据成功:', data); this.setData({ listData: data.content, isRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 isWXRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 }); this.updateDisplayText(); }).catch(err => { console.error('获取列表数据失败:', err); // 错误回调 this.setData({ isRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 isWXRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 }); // 检查错误类型 if (err && err.code === '0003') { console.log('会话无效或过期,但不进行跳转'); // 如果不是从登录页返回,显示错误提示 if (!fromLogin) { wx.showToast({ title: '登录已过期,请刷新重试', icon: 'none', duration: 3000 }); } } else { // 一般错误,显示错误信息 wx.showToast({ title: err.msg || '获取列表数据失败', icon: 'none', duration: 3000 }); } }); }, /** * 确认关闭回调 * @param {} item */ confirmDialog() { this.setData({ showConfirm: false }); this.postCloseValaue(this.data.myItem.orderNo, this.data.myItem.rtuAddr, this.data.myItem.vcNum); }, //根据session获取农户信息 getUserDataBySession() { // 先检查是否从登录页返回 if (this.getFromLogin()) { console.log('getUserDataBySession: 检测到从登录页返回的标记,不执行API请求'); return; } const app = getApp(); // 检查是否有sessionId if (!app.globalData.sessionId) { console.log('getUserDataBySession: sessionId不存在,不执行API请求'); return; } console.log('getUserDataBySession: 开始获取用户数据, sessionId:', app.globalData.sessionId); const params = { url: 'wx/client/simple_info', data: { sessionId: app.globalData.sessionId } }; get(params).then(data => { console.log('获取用户数据成功:', data); this.setData({ userName: data.content.clientName, userPhone: this.maskPhoneNumber(data.content.phone) }); }).catch(err => { console.error('获取用户数据失败:', err); // 错误回调,但不进行页面跳转 // 检查错误类型 if (err && err.code === '0003') { console.log('会话无效或过期,但不进行跳转'); // 不再直接跳转到登录页 // 清除会话信息 app.globalData.sessionId = ''; app.globalData.isLoggedIn = false; // 如果不是从登录页返回,显示错误提示 if (!this.getFromLogin()) { wx.showToast({ title: '登录已过期,请重新登录', icon: 'none', duration: 3000 }); } } else { // 其他错误,显示错误信息 wx.showToast({ title: err.msg || '获取用户信息失败', icon: 'none', duration: 3000 }); } }); }, maskPhoneNumber(phoneNumber) { if (phoneNumber.length !== 11) { throw new Error("Phone number must be 11 digits"); } // 使用正则表达式替换中间四位数字为星号 const maskedPhoneNumber = phoneNumber.replace(/^(\d{3})\d{4}(\d{4})$/, "$1****$2"); return maskedPhoneNumber; }, closeDialog() { this.setData({ showErrorDialog: false }) }, /** * 扫码开阀 */ scenCode() { const that = this; wx.scanCode({ success(res) { console.log(res.result); // 当且仅当扫码为非微信二维码时,会返回result if (res.result.startsWith("content://")) { let jsonStr = res.result.replace("content://", "") try { that.saveData(jsonStr) } catch (error) { console.error('Error parsing JSON:', error); } } else { that.postOppenValva(res.result) } }, fail(err) { console.error(err); } }) }, confirmForceDialog() { console.log("confirmForceDialog"); this.setData({ showForceConfirm: false }) this.postOppenValva(this.data.lastIntakeName, true) }, /** * * @param {*} intakeName */ postOppenValva(intakeName, isforce) { const that = this; wx.showLoading({ title: '正在开阀请稍候...', // 加载提示文字 mask: true // 是否显示透明蒙层,防止触摸穿透,默认为 false }); const app = getApp(); that.setData({ lastIntakeName: intakeName }) const data = { intakeName: intakeName, //取水口ID // vcId: vcId, //虚拟卡ID operator: app.globalData.clientId, //操作员 forceOpen: !!isforce // 使用逻辑非操作符 !! 来确保 isForce 是布尔值 }; post({ url: "wx/valve/open_wx", data: data, timeout: 180000 }).then(response => { // 处理成功响应 console.log('请求成功:', response); // 加载完成后隐藏加载动画 wx.hideLoading(); //完成后回到首页 wx.reLaunch({ url: '/pages/home/home?param=true' // 首页的路径,根据实际情况填写 }); }).catch(error => { // 加载完成后隐藏加载动画 wx.hideLoading(); // 处理错误响应 console.error('请求失败:', error); if (error.code === "10005") { that.setData({ showForceConfirm: true }) } else { that.setData({ showErrorDialog: true, errorData: error.msg, errorDialogTitle: "开阀错误" }) } }); }, /** * 扫描后保存用户id和tag */ saveData(userData) { storage.setItem("userData", userData).then(() => { this.initData(); }).catch((error) => { }); }, //进入界面获取界面数据 initData() { const app = getApp(); console.log("initData开始,tag:", app.globalData.tag); // 首先检查是否从登录页返回 if (this.getFromLogin()) { console.log('initData: 检测到从登录页返回的标记,仅获取基本数据'); // 即使从登录页返回,也尝试获取开阀列表以显示基本UI // 但先检查是否有客户端ID可用 if (!app.globalData.clientId) { console.log('initData: 从登录页返回且无clientId,尝试从存储恢复'); // 尝试从存储恢复clientId storage.getItemSafe('clientId') .then(clientId => { if (clientId) { console.log('initData: 从存储恢复clientId成功:', clientId); app.globalData.clientId = clientId; this.getOpenList(); } else { console.log('initData: 无法恢复clientId,显示空列表'); this.setData({ listData: [] }); } }) .catch(err => { console.error('initData: 恢复clientId失败:', err); this.setData({ listData: [] }); }); } else { this.getOpenList(); } return; } // 检查当前项目是否需要登录 const currentProject = app.globalData.selectedProject; const projectConfig = PROJECT_CONFIG[currentProject]; const needLogin = projectConfig && projectConfig.needLogin; // 尝试获取用户数据和已开阀记录 try { // 优先检查全局变量中是否有sessionId if (app.globalData.sessionId) { console.log('initData: 使用全局sessionId获取数据'); // 只有需要登录的项目才调用getUserDataBySession if (needLogin) { console.log('initData: 当前项目需要登录,获取用户数据'); this.getUserDataBySession(); } else { console.log('initData: 当前项目不需要登录,跳过获取用户数据'); } this.getOpenList(); return; } // 检查是否有存储的userData const hasUserData = storage.isHasKeySync("userData"); console.log('initData: 是否存在userData:', hasUserData); if (hasUserData) { storage.getItemSafe('userData') .then((data) => { console.log('initData: 成功读取userData'); if (data) { try { let jsonObj = JSON.parse(data); app.globalData.sessionId = jsonObj.sessionId; app.globalData.tag = jsonObj.tag; console.log("userData已加载:", data); } catch (e) { console.error('userData解析失败:', e); } } // 只有需要登录的项目才调用getUserDataBySession if (needLogin) { console.log('initData: 当前项目需要登录,获取用户数据'); this.getUserDataBySession(); } else { console.log('initData: 当前项目不需要登录,跳过获取用户数据'); } this.getOpenList(); }) .catch((err) => { console.error('加载userData失败:', err); // 再次检查是否从登录页返回 if (this.getFromLogin()) { console.log('initData:catch: 检测到从登录页返回的标记,只获取开阀列表'); this.getOpenList(); } else { // 只有需要登录的项目才调用getUserDataBySession if (needLogin) { console.log('initData:catch: 当前项目需要登录,获取用户数据'); this.getUserDataBySession(); } else { console.log('initData:catch: 当前项目不需要登录,跳过获取用户数据'); } this.getOpenList(); } }); } else { console.log('未找到userData,直接获取数据'); // 再次检查是否从登录页返回 if (this.getFromLogin()) { console.log('initData:else: 检测到从登录页返回的标记,只获取开阀列表'); this.getOpenList(); } else { // 只有需要登录的项目才调用getUserDataBySession if (needLogin) { console.log('initData:else: 当前项目需要登录,获取用户数据'); this.getUserDataBySession(); } else { console.log('initData:else: 当前项目不需要登录,跳过获取用户数据'); } this.getOpenList(); } } } catch (e) { console.error('initData执行出错:', e); // 再次检查是否从登录页返回 if (this.getFromLogin()) { console.log('initData:error: 检测到从登录页返回的标记,只获取开阀列表'); this.getOpenList(); } else { // 只有需要登录的项目才调用getUserDataBySession if (needLogin) { console.log('initData:error: 当前项目需要登录,获取用户数据'); this.getUserDataBySession(); } else { console.log('initData:error: 当前项目不需要登录,跳过获取用户数据'); } this.getOpenList(); } } }, // 处理头像点击 handleAvatarTap() { this.setData({ avatarTapCount: this.data.avatarTapCount + 1 }); if (this.data.avatarTapCount >= 5) { this.setData({ showProjectDialog: true, avatarTapCount: 0 }); } }, // 处理弹窗可见性变化 onVisibleChange(e) { // 如果尝试关闭弹窗且没有选择项目,则阻止关闭 if (!e.detail.visible && !this.data.selectedProject) { return; } this.setData({ showProjectDialog: e.detail.visible }); }, // 处理项目选择变化 onProjectChange(event) { console.log('选择的项目:', event.detail.value); this.setData({ selectedProject: event.detail.value }); }, // 处理项目选择确认 handleProjectConfirm() { console.log('开始处理项目选择确认', this.data.selectedProject, this.data.projectList); if (!this.data.selectedProject) { wx.showToast({ title: '请选择项目', icon: 'none' }); return; } // 获取当前已选项目和新选择的项目 const currentProject = getApp().globalData.selectedProject; const newProject = this.data.selectedProject; console.log('当前项目:', currentProject, '新选择项目:', newProject); console.log('PROJECT_CONFIG 内容:', PROJECT_CONFIG); const projectConfig = PROJECT_CONFIG[newProject]; console.log('选择的项目配置:', projectConfig); if (!projectConfig) { wx.showToast({ title: '项目配置错误', icon: 'none' }); return; } // 检查是否切换了项目(如果当前项目不同于新选择的项目) const isProjectChanged = currentProject && currentProject !== newProject; // 添加二次确认 const confirmText = isProjectChanged ? `确定要将项目从"${PROJECT_CONFIG[currentProject]?.displayName || '当前项目'}"切换到"${projectConfig.displayName}"吗?` : `确定选择"${projectConfig.displayName}"项目吗?`; wx.showModal({ title: isProjectChanged ? '确认切换项目' : '确认选择项目', content: confirmText, confirmText: isProjectChanged ? '确认切换' : '确认', cancelText: '取消', success: (res) => { if (res.confirm) { // 用户确认选择,继续处理 this.processProjectSelection(currentProject, newProject, projectConfig, isProjectChanged); } else { // 用户取消,不进行任何操作 console.log('用户取消了项目选择'); } } }); }, // 处理项目选择的后续操作 processProjectSelection(currentProject, newProject, projectConfig, isProjectChanged) { // 如果切换了项目,先清除登录状态 if (isProjectChanged) { console.log(`正在从项目 ${currentProject} 切换到 ${newProject},将清除登录状态`); // 清除全局登录状态 getApp().globalData.sessionId = ''; getApp().globalData.clientId = ''; getApp().globalData.isLoggedIn = false; getApp().globalData.userInfo = null; // 清除存储中的登录状态 try { wx.removeStorageSync('sessionId'); wx.removeStorageSync('clientId'); wx.removeStorageSync('userData'); wx.removeStorageSync('isLoggedIn'); console.log('已清除登录相关的存储数据'); } catch (e) { console.error('清除存储数据失败:', e); } // 重置UI显示状态 this.setData({ userName: "请登录", userPhone: "", listData: [] }); } // 保存项目选择到本地存储 storage.setItem('selectedProject', newProject).then(() => { // 调用setBaseUrl来更新基础URL try { console.log('尝试设置基础URL,项目:', newProject); const result = config.setBaseUrl(newProject); console.log('设置基础URL结果:', result); } catch (error) { console.error('设置基础URL出错:', error); // 继续执行,不中断流程 } // 更新全局变量 getApp().globalData = getApp().globalData || {}; getApp().globalData.selectedProject = newProject; getApp().globalData.baseUrl = projectConfig.serverUrl; getApp().globalData.serverId = projectConfig.serverId; // 通过配置对象统一设置项目参数 getApp().globalData.tag = projectConfig.tag; // 设置用户界面显示的项目名称 this.setData({ userName: projectConfig.displayName }); // 对于不需要登录的项目,直接设置operator和clientId if (!projectConfig.needLogin && projectConfig.operatorId) { const operatorId = projectConfig.operatorId; getApp().globalData.operator = operatorId; getApp().globalData.clientId = operatorId; getApp().globalData.isLoggedIn = true; getApp().globalData.sessionId = operatorId; // 如果有vcId,也设置 if (projectConfig.vcId) { getApp().globalData.vcId = projectConfig.vcId; } // 持久化存储项目参数 const params = { operator: operatorId, clientId: operatorId, isLoggedIn: true, sessionId: operatorId }; if (projectConfig.vcId) { params.vcId = projectConfig.vcId; } storage.setItem(`${newProject}_params`, params); } console.log('已切换到项目:', projectConfig.displayName, '服务器:', projectConfig.serverId, 'tag:', getApp().globalData.tag); this.setData({ showProjectDialog: false }); // 显示切换成功提示 wx.showToast({ title: `已选择${projectConfig.displayName}`, icon: 'success', duration: 2000 }); setTimeout(() => { console.log('项目已切换,正在初始化数据'); this.initData(); }, 1000); }).catch(err => { console.error('保存项目选择失败:', err); wx.showToast({ title: '保存失败,请重试', icon: 'none', duration: 2000 }); }); }, // 检查登录状态 checkLoginStatus() { const app = getApp(); // 检查是否已登录 if (app.globalData.isLoggedIn && app.globalData.sessionId) { console.log('已从全局变量检测到登录状态'); return; } // 检查本页面是否正在处理返回逻辑 const fromLogin = this.getFromLogin(); if (fromLogin) { console.log('从登录页返回,不再重定向'); return; } // 检查当前项目是否需要登录 const currentProject = app.globalData.selectedProject; if (currentProject && PROJECT_CONFIG[currentProject] && !PROJECT_CONFIG[currentProject].needLogin) { console.log('当前项目不需要登录:', currentProject); return; } // 获取当前页面路由和参数 const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; const currentRoute = currentPage ? currentPage.route : ''; const currentOptions = currentPage ? currentPage.options || {} : {}; console.log('当前页面路由:', currentRoute, '参数:', currentOptions); // 检查URL参数中是否有fromLogin if (currentOptions.fromLogin === 'true') { console.log('URL参数中检测到fromLogin=true,不执行跳转'); this.setData({ isFromLogin: true }); return; } // 如果当前已在登录页,不再跳转 if (currentRoute === 'pages/login/login') { console.log('当前已在登录页,不再跳转'); return; } // Promise链处理存储检查 Promise.all([ storage.getItemSafe('sessionId'), storage.getItemSafe('clientId'), storage.getItemSafe('isLoggedIn') ]) .then(([sessionId, clientId, isLoggedIn]) => { if (sessionId) { // 从存储中恢复登录状态 app.globalData.sessionId = sessionId; app.globalData.isLoggedIn = true; if (clientId) { app.globalData.clientId = clientId; } console.log('已从存储恢复登录状态'); // 已登录,刷新页面 wx.reLaunch({ url: '/pages/home/home' }); } else { // 标记当前页面正在处理返回逻辑 this.setData({ isFromLogin: true }); // 未登录,可能需要跳转到登录页面 console.log('未检测到登录状态,可能需要跳转到登录页'); // 最后再检查一次是否已从登录页返回 const finalCheck = this.getFromLogin(); if (finalCheck) { console.log('最终检查: 已从登录页返回,不再跳转'); return; } // 检查项目是否需要登录 if (currentProject && PROJECT_CONFIG[currentProject] && !PROJECT_CONFIG[currentProject].needLogin) { console.log('最终检查: 当前项目不需要登录:', currentProject); return; } console.log('确认需要跳转到登录页'); // 跳转前再次检查登录页面临时标记 try { wx.setStorageSync('_attempted_login_redirect', 'true'); } catch (e) { } // wx.navigateTo({ // url: `/pages/login/login?project=${this.data.selectedProject}`, // success: () => console.log('成功跳转到登录页'), // fail: (err) => console.error('跳转到登录页失败:', err) // }); } }) .catch(err => { console.error('检查登录状态时出错:', err); // 标记当前页面正在处理返回逻辑 this.setData({ isFromLogin: true }); // 再次检查是否已从登录页返回 if (this.getFromLogin()) { console.log('错误处理: 已从登录页返回,不再跳转'); return; } // 检查项目是否需要登录 if (currentProject && PROJECT_CONFIG[currentProject] && !PROJECT_CONFIG[currentProject].needLogin) { console.log('错误处理: 当前项目不需要登录:', currentProject); return; } // 出错时也跳转到登录页 // wx.navigateTo({ // url: `/pages/login/login?project=${this.data.selectedProject}`, // success: () => console.log('错误后成功跳转到登录页'), // fail: (err) => console.error('错误后跳转到登录页失败:', err) // }); }); }, // 辅助函数:检查是否从登录页返回 getFromLogin() { // 检查当前页面的options const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; if (currentPage && currentPage.options && currentPage.options.fromLogin === 'true') { console.log('getFromLogin: 检测到URL参数fromLogin=true'); // 设置标志,确保下次检查时能识别 this.setData({ isFromLogin: true }); return true; } console.log('getFromLogin: 未检测到从登录页返回的标记'); return false; }, // 继续初始化页面 continueInitPage(options) { console.log('继续初始化页面,options:', options); // 检查是否从登录页返回 let fromLogin = false; // 从URL参数中检查 if (options && options.fromLogin === 'true') { console.log('continueInitPage: 从URL参数检测到fromLogin=true'); fromLogin = true; this.setData({ isFromLogin: true }); } // 从页面数据中检查 if (this.data.isFromLogin) { console.log('continueInitPage: 从页面数据中检测到isFromLogin=true'); fromLogin = true; } // 当开阀成功后调用刷新 if (options && options.param) { console.log("开阀成功参数:", options.param); wx.showToast({ title: '开阀成功', icon: 'success', duration: 3000 }); this.getOpenList(); } // 初始化数据 this.initData(); // 如果不是从登录页返回,则设置延迟检查登录状态 if (!fromLogin) { console.log('不是从登录页返回,延迟检查登录状态'); setTimeout(() => { // 仅在未登录且不是从登录页返回时检查登录状态 if (!getApp().globalData.isLoggedIn) { console.log('延迟检查:未登录且不是从登录页返回,执行登录状态检查'); this.checkLoginStatus(); } }, 500); } else { console.log('从登录页返回,不检查登录状态'); } }, // 微信登录 wxLogin() { // 检查当前项目是否需要登录 const currentProject = getApp().globalData.selectedProject; if (currentProject && PROJECT_CONFIG[currentProject] && !PROJECT_CONFIG[currentProject].needLogin) { console.log('wxLogin: 当前项目不需要登录:', currentProject); return; } if (!getApp().globalData.isLoggedIn) { wx.showLoading({ title: '正在登录请稍候...', mask: true }); wx.login({ success: (res) => { if (res.code) { // 将code发送到服务器获取openid post({ url: "wx/client/code_login", data: { code: res.code } }).then(response => { wx.hideLoading(); if (response.code === "0001") { if (response.content.client.clientId === "") { // 未绑定账号,跳转到登录页面 // wx.navigateTo({ // url: `/pages/login/login?project=${this.data.selectedProject}` // }); } else { this.setData({ userName: response.content.client.clientName, userPhone: response.content.client.userPhone }) // 已有账号,保存数据并初始化 const sessionId = response.content.client.sessionId; const clientId = response.content.client.clientId; // 设置全局变量 getApp().globalData.sessionId = sessionId; getApp().globalData.clientId = clientId; getApp().globalData.isLoggedIn = true; // 设置正确的项目tag const projectConfig = PROJECT_CONFIG[this.data.selectedProject]; if (projectConfig) { getApp().globalData.tag = projectConfig.tag; } // 保存到存储 storage.setItem("sessionId", sessionId); storage.setItem("clientId", clientId); storage.setItem("isLoggedIn", "true"); // 保存userData信息,包含sessionId和tag const userData = JSON.stringify({ sessionId: sessionId, tag: projectConfig ? projectConfig.tag : 'ym', project: this.data.selectedProject, userName: response.content.client.clientName, userPhone: response.content.client.userPhone }); storage.setItem("userData", userData) .then(() => { console.log('用户数据保存成功,包含项目信息:', this.data.selectedProject, 'tag:', projectConfig ? projectConfig.tag : 'ym'); this.initData(); }) .catch(err => { console.warn('保存userData失败,但继续初始化:', err); this.initData(); }); } } else { wx.showToast({ title: '登录失败', icon: 'error', duration: 2000 }); // wx.navigateTo({ // url: `/pages/login/login?project=${this.data.selectedProject}` // }); } }).catch(error => { wx.hideLoading(); console.error('登录请求失败:', error); wx.showToast({ title: '登录失败,请重试', icon: 'none' }); // wx.redirectTo({ // url: `/pages/login/login?project=${this.data.selectedProject}` // }); }); } else { wx.hideLoading(); console.log('登录失败!' + res.errMsg); wx.showToast({ title: '微信登录失败', icon: 'none' }); } }, fail: (err) => { wx.hideLoading(); console.error('微信登录API调用失败:', err); wx.showToast({ title: '登录失败,请重试', icon: 'none' }); } }); } }, // 辅助函数:清理临时标记 cleanupTempMarkers() { // 只有在isFromLogin为true时才进行清理 if (this.data.isFromLogin) { // 重设isFromLogin为false,但添加延迟,避免影响当前页面的返回逻辑 setTimeout(() => { this.setData({ isFromLogin: false }); console.log('重置isFromLogin=false'); }, 5000); } }, //确认解绑 unBindPost() { this.setData({ showUnBind: false }) wx.showLoading({ title: '正在解绑请稍候...', // 加载提示文字 mask: true // 是否显示透明蒙层,防止触摸穿透,默认为 false }); const data = { sessionId: getApp().globalData.sessionId //取水口ID }; post({ url: 'wx/client/unbind', data: data, useParams: true }).then(response => { // 处理成功响应 console.log('请求成功:', response); // 加载完成后隐藏加载动画 wx.hideLoading(); const app = getApp(); // 清除全局登录状态 app.globalData.sessionId = ''; app.globalData.clientId = ''; app.globalData.isLoggedIn = false; app.globalData.userInfo = null; // 清除存储中的登录状态 const storage = require('../../utils/storage.js'); storage.removeItem('sessionId') .then(() => storage.removeItem('clientId')) .then(() => storage.removeItem('userData')) .then(() => storage.removeItem('isLoggedIn')) .then(() => { wx.showToast({ title: '解绑成功', icon: 'success', duration: 2000 }); // 重置UI显示状态 this.setData({ userName: "请点击登录", userPhone: "", listData: [] }); }) .catch(err => { console.error('解绑过程中出错:', err); wx.showToast({ title: '解绑失败,请重试', icon: 'none', duration: 2000 }); }); }).catch(error => { // 加载完成后隐藏加载动画 wx.hideLoading(); // 处理错误响应 console.error('请求失败:', error); wx.showToast({ title: '解绑失败', icon: 'error', duration: 3000 }) }); }, onShareAppMessage: function (options) { // 设置分享内容 return { title: '大禹灌溉助手', // 分享标题 path: '/pages/home/home', // 分享路径,该路径需要是当前小程序存在的页面路径 imageUrl: '/images/logo2.jpg', // 分享图标,可以是网络图片路径或本地图片路径 success: function (res) { // 分享成功的回调函数 }, fail: function (res) { // 分享失败的回调函数 } }; }, //点击提示按钮 infoShow() { this.setData({ showInfoDialog: true }) }, //提示窗确认按钮 confirmBtnInfoDialog() { this.setData({ showInfoDialog: false }) }, //强制删除 onDelete(e) { const item = e.currentTarget.dataset.item; const that = this; if (this.data.useTestData) { // 测试数据模式下,模拟删除操作 wx.showLoading({ title: '正在强制删除请稍候...', mask: true }); // 模拟请求延迟 setTimeout(() => { wx.hideLoading(); // 从列表中移除被删除的项 const updatedList = this.data.listData.filter(listItem => listItem.orderNo !== item.orderNo ); this.setData({ listData: updatedList }); wx.showToast({ title: '删除成功', icon: 'success', duration: 2000 }); }, 1500); return; } wx.showLoading({ title: '正在强制删除请稍候...', // 加载提示文字 mask: true // 是否显示透明蒙层,防止触摸穿透,默认为 false }); const data = { vcNum: item.vcNum, //取水口ID rtuAddr: item.rtuAddr, //阀控器地址 }; post({ url: "wx/valve/deleteUnclosed", data: data, timeout: 180000 }).then(response => { // 处理成功响应 console.log('请求成功:', response); // 加载完成后隐藏加载动画 wx.hideLoading(); //重新获取列表刷新数据 this.getOpenList(); }).catch(error => { // 加载完成后隐藏加载动画 wx.hideLoading(); // 处理错误响应 console.error('请求失败:', error); }); }, //修改按钮文字 updateDisplayText() { const updatedList = this.data.listData.map(item => { let displayText = ''; if (item.planned) { displayText = '取消'; } else { displayText = "关阀" } let deleteText = "删除" let time; if (!item.dt) { time = "暂无" } else { time = this.extractTime(item.dt) } if (item.waterInstant===null) { item.waterInstant = "暂无" } return { ...item, displayText, deleteText, time }; // 保留所有其他字段,并添加 displayText 字段 }); // 更新列表数据 this.setData({ listData: updatedList }); }, //处理时间去掉年月日 extractTime(datetimeString) { const formattedDate = datetimeString.replace(" ", "T"); const date = new Date(formattedDate); // 获取小时、分钟和秒 const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); const seconds = date.getSeconds().toString().padStart(2, '0'); return `${hours}:${minutes}:${seconds}`; }, // 切换项目 switchProject(e) { const project = e.currentTarget.dataset.project; if (config.setBaseUrl(project)) { this.setData({ selectedProject: project }); // 保存选择到本地存储 try { wx.setStorageSync('selectedProject', project); } catch (e) { console.error('保存项目选择失败:', e); } // 更新全局变量 const app = getApp(); if (app && app.globalData) { app.globalData.selectedProject = project; // 根据项目配置设置相关参数 const projectConfig = PROJECT_CONFIG[project]; if (projectConfig) { app.globalData.tag = projectConfig.tag; if (!projectConfig.needLogin) { app.globalData.operator = projectConfig.operatorId; app.globalData.clientId = projectConfig.operatorId; app.globalData.isLoggedIn = true; app.globalData.sessionId = projectConfig.operatorId; // 如果有vcId,也设置 if (projectConfig.vcId) { app.globalData.vcId = projectConfig.vcId; } } } } // 重新加载页面数据 this.initData(); } else { wx.showToast({ title: '切换项目失败', icon: 'none' }); } }, })