liurunyu
2024-06-11 2e914bc2c2fc2fae4803b4c3b6483e205e4eb8a5
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV

 Conflicts:
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineDeal.java
 pipIrr-platform/pipIrr-web/pipIrr-mwTest-web/src/main/java/com/dy/pipIrrMwTestWeb/test/CommandP206V100Ctrl.java
45个文件已修改
18个文件已添加
2个文件已删除
3420 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/CodeV1_0_1.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/pom.xml 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComSupport.java 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/dto/Param.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/result/CommandResultCode.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrControllerMapper.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoPr/PrIntakeVcMapper.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmCommandHistoryMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeRechargeMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoPr/PrController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoPr/PrControllerTramp.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoPr/PrIntakeVc.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/pojoSe/SeClient.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/util/Org.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoUnclosedParam.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoClientWechat.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/application-database-pj.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/application-database-ym.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrControllerMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/PrIntakeVcMapper.xml 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmCommandHistoryMapper.xml 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientMapper.xml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeRechargeMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/local/localProtocol/RtuOnLineDeal.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-mwTest-web/src/main/java/com/dy/pipIrrMwTestWeb/test/CommandP206V100Ctrl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/controller/ControllerCtrl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/controller/ControllerSv.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intake/IntakeCtrl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intake/IntakeSv.java 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intake/qo/OnLineIntakesQO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intakeController/DtoIntakeController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-project/src/main/java/com/dy/pipIrrProject/intakeController/IntakeControllerCtrl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/ComSupport.java 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandResultCtrl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandSv.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/ValveClose.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/ValveOpen.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/enums/LastOperateENUM.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/result/RemoteResultCode.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java 207 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java 608 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/dto/DTOValve.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/PipIrrSellApplication.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/activeCard/ActiveCardCtrl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientCtrl.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/ClientSv.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/client/DtoClient.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/recharge/RechargeSv.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/result/SellResultCode.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentCtrl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/PaymentSv.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/wechatpay/dto/DtoOrder.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/pom.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandResultCtrl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandSv.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java 489 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/DtoBase.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveClose.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/ValveOpen.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/enums/LastOperateENUM.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/qo/OnLineIntakesQO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/result/WechatResultCode.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pom.xml 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>-->
<!--                &lt;!&ndash; spring boot提供的maven打包插件 &ndash;&gt;-->
<!--                <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>