| | |
| | | // 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", |
| | | userCode: "张三", |
| | | userName: "1005535", |
| | | userBalance: "100.5元", |
| | | userPhone: "", |
| | | userName: "请登录", |
| | | scrollViewHeight: 0, |
| | | listData: [{ |
| | | name: '取水口 1', |
| | | code: '1055201' |
| | | }, |
| | | { |
| | | name: '取水口 2', |
| | | code: '1055201' |
| | | }, |
| | | { |
| | | name: '取水口 3', |
| | | code: '1055201' |
| | | }, |
| | | { |
| | | name: '取水口 3', |
| | | code: '1055201' |
| | | }, |
| | | { |
| | | name: '取水口 3', |
| | | code: '1055201' |
| | | } |
| | | ] |
| | | listData: [], |
| | | isRefreshing: false, |
| | | isWXRefreshing: false, |
| | | errorData: '', //错误内容 |
| | | showErrorDialog: false, |
| | | confirmBtn: { |
| | | content: '确认' |
| | | }, |
| | | errorDialogTitle: "关阀错误", |
| | | showForceConfirm: false, //是否强制开阀 |
| | | lastIntakeName: "", |
| | | showProjectDialog: false, |
| | | selectedProject: '', |
| | | avatarTapCount: 0 |
| | | }, |
| | | |
| | | rechageTap:function (e) { |
| | | wx.navigateTo({ |
| | | url: '/pages/recharge/recharge', |
| | | }) |
| | | openValve: function (e) { |
| | | wx.navigateTo({ |
| | | url: '/pages/waterIntake/waterIntake', |
| | | }) |
| | | }, |
| | | calculateScrollViewHeight: function () { |
| | | wx.createSelectorQuery().selectAll('.list-item').boundingClientRect((rects) => { |
| | |
| | | }); |
| | | }).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) { |
| | | // 使用 wx.nextTick 等待页面渲染完成 |
| | | wx.nextTick(() => { |
| | | this.calculateScrollViewHeight(); |
| | | }); |
| | | // 检查是否已选择项目 |
| | | 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 |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | |
| | | * 页面相关事件处理函数--监听用户下拉动作 |
| | | */ |
| | | onPullDownRefresh() { |
| | | |
| | | // 下拉刷新触发的逻辑,可以是请求数据等操作 |
| | | // 例如,请求数据后更新页面内容 |
| | | console.log(this.data.isRefreshing); |
| | | this.setData({ |
| | | isWXRefreshing: true |
| | | }); |
| | | console.log(this.data.isRefreshing); |
| | | // 数据请求完成后,停止下拉刷新的动画 |
| | | this.getOpenList(); |
| | | }, |
| | | |
| | | /** |
| | |
| | | */ |
| | | 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); |
| | | }); |
| | | }, |
| | | }) |