|  |  | 
 |  |  | const app = getApp(); | 
 |  |  | const { get, post } = require('../../api/request'); | 
 |  |  | const { | 
 |  |  |   get, | 
 |  |  |   post | 
 |  |  | } = require('../../api/request'); | 
 |  |  | const dayjs = require('dayjs'); | 
 |  |  |  | 
 |  |  | Page({ | 
 |  |  |     /** | 
 |  |  |      * 页面的初始数据 | 
 |  |  |      */ | 
 |  |  |     data: { | 
 |  |  |         // 表单数据 | 
 |  |  |         planCode: '', // 计划编号 | 
 |  |  |         startTime: '', // 灌溉开始时间 | 
 |  |  |         pickerValue: '', // 时间选择器的值 | 
 |  |  |         timePickerVisible: false, // 时间选择器是否可见 | 
 |  |  |         timeInfoVisible: false, // 时间提示弹窗是否可见 | 
 |  |  |         // 项目选择器相关 | 
 |  |  |         projectPickerVisible: false, | 
 |  |  |         projectPickerValue: [], | 
 |  |  |         selectedProject: null, | 
 |  |  |         projectOptions: [], | 
 |  |  |         totalDuration: 0, // 添加总灌溉时间 | 
 |  |  |         // 项目列表 | 
 |  |  |         projectList: [], | 
 |  |  |         // 时间选择器选项 | 
 |  |  |         timeOptions: [], | 
 |  |  |         // 轮灌组列表刷新状态 | 
 |  |  |         isRefreshing: false | 
 |  |  |     }, | 
 |  |  |   /** | 
 |  |  |    * 页面的初始数据 | 
 |  |  |    */ | 
 |  |  |   data: { | 
 |  |  |     // 表单数据 | 
 |  |  |     planCode: '', // 计划编号 | 
 |  |  |     startTime: '', // 灌溉开始时间 | 
 |  |  |     pickerValue: '', // 时间选择器的值 | 
 |  |  |     timePickerVisible: false, // 时间选择器是否可见 | 
 |  |  |     timeInfoVisible: false, // 时间提示弹窗是否可见 | 
 |  |  |     // 项目选择器相关 | 
 |  |  |     projectPickerVisible: false, | 
 |  |  |     projectPickerValue: [], | 
 |  |  |     selectedProject: null, | 
 |  |  |     projectOptions: [], | 
 |  |  |     totalDuration: 0, // 添加总灌溉时间 | 
 |  |  |     // 项目列表 | 
 |  |  |     projectList: [], | 
 |  |  |     // 时间选择器选项 | 
 |  |  |     timeOptions: [], | 
 |  |  |     // 轮灌组列表刷新状态 | 
 |  |  |     isRefreshing: false | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 生命周期函数--监听页面加载 | 
 |  |  |      */ | 
 |  |  |     onLoad: function (options) { | 
 |  |  |         // 生成计划编号 | 
 |  |  |         this.generatePlanCode(); | 
 |  |  |         // 设置时间选择器的初始值 | 
 |  |  |         const now = dayjs(); | 
 |  |  |         this.setData({ | 
 |  |  |             pickerValue: now.add(8.5, 'hour').format('YYYY-MM-DD HH:mm') | 
 |  |  |         }); | 
 |  |  |         // 获取项目列表 | 
 |  |  |         this.fetchProjects(); | 
 |  |  |     }, | 
 |  |  |   /** | 
 |  |  |    * 生命周期函数--监听页面加载 | 
 |  |  |    */ | 
 |  |  |   onLoad: function (options) { | 
 |  |  |     // 生成计划编号 | 
 |  |  |     this.generatePlanCode(); | 
 |  |  |     // 设置时间选择器的初始值 | 
 |  |  |     const now = dayjs(); | 
 |  |  |     this.setData({ | 
 |  |  |       pickerValue: now.add(8.5, 'hour').format('YYYY-MM-DD HH:mm') | 
 |  |  |     }); | 
 |  |  |     // 获取项目列表 | 
 |  |  |     this.fetchProjects(); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 生成计划编号 | 
 |  |  |      */ | 
 |  |  |     generatePlanCode: function () { | 
 |  |  |         const now = dayjs(); | 
 |  |  |         const dateStr = now.format('YYYYMMDD'); | 
 |  |  |         const randomNum = Math.floor(Math.random() * 10000).toString().padStart(4, '0'); | 
 |  |  |         const planCode = `${dateStr}${randomNum}`; | 
 |  |  |         this.setData({ planCode }); | 
 |  |  |     }, | 
 |  |  |   /** | 
 |  |  |    * 生成计划编号 | 
 |  |  |    */ | 
 |  |  |   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 () { | 
 |  |  |         return get({ | 
 |  |  |             url: '/wx/irrigation/getSimpleProjects', | 
 |  |  |             isShowLoding: true | 
 |  |  |         }).then(res => { | 
 |  |  |             if (res.success) { | 
 |  |  |                 const projectList = res.content.obj.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 | 
 |  |  |                 }); | 
 |  |  |             } 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.obj); | 
 |  |  |  | 
 |  |  |                 // 更新选中项目的轮灌组信息 | 
 |  |  |                 const projectList = this.data.projectList.map(project => { | 
 |  |  |                     if (project.id === projectId) { | 
 |  |  |                         return { | 
 |  |  |                             ...project, | 
 |  |  |                             groups: res.content.obj.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({ | 
 |  |  |             timePickerVisible: false, | 
 |  |  |             startTime: value | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 时间选择器取消回调 | 
 |  |  |      */ | 
 |  |  |     onTimePickerCancel: function () { | 
 |  |  |         this.setData({ | 
 |  |  |             timePickerVisible: false | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 切换项目展开/折叠状态 | 
 |  |  |      */ | 
 |  |  |     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 { | 
 |  |  |                 ...item, | 
 |  |  |                 expanded: false | 
 |  |  |             }; | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  |         // 如果当前点击的项目已经是展开状态,则保持所有项目折叠 | 
 |  |  |         // 否则,将当前点击的项目设为展开状态 | 
 |  |  |         if (!currentValue) { | 
 |  |  |             newProjectList[index].expanded = true; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         this.setData({ | 
 |  |  |             projectList: newProjectList | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 切换轮灌组选中状态 | 
 |  |  |      */ | 
 |  |  |     toggleGroupSelection: function (e) { | 
 |  |  |         const projectIndex = e.currentTarget.dataset.projectIndex; | 
 |  |  |         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 { groupIndex } = e.currentTarget.dataset; | 
 |  |  |         const duration = parseInt(e.detail.value) || 0; | 
 |  |  |  | 
 |  |  |         const selectedProject = { ...this.data.selectedProject }; | 
 |  |  |         selectedProject.groups[groupIndex].duration = duration; | 
 |  |  |  | 
 |  |  |         this.setData({ | 
 |  |  |             selectedProject | 
 |  |  |         }, () => { | 
 |  |  |             // 输入时长后重新计算总时间 | 
 |  |  |             this.calculateTotalDuration(); | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 计算并更新项目总时长 | 
 |  |  |      */ | 
 |  |  |     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({ | 
 |  |  |             [totalDurationKey]: totalDuration | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 阻止事件冒泡 | 
 |  |  |      */ | 
 |  |  |     stopPropagation: function (e) { | 
 |  |  |         if (e && e.stopPropagation) { | 
 |  |  |             e.stopPropagation(); | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 跳转到轮灌组详情页 | 
 |  |  |      */ | 
 |  |  |     navigateToGroupDetail: function (e) { | 
 |  |  |         const { groupIndex } = e.currentTarget.dataset; | 
 |  |  |         // TODO: 实现跳转逻辑 | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 确认按钮点击事件 | 
 |  |  |      */ | 
 |  |  |     onConfirm: function () { | 
 |  |  |         const { planCode, startTime, selectedProject } = this.data; | 
 |  |  |  | 
 |  |  |         if (!planCode) { | 
 |  |  |             wx.showToast({ | 
 |  |  |                 title: '请输入计划编号', | 
 |  |  |                 icon: 'none' | 
 |  |  |             }); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if (!selectedProject) { | 
 |  |  |             wx.showToast({ | 
 |  |  |                 title: '请选择项目', | 
 |  |  |                 icon: 'none' | 
 |  |  |             }); | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 构建上报数据 | 
 |  |  |         const schedules = selectedProject.groups.map(group => ({ | 
 |  |  |             groupId: group.id, | 
 |  |  |             duration: parseInt(group.duration) || 0 | 
 |  |  |   /** | 
 |  |  |    * 获取项目列表 | 
 |  |  |    */ | 
 |  |  |   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 requestData = { | 
 |  |  |             projectId: selectedProject.id, | 
 |  |  |             planName: planCode, | 
 |  |  |             startupMode: startTime ? 2 : 1, | 
 |  |  |             operatorId: app.globalData.clientId, | 
 |  |  |             schedules: schedules | 
 |  |  |         }; | 
 |  |  |         const projectOptions = projectList.map(project => ({ | 
 |  |  |           label: project.name, | 
 |  |  |           value: project.id | 
 |  |  |         })); | 
 |  |  |  | 
 |  |  |         // 如果有开始时间,添加到请求数据中 | 
 |  |  |         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(() => { | 
 |  |  |                     wx.navigateBack(); | 
 |  |  |                 }, 1500); | 
 |  |  |             } else { | 
 |  |  |                 wx.showToast({ | 
 |  |  |                     title: res.msg || '创建失败', | 
 |  |  |                     icon: 'none' | 
 |  |  |                 }); | 
 |  |  |             } | 
 |  |  |         }).catch(err => { | 
 |  |  |             console.error('创建计划失败:', err); | 
 |  |  |             wx.showToast({ | 
 |  |  |                 title: '创建失败', | 
 |  |  |                 icon: 'none' | 
 |  |  |             }); | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     // 显示项目选择器 | 
 |  |  |     showProjectPicker() { | 
 |  |  |         this.setData({ | 
 |  |  |           projectList, | 
 |  |  |           projectOptions | 
 |  |  |         }); | 
 |  |  |         if (isShowDiaolog) { | 
 |  |  |           this.setData({ | 
 |  |  |             projectPickerVisible: 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 | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 计算总灌溉时间 | 
 |  |  |      */ | 
 |  |  |     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 | 
 |  |  |       } 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); | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 关闭时间提示弹窗 | 
 |  |  |      */ | 
 |  |  |     onTimeInfoConfirm: function () { | 
 |  |  |         this.setData({ | 
 |  |  |             timeInfoVisible: false | 
 |  |  |   /** | 
 |  |  |    * 获取轮灌组列表 | 
 |  |  |    */ | 
 |  |  |   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({ | 
 |  |  |       timePickerVisible: false, | 
 |  |  |       startTime: value | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 时间选择器取消回调 | 
 |  |  |    */ | 
 |  |  |   onTimePickerCancel: function () { | 
 |  |  |     this.setData({ | 
 |  |  |       timePickerVisible: false | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 切换项目展开/折叠状态 | 
 |  |  |    */ | 
 |  |  |   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 { | 
 |  |  |         ...item, | 
 |  |  |         expanded: false | 
 |  |  |       }; | 
 |  |  |     }); | 
 |  |  |  | 
 |  |  |     // 如果当前点击的项目已经是展开状态,则保持所有项目折叠 | 
 |  |  |     // 否则,将当前点击的项目设为展开状态 | 
 |  |  |     if (!currentValue) { | 
 |  |  |       newProjectList[index].expanded = true; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     this.setData({ | 
 |  |  |       projectList: newProjectList | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 切换轮灌组选中状态 | 
 |  |  |    */ | 
 |  |  |   toggleGroupSelection: function (e) { | 
 |  |  |     const projectIndex = e.currentTarget.dataset.projectIndex; | 
 |  |  |     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 { | 
 |  |  |       groupIndex | 
 |  |  |     } = e.currentTarget.dataset; | 
 |  |  |     const duration = parseInt(e.detail.value) || 0; | 
 |  |  |  | 
 |  |  |     const selectedProject = { | 
 |  |  |       ...this.data.selectedProject | 
 |  |  |     }; | 
 |  |  |     selectedProject.groups[groupIndex].duration = duration; | 
 |  |  |  | 
 |  |  |     this.setData({ | 
 |  |  |       selectedProject | 
 |  |  |     }, () => { | 
 |  |  |       // 输入时长后重新计算总时间 | 
 |  |  |       this.calculateTotalDuration(); | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 计算并更新项目总时长 | 
 |  |  |    */ | 
 |  |  |   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({ | 
 |  |  |       [totalDurationKey]: totalDuration | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 阻止事件冒泡 | 
 |  |  |    */ | 
 |  |  |   stopPropagation: function (e) { | 
 |  |  |     if (e && e.stopPropagation) { | 
 |  |  |       e.stopPropagation(); | 
 |  |  |     } | 
 |  |  |     return false; | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 跳转到轮灌组详情页 | 
 |  |  |    */ | 
 |  |  |   navigateToGroupDetail: function (e) { | 
 |  |  |     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?${queryString}` | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 确认按钮点击事件 | 
 |  |  |    */ | 
 |  |  |   onConfirm: function () { | 
 |  |  |     const { | 
 |  |  |       planCode, | 
 |  |  |       startTime, | 
 |  |  |       selectedProject | 
 |  |  |     } = this.data; | 
 |  |  |  | 
 |  |  |     if (!planCode) { | 
 |  |  |       wx.showToast({ | 
 |  |  |         title: '请输入计划编号', | 
 |  |  |         icon: 'none' | 
 |  |  |       }); | 
 |  |  |       return; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     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' | 
 |  |  |       }); | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   // 显示项目选择器 | 
 |  |  |   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 | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |  | 
 |  |  |   /** | 
 |  |  |    * 计算总灌溉时间 | 
 |  |  |    */ | 
 |  |  |   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 | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  | }); |