| package com.dy.pipIrrRemote.rtu; | 
|   | 
| 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.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.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; | 
| 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.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 | 
|  * @date 2024-05-21 14:31 | 
|  * @LastEditTime 2024-05-21 14:31 | 
|  * @Description 设备终端控制类 | 
|  */ | 
|   | 
| @Slf4j | 
| @RestController | 
| @RequestMapping(path="rtu") | 
| @RequiredArgsConstructor | 
| public class RtuCtrl extends ComSupport { | 
|     private final CommandSv commandSv; | 
|   | 
|     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()); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 设置设备终端地址 | 
|      * @param addr 设置设备终端地址传入对象 | 
|      * @param bindingResult | 
|      * @return | 
|      */ | 
|     @PostMapping(path = "set_addr", consumes = MediaType.APPLICATION_JSON_VALUE) | 
|     @Transactional(rollbackFor = Exception.class) | 
|     @SsoAop() | 
|     public BaseResponse<Boolean> setAddr(@RequestBody @Valid Addr addr, BindingResult bindingResult) { | 
|         if(bindingResult != null && bindingResult.hasErrors()){ | 
|             return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); | 
|         } | 
|   | 
|         Long intakeId = addr.getIntakeId(); | 
|         String newRtuAddr = addr.getNewRtuAddr(); | 
|         Long operator = addr.getOperator(); | 
|         String commandCode = CodeV202404.cd_10; | 
|         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(); | 
|   | 
|         // 创建视图 | 
|         ComCd10Vo param = new ComCd10Vo() ; | 
|         param.controllerType = controllerType; | 
|         param.projectNo =projectNo; | 
|         param.rtuNewAddr = newRtuAddr; | 
|   | 
|         // 创建命令日志对象并添加到数据库中 | 
|         RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator); | 
|         comId = commandSv.insert(rmCommandHistory); | 
|         System.out.println(comId); | 
|   | 
|         // 构造命令 | 
|         Command com = command(comId, commandCode, rtuAddr, protocol, param); | 
|         sendCom2Mw(com); | 
|   | 
|         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)); | 
|             } | 
|         } catch (InterruptedException e) { | 
|             e.printStackTrace(); | 
|         } catch (ExecutionException e) { | 
|             e.printStackTrace(); | 
|         } catch (TimeoutException e) { | 
|             return BaseResponseUtils.buildFail("1分钟后去查看结果"); | 
|         } | 
|   | 
|   | 
|         //return BaseResponseUtils.buildSuccess(resultData.toJson()); | 
|   | 
|         return BaseResponseUtils.buildSuccess() ; | 
|     } | 
|   | 
|     /** | 
|      * 清除设备终端用水记录 | 
|      * @param po | 
|      * @param bindingResult | 
|      * @return | 
|      */ | 
|     @PostMapping(path = "clear_usage_record", consumes = MediaType.APPLICATION_JSON_VALUE) | 
|     @Transactional(rollbackFor = Exception.class) | 
|     @SsoAop() | 
|     public BaseResponse<Boolean> clearUsageRecord(@RequestBody @Valid DtoBase po, BindingResult bindingResult) { | 
|         if(bindingResult != null && bindingResult.hasErrors()){ | 
|             return BaseResponseUtils.buildFail(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); | 
|         } | 
|   | 
|         String commandCode = CodeV202404.cd_97; | 
|         Long intakeId = po.getIntakeId(); | 
|         Long operator = po.getOperator(); | 
|         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(); | 
|   | 
|         // 创建视图 | 
|         ComCdXyVo param = new ComCdXyVo(); | 
|         param.controllerType = controllerType; | 
|         param.projectNo = projectNo; | 
|   | 
|         // 创建命令日志对象并添加到数据库中 | 
|         RmCommandHistory rmCommandHistory = getComHistory(comId, commandCode, intakeId, rtuAddr, protocol, param, operator); | 
|         comId = commandSv.insert(rmCommandHistory); | 
|   | 
|         // 构造命令 | 
|         Command com = command(comId, commandCode, rtuAddr, protocol, param); | 
|         return sendCom2Mw(com); | 
|     } | 
| } |