From c2976b80e8850be2d28dc2132c6659856b871f3c Mon Sep 17 00:00:00 2001 From: zhubaomin <zhubaomin> Date: 星期四, 08 五月 2025 21:10:42 +0800 Subject: [PATCH] Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV --- pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/monitor/ComTransCtrl.java | 243 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 240 insertions(+), 3 deletions(-) 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 a1e4b11..96d3d20 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 @@ -1,25 +1,262 @@ package com.dy.pipIrrRemote.monitor; +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 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.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 * @Date: 2025/4/30 16:08 * @Description */ - @Slf4j @Tag(name = "杩滅▼閫忎紶鍛戒护", description = "杩滅▼閫忎紶鍛戒护") @RestController -@RequestMapping(path = "command") +@RequestMapping(path = "comTrans") @RequiredArgsConstructor public class ComTransCtrl { - private final ComTransSv comSv; + 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; + + /** + * 鍚戣澶囷紙鎺у埗鍣級鍙戦�侀�忎紶鍛戒护 + * @param dto 鍓嶇鍙戞潵鐨勫�煎璞� + * @param bindingResult 瀵筪to楠岃瘉鐨勭粨鏋� + * @return 杩斿洖鍓嶇 + */ + @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("绛夊緟閫氫俊涓棿浠堕�氱煡鍛戒护缁撴灉瓒呮椂"); + } + } + }catch (Exception e){ + return BaseResponseUtils.buildFail("鏈嶅姟绔瀯閫犲苟鍚戦�氫俊涓棿浠跺彂閫佽姹傛椂寮傚父" + (e.getMessage() == null?"":e.getMessage())) ; + }finally { + try { + //鏈�鍚庢竻闄ompletableFuture缂撳瓨 + ComResultWait.remove(comId); + }catch (Exception ee){} + } + } + + /** + * 楠岃瘉 + * @param dto + * @return + */ + private String checkDto(ComTransDto dto){ + if(!NumUtil.isHex(dto.comCode)){ + return "鍛戒护鍔熻兘鐮佷笉鏄崄鍏繘鍒舵暟"; + } + if(!NumUtil.isHex(dto.comData)){ + return "鍛戒护鏁版嵁涓嶆槸鍗佸叚杩涘埗鏁�"; + } + if(dto.comData.length() % 2 != 0){ + return "鍛戒护鏁版嵁涓嶅畬澶囷紙闀垮害涓嶆槸鍋舵暟锛�"; + } + if(!dto.comData.contains(dto.comCode)){ + return "鍛戒护鏁版嵁涓笉鍖呭惈鍔熻兘鐮�"; + } + return null ; + } + + private String createRtnMsg(String code, JSONObject resultData){ + String msg; + if(resultData != null){ + JSONObject codeData = resultData.getJSONObject("data") ; + switch (code){ + case "3C": msg = createCd3CRtnMsg(codeData); break; + case "10": msg = createCd10RtnMsg(codeData); break; + case "21": msg = createCd21RtnMsg(codeData); break; + case "37": msg = createCd37RtnMsg(codeData); break; + case "50": msg = createCd50RtnMsg(codeData); break; + case "65": msg = createCd65RtnMsg(codeData); break; + case "66": msg = createCd66RtnMsg(codeData); break; + case "67": msg = createCd67RtnMsg(codeData); break; + case "91": msg = createCd91RtnMsg(codeData); break; + case "92": msg = createCd92RtnMsg(codeData); break; + case "93": msg = createCd93RtnMsg(codeData); break; + default: msg = RtuSuccessMsg; break; + } + }else{ + msg = RtuSuccessMsg ; + } + return msg; + } + private String createCd3CRtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else{ + Integer minute = codeData.getInteger("minute"); + return "璁剧疆鎴愬姛锛岃嚜鎶ュ懆鏈燂細" + minute + "鍒嗛挓" ; + } + } + private String createCd10RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + String newRtuAddr = codeData.getString("newRtuAddr"); + return "璁剧疆鎴愬姛锛屾帶鍒跺櫒鍦板潃锛�" + newRtuAddr; + } + } + private String createCd21RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + String ip = codeData.getString("ip"); + Integer port = codeData.getInteger("port"); + return "璁剧疆鎴愬姛锛孖P鍦板潃锛�" + ip + "锛岀鍙e彿锛�" + port; + } + } + private String createCd37RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + Integer second = codeData.getInteger("second"); + return "璁剧疆鎴愬姛锛屾祦閲忛噰闆嗗懆鏈燂細" + second + "绉�"; + } + } + private String createCd50RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + String rtuAddr = codeData.getString("rtuAddr"); + return "鏌ヨ鎴愬姛锛屾帶鍒跺櫒鍦板潃锛�" + rtuAddr; + } + } + private String createCd65RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + Integer minute = codeData.getInteger("minute"); + return "鏌ヨ鎴愬姛锛岃嚜鎶ュ懆鏈燂細" + minute + "鍒嗛挓"; + } + } + private String createCd66RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + String ip = codeData.getString("ip"); + Integer port = codeData.getInteger("port"); + return "鏌ヨ鎴愬姛锛孖P鍦板潃锛�" + ip + "锛岀鍙e彿锛�" + port; + } + } + private String createCd67RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + Integer second = codeData.getInteger("second"); + return "鏌ヨ鎴愬姛锛屾祦閲忛噰闆嗗懆鏈燂細" + second + "绉�"; + } + } + private String createCd91RtnMsg(JSONObject codeData){ + //姝ゅ懡浠ょ殑codeData鏄痭ull + return "鎺у埗鍣ㄦ竻绌哄巻鍙茶褰曟垚鍔�" ; + } + private String createCd92RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + Boolean success = codeData.getBoolean("success"); + return success ? "鎺у埗鍣ㄥ凡鎵ц閬ユ帶寮�闃�鍛戒护" : "鎺у埗鍣ㄦ嫆缁濇墽琛岄仴鎺у紑闃�鍛戒护"; + } + } + private String createCd93RtnMsg(JSONObject codeData){ + if(codeData == null){ + return RtuSuccessMsg ; + }else { + Boolean success = codeData.getBoolean("success"); + return success ? "鎺у埗鍣ㄥ凡鎵ц閬ユ帶鍏抽榾鍛戒护" : "鎺у埗鍣ㄦ嫆缁濇墽琛岄仴鎺у叧闃�鍛戒护"; + } + } } -- Gitblit v1.8.0