From 59b3bcf5b615361ae6402a51878cfec3c21cd646 Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期六, 10 五月 2025 09:01:49 +0800
Subject: [PATCH] 实现表阀一体机协议远程命令功能子模块通用框架

---
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/CdParam.java        |   16 +
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/DtoBase.java            |    1 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Param.java |   17 +
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransDto.java           |    5 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComCtrl.java        |  189 +++++++++++++++++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Dto.java   |   17 +
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransParam.java         |   13 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComSv.java          |   48 ++++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Ctrl.java  |  108 +++++++++
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Sv.java    |   15 +
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/CommandSv.java                            |    5 
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransCtrl.java          |  136 ++++-------
 pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransSv.java            |   41 ---
 pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComResultWait.java                        |    4 
 14 files changed, 483 insertions(+), 132 deletions(-)

diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComResultWait.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComResultWait.java
index 8cd8151..4cfb473 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComResultWait.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComResultWait.java
@@ -21,6 +21,10 @@
         return features.get(key);
     }
 
+    public static boolean contain(Long key) {
+        return features.containsKey(key);
+    }
+
     public static void remove(Long key){
         features.remove(key) ;
     }
diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/CommandSv.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/CommandSv.java
index 9bf6199..a862c21 100644
--- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/CommandSv.java
+++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/CommandSv.java
@@ -100,7 +100,10 @@
         po.setParam((JSONObject) JSON.toJSON(param));
         po.setSendTime(new Date());
         po.setOperator(operator);
-        rmCommandHistoryDao.insertSelective(po) ;
+        int count = rmCommandHistoryDao.insertSelective(po) ;
+        if(count == 0){
+            po = null ;
+        }
         return po;
     }
 
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/DtoBase.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/DtoBase.java
index e960b9e..bebddc7 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/DtoBase.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/DtoBase.java
@@ -2,6 +2,7 @@
 
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
+import lombok.experimental.SuperBuilder;
 
 /**
  * @author ZhuBaoMin
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransCtrl.java
index 96d3d20..a85d0fd 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransCtrl.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransCtrl.java
@@ -3,30 +3,23 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.dy.common.aop.SsoAop;
 import com.dy.common.mw.protocol.Command;
-import com.dy.common.util.IDLongGenerator;
 import com.dy.common.util.NumUtil;
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
-import com.dy.pipIrrGlobal.command.ComResultWait;
-import com.dy.pipIrrGlobal.pojoPr.PrController;
+import com.dy.pipIrrRemote.common.dto.DtoBase;
+import com.dy.pipIrrRemote.monitor.common.ComCtrl;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.env.Environment;
+import org.springframework.context.annotation.Scope;
 import org.springframework.http.MediaType;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.client.RestTemplate;
-
-import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
 
 /**
  * @Author: liurunyu
@@ -38,24 +31,13 @@
 @RestController
 @RequestMapping(path = "comTrans")
 @RequiredArgsConstructor
-public class ComTransCtrl {
+@Scope("prototype") //鍥犱负鏈夊璞$被灞炴�э紝鎵�浠ラ噰鐢ㄥ師鍨嬫ā寮忥紝姣忔璇锋眰鏂板缓涓�涓疄渚嬪璞�
+public class ComTransCtrl extends ComCtrl {
 
     private static final String RtuSuccessMsg = "鎺у埗鍣ㄦ帴鏀跺苟鎵ц鍛戒护鎴愬姛";
 
     @Autowired
-    private Environment env ;
-
-    @Autowired
-    private RestTemplate restTemplate ;
-
-    @Value("${mw.waitMwRtnResultTimeout}")
-    private int waitMwRtnResultTimeout ;
-
-    @Value("${mw.rtuCallbackUrl_rm}")
-    private String rtuResultSendWebUrl;
-
-    @Autowired
-    private ComTransSv comSv;
+    private ComTransSv sv ;
 
     /**
      * 鍚戣澶囷紙鎺у埗鍣級鍙戦�侀�忎紶鍛戒护
@@ -66,66 +48,43 @@
     @PostMapping(path = "send", consumes = MediaType.APPLICATION_JSON_VALUE)
     @SsoAop()
     public BaseResponse<Object> send(@RequestBody @Valid ComTransDto dto, BindingResult bindingResult) {
-        if (bindingResult != null && bindingResult.hasErrors()) {
-            return BaseResponseUtils.buildError(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
-        }
-        String msg = this.checkDto(dto) ;
-        if(msg != null){
-            return BaseResponseUtils.buildError(msg) ;
-        }
-        //寰楀埌鎺у埗鍣ㄥ璞�
-        PrController ctrlPo = comSv.getRtu(dto.getIntakeId());
-        if (ctrlPo == null) {
-            return BaseResponseUtils.buildError("浠庢暟鎹簱涓湭寰楀埌鎺у埗鍣ㄦ暟鎹�") ;
-        }
-        //妫�鏌ュ崗璁�
-        msg = comSv.checkProtocol(ctrlPo) ;
-        if(msg != null) {
-            return BaseResponseUtils.buildError(msg) ;
-        }
-        //寰楀埌鍔熻兘鐮佸搴旂殑鍛戒护鍚嶇О
-        String comName = comSv.getCommandName(dto.comCode, ctrlPo) ;
-        if(comName == null) {
-            return BaseResponseUtils.buildError("鏈緱鍒板姛鑳界爜瀵瑰簲鍛戒护鍚嶇О") ;
-        }
-        Long comId = new IDLongGenerator().generate();
-        String comData = dto.comData.toUpperCase() ;
-        //鐢熸垚骞朵繚瀛樺懡浠ゆ棩蹇�
-        comSv.saveComHistoryPo(comId, ctrlPo.getProtocol(), dto.comCode, "閫忎紶锛�" + comName + "锛�",
-                dto.getIntakeId(), ctrlPo.getRtuAddr(), new ComTransParam(dto.comCode, comData), dto.getOperator());
-        try{
-            CompletableFuture<JSONObject> feature = new CompletableFuture<>();
-            ComResultWait.put(comId, feature);
-            //鍒涘缓澶栭儴閫忎紶鍛戒护锛堝彂缁欐帶鍒跺櫒锛�
-            Command com = comSv.createOuterTransparentCommand("" + comId, dto.comCode);
-            com.rtuAddr = ctrlPo.getRtuAddr() ;
-            com.attachment = comData ;
-            com.rtuResultSendWebUrl = rtuResultSendWebUrl;
-            //寰楀埌閫氫俊涓棿浠跺彂閫佸懡浠ょ殑web URL
-            String rqUrl = comSv.get2MwRequestUrl(this.env, comSv.ContextComSend) ;
-            //鍚戦�氫俊涓棿浠跺彂閫亀eb璇锋眰
-            BaseResponse res = comSv.sendPostRequest2Mw(restTemplate, rqUrl, com) ;
-            //澶勭悊閫氫俊涓棿浠跺web璇锋眰鐨勫搷搴�
-            msg = comSv.dealMwDealResponse(res) ;
-            if(msg != null) {
-                return BaseResponseUtils.buildError(msg) ;
-            }else{
-                try{
-                    //绛夊緟閫氫俊涓棿浠堕�氱煡鎺у埗鍣ㄦ墽琛屽懡浠や笂琛屾暟鎹紙鍛戒护缁撴灉锛�
-                    JSONObject resultData = feature.get(waitMwRtnResultTimeout, TimeUnit.SECONDS);
-                    return BaseResponseUtils.buildSuccess(this.createRtnMsg(dto.comCode, resultData));
-                }catch (Exception e){
-                    return BaseResponseUtils.buildFail("绛夊緟閫氫俊涓棿浠堕�氱煡鍛戒护缁撴灉瓒呮椂");
+        BaseResponse<Object> res ;
+        //鍙戦�佸懡浠ゅ墠-1锛氶獙璇�
+        res = super.pre1(sv, dto.comCode, dto, bindingResult);
+        if(res == null) {
+            //鍙戦�佸懡浠ゅ墠-2锛氳幏寰楁暟鎹�
+            res = super.pre2(sv, dto.comCode, dto, bindingResult);
+            if(res == null) {
+                //鍙戦�佸懡浠ゅ墠-3锛氫繚瀛樺懡浠ゆ棩蹇�
+                this.comName = "閫忎紶锛�" + comName + "锛�" ;
+                String comData = dto.comData.toUpperCase() ;
+                ComTransParam comParam = ComTransParam.builder().commandCode(dto.comCode).data(comData).build();
+                res = super.pre3(sv, dto.getIntakeId(), dto.getOperator(), dto.comCode, comParam);
+                if(res == null) {
+                    //鍙戦�佸懡浠ゅ墠-4锛氬噯澶嘑eature
+                    super.pre4();
+                    try{
+                        //鍒涘缓澶栭儴閫忎紶鍛戒护锛堝彂缁欐帶鍒跺櫒锛�
+                        Command com = sv.createOuterTransparentCommand("" + comId, dto.comCode);
+                        com.rtuAddr = ctrlPo.getRtuAddr() ;
+                        com.attachment = comData ;
+                        com.rtuResultSendWebUrl = rtuResultSendWebUrl;
+                        //鍙戦�佸懡浠�
+                        res = super.doSend(sv, com) ;
+                        if(res == null) {
+                            //鍙戦�佸懡浠ゅ悗
+                            res = super.after(dto.comCode);
+                        }
+                    }catch (Exception e){
+                        res = BaseResponseUtils.buildFail("鏈嶅姟绔瀯閫犲苟鍚戦�氫俊涓棿浠跺彂閫佽姹傛椂寮傚父" + (e.getMessage() == null?"":e.getMessage())) ;
+                    }finally {
+                        //鏈�缁�
+                        super.end() ;
+                    }
                 }
             }
-        }catch (Exception e){
-            return BaseResponseUtils.buildFail("鏈嶅姟绔瀯閫犲苟鍚戦�氫俊涓棿浠跺彂閫佽姹傛椂寮傚父" + (e.getMessage() == null?"":e.getMessage())) ;
-        }finally {
-            try {
-                //鏈�鍚庢竻闄ompletableFuture缂撳瓨
-                ComResultWait.remove(comId);
-            }catch (Exception ee){}
         }
+        return res ;
     }
 
     /**
@@ -133,23 +92,26 @@
      * @param dto
      * @return
      */
-    private String checkDto(ComTransDto dto){
-        if(!NumUtil.isHex(dto.comCode)){
+    @Override
+    protected String checkDto(DtoBase dto){
+        ComTransDto myDto = (ComTransDto)dto;
+        if(!NumUtil.isHex(myDto.comCode)){
             return "鍛戒护鍔熻兘鐮佷笉鏄崄鍏繘鍒舵暟";
         }
-        if(!NumUtil.isHex(dto.comData)){
+        if(!NumUtil.isHex(myDto.comData)){
             return "鍛戒护鏁版嵁涓嶆槸鍗佸叚杩涘埗鏁�";
         }
-        if(dto.comData.length() % 2 != 0){
+        if(myDto.comData.length() % 2 != 0){
             return "鍛戒护鏁版嵁涓嶅畬澶囷紙闀垮害涓嶆槸鍋舵暟锛�";
         }
-        if(!dto.comData.contains(dto.comCode)){
+        if(!myDto.comData.contains(myDto.comCode)){
             return "鍛戒护鏁版嵁涓笉鍖呭惈鍔熻兘鐮�";
         }
         return null ;
     }
 
-    private String createRtnMsg(String code, JSONObject resultData){
+    @Override
+    protected String createRtnMsg(String code, JSONObject resultData){
         String msg;
         if(resultData != null){
             JSONObject codeData = resultData.getJSONObject("data") ;
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransDto.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransDto.java
index ef5d3b2..b7c069c 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransDto.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransDto.java
@@ -4,6 +4,8 @@
 import jakarta.validation.constraints.NotEmpty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
 
 /**
  * @Author: liurunyu
@@ -12,7 +14,8 @@
  */
 
 @Data
-@EqualsAndHashCode(callSuper=true)
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
 public class ComTransDto extends DtoBase {
     public static final long serialVersionUID = 202505061021001L;
 
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransParam.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransParam.java
index 6e3b665..bae27e1 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransParam.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransParam.java
@@ -1,7 +1,11 @@
 package com.dy.pipIrrRemote.monitor;
 
+import com.dy.pipIrrRemote.monitor.common.CdParam;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
 
 /**
  * @Author: liurunyu
@@ -9,8 +13,9 @@
  * @Description
  */
 @Data
-@AllArgsConstructor
-public class ComTransParam {
-    public String commandCode;
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@SuperBuilder
+public class ComTransParam extends CdParam {
     public String data ;
-}
+}
\ No newline at end of file
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransSv.java
index 50898f8..88846a0 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransSv.java
@@ -1,14 +1,8 @@
 package com.dy.pipIrrRemote.monitor;
 
-import com.dy.pipIrrGlobal.command.CommandSv;
-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 com.dy.pipIrrRemote.monitor.common.ComSv;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 /**
  * @Author: liurunyu
@@ -17,36 +11,5 @@
  */
 @Slf4j
 @Service
-public class ComTransSv extends CommandSv {
-
-    @Autowired
-    private PrControllerMapper prControllerDao ;
-    @Autowired
-    private RmCommandHistoryMapper rmCommandHistoryDao ;
-
-    public PrController getRtu(Long intakeId){
-        return this.getRtu(prControllerDao, intakeId);
-    }
-    /**
-     * 鍒涘缓鍛戒护鏃ュ織瀵硅薄
-     *
-     * @param comId       涓婚敭
-     * @param commandCode 鍔熻兘鐮�
-     * @param rtuAddr     闃�鎺у櫒鍦板潃
-     * @param protocol    閫氳鍗忚鍚嶇О
-     * @param param       鍙傛暟鏁版嵁
-     * @param operator    鎿嶄綔鍛�
-     * @return
-     */
-    @Transactional(rollbackFor = Exception.class)
-    public RmCommandHistory saveComHistoryPo(Long comId,
-                                             String protocol,
-                                             String commandCode,
-                                             String commandName,
-                                             Long intakeId,
-                                             String rtuAddr,
-                                             Object param,
-                                             Long operator) {
-        return this.saveComHistoryPo(rmCommandHistoryDao, comId, protocol, commandCode, commandName, intakeId, rtuAddr, param, operator) ;
-    }
+public class ComTransSv extends ComSv {
 }
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/CdParam.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/CdParam.java
new file mode 100644
index 0000000..773f487
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/CdParam.java
@@ -0,0 +1,16 @@
+package com.dy.pipIrrRemote.monitor.common;
+
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/5/9 16:11
+ * @Description
+ */
+@Data
+@SuperBuilder
+public class CdParam {
+    //鍛戒护鍔熻兘鐮�
+    public String commandCode;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComCtrl.java
new file mode 100644
index 0000000..27657cc
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComCtrl.java
@@ -0,0 +1,189 @@
+package com.dy.pipIrrRemote.monitor.common;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.dy.common.mw.protocol.Command;
+import com.dy.common.util.IDLongGenerator;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.pipIrrGlobal.command.ComResultWait;
+import com.dy.pipIrrGlobal.pojoPr.PrController;
+import com.dy.pipIrrGlobal.pojoRm.RmCommandHistory;
+import com.dy.pipIrrRemote.common.dto.DtoBase;
+import com.dy.pipIrrRemote.monitor.p202404V201.Cd50Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.env.Environment;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/5/9 14:53
+ * @Description
+ */
+public abstract class ComCtrl {
+
+    @Autowired
+    protected Environment env ;
+
+    @Autowired
+    protected RestTemplate restTemplate ;
+
+    @Value("${mw.waitMwRtnResultTimeout}")
+    protected int waitMwRtnResultTimeout ;
+
+    @Value("${mw.rtuCallbackUrl_rm}")
+    protected String rtuResultSendWebUrl;
+
+    //鎺у埗鍣ㄥ璞�
+    protected PrController ctrlPo ;
+    //寮傛绛夊緟鍣�
+    protected CompletableFuture<JSONObject> feature;
+    //鍛戒护鍚嶇О
+    protected String comName ;
+    //鍛戒护鏃ュ織id
+    protected Long comId ;
+
+    /**
+     * 鍙戦�佸懡浠ゅ墠-1锛氶獙璇�
+     * @param comSv
+     * @param comCode
+     * @param dto
+     * @param bindingResult
+     * @return
+     */
+    public BaseResponse<Object> pre1(ComSv comSv, String comCode, DtoBase dto, BindingResult bindingResult) {
+        if (bindingResult != null && bindingResult.hasErrors()) {
+            return BaseResponseUtils.buildError(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
+        }
+        String msg = this.checkDto(dto) ;
+        if(msg != null){
+            return BaseResponseUtils.buildError("鏈嶅姟绔嚭閿欙紝" + msg) ;
+        }
+        return  null ;
+    }
+
+    /**
+     * 鍙戦�佸懡浠ゅ墠-2锛氳幏寰楁暟鎹�
+     * @param comSv
+     * @param comCode
+     * @param dto
+     * @param bindingResult
+     * @return
+     */
+    public BaseResponse<Object> pre2(ComSv comSv, String comCode, DtoBase dto, BindingResult bindingResult) {
+        //寰楀埌鎺у埗鍣ㄥ璞�
+        ctrlPo = comSv.getRtu(dto.getIntakeId());
+        if (ctrlPo == null) {
+            return BaseResponseUtils.buildError("鏈嶅姟绔嚭閿欙紝浠庢暟鎹簱涓湭寰楀埌鎺у埗鍣ㄦ暟鎹�") ;
+        }
+        //妫�鏌ュ崗璁�
+        String msg = comSv.checkProtocol(ctrlPo) ;
+        if(msg != null) {
+            return BaseResponseUtils.buildError("鏈嶅姟绔嚭閿欙紝" + msg) ;
+        }
+        //寰楀埌鍔熻兘鐮佸搴旂殑鍛戒护鍚嶇О
+        comName = comSv.getCommandName(comCode, ctrlPo) ;
+        if(comName == null) {
+            return BaseResponseUtils.buildError("鏈嶅姟绔嚭閿欙紝鏈緱鍒板姛鑳界爜瀵瑰簲鍛戒护鍚嶇О") ;
+        }
+        return  null ;
+    }
+    /**
+     * 鍙戦�佸懡浠ゅ墠-3锛氫繚瀛樺懡浠ゆ棩蹇�
+     * @param comSv sv瀵硅薄
+     * @param intakeId 鍙栨按鍙D
+     * @param operator 褰撳墠鐢ㄧ櫥褰曠敤鎴穒d(鎿嶄綔浜�)
+     * @param comCode 鍔熻兘鐮�
+     * @param param 鍛戒护鍙傛暟
+     * @return
+     */
+    public BaseResponse<Object> pre3(ComSv comSv, Long intakeId, Long operator, String comCode, CdParam param) {
+        comId = new IDLongGenerator().generate();
+        //鐢熸垚骞朵繚瀛樺懡浠ゆ棩蹇�
+        RmCommandHistory po = comSv.saveComHistoryPo(comId,
+                ctrlPo.getProtocol(),
+                comCode, comName,
+                intakeId,
+                ctrlPo.getRtuAddr(),
+                param,
+                operator);
+        if(po == null){
+            return BaseResponseUtils.buildError("鏈嶅姟绔嚭閿欙紝鏈兘鐢熸垚骞朵繚瀛樺懡浠ゆ棩蹇�") ;
+        }
+        return  null ;
+    }
+    /**
+     * 鍙戦�佸懡浠ゅ墠-4锛氬噯澶嘑eature
+     * @return
+     */
+    public void pre4() {
+        feature = new CompletableFuture<>();
+        ComResultWait.put(comId, feature);
+    }
+
+    /**
+     * 鍙戦�佸懡浠�
+     * @param comSv
+     * @param com
+     * @return
+     */
+    public BaseResponse<Object> doSend(ComSv comSv, Command com){
+        //寰楀埌閫氫俊涓棿浠跺彂閫佸懡浠ょ殑web URL
+        String rqUrl = comSv.get2MwRequestUrl(env, comSv.ContextComSend) ;
+        //鍚戦�氫俊涓棿浠跺彂閫亀eb璇锋眰
+        BaseResponse res = comSv.sendPostRequest2Mw(restTemplate, rqUrl, com) ;
+        //澶勭悊閫氫俊涓棿浠跺web璇锋眰鐨勫搷搴�
+        String msg = comSv.dealMwDealResponse(res) ;
+        if(msg != null) {
+            return BaseResponseUtils.buildError(msg) ;
+        }else{
+            return null ;
+        }
+    }
+
+    /**
+     * 鍙戦�佸懡浠ゅ悗
+     * @return
+     */
+    public BaseResponse<Object> after(String comCode) {
+        try{
+            //绛夊緟閫氫俊涓棿浠堕�氱煡鎺у埗鍣ㄦ墽琛屽懡浠や笂琛屾暟鎹紙鍛戒护缁撴灉锛�
+            JSONObject resultData = feature.get(waitMwRtnResultTimeout, TimeUnit.SECONDS);
+            return BaseResponseUtils.buildSuccess(this.createRtnMsg(comCode, resultData));
+        }catch (Exception e){
+            return BaseResponseUtils.buildFail("绛夊緟閫氫俊涓棿浠堕�氱煡鍛戒护缁撴灉瓒呮椂");
+        }
+    }
+
+    /**
+     * 鍙戦�佸懡浠ゆ渶鍚�
+     * @return
+     */
+    public void end(){
+        try {
+            //鏈�鍚庢竻闄ompletableFuture缂撳瓨
+            if(ComResultWait.contain(comId)){
+                ComResultWait.remove(comId);
+            }
+        }catch (Exception ee){}
+    }
+
+    /**
+     * 楠岃瘉
+     * @param dto
+     * @return
+     */
+    protected abstract String checkDto(DtoBase dto) ;
+
+
+    /**
+     * 鐢熸垚鍛戒护杩斿洖淇℃伅
+     */
+    protected abstract String createRtnMsg(String code, JSONObject resultData);
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComSv.java
new file mode 100644
index 0000000..8fc35f5
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/common/ComSv.java
@@ -0,0 +1,48 @@
+package com.dy.pipIrrRemote.monitor.common;
+
+import com.dy.pipIrrGlobal.command.CommandSv;
+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 org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/5/9 14:45
+ * @Description
+ */
+public class ComSv extends CommandSv {
+
+    @Autowired
+    protected PrControllerMapper prControllerDao ;
+    @Autowired
+    protected RmCommandHistoryMapper rmCommandHistoryDao ;
+
+    public PrController getRtu(Long intakeId){
+        return this.getRtu(prControllerDao, intakeId);
+    }
+    /**
+     * 鍒涘缓鍛戒护鏃ュ織瀵硅薄
+     *
+     * @param comId       涓婚敭
+     * @param commandCode 鍔熻兘鐮�
+     * @param rtuAddr     闃�鎺у櫒鍦板潃
+     * @param protocol    閫氳鍗忚鍚嶇О
+     * @param param       鍙傛暟鏁版嵁
+     * @param operator    鎿嶄綔鍛�
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public RmCommandHistory saveComHistoryPo(Long comId,
+                                             String protocol,
+                                             String commandCode,
+                                             String commandName,
+                                             Long intakeId,
+                                             String rtuAddr,
+                                             Object param,
+                                             Long operator) {
+        return this.saveComHistoryPo(rmCommandHistoryDao, comId, protocol, commandCode, commandName, intakeId, rtuAddr, param, operator) ;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Ctrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Ctrl.java
new file mode 100644
index 0000000..f699aac
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Ctrl.java
@@ -0,0 +1,108 @@
+package com.dy.pipIrrRemote.monitor.p202404V201;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.dy.common.aop.SsoAop;
+import com.dy.common.mw.protocol.Command;
+import com.dy.common.webUtil.BaseResponse;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.pipIrrRemote.common.dto.DtoBase;
+import com.dy.pipIrrRemote.monitor.common.ComCtrl;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.http.MediaType;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/5/9 14:41
+ * @Description
+ */
+@Slf4j
+@Tag(name = "杩滅▼閫忎紶鍛戒护", description = "杩滅▼閫忎紶鍛戒护")
+@RestController
+@RequestMapping(path = "p202404V201")
+@RequiredArgsConstructor
+@Scope("prototype") //鍥犱负鏈夊璞$被灞炴�э紝鎵�浠ラ噰鐢ㄥ師鍨嬫ā寮忥紝姣忔璇锋眰鏂板缓涓�涓疄渚嬪璞�
+public class Cd50Ctrl extends ComCtrl {
+
+    private static final String RtuSuccessMsg = "鎺у埗鍣ㄦ帴鏀跺苟鎵ц鍛戒护鎴愬姛";
+
+    private static final String ComCode = "50" ;
+
+    @Autowired
+    private Cd50Sv sv ;
+    /**
+     * 鍚戣澶囷紙鎺у埗鍣級鍙戦�侀�忎紶鍛戒护
+     * @param dto 鍓嶇鍙戞潵鐨勫�煎璞�
+     * @param bindingResult 瀵筪to楠岃瘉鐨勭粨鏋�
+     * @return 杩斿洖鍓嶇
+     */
+    @PostMapping(path = "cd50", consumes = MediaType.APPLICATION_JSON_VALUE)
+    @SsoAop()
+    public BaseResponse<Object> send(@RequestBody @Valid Cd50Dto dto, BindingResult bindingResult) {
+        BaseResponse<Object> res ;
+        //鍙戦�佸懡浠ゅ墠-1锛氶獙璇�
+        res = super.pre1(sv, ComCode, dto, bindingResult);
+        if(res == null) {
+            //鍙戦�佸懡浠ゅ墠-2锛氳幏寰楁暟鎹�
+            res = super.pre2(sv, ComCode, dto, bindingResult);
+            if (res == null) {
+                //鍙戦�佸懡浠ゅ墠-3锛氫繚瀛樺懡浠ゆ棩蹇�
+                Cd50Param comParam = Cd50Param.builder().commandCode(ComCode).build();
+                res = super.pre3(sv, dto.getIntakeId(), dto.getOperator(), ComCode, comParam);
+                if (res == null) {
+                    //鍙戦�佸懡浠ゅ墠-4锛氬噯澶嘑eature
+                    super.pre4();
+                    try {
+                        //鍒涘缓澶栭儴鍛戒护锛堝彂缁欐帶鍒跺櫒锛�
+                        Command com = sv.createOuterCommand("" + comId, ComCode);
+                        com.rtuAddr = ctrlPo.getRtuAddr();
+                        com.rtuResultSendWebUrl = rtuResultSendWebUrl;
+                        //鍙戦�佸懡浠�
+                        res = super.doSend(sv, com);
+                        if (res == null) {
+                            //鍙戦�佸懡浠ゅ悗
+                            res = super.after(ComCode);
+                        }
+                    } catch (Exception e) {
+                        res = BaseResponseUtils.buildFail("鏈嶅姟绔瀯閫犲苟鍚戦�氫俊涓棿浠跺彂閫佽姹傛椂寮傚父" + (e.getMessage() == null ? "" : e.getMessage()));
+                    } finally {
+                        //鏈�缁�
+                        super.end();
+                    }
+                }
+            }
+        }
+        return res ;
+    }
+
+    @Override
+    protected String checkDto(DtoBase dto) {
+        return null;
+    }
+
+    @Override
+    protected String createRtnMsg(String code, JSONObject resultData){
+        String msg;
+        if(resultData != null){
+            JSONObject codeData = resultData.getJSONObject("data") ;
+            if(codeData == null){
+                return RtuSuccessMsg ;
+            }else {
+                Integer minute = codeData.getInteger("minute");
+                return "鏌ヨ鎴愬姛锛岃嚜鎶ュ懆鏈燂細" + minute + "鍒嗛挓";
+            }
+        }else{
+            msg = RtuSuccessMsg ;
+        }
+        return msg;
+    }
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Dto.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Dto.java
new file mode 100644
index 0000000..6b05774
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Dto.java
@@ -0,0 +1,17 @@
+package com.dy.pipIrrRemote.monitor.p202404V201;
+
+import com.dy.pipIrrRemote.common.dto.DtoBase;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/5/9 14:42
+ * @Description
+ */
+
+@Data
+@EqualsAndHashCode(callSuper=true)
+public class Cd50Dto extends DtoBase {
+    public static final long serialVersionUID = 202505091450001L;
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Param.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Param.java
new file mode 100644
index 0000000..f0dfbc4
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Param.java
@@ -0,0 +1,17 @@
+package com.dy.pipIrrRemote.monitor.p202404V201;
+
+import com.dy.pipIrrRemote.monitor.common.CdParam;
+import lombok.*;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/5/9 14:43
+ * @Description
+ */
+@Data
+@ToString(callSuper = true)
+@EqualsAndHashCode(callSuper = true)
+@SuperBuilder
+public class Cd50Param extends CdParam {
+}
diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Sv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Sv.java
new file mode 100644
index 0000000..08f7bcc
--- /dev/null
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/p202404V201/Cd50Sv.java
@@ -0,0 +1,15 @@
+package com.dy.pipIrrRemote.monitor.p202404V201;
+
+import com.dy.pipIrrRemote.monitor.common.ComSv;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2025/5/9 14:42
+ * @Description
+ */
+@Slf4j
+@Service
+public class Cd50Sv extends ComSv {
+}
\ No newline at end of file

--
Gitblit v1.8.0