pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoIr/IrIntakeOperateMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoIr.IrIntakeOperate; import com.dy.pipIrrGlobal.voIr.VoIntakeResult; import com.dy.pipIrrGlobal.voIr.VoToTerminateIntakes; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -57,4 +58,19 @@ * @return */ List<VoToTerminateIntakes> getToTerminateIntakes(Long planId); /** * 根据计划ID及管轮组ID获取取水口发布发布结果 * @param planId * @param groupId * @return */ List<VoIntakeResult> getIntakeResult(@Param("planId") Long planId, @Param("groupId") Long groupId); /** * 根据计划ID获取取水口命令发布失败数量,灌溉计划详情页使用 * @param planId * @return */ Integer getFailureCount(Long planId); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoIr/IrIrrigateGroupMapper.java
@@ -2,10 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoIr.IrIrrigateGroup; import com.dy.pipIrrGlobal.voIr.VoGroup; import com.dy.pipIrrGlobal.voIr.VoGroupDetail; import com.dy.pipIrrGlobal.voIr.VoGroupOne; import com.dy.pipIrrGlobal.voIr.VoGroupSimple; import com.dy.pipIrrGlobal.voIr.*; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -73,4 +70,11 @@ * @return */ VoGroupDetail getGroupDetail(Long groupId); /** * 根据灌溉计划ID获取计划发布结果 * @param planId * @return */ List<VoGroupResult> getGroupResult(Long planId); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoIr/IrIrrigatePlanMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoIr.IrIrrigatePlan; import com.dy.pipIrrGlobal.voIr.VoPlanDetails; import com.dy.pipIrrGlobal.voIr.VoPlanSimple; import com.dy.pipIrrGlobal.voIr.VoPlans; import org.apache.ibatis.annotations.Mapper; @@ -85,4 +86,18 @@ * @return */ Date getToTerminatePlan(@Param("planId") Long planId); /** * 根据计划ID获取计划详情,包括计划名称,项目名,计划开始时间,计划结束时间,计划详情页使用 * @param planId * @return */ VoPlanDetails getPlanDetails(@Param("planId") Long planId); /** * 根据计划ID获取计划状态,用于判断是否可以删除计划 * @param planId * @return */ Integer getPlanState(@Param("planId") Long planId); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voIr/VoGroupResult.java
New file @@ -0,0 +1,61 @@ package com.dy.pipIrrGlobal.voIr; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import java.util.Date; import java.util.List; /** * @author ZhuBaoMin * @date 2025-04-09 9:00 * @LastEditTime 2025-04-09 9:00 * @Description 灌溉计划发布结果(轮灌组)视图对象,VoIntakeResult的父列表 */ @Data @JsonPropertyOrder({"groupId", "groupCode", "state", "startTime", "stopTime", "duration", "publishResult"}) public class VoGroupResult { private static final long serialVersionUID = 202504090902001L; /** * 灌溉组id */ @JsonSerialize(using = ToStringSerializer.class) private Long groupId; /** * 灌溉组编码 */ private String groupCode; /** * 轮灌组状态:2-未执行,3-执行中,4-已结束 */ private Integer state; /** * 轮灌组开始灌溉时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private Date startTime; /** * 轮灌组结束灌溉时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private Date stopTime; /** * 轮灌组持续时间 */ private Integer duration; /** * 灌溉组发布结果,包含取水口发布结果 */ private List<VoIntakeResult> publishResult; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voIr/VoIntakeResult.java
New file @@ -0,0 +1,34 @@ package com.dy.pipIrrGlobal.voIr; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; /** * @author ZhuBaoMin * @date 2025-04-09 8:55 * @LastEditTime 2025-04-09 8:55 * @Description 灌溉计划发布结果(取水口)视图对象,用于灌溉计划发布结果(VoGroupResult)子列表 */ @Data @JsonPropertyOrder({"code", "intakeName", "result"}) public class VoIntakeResult { private static final long serialVersionUID = 202504090857001L; /** * 发布结果标识 */ private Integer code; /** * 取水口名称 */ private String intakeName; /** * 发布结果 */ private String result; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voIr/VoPlanDetails.java
New file @@ -0,0 +1,59 @@ package com.dy.pipIrrGlobal.voIr; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.Data; import java.util.Date; import java.util.List; /** * @author ZhuBaoMin * @date 2025-04-09 11:22 * @LastEditTime 2025-04-09 11:22 * @Description 灌溉计划详情,拥有灌溉计划详情页 */ @Data @JsonPropertyOrder({"planName", "projectName", "state", "planStartTime", "planStopTime", "failureCount", "groups"}) public class VoPlanDetails { private static final long serialVersionUID = 202504091125001L; /** * 灌溉计划名称 */ private String planName; /** * 项目名称 */ private String projectName; /** * 灌溉计划状态 */ private Integer state; /** * 灌溉计划开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private Date planStartTime; /** * 灌溉计划结束时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") private Date planStopTime; /** * 命令发布失败数量 */ private Integer failureCount; /** * 轮灌组列表 */ private List<VoGroupResult> groups; } pipIrr-platform/pipIrr-global/src/main/resources/mapper/IrIntakeOperateMapper.xml
@@ -178,4 +178,23 @@ FROM ir_intake_operate WHERE operate_type = 1 AND command_result = 1 AND plan_id = #{planId} </select> <!--根据计划ID及管轮组ID获取取水口发布发布结果--> <select id="getIntakeResult" resultType="com.dy.pipIrrGlobal.voIr.VoIntakeResult"> SELECT IF(io.command_result = 1, 0, 1) AS code, (SELECT name FROM pr_intake WHERE id = io.intake_id) AS intakeName, io.failure_factors AS result FROM ir_intake_operate io inner JOIN ir_group_intake gi ON gi.intake_id = io.intake_id WHERE io.plan_id = #{planId} AND gi.group_id = #{groupId}; </select> <!--根据计划ID获取取水口命令发布失败数量,灌溉计划详情页使用--> <select id="getFailureCount" resultType="java.lang.Integer"> SELECT COUNT(1) AS failureCount FROM ir_intake_operate WHERE operate_type = 1 AND command_result != 1 AND plan_id = #{planId} </select> </mapper> pipIrr-platform/pipIrr-global/src/main/resources/mapper/IrIrrigateGroupMapper.xml
@@ -304,4 +304,20 @@ ) irrigateGroup GROUP BY groupCode,defaultDuration </select> <select id="getGroupResult" resultType="com.dy.pipIrrGlobal.voIr.VoGroupResult"> SELECT grp.id AS groupId, grp.group_code AS groupCode, IF(NOW() < sche.start_time, 2, IF(NOW() > sche.start_time AND NOW() < DATE_ADD(sche.start_time, INTERVAL sche.duration MINUTE), 3, 4)) AS state, sche.start_time AS startTime, DATE_ADD(sche.start_time, INTERVAL sche.duration MINUTE) AS stopTime, sche.duration, NULL AS publishResult FROM ir_irrigate_group grp INNER JOIN ir_irrigate_schedule sche ON sche.group_id = grp.id INNER JOIN ir_plan_schedule ps ON ps.schedule_id = sche.id WHERE ps.plan_id = #{planId}; </select> </mapper> pipIrr-platform/pipIrr-global/src/main/resources/mapper/IrIrrigatePlanMapper.xml
@@ -337,4 +337,31 @@ </select> <!--根据计划ID获取计划详情,包括计划名称,项目名,计划开始时间,计划结束时间,计划详情页使用--> <select id="getPlanDetails" resultType="com.dy.pipIrrGlobal.voIr.VoPlanDetails"> SELECT plan.plan_name AS planName, pro.project_name AS projectName, IF(plan.executing_state = 3, '5', IF(NOW() < plan.plan_start_time,'2', IF(NOW() < plan.plan_stop_time, '3', '4'))) AS state, plan.plan_start_time AS planStartTime, plan.plan_stop_time AS planStopTime, NULL AS groupDetails, NULL AS failureCount FROM ir_irrigate_plan plan INNER JOIN ir_project pro ON pro.id = plan.project_id WHERE plan.id = #{planId} AND plan.deleted = 0 </select> <!--根据计划ID获取计划状态,用于判断是否可以删除计划--> <select id="getPlanState" resultType="java.lang.Integer"> SELECT plan_state FROM ir_irrigate_plan WHERE id = #{planId} AND deleted = 0 </select> </mapper> pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/irrigatePlan/IrrigatePlanCtrl.java
@@ -7,10 +7,7 @@ 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.voIr.*; import com.dy.pipIrrGlobal.voRm.VoIntakeVc; import com.dy.pipIrrWechat.command.CommandSv; import com.dy.pipIrrWechat.command.dto.AutomaticClose; @@ -34,6 +31,7 @@ import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; /** @@ -165,33 +163,22 @@ } /** * 获取未完成的计划列表,小程序计划列表页使用 * 删除灌溉计划 * @param planSimple * @param bindingResult * @return */ @GetMapping(path = "/getNotCompletePlans") public BaseResponse<List<VoPlans>> getNotCompletePlans() { try { List<VoPlans> res = irrigatePlanSv.getNotCompletePlans(); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取未完的计划异常", e); return BaseResponseUtils.buildException(e.getMessage()); @PostMapping(path = "deletePlan") public BaseResponse<Boolean> deletePlan(@RequestBody @Valid PlanSimple planSimple, BindingResult bindingResult) { if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } } /** * 获取已完成的计划列表,小程序计划列表页使用 * @return */ @GetMapping(path = "/getCompletedPlans") public BaseResponse<List<VoPlans>> getCompletedPlans() { try { List<VoPlans> res = irrigatePlanSv.getCompletedPlans(); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取项目记录异常", e); return BaseResponseUtils.buildException(e.getMessage()); Map map_result = irrigatePlanSv.deletePlan(planSimple); if(map_result.get("success").equals(false)) { return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString()); } return BaseResponseUtils.buildSuccess() ; } /** @@ -322,39 +309,37 @@ } List<VoToTerminateIntakes> toTerminateIntakes = irrigatePlanSv.getToTerminateIntakes(planId); if(toTerminateIntakes == null || toTerminateIntakes.size() == 0){ return BaseResponseUtils.buildErrorMsg("该计划不存在或已终止"); } if(toTerminateIntakes != null && toTerminateIntakes.size() > 0){ 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")); 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(); 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); 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); } } } @@ -382,4 +367,54 @@ } return BaseResponseUtils.buildSuccess(); } /** * 获取未完成的计划列表,小程序计划列表页使用 * @return */ @GetMapping(path = "/getNotCompletePlans") public BaseResponse<List<VoPlans>> getNotCompletePlans() { try { List<VoPlans> res = irrigatePlanSv.getNotCompletePlans(); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取未完的计划异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } /** * 获取已完成的计划列表,小程序计划列表页使用 * @return */ @GetMapping(path = "/getCompletedPlans") public BaseResponse<List<VoPlans>> getCompletedPlans() { try { List<VoPlans> res = irrigatePlanSv.getCompletedPlans(); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取项目记录异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } /** * 根据计划ID获取计划发布结果 * @param planId * @return */ @GetMapping(path = "/getPublishResults") public BaseResponse<VoPlanDetails> getPublishResults(@RequestParam Long planId) { if(planId == null) { return BaseResponseUtils.buildErrorMsg("计划ID不能为空"); } try { VoPlanDetails res = irrigatePlanSv.getPublishResults(planId); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取计划发布结果异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/irrigatePlan/IrrigatePlanSv.java
@@ -1,22 +1,25 @@ package com.dy.pipIrrWechat.irrigatePlan; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.daoIr.*; import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper; import com.dy.pipIrrGlobal.pojoIr.IrIrrigatePlan; import com.dy.pipIrrGlobal.pojoIr.IrIrrigateSchedule; import com.dy.pipIrrGlobal.pojoIr.IrPlanOperate; import com.dy.pipIrrGlobal.pojoIr.IrPlanSchedule; 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.voIr.*; import com.dy.pipIrrGlobal.voRm.VoIntakeVc; import com.dy.pipIrrWechat.irrigatePlan.dto.PlanSimple; import com.dy.pipIrrWechat.irrigatePlan.enums.OperateTypeENUM; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.*; /** * @author ZhuBaoMin @@ -66,6 +69,55 @@ public Long addIrrigatePlan(IrIrrigatePlan po) { irrigatePlanMapper.insert(po); return po.getId(); } /** * 删除灌溉计划 * @param planSimple * @return */ public Map deletePlan(PlanSimple planSimple) { Long planId = planSimple.getPlanId(); Long operatorId = planSimple.getOperatorId(); Integer planState = irrigatePlanMapper.getPlanState(planId); if(planState == null) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", "灌溉计划不存在"); map.put("content", null); return map; } if(planState != 1) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", "灌溉计划非草稿状态,不允许删除"); map.put("content", null); return map; } try { irrigatePlanMapper.deleteByPrimaryKey(planId); // 添加灌溉计划操作记录 IrPlanOperate planOperate = new IrPlanOperate(); planOperate.setPlanId(planId); planOperate.setOperator(operatorId); planOperate.setOperateType(OperateTypeENUM.DELETE.getCode()); planOperate.setOperateTime(new Date()); addPlanOperate(planOperate); Map map = new HashMap<>(); map.put("success", true); map.put("msg", "灌溉项目删除成功"); map.put("content", null); return map; } catch (Exception e) { Map map = new HashMap<>(); map.put("success", false); map.put("msg", "灌溉项目删除失败"); map.put("content", null); return map; } } /** @@ -271,4 +323,35 @@ public Long getIntakeIdByUnitId(Long unitId) { return irIrrigateUnitMapper.getIntakeIdByUnitId(unitId); } /** * 根据计划ID获取计划发布结果 * @param planId * @return */ public VoPlanDetails getPublishResults(Long planId) { VoPlanDetails planDetails = irrigatePlanMapper.getPlanDetails(planId); if(planDetails == null){ return null; } Integer failureCount = Optional.ofNullable(irIntakeOperateMapper.getFailureCount(planId)).orElse(0); planDetails.setFailureCount(failureCount); List<VoGroupResult> groupResults = irIrrigateGroupMapper.getGroupResult(planId); if(groupResults == null || groupResults.size() == 0){ return null; } for (VoGroupResult groupResult : groupResults) { List<VoIntakeResult> intakeResults = irIntakeOperateMapper.getIntakeResult(planId, groupResult.getGroupId()); if(intakeResults != null) { groupResult.setPublishResult(intakeResults); } } planDetails.setGroups(groupResults); return planDetails; } } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/irrigatePlan/enums/OperateTypeENUM.java
@@ -18,7 +18,8 @@ PUBLISH((byte)2, "发布"), EXECUTE((byte)3, "执行"), SUSPEND((byte)4, "暂停"), TERMINATE((byte)5, "终止"); TERMINATE((byte)5, "终止"), DELETE((byte)6, "删除"); private final Byte code; private final String message;