管灌系统农户端微信小程序(嘉峪关应用)
zuoxiao
2025-04-07 5d3ed12a593020ec7fd9b5af50991f68b191e649
pages/home/home.js
@@ -4,7 +4,9 @@
  get,
  post
} = require('../../api/request.js');
const { PROJECT_URLS } = require('../../api/config.js');
const {
  PROJECT_URLS
} = require('../../api/config.js');
Page({
  /**
@@ -17,7 +19,7 @@
    waterIntakeName: "",
    image: "/images/ic_head_bg.jpg",
    userPhone: "",
    userName: "请登录",
    userName: "请点击登录",
    scrollViewHeight: 0,
    listData: [],
    isRefreshing: false,
@@ -32,13 +34,23 @@
    lastIntakeName: "",
    showProjectDialog: false,
    selectedProject: '',
    avatarTapCount: 0
    avatarTapCount: 0,
    isFromLogin: false,
    showTipDialog: ''
  },
  openValve: function (e) {
    wx.navigateTo({
      url: '/pages/waterIntake/waterIntake',
    })
    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) => {
@@ -49,15 +61,22 @@
    }).exec();
  },
  startPullDownRefresh() {
    if (!this.data.isWXRefreshing) {
      var self = this;
      console.log(this.data.isRefreshing);
      this.setData({
        isRefreshing: true
      });
      this.getOpenList();
    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'
      })
    }
  },
  //获取用户数据
@@ -79,95 +98,225 @@
   * 生命周期函数--监听页面加载
   */
  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);
      // 出错时也显示项目选择弹窗
    console.log('home页面onLoad开始,参数:', options);
    //当开阀成功后调用刷新
    if (options.param === "1" || options.param === "2") {
      this.setData({
        showProjectDialog: true
        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);
  },
  // 新增的初始化页面辅助函数,分离出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 baseUrl = PROJECT_URLS[project];
          getApp().globalData.baseUrl = baseUrl;
          getApp().globalData.selectedProject = project;
          // 根据项目设置对应的tag
          if (project === 'JYG') {
            getApp().globalData.tag = 'ym'; // 嘉峪关项目对应tag为ym
            this.setData({
              userName: "嘉峪关项目"
            });
          } else if (project === 'MQ') {
            getApp().globalData.tag = 'mq'; // 民勤项目对应tag为mq
            this.setData({
              userName: "民勤项目"
            });
            // 加载民勤项目持久化参数
            return storage.getItemSafe('MQ_params')
              .then(params => {
                if (params) {
                  getApp().globalData.operator = params.operator;
                  getApp().globalData.clientId = params.clientId;
                  getApp().globalData.isLoggedIn = params.isLoggedIn;
                  getApp().globalData.sessionId = params.sessionId;
                }
                return Promise.resolve();
              });
          } else if (project === 'TEST') {
            getApp().globalData.tag = 'ym'; // 测试项目对应tag为test
            this.setData({
              userName: "测试项目"
            });
            // 加载测试项目持久化参数
            return storage.getItemSafe('TEST_params')
              .then(params => {
                if (params) {
                  getApp().globalData.operator = params.operator;
                  getApp().globalData.clientId = params.clientId;
                  getApp().globalData.isLoggedIn = params.isLoggedIn;
                  getApp().globalData.sessionId = params.sessionId;
                  getApp().globalData.vcId = params.vcId;
                }
                return Promise.resolve();
              });
          }
          // 继续初始化页面
          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 || getApp().globalData.isLoggedIn) {
          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;
    }
    // 再次检查全局登录状态
    if (getApp().globalData.isLoggedIn) {
      console.log('检测到全局登录状态,不进行登录检查');
      return;
    }
    console.log('执行登录状态检查');
    this.checkLoginStatus();
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
    // 页面隐藏时考虑清理临时标记
    this.cleanupTempMarkers();
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
    // 页面卸载时清理临时标记
    this.cleanupTempMarkers();
  },
  /**
@@ -222,6 +371,39 @@
      icon: 'none'
    })
  },
  //解绑用户
  unbind() {
    if (getApp().globalData.isLoggedIn) {
      wx.showModal({
        title: '解绑确认',
        content: '确定要解绑当前账号吗?',
        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);
@@ -261,7 +443,7 @@
      rtuAddr: rtuAddr,
      vcNum: vcNum, //虚拟卡ID
      orderNo: orderNo,
      operator: app.globalData.operator //操作员
      operator: app.globalData.clientId //操作员
    };
    console.log("postCloseValaue" + data);
    post({
@@ -298,29 +480,93 @@
   */
  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.operator
        operator: app.globalData.clientId
      }
    };
    get(params).then(data => {
      console.log('获取列表数据成功:', data);
      this.setData({
        listData: data.content,
        isRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成
        isWXRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成
      })
      });
      // 成功获取数据后刷新UI高度
      setTimeout(() => {
        this.calculateScrollViewHeight();
      }, 200);
    }).catch(err => {
      console.error('获取列表数据失败:', err);
      // 错误回调
      this.setData({
        isRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成
        isWXRefreshing: false, // 将triggered属性设置为false,表示下拉刷新已完成
      })
      wx.showToast({
        title: err.msg,
        icon: 'error',
        duration: 3000
      })
      });
      // 检查错误类型
      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
        });
      }
    });
  },
  /**
@@ -335,26 +581,65 @@
  },
  //根据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 => {
      // 错误回调
      wx.showToast({
        title: err.msg,
        icon: 'error',
        duration: 3000
      })
    })
      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) {
@@ -421,7 +706,7 @@
    const data = {
      intakeName: intakeName, //取水口ID
      // vcId: vcId, //虚拟卡ID
      operator: app.globalData.operator, //操作员
      operator: app.globalData.clientId, //操作员
      forceOpen: !!isforce // 使用逻辑非操作符 !! 来确保 isForce 是布尔值  
    };
    post({
@@ -468,32 +753,118 @@
  //进入界面获取界面数据
  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;
    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;
    }
    // 尝试获取用户数据和已开阀记录
    try {
      // 优先检查全局变量中是否有sessionId
      if (app.globalData.sessionId) {
        console.log('initData: 使用全局sessionId获取数据');
        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');
        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);
              }
            }
            // 无论如何都尝试获取用户信息和开阀列表
            this.getUserDataBySession();
            this.getOpenList();
          })
          .catch((err) => {
            console.error('加载userData失败:', err);
            // 再次检查是否从登录页返回
            if (this.getFromLogin()) {
              console.log('initData:catch: 检测到从登录页返回的标记,只获取开阀列表');
              this.getOpenList();
            } else {
              this.getUserDataBySession();
              this.getOpenList();
            }
          });
      } else {
        console.log('未找到userData,直接获取数据');
        // 再次检查是否从登录页返回
        if (this.getFromLogin()) {
          console.log('initData:else: 检测到从登录页返回的标记,只获取开阀列表');
          this.getOpenList();
        } else {
          this.getUserDataBySession();
          this.getOpenList();
        }
      }
    } catch (e) {
      console.error('initData执行出错:', e);
      // 再次检查是否从登录页返回
      if (this.getFromLogin()) {
        console.log('initData:error: 检测到从登录页返回的标记,只获取开阀列表');
        this.getOpenList();
      } else {
        // 出错时仍尝试获取数据
        this.getUserDataBySession();
        this.getOpenList();
      }
    }
  },
  // 处理头像点击
  handleAvatarTap() {
    this.setData({
      avatarTapCount: this.data.avatarTapCount + 1
    });
    if (this.data.avatarTapCount >= 5) {
      this.setData({
        showProjectDialog: true,
@@ -508,7 +879,9 @@
    if (!e.detail.visible && !this.data.selectedProject) {
      return;
    }
    this.setData({ showProjectDialog: e.detail.visible });
    this.setData({
      showProjectDialog: e.detail.visible
    });
  },
  // 处理项目选择变化
@@ -528,164 +901,520 @@
      });
      return;
    }
    const projectName = this.data.selectedProject === 'JYG' ? '嘉峪关项目' : '民勤项目';
    // 获取当前已选项目和新选择的项目
    const currentProject = getApp().globalData.selectedProject;
    const newProject = this.data.selectedProject;
    const projectName = newProject === 'JYG' ? '嘉峪关项目' :
      newProject === 'MQ' ? '民勤项目' :
      newProject === 'TEST' ? '测试项目' : '未知项目';
    // 检查是否切换了项目(如果当前项目不同于新选择的项目)
    const isProjectChanged = currentProject && currentProject !== newProject;
    // 如果切换了项目,先清除登录状态
    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', this.data.selectedProject).then(() => {
    storage.setItem('selectedProject', newProject).then(() => {
      // 更新 BASEURL
      const { PROJECT_URLS } = require('../../api/config.js');
      const baseUrl = PROJECT_URLS[this.data.selectedProject];
      // 直接修改全局变量
      const {
        PROJECT_URLS
      } = require('../../api/config.js');
      const baseUrl = PROJECT_URLS[newProject];
      // 更新全局变量
      getApp().globalData = getApp().globalData || {};
      getApp().globalData.baseUrl = baseUrl;
      getApp().globalData.selectedProject = this.data.selectedProject;
      // 根据项目设置对应的tag
      if (this.data.selectedProject === 'JYG') {
      getApp().globalData.selectedProject = newProject;
      // 根据项目设置对应的tag和clientId
      if (newProject === 'JYG') {
        getApp().globalData.tag = 'ym'; // 嘉峪关项目对应tag为ym
      } else if (this.data.selectedProject === 'MQ') {
        this.setData({
          userName: "嘉峪关项目"
        });
      } else if (newProject === 'MQ') {
        getApp().globalData.tag = 'mq'; // 民勤项目对应tag为mq
        getApp().globalData.operator = '2025033115305200006';
        getApp().globalData.clientId = '2025033115305200006';
        getApp().globalData.isLoggedIn = true;
        getApp().globalData.sessionId = '2025033115305200006';
        this.setData({
          userName: "民勤项目"
        });
        // 持久化存储民勤项目参数
        storage.setItem('MQ_params', {
          operator: '2025033115305200006',
          clientId: '2025033115305200006',
          isLoggedIn: true,
          sessionId: '2025033115305200006'
        });
      } else if (newProject === 'TEST') {
        getApp().globalData.tag = 'ym'; // 测试项目对应tag为test
        getApp().globalData.operator = '2025032411245000006';
        getApp().globalData.clientId = '2025032411245000006';
        getApp().globalData.isLoggedIn = true;
        getApp().globalData.sessionId = '2025032411245000006';
        getApp().globalData.vcId = '2024122617295800009';
        this.setData({
          userName: "测试项目"
        });
        // 持久化存储测试项目参数
        storage.setItem('TEST_params', {
          operator: '2025032411245000006',
          clientId: '2025032411245000006',
          isLoggedIn: true,
          sessionId: '2025032411245000006',
          vcId: '2024122617295800009'
        });
      }
      console.log('已切换到项目:', projectName, '域名:', baseUrl, 'tag:', getApp().globalData.tag);
      this.setData({
        showProjectDialog: false
      });
      // 显示切换成功提示
      wx.showToast({
        title: `已选择${projectName}`,
        icon: 'success',
        duration: 2000
      });
      setTimeout(() => {
        console.log('项目已切换,正在初始化数据');
        this.initData();
      }, 1000);
      // 检查登录状态
      // setTimeout(() => {
      //   this.checkLoginStatus();
      // }, 500);
    }).catch(err => {
      console.error('保存项目选择失败:', err);
      wx.showToast({
        title: '保存失败,请重试',
        icon: 'success',
        icon: 'none',
        duration: 2000
      });
    });
  },
  // 检查登录状态
  checkLoginStatus() {
    const app = getApp();
    // 检查是否已登录
    if (app.globalData.isLoggedIn && app.globalData.sessionId) {
      // 已登录,重新加载页面
      wx.reLaunch({
        url: '/pages/home/home'
      console.log('已从全局变量检测到登录状态');
      return;
    }
    // 检查本页面是否正在处理返回逻辑
    const fromLogin = this.getFromLogin();
    if (fromLogin) {
      console.log('从登录页返回,不再重定向');
      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
      });
    } else {
      // 尝试从本地存储获取用户信息
      storage.getItem('userInfo').then(userInfoStr => {
        if (userInfoStr) {
      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;
          }
          console.log('确认需要跳转到登录页');
          // 跳转前再次检查登录页面临时标记
          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.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)
          // });
        }
        // 未登录,跳转到登录页面
        wx.redirectTo({
          url: `/pages/login/login?project=${this.data.selectedProject}`
      })
      .catch(err => {
        console.error('检查登录状态时出错:', err);
        // 标记当前页面正在处理返回逻辑
        this.setData({
          isFromLogin: true
        });
      }).catch(err => {
        console.error('获取用户信息失败:', err);
        // 未登录,跳转到登录页面
        wx.redirectTo({
          url: `/pages/login/login?project=${this.data.selectedProject}`
        });
        // 再次检查是否已从登录页返回
        if (this.getFromLogin()) {
          console.log('错误处理: 已从登录页返回,不再跳转');
          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;
    }
    // 判断本地是否保存sessionId
    // 使用 wx.nextTick 等待页面渲染完成
    wx.nextTick(() => {
      this.calculateScrollViewHeight();
    });
    // 当开阀成功后调用刷新
    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(){
    if(!getApp().globalData.isLoggedIn){
      const that = this;
  // 微信登录
  wxLogin() {
    if (!getApp().globalData.isLoggedIn) {
      wx.showLoading({
        title: '正在登录请稍候...',
        mask: true
      });
      wx.login({
        success: function (res) {
        success: (res) => {
          if (res.code) {
            var code = res.code;
            console.log(code);
            // 将code发送到服务器获取openid
            that.codeLogin(code);
            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 tag = this.data.selectedProject === 'JYG' ? 'ym' : 'mq';
                  getApp().globalData.tag = tag;
                  // 保存到存储
                  storage.setItem("sessionId", sessionId);
                  storage.setItem("clientId", clientId);
                  storage.setItem("isLoggedIn", "true");
                  // 保存userData信息,包含sessionId和tag
                  const userData = JSON.stringify({
                    sessionId: sessionId,
                    tag: tag,
                    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:', tag);
                      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'
          });
        }
      });
    }
  },
  //微信code登录
  codeLogin(codeData) {
  // 辅助函数:清理临时标记
  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: '正在登录请稍候...', // 加载提示文字
      title: '正在解绑请稍候...', // 加载提示文字
      mask: true // 是否显示透明蒙层,防止触摸穿透,默认为 false
    });
    const data = {
      code: codeData, //临时登录凭证
      sessionId: getApp().globalData.sessionId //取水口ID
    };
    post({
      url: "wx/client/code_login",
      url: 'wx/client/unbind',
      data: data,
      useParams: true
    }).then(response => {
      // 处理成功响应
      console.log('请求成功:', response);
      // 加载完成后隐藏加载动画
      wx.hideLoading();
      if (response.code === "0001") {
        //假如为空则跳转到绑定界面
        if (response.content.client.clientId === "") {
          wx.navigateTo({
            url: '/pages/login/login'
          })
        } else {
          //缓存在本地
      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({
            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 {
        wx.showToast({
          title: 'title',
          icon: 'error',
          duration: 2000
            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) {
        // 分享失败的回调函数
      }
    };
  }
})