管灌系统农户端微信小程序(嘉峪关应用)
pages/home/home.js
@@ -39,6 +39,7 @@
    lastIntakeName: "",
    showProjectDialog: false,
    selectedProject: '',
    tempSelectedProject: '', // 添加临时选择变量,用于保存用户在对话框中选择但尚未确认的项目
    avatarTapCount: 0,
    isFromLogin: false,
    showTipDialog: '',
@@ -49,17 +50,45 @@
  openValve: function (e) {
    const app = getApp();
    if (app.globalData.isLoggedIn) {
      wx.navigateTo({
        url: '/pages/waterIntake/waterIntake',
      })
    } else {
      wx.showToast({
        title: '请先登录',
        icon: 'error'
      })
    // 检查当前项目是否需要登录
    const currentProject = app.globalData.selectedProject;
    if (currentProject && PROJECT_CONFIG[currentProject] && PROJECT_CONFIG[currentProject].needLogin) {
      // 需要登录的项目,检查是否已登录
      if (!app.globalData.isLoggedIn) {
        // 未登录,显示提示并阻止操作
        wx.showToast({
          title: '请先登录',
          icon: 'error',
          duration: 2000
        });
        // 获取项目配置
        const projectConfig = PROJECT_CONFIG[currentProject];
        if (projectConfig) {
          // 询问用户是否前往登录
          wx.showModal({
            title: '提示',
            content: '您需要登录后才能使用开阀功能,是否立即登录?',
            confirmText: '前往登录',
            cancelText: '取消',
            success: (res) => {
              if (res.confirm) {
                // 用户点击确认,直接调用wxLogin方法
                this.wxLogin();
              }
            }
          });
        }
        return;
      }
    }
    // 已登录或不需要登录的项目,执行开阀操作
    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);
@@ -319,9 +348,34 @@
      });
    }
    // 尝试获取eventChannel,用于监听登录页面发回的消息
    try {
      const eventChannel = currentPage.getOpenerEventChannel();
      if (eventChannel && eventChannel.on) {
        eventChannel.on('fromLogin', (data) => {
          console.log('onShow: 接收到登录页面返回的消息', data);
          if (data && data.fromLogin) {
            fromLogin = true;
            this.setData({
              isFromLogin: true
            });
            // 登录成功后刷新数据
            console.log('登录成功后刷新数据');
            this.initData();
          }
        });
      }
    } catch (e) {
      console.error('获取eventChannel失败:', e);
    }
    // 初始化处理
    if (fromLogin || this.data.isFromLogin) {
      console.log('onShow: 从登录页返回,不进行登录检查');
      // 如果是从登录页返回,重新加载数据
      this.initData();
    } else {
      console.log('onShow: 正常显示页面');
      // 延迟检查登录状态,确保能正确识别临时标记
@@ -398,16 +452,43 @@
  },
  openValveList() {
    const app = getApp();
    if (app.globalData.isLoggedIn) {
      wx.navigateTo({
        url: '/pages/valveList/valveList',
      })
    } else {
      wx.showToast({
        title: '请先登录',
        icon: 'error'
      })
    // 检查当前项目是否需要登录
    const currentProject = app.globalData.selectedProject;
    if (currentProject && PROJECT_CONFIG[currentProject] && PROJECT_CONFIG[currentProject].needLogin) {
      // 需要登录的项目,检查是否已登录
      if (!app.globalData.isLoggedIn) {
        // 未登录,显示提示并阻止操作
        wx.showToast({
          title: '请先登录',
          icon: 'error',
          duration: 2000
        });
        // 获取项目配置
        const projectConfig = PROJECT_CONFIG[currentProject];
        if (projectConfig) {
          // 询问用户是否前往登录
          wx.showModal({
            title: '提示',
            content: '您需要登录后才能查看开关阀记录,是否立即登录?',
            confirmText: '前往登录',
            cancelText: '取消',
            success: (res) => {
              if (res.confirm) {
                // 用户点击确认,直接调用wxLogin方法
                this.wxLogin();
              }
            }
          });
        }
        return;
      }
    }
    // 已登录或不需要登录的项目,执行查看记录操作
    wx.navigateTo({
      url: '/pages/valveList/valveList',
    })
  },
  feedBack() {
    wx.showToast({
@@ -461,18 +542,45 @@
      });
    }
  },
  //轮灌
  irrigation() {
    if (getApp().globalData.isLoggedIn) {
      wx.navigateTo({
        url: '/pages/irrigation/irrigation',
      })
    } else {
      wx.showToast({
        title: '请先登录',
        icon: 'error'
      })
    const app = getApp();
    // 检查当前项目是否需要登录
    const currentProject = app.globalData.selectedProject;
    if (currentProject && PROJECT_CONFIG[currentProject] && PROJECT_CONFIG[currentProject].needLogin) {
      // 需要登录的项目,检查是否已登录
      if (!app.globalData.isLoggedIn) {
        // 未登录,显示提示并阻止操作
        wx.showToast({
          title: '请先登录',
          icon: 'error',
          duration: 2000
        });
        // 获取项目配置
        const projectConfig = PROJECT_CONFIG[currentProject];
        if (projectConfig) {
          // 询问用户是否前往登录
          wx.showModal({
            title: '提示',
            content: '您需要登录后才能使用轮灌功能,是否立即登录?',
            confirmText: '前往登录',
            cancelText: '取消',
            success: (res) => {
              if (res.confirm) {
                // 用户点击确认,直接调用wxLogin方法
                this.wxLogin();
              }
            }
          });
        }
        return;
      }
    }
    // 已登录或不需要登录的项目,执行轮灌操作
    wx.navigateTo({
      url: '/pages/irrigation/irrigation',
    })
  },
  handleChange(e) {
    const item = e.currentTarget.dataset.item;
@@ -656,12 +764,6 @@
  },
  //根据session获取农户信息
  getUserDataBySession() {
    // 先检查是否从登录页返回
    if (this.getFromLogin()) {
      console.log('getUserDataBySession: 检测到从登录页返回的标记,不执行API请求');
      return;
    }
    const app = getApp();
    // 检查是否有sessionId
@@ -727,6 +829,41 @@
   * 扫码开阀
   */
  scenCode() {
    const app = getApp();
    // 检查当前项目是否需要登录
    const currentProject = app.globalData.selectedProject;
    if (currentProject && PROJECT_CONFIG[currentProject] && PROJECT_CONFIG[currentProject].needLogin) {
      // 需要登录的项目,检查是否已登录
      if (!app.globalData.isLoggedIn) {
        // 未登录,显示提示并阻止扫码
        wx.showToast({
          title: '请先登录',
          icon: 'error',
          duration: 2000
        });
        // 获取项目配置
        const projectConfig = PROJECT_CONFIG[currentProject];
        if (projectConfig) {
          // 询问用户是否前往登录
          wx.showModal({
            title: '提示',
            content: '您需要登录后才能使用扫码开阀功能,是否立即登录?',
            confirmText: '前往登录',
            cancelText: '取消',
            success: (res) => {
              if (res.confirm) {
                // 用户点击确认,直接调用wxLogin方法
                this.wxLogin();
              }
            }
          });
        }
        return;
      }
    }
    // 已登录或不需要登录的项目,执行扫码操作
    const that = this;
    wx.scanCode({
      success(res) {
@@ -825,35 +962,67 @@
    // 首先检查是否从登录页返回
    if (this.getFromLogin()) {
      console.log('initData: 检测到从登录页返回的标记,仅获取基本数据');
      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 {
      // 检查是否有sessionId和clientId,优先使用全局变量
      if (app.globalData.sessionId && app.globalData.clientId) {
        console.log('initData: 全局变量中有登录信息,直接获取用户数据和开阀列表');
        this.getUserDataBySession();
        this.getOpenList();
        return;
      }
      // 如果没有全局变量,尝试从本地存储中恢复
      Promise.all([
        storage.getItemSafe('userData'),
        storage.getItemSafe('sessionId'),
        storage.getItemSafe('clientId')
      ]).then(([userData, sessionId, clientId]) => {
        if (userData) {
          try {
            // 解析userData并设置全局变量
            let jsonObj = JSON.parse(userData);
            app.globalData.sessionId = jsonObj.sessionId;
            app.globalData.clientId = jsonObj.clientId || clientId;
            app.globalData.tag = jsonObj.tag;
            app.globalData.isLoggedIn = true;
            // 直接从userData设置用户信息
            if (jsonObj.clientName && jsonObj.phone) {
              this.setData({
                userName: jsonObj.clientName,
                userPhone: this.maskPhoneNumber(jsonObj.phone)
              });
            } else {
              // 如果userData中没有用户信息,调用接口获取
              this.getUserDataBySession();
            }
            console.log("userData已加载:", userData);
          } catch (e) {
            console.error('userData解析失败:', e);
            if (sessionId && clientId) {
              app.globalData.sessionId = sessionId;
              app.globalData.clientId = clientId;
              app.globalData.isLoggedIn = true;
              this.getUserDataBySession();
            }
          }
        } else if (sessionId && clientId) {
          // 如果没有userData但有session和client ID
          app.globalData.sessionId = sessionId;
          app.globalData.clientId = clientId;
          app.globalData.isLoggedIn = true;
          this.getUserDataBySession();
        }
        // 无论如何都尝试获取开阀列表
        this.getOpenList();
      }).catch(err => {
        console.error('恢复登录状态失败:', err);
        this.getOpenList();
      });
      return;
    }
@@ -984,7 +1153,8 @@
    if (this.data.avatarTapCount >= 5) {
      this.setData({
        showProjectDialog: true,
        avatarTapCount: 0
        avatarTapCount: 0,
        tempSelectedProject: this.data.selectedProject // 初始化临时选择为当前选择
      });
    }
  },
@@ -996,23 +1166,28 @@
      return;
    }
    this.setData({
      showProjectDialog: e.detail.visible
      showProjectDialog: e.detail.visible,
      // 当显示对话框时,初始化临时选择为当前选择
      tempSelectedProject: e.detail.visible ? this.data.selectedProject : ''
    });
  },
  // 处理项目选择变化
  onProjectChange(event) {
    console.log('选择的项目:', event.detail.value);
    // 不立即设置到state,而是存储到临时变量中
    this.setData({
      selectedProject: event.detail.value
      tempSelectedProject: event.detail.value
    });
  },
  // 处理项目选择确认
  handleProjectConfirm() {
    console.log('开始处理项目选择确认', this.data.selectedProject, this.data.projectList);
    // 从临时变量获取选择的项目
    const selectedProject = this.data.tempSelectedProject || this.data.selectedProject;
    console.log('开始处理项目选择确认', selectedProject, this.data.projectList);
    if (!this.data.selectedProject) {
    if (!selectedProject) {
      wx.showToast({
        title: '请选择项目',
        icon: 'none'
@@ -1022,7 +1197,7 @@
    // 获取当前已选项目和新选择的项目
    const currentProject = getApp().globalData.selectedProject;
    const newProject = this.data.selectedProject;
    const newProject = selectedProject;
    console.log('当前项目:', currentProject, '新选择项目:', newProject);
    console.log('PROJECT_CONFIG 内容:', PROJECT_CONFIG);
@@ -1052,11 +1227,19 @@
      cancelText: '取消',
      success: (res) => {
        if (res.confirm) {
          // 用户确认选择后,更新状态并继续处理
          this.setData({
            selectedProject: newProject
          });
          // 用户确认选择,继续处理
          this.processProjectSelection(currentProject, newProject, projectConfig, isProjectChanged);
        } else {
          // 用户取消,不进行任何操作
          console.log('用户取消了项目选择');
          // 恢复之前的选择状态
          this.setData({
            tempSelectedProject: this.data.selectedProject
          });
        }
      }
    });
@@ -1243,7 +1426,7 @@
    }
    // 如果当前已在登录页,不再跳转
    if (currentRoute === 'pages/login/login') {
    if (currentRoute === 'pages/login/login' || currentRoute === 'pages/accountLogin/accountLogin') {
      console.log('当前已在登录页,不再跳转');
      return;
    }
@@ -1298,11 +1481,26 @@
            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)
          // });
          // 根据项目配置的loginType决定跳转到哪个登录页面
          // 此处不做跳转,注释掉原有代码
          // const projectInfo = PROJECT_CONFIG[currentProject];
          // const loginType = projectInfo?.loginType || 'code'; // 默认使用验证码登录
          // if (loginType === 'account') {
          //   // 账号密码登录
          //   wx.navigateTo({
          //     url: `/pages/accountLogin/accountLogin?project=${currentProject}`,
          //     success: () => console.log('成功跳转到账号密码登录页'),
          //     fail: (err) => console.error('跳转到账号密码登录页失败:', err)
          //   });
          // } else {
          //   // 验证码登录
          //   wx.navigateTo({
          //     url: `/pages/login/login?project=${currentProject}`,
          //     success: () => console.log('成功跳转到验证码登录页'),
          //     fail: (err) => console.error('跳转到验证码登录页失败:', err)
          //   });
          // }
        }
      })
      .catch(err => {
@@ -1325,12 +1523,26 @@
          return;
        }
        // 出错时也跳转到登录页
        // wx.navigateTo({
        //   url: `/pages/login/login?project=${this.data.selectedProject}`,
        //   success: () => console.log('错误后成功跳转到登录页'),
        //   fail: (err) => console.error('错误后跳转到登录页失败:', err)
        // });
        // 出错时也跳转到登录页,根据loginType决定跳转目标
        // 此处不做跳转,注释掉原有代码
        // const projectInfo = PROJECT_CONFIG[currentProject];
        // const loginType = projectInfo?.loginType || 'code'; // 默认使用验证码登录
        // if (loginType === 'account') {
        //   // 账号密码登录
        //   wx.navigateTo({
        //     url: `/pages/accountLogin/accountLogin?project=${currentProject}`,
        //     success: () => console.log('错误后成功跳转到账号密码登录页'),
        //     fail: (err) => console.error('错误后跳转到账号密码登录页失败:', err)
        //   });
        // } else {
        //   // 验证码登录
        //   wx.navigateTo({
        //     url: `/pages/login/login?project=${currentProject}`,
        //     success: () => console.log('错误后成功跳转到验证码登录页'),
        //     fail: (err) => console.error('错误后跳转到验证码登录页失败:', err)
        //   });
        // }
      });
  },
@@ -1437,11 +1649,21 @@
              wx.hideLoading();
              if (response.code === "0001") {
                if (response.content.client.clientId === "") {
                  // 未绑定账号,跳转到登录页面并传递当前项目信息
                  // 未绑定账号,根据项目配置的loginType跳转到相应的登录页面
                  const projectInfo = PROJECT_CONFIG[this.data.selectedProject];
                  wx.navigateTo({
                    url: `/pages/login/login?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                  });
                  const loginType = projectInfo?.loginType || 'code'; // 默认使用验证码登录
                  if (loginType === 'account') {
                    // 账号密码登录
                    wx.navigateTo({
                      url: `/pages/accountLogin/accountLogin?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                    });
                  } else {
                    // 验证码登录
                    wx.navigateTo({
                      url: `/pages/login/login?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                    });
                  }
                } else {
                  this.setData({
                    userName: response.content.client.clientName,
@@ -1487,11 +1709,21 @@
                }
              } else if (response.code === "1003") {
                // 未绑定账号,跳转到登录页面并传递当前项目信息
                // 未绑定账号,根据项目配置的loginType跳转到相应的登录页面
                const projectInfo = PROJECT_CONFIG[this.data.selectedProject];
                wx.navigateTo({
                  url: `/pages/login/login?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                });
                const loginType = projectInfo?.loginType || 'code'; // 默认使用验证码登录
                if (loginType === 'account') {
                  // 账号密码登录
                  wx.navigateTo({
                    url: `/pages/accountLogin/accountLogin?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                  });
                } else {
                  // 验证码登录
                  wx.navigateTo({
                    url: `/pages/login/login?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                  });
                }
              } else {
                wx.showToast({
                  title: '登录失败',
@@ -1503,11 +1735,21 @@
              wx.hideLoading();
              console.error('登录请求失败:', error);
              if(error.code==="1003"){
                // 未绑定账号,跳转到登录页面并传递当前项目信息
                // 未绑定账号,根据项目配置的loginType跳转到相应的登录页面
                const projectInfo = PROJECT_CONFIG[this.data.selectedProject];
                wx.navigateTo({
                  url: `/pages/login/login?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                });
                const loginType = projectInfo?.loginType || 'code'; // 默认使用验证码登录
                if (loginType === 'account') {
                  // 账号密码登录
                  wx.navigateTo({
                    url: `/pages/accountLogin/accountLogin?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                  });
                } else {
                  // 验证码登录
                  wx.navigateTo({
                    url: `/pages/login/login?project=${this.data.selectedProject}&projectName=${projectInfo.displayName}`
                  });
                }
              }else{
                wx.showToast({
                  title: '登录失败,请重试',
@@ -1749,49 +1991,65 @@
  },
  // 切换项目
  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;
            }
          }
  switchProject() {
    // 显示二次确认弹窗
    wx.showModal({
      title: '切换项目',
      content: '确定要切换项目吗?切换后需要重新登录。',
      confirmText: '确认切换',
      confirmColor: '#1890FF',
      cancelText: '取消',
      success: (res) => {
        if (res.confirm) {
          // 用户点击确认,显示项目选择弹窗
          this.setData({
            showProjectDialog: true
          });
        }
      }
    });
  },
      // 重新加载页面数据
      this.initData();
  // 添加用户点击头像或用户名登录的处理逻辑
  handleUserTap() {
    const app = getApp();
    // 如果已登录,不需要跳转到登录页面
    if (app.globalData.isLoggedIn) {
      return;
    }
    // 检查当前项目是否需要登录
    const currentProject = app.globalData.selectedProject;
    if (currentProject && PROJECT_CONFIG[currentProject]) {
      const projectConfig = PROJECT_CONFIG[currentProject];
      if (!projectConfig.needLogin) {
        console.log('handleUserTap: 当前项目不需要登录:', currentProject);
        // 不需要登录的项目,显示项目名称
        this.setData({
          userName: projectConfig.displayName
        });
        return;
      }
      // 根据项目配置的loginType决定跳转到哪个登录页面
      const loginType = projectConfig.loginType || 'code'; // 默认使用验证码登录
      if (loginType === 'account') {
        // 账号密码登录
        wx.navigateTo({
          url: `/pages/accountLogin/accountLogin?project=${currentProject}&projectName=${projectConfig.displayName}`
        });
      } else {
        // 验证码登录
        wx.navigateTo({
          url: `/pages/login/login?project=${currentProject}&projectName=${projectConfig.displayName}`
        });
      }
    } else {
      wx.showToast({
        title: '切换项目失败',
        icon: 'none'
      // 如果没有当前项目配置,默认跳转到验证码登录
      wx.navigateTo({
        url: '/pages/login/login'
      });
    }
  },