|  |  | 
 |  |  | const app = getApp(); | 
 |  |  | const { | 
 |  |  |   get, | 
 |  |  |   post | 
 |  |  | } = require('../../api/request'); | 
 |  |  | const dayjs = require('dayjs'); | 
 |  |  |  | 
 |  |  | Page({ | 
 |  |  |   /** | 
 |  |  | 
 |  |  |     startTime: '', // 灌溉开始时间 | 
 |  |  |     pickerValue: '', // 时间选择器的值 | 
 |  |  |     timePickerVisible: false, // 时间选择器是否可见 | 
 |  |  |      | 
 |  |  |     // 项目和轮灌组数据 | 
 |  |  |     projectList: [ | 
 |  |  |       { | 
 |  |  |         id: '1', | 
 |  |  |         name: '项目一', | 
 |  |  |         expanded: false, // 是否展开 | 
 |  |  |         totalDuration: 0, // 总时长 | 
 |  |  |         groups: [ | 
 |  |  |           { id: '1-1', name: '轮灌组1', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       }, | 
 |  |  |       { | 
 |  |  |         id: '2', | 
 |  |  |         name: '项目二', | 
 |  |  |         expanded: false, | 
 |  |  |         totalDuration: 0, | 
 |  |  |         groups: [ | 
 |  |  |           { id: '2-1', name: '轮灌组A', selected: false, duration: 0 }, | 
 |  |  |           { id: '2-2', name: '轮灌组B', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       }, | 
 |  |  |       { | 
 |  |  |         id: '4', | 
 |  |  |         name: '项目一', | 
 |  |  |         expanded: false, // 是否展开 | 
 |  |  |         totalDuration: 0, // 总时长 | 
 |  |  |         groups: [ | 
 |  |  |           { id: '1-1', name: '轮灌组1', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       }, | 
 |  |  |       { | 
 |  |  |         id: '5', | 
 |  |  |         name: '项目一', | 
 |  |  |         expanded: false, // 是否展开 | 
 |  |  |         totalDuration: 0, // 总时长 | 
 |  |  |         groups: [ | 
 |  |  |           { id: '1-1', name: '轮灌组1', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       }, | 
 |  |  |       { | 
 |  |  |         id: '6', | 
 |  |  |         name: '项目一', | 
 |  |  |         expanded: false, // 是否展开 | 
 |  |  |         totalDuration: 0, // 总时长 | 
 |  |  |         groups: [ | 
 |  |  |           { id: '1-1', name: '轮灌组1', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       }, | 
 |  |  |       { | 
 |  |  |         id: '7', | 
 |  |  |         name: '项目一', | 
 |  |  |         expanded: false, // 是否展开 | 
 |  |  |         totalDuration: 0, // 总时长 | 
 |  |  |         groups: [ | 
 |  |  |           { id: '1-1', name: '轮灌组1', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       }, | 
 |  |  |       { | 
 |  |  |         id: '8', | 
 |  |  |         name: '项目8', | 
 |  |  |         expanded: false, // 是否展开 | 
 |  |  |         totalDuration: 0, // 总时长 | 
 |  |  |         groups: [ | 
 |  |  |           { id: '1-1', name: '轮灌组1', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-2', name: '轮灌组2', selected: false, duration: 0 }, | 
 |  |  |           { id: '1-3', name: '轮灌组3', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       }, | 
 |  |  |       { | 
 |  |  |         id: '3', | 
 |  |  |         name: '项目3', | 
 |  |  |         expanded: false, | 
 |  |  |         totalDuration: 0, | 
 |  |  |         groups: [ | 
 |  |  |           { id: '3-1', name: '轮灌组X', selected: false, duration: 0 }, | 
 |  |  |           { id: '3-2', name: '轮灌组Y', selected: false, duration: 0 }, | 
 |  |  |           { id: '3-3', name: '轮灌组Z', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       }, | 
 |  |  |       { | 
 |  |  |         id: '9', | 
 |  |  |         name: '项目9', | 
 |  |  |         expanded: false, | 
 |  |  |         totalDuration: 0, | 
 |  |  |         groups: [ | 
 |  |  |           { id: '3-1', name: '轮灌组X', selected: false, duration: 0 }, | 
 |  |  |           { id: '3-2', name: '轮灌组Y', selected: false, duration: 0 }, | 
 |  |  |           { id: '3-3', name: '轮灌组Z', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       } | 
 |  |  |       , | 
 |  |  |       { | 
 |  |  |         id: '10', | 
 |  |  |         name: '项目10', | 
 |  |  |         expanded: false, | 
 |  |  |         totalDuration: 0, | 
 |  |  |         groups: [ | 
 |  |  |           { id: '3-1', name: '轮灌组X', selected: false, duration: 0 }, | 
 |  |  |           { id: '3-2', name: '轮灌组Y', selected: false, duration: 0 }, | 
 |  |  |           { id: '3-3', name: '轮灌组Z', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       } | 
 |  |  |       , | 
 |  |  |       { | 
 |  |  |         id: '11', | 
 |  |  |         name: '项目11', | 
 |  |  |         expanded: false, | 
 |  |  |         totalDuration: 0, | 
 |  |  |         groups: [ | 
 |  |  |           { id: '3-1', name: '轮灌组X', selected: false, duration: 0 }, | 
 |  |  |           { id: '3-2', name: '轮灌组Y', selected: false, duration: 0 }, | 
 |  |  |           { id: '3-3', name: '轮灌组Z', selected: false, duration: 0 } | 
 |  |  |         ] | 
 |  |  |       } | 
 |  |  |     ] | 
 |  |  |     timeInfoVisible: false, // 时间提示弹窗是否可见 | 
 |  |  |     // 项目选择器相关 | 
 |  |  |     projectPickerVisible: false, | 
 |  |  |     projectPickerValue: [], | 
 |  |  |     selectedProject: null, | 
 |  |  |     projectOptions: [], | 
 |  |  |     totalDuration: 0, // 添加总灌溉时间 | 
 |  |  |     // 项目列表 | 
 |  |  |     projectList: [], | 
 |  |  |     // 时间选择器选项 | 
 |  |  |     timeOptions: [], | 
 |  |  |     // 轮灌组列表刷新状态 | 
 |  |  |     isRefreshing: false | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 生命周期函数--监听页面加载 | 
 |  |  |    */ | 
 |  |  |   onLoad: function (options) { | 
 |  |  |     // 页面加载时可以从API获取项目和轮灌组数据 | 
 |  |  |     // this.fetchProjectsAndGroups(); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 获取项目和轮灌组数据 | 
 |  |  |    */ | 
 |  |  |   fetchProjectsAndGroups: function () { | 
 |  |  |     // 这里可以添加API请求逻辑,获取真实数据 | 
 |  |  |     // wx.request({ | 
 |  |  |     //   url: 'your-api-url', | 
 |  |  |     //   success: (res) => { | 
 |  |  |     //     this.setData({ | 
 |  |  |     //       projectList: res.data | 
 |  |  |     //     }); | 
 |  |  |     //   } | 
 |  |  |     // }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 处理计划编号输入 | 
 |  |  |    */ | 
 |  |  |   onPlanCodeInput: function (e) { | 
 |  |  |     // 生成计划编号 | 
 |  |  |     this.generatePlanCode(); | 
 |  |  |     // 设置时间选择器的初始值 | 
 |  |  |     const now = dayjs(); | 
 |  |  |     this.setData({ | 
 |  |  |       planCode: e.detail.value | 
 |  |  |       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 | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 获取项目列表 | 
 |  |  |    */ | 
 |  |  |   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); | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 获取轮灌组列表 | 
 |  |  |    */ | 
 |  |  |   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); | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  | 
 |  |  |    * 显示时间选择器 | 
 |  |  |    */ | 
 |  |  |   showTimePicker: function () { | 
 |  |  |     // 如果没有选择时间,使用当前时间 | 
 |  |  |     if (!this.data.pickerValue) { | 
 |  |  |       const now = dayjs(); | 
 |  |  |       this.setData({ | 
 |  |  |         pickerValue: now.format('YYYY-MM-DD HH:mm') | 
 |  |  |       }); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     this.setData({ | 
 |  |  |       timePickerVisible: true | 
 |  |  |     }); | 
 |  |  | 
 |  |  |    * 时间选择器确认回调 | 
 |  |  |    */ | 
 |  |  |   onTimePickerConfirm: function (e) { | 
 |  |  |     const { | 
 |  |  |       value | 
 |  |  |     } = e.detail; | 
 |  |  |     this.setData({ | 
 |  |  |       startTime: e.detail.formatValue, | 
 |  |  |       pickerValue: e.detail.value, | 
 |  |  |       timePickerVisible: false | 
 |  |  |       timePickerVisible: false, | 
 |  |  |       startTime: value | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  | 
 |  |  |   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 { | 
 |  |  | 
 |  |  |         expanded: false | 
 |  |  |       }; | 
 |  |  |     }); | 
 |  |  |      | 
 |  |  |  | 
 |  |  |     // 如果当前点击的项目已经是展开状态,则保持所有项目折叠 | 
 |  |  |     // 否则,将当前点击的项目设为展开状态 | 
 |  |  |     if (!currentValue) { | 
 |  |  |       newProjectList[index].expanded = true; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |  | 
 |  |  |     this.setData({ | 
 |  |  |       projectList: newProjectList | 
 |  |  |     }); | 
 |  |  | 
 |  |  |     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); | 
 |  |  |   }, | 
 |  |  | 
 |  |  |    * 处理时长输入 | 
 |  |  |    */ | 
 |  |  |   onDurationInput: function (e) { | 
 |  |  |     const projectIndex = e.currentTarget.dataset.projectIndex; | 
 |  |  |     const groupIndex = e.currentTarget.dataset.groupIndex; | 
 |  |  |     const value = parseInt(e.detail.value) || 0; | 
 |  |  |      | 
 |  |  |     // 更新轮灌组时长 | 
 |  |  |     const durationKey = `projectList[${projectIndex}].groups[${groupIndex}].duration`; | 
 |  |  |     const { | 
 |  |  |       groupIndex | 
 |  |  |     } = e.currentTarget.dataset; | 
 |  |  |     const duration = parseInt(e.detail.value) || 0; | 
 |  |  |  | 
 |  |  |     const selectedProject = { | 
 |  |  |       ...this.data.selectedProject | 
 |  |  |     }; | 
 |  |  |     selectedProject.groups[groupIndex].duration = duration; | 
 |  |  |  | 
 |  |  |     this.setData({ | 
 |  |  |       [durationKey]: value | 
 |  |  |       selectedProject | 
 |  |  |     }, () => { | 
 |  |  |       // 输入时长后重新计算总时间 | 
 |  |  |       this.calculateTotalDuration(); | 
 |  |  |     }); | 
 |  |  |      | 
 |  |  |     // 自动选中该轮灌组 | 
 |  |  |     const selectedKey = `projectList[${projectIndex}].groups[${groupIndex}].selected`; | 
 |  |  |     if (value > 0 && !this.data.projectList[projectIndex].groups[groupIndex].selected) { | 
 |  |  |       this.setData({ | 
 |  |  |         [selectedKey]: true | 
 |  |  |       }); | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     // 计算并更新项目总时长 | 
 |  |  |     this.updateProjectTotalDuration(projectIndex); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  | 
 |  |  |   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({ | 
 |  |  | 
 |  |  |    * 阻止事件冒泡 | 
 |  |  |    */ | 
 |  |  |   stopPropagation: function (e) { | 
 |  |  |     // 阻止事件冒泡,防止点击输入框时触发父元素的点击事件 | 
 |  |  |     if (e && e.stopPropagation) { | 
 |  |  |       e.stopPropagation(); | 
 |  |  |     } | 
 |  |  |     return false; | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 跳转到轮灌组详情页 | 
 |  |  |    */ | 
 |  |  |   navigateToGroupDetail: function (e) { | 
 |  |  |     const projectIndex = e.currentTarget.dataset.projectIndex; | 
 |  |  |     const groupIndex = e.currentTarget.dataset.groupIndex; | 
 |  |  |     const project = this.data.projectList[projectIndex]; | 
 |  |  |     const group = project.groups[groupIndex]; | 
 |  |  |     const { groupIndex } = e.currentTarget.dataset; | 
 |  |  |     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?projectId=${project.id}&projectName=${project.name}&groupId=${group.id}&groupName=${group.name}` | 
 |  |  |       url: `/pages/groupDetail/groupDetail?${queryString}` | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  | 
 |  |  |    * 确认按钮点击事件 | 
 |  |  |    */ | 
 |  |  |   onConfirm: function () { | 
 |  |  |     // 验证表单 | 
 |  |  |     if (!this.validateForm()) { | 
 |  |  |       return; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     // 收集选中的轮灌组 | 
 |  |  |     const selectedGroups = this.getSelectedGroups(); | 
 |  |  |      | 
 |  |  |     // 构建提交数据 | 
 |  |  |     const formData = { | 
 |  |  |       planCode: this.data.planCode, | 
 |  |  |       startTime: this.data.startTime, | 
 |  |  |       groups: selectedGroups | 
 |  |  |     }; | 
 |  |  |      | 
 |  |  |     // 提交数据 | 
 |  |  |     this.submitForm(formData); | 
 |  |  |   }, | 
 |  |  |     const { | 
 |  |  |       planCode, | 
 |  |  |       startTime, | 
 |  |  |       selectedProject | 
 |  |  |     } = this.data; | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 验证表单 | 
 |  |  |    */ | 
 |  |  |   validateForm: function () { | 
 |  |  |     if (!this.data.planCode) { | 
 |  |  |     if (!planCode) { | 
 |  |  |       wx.showToast({ | 
 |  |  |         title: '请输入计划编号', | 
 |  |  |         icon: 'none' | 
 |  |  |       }); | 
 |  |  |       return false; | 
 |  |  |       return; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     if (!this.data.startTime) { | 
 |  |  |       wx.showToast({ | 
 |  |  |         title: '请选择灌溉开始时间', | 
 |  |  |         icon: 'none' | 
 |  |  |       }); | 
 |  |  |       return false; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     const selectedGroups = this.getSelectedGroups(); | 
 |  |  |     if (selectedGroups.length === 0) { | 
 |  |  |       wx.showToast({ | 
 |  |  |         title: '请至少选择一个轮灌组', | 
 |  |  |         icon: 'none' | 
 |  |  |       }); | 
 |  |  |       return false; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     // 检查选中的轮灌组是否都设置了时长 | 
 |  |  |     const invalidGroups = selectedGroups.filter(group => !group.duration); | 
 |  |  |     if (invalidGroups.length > 0) { | 
 |  |  |       wx.showToast({ | 
 |  |  |         title: '请为所有选中的轮灌组设置时长', | 
 |  |  |         icon: 'none' | 
 |  |  |       }); | 
 |  |  |       return false; | 
 |  |  |     } | 
 |  |  |      | 
 |  |  |     return true; | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 获取选中的轮灌组 | 
 |  |  |    */ | 
 |  |  |   getSelectedGroups: function () { | 
 |  |  |     const selectedGroups = []; | 
 |  |  |      | 
 |  |  |     this.data.projectList.forEach(project => { | 
 |  |  |       project.groups.forEach(group => { | 
 |  |  |         if (group.selected) { | 
 |  |  |           selectedGroups.push({ | 
 |  |  |             projectId: project.id, | 
 |  |  |             projectName: project.name, | 
 |  |  |             groupId: group.id, | 
 |  |  |             groupName: group.name, | 
 |  |  |             duration: group.duration | 
 |  |  |     if (!selectedProject) { | 
 |  |  |       wx.showToast({ | 
 |  |  |         title: '请选择项目', | 
 |  |  |         icon: 'none' | 
 |  |  |       }); | 
 |  |  |       return; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 构建上报数据 | 
 |  |  |     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' | 
 |  |  |       }); | 
 |  |  |     }); | 
 |  |  |      | 
 |  |  |     return selectedGroups; | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   // 显示项目选择器 | 
 |  |  |   showProjectPicker() { | 
 |  |  |     this.fetchProjects(true) | 
 |  |  |  | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   // 项目选择器确认 | 
 |  |  |   onProjectPickerConfirm(e) { | 
 |  |  |     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 | 
 |  |  |     }, () => { | 
 |  |  |       // 选择项目后获取轮灌组列表 | 
 |  |  |       if (selectedProject) { | 
 |  |  |         this.fetchGroups(selectedProject.id); | 
 |  |  |       } | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   // 项目选择器取消 | 
 |  |  |   onProjectPickerCancel() { | 
 |  |  |     this.setData({ | 
 |  |  |       projectPickerVisible: false | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 提交表单数据 | 
 |  |  |    * 计算总灌溉时间 | 
 |  |  |    */ | 
 |  |  |   submitForm: function (formData) { | 
 |  |  |     // 这里可以添加API请求逻辑,提交表单数据 | 
 |  |  |     console.log('提交的表单数据:', formData); | 
 |  |  |      | 
 |  |  |     // 模拟API请求 | 
 |  |  |     wx.showLoading({ | 
 |  |  |       title: '提交中...', | 
 |  |  |   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 | 
 |  |  |     }); | 
 |  |  |      | 
 |  |  |     setTimeout(() => { | 
 |  |  |       wx.hideLoading(); | 
 |  |  |        | 
 |  |  |       wx.showToast({ | 
 |  |  |         title: '创建成功', | 
 |  |  |         icon: 'success', | 
 |  |  |         duration: 2000, | 
 |  |  |         success: () => { | 
 |  |  |           // 延迟返回上一页 | 
 |  |  |           setTimeout(() => { | 
 |  |  |             wx.navigateBack(); | 
 |  |  |           }, 2000); | 
 |  |  |         } | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 轮灌组列表下拉刷新 | 
 |  |  |    */ | 
 |  |  |   onGroupListRefresh: function () { | 
 |  |  |     if (!this.data.selectedProject) { | 
 |  |  |       this.setData({ | 
 |  |  |         isRefreshing: false | 
 |  |  |       }); | 
 |  |  |     }, 1500); | 
 |  |  |      | 
 |  |  |     // 实际API请求示例 | 
 |  |  |     // wx.request({ | 
 |  |  |     //   url: 'your-api-url', | 
 |  |  |     //   method: 'POST', | 
 |  |  |     //   data: formData, | 
 |  |  |     //   success: (res) => { | 
 |  |  |     //     wx.showToast({ | 
 |  |  |     //       title: '创建成功', | 
 |  |  |     //       icon: 'success', | 
 |  |  |     //       duration: 2000, | 
 |  |  |     //       success: () => { | 
 |  |  |     //         setTimeout(() => { | 
 |  |  |     //           wx.navigateBack(); | 
 |  |  |     //         }, 2000); | 
 |  |  |     //       } | 
 |  |  |     //     }); | 
 |  |  |     //   }, | 
 |  |  |     //   fail: (err) => { | 
 |  |  |     //     wx.showToast({ | 
 |  |  |     //       title: '创建失败,请重试', | 
 |  |  |     //       icon: 'none' | 
 |  |  |     //     }); | 
 |  |  |     //   } | 
 |  |  |     // }); | 
 |  |  |   } | 
 |  |  | });  | 
 |  |  |       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 | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  | }); |