zhubaomin
2025-04-08 5f54ba90abcc0ccf1b578472eac54fc98056767c
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/irrigatePlan/IrrigatePlanCtrl.java
@@ -6,11 +6,16 @@
import com.dy.pipIrrGlobal.pojoIr.IrIrrigateSchedule;
import com.dy.pipIrrGlobal.pojoIr.IrPlanOperate;
import com.dy.pipIrrGlobal.pojoIr.IrPlanSchedule;
import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
import com.dy.pipIrrGlobal.voIr.VoIrrigateSchedule;
import com.dy.pipIrrGlobal.voIr.VoPlanSimple;
import com.dy.pipIrrGlobal.voIr.VoPlans;
import com.dy.pipIrrGlobal.voIr.VoToTerminateIntakes;
import com.dy.pipIrrGlobal.voRm.VoIntakeVc;
import com.dy.pipIrrWechat.command.CommandSv;
import com.dy.pipIrrWechat.command.dto.AutomaticClose;
import com.dy.pipIrrWechat.command.dto.ValveClose;
import com.dy.pipIrrWechat.command.dto.ValveOpen;
import com.dy.pipIrrWechat.irrigatePlan.dto.IrrigatePlan;
import com.dy.pipIrrWechat.irrigatePlan.dto.IrrigateSchedule;
import com.dy.pipIrrWechat.irrigatePlan.dto.PlanSimple;
@@ -23,8 +28,10 @@
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -60,6 +67,7 @@
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Long projectId = planAndSchedule.getProjectId();
        Long operatorId = planAndSchedule.getOperatorId();
        Byte startupMode = planAndSchedule.getStartupMode();
        Date planStartTime = planAndSchedule.getPlanStartTime();;
@@ -68,6 +76,20 @@
        Integer duration = 0;
        for(IrrigateSchedule schedule : planAndSchedule.getSchedules()){
            duration = duration + schedule.getDuration();
        }
        if(startupMode == 2){
            if(planStartTime == null) {
                return BaseResponseUtils.buildErrorMsg("自动启动模式必须指定计划启动时间");
            }
            LocalDateTime startTime = planStartTime.toInstant().atZone(ZoneId.systemDefault()) .toLocalDateTime();
            LocalDateTime currentTime = LocalDateTime.now();
            currentTime = currentTime.plusHours(8);
            if(!startTime.isAfter(currentTime)) {
                return BaseResponseUtils.buildErrorMsg("启动时间不能在8小时之内");
            }
        }
        //if(startupMode == 1){
@@ -80,6 +102,7 @@
        //planStopTime = Date.from(stopTime.atZone(ZoneId.systemDefault()).toInstant());
        IrIrrigatePlan plan = new IrIrrigatePlan();
        plan.setProjectId(projectId);
        plan.setPlanName(planAndSchedule.getPlanName());
        plan.setStartupMode(startupMode);
        plan.setPlanStartTime(planStartTime);
@@ -96,7 +119,7 @@
        // 添加灌溉次序及计划次序关联表
        //Date scheduleStartTime = null;
        Integer sort = 0;
        Integer sort = 1;
        for(IrrigateSchedule schedule : planAndSchedule.getSchedules()){
            IrIrrigateSchedule po = new IrIrrigateSchedule();
            po.setGroupId(schedule.getGroupId());
@@ -189,6 +212,7 @@
        Long planId = planSimple.getPlanId();
        Long operatorId = planSimple.getOperatorId();
        Byte operateType = 1;
        /**
         * 获取灌溉计划信息
@@ -208,7 +232,11 @@
            planStartTime = new Date();
        }
        LocalDateTime startTime = planStartTime.toInstant().atZone(ZoneId.systemDefault()) .toLocalDateTime();
        startTime = startTime.plusMinutes(5);
        if(startupMode == 1){
            // 测试阶段延后2分钟,正式发布为5分钟
            startTime = startTime.plusMinutes(2);
            //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());
@@ -248,14 +276,17 @@
            Long groupId = schedule.getGroupId();
            List<Long> 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"));
                if(schedule.getDuration() > 0) {
                    // 今发布灌溉时长大于0的
                    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());
                    commandSv.planedOpenTimedClose(automaticClose, planId, operateType, schedule.getStartTime(), schedule.getDuration());
                }
            }
        }
@@ -263,18 +294,92 @@
    }
    /**
     * 获取灌溉计划列表
     * @param vo
     * 终止灌溉计划
     * @param planSimple
     * @param bindingResult
     * @return
     */
    //@GetMapping(path = "/getIrrigatePlans")
    //public BaseResponse<QueryResultVo<List<VoIrrigatePlan>>> getIrrigatePlans(QoIrrigatePlan vo) {
    //    try {
    //        QueryResultVo<List<VoIrrigatePlan>> res = irrigatePlanSv.getIrrigatePlans(vo);
    //        return BaseResponseUtils.buildSuccess(res);
    //    } catch (Exception e) {
    //        log.error("获取轮灌组记录异常", e);
    //        return BaseResponseUtils.buildException(e.getMessage());
    //    }
    //}
    @PostMapping(path = "terminatePlan", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    public BaseResponse<Boolean> terminatePlan(@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();
        // 生成终止开始时间、终止灌溉时长
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String terminateStartTimeStr = LocalDate.now().getYear() + "-01-01 00:00:00";
        Date terminateStartTime = Date.from(LocalDateTime.parse(terminateStartTimeStr, formatter).atZone(ZoneId.systemDefault()).toInstant());
        Integer terminateDuration = 9999;
        // 判断该计划是否可执行终止操作:未删除、未终止、已发布、当前时间小于计划结束时间
        Date planStartTime = irrigatePlanSv.getToTerminatePlan(planId);
        if(planStartTime == null){
            return BaseResponseUtils.buildErrorMsg("该计划不存在或不支持终止操作");
        }
        List<VoToTerminateIntakes> toTerminateIntakes = irrigatePlanSv.getToTerminateIntakes(planId);
        if(toTerminateIntakes == null || toTerminateIntakes.size() == 0){
            return BaseResponseUtils.buildErrorMsg("该计划不存在或已终止");
        }
        for(VoToTerminateIntakes toTerminateIntake : toTerminateIntakes){
            Long intakeId = toTerminateIntake.getIntakeId();
            Long commandId = toTerminateIntake.getCommandId();
            Date startTime = toTerminateIntake.getStartTime();
            Date currentTime = new Date();
            if(currentTime.before(startTime)){
                // 取消(覆盖开阀计划)
                AutomaticClose automaticClose = new AutomaticClose();
                automaticClose.setIntakeId(intakeId);
                automaticClose.setPlannedOpenTime(terminateStartTime);
                automaticClose.setMinutes(terminateDuration);
                automaticClose.setOperator(operatorId);
                automaticClose.setOpenType(Byte.valueOf("1"));
                commandSv.planedOpenTimedClose(automaticClose, planId, (byte)2, terminateStartTime, terminateDuration);
            }else {
                // 终止(远程关阀)
                VoIntakeVc intakeVc = irrigatePlanSv.getValveOpen(commandId);
                String rtuAddr = intakeVc.getRtuAddr();
                String vcNum = intakeVc.getVcNum();
                String orderNo = intakeVc.getOrderNo();
                ValveClose valveClose = new ValveClose();
                valveClose.setRtuAddr(rtuAddr);
                valveClose.setVcNum(vcNum);
                valveClose.setOrderNo(orderNo);
                valveClose.setOperator(operatorId);
                valveClose.setOpenType(Byte.valueOf("1"));
                commandSv.closeWx(valveClose, planId, (byte)3);
            }
        }
        // 终止计划
        IrIrrigatePlan iIrrigatePlan = new IrIrrigatePlan();
        iIrrigatePlan.setId(planId);
        iIrrigatePlan.setExecutingState((byte)3);
        if(irrigatePlanSv.updatePlan(iIrrigatePlan) == 0){
            return BaseResponseUtils.buildErrorMsg("终止计划失败");
        }
        // 终止灌溉次序
        if(irrigatePlanSv.terminateSchedule(planId) == 0){
            return BaseResponseUtils.buildErrorMsg("终止灌溉次序失败");
        }
        // 添加终止操作记录
        IrPlanOperate planOperate  = new IrPlanOperate();
        planOperate.setPlanId(planId);
        planOperate.setOperator(operatorId);
        planOperate.setOperateType(OperateTypeENUM.TERMINATE.getCode());
        planOperate.setOperateTime(new Date());
        if(irrigatePlanSv.addPlanOperate(planOperate) == 0){
            return BaseResponseUtils.buildErrorMsg("添加终止操作记录失败");
        }
        return BaseResponseUtils.buildSuccess();
    }
}