pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/CodeV1_0_1.java
@@ -62,7 +62,7 @@ (code.equals(cd_92) ? "遥控启动阀门" : (code.equals(cd_93) ? "遥控关闭阀门" : (code.equals(cd_97) ? "APP远程开阀" : (code.equals(cd_98) ? "PP远程关阀" : (code.equals(cd_98) ? "APP远程关阀" : (code.equals(cd_3C) ? "设置水价" : (code.equals(cd_6C) ? "查询水价" : (code.equals(cd_3D) ? "设置黑名单" : pipIrr-platform/pipIrr-global/pom.xml
@@ -144,19 +144,19 @@ <build> <plugins> <plugin> <!-- spring boot提供的maven打包插件 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <!-- <plugin>--> <!-- <!– spring boot提供的maven打包插件 –>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-maven-plugin</artifactId>--> <!-- <configuration>--> <!-- <excludes>--> <!-- <exclude>--> <!-- <groupId>org.projectlombok</groupId>--> <!-- <artifactId>lombok</artifactId>--> <!-- </exclude>--> <!-- </excludes>--> <!-- </configuration>--> <!-- </plugin>--> <plugin> <!-- maven里执行测试用例的插件 --> <groupId>org.apache.maven.plugins</groupId> pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComSupport.java
New file @@ -0,0 +1,293 @@ package com.dy.pipIrrGlobal.command; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.CommandType; import com.dy.common.mw.protocol.Data; import com.dy.common.mw.protocol.p206V202404.CodeV202404; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.command.dto.Param; import com.dy.pipIrrGlobal.command.result.CommandResultCode; import com.dy.pipIrrGlobal.daoBa.BaSettingsMapper; import com.dy.pipIrrGlobal.daoPr.PrControllerMapper; import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper; import com.dy.pipIrrGlobal.pojoPr.PrController; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import jakarta.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** * @author ZhuBaoMin * @date 2024-05-30 15:45 * @LastEditTime 2024-05-30 15:45 * @Description 命令支撑类 */ //@Component //@DependsOn({"baSettingsMapper", "prControllerMapper"}) public class ComSupport { protected static String mwUrlSendCom = "http://127.0.0.1:8070/rtuMw/com/send" ; protected static String controllerType = null; protected static Integer projectNo = null; protected String commandTypeOuter = CommandType.outerCommand; // 存储实例化的 CompletableFuture<Data> 对象 protected static Map<Long, Object> features = new HashMap<>(); protected static Boolean setuped = false; @Autowired private RestTemplate restTemplate; @Autowired private BaSettingsMapper baSettingsMapper; @Autowired private PrControllerMapper prControllerMapper; //@Autowired //private CommandSv commandSv; @Autowired private RmCommandHistoryMapper rmCommandHistoryMapper; public static ComSupport comSupport; /** * 引入BaSettingsMapper */ @PostConstruct public void init() { comSupport = this; comSupport.baSettingsMapper = this.baSettingsMapper; comSupport.prControllerMapper = this.prControllerMapper; } /** * 获取系统配置参数 */ public void setUp() { controllerType = comSupport.baSettingsMapper.getItemValue("controllerType"); projectNo = Integer.parseInt(comSupport.baSettingsMapper.getItemValue("projectNo")); setuped = true; } /** * 生成订单号 * @return */ public String generateOrderNo() { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss"); LocalDateTime dateTime = LocalDateTime.now(); Random random = new Random(); String CHARACTERS = "0123456789"; StringBuilder sb = new StringBuilder(4); for (int i = 0; i < 4; i++) { int index = random.nextInt(CHARACTERS.length()); sb.append(CHARACTERS.charAt(index)); } return dtf.format(dateTime) + sb.toString(); } /** * 根据取水口ID或阀控器地址获取阀控器对象 * @param intakeId * @return */ public JSONObject getRtu(Long intakeId, String rtuAddr) { PrController prController = prControllerMapper.getRtu(intakeId, rtuAddr); if(prController == null) { return null; } JSONObject job_rtu = new JSONObject(); job_rtu.put("rtuAddr", prController.getRtuAddr()); job_rtu.put("protocol", prController.getProtocol()); job_rtu.put("intakeId", prController.getIntakeId()); return job_rtu; } /** * 创建命令日志对象 * @param comId 主键 * @param commandCode 功能码 * @param rtuAddr 阀控器地址 * @param protocol 通讯协议名称 * @param param 参数数据 * @param operator 操作员 * @return */ protected RmCommandHistory getComHistory(Long comId, String commandCode, String commandName, Long intakeId, String rtuAddr, String protocol, Object param, Long operator ) { RmCommandHistory rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setCommandCode(commandCode); //rmCommandHistory.setCommandName(CodeV202404.getCodeName(commandCode)); rmCommandHistory.setCommandName(commandName); rmCommandHistory.setIntakeId(intakeId); rmCommandHistory.setRtuAddr(rtuAddr); rmCommandHistory.setProtocol(protocol); rmCommandHistory.setParam((JSONObject) JSON.toJSON(param)); rmCommandHistory.setSendTime(new Date()); rmCommandHistory.setOperator(operator); return rmCommandHistory; } /** * 构造命令对象 * @param comId 命令ID * @param commandCode 功能码 * @param rtuAddr RTU地址 * @param param 参数数据 * @return 构造好的命令对象 */ protected Command command(Long comId, String commandCode, String rtuAddr, String protocol, String rtuResultSendWebUrl, Object param){ Command com = new Command() ; com.id = String.valueOf(comId); com.code = commandCode ; com.rtuAddr = rtuAddr ; com.protocol = protocol; com.type = commandTypeOuter; com.rtuResultSendWebUrl = rtuResultSendWebUrl ; com.param = param ; return com ; } /** * 处理回调内容 * @param comId * @return */ protected BaseResponse<Data> dealWithCallBack(Long comId) { CompletableFuture<Data> featureObject = new CompletableFuture<>(); features.put(comId, featureObject); try { CompletableFuture<Data> feature = (CompletableFuture<Data>) features.get(comId); System.out.println("receive result ID:" + comId); Data resultData = feature.get(30, TimeUnit.SECONDS); features.remove(comId); Long commandId = Long.parseLong(resultData.getCommandId()); if(commandId.equals(comId)) { return BaseResponseUtils.buildSuccess(resultData); }else { return BaseResponseUtils.buildSuccess(); } } catch (InterruptedException e) { e.printStackTrace(); return BaseResponseUtils.buildFail(CommandResultCode.GET_RESULT_ERROR.getMessage()); } catch (ExecutionException e) { e.printStackTrace(); return BaseResponseUtils.buildFail(CommandResultCode.GET_RESULT_ERROR.getMessage()); } catch (TimeoutException e) { return BaseResponseUtils.buildSuccess(CommandResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage()); } } /** * 发送命令 * @return */ protected BaseResponse sendCom2Mw(Command com){ String url = UriComponentsBuilder.fromUriString(mwUrlSendCom) .build() .toUriString(); HttpHeaders headers = new HttpHeaders(); HttpEntity<Command> httpEntity = new HttpEntity<>(com, headers); ResponseEntity<BaseResponse> response = null; try { // 通过Post方式调用接口 response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, BaseResponse.class); } catch (Exception e) { e.printStackTrace(); } return response.getBody(); } /** * 发送命令并处理请求结果及执行结果 * @param po * @return */ protected BaseResponse dealWithCommandResult(Param po) { Long comId = po.getComId(); String commandCode = po.getCommandCode(); Long intakeId = po.getIntakeId(); String rtuAddr = po.getRtuAddr(); String protocol = po.getProtocol(); Object param = po.getParam(); String rtuResultSendWebUrl = po.getRtuResultSendWebUrl(); Long operator = po.getOperator(); // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV202404.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); //commandSv.insert(rmCommandHistory); rmCommandHistoryMapper.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调失败 if(!response_CallBack.getCode().equals("0001")) { // 命令日志执行结果改为失败 rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); //commandSv.updateCommandResult(rmCommandHistory); rmCommandHistoryMapper.updateByPrimaryKeySelective(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getMsg()); //return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功,返回回调内容 */ Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/dto/Param.java
New file @@ -0,0 +1,32 @@ package com.dy.pipIrrGlobal.command.dto; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-06-04 11:25 * @LastEditTime 2024-06-04 11:25 * @Description */ @Data public class Param { public static final long serialVersionUID = 202406041126001L; private Long comId; private String commandCode; private Long intakeId; private String rtuAddr; private String protocol; private Object param; private String rtuResultSendWebUrl; private Long operator; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/result/CommandResultCode.java
New file @@ -0,0 +1,29 @@ package com.dy.pipIrrGlobal.command.result; import lombok.AllArgsConstructor; import lombok.Getter; /** * @author ZhuBaoMin * @date 2024-05-07 14:54 * @LastEditTime 2024-05-07 14:54 * @Description */ @Getter @AllArgsConstructor public enum CommandResultCode { /** * Valve */ GET_RESULT_IN_ONE_MINUTE(10001,"1分钟后去查看结果"), GET_RESULT_ERROR(10002, "获取结果异常"), /** * RTU */ RTU_NOT_EXIST(20001, "阀控器不存在"), RTU_ADDR_CANNOT_BE_NULL(20002, "阀控器地址不能为空"); private final Integer code; private final String message; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrControllerMapper.java
@@ -88,16 +88,10 @@ Integer deleteIntakeId(@Param("controllerId") Long controllerId); /** * 根据取水口ID获取阀控器对象 * 根据取水口ID或阀控器地址获取阀控器对象 * @param intakeId * @return */ PrController getControllerByIntakeId(Long intakeId); /** * 根据RTU地址获取阀控器对象 * @param rtuAddr * @return */ PrController getControllerByRtuAddr(String rtuAddr); PrController getRtu(@Param("intakeId") Long intakeId, @Param("rtuAddr") String rtuAddr); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrIntakeVcMapper.java
New file @@ -0,0 +1,35 @@ package com.dy.pipIrrGlobal.daoPr; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoPr.PrIntakeVc; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * @author ZhuBaoMin * @date 2024-05-31 19:26 * @LastEditTime 2024-05-31 19:26 * @Description */ @Mapper public interface PrIntakeVcMapper extends BaseMapper<PrIntakeVc> { int deleteByPrimaryKey(Long id); int insert(PrIntakeVc record); int insertSelective(PrIntakeVc record); PrIntakeVc selectByPrimaryKey(Long id); int updateByPrimaryKeySelective(PrIntakeVc record); int updateByPrimaryKey(PrIntakeVc record); /** * 根据取水口ID获取与之绑定虚拟卡ID * @param intakeId * @return */ Long getVcIdByIntakeId(@Param("intakeId") Long intakeId); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmCommandHistoryMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import com.dy.pipIrrGlobal.voRm.VoUnclosedParam; import com.dy.pipIrrGlobal.voRm.VoUnclosedValve; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -36,4 +37,11 @@ * @return */ List<VoUnclosedValve> getUnclosedValves(@Param("onLineMap") String onLineMap, @Param("operator") Long operator); /** * 根据取水口ID获取该取水口未关阀参数,平台选择取水口关阀使用 * @param intakeId * @return */ VoUnclosedParam getUncloseParam(Long intakeId); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoSe.SeClient; import com.dy.pipIrrGlobal.voSe.VoClient; import com.dy.pipIrrGlobal.voSe.VoClientWechat; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -105,4 +106,10 @@ */ List<Map<String, Object>> getWaterTypes(); /** * 获取农户基本信息,小程序首页使用 * @param sessionId * @return */ VoClientWechat getSimpleClientInfo(@Param("sessionId") Long sessionId, @Param("openId") String openId); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeMapper.java
@@ -52,4 +52,10 @@ //Integer deleteByCardNum(@Param("cardNum") String cardNum); Integer deleteByCardId(@Param("cardId") Long cardId); /** *根据水卡id获取最近一条充值记录 * @param cardId * @return */ SeRecharge selectByCardId(@Param("cardId") Long cardId); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoPr/PrController.java
@@ -55,7 +55,6 @@ */ @Schema(description = "控制器地址", requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank(message = "控制器地址不能为空") @Length(message = "控制器地址不大于{max}字",max = 11) private String rtuAddr; /** @@ -63,7 +62,6 @@ */ @Schema(description = "通讯协议", requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank(message = "通讯协议不能为空") @Length(message = "通讯协议不大于{max}字",max = 25) private String protocol; /** pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoPr/PrControllerTramp.java
@@ -46,7 +46,6 @@ */ @Schema(description = "控制器地址", requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank(message = "控制器地址不能为空") @Length(message = "控制器地址必须{max}位",min = 11, max = 11) public String rtuAddr; /** @@ -54,7 +53,6 @@ */ @Schema(description = "通讯协议", requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank(message = "通讯协议不能为空") @Length(message = "通讯协议不大于{max}字",max = 25) public String protocol; /** pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoPr/PrIntakeVc.java
New file @@ -0,0 +1,56 @@ package com.dy.pipIrrGlobal.pojoPr; /** * @author ZhuBaoMin * @date 2024-05-31 19:26 * @LastEditTime 2024-05-31 19:26 * @Description */ import com.alibaba.fastjson2.annotation.JSONField; import com.alibaba.fastjson2.writer.ObjectWriterImplToString; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.dy.common.po.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.*; /** * 取水口虚拟卡绑定表 */ @TableName(value="pr_intake_vc", autoResultMap = true) @Data @Builder @ToString @NoArgsConstructor @AllArgsConstructor @Schema(name = "取水口虚拟卡绑定实体") public class PrIntakeVc implements BaseEntity { public static final long serialVersionUID = 202405311931001L; /** * 主键 */ @JSONField(serializeUsing= ObjectWriterImplToString.class) @TableId(type = IdType.INPUT) @Schema(description = "实体id", requiredMode = Schema.RequiredMode.NOT_REQUIRED) private Long id; /** * 取水口ID */ @Schema(description = "取水口ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "取水口ID不能为空") private Long intakeId; /** * 虚拟卡ID */ @Schema(description = "虚拟卡ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "虚拟卡ID不能为空") private Long vcId; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeClient.java
@@ -45,7 +45,6 @@ */ @JSONField(serializeUsing= ObjectWriterImplToString.class) @Schema(description = "所在县ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "所在县不能为空") private Long countyid; /** @@ -53,7 +52,6 @@ */ @JSONField(serializeUsing= ObjectWriterImplToString.class) @Schema(description = "所在镇ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "所在镇不能为空") //不能为空也不能为null private Long townid; /** @@ -61,7 +59,6 @@ */ @JSONField(serializeUsing= ObjectWriterImplToString.class) @Schema(description = "所在村ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "所在村不能为空") //不能为空也不能为null private Long villageid; /** @@ -69,7 +66,6 @@ */ @JSONField(serializeUsing= ObjectWriterImplToString.class) @Schema(description = "所在片区ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "所在片区不能为空") //不能为空也不能为null private Long blockid; /** @@ -77,7 +73,6 @@ */ @JSONField(serializeUsing= ObjectWriterImplToString.class) @Schema(description = "所在分水房ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "所在分水房不能为空") //不能为空也不能为null private Long divideid; /** @@ -92,7 +87,6 @@ * 虚拟卡号;10位,从1000000000开始 */ @Schema(description = "虚拟卡号", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "虚拟卡号不能为空") private Long virtualid; /** @@ -100,7 +94,6 @@ */ @JSONField(serializeUsing= ObjectWriterImplToString.class) @Schema(description = "农户编号", requiredMode = Schema.RequiredMode.REQUIRED) //@NotBlank(message = "农户编号不能为空") private String clientnum; /** @@ -108,14 +101,12 @@ */ @JSONField(serializeUsing= ObjectWriterImplToString.class) @Schema(description = "区划编码串", requiredMode = Schema.RequiredMode.REQUIRED) //@NotNull(message = "区划编码串不能为空") private Long districtnum; /** * 区划名称串;县名+镇名+村名,用于归属地 */ @Schema(description = "区划名称串", requiredMode = Schema.RequiredMode.REQUIRED) //@NotBlank(message = "区划名称串") private String districttitle; /** @@ -131,7 +122,7 @@ */ @Schema(description = "农户身份证号", requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank(message = "农户身份证号不能为空") //不能为空也不能为null @Length(message = "农户身份证号必须{max}位数据", min = 18, max = 18) //@Length(message = "农户身份证号必须{max}位数据", min = 18, max = 18) private String idcard; /** @@ -150,14 +141,14 @@ * 街道及门牌号 */ @Schema(description = "街道+门牌号", requiredMode = Schema.RequiredMode.NOT_REQUIRED) @Length(message = "地址不大于{max}字,不小于{min}字", min = 1, max = 50) @Length(message = "地址不大于{max}字,不小于{min}字", max = 50) private String address; /** * 备注信息 */ @Schema(description = "备注", requiredMode = Schema.RequiredMode.NOT_REQUIRED) @Length(message = "备注不大于{max}字,不小于{min}字", min = 1, max = 200) @Length(message = "备注不大于{max}字,不小于{min}字", max = 200) private String remarks; /** pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/util/Org.java
@@ -12,8 +12,9 @@ public enum Org { Ym("ym", "元谋"), Pj("pj", "片角镇") ; // Ym("ym", "元谋"), // Pj("pj", "片角镇"), Jyg("ym", "嘉峪关"); @EnumValue public String tag ; @@ -44,10 +45,13 @@ } public static Org get(String tag){ if(tag.equals(Ym.tag)){ return Ym ; }else if(tag.equals(Pj.tag)){ return Pj ; // if(tag.equals(Ym.tag) || tag.equals(Jyg.tag)){ // return Ym ; // }else if(tag.equals(Pj.tag)){ // return Pj ; // } if( tag.equals(Jyg.tag)){ return Jyg ; } return null ; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUnclosedParam.java
New file @@ -0,0 +1,22 @@ package com.dy.pipIrrGlobal.voRm; import com.dy.common.po.BaseEntity; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-06-07 9:03 * @LastEditTime 2024-06-07 9:03 * @Description 关阀所需参数,平台选择取水口关阀使用 */ @Data public class VoUnclosedParam implements BaseEntity { private static final long serialVersionUID = 202406070904001L; private String rtuAddr; private String orderNo; private String vcNum; } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoClientWechat.java
New file @@ -0,0 +1,26 @@ package com.dy.pipIrrGlobal.voSe; import com.dy.common.po.BaseEntity; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-06-03 11:40 * @LastEditTime 2024-06-03 11:40 * @Description 农户视图对象,小程序使用 */ @Data public class VoClientWechat implements BaseEntity { private static final long serialVersionUID = 202406031142001L; private String sessionId; private String clientId; private String clientName; private String phone; private String blockId; } pipIrr-platform/pipIrr-global/src/main/resources/application-database-pj.yml
@@ -5,7 +5,8 @@ #name: pj type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.91.73:3306/pipIrr_pj?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull # url: jdbc:mysql://192.168.91.73:3306/pipIrr_pj?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull url: jdbc:mysql://127.0.0.1:3306/pipIrr_pj?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull username: root password: dysql,;.abc!@# druid: pipIrr-platform/pipIrr-global/src/main/resources/application-database-ym.yml
@@ -5,7 +5,8 @@ #name: ym type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.91.73:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull # url: jdbc:mysql://192.168.91.73:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull url: jdbc:mysql://127.0.0.1:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull username: root password: dysql,;.abc!@# druid: pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrControllerMapper.xml
@@ -168,10 +168,9 @@ SELECT COUNT(*) AS recordCount FROM pr_controller con INNER JOIN pr_intake_controller ic ON ic.controllerId = con.id LEFT JOIN pr_intake_controller ic ON ic.controllerId = con.id INNER JOIN pr_intake inta ON con.intakeId = inta.id <where> AND ic.operateType = 1 AND con.deleted = 0 <if test = "id != null and id > 0"> @@ -198,10 +197,9 @@ (SELECT COUNT(*) FROM pr_intake_controller WHERE controllerId = con.id AND intakeId = inta.id AND operateType = 1) AS bindNumber, con.findDt AS findDt FROM pr_controller con INNER JOIN pr_intake_controller ic ON ic.controllerId = con.id LEFT JOIN pr_intake_controller ic ON ic.controllerId = con.id INNER JOIN pr_intake inta ON con.intakeId = inta.id <where> AND ic.operateType = 1 AND con.deleted = 0 <if test = "id != null and id > 0"> @@ -252,13 +250,18 @@ SELECT COUNT(*) AS recordCount FROM pr_controller WHERE rtuAddr = (SELECT rtuAddr FROM pr_controller_tramp WHERE id = ${controllerId}) AND intakeId IS NOT NULL </select> <!--根据取水口ID获取阀控器对象--> <select id="getControllerByIntakeId" resultType="com.dy.pipIrrGlobal.pojoPr.PrController"> SELECT * FROM pr_controller WHERE deleted = 0 AND intakeId = #{intakeId} LIMIT 0,1 </select> <!--根据RTU地址获取阀控器对象--> <select id="getControllerByRtuAddr" resultType="com.dy.pipIrrGlobal.pojoPr.PrController"> SELECT * FROM pr_controller WHERE deleted = 0 AND rtuAddr = #{rtuAddr} LIMIT 0,1 <!--根据取水口ID或阀控器地址获取阀控器对象--> <select id="getRtu" resultType="com.dy.pipIrrGlobal.pojoPr.PrController"> SELECT * FROM pr_controller <where> AND deleted = 0 <if test = "intakeId != null"> AND intakeId = #{intakeId} </if> <if test = "rtuAddr != null"> AND rtuAddr = #{rtuAddr} </if> </where> LIMIT 0,1 </select> </mapper> pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml
@@ -421,7 +421,7 @@ rtus.isOnLine FROM pr_controller con INNER JOIN pr_intake inta ON con.intakeId = inta.id INNER JOIN rm_command_history com ON con.rtuAddr = com.rtuAddr INNER JOIN rm_command_history com ON con.rtuAddr = com.rtu_addr INNER JOIN JSON_TABLE( <!--'[{"rtuAddr":"37142501020100215","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]',--> #{onLineMap}, pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeVcMapper.xml
New file @@ -0,0 +1,85 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper"> <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoPr.PrIntakeVc"> <!--@mbg.generated--> <!--@Table pr_intake_vc--> <id column="id" jdbcType="BIGINT" property="id" /> <result column="intake_id" jdbcType="BIGINT" property="intakeId" /> <result column="vc_id" jdbcType="BIGINT" property="vcId" /> </resultMap> <sql id="Base_Column_List"> <!--@mbg.generated--> id, intake_id, vc_id </sql> <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap"> <!--@mbg.generated--> select <include refid="Base_Column_List" /> from pr_intake_vc where id = #{id,jdbcType=BIGINT} </select> <delete id="deleteByPrimaryKey" parameterType="java.lang.Long"> <!--@mbg.generated--> delete from pr_intake_vc where id = #{id,jdbcType=BIGINT} </delete> <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoPr.PrIntakeVc"> <!--@mbg.generated--> insert into pr_intake_vc (id, intake_id, vc_id ) values (#{id,jdbcType=BIGINT}, #{intakeId,jdbcType=BIGINT}, #{vcId,jdbcType=BIGINT} ) </insert> <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoPr.PrIntakeVc"> <!--@mbg.generated--> insert into pr_intake_vc <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null"> id, </if> <if test="intakeId != null"> intake_id, </if> <if test="vcId != null"> vc_id, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null"> #{id,jdbcType=BIGINT}, </if> <if test="intakeId != null"> #{intakeId,jdbcType=BIGINT}, </if> <if test="vcId != null"> #{vcId,jdbcType=BIGINT}, </if> </trim> </insert> <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoPr.PrIntakeVc"> <!--@mbg.generated--> update pr_intake_vc <set> <if test="intakeId != null"> intake_id = #{intakeId,jdbcType=BIGINT}, </if> <if test="vcId != null"> vc_id = #{vcId,jdbcType=BIGINT}, </if> </set> where id = #{id,jdbcType=BIGINT} </update> <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoPr.PrIntakeVc"> <!--@mbg.generated--> update pr_intake_vc set intake_id = #{intakeId,jdbcType=BIGINT}, vc_id = #{vcId,jdbcType=BIGINT} where id = #{id,jdbcType=BIGINT} </update> <!--根据取水口ID获取与之绑定虚拟卡ID--> <select id="getVcIdByIntakeId" resultType="java.lang.Long"> SELECT vc_id AS vcId FROM pr_intake_vc WHERE intake_id = #{intakeId} LIMIT 0,1 </select> </mapper> pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml
@@ -203,8 +203,46 @@ isOnLine BOOLEAN PATH '$.isOnLine' ) ) rtus ON com.rtu_addr = rtus.rtuAddr WHERE (com.command_code = '92' OR com.command_code = 'A2') AND com.operator = #{operator} AND NOT EXISTS (SELECT * FROM rm_command_history WHERE (command_code = '93' OR command_code = 'A3') AND param ->>'$.orderNo' = com.param ->>'$.orderNo') <where> AND (com.command_code = '92' OR com.command_code = 'A2' OR com.command_code = '97') AND com.operator = #{operator} AND NOT EXISTS ( SELECT * FROM rm_command_history WHERE (result IS NULL OR result = 1 ) AND (command_code = '93' OR command_code = 'A3' OR command_code = '98') AND param ->>'$.orderNo' = com.param ->>'$.orderNo' ) </where> ORDER BY com.send_time DESC </select> <!--根据取水口ID获取该取水口未关阀参数--> <select id="getUncloseParam" resultType="com.dy.pipIrrGlobal.voRm.VoUnclosedParam"> SELECT com.rtu_addr AS rtuAddr, com.param ->>'$.orderNo' AS orderNo, com.param ->>'$.icCardNo' AS vcNum FROM rm_command_history com INNER JOIN pr_controller con ON com.rtu_addr = con.rtuAddr INNER JOIN pr_intake inta ON con.intakeId = inta.id INNER JOIN JSON_TABLE( '[{"rtuAddr":"620201000029","isOnLine":true},{"rtuAddr":"4000004","isOnLine":true},{"rtuAddr":"dy20240325","isOnLine":false}]', '$[*]' COLUMNS( rtuAddr VARCHAR(20) PATH '$.rtuAddr', isOnLine BOOLEAN PATH '$.isOnLine' ) ) rtus ON com.rtu_addr = rtus.rtuAddr WHERE (com.command_code = '92' OR com.command_code = 'A2' OR com.command_code = '97') AND con.intakeId = #{intakeId} AND NOT EXISTS ( SELECT * FROM rm_command_history WHERE (result IS NULL OR result = 1 ) AND (command_code = '93' OR command_code = 'A3' OR command_code = '98') AND param ->>'$.orderNo' = com.param ->>'$.orderNo' ) ORDER BY com.send_time DESC LIMIT 0,1 </select> </mapper> pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml
@@ -436,4 +436,26 @@ SELECT id, typeName from se_water_type </select> <!--获取农户基本信息,小程序首页使用--> <select id="getSimpleClientInfo" resultType="com.dy.pipIrrGlobal.voSe.VoClientWechat"> SELECT CAST(ope.id AS char) AS sessionId, CAST(cli.id AS char) AS clientId, cli.name AS clientName, cli.phone, CAST(cli.blockId AS char) AS blockId FROM se_open_id ope INNER JOIN se_client cli ON ope.client_id = cli.id <where> <if test = "sessionId != null"> AND ope.id = #{sessionId} </if> <if test = "openId != null"> AND ope.open_id = #{openId} </if> </where> LIMIT 0,1 </select> </mapper> pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeMapper.xml
@@ -264,4 +264,13 @@ </if> </trim> </select> <select id="selectByCardId" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from se_recharge where cardId = #{cardId,jdbcType=BIGINT} ORDER BY operateDt DESC limit 0,1 </select> </mapper> pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineDeal.java
@@ -1,7 +1,5 @@ package com.dy.rtuMw.server.local.localProtocol; import com.dy.rtuMw.server.forTcp.TcpSessionCache; import java.util.HashMap; public class RtuOnLineDeal { pipIrr-platform/pipIrr-web/pipIrr-mwTest-web/src/main/java/com/dy/pipIrrMwTestWeb/test/CommandP206V100Ctrl.java
@@ -1,9 +1,6 @@ package com.dy.pipIrrMwTestWeb.test; import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.CommandType; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import com.dy.common.mw.protocol.p206V1_0_0.ProtocolConstantV206V1_0_0; import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com97Vo; import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com98Vo; import com.dy.common.webUtil.BaseResponse; pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/controller/ControllerCtrl.java
@@ -205,9 +205,9 @@ public BaseResponse<JSONArray> getNoBindingIntakes() { try { JSONArray array = controllerSv.getNoBindingIntakes(); if (array.size() <= 0) { return BaseResponseUtils.buildFail(ProjectResultCode.NO_BINDING_INTAKE.getMessage()); } // if (array.size() <= 0) { // return BaseResponseUtils.buildFail(ProjectResultCode.NO_BINDING_INTAKE.getMessage()); // } return BaseResponseUtils.buildSuccess(array); } catch (Exception e) { log.error("查询控制器异常", e); pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/controller/ControllerSv.java
@@ -165,4 +165,24 @@ } return array; } /** * 根据控制器编号物理删除控制 *2024-6-7 * @param controllerId * @return */ public Integer deleteControllerByIdTwo(Long controllerId) { return prControllerMapper.deleteByPrimaryKey(controllerId); } /** * 根据主键查询控制器列表 *2024-6-7 * @param controllerId * @return */ public PrController getByControllerId(Long controllerId) { return prControllerMapper.selectByPrimaryKey(controllerId); } } pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intake/IntakeCtrl.java
@@ -9,7 +9,9 @@ import com.dy.common.webUtil.ResultCodeMsg; import com.dy.pipIrrGlobal.pojoPr.PrIntake; import com.dy.pipIrrGlobal.voPr.VoIntake; import com.dy.pipIrrGlobal.voPr.VoOnLineIntake; import com.dy.pipIrrGlobal.voSe.VoActiveCard; import com.dy.pipIrrProject.intake.qo.OnLineIntakesQO; import com.dy.pipIrrProject.result.ProjectResultCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -276,4 +278,38 @@ String fileName = URLEncoder.encode(rawFileName, "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); } /** * 获取取水口列表(在线和不在线) * @param qo * @return */ @GetMapping(path = "all_intakes") @SsoAop() public BaseResponse<QueryResultVo<List<VoOnLineIntake>>> getAllIntakes(OnLineIntakesQO qo) { try { QueryResultVo<List<VoOnLineIntake>> res = intakeSv.selectOnLineIntakes(qo); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("查询取水口异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } /** * 根据操作员获取常用取水口(在线和不在线) * @param operator * @return */ @GetMapping(path = "used_intakes") @SsoAop() public BaseResponse<List<VoOnLineIntake>> getUsedIntakes(Long operator) { try { List<VoOnLineIntake> res = intakeSv.getUsedIntakes(operator); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("查询取水口异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } } pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intake/IntakeSv.java
@@ -1,19 +1,30 @@ package com.dy.pipIrrProject.intake; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.dy.common.mw.protocol.Command; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.daoPr.PrDivideMapper; import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper; import com.dy.pipIrrGlobal.pojoPr.PrIntake; import com.dy.pipIrrGlobal.voPr.VoIntake; import com.dy.pipIrrGlobal.voPr.VoOnLineIntake; import com.dy.pipIrrProject.intake.qo.OnLineIntakesQO; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.utils.PojoUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.*; /** * @author wuzeyu @@ -27,8 +38,15 @@ public class IntakeSv { @Autowired private PrIntakeMapper prIntakeMapper; @Autowired private PrDivideMapper prDivideMapper; @Autowired private RestTemplate restTemplate; protected static String mwUrlSendCom = "http://127.0.0.1:8070/rtuMw/com/send" ; /** * 添加取水口 @@ -179,4 +197,93 @@ public int getLevelByRegionId(long regionId) { return prIntakeMapper.getLevelByRegionId(regionId); } /** * 获取取水口列表 * @return */ public QueryResultVo<List<VoOnLineIntake>> selectOnLineIntakes(OnLineIntakesQO qo) { Command com = new Command() ; com.id = Command.defaultId; com.code = "LCD0001"; com.type = "innerCommand"; JSONObject response = (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response != null && response.getString("code").equals("0001")) { JSONObject attachment = response.getJSONObject("content").getJSONObject("attachment").getJSONObject("onLineMap"); HashMap<String, Boolean> onLineMap = JSON.parseObject(attachment.toJSONString(), HashMap.class); JSONArray jsonArray = new JSONArray(); for (Map.Entry<String, Boolean> entry : onLineMap.entrySet()) { JSONObject jsonObject = new JSONObject(); jsonObject.put("rtuAddr", entry.getKey()); jsonObject.put("isOnLine", entry.getValue()); jsonArray.add(jsonObject); } qo.setOnLineMap(jsonArray.toJSONString()); Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(qo) ; Long itemTotal = prIntakeMapper.getOnLineIntakesCount(params); QueryResultVo<List<VoOnLineIntake>> rsVo = new QueryResultVo<>() ; rsVo.pageSize = qo.pageSize ; rsVo.pageCurr = qo.pageCurr ; rsVo.calculateAndSet(itemTotal, params); rsVo.obj = prIntakeMapper.getOnLineIntakes(params); return rsVo; } else { QueryResultVo<List<VoOnLineIntake>> rsVo = new QueryResultVo<>(); return rsVo; } } /** * 根据操作员获取常用取水口 * @param operator * @return */ public List<VoOnLineIntake> getUsedIntakes(Long operator) { Command com = new Command() ; com.id = Command.defaultId; com.code = "LCD0001"; com.type = "innerCommand"; JSONObject response = (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response != null && response.getString("code").equals("0001")) { JSONObject attachment = response.getJSONObject("content").getJSONObject("attachment").getJSONObject("onLineMap"); HashMap<String, Boolean> onLineMap = JSON.parseObject(attachment.toJSONString(), HashMap.class); JSONArray jsonArray = new JSONArray(); for (Map.Entry<String, Boolean> entry : onLineMap.entrySet()) { JSONObject jsonObject = new JSONObject(); jsonObject.put("rtuAddr", entry.getKey()); jsonObject.put("isOnLine", entry.getValue()); jsonArray.add(jsonObject); } return prIntakeMapper.getUsedIntakes(jsonArray.toJSONString(), operator); } else { return new ArrayList<>(); } } /** * 发送命令 * @return */ protected BaseResponse sendCom2Mw(Command com){ String url = UriComponentsBuilder.fromUriString(mwUrlSendCom) .build() .toUriString(); HttpHeaders headers = new HttpHeaders(); HttpEntity<Command> httpEntity = new HttpEntity<>(com, headers); ResponseEntity<BaseResponse> response = null; try { // 通过Post方式调用接口 response = restTemplate.exchange(url, HttpMethod.POST, httpEntity, BaseResponse.class); } catch (Exception e) { e.printStackTrace(); } return response.getBody(); } } pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intake/qo/OnLineIntakesQO.java
New file @@ -0,0 +1,33 @@ package com.dy.pipIrrProject.intake.qo; import com.dy.common.webUtil.QueryConditionVo; import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-05-27 20:32 * @LastEditTime 2024-05-27 20:32 * @Description */ @Data public class OnLineIntakesQO extends QueryConditionVo { /** * 中间件返回的RTU在线情况对象数组 */ private String onLineMap; /** * 取水口编号 */ private String intakeNum; /** * 是否在线 */ @Max(value = 1,message = "是否在线仅允许为真或假") @Min(value = 0,message = "是否在线仅允许为真或假") private Boolean isOnLine; } pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intakeController/DtoIntakeController.java
@@ -36,7 +36,7 @@ * 备注信息 */ @Schema(description = "备注", requiredMode = Schema.RequiredMode.NOT_REQUIRED) @Length(message = "备注长度小于{max}字", min = 1, max = 200) @Length(message = "备注长度小于{max}字", max = 200) private String remarks; /** pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intakeController/IntakeControllerCtrl.java
@@ -113,17 +113,18 @@ if (rec_addController == 0) { return BaseResponseUtils.buildFail(ProjectResultCode.BIND_FAIL.getMessage()); } // if (remarks != null || remarks !=""){ // // 修改绑定记录 // PrIntakeController prIntakeController = new PrIntakeController(); // prIntakeController.setRemarks(remarks); // prIntakeController.setIntakeid(intakeId); // // Integer rec = Optional.ofNullable(intakeControllerSv.updateBindRecord(prIntakeController)).orElse(0); // if (rec == 0) { // return BaseResponseUtils.buildFail(ProjectResultCode.BIND_FAIL.getMessage()); // } // } // 修改绑定记录 PrIntakeController prIntakeController = new PrIntakeController(); prIntakeController.setRemarks(remarks); prIntakeController.setIntakeid(intakeId); Integer rec = Optional.ofNullable(intakeControllerSv.updateBindRecord(prIntakeController)).orElse(0); if (rec == 0) { return BaseResponseUtils.buildFail(ProjectResultCode.BIND_FAIL.getMessage()); } // 根据流浪控制器编号删除流浪控制器记录 intakeControllerSv.deleteTrampController(trampControllerId); @@ -176,13 +177,23 @@ Date operateTime = new Date(); prIntakeController.setOperatedt(operateTime); prIntakeController.setOperatetype((byte) 2); prIntakeController.setRemarks("解绑"); Integer rec = Optional.ofNullable(intakeControllerSv.addRecord(prIntakeController)).orElse(0); if (rec == 0) { return BaseResponseUtils.buildFail(ProjectResultCode.BIND_FAIL.getMessage()); } // 删除控制器外键 Integer rec_deleteIntakeId = Optional.ofNullable(controllerSv.deleteIntakeId(po.getControllerId())).orElse(0); //添加到流浪控制器 PrController ControllerList = controllerSv.getByControllerId(po.getControllerId()); PrControllerTramp prControllerTramp = new PrControllerTramp(); prControllerTramp.setRtuAddr(ControllerList.getRtuAddr()); prControllerTramp.setProtocol(ControllerList.getProtocol()); prControllerTramp.setFindDt(new Date()); Integer rec_addControllerTramp = Optional.ofNullable(intakeControllerSv.addTrampController(prControllerTramp)).orElse(0); if (rec_addControllerTramp == 0) { return BaseResponseUtils.buildFail(ProjectResultCode.ADD_TRAMP_CONTROLLER_FAIL.getMessage()); } // 删除控制器 Integer rec_deleteIntakeId = Optional.ofNullable(controllerSv.deleteControllerByIdTwo(po.getControllerId())).orElse(0); if (rec_deleteIntakeId == 0) { return BaseResponseUtils.buildFail(ProjectResultCode.BIND_FAIL.getMessage()); } pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/ComSupport.java
File was deleted pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandResultCtrl.java
@@ -3,6 +3,7 @@ import com.dy.common.mw.protocol.Data; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.command.ComSupport; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; @@ -25,10 +26,11 @@ public class CommandResultCtrl extends ComSupport { @PostMapping(path = "receive", consumes = MediaType.APPLICATION_JSON_VALUE) public BaseResponse<String> receive(@RequestBody Data data) { String comId = "0"; Long comId = 0L; if(data.getCommandId() != null) { comId = data.getCommandId(); comId = Long.parseLong(data.getCommandId()); } CompletableFuture<Data> feature = (CompletableFuture<Data>) features.get(comId); if(feature != null) { feature.complete(data); pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java
@@ -5,18 +5,19 @@ import com.alibaba.fastjson2.JSONObject; import com.dy.common.mw.protocol.Command; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.daoPr.PrControllerMapper; import com.dy.pipIrrGlobal.command.ComSupport; import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper; import com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper; import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper; import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper; import com.dy.pipIrrGlobal.pojoPr.PrController; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import com.dy.pipIrrGlobal.voPr.VoOnLineIntake; import com.dy.pipIrrGlobal.voRm.VoUnclosedParam; import com.dy.pipIrrGlobal.voRm.VoUnclosedValve; import com.dy.pipIrrRemote.common.qo.OnLineIntakesQO; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.utils.PojoUtils; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -36,26 +37,26 @@ @RequiredArgsConstructor public class CommandSv extends ComSupport { private final RmCommandHistoryMapper rmCommandHistoryMapper; private final PrControllerMapper prControllerMapper; private final SeVirtualCardMapper seVirtualCardMapper; private final PrIntakeMapper prIntakeMapper; private final PrWaterPriceMapper prWaterPriceMapper; private final PrIntakeVcMapper prIntakeVcMapper; /** * 根据取水口ID获取阀控器对象 * @param intakeId * 虚拟卡ID换虚拟卡对象 * @param vcId * @return */ public PrController getControllerByIntakeId(Long intakeId) { return prControllerMapper.getControllerByIntakeId(intakeId); public VoVirtualCard getVcById(Long vcId) { return seVirtualCardMapper.getVcById(vcId); } /** * 根据RTU地址获取阀控器对象 * @param rtuAddr * 获取水价 * @return */ public PrController getControllerByRtuAddr(String rtuAddr) { return prControllerMapper.getControllerByRtuAddr(rtuAddr); public Double getPrice() { return prWaterPriceMapper.getPrice(); } /** @@ -75,75 +76,6 @@ */ public Integer update(RmCommandHistory po) { return rmCommandHistoryMapper.updateByPrimaryKeySelective(po); } /** * 获取取水口列表 * @return */ public QueryResultVo<List<VoOnLineIntake>> selectOnLineIntakes(OnLineIntakesQO qo) { Command com = new Command() ; com.id = Command.defaultId; com.code = "LCD0001"; com.type = "innerCommand"; JSONObject response = (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response != null && response.getString("code").equals("0001")) { JSONObject attachment = response.getJSONObject("content").getJSONObject("attachment").getJSONObject("onLineMap"); HashMap<String, Boolean> onLineMap = JSON.parseObject(attachment.toJSONString(), HashMap.class); JSONArray jsonArray = new JSONArray(); for (Map.Entry<String, Boolean> entry : onLineMap.entrySet()) { JSONObject jsonObject = new JSONObject(); jsonObject.put("rtuAddr", entry.getKey()); jsonObject.put("isOnLine", entry.getValue()); jsonArray.add(jsonObject); } qo.setOnLineMap(jsonArray.toJSONString()); Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(qo) ; Long itemTotal = prIntakeMapper.getOnLineIntakesCount(params); QueryResultVo<List<VoOnLineIntake>> rsVo = new QueryResultVo<>() ; rsVo.pageSize = qo.pageSize ; rsVo.pageCurr = qo.pageCurr ; rsVo.calculateAndSet(itemTotal, params); rsVo.obj = prIntakeMapper.getOnLineIntakes(params); return rsVo; } else { QueryResultVo<List<VoOnLineIntake>> rsVo = new QueryResultVo<>(); return rsVo; } } /** * 根据操作员获取常用取水口 * @param operator * @return */ public List<VoOnLineIntake> getUsedIntakes(Long operator) { Command com = new Command() ; com.id = Command.defaultId; com.code = "LCD0001"; com.type = "innerCommand"; JSONObject response = (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response != null && response.getString("code").equals("0001")) { JSONObject attachment = response.getJSONObject("content").getJSONObject("attachment").getJSONObject("onLineMap"); HashMap<String, Boolean> onLineMap = JSON.parseObject(attachment.toJSONString(), HashMap.class); JSONArray jsonArray = new JSONArray(); for (Map.Entry<String, Boolean> entry : onLineMap.entrySet()) { JSONObject jsonObject = new JSONObject(); jsonObject.put("rtuAddr", entry.getKey()); jsonObject.put("isOnLine", entry.getValue()); jsonArray.add(jsonObject); } return prIntakeMapper.getUsedIntakes(jsonArray.toJSONString(), operator); } else { return new ArrayList<>(); } } /** @@ -171,6 +103,7 @@ jsonArray.add(jsonObject); } System.out.println(jsonArray); List<VoUnclosedValve> res = rmCommandHistoryMapper.getUnclosedValves(jsonArray.toJSONString(), operator); if(res != null) { return res; @@ -183,4 +116,30 @@ } } /** * 修改命令日志记录,回调报错时将命令记录的执行结果改为失败 * @param po * @return */ public Integer updateCommandResult(RmCommandHistory po) { return rmCommandHistoryMapper.updateByPrimaryKeySelective(po); } /** * 根据取水口ID获取与之绑定虚拟卡ID * @param intakeId * @return */ public Long getVcIdByIntakeId(Long intakeId) { return prIntakeVcMapper.getVcIdByIntakeId(intakeId); } /** * 根据取水口ID获取该取水口未关阀参数,平台选择取水口关阀使用 * @param intakeId * @return */ public VoUnclosedParam getUncloseParam(Long intakeId) { return rmCommandHistoryMapper.getUncloseParam(intakeId); } } pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/ValveClose.java
@@ -35,8 +35,8 @@ /** * 用户类型 1-平台,2-APP */ @NotNull(message = "操作类型不能为空") private Integer userType; //@NotNull(message = "操作类型不能为空") //private Integer userType; /** * 操作人 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/ValveOpen.java
@@ -1,6 +1,5 @@ package com.dy.pipIrrRemote.common.dto; import jakarta.validation.constraints.NotNull; import lombok.Data; /** @@ -22,6 +21,6 @@ /** * 用户类型 1-平台,2-APP */ @NotNull(message = "操作类型不能为空") private Integer userType; //@NotNull(message = "操作类型不能为空") //private Integer userType; } pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/enums/LastOperateENUM.java
New file @@ -0,0 +1,27 @@ package com.dy.pipIrrRemote.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * @author ZhuBaoMin * @date 2024-03-06 9:21 * @LastEditTime 2024-03-06 9:21 * @Description */ @Getter @AllArgsConstructor public enum LastOperateENUM { OPEN_ACCOUNT((byte)1, "开户"), RECHARGE((byte)2, "充值"), CONSUME((byte)3, "消费"), APPLY_REFUND((byte)4, "申请退款"), AUDIT_REFUND((byte)5, "退款审核"), REFUND((byte)6, "退款"), OPEN_VALVE((byte)7, "开阀"), CLOSE_VALVE((byte)8, "关阀"); private final Byte code; private final String message; } pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java
@@ -17,12 +17,15 @@ */ GET_RESULT_IN_ONE_MINUTE(10001,"1分钟后去查看结果"), GET_RESULT_ERROR(10002, "获取结果异常"), PLEASE_SELECT_A_VC(10003, "请选择一张虚拟卡"), IN_USE_VC_CANNOT_OPEN_VALVE(10004, "使用中虚拟卡不能用来开阀"), VALVE_CLOSED(10005, "该取水口已关阀"), /** * RTU */ RTU_NOT_EXIST(20001, "阀控器不存在"), RTU_ADDR_CANNOT_BE_NULL(20002, "阀控器地址不能为空"); RTU_NOT_EXIST(20001, "阀控器不存在"); //RTU_ADDR_CANNOT_BE_NULL(20002, "阀控器地址不能为空"); private final Integer code; private final String message; pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java
@@ -5,21 +5,20 @@ import com.dy.common.aop.SsoAop; import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.Data; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com97Vo; import com.dy.common.mw.protocol.p206V202404.CodeV202404; import com.dy.common.mw.protocol.p206V202404.downVos.ComCd10Vo; import com.dy.common.mw.protocol.p206V202404.downVos.ComCdXyVo; import com.dy.common.util.IDLongGenerator; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.pojoPr.PrController; import com.dy.pipIrrGlobal.command.ComSupport; import com.dy.pipIrrGlobal.command.dto.Param; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import com.dy.pipIrrGlobal.voPr.VoOnLineIntake; import com.dy.pipIrrRemote.common.ComSupport; import com.dy.pipIrrRemote.common.CommandSv; import com.dy.pipIrrRemote.common.dto.Addr; import com.dy.pipIrrRemote.common.dto.DtoBase; import com.dy.pipIrrRemote.common.qo.OnLineIntakesQO; import com.dy.pipIrrRemote.result.RemoteResultCode; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -29,12 +28,7 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** * @author ZhuBaoMin @@ -52,58 +46,7 @@ protected static String controllerType = "57"; private final IDLongGenerator idLongGenerator; /** * 查询所有RTU在线情况(仅测试用) * @return */ @GetMapping(path = "get_online") @SsoAop() public BaseResponse<Boolean> get_online() { Command com = new Command() ; com.id = Command.defaultId; com.code = "LCD0001"; com.type = "innerCommand"; JSONObject response = (JSONObject)JSON.toJSON(sendCom2Mw(com)); JSONObject attachment = response.getJSONObject("content").getJSONObject("attachment"); return BaseResponseUtils.buildSuccess(attachment) ; } /** * 获取取水口列表(在线和不在线) * @param qo * @return */ @GetMapping(path = "get_online_intakes") @SsoAop() public BaseResponse<QueryResultVo<List<VoOnLineIntake>>> getOnLineIntakes(OnLineIntakesQO qo) { try { QueryResultVo<List<VoOnLineIntake>> res = commandSv.selectOnLineIntakes(qo); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("查询取水口异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } /** * 根据操作员获取常用取水口 * @param operator * @return */ @GetMapping(path = "used_intakes") @SsoAop() public BaseResponse<List<VoOnLineIntake>> getUsedIntakes(Long operator) { try { List<VoOnLineIntake> res = commandSv.getUsedIntakes(operator); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("查询取水口异常", e); return BaseResponseUtils.buildException(e.getMessage()); } } private String rtuResultSendWebUrl = "http://127.0.0.1:8081/remote/comRes/receive" ; /** * 设置设备终端地址 @@ -122,55 +65,101 @@ Long intakeId = addr.getIntakeId(); String newRtuAddr = addr.getNewRtuAddr(); Long operator = addr.getOperator(); String commandCode = CodeV202404.cd_10; Long comId = idLongGenerator.generate(); // 获取系统参数 if(!setuped) { setUp(); } // 取水口ID换阀控器地址及通讯协议 PrController prController = commandSv.getControllerByIntakeId(intakeId); if(prController == null) { JSONObject job_rtu = getRtu(intakeId, null); if(job_rtu == null) { return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage()); } String rtuAddr = prController.getRtuAddr(); String protocol = prController.getProtocol(); String rtuAddr = job_rtu.getString("rtuAddr"); String protocol = job_rtu.getString("protocol"); // 创建视图 ComCd10Vo param = new ComCd10Vo() ; param.controllerType = controllerType; param.projectNo =projectNo; param.rtuNewAddr = newRtuAddr; String commandCode = null; if(protocol.equals("p206V202404")) { // 获取功能码 commandCode = CodeV202404.cd_10; // 创建命令日志对象并添加到数据库中 RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator); comId = commandSv.insert(rmCommandHistory); System.out.println(comId); // 创建视图 ComCd10Vo param = new ComCd10Vo() ; param.controllerType = controllerType; param.projectNo =projectNo; param.rtuNewAddr = newRtuAddr; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, param); sendCom2Mw(com); // 发送命令并处理请求结果及执行结果 Param po = new Param(); po.setComId(comId); po.setCommandCode(commandCode); po.setIntakeId(intakeId); po.setRtuAddr(rtuAddr); po.setProtocol(protocol); po.setParam(param); po.setRtuResultSendWebUrl(rtuResultSendWebUrl); po.setOperator(operator); return dealWithCommandResult(po); } else if(protocol.equals("p206V1_0_1")) { // 获取功能码 commandCode = CodeV1_0_1.cd_10; CompletableFuture<Data> featureObject = new CompletableFuture<>(); features.put(comId, featureObject); try { CompletableFuture<Data> feature = (CompletableFuture<Data>) features.get(comId); Data resultData = feature.get(30, TimeUnit.SECONDS); features.remove(comId); String commandId = resultData.getCommandId(); if(commandId.equals(comId)) { //futureValue = new CompletableFuture<>(); return BaseResponseUtils.buildSuccess((JSONObject)JSON.toJSON(resultData.subData)); // 创建视图 Com97Vo param = new Com97Vo() ; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV1_0_1.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); //回调失败 if(!response_CallBack.getCode().equals("0001")) { // 命令日志执行结果改为失败 rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.updateCommandResult(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getMsg()); //return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功,返回回调内容 */ Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } catch (TimeoutException e) { return BaseResponseUtils.buildFail("1分钟后去查看结果"); } else { return BaseResponseUtils.buildFail("系统暂不支持该协议"); } //return BaseResponseUtils.buildSuccess(resultData.toJson()); return BaseResponseUtils.buildSuccess() ; } /** @@ -193,12 +182,14 @@ Long comId = idLongGenerator.generate(); // 取水口ID换阀控器地址及通讯协议 PrController prController = commandSv.getControllerByIntakeId(intakeId); if(prController == null) { return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage()); } String rtuAddr = prController.getRtuAddr(); String protocol = prController.getProtocol(); //PrController prController = commandSv.getControllerByIntakeId(intakeId); //if(prController == null) { // return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage()); //} //String rtuAddr = prController.getRtuAddr(); //String protocol = prController.getProtocol(); String rtuAddr = ""; String protocol = ""; // 创建视图 ComCdXyVo param = new ComCdXyVo(); @@ -206,11 +197,11 @@ param.projectNo = projectNo; // 创建命令日志对象并添加到数据库中 RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, "",intakeId, rtuAddr, protocol, param, operator); comId = commandSv.insert(rmCommandHistory); // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, param); Command com = command(comId, commandCode,"", rtuAddr, protocol, param); return sendCom2Mw(com); } } pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java
@@ -5,26 +5,28 @@ import com.dy.common.aop.SsoAop; import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.Data; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com97Vo; import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com98Vo; import com.dy.common.mw.protocol.p206V202404.CodeV202404; import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo; import com.dy.common.mw.protocol.p206V202404.downVos.ComCd93_A3Vo; import com.dy.common.util.IDLongGenerator; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; import com.dy.pipIrrGlobal.command.ComSupport; import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper; import com.dy.pipIrrGlobal.pojoPr.PrController; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; import com.dy.pipIrrGlobal.voRm.VoUnclosedParam; import com.dy.pipIrrGlobal.voRm.VoUnclosedValve; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import com.dy.pipIrrRemote.common.ComSupport; import com.dy.pipIrrRemote.common.CommandSv; import com.dy.pipIrrRemote.common.dto.DtoBase; import com.dy.pipIrrRemote.common.dto.ValveClose; import com.dy.pipIrrRemote.common.dto.ValveOpen; import com.dy.pipIrrRemote.common.enums.LastOperateENUM; import com.dy.pipIrrRemote.result.RemoteResultCode; import com.dy.pipIrrRemote.utils.RestTemplateUtils; import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -34,12 +36,10 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Random; /** * @author ZhuBaoMin @@ -49,19 +49,18 @@ */ @Slf4j @Tag(name = "阀门管理", description = "阀门操作") @Tag(name = "平台阀控器控制", description = "平台阀控器控制") @RestController @RequestMapping(path="valve") @RequiredArgsConstructor public class ValveCtrl extends ComSupport { private final RestTemplateUtils restTemplateUtils; private final CommandSv commandSv; private final SeVirtualCardMapper seVirtualCardMapper; private final PrWaterPriceMapper prWaterPriceMapper; private final IDLongGenerator idLongGenerator; private String rtuResultSendWebUrl = "http://127.0.0.1:8081/remote/comRes/receive" ; /** * 远程开阀(平台、APP) * 平台远程开阀 * @param valve * @param bindingResult * @return @@ -77,9 +76,20 @@ Long intakeId = valve.getIntakeId(); Long vcId = valve.getVcId(); Integer userType = valve.getUserType(); Long operator = valve.getOperator(); Long comId = idLongGenerator.generate(); /** * 如果农户选择了虚拟卡,则使用该虚拟卡 * 如果农户未选择虚拟卡,则根据取水口ID获取与之绑定的虚拟卡 * 如果取水口没有与之绑定的虚拟卡,则提示农户选择一张虚拟卡 */ if(vcId == null) { vcId = commandSv.getVcIdByIntakeId(intakeId); if(vcId == null) { return BaseResponseUtils.buildFail(RemoteResultCode.PLEASE_SELECT_A_VC.getMessage()); } } // 获取系统参数 if(!setuped) { @@ -87,39 +97,32 @@ } // 虚拟卡ID换虚拟卡对象 VoVirtualCard vc = seVirtualCardMapper.getVcById(vcId); VoVirtualCard vc = commandSv.getVcById(vcId); if(vc == null) { return BaseResponseUtils.buildFail(RemoteResultCode.PLEASE_SELECT_A_VC.getMessage()); } if(vc.getInUse() == 1) { return BaseResponseUtils.buildFail(RemoteResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage()); } // 获取水价 Double waterPrice = prWaterPriceMapper.getPrice(); Double waterPrice = commandSv.getPrice(); // 取水口ID换阀控器地址及通讯协议 PrController prController = commandSv.getControllerByIntakeId(intakeId); if(prController == null) { JSONObject job_rtu = getRtu(intakeId, null); if(job_rtu == null) { return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage()); } String rtuAddr = prController.getRtuAddr(); String protocol = prController.getProtocol(); String rtuAddr = job_rtu.getString("rtuAddr"); String protocol = job_rtu.getString("protocol"); // 生成订单号 LocalDateTime dateTime = LocalDateTime.now(); Random random = new Random(); String CHARACTERS = "0123456789"; StringBuilder sb = new StringBuilder(4); for (int i = 0; i < 4; i++) { int index = random.nextInt(CHARACTERS.length()); sb.append(CHARACTERS.charAt(index)); } String orderNo = dtf.format(dateTime) + sb.toString(); String orderNo = generateOrderNo(); String commandCode = null; if(protocol.equals("p206V202404")) { // 获取功能码 if(userType == 1) { // 平台开阀 commandCode = CodeV202404.cd_92; }else { // APP开阀 commandCode = CodeV202404.cd_A2; } commandCode = CodeV202404.cd_92; // 创建视图 ComCd92_A2Vo param = new ComCd92_A2Vo(); @@ -133,25 +136,152 @@ param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, param); Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator); String commandName = CodeV202404.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调失败 if(!response_CallBack.getCode().equals("0001")) { return BaseResponseUtils.buildError(RemoteResultCode.GET_RESULT_ERROR.getMessage()); // 命令日志执行结果改为失败 //rmCommandHistory = new RmCommandHistory(); //rmCommandHistory.setId(comId); //rmCommandHistory.setResult((byte)0); //commandSv.updateCommandResult(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getMsg()); //return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 1); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 //Data myData = (Data)response_CallBack.getContent(); //return BaseResponseUtils.buildSuccess(myData); JSONObject job_response = new JSONObject(); job_response.put("rtuAddr", rtuAddr); job_response.put("vcNum", vc.getVcNum()); job_response.put("orderNo", orderNo); //job_response.put("operator", operator); return BaseResponseUtils.buildSuccess(job_response); } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else if(protocol.equals("p206V1_0_1")) { // 获取功能码 commandCode = CodeV1_0_1.cd_92; // 创建视图 Com97Vo param = new Com97Vo() ; param.icCardNo = vc.getVcNum(); param.moneyRemain = vc.getMoney(); param.waterPrice = waterPrice; param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV1_0_1.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); //回调异常 if(!response_CallBack.getCode().equals("0001")) { // 命令日志执行结果改为失败 rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.updateCommandResult(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 回调超时 if(response_CallBack.getContent().toString().equals(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) { /** * 回调超时,暂时认为执行失败 * 命令置为失败 * 虚拟卡依旧保持使用中的状态 * 不返回关阀参数 */ rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.updateCommandResult(rmCommandHistory); //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 1); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); //JSONObject job_response = new JSONObject(); //job_response.put("message", RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage()); //job_response.put("rtuAddr", rtuAddr); //job_response.put("vcNum", vc.getVcNum()); //job_response.put("orderNo", orderNo); //return BaseResponseUtils.buildSuccess(job_response); return BaseResponseUtils.buildFail(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ SeVirtualCard virtualCard = new SeVirtualCard(); virtualCard.setId(vcId); virtualCard.setInUse((byte) 1); @@ -160,40 +290,29 @@ seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; //Data myData = (Data)response_CallBack.getContent(); //return BaseResponseUtils.buildSuccess(myData) ; JSONObject job_response = new JSONObject(); job_response.put("message", "ok"); job_response.put("rtuAddr", rtuAddr); job_response.put("vcNum", vc.getVcNum()); job_response.put("orderNo", orderNo); //job_response.put("operator", operator); return BaseResponseUtils.buildSuccess(job_response); } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else { // 获取功能码 if(userType == 1) { // 平台开阀 commandCode = "92"; }else { // APP开阀 commandCode = "97"; } // 创建视图 ComCd92_A2Vo param = new ComCd92_A2Vo(); // 创建命令日志对象并添加到数据库中 //RmCommandHistory rmCommandHistory = getComHistory(commandCode, rtuAddr, protocol, param, operator); //comId = commandSv.insert(rmCommandHistory); // 构造并发送命令 Command com = command(comId, commandCode, rtuAddr, protocol, param); sendCom2Mw(com); return BaseResponseUtils.buildSuccess(); return BaseResponseUtils.buildFail("系统暂不支持该协议"); } } /** * 远程关阀(平台、APP) * 平台远程关阀_参数模式 * @param valve * @param bindingResult * @return @@ -210,7 +329,6 @@ String rtuAddr = valve.getRtuAddr(); String vcNum = valve.getVcNum(); String orderNo = valve.getOrderNo(); Integer userType = valve.getUserType(); Long operator = valve.getOperator(); Long comId = idLongGenerator.generate(); @@ -220,23 +338,17 @@ } // 阀控器地址换取水口ID和通讯协议 PrController prController = commandSv.getControllerByRtuAddr(rtuAddr); if(prController == null) { JSONObject job_rtu = getRtu(null, rtuAddr); if(job_rtu == null) { return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage()); } Long intakeId = prController.getIntakeId(); String protocol = prController.getProtocol(); Long intakeId = job_rtu.getLong("intakeId"); String protocol = job_rtu.getString("protocol"); String commandCode = null; if(protocol.equals("p206V202404")) { // 获取功能码 if (userType == 1) { // 平台关阀 commandCode = CodeV202404.cd_93; } else { // APP关阀 commandCode = CodeV202404.cd_A3; } commandCode = CodeV202404.cd_93; // 创建视图 ComCd93_A3Vo param = new ComCd93_A3Vo(); @@ -246,7 +358,7 @@ param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, param); Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); @@ -254,20 +366,131 @@ // 请求成功 // 创建命令日志对象并添加到数据库中 RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator); String commandName = CodeV202404.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调失败 if(!response_CallBack.getCode().equals("0001")) { return BaseResponseUtils.buildError(RemoteResultCode.GET_RESULT_ERROR.getMessage()); // 命令日志执行结果改为失败 //rmCommandHistory = new RmCommandHistory(); //rmCommandHistory.setId(comId); //rmCommandHistory.setResult((byte)0); //commandSv.updateCommandResult(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getMsg()); //return BaseResponseUtils.buildError(WechatResultCode.GET_RESULT_ERROR.getMessage()); } // 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 0); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else if(protocol.equals("p206V1_0_1")) { // 获取功能码 commandCode = CodeV1_0_1.cd_93; // 创建视图 Com98Vo param = new Com98Vo() ; param.icCardNo = vcNum; param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV1_0_1.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调异常 if(!response_CallBack.getCode().equals("0001")) { // 命令日志执行结果改为失败 rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.updateCommandResult(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 回调超时 if(response_CallBack.getContent().toString().equals(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) { /** * 回调超时,暂时认为执行失败 * 命令置为失败 * 虚拟卡依旧保持使用中的状态 */ rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.updateCommandResult(rmCommandHistory); //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 0); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); return BaseResponseUtils.buildFail(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); SeVirtualCard virtualCard = new SeVirtualCard(); virtualCard.setId(vcId); virtualCard.setInUse((byte) 1); virtualCard.setInUse((byte) 0); virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); virtualCard.setLastOperateTime(new Date()); seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); @@ -281,14 +504,54 @@ return BaseResponseUtils.buildFail(job_param.getString("message")); } } else { return BaseResponseUtils.buildFail("系统暂不支持该协议"); } } /** * 平台远程关阀_取水口模式 * @param dtoBase * @param bindingResult * @return */ @PostMapping(path = "close_intake", consumes = MediaType.APPLICATION_JSON_VALUE) @Transactional(rollbackFor = Exception.class) @SsoAop() public BaseResponse<Boolean> closeByIntake(@RequestBody @Valid DtoBase dtoBase, BindingResult bindingResult) { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss"); if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } Long intakeId = dtoBase.getIntakeId(); Long operator = dtoBase.getOperator(); VoUnclosedParam voUnclosedParam = commandSv.getUncloseParam(intakeId); if(voUnclosedParam == null) { return BaseResponseUtils.buildSuccess(RemoteResultCode.VALVE_CLOSED.getMessage()); } String rtuAddr = voUnclosedParam.getRtuAddr(); String vcNum = voUnclosedParam.getVcNum(); String orderNo = voUnclosedParam.getOrderNo(); Long comId = idLongGenerator.generate(); // 获取系统参数 if(!setuped) { setUp(); } // 阀控器地址换取水口ID和通讯协议 JSONObject job_rtu = getRtu(null, rtuAddr); if(job_rtu == null) { return BaseResponseUtils.buildError(RemoteResultCode.RTU_NOT_EXIST.getMessage()); } //Long intakeId = job_rtu.getLong("intakeId"); String protocol = job_rtu.getString("protocol"); String commandCode = null; if(protocol.equals("p206V202404")) { // 获取功能码 if (userType == 1) { // 平台关阀 commandCode = "93"; } else { // APP关阀 commandCode = "98"; } commandCode = CodeV202404.cd_93; // 创建视图 ComCd93_A3Vo param = new ComCd93_A3Vo(); @@ -297,32 +560,155 @@ param.icCardNo = vcNum; param.orderNo = orderNo; // 创建命令日志对象并添加到数据库中 RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator); comId = commandSv.insert(rmCommandHistory); // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 构造并发送命令 Command com = command(comId, commandCode, rtuAddr, protocol, param); sendCom2Mw(com); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV202404.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调失败 if(!response_CallBack.getCode().equals("0001")) { // 命令日志执行结果改为失败 //rmCommandHistory = new RmCommandHistory(); //rmCommandHistory.setId(comId); //rmCommandHistory.setResult((byte)0); //commandSv.updateCommandResult(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getMsg()); //return BaseResponseUtils.buildError(WechatResultCode.GET_RESULT_ERROR.getMessage()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 0); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else if(protocol.equals("p206V1_0_1")) { // 获取功能码 commandCode = CodeV1_0_1.cd_93; // 创建视图 Com98Vo param = new Com98Vo() ; param.icCardNo = vcNum; param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV1_0_1.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调异常 if(!response_CallBack.getCode().equals("0001")) { // 命令日志执行结果改为失败 rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.updateCommandResult(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 回调超时 if(response_CallBack.getContent().toString().equals(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) { /** * 回调超时,暂时认为执行失败 * 命令置为失败 * 虚拟卡依旧保持使用中的状态 */ rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.updateCommandResult(rmCommandHistory); //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 0); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); return BaseResponseUtils.buildFail(RemoteResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); SeVirtualCard virtualCard = new SeVirtualCard(); virtualCard.setId(vcId); virtualCard.setInUse((byte) 0); virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); virtualCard.setLastOperateTime(new Date()); seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else { return BaseResponseUtils.buildFail("系统暂不支持该协议"); } // 处理回调 BaseResponse response = dealWithCallBack(comId); if(!response.getCode().equals("0001")) { return BaseResponseUtils.buildError(RemoteResultCode.GET_RESULT_ERROR.getMessage()); } // 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); SeVirtualCard virtualCard = new SeVirtualCard(); virtualCard.setId(vcId); virtualCard.setInUse((byte) 0); virtualCard.setLastOperate(LastOperateENUM.CLOSE_VALVE.getCode()); virtualCard.setLastOperateTime(new Date()); seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); Data myData = (Data)response.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } /** pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/dto/DTOValve.java
File was deleted pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/PipIrrSellApplication.java
@@ -27,7 +27,7 @@ }) } ) @MapperScan({"com.dy.pipIrrGlobal.daoSe", "com.dy.pipIrrGlobal.daoBa"}) @MapperScan({"com.dy.pipIrrGlobal.daoSe", "com.dy.pipIrrGlobal.daoBa", "com.dy.pipIrrGlobal.daoPr"}) public class PipIrrSellApplication { public static void main(String[] args) { pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/activeCard/ActiveCardCtrl.java
@@ -15,6 +15,7 @@ import com.dy.pipIrrSell.clientCard.LastOperateENUM; import com.dy.pipIrrSell.recharge.DtoRecharge; import com.dy.pipIrrSell.recharge.RechargeCtrl; import com.dy.pipIrrSell.recharge.RechargeSv; import com.dy.pipIrrSell.result.SellResultCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -48,6 +49,8 @@ private final ActiveCardSv activeCardSv; private final ClientCardSv clientCardSv; private final RechargeCtrl rechargeCtrl; private final RechargeSv rechargeSv; //@Value("${projectCode.ym}") //private Integer projectCode; @@ -223,6 +226,12 @@ } Map map = new HashMap(); if(amount != null && amount > 0) { Long rechargeId = rechargeSv.selectIdByCardId(cardId); map.put("orderNumber",rechargeId+"");//返回充值ID }else { map.put("orderNumber",rec+"");//返回开卡ID } //map.put("projectCode", projectCode); map.put("projectCode", Constant.projectCode_ym); map.put("cardNum", cardNum); pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientCtrl.java
@@ -13,6 +13,7 @@ import com.dy.pipIrrGlobal.pojoSe.SeCodeVerify; import com.dy.pipIrrGlobal.pojoSe.SeOpenId; import com.dy.pipIrrGlobal.voSe.VoClient; import com.dy.pipIrrGlobal.voSe.VoClientWechat; import com.dy.pipIrrSell.client.dto.CodeVerifyDTO; import com.dy.pipIrrSell.result.SellResultCode; import com.dy.pipIrrSell.sms.AliyunSmsSv; @@ -353,6 +354,55 @@ } /** * 根据村ID获取12位行政区划 * @param villageId * @return */ @Operation(summary = "根据村ID获取12位行政区划", description = "根据村ID获取12位行政区划") @ApiResponses(value = { @ApiResponse( responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, description = "操作结果:true:成功,false:失败(BaseResponse.content)", content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = Boolean.class))} ) }) @GetMapping(path = "district") @SsoAop() public BaseResponse<Boolean> getDistrictNum(@RequestParam("villageId") @NotNull(message = "村编号不能为空") Long villageId){ /** * 获取5级行政区划信息 */ Map map_districts = Optional.ofNullable(clientSv.getDistrictsByVillageId(villageId)).orElse(new HashMap()); if(map_districts.size() <= 0) { return BaseResponseUtils.buildFail("区划信息有误"); } String provinceNum = map_districts.get("provinceNum").toString(); String cityNum = map_districts.get("cityNum").toString(); String countyNum = map_districts.get("countyNum").toString(); String townNum = map_districts.get("townNum").toString(); String villageNum = map_districts.get("villageNum").toString(); // 生成12位5级行政区划编码串及名称串 Long districtNum = Long.parseLong(provinceNum + cityNum + countyNum + townNum + villageNum); //获取项目编码 String projectNo = clientSv.getItemValue("projectNo"); //转为int Integer projectNo1 = Integer.valueOf(projectNo); //转为16进制 // String projectNo2 = Integer.toHexString(projectNo1); // log.info(projectNo2); String projectNo3 = String.format("%02x", projectNo1); log.info(projectNo3); Map map = new HashMap(); map.put("districtNum", districtNum); map.put("projectNo",projectNo3); return BaseResponseUtils.buildSuccess(map); } /** * 发送验证码 * @param phoneNumber * @return @@ -479,51 +529,53 @@ } /** * 根据村ID获取12位行政区划 * @param villageId * 获取农户基本信息,小程序首页使用 * @param sessionId * @return */ @Operation(summary = "根据村ID获取12位行政区划", description = "根据村ID获取12位行政区划") @ApiResponses(value = { @ApiResponse( responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE, description = "操作结果:true:成功,false:失败(BaseResponse.content)", content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE, schema = @Schema(implementation = Boolean.class))} ) }) @GetMapping(path = "district") @GetMapping(path = "/simple_info") @SsoAop() public BaseResponse<Boolean> getDistrictNum(@RequestParam("villageId") @NotNull(message = "村编号不能为空") Long villageId){ /** * 获取5级行政区划信息 */ Map map_districts = Optional.ofNullable(clientSv.getDistrictsByVillageId(villageId)).orElse(new HashMap()); if(map_districts.size() <= 0) { return BaseResponseUtils.buildFail("区划信息有误"); public BaseResponse<VoClientWechat> getSimpleClientInfo(@RequestParam Long sessionId){ try { VoClientWechat res = clientSv.getSimpleClientInfo(sessionId, null); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("查询农户异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } /** * 登录凭证登录 * @param code 临时登录凭证 * @return */ @GetMapping(path = "/code_login") @SsoAop() public BaseResponse<VoClientWechat> codeLogin(@RequestParam String code) throws IOException { // 登录凭证校验 Map<String, Object> queryParams = new HashMap<>(); queryParams.put("appid", appid); queryParams.put("secret", secret); queryParams.put("js_code", code); queryParams.put("grant_type", grantType); Map<String, String> headerParams = new HashMap<>(); JSONObject job = restTemplateUtil.get(loginUrl, queryParams, headerParams); String openId = job.getString("openid"); if(openId == null) { return BaseResponseUtils.buildFail(SellResultCode.LOGIN_FAIL.getMessage()); } String provinceNum = map_districts.get("provinceNum").toString(); String cityNum = map_districts.get("cityNum").toString(); String countyNum = map_districts.get("countyNum").toString(); String townNum = map_districts.get("townNum").toString(); String villageNum = map_districts.get("villageNum").toString(); // 生成12位5级行政区划编码串及名称串 Long districtNum = Long.parseLong(provinceNum + cityNum + countyNum + townNum + villageNum); //获取项目编码 String projectNo = clientSv.getItemValue("projectNo"); //转为int Integer projectNo1 = Integer.valueOf(projectNo); //转为16进制 // String projectNo2 = Integer.toHexString(projectNo1); // log.info(projectNo2); String projectNo3 = String.format("%02x", projectNo1); log.info(projectNo3); Map map = new HashMap(); map.put("districtNum", districtNum); map.put("projectNo",projectNo3); return BaseResponseUtils.buildSuccess(map); try { VoClientWechat res = clientSv.getSimpleClientInfo(null, openId); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("查询农户异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } } pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientSv.java
@@ -10,6 +10,7 @@ import com.dy.pipIrrGlobal.pojoSe.SeCodeVerify; import com.dy.pipIrrGlobal.pojoSe.SeOpenId; import com.dy.pipIrrGlobal.voSe.VoClient; import com.dy.pipIrrGlobal.voSe.VoClientWechat; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.utils.PojoUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -78,7 +79,7 @@ * @return */ public Integer addClient(SeClient po) { return seClientMapper.insert(po); return seClientMapper.insertSelective(po); } /** @@ -184,4 +185,13 @@ public String getItemValue(String itemName) { return baSettingsMapper.getItemValue(itemName); } /** * 获取农户基本信息,小程序首页使用 * @param sessionId * @return */ public VoClientWechat getSimpleClientInfo(Long sessionId, String openId) { return seClientMapper.getSimpleClientInfo(sessionId, openId); } } pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/DtoClient.java
@@ -31,21 +31,21 @@ * 村ID */ @Schema(description = "所在村ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "所在村不能为空") //@NotNull(message = "所在村不能为空") private Long villageId; /** * 片区ID */ @Schema(description = "所在片区ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "所在片区不能为空") //@NotNull(message = "所在片区不能为空") private Long blockId; /** * 分水房ID */ @Schema(description = "所在分水房ID", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "所在分水房不能为空") //@NotNull(message = "所在分水房不能为空") private Long divideId; /** @@ -68,8 +68,8 @@ * 身份证号 */ @Schema(description = "农户身份证号", requiredMode = Schema.RequiredMode.REQUIRED) @NotBlank(message = "农户身份证号不能为空") //不能为空也不能为null @Length(message = "农户身份证号必须{max}位数据", min = 18, max = 18) //@NotBlank(message = "农户身份证号不能为空") //不能为空也不能为null //@Length(message = "农户身份证号必须{max}位数据", min = 18, max = 18) private String idCard; /** @@ -88,14 +88,14 @@ * 街道及门牌号 */ @Schema(description = "街道+门牌号", requiredMode = Schema.RequiredMode.NOT_REQUIRED) @Length(message = "地址不大于{max}字,不小于{min}字", min = 1, max = 50) @Length(message = "地址不大于{max}字,不小于{min}字", max = 50) private String address; /** * 备注信息 */ @Schema(description = "备注", requiredMode = Schema.RequiredMode.NOT_REQUIRED) @Length(message = "备注不大于{max}字,不小于{min}字", min = 1, max = 200) @Length(message = "备注不大于{max}字,不小于{min}字", max = 200) private String remarks; /** pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/recharge/RechargeSv.java
@@ -8,6 +8,7 @@ import com.dy.pipIrrGlobal.voSe.VoRecharge; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.utils.PojoUtils; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -97,4 +98,13 @@ return po.getId(); } /** * 根据水卡id获取最近一条充值记录id * @param cardId * @return */ public Long selectIdByCardId(Long cardId){ SeRecharge seRecharge = seRechargeMapper.selectByCardId(cardId); return seRecharge.getId(); } } pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/result/SellResultCode.java
@@ -135,7 +135,12 @@ NO_SECURITY_CODE_FOR_PHONE(20002, "该手机号未发送验证码"), SECURITY_CODE_ERROR(20003, "验证码错误"), VALIDATION_TIMEOUT(20004, "验证超时"), PHONE_NUMBER_IS_ERROR(20004, "手机号错误,非注册农户"); PHONE_NUMBER_IS_ERROR(20004, "手机号错误,非注册农户"), /** * 小程序 */ LOGIN_FAIL(20004, "登录失败"); private final Integer code; private final String message; pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java
@@ -5,10 +5,7 @@ import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.ResultCodeMsg; import com.dy.pipIrrGlobal.pojoSe.SeVcRefund; import com.dy.pipIrrGlobal.pojoSe.SeVcRefundItem; import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; import com.dy.pipIrrGlobal.pojoSe.SeWebchatLogonState; import com.dy.pipIrrGlobal.pojoSe.*; import com.dy.pipIrrGlobal.voSe.VoClient; import com.dy.pipIrrSell.client.ClientSv; import com.dy.pipIrrSell.result.SellResultCode; @@ -123,22 +120,6 @@ String openid = job.getString("openid"); String sessionKey = job.getString("session_key"); // 检验登录态 //JSONObject checkSessionKey = payHelper.checkSessionKey(appid, secret, openid, sessionKey); //if(checkSessionKey != null) { // Integer errcode = checkSessionKey.getInteger("errcode"); // String errmsg = checkSessionKey.getString("errmsg"); //} // 重置登录态 //JSONObject resetUserSessionKey = payHelper.resetUserSessionKey(appid, secret, openid, sessionKey); //if(resetUserSessionKey != null) { // Integer errcode = checkSessionKey.getInteger("errcode"); // String errmsg = checkSessionKey.getString("errmsg"); // String openid_New = checkSessionKey.getString("openid"); // String sessionKey_New = checkSessionKey.getString("session_key"); //} // 添加登录态记录 SeWebchatLogonState po = new SeWebchatLogonState(); po.setOpenId(openid); @@ -204,7 +185,7 @@ * JSAPI下单 * @param order 下单请求对象,包含需要传入的参数 * @param bindingResult * @return * @return 预支付交易会话标识(有效期2小时) */ @Operation(summary = "JSAPI下单", description = "JSAPI下单") @ApiResponses(value = { @@ -223,12 +204,15 @@ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } // 接收参数:登录态ID、农户ID、虚拟卡ID、充值金额 String sessionId = order.getSessionId(); Long sessionId = order.getSessionId(); Long virtualId = order.getVirtualId(); Integer rechargeAmount = order.getRechargeAmount(); String prepayId = ""; SeWebchatLogonState po = paymentSv.selectOne(Long.parseLong(sessionId)); //SeWebchatLogonState po = paymentSv.selectOne(Long.parseLong(sessionId)); //String openid = po.getOpenId(); SeOpenId po = paymentSv.selectOne(sessionId); String openid = po.getOpenId(); SeVirtualCard seVirtualCard = virtualCardSv.selectVirtuCardById(virtualId); @@ -286,13 +270,11 @@ headers.put("Content-Type", "application/json"); // 暂时注释掉,认证通过后再放开 //JSONObject job_result = restTemplateUtil.post(PayInfo.orderUrl, body, headers); //if(job_result != null) { // System.out.println(job_result.toString()); // prepayId = job_result.getString("prepay_id"); //} return BaseResponseUtils.buildSuccess(prepayId) ; JSONObject job_result = restTemplateUtil.post(PayInfo.orderUrl, body, headers); if(job_result == null) { return BaseResponseUtils.buildFail(SellResultCode.RECHARGE_ADD_FAIL.getMessage()); } return BaseResponseUtils.buildSuccess(job_result) ; } /** pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentSv.java
@@ -1,7 +1,9 @@ package com.dy.pipIrrSell.wechatpay; import com.dy.pipIrrGlobal.daoSe.SeOpenIdMapper; import com.dy.pipIrrGlobal.daoSe.SeVcRechargeMapper; import com.dy.pipIrrGlobal.daoSe.SeWebchatLogonStateMapper; import com.dy.pipIrrGlobal.pojoSe.SeOpenId; import com.dy.pipIrrGlobal.pojoSe.SeVcRecharge; import com.dy.pipIrrGlobal.pojoSe.SeWebchatLogonState; import lombok.extern.slf4j.Slf4j; @@ -24,6 +26,9 @@ @Autowired private SeVcRechargeMapper seVcRechargeMapper; @Autowired private SeOpenIdMapper seOpenIdMapper; /** * 添加登录态状态记录 * @param po @@ -39,10 +44,14 @@ * @param id * @return */ SeWebchatLogonState selectOne(Long id) { SeWebchatLogonState selectOne2(Long id) { return seWebchatLogonStateMapper.selectByPrimaryKey(id); } SeOpenId selectOne(Long sessionId) { return seOpenIdMapper.selectByPrimaryKey(sessionId); } /** * 添加虚拟卡充值记录 * @param po pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/DtoOrder.java
@@ -1,7 +1,6 @@ package com.dy.pipIrrSell.wechatpay.dto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -21,8 +20,8 @@ * 登录态ID,用来获取openID */ @Schema(description = "登录态ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED) @NotBlank(message = "登录态ID不能为空") private String sessionId; @NotNull(message = "登录态ID不能为空") private Long sessionId; /** * 虚拟卡编号,外键,用来获取虚拟卡余额 pipIrr-platform/pipIrr-web/pipIrr-web-wechat/pom.xml
@@ -2,6 +2,14 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <dependencies> <dependency> <groupId>com.dy</groupId> <artifactId>pipIrr-web-sell</artifactId> <version>1.0.0</version> <scope>compile</scope> </dependency> </dependencies> <parent> <artifactId>pipIrr-web</artifactId> pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandResultCtrl.java
New file @@ -0,0 +1,40 @@ package com.dy.pipIrrWechat.command; import com.dy.common.mw.protocol.Data; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.command.ComSupport; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; 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.util.concurrent.CompletableFuture; /** * @author ZhuBaoMin * @date 2024-05-30 16:07 * @LastEditTime 2024-05-30 16:07 * @Description */ @Slf4j @RestController @RequestMapping(path="comRes") public class CommandResultCtrl extends ComSupport { @PostMapping(path = "receive", consumes = MediaType.APPLICATION_JSON_VALUE) public BaseResponse<String> receive(@RequestBody Data data) { Long comId = 0L; if(data.getCommandId() != null) { comId = Long.parseLong(data.getCommandId()); } CompletableFuture<Data> feature = (CompletableFuture<Data>) features.get(comId); if(feature != null) { feature.complete(data); } return BaseResponseUtils.buildSuccess("ok"); } } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandSv.java
New file @@ -0,0 +1,126 @@ package com.dy.pipIrrWechat.command; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.dy.common.mw.protocol.Command; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.command.ComSupport; import com.dy.pipIrrGlobal.daoPr.PrIntakeMapper; import com.dy.pipIrrGlobal.daoPr.PrIntakeVcMapper; import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; import com.dy.pipIrrGlobal.daoRm.RmCommandHistoryMapper; import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import com.dy.pipIrrGlobal.voPr.VoOnLineIntake; import com.dy.pipIrrGlobal.voRm.VoUnclosedValve; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author ZhuBaoMin * @date 2024-05-30 16:13 * @LastEditTime 2024-05-30 16:13 * @Description */ @Slf4j @Service @RequiredArgsConstructor public class CommandSv extends ComSupport { private final RmCommandHistoryMapper rmCommandHistoryMapper; private final SeVirtualCardMapper seVirtualCardMapper; private final PrIntakeMapper prIntakeMapper; private final PrWaterPriceMapper prWaterPriceMapper; private final PrIntakeVcMapper prIntakeVcMapper; /** * 虚拟卡ID换虚拟卡对象 * @param vcId * @return */ public VoVirtualCard getVcById(Long vcId) { return seVirtualCardMapper.getVcById(vcId); } /** * 获取水价 * @return */ public Double getPrice() { return prWaterPriceMapper.getPrice(); } /** * 添加命令日志 * @param po 命令日志对象 * @return 字符串类型的主键 */ public Long insert(RmCommandHistory po) { rmCommandHistoryMapper.insert(po); return po.getId(); } /** * 修改命令日志信息 * @param po 命令日志对象 * @return 影响记录数量 */ public Integer update(RmCommandHistory po) { return rmCommandHistoryMapper.updateByPrimaryKeySelective(po); } /** * 根据操作员ID获取未关阀记录(包含在线情况) * @param operator * @return */ public List<VoUnclosedValve> getUnclosedValves(Long operator) { Command com = new Command() ; com.id = Command.defaultId; com.code = "LCD0001"; com.type = "innerCommand"; JSONObject response = (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response != null && response.getString("code").equals("0001")) { JSONObject attachment = response.getJSONObject("content").getJSONObject("attachment").getJSONObject("onLineMap"); HashMap<String, Boolean> onLineMap = JSON.parseObject(attachment.toJSONString(), HashMap.class); JSONArray jsonArray = new JSONArray(); for (Map.Entry<String, Boolean> entry : onLineMap.entrySet()) { JSONObject jsonObject = new JSONObject(); jsonObject.put("rtuAddr", entry.getKey()); jsonObject.put("isOnLine", entry.getValue()); jsonArray.add(jsonObject); } System.out.println(jsonArray); List<VoUnclosedValve> res = rmCommandHistoryMapper.getUnclosedValves(jsonArray.toJSONString(), operator); if(res != null) { return res; } else { return new ArrayList<>(); } } else { QueryResultVo<List<VoOnLineIntake>> rsVo = new QueryResultVo<>(); return new ArrayList<>(); } } /** * 根据取水口ID获取与之绑定虚拟卡ID * @param intakeId * @return */ public Long getVcIdByIntakeId(Long intakeId) { return prIntakeVcMapper.getVcIdByIntakeId(intakeId); } } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java
New file @@ -0,0 +1,489 @@ package com.dy.pipIrrWechat.command; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.dy.common.aop.SsoAop; import com.dy.common.mw.protocol.Command; import com.dy.common.mw.protocol.Data; import com.dy.common.mw.protocol.p206V1_0_0.CodeV1_0_1; import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com97Vo; import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com98Vo; import com.dy.common.mw.protocol.p206V202404.CodeV202404; import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo; import com.dy.common.mw.protocol.p206V202404.downVos.ComCd93_A3Vo; import com.dy.common.util.IDLongGenerator; import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.command.ComSupport; import com.dy.pipIrrGlobal.daoSe.SeVirtualCardMapper; import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory; import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; import com.dy.pipIrrGlobal.voRm.VoUnclosedValve; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import com.dy.pipIrrWechat.command.dto.ValveClose; import com.dy.pipIrrWechat.command.dto.ValveOpen; import com.dy.pipIrrWechat.command.enums.LastOperateENUM; import com.dy.pipIrrWechat.result.WechatResultCode; import io.swagger.v3.oas.annotations.tags.Tag; 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.*; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.List; import java.util.Objects; /** * @author ZhuBaoMin * @date 2024-05-30 16:11 * @LastEditTime 2024-05-30 16:11 * @Description */ @Slf4j @Tag(name = "小程序阀控器控制", description = "小程序阀控器控制") @RestController @RequestMapping(path="valve") @RequiredArgsConstructor public class ValveCtrl extends ComSupport { private final CommandSv commandSv; private final SeVirtualCardMapper seVirtualCardMapper; private final IDLongGenerator idLongGenerator; private String rtuResultSendWebUrl = "http://127.0.0.1:8087/wx/comRes/receive" ; /** * 小程序远程开阀 * @param valve * @param bindingResult * @return */ @PostMapping(path = "open_wx", consumes = MediaType.APPLICATION_JSON_VALUE) @Transactional(rollbackFor = Exception.class) @SsoAop() public BaseResponse<Boolean> open(@RequestBody @Valid ValveOpen valve, BindingResult bindingResult) { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss"); if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } Long intakeId = valve.getIntakeId(); Long vcId = valve.getVcId(); Long operator = valve.getOperator(); Long comId = idLongGenerator.generate(); /** * 如果农户选择了虚拟卡,则使用该虚拟卡 * 如果农户未选择虚拟卡,则根据取水口ID获取与之绑定的虚拟卡 * 如果取水口没有与之绑定的虚拟卡,则提示农户选择一张虚拟卡 */ if(vcId == null) { vcId = commandSv.getVcIdByIntakeId(intakeId); if(vcId == null) { return BaseResponseUtils.buildFail(WechatResultCode.PLEASE_SELECT_A_VC.getMessage()); } } // 获取系统参数 if(!setuped) { setUp(); } // 虚拟卡ID换虚拟卡对象 VoVirtualCard vc = commandSv.getVcById(vcId); if(vc == null) { return BaseResponseUtils.buildFail(WechatResultCode.PLEASE_SELECT_A_VC.getMessage()); } if(vc.getInUse() == 1) { return BaseResponseUtils.buildFail(WechatResultCode.IN_USE_VC_CANNOT_OPEN_VALVE.getMessage()); } // 获取水价 Double waterPrice = commandSv.getPrice(); // 取水口ID换阀控器地址及通讯协议 JSONObject job_rtu = getRtu(intakeId, null); if(job_rtu == null) { return BaseResponseUtils.buildError(WechatResultCode.RTU_NOT_EXIST.getMessage()); } String rtuAddr = job_rtu.getString("rtuAddr"); String protocol = job_rtu.getString("protocol"); // 生成订单号 String orderNo = generateOrderNo(); String commandCode = null; if(protocol.equals("p206V202404")) { // 获取功能码 commandCode = CodeV202404.cd_A2; // 创建视图 ComCd92_A2Vo param = new ComCd92_A2Vo(); param.controllerType = controllerType; param.projectNo = projectNo; param.icCardNo = vc.getVcNum(); param.waterRemain = 0.0; param.moneyRemain = vc.getMoney(); param.waterPrice = waterPrice; param.elePrice = 0.0; param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV202404.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调失败 if(!response_CallBack.getCode().equals("0001")) { return BaseResponseUtils.buildFail(response_CallBack.getMsg()); //return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 1); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else if(protocol.equals("p206V1_0_1")) { // 获取功能码 commandCode = CodeV1_0_1.cd_97; // 创建视图 Com97Vo param = new Com97Vo() ; param.icCardNo = vc.getVcNum(); param.moneyRemain = vc.getMoney(); param.waterPrice = waterPrice; param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV1_0_1.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); //回调异常 if(!response_CallBack.getCode().equals("0001")) { // 命令日志执行结果改为失败 rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.update(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 回调超时 if(response_CallBack.getContent().toString().equals(WechatResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) { /** * 回调超时,暂时认为执行失败 * 命令置为失败 * 虚拟卡依旧保持使用中的状态 */ rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.update(rmCommandHistory); //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 1); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); return BaseResponseUtils.buildFail(WechatResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ SeVirtualCard virtualCard = new SeVirtualCard(); virtualCard.setId(vcId); virtualCard.setInUse((byte) 1); virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); virtualCard.setLastOperateTime(new Date()); seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else { return BaseResponseUtils.buildFail("系统暂不支持该协议"); } } /** * 小程序远程关阀 * @param valve * @param bindingResult * @return */ @PostMapping(path = "close_wx", consumes = MediaType.APPLICATION_JSON_VALUE) @Transactional(rollbackFor = Exception.class) @SsoAop() public BaseResponse<Boolean> close(@RequestBody @Valid ValveClose valve, BindingResult bindingResult) { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss"); if(bindingResult != null && bindingResult.hasErrors()){ return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } String rtuAddr = valve.getRtuAddr(); String vcNum = valve.getVcNum(); String orderNo = valve.getOrderNo(); Long operator = valve.getOperator(); Long comId = idLongGenerator.generate(); // 获取系统参数 if(!setuped) { setUp(); } // 阀控器地址换取水口ID和通讯协议 JSONObject job_rtu = getRtu(null, rtuAddr); if(job_rtu == null) { return BaseResponseUtils.buildError(WechatResultCode.RTU_NOT_EXIST.getMessage()); } Long intakeId = job_rtu.getLong("intakeId"); String protocol = job_rtu.getString("protocol"); String commandCode = null; if(protocol.equals("p206V202404")) { // 获取功能码 commandCode = CodeV202404.cd_A3; // 创建视图 ComCd93_A3Vo param = new ComCd93_A3Vo(); param.controllerType = controllerType; param.projectNo = projectNo; param.icCardNo = vcNum; param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV202404.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调失败 if(!response_CallBack.getCode().equals("0001")) { return BaseResponseUtils.buildFail(response_CallBack.getMsg()); //return BaseResponseUtils.buildError(WechatResultCode.GET_RESULT_ERROR.getMessage()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 0); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else if(protocol.equals("p206V1_0_1")) { // 获取功能码 commandCode = CodeV1_0_1.cd_98; // 创建视图 Com98Vo param = new Com98Vo() ; param.icCardNo = vcNum; param.orderNo = orderNo; // 构造命令 Command com = command(comId, commandCode, rtuAddr, protocol, rtuResultSendWebUrl, param); // 发送命令 JSONObject response_SendCom= (JSONObject) JSON.toJSON(sendCom2Mw(com)); if(response_SendCom != null && response_SendCom.getString("code").equals("0001")) { //if(1 > 0) { // 请求成功 // 创建命令日志对象并添加到数据库中 String commandName = CodeV1_0_1.getCodeName(commandCode); RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, commandName, intakeId, rtuAddr, protocol, param, operator); commandSv.insert(rmCommandHistory); // 处理回调 BaseResponse response_CallBack = dealWithCallBack(comId); // 回调异常 if(!response_CallBack.getCode().equals("0001")) { // 命令日志执行结果改为失败 rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.update(rmCommandHistory); return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } // 回调超时 if(response_CallBack.getContent().toString().equals(WechatResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage())) { /** * 回调超时,暂时认为执行失败 * 命令置为失败 * 虚拟卡依旧保持使用中的状态 */ rmCommandHistory = new RmCommandHistory(); rmCommandHistory.setId(comId); rmCommandHistory.setResult((byte)0); commandSv.update(rmCommandHistory); //Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); //SeVirtualCard virtualCard = new SeVirtualCard(); //virtualCard.setId(vcId); //virtualCard.setInUse((byte) 0); //virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); //virtualCard.setLastOperateTime(new Date()); //seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); return BaseResponseUtils.buildFail(WechatResultCode.GET_RESULT_IN_ONE_MINUTE.getMessage()); } // 回调成功,再判断执行是否成功 JSONObject job_content = (JSONObject)JSON.toJSON(response_CallBack.getContent()); System.out.println(job_content); JSONObject job_subData = (JSONObject) job_content.getJSONObject("subData").getJSONObject("subData"); System.out.println(job_subData); Boolean dealResult = job_subData.getBoolean("success"); if(!dealResult) { return BaseResponseUtils.buildFail(response_CallBack.getContent().toString()); } /** * 执行成功 * 更改虚拟卡状态:是否使用中、最后操作、最后操作时间 */ Long vcId = seVirtualCardMapper.getVcIdByNum(vcNum); SeVirtualCard virtualCard = new SeVirtualCard(); virtualCard.setId(vcId); virtualCard.setInUse((byte) 0); virtualCard.setLastOperate(LastOperateENUM.OPEN_VALVE.getCode()); virtualCard.setLastOperateTime(new Date()); seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard); // 回调返回的内容 Data myData = (Data)response_CallBack.getContent(); return BaseResponseUtils.buildSuccess(myData) ; } else { // 请求失败 JSONObject job_param = response_SendCom.getJSONObject("content").getJSONObject("param"); return BaseResponseUtils.buildFail(job_param.getString("message")); } } else { return BaseResponseUtils.buildFail("系统暂不支持该协议"); } } /** * 根据操作员ID获取未关阀记录 * @param operator * @return */ @GetMapping(path = "/get") @SsoAop() public BaseResponse<List<VoUnclosedValve>> getUnclosedValves(@RequestParam Long operator){ try { List<VoUnclosedValve> res = commandSv.getUnclosedValves(operator); 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/command/dto/DtoBase.java
New file @@ -0,0 +1,28 @@ package com.dy.pipIrrWechat.command.dto; import jakarta.validation.constraints.NotNull; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-05-22 16:54 * @LastEditTime 2024-05-22 16:54 * @Description 设置命令基类 */ @Data public class DtoBase { public static final long serialVersionUID = 202405221655001L; /** * 取水口ID */ @NotNull(message = "取水口不能为空") private Long intakeId; /** * 操作人 */ @NotNull(message = "操作人不能为空") private Long operator; } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveClose.java
New file @@ -0,0 +1,46 @@ package com.dy.pipIrrWechat.command.dto; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-05-24 17:25 * @LastEditTime 2024-05-24 17:25 * @Description 设置命令子类-远程关阀传输对象 */ @Data public class ValveClose { public static final long serialVersionUID = 202405241727001L; /** * 阀控器地址 */ @NotBlank(message = "阀控器地址不能为空") private String rtuAddr; /** * 虚拟卡编号 */ @NotBlank(message = "虚拟卡编号不能为空") private String vcNum; /** * 开阀时生成的订单号 */ @NotBlank(message = "订单号不能为空") private String orderNo; /** * 用户类型 1-平台,2-APP */ //@NotNull(message = "操作类型不能为空") //private Integer userType; /** * 操作人 */ @NotNull(message = "操作人不能为空") private Long operator; } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveOpen.java
New file @@ -0,0 +1,26 @@ package com.dy.pipIrrWechat.command.dto; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-05-23 15:30 * @LastEditTime 2024-05-23 15:30 * @Description 设置命令子类-远程开阀传输对象 */ @Data public class ValveOpen extends DtoBase{ public static final long serialVersionUID = 202405231531001L; /** * 虚拟卡ID */ private Long vcId; /** * 用户类型 1-平台,2-APP */ //@NotNull(message = "操作类型不能为空") //private Integer userType; } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/enums/LastOperateENUM.java
New file @@ -0,0 +1,27 @@ package com.dy.pipIrrWechat.command.enums; import lombok.AllArgsConstructor; import lombok.Getter; /** * @author ZhuBaoMin * @date 2024-03-06 9:21 * @LastEditTime 2024-03-06 9:21 * @Description */ @Getter @AllArgsConstructor public enum LastOperateENUM { OPEN_ACCOUNT((byte)1, "开户"), RECHARGE((byte)2, "充值"), CONSUME((byte)3, "消费"), APPLY_REFUND((byte)4, "申请退款"), AUDIT_REFUND((byte)5, "退款审核"), REFUND((byte)6, "退款"), OPEN_VALVE((byte)7, "开阀"), CLOSE_VALVE((byte)8, "关阀"); private final Byte code; private final String message; } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/qo/OnLineIntakesQO.java
New file @@ -0,0 +1,33 @@ package com.dy.pipIrrWechat.command.qo; import com.dy.common.webUtil.QueryConditionVo; import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min; import lombok.Data; /** * @author ZhuBaoMin * @date 2024-05-27 20:32 * @LastEditTime 2024-05-27 20:32 * @Description */ @Data public class OnLineIntakesQO extends QueryConditionVo { /** * 中间件返回的RTU在线情况对象数组 */ private String onLineMap; /** * 取水口编号 */ private String intakeNum; /** * 是否在线 */ @Max(value = 1,message = "是否在线仅允许为真或假") @Min(value = 0,message = "是否在线仅允许为真或假") private Boolean isOnLine; } pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java
@@ -14,7 +14,19 @@ @AllArgsConstructor public enum WechatResultCode { XXX(10001,"XXX"); /** * Valve */ GET_RESULT_IN_ONE_MINUTE(10001,"1分钟后去查看结果"), GET_RESULT_ERROR(10002, "获取结果异常"), PLEASE_SELECT_A_VC(10002, "请选择一张虚拟卡"), IN_USE_VC_CANNOT_OPEN_VALVE(10002, "使用中虚拟卡不能用来开阀"), /** * RTU */ RTU_NOT_EXIST(20001, "阀控器不存在"); //RTU_ADDR_CANNOT_BE_NULL(20002, "阀控器地址不能为空"); private final Integer code; private final String message; pipIrr-platform/pipIrr-web/pom.xml
@@ -180,34 +180,34 @@ <artifactId>dubbo</artifactId> <version>3.2.7</version> <exclusions> <exclusion> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> </exclusion> <exclusion> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> <exclusion> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> </exclusion> <exclusion> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> </exclusion> <exclusion> <groupId>com.alibaba</groupId> <artifactId>hessian-lite</artifactId> </exclusion> <exclusion> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> </exclusion> <!-- <exclusion>--> <!-- <groupId>io.netty</groupId>--> <!-- <artifactId>netty-all</artifactId>--> <!-- </exclusion>--> <!-- <exclusion>--> <!-- <groupId>org.yaml</groupId>--> <!-- <artifactId>snakeyaml</artifactId>--> <!-- </exclusion>--> <!-- <exclusion>--> <!-- <groupId>org.springframework</groupId>--> <!-- <artifactId>spring-context</artifactId>--> <!-- </exclusion>--> <!-- <exclusion>--> <!-- <groupId>com.alibaba.spring</groupId>--> <!-- <artifactId>spring-context-support</artifactId>--> <!-- </exclusion>--> <!-- <exclusion>--> <!-- <groupId>com.alibaba.fastjson2</groupId>--> <!-- <artifactId>fastjson2</artifactId>--> <!-- </exclusion>--> <!-- <exclusion>--> <!-- <groupId>com.alibaba</groupId>--> <!-- <artifactId>hessian-lite</artifactId>--> <!-- </exclusion>--> <!-- <exclusion>--> <!-- <groupId>org.javassist</groupId>--> <!-- <artifactId>javassist</artifactId>--> <!-- </exclusion>--> </exclusions> </dependency>