// pages/home/home.js const storage = require('../../utils/storage.js'); const { get, post } = require('../../api/request.js'); const { PROJECT_URLS } = require('../../api/config.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 }, openValve: function (e) { wx.navigateTo({ url: '/pages/waterIntake/waterIntake', }) }, 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 (!this.data.isWXRefreshing) { var self = this; console.log(this.data.isRefreshing); this.setData({ isRefreshing: true }); this.getOpenList(); } }, //获取用户数据 getUserData() { get('/items') .then((data) => { this.setData({ items: data }); }) .catch((error) => { console.error('Failed to fetch data:', error); }); }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { // 检查是否已选择项目 const { PROJECT_URLS } = require('../../api/config.js'); storage.getItem('selectedProject').then((project) => { if (project) { this.setData({ selectedProject: project }); // 确保全局变量存在 getApp().globalData = getApp().globalData || {}; // 设置 baseUrl const baseUrl = PROJECT_URLS[project]; getApp().globalData.baseUrl = baseUrl; getApp().globalData.selectedProject = project; // 根据项目设置对应的tag if (project === 'JYG') { getApp().globalData.tag = 'ym'; // 嘉峪关项目对应tag为ym } else if (project === 'MQ') { getApp().globalData.tag = 'mq'; // 民勤项目对应tag为mq } console.log('加载已保存的项目:', project, '域名:', baseUrl, 'tag:', getApp().globalData.tag); // 检查登录状态 if (!getApp().globalData.isLoggedIn) { this.checkLoginStatus(); return; // 如果未登录,等待跳转到登录页面 } } else { // 首次进入,显示项目选择弹窗 this.setData({ showProjectDialog: true }); return; // 等待用户选择项目 } //判断本地是否保存sessionId // 使用 wx.nextTick 等待页面渲染完成 wx.nextTick(() => { this.calculateScrollViewHeight(); }); //当开阀成功后调用刷新 console.log("onLoad:" + options.param); if (options.param) { wx.showToast({ title: '开阀成功', icon: 'success', duration: 3000 }) this.getOpenList(); } this.initData(); }).catch(err => { console.error('Failed to get selectedProject:', err); // 出错时也显示项目选择弹窗 this.setData({ showProjectDialog: true }); }); }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady() { }, /** * 生命周期函数--监听页面显示 */ onShow() { }, /** * 生命周期函数--监听页面隐藏 */ onHide() { }, /** * 生命周期函数--监听页面卸载 */ onUnload() { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ 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() { // wx.navigateTo({ // url: '/pages/valveList/valveList', // }) wx.showToast({ title: '暂未开放', icon: 'none' }) }, feedBack() { wx.showToast({ title: '暂未开放', icon: 'none' }) }, 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.operator //操作员 }; 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(); this.setData({ showErrorDialog: true, errorData: error.msg, errorDialogTitle: "关阀错误" }) // 处理错误响应 console.error('请求失败:', error); }); }, /** * 获取为关阀记录 */ getOpenList() { const app = getApp(); const params = { url: 'wx/valve/get', data: { operator: app.globalData.operator } }; get(params).then(data => { this.setData({ listData: data.content, isRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 isWXRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 }) }).catch(err => { // 错误回调 this.setData({ isRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 isWXRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成 }) wx.showToast({ title: err.msg, icon: 'error', 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() { const app = getApp(); const params = { url: 'wx/client/simple_info', data: { sessionId: app.globalData.sessionId } }; get(params).then(data => { this.setData({ userName: data.content.clientName, userPhone: this.maskPhoneNumber(data.content.phone) }) }).catch(err => { // 错误回调 wx.showToast({ title: err.msg, icon: 'error', 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.operator, //操作员 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("tag>>>>:" +app.globalData.tag) if (storage.isHasKeySync("userData")) { storage.getItem('userData').then((data) => { let jsonObj = JSON.parse(data); app.globalData.sessionId = jsonObj.sessionId; app.globalData.tag = jsonObj.tag; this.getUserDataBySession(); this.getOpenList(); console.log("userData>>>>>>>" + data) }).catch((err) => { console.error('Failed to load parameter:', err); }); } else { this.getUserDataBySession(); this.getOpenList(); console.log('Failed to load parameter:false'); } }, // 处理头像点击 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() { if (!this.data.selectedProject) { wx.showToast({ title: '请选择项目', icon: 'none' }); return; } const projectName = this.data.selectedProject === 'JYG' ? '嘉峪关项目' : '民勤项目'; // 保存项目选择到本地存储 storage.setItem('selectedProject', this.data.selectedProject).then(() => { // 更新 BASEURL const { PROJECT_URLS } = require('../../api/config.js'); const baseUrl = PROJECT_URLS[this.data.selectedProject]; // 直接修改全局变量 getApp().globalData = getApp().globalData || {}; getApp().globalData.baseUrl = baseUrl; getApp().globalData.selectedProject = this.data.selectedProject; // 根据项目设置对应的tag if (this.data.selectedProject === 'JYG') { getApp().globalData.tag = 'ym'; // 嘉峪关项目对应tag为ym } else if (this.data.selectedProject === 'MQ') { getApp().globalData.tag = 'mq'; // 民勤项目对应tag为mq } console.log('已切换到项目:', projectName, '域名:', baseUrl, 'tag:', getApp().globalData.tag); this.setData({ showProjectDialog: false }); wx.showToast({ title: `已选择${projectName}`, icon: 'success', duration: 2000 }); // 检查登录状态 // setTimeout(() => { // this.checkLoginStatus(); // }, 500); }).catch(err => { console.error('保存项目选择失败:', err); wx.showToast({ title: '保存失败,请重试', icon: 'error', duration: 2000 }); }); }, // 检查登录状态 checkLoginStatus() { const app = getApp(); // 检查是否已登录 if (app.globalData.isLoggedIn && app.globalData.sessionId) { // 已登录,重新加载页面 wx.reLaunch({ url: '/pages/home/home' }); } else { // 尝试从本地存储获取用户信息 storage.getItem('userInfo').then(userInfoStr => { if (userInfoStr) { try { const userInfo = JSON.parse(userInfoStr); // 验证用户信息是否有效 if (userInfo && userInfo.sessionId) { // 恢复登录状态 app.globalData.sessionId = userInfo.sessionId; app.globalData.token = userInfo.token; app.globalData.userInfo = userInfo; app.globalData.isLoggedIn = true; // 已登录,重新加载页面 wx.reLaunch({ url: '/pages/home/home' }); return; } } catch (e) { console.error('解析用户信息失败:', e); } } // 未登录,跳转到登录页面 wx.redirectTo({ url: `/pages/login/login?project=${this.data.selectedProject}` }); }).catch(err => { console.error('获取用户信息失败:', err); // 未登录,跳转到登录页面 wx.redirectTo({ url: `/pages/login/login?project=${this.data.selectedProject}` }); }); } }, wxLogin(){ if(!getApp().globalData.isLoggedIn){ const that = this; wx.login({ success: function (res) { if (res.code) { var code = res.code; console.log(code); // 将code发送到服务器获取openid that.codeLogin(code); } else { console.log('登录失败!' + res.errMsg); } } }); } }, //微信code登录 codeLogin(codeData) { wx.showLoading({ title: '正在登录请稍候...', // 加载提示文字 mask: true // 是否显示透明蒙层,防止触摸穿透,默认为 false }); const data = { code: codeData, //临时登录凭证 }; post({ url: "wx/client/code_login", data: data, }).then(response => { // 处理成功响应 console.log('请求成功:', response); // 加载完成后隐藏加载动画 wx.hideLoading(); if (response.code === "0001") { //假如为空则跳转到绑定界面 if (response.content.client.clientId === "") { wx.navigateTo({ url: '/pages/login/login' }) } else { //缓存在本地 this.setData({ isLogin: true }) getApp().globalData.sessionId = response.content.client.sessionId storage.setItem("sessionId", response.content.client.sessionId) getApp().globalData.clientId = response.content.client.clientId storage.setItem("clientId", response.content.client.clientId) this.initData(); } } else { } }).catch(error => { // 加载完成后隐藏加载动画 wx.hideLoading(); // 处理错误响应 console.error('请求失败:', error); }); }, })