管灌系统农户端微信小程序(嘉峪关应用)
pages/createIrrigation/createIrrigation.js
@@ -1,4 +1,9 @@
const app = getApp();
const {
  get,
  post
} = require('../../api/request');
const dayjs = require('dayjs');
Page({
  /**
@@ -10,119 +15,152 @@
    startTime: '', // 灌溉开始时间
    pickerValue: '', // 时间选择器的值
    timePickerVisible: false, // 时间选择器是否可见
    timeInfoVisible: false, // 时间提示弹窗是否可见
    // 项目选择器相关
    projectPickerVisible: false,
    projectPickerValue: [],
    selectedProject: null,
    projectOptions: [],
    totalDuration: 0, // 添加总灌溉时间
    // 测试数据
    projectList: [
      {
        id: 1,
        name: '测试项目一',
        groups: [
          {
            id: 101,
            name: '轮灌组A',
            duration: 30,
            selected: false
          },
          {
            id: 102,
            name: '轮灌组B',
            duration: 45,
            selected: false
          },
          {
            id: 103,
            name: '轮灌组C',
            duration: 60,
            selected: false
          }
        ]
      },
      {
        id: 2,
        name: '测试项目二',
        groups: [
          {
            id: 201,
            name: '轮灌组1',
            duration: 40,
            selected: false
          },
          {
            id: 202,
            name: '轮灌组2',
            duration: 50,
            selected: false
          }
        ]
      },
      {
        id: 3,
        name: '测试项目三',
        groups: [
          {
            id: 301,
            name: '东区轮灌组',
            duration: 35,
            selected: false
          },
          {
            id: 302,
            name: '西区轮灌组',
            duration: 55,
            selected: false
          },
          {
            id: 303,
            name: '南区轮灌组',
            duration: 25,
            selected: false
          }
        ]
      }
    ]
    // 项目列表
    projectList: [],
    // 时间选择器选项
    timeOptions: [],
    // 轮灌组列表刷新状态
    isRefreshing: false
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // 初始化项目选择器选项
    const projectOptions = this.data.projectList.map(project => ({
      label: project.name,
      value: project.id
    }));
    // 生成计划编号
    this.generatePlanCode();
    // 设置时间选择器的初始值
    const now = dayjs();
    this.setData({
      projectOptions: projectOptions // 直接使用一维数组,不需要包装成二维数组
      pickerValue: now.add(8.5, 'hour').format('YYYY-MM-DD HH:mm')
    });
    // 获取项目列表
    this.fetchProjects();
  },
  /**
   * 生成计划编号
   */
  generatePlanCode: function () {
    const now = dayjs();
    const dateStr = now.format('YYYY-MM-DD');
    const randomNum = Math.floor(Math.random() * 10000).toString().padStart(4, '0');
    const planCode = `${dateStr}${-randomNum}`;
    this.setData({
      planCode
    });
  },
  /**
   * 获取项目和轮灌组数据
   * 获取项目列表
   */
  fetchProjectsAndGroups: function () {
    // 这里可以添加API请求逻辑,获取真实数据
    // wx.request({
    //   url: 'your-api-url',
    //   success: (res) => {
    //     this.setData({
    //       projectList: res.data
    //     });
    //   }
    // });
  fetchProjects: function (isShowDiaolog) {
    return get({
      url: '/wx/irrigation/getSimpleProjects',
      isShowLoding: true
    }).then(res => {
      if (res.success) {
        const projectList = res.content.map(project => ({
          id: project.projectId,
          name: project.projectName,
          groupCount: project.groupCount,
          groups: []
        }));
        const projectOptions = projectList.map(project => ({
          label: project.name,
          value: project.id
        }));
        this.setData({
          projectList,
          projectOptions
        });
        if (isShowDiaolog) {
          this.setData({
            projectPickerVisible: true
          });
        }
      } else {
        wx.showToast({
          title: res.msg || '获取项目列表失败',
          icon: 'none'
        });
        return Promise.reject(new Error(res.msg || '获取项目列表失败'));
      }
    }).catch(err => {
      console.error('获取项目列表失败:', err);
      wx.showToast({
        title: '获取项目列表失败',
        icon: 'none'
      });
      return Promise.reject(err);
    });
  },
  /**
   * 处理计划编号输入
   * 获取轮灌组列表
   */
  onPlanCodeInput: function (e) {
    this.setData({
      planCode: e.detail.value
  fetchGroups: function (projectId) {
    return get({
      url: '/wx/irrigation/getSimpleGroups',
      data: {
        projectId: projectId,
      },
      isShowLoding: true
    }).then(res => {
      if (res.success) {
        console.log('轮灌组数据:', res.content);
        // 更新选中项目的轮灌组信息
        const projectList = this.data.projectList.map(project => {
          if (project.id === projectId) {
            return {
              ...project,
              groups: res.content.map(group => ({
                id: group.groupId,
                name: group.groupCode,
                duration: group.defaultDuration || 0,
                selected: false,
                intakeCount: group.intakeCount
              }))
            };
          }
          return project;
        });
        // 更新选中的项目
        const selectedProject = projectList.find(project => project.id === projectId);
        console.log('更新后的选中项目:', selectedProject);
        this.setData({
          projectList,
          selectedProject
        }, () => {
          // 计算总时间
          this.calculateTotalDuration();
        });
      } else {
        wx.showToast({
          title: res.msg || '获取轮灌组列表失败',
          icon: 'none'
        });
        return Promise.reject(new Error(res.msg || '获取轮灌组列表失败'));
      }
    }).catch(err => {
      console.error('获取轮灌组列表失败:', err);
      wx.showToast({
        title: '获取轮灌组列表失败',
        icon: 'none'
      });
      return Promise.reject(err);
    });
  },
@@ -130,6 +168,14 @@
   * 显示时间选择器
   */
  showTimePicker: function () {
    // 如果没有选择时间,使用当前时间
    if (!this.data.pickerValue) {
      const now = dayjs();
      this.setData({
        pickerValue: now.format('YYYY-MM-DD HH:mm')
      });
    }
    this.setData({
      timePickerVisible: true
    });
@@ -139,7 +185,9 @@
   * 时间选择器确认回调
   */
  onTimePickerConfirm: function (e) {
    const { value } = e.detail;
    const {
      value
    } = e.detail;
    this.setData({
      timePickerVisible: false,
      startTime: value
@@ -161,7 +209,7 @@
  toggleProject: function (e) {
    const index = e.currentTarget.dataset.index;
    const currentValue = this.data.projectList[index].expanded;
    // 创建新的项目列表,先将所有项目设为折叠状态
    const newProjectList = this.data.projectList.map((item, idx) => {
      return {
@@ -169,13 +217,13 @@
        expanded: false
      };
    });
    // 如果当前点击的项目已经是展开状态,则保持所有项目折叠
    // 否则,将当前点击的项目设为展开状态
    if (!currentValue) {
      newProjectList[index].expanded = true;
    }
    this.setData({
      projectList: newProjectList
    });
@@ -189,11 +237,11 @@
    const groupIndex = e.currentTarget.dataset.groupIndex;
    const key = `projectList[${projectIndex}].groups[${groupIndex}].selected`;
    const currentValue = this.data.projectList[projectIndex].groups[groupIndex].selected;
    this.setData({
      [key]: !currentValue
    });
    // 更新项目总时长
    this.updateProjectTotalDuration(projectIndex);
  },
@@ -202,12 +250,16 @@
   * 处理时长输入
   */
  onDurationInput: function (e) {
    const { groupIndex } = e.currentTarget.dataset;
    const {
      groupIndex
    } = e.currentTarget.dataset;
    const duration = parseInt(e.detail.value) || 0;
    const selectedProject = { ...this.data.selectedProject };
    const selectedProject = {
      ...this.data.selectedProject
    };
    selectedProject.groups[groupIndex].duration = duration;
    this.setData({
      selectedProject
    }, () => {
@@ -222,14 +274,14 @@
  updateProjectTotalDuration: function (projectIndex) {
    const project = this.data.projectList[projectIndex];
    let totalDuration = 0;
    // 计算所有选中的轮灌组的时长总和
    project.groups.forEach(group => {
      if (group.selected) {
        totalDuration += parseInt(group.duration) || 0;
      }
    });
    // 更新项目总时长
    const totalDurationKey = `projectList[${projectIndex}].totalDuration`;
    this.setData({
@@ -240,8 +292,11 @@
  /**
   * 阻止事件冒泡
   */
  stopPropagation: function () {
    // 阻止事件冒泡,防止点击输入框时触发父元素的点击事件
  stopPropagation: function (e) {
    if (e && e.stopPropagation) {
      e.stopPropagation();
    }
    return false;
  },
  /**
@@ -249,15 +304,36 @@
   */
  navigateToGroupDetail: function (e) {
    const { groupIndex } = e.currentTarget.dataset;
    // TODO: 实现跳转逻辑
    const group = this.data.selectedProject.groups[groupIndex];
    // 构建URL参数
    const params = {
      projectName: this.data.selectedProject.name,
      groupName: group.name,
      groupId: group.id
    };
    // 构建URL查询字符串
    const queryString = Object.keys(params)
      .map(key => `${key}=${encodeURIComponent(params[key])}`)
      .join('&');
    // 跳转到轮灌组详情页
    wx.navigateTo({
      url: `/pages/groupDetail/groupDetail?${queryString}`
    });
  },
  /**
   * 确认按钮点击事件
   */
  onConfirm: function () {
    const { planCode, startTime, selectedProject } = this.data;
    const {
      planCode,
      startTime,
      selectedProject
    } = this.data;
    if (!planCode) {
      wx.showToast({
        title: '请输入计划编号',
@@ -265,15 +341,7 @@
      });
      return;
    }
    if (!startTime) {
      wx.showToast({
        title: '请选择灌溉开始时间',
        icon: 'none'
      });
      return;
    }
    if (!selectedProject) {
      wx.showToast({
        title: '请选择项目',
@@ -282,33 +350,86 @@
      return;
    }
    // TODO: 实现确认逻辑
    console.log('提交数据:', {
      planCode,
      startTime,
      project: selectedProject
    // 构建上报数据
    const schedules = selectedProject.groups.map(group => ({
      groupId: group.id,
      duration: parseInt(group.duration) || 0
    }));
    const requestData = {
      projectId: selectedProject.id,
      planName: planCode,
      startupMode: startTime ? 2 : 1,
      operatorId: app.globalData.clientId,
      schedules: schedules
    };
    // 如果有开始时间,添加到请求数据中
    if (startTime) {
      requestData.planStartTime = startTime;
    }
    // 发送请求
    post({
      url: '/wx/plan/createPlan',
      data: requestData,
      isShowLoding: true
    }).then(res => {
      if (res.success) {
        wx.showToast({
          title: '创建成功',
          icon: 'success'
        });
        // 返回上一页,并传递参数指示需要刷新列表并切换到当前计划列表
        setTimeout(() => {
          // 使用全局变量标记需要刷新
          const app = getApp();
          app.globalData.needRefreshIrrigationList = true;
          // 直接返回上一页
          wx.navigateBack({
            delta: 1
          });
        }, 1500);
      } else {
        wx.showToast({
          title: res.msg || '创建失败',
          icon: 'none'
        });
      }
    }).catch(err => {
      console.error('创建计划失败:', err);
      wx.showToast({
        title: '创建失败',
        icon: 'none'
      });
    });
  },
  // 显示项目选择器
  showProjectPicker() {
    this.setData({
      projectPickerVisible: true
    });
    this.fetchProjects(true)
  },
  // 项目选择器确认
  onProjectPickerConfirm(e) {
    const { value } = e.detail;
    const {
      value
    } = e.detail;
    console.log('选择的项目ID:', value[0]); // 添加日志查看数据
    const selectedProject = this.data.projectList.find(project => project.id === value[0]);
    console.log('找到的项目:', selectedProject); // 添加日志查看数据
    this.setData({
      projectPickerVisible: false,
      selectedProject: selectedProject,
      projectPickerValue: value
    }, () => {
      // 选择项目后计算总时间
      this.calculateTotalDuration();
      // 选择项目后获取轮灌组列表
      if (selectedProject) {
        this.fetchGroups(selectedProject.id);
      }
    });
  },
@@ -319,16 +440,64 @@
    });
  },
  // 计算总灌溉时间
  calculateTotalDuration() {
  /**
   * 计算总灌溉时间
   */
  calculateTotalDuration: function () {
    if (!this.data.selectedProject) return;
    const totalDuration = this.data.selectedProject.groups.reduce((sum, group) => {
      return sum + (parseInt(group.duration) || 0);
    }, 0);
    this.setData({
      totalDuration
    });
  },
});
  /**
   * 轮灌组列表下拉刷新
   */
  onGroupListRefresh: function () {
    if (!this.data.selectedProject) {
      this.setData({
        isRefreshing: false
      });
      return;
    }
    this.setData({
      isRefreshing: true
    });
    this.fetchGroups(this.data.selectedProject.id)
      .then(() => {
        this.setData({
          isRefreshing: false
        });
      })
      .catch(() => {
        this.setData({
          isRefreshing: false
        });
      });
  },
  /**
   * 显示时间提示弹窗
   */
  showTimeInfo: function () {
    this.setData({
      timeInfoVisible: true
    });
  },
  /**
   * 关闭时间提示弹窗
   */
  onTimeInfoConfirm: function () {
    this.setData({
      timeInfoVisible: false
    });
  },
});