package com.dy.pipIrrWechat.irrigatePlan; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.pojoIr.*; import com.dy.pipIrrGlobal.voIr.VoIrrigateSchedule; import com.dy.pipIrrGlobal.voIr.VoPlanSimple; import com.dy.pipIrrWechat.command.CommandSv; import com.dy.pipIrrWechat.command.dto.AutomaticClose; import com.dy.pipIrrWechat.irrigatePlan.dto.IrrigatePlan; import com.dy.pipIrrWechat.irrigatePlan.dto.IrrigateSchedule; import com.dy.pipIrrWechat.irrigatePlan.dto.PlanSimple; import com.dy.pipIrrWechat.irrigatePlan.enums.OperateTypeENUM; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; import java.util.List; import java.util.Objects; /** * @author ZhuBaoMin * @date 2025-02-20 15:27 * @LastEditTime 2025-02-20 15:27 * @Description */ @Slf4j @RestController @RequestMapping(path = "plan") @RequiredArgsConstructor public class IrrigatePlanCtrl { private final IrrigatePlanSv irrigatePlanSv; private final CommandSv commandSv; /** * 创建灌溉计划 * 1. 添加灌溉计划 * 2. 添加灌溉次序 * 3. 添加灌溉计划操作记录 * @param planAndSchedule * @param bindingResult * @return */ @PostMapping(path = "createPlan", consumes = MediaType.APPLICATION_JSON_VALUE) @Transactional(rollbackFor = Exception.class) public BaseResponse createPlan(@RequestBody @Valid IrrigatePlan planAndSchedule, BindingResult bindingResult){ if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } Long operatorId = planAndSchedule.getOperatorId(); Byte startupMode = planAndSchedule.getStartupMode(); Date planStartTime = planAndSchedule.getPlanStartTime();; Date planStopTime = null; Integer duration = 0; for(IrrigateSchedule schedule : planAndSchedule.getSchedules()){ duration = duration + schedule.getDuration(); } //if(startupMode == 1){ // planStartTime = new Date(); //} //LocalDateTime startTime = planStartTime.toInstant().atZone(ZoneId.systemDefault()) .toLocalDateTime(); //startTime = startTime.plusMinutes(5); //planStartTime = Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()); //LocalDateTime stopTime = startTime.plusMinutes(duration); //planStopTime = Date.from(stopTime.atZone(ZoneId.systemDefault()).toInstant()); IrIrrigatePlan plan = new IrIrrigatePlan(); plan.setPlanName(planAndSchedule.getPlanName()); plan.setStartupMode(startupMode); plan.setPlanStartTime(planStartTime); //plan.setPlanStopTime(planStopTime); plan.setDuration(duration); plan.setPlanState((byte)1); plan.setExecutingState((byte)1); plan.setDeleted(0L); Long planId = irrigatePlanSv.addIrrigatePlan(plan); if(planId == null) { return BaseResponseUtils.buildErrorMsg("创建灌溉计划失败"); } // 添加灌溉次序及计划次序关联表 //Date scheduleStartTime = null; Integer sort = 0; for(IrrigateSchedule schedule : planAndSchedule.getSchedules()){ IrIrrigateSchedule po = new IrIrrigateSchedule(); po.setGroupId(schedule.getGroupId()); //if(scheduleStartTime == null) { // scheduleStartTime = planStartTime; //} //po.setStartTime(scheduleStartTime); //// 计算下一组的开始时间 //LocalDateTime LocalscheduleStartTime = scheduleStartTime.toInstant().atZone(ZoneId.systemDefault()) .toLocalDateTime(); //LocalscheduleStartTime = LocalscheduleStartTime.plusMinutes(schedule.getDuration()); //scheduleStartTime = Date.from(LocalscheduleStartTime.atZone(ZoneId.systemDefault()).toInstant()); po.setDuration(schedule.getDuration()); po.setCurrentState((byte)1); Long scheduleId = irrigatePlanSv.addIrrigateSchedule(po); if(scheduleId == null) { return BaseResponseUtils.buildErrorMsg("创建灌溉计划失败"); } IrPlanSchedule planSchedule = new IrPlanSchedule(); planSchedule.setPlanId(planId); planSchedule.setScheduleId(scheduleId); planSchedule.setSort(sort++); Long planScheduleId = irrigatePlanSv.addPlanSchedule(planSchedule); if(planScheduleId == null) { return BaseResponseUtils.buildErrorMsg("创建灌溉计划失败"); } } // 添加灌溉计划操作记录 IrPlanOperate planOperate = new IrPlanOperate(); planOperate.setPlanId(planId); planOperate.setOperator(operatorId); planOperate.setOperateType(OperateTypeENUM.CREATE.getCode()); planOperate.setOperateTime(new Date()); if(irrigatePlanSv.addPlanOperate(planOperate) == 0){ return BaseResponseUtils.buildErrorMsg("添加灌溉计划操作记录失败"); } return BaseResponseUtils.buildSuccess(); } /** * 发布灌溉计划 * 1. 修改灌溉计划状态为发布状态 * 2. 添加灌溉计划操作记录 * 3. 生成开阀计划 * @param planSimple * @param bindingResult * @return */ @PostMapping(path = "publishPlan", consumes = MediaType.APPLICATION_JSON_VALUE) @Transactional(rollbackFor = Exception.class) public BaseResponse publishPlan(@RequestBody @Valid PlanSimple planSimple, BindingResult bindingResult){ if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } Long planId = planSimple.getPlanId(); Long operatorId = planSimple.getOperatorId(); /** * 获取灌溉计划信息 * 更新灌溉计划起止时间及计划状态 */ VoPlanSimple plan = irrigatePlanSv.getPlanSimple(planId); if(plan == null){ return BaseResponseUtils.buildErrorMsg("您要发布的计划不存在,或该计划已发布"); } Byte startupMode = plan.getStartupMode(); Integer duration = plan.getDuration(); Date planStartTime = plan.getPlanStartTime(); Date planStopTime = null; if(startupMode == 1){ planStartTime = new Date(); } LocalDateTime startTime = planStartTime.toInstant().atZone(ZoneId.systemDefault()) .toLocalDateTime(); startTime = startTime.plusMinutes(5); planStartTime = Date.from(startTime.atZone(ZoneId.systemDefault()).toInstant()); LocalDateTime stopTime = startTime.plusMinutes(duration); planStopTime = Date.from(stopTime.atZone(ZoneId.systemDefault()).toInstant()); if(irrigatePlanSv.updatePlanTimes(planStartTime, planStopTime, planId) == 0) { return BaseResponseUtils.buildErrorMsg("计划信息更新失败"); } // 更新每个灌溉次序的开始时间 List schedules = irrigatePlanSv.getSchedulesByPlanId(planId); Date scheduleStartTime = null; Integer sort = 0; for(VoIrrigateSchedule schedule : schedules){ if(scheduleStartTime == null) { scheduleStartTime = planStartTime; } irrigatePlanSv.updateScheduleStartTime(schedule.getScheduleId(), scheduleStartTime); // 计算下一组的开始时间 LocalDateTime LocalscheduleStartTime = scheduleStartTime.toInstant().atZone(ZoneId.systemDefault()) .toLocalDateTime(); LocalscheduleStartTime = LocalscheduleStartTime.plusMinutes(schedule.getDuration()); scheduleStartTime = Date.from(LocalscheduleStartTime.atZone(ZoneId.systemDefault()).toInstant()); } // 添加灌溉计划操作记录 IrPlanOperate planOperate = new IrPlanOperate(); planOperate.setPlanId(planId); planOperate.setOperator(operatorId); planOperate.setOperateType(OperateTypeENUM.PUBLISH.getCode()); planOperate.setOperateTime(new Date()); if(irrigatePlanSv.addPlanOperate(planOperate) == 0){ return BaseResponseUtils.buildErrorMsg("添加灌溉计划操作记录失败"); } schedules = irrigatePlanSv.getSchedulesByPlanId(planId); for(VoIrrigateSchedule schedule : schedules) { Long groupId = schedule.getGroupId(); List intakeIds = irrigatePlanSv.getIntakeIdsByGroupId(groupId); for(Long intakeId : intakeIds) { AutomaticClose automaticClose = new AutomaticClose(); automaticClose.setIntakeId(intakeId); automaticClose.setPlannedOpenTime(schedule.getStartTime()); automaticClose.setMinutes(schedule.getDuration()); automaticClose.setOperator(operatorId); automaticClose.setOpenType(Byte.valueOf("1")); commandSv.planedOpenTimedClose(automaticClose, schedule.getStartTime(), schedule.getDuration()); } } return BaseResponseUtils.buildSuccess(); } /** * 获取灌溉计划列表 * @param vo * @return */ //@GetMapping(path = "/getIrrigatePlans") //public BaseResponse>> getIrrigatePlans(QoIrrigatePlan vo) { // try { // QueryResultVo> res = irrigatePlanSv.getIrrigatePlans(vo); // return BaseResponseUtils.buildSuccess(res); // } catch (Exception e) { // log.error("获取轮灌组记录异常", e); // return BaseResponseUtils.buildException(e.getMessage()); // } //} }