liurunyu
2024-07-24 33af27ee7a189b538452fc9adb63e0784324e009
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
19个文件已修改
8个文件已添加
2181 ■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/downVos/Com99Vo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/downVos/ComA0Vo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComSupport.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmAlarmStateHistoryMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmAlarmStateLastMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmClientAmountDayLastMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmClientAmountDayMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoClientAmountDay.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoControllerAlarmState.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmAlarmStateHistoryMapper.xml 768 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmAlarmStateLastMapper.xml 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmClientAmountDayLastMapper.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmClientAmountDayMapper.xml 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/MidResultActionError.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/application-database.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandResultCtrl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/AutomaticClose.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/records/ClientAmountDayQueryVo.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/records/ControllerAlarmStateQueryVo.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/records/RecordsCtrl.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/records/RecordsSv.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java 194 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandResultCtrl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/AutomaticClose.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/downVos/Com99Vo.java
@@ -10,7 +10,7 @@
@Data
public class Com99Vo {
    public String icCardNo ;//17位虚拟IC卡编号(协议是10位数字)
    public Integer moneyRemain;//剩余金额(取值范围0.00~999999.99,单位为元)
    public Double moneyRemain;//剩余金额(取值范围0.00~999999.99,单位为元)
    public Double waterPrice;//水价(取值范围0.00~99.99元/m3)
    public Integer minutes ;//用水时长(0~9999分钟)
    public String orderNo ;//订单号(16位数字)
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/downVos/ComA0Vo.java
@@ -10,7 +10,7 @@
@Data
public class ComA0Vo {
    public String icCardNo ;//17位虚拟IC卡编号(协议是10位数字)
    public Integer moneyRemain;//剩余金额(取值范围0.00~999999.99,单位为元)
    public Double moneyRemain;//剩余金额(取值范围0.00~999999.99,单位为元)
    public Double waterPrice;//水价(取值范围0.00~99.99元/m3)
    public Integer waterAmount ;//预用水量(0~9999 m3)
    public String orderNo ;//订单号(16位数字)
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/command/ComSupport.java
@@ -19,6 +19,7 @@
import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@@ -48,13 +49,20 @@
    //@Value("${mw.comSendUrl}")
    protected String comSendUrl;
    protected static String controllerType = null;
    protected static Integer projectNo = null;
    //protected static String controllerType = null;
    //protected static Integer projectNo = null;
    @Value("${project.projectNo}")
    protected Integer projectNo;
    @Value("${project.controllerType}")
    protected String controllerType;
    protected String commandTypeOuter = CommandType.outerCommand;
    // 存储实例化的 CompletableFuture<Data> 对象
    protected static Map<Long, Object> features = new HashMap<>();
    protected static Boolean setuped = false;
    //protected static Boolean setuped = false;
    @Autowired
    private RestTemplate restTemplate;
@@ -89,11 +97,11 @@
    /**
     * 获取系统配置参数
     */
    public void setUp() {
        controllerType = comSupport.baSettingsMapper.getItemValue("controllerType");
        projectNo = Integer.parseInt(comSupport.baSettingsMapper.getItemValue("projectNo"));
        setuped = true;
    }
    //public void setUp() {
    //    controllerType = comSupport.baSettingsMapper.getItemValue("controllerType");
    //    projectNo = Integer.parseInt(comSupport.baSettingsMapper.getItemValue("projectNo"));
    //    setuped = true;
    //}
    /**
     * 生成订单号
@@ -322,6 +330,21 @@
            seVirtualCardMapper.updateByPrimaryKeySelective(virtualCard);
        }
        // 如果是开发命令(92-平台开阀,91-小程序开阀),返回结果中添加阀控器地址、虚拟卡编号、订单号
        if(commandCode.equals("92") || commandCode.equals("97")) {
            JSONObject job_response = (JSONObject) JSON.toJSON(response_CallBack);
            JSONObject job_param = (JSONObject) JSON.toJSON(param);
            JSONObject job_data = job_response.getJSONObject("content").getJSONObject("data");
            job_data.remove("success");
            job_data.put("intakeId", intakeId);
            job_data.put("rtuAddr", rtuAddr);
            job_data.put("vcNum", job_param.getString("icCardNo"));
            job_data.put("orderNo", job_param.getString("orderNo"));
            response_CallBack = JSON.parseObject(job_response.toJSONString(), BaseResponse.class);
        }
        // 回调返回的内容,回调结果写入命令日志表的任务由中间件完成
        return response_CallBack;
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmAlarmStateHistoryMapper.java
@@ -2,7 +2,11 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory;
import com.dy.pipIrrGlobal.voRm.VoControllerAlarmState;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -58,4 +62,18 @@
     * @return update count
     */
    int updateByPrimaryKey(RmAlarmStateHistory record);
    /**
     * 根据指定条件获取记录总数
     * @param params
     * @return
     */
    Long getRecordCount(Map<?, ?> params);
    /**
     * 根据指定条件获取记录
     * @param params
     * @return
     */
    List<VoControllerAlarmState> getControllerAlarmStateHistory(Map<?, ?> params);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmAlarmStateLastMapper.java
@@ -2,10 +2,11 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoRm.RmAlarmStateLast;
import com.dy.pipIrrGlobal.pojoRm.RmIntakeAmountDay;
import com.dy.pipIrrGlobal.voRm.VoControllerAlarmState;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -69,4 +70,19 @@
     * @return object by intakeId
     */
    List<RmAlarmStateLast> selectByIntakeId(Long intakeId);
    /**
     * 根据指定条件获取记录总数
     * @param params
     * @return
     */
    Long getRecordCount(Map<?, ?> params);
    /**
     * 根据指定条件获取记录
     * @param params
     * @return
     */
    List<VoControllerAlarmState> getControllerAlarmStateLast(Map<?, ?> params);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmClientAmountDayLastMapper.java
@@ -2,9 +2,11 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoRm.RmClientAmountDayLast;
import com.dy.pipIrrGlobal.voRm.VoClientAmountDay;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -62,4 +64,19 @@
     * @return update count
     */
    int updateByPrimaryKey(RmClientAmountDayLast record);
    /**
     * 根据指定条件获取记录总数
     * @param params
     * @return
     */
    Long getRecordCount(Map<?, ?> params);
    /**
     * 根据指定条件获取记录
     * @param params
     * @return
     */
    List<VoClientAmountDay> getClientAmountDayLast(Map<?, ?> params);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoRm/RmClientAmountDayMapper.java
@@ -2,11 +2,14 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dy.pipIrrGlobal.pojoRm.RmClientAmountDay;
import com.dy.pipIrrGlobal.voRm.VoClientAmountDay;
import com.dy.pipIrrGlobal.voRm.VoControllerAlarmState;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * @Author: liurunyu
@@ -71,4 +74,18 @@
     * @return update count
     */
    int updateByPrimaryKey(RmClientAmountDay record);
    /**
     * 根据指定条件获取记录总数
     * @param params
     * @return
     */
    Long getRecordCount(Map<?, ?> params);
    /**
     * 根据指定条件获取记录
     * @param params
     * @return
     */
    List<VoClientAmountDay> getClientAmountDayHistory(Map<?, ?> params);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoClientAmountDay.java
New file
@@ -0,0 +1,62 @@
package com.dy.pipIrrGlobal.voRm;
import com.dy.common.po.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.sql.Date;
/**
 * @author :WuZeYu
 * @Date :2024/7/23  16:21
 * @LastEditTime :2024/7/23  16:21
 * @Description
 */
@Data
@Schema(title = "农户日用水量统计视图对象")
public class VoClientAmountDay implements BaseEntity {
    private static final long serialVersionUID = 202407231622001L;
    @Schema(description = "农户ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private String clientId;
    @Schema(description = "日取水量", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private Double amount;
    @Schema(description = "日花费金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private Double money;
    @Schema(description = "统计日期(yyyy-mm-dd)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private java.sql.Date dt;
    @Schema(description = "统计日最后一次开阀日期时间(yyyy-mm-dd HH:MM:SS)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private java.util.Date openDtLast;
    @Schema(description = "统计日最后一次关阀日期时间(yyyy-mm-dd HH:MM:SS)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private java.util.Date closeDtLast;
    @Schema(description = "统计日最后一次开阀取水量", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private Double thisAmountLast;
    @Schema(description = "统计日最后一次开阀花费金额", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private Double thisMoneyLast;
    @Schema(description = "统计日最后一次开阀取水时长(分钟)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private Long thisTimeLast;
    @Schema(description = "统计日最后一次关阀上报控制器时钟", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private java.util.Date rtuDtLast;
    @Schema(description = "农户姓名", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private String clientName;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voRm/VoControllerAlarmState.java
New file
@@ -0,0 +1,93 @@
package com.dy.pipIrrGlobal.voRm;
import com.dy.common.po.BaseEntity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * @author :WuZeYu
 * @Date :2024/7/23  8:39
 * @LastEditTime :2024/7/23  8:39
 * @Description
 */
@Data
@Schema(title = "控制器报警与状态视图对象")
public class VoControllerAlarmState implements BaseEntity {
    private static final long serialVersionUID = 202407230842001L;
    @Schema(description = "控制器ID")
    private String controllerId;
    @Schema(description = "取水口ID")
    private String intakeId;
    @Schema(description = "取水口名称")
    private String intakeName;
    @Schema(description = "控制器地址")
    private String rtuAddr;
    @Schema(description = "上报日期时间")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date dt;
    @Schema(description = "状态-阀门/泵(0打开、1关闭)")
    private Byte valveState;
    @Schema(description = "剩余水量小于报警上限报警报警(1:报警, 0:正常)")
    private Byte alarmRemainWater;
    @Schema(description = "剩余水量为0关泵/阀(1:关泵,0:正常)")
    private Byte alarm0WaterRemain;
    @Schema(description = "年用水量大于限制水量报警(1:报警 0:正常)")
    private Byte alarmExceedYear;
    @Schema(description = "流量计故障(1:报警,0:正常)")
    private Byte alarmWaterMeterFault;
    @Schema(description = "漏损(偷水)报警(1:报警, 0:正常)")
    private Byte alarmLoss;
    @Schema(description = "流量计损坏(正常通讯但瞬时为0)报警(1:报警,0:正常)")
    private Byte alarmWaterMeterBreak;
    @Schema(description = "电表故障报警(1:报警,0:正常)")
    private Byte alarmEleMeterFault;
    @Schema(description = "剩余金额为0(1:报警,0:正常)")
    private Byte alarm0MoneyRemain;
    @Schema(description = "控制器内门报警(1:报警,0:正常)")
    private Byte alarmInnerDoor;
    @Schema(description = "控制器外门打开报警(1:报警,0:正常)")
    private Byte alarmOuterDoor;
    @Schema(description = "交流缺项报警(1:报警,0:正常)")
    private Byte alarmEleMiss;
    @Schema(description = "交流过流报警(1:报警,0:正常)")
    private Byte alarmEleExceed;
    @Schema(description = "三相电欠压报警(1:报警,0:正常)")
    private Byte alarmEleLowVolt;
    @Schema(description = "IC卡状态(1、有效,0:无效)")
    private Byte stateIcEnable;
    @Schema(description = "电池电压报警(1:报警,0:正常)")
    private Byte alarmBatteryVolt;
    @Schema(description = "阀门报警(1:报警,0:正常)")
    private Byte alarmValve;
    @Schema(description = "供电方式(0: 220V,1:蓄电池)")
    private Byte powerType;
}
pipIrr-platform/pipIrr-global/src/main/resources/application-global.yml
@@ -72,7 +72,7 @@
pipIrr:
    global:
        dev: true   #是否开发阶段,true或false
        dev: false   #是否开发阶段,true或false
        dsName: ym  #开发阶段,设置临时的数据库名称
    mw:
        webPort: 8070
@@ -130,6 +130,14 @@
#    ym: 100
#    pj: 101
#项目配置
project:
    #项目编码
    projectNo: 10
    #控制器类型
    controllerType: 57
#通讯协议
#protocol: DYJS_2023,DYJS_2024
mw:
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmAlarmStateHistoryMapper.xml
@@ -1,327 +1,495 @@
<?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.daoRm.RmAlarmStateHistoryMapper">
  <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
    <!--@mbg.generated-->
    <!--@Table rm_alarm_state_history-->
    <id column="id" jdbcType="BIGINT" property="id" />
    <result column="controller_id" jdbcType="BIGINT" property="controllerId" />
    <result column="intake_id" jdbcType="BIGINT" property="intakeId" />
    <result column="rtu_addr" jdbcType="VARCHAR" property="rtuAddr" />
    <result column="dt" jdbcType="TIMESTAMP" property="dt" />
    <result column="rtu_dt" jdbcType="TIMESTAMP" property="rtuDt" />
    <result column="valve_state" jdbcType="TINYINT" property="valveState" />
    <result column="alarm_remain_water" jdbcType="TINYINT" property="alarmRemainWater" />
    <result column="alarm0_water_remain" jdbcType="TINYINT" property="alarm0WaterRemain" />
    <result column="alarm_exceed_year" jdbcType="TINYINT" property="alarmExceedYear" />
    <result column="alarm_water_meter_fault" jdbcType="TINYINT" property="alarmWaterMeterFault" />
    <result column="alarm_loss" jdbcType="TINYINT" property="alarmLoss" />
    <result column="alarm_water_meter_break" jdbcType="TINYINT" property="alarmWaterMeterBreak" />
    <result column="alarm_ele_meter_fault" jdbcType="TINYINT" property="alarmEleMeterFault" />
    <result column="alarm0_money_remain" jdbcType="TINYINT" property="alarm0MoneyRemain" />
    <result column="alarm_inner_door" jdbcType="TINYINT" property="alarmInnerDoor" />
    <result column="alarm_outer_door" jdbcType="TINYINT" property="alarmOuterDoor" />
    <result column="alarm_ele_miss" jdbcType="TINYINT" property="alarmEleMiss" />
    <result column="alarm_ele_exceed" jdbcType="TINYINT" property="alarmEleExceed" />
    <result column="alarm_ele_low_volt" jdbcType="TINYINT" property="alarmEleLowVolt" />
    <result column="state_ic_enable" jdbcType="TINYINT" property="stateIcEnable" />
    <result column="alarm_battery_volt" jdbcType="TINYINT" property="alarmBatteryVolt" />
    <result column="alarm_valve" jdbcType="TINYINT" property="alarmValve" />
    <result column="power_type" jdbcType="TINYINT" property="powerType" />
  </resultMap>
  <sql id="Base_Column_List">
    <!--@mbg.generated-->
    id, controller_id, intake_id, rtu_addr, dt, rtu_dt, valve_state, alarm_remain_water,
    alarm0_water_remain, alarm_exceed_year, alarm_water_meter_fault, alarm_loss, alarm_water_meter_break,
    alarm_ele_meter_fault, alarm0_money_remain, alarm_inner_door, alarm_outer_door, alarm_ele_miss,
    alarm_ele_exceed, alarm_ele_low_volt, state_ic_enable,alarm_battery_volt,alarm_valve,power_type
  </sql>
  <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
    <!--@mbg.generated-->
    select
    <include refid="Base_Column_List" />
    from rm_alarm_state_history
    where id = #{id,jdbcType=BIGINT}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
    <!--@mbg.generated-->
    delete from rm_alarm_state_history
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
    <!--@mbg.generated-->
    insert into rm_alarm_state_history (id, controller_id, intake_id,
      rtu_addr, dt, rtu_dt,
      valve_state, alarm_remain_water, alarm0_water_remain,
      alarm_exceed_year, alarm_water_meter_fault,
      alarm_loss, alarm_water_meter_break, alarm_ele_meter_fault,
      alarm0_money_remain, alarm_inner_door, alarm_outer_door,
      alarm_ele_miss, alarm_ele_exceed, alarm_ele_low_volt,
      state_ic_enable,alarm_battery_volt,alarm_valve,power_type)
    values (#{id,jdbcType=BIGINT}, #{controllerId,jdbcType=BIGINT}, #{intakeId,jdbcType=BIGINT},
      #{rtuAddr,jdbcType=VARCHAR}, #{dt,jdbcType=TIMESTAMP}, #{rtuDt,jdbcType=TIMESTAMP},
      #{valveState,jdbcType=TINYINT}, #{alarmRemainWater,jdbcType=TINYINT}, #{alarm0WaterRemain,jdbcType=TINYINT},
      #{alarmExceedYear,jdbcType=TINYINT}, #{alarmWaterMeterFault,jdbcType=TINYINT},
      #{alarmLoss,jdbcType=TINYINT}, #{alarmWaterMeterBreak,jdbcType=TINYINT}, #{alarmEleMeterFault,jdbcType=TINYINT},
      #{alarm0MoneyRemain,jdbcType=TINYINT}, #{alarmInnerDoor,jdbcType=TINYINT}, #{alarmOuterDoor,jdbcType=TINYINT},
      #{alarmEleMiss,jdbcType=TINYINT}, #{alarmEleExceed,jdbcType=TINYINT}, #{alarmEleLowVolt,jdbcType=TINYINT},
      #{stateIcEnable,jdbcType=TINYINT}, #{alarmBatteryVolt,jdbcType=TINYINT}, #{alarmValve,jdbcType=TINYINT},
      #{powerType,jdbcType=TINYINT})
  </insert>
  <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
    <!--@mbg.generated-->
    insert into rm_alarm_state_history
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
    <resultMap id="BaseResultMap" type="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
        <!--@mbg.generated-->
        <!--@Table rm_alarm_state_history-->
        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="controller_id" jdbcType="BIGINT" property="controllerId"/>
        <result column="intake_id" jdbcType="BIGINT" property="intakeId"/>
        <result column="rtu_addr" jdbcType="VARCHAR" property="rtuAddr"/>
        <result column="dt" jdbcType="TIMESTAMP" property="dt"/>
        <result column="rtu_dt" jdbcType="TIMESTAMP" property="rtuDt"/>
        <result column="valve_state" jdbcType="TINYINT" property="valveState"/>
        <result column="alarm_remain_water" jdbcType="TINYINT" property="alarmRemainWater"/>
        <result column="alarm0_water_remain" jdbcType="TINYINT" property="alarm0WaterRemain"/>
        <result column="alarm_exceed_year" jdbcType="TINYINT" property="alarmExceedYear"/>
        <result column="alarm_water_meter_fault" jdbcType="TINYINT" property="alarmWaterMeterFault"/>
        <result column="alarm_loss" jdbcType="TINYINT" property="alarmLoss"/>
        <result column="alarm_water_meter_break" jdbcType="TINYINT" property="alarmWaterMeterBreak"/>
        <result column="alarm_ele_meter_fault" jdbcType="TINYINT" property="alarmEleMeterFault"/>
        <result column="alarm0_money_remain" jdbcType="TINYINT" property="alarm0MoneyRemain"/>
        <result column="alarm_inner_door" jdbcType="TINYINT" property="alarmInnerDoor"/>
        <result column="alarm_outer_door" jdbcType="TINYINT" property="alarmOuterDoor"/>
        <result column="alarm_ele_miss" jdbcType="TINYINT" property="alarmEleMiss"/>
        <result column="alarm_ele_exceed" jdbcType="TINYINT" property="alarmEleExceed"/>
        <result column="alarm_ele_low_volt" jdbcType="TINYINT" property="alarmEleLowVolt"/>
        <result column="state_ic_enable" jdbcType="TINYINT" property="stateIcEnable"/>
        <result column="alarm_battery_volt" jdbcType="TINYINT" property="alarmBatteryVolt"/>
        <result column="alarm_valve" jdbcType="TINYINT" property="alarmValve"/>
        <result column="power_type" jdbcType="TINYINT" property="powerType"/>
    </resultMap>
    <sql id="Base_Column_List">
        <!--@mbg.generated-->
        id,
      </if>
      <if test="controllerId != null">
        controller_id,
      </if>
      <if test="intakeId != null">
        intake_id,
      </if>
      <if test="rtuAddr != null">
        rtu_addr,
      </if>
      <if test="dt != null">
        dt,
      </if>
      <if test="rtuDt != null">
        rtu_dt,
      </if>
      <if test="valveState != null">
        valve_state,
      </if>
      <if test="alarmRemainWater != null">
        alarm_remain_water,
      </if>
      <if test="alarm0WaterRemain != null">
        alarm0_water_remain,
      </if>
      <if test="alarmExceedYear != null">
        alarm_exceed_year,
      </if>
      <if test="alarmWaterMeterFault != null">
        alarm_water_meter_fault,
      </if>
      <if test="alarmLoss != null">
        alarm_loss,
      </if>
      <if test="alarmWaterMeterBreak != null">
        alarm_water_meter_break,
      </if>
      <if test="alarmEleMeterFault != null">
        alarm_ele_meter_fault,
      </if>
      <if test="alarm0MoneyRemain != null">
        alarm0_money_remain,
      </if>
      <if test="alarmInnerDoor != null">
        alarm_inner_door,
      </if>
      <if test="alarmOuterDoor != null">
        alarm_outer_door,
      </if>
      <if test="alarmEleMiss != null">
        alarm_ele_miss,
      </if>
      <if test="alarmEleExceed != null">
        alarm_ele_exceed,
      </if>
      <if test="alarmEleLowVolt != null">
        alarm_ele_low_volt,
      </if>
      <if test="stateIcEnable != null">
        state_ic_enable,
      </if>
      <if test="alarmBatteryVolt != null">
        alarm_battery_volt,
      </if>
      <if test="alarmValve != null">
        alarm_valve,
      </if>
      <if test="powerType != null">
        power_type,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=BIGINT},
      </if>
      <if test="controllerId != null">
        #{controllerId,jdbcType=BIGINT},
      </if>
      <if test="intakeId != null">
        #{intakeId,jdbcType=BIGINT},
      </if>
      <if test="rtuAddr != null">
        #{rtuAddr,jdbcType=VARCHAR},
      </if>
      <if test="dt != null">
        #{dt,jdbcType=TIMESTAMP},
      </if>
      <if test="rtuDt != null">
        #{rtuDt,jdbcType=TIMESTAMP},
      </if>
      <if test="valveState != null">
        #{valveState,jdbcType=TINYINT},
      </if>
      <if test="alarmRemainWater != null">
        #{alarmRemainWater,jdbcType=TINYINT},
      </if>
      <if test="alarm0WaterRemain != null">
        #{alarm0WaterRemain,jdbcType=TINYINT},
      </if>
      <if test="alarmExceedYear != null">
        #{alarmExceedYear,jdbcType=TINYINT},
      </if>
      <if test="alarmWaterMeterFault != null">
        #{alarmWaterMeterFault,jdbcType=TINYINT},
      </if>
      <if test="alarmLoss != null">
        #{alarmLoss,jdbcType=TINYINT},
      </if>
      <if test="alarmWaterMeterBreak != null">
        #{alarmWaterMeterBreak,jdbcType=TINYINT},
      </if>
      <if test="alarmEleMeterFault != null">
        #{alarmEleMeterFault,jdbcType=TINYINT},
      </if>
      <if test="alarm0MoneyRemain != null">
        #{alarm0MoneyRemain,jdbcType=TINYINT},
      </if>
      <if test="alarmInnerDoor != null">
        #{alarmInnerDoor,jdbcType=TINYINT},
      </if>
      <if test="alarmOuterDoor != null">
        #{alarmOuterDoor,jdbcType=TINYINT},
      </if>
      <if test="alarmEleMiss != null">
        #{alarmEleMiss,jdbcType=TINYINT},
      </if>
      <if test="alarmEleExceed != null">
        #{alarmEleExceed,jdbcType=TINYINT},
      </if>
      <if test="alarmEleLowVolt != null">
        #{alarmEleLowVolt,jdbcType=TINYINT},
      </if>
      <if test="stateIcEnable != null">
        #{stateIcEnable,jdbcType=TINYINT},
      </if>
      <if test="alarmBatteryVolt != null">
        #{alarmBatteryVolt,jdbcType=TINYINT},
      </if>
      <if test="alarmValve != null">
        #{alarmValve,jdbcType=TINYINT},
      </if>
     <if test="powerType != null">
        #{powerType,jdbcType=TINYINT},
      </if>
    </trim>
  </insert>
  <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
    <!--@mbg.generated-->
    update rm_alarm_state_history
    <set>
      <if test="controllerId != null">
        controller_id = #{controllerId,jdbcType=BIGINT},
      </if>
      <if test="intakeId != null">
        intake_id = #{intakeId,jdbcType=BIGINT},
      </if>
      <if test="rtuAddr != null">
        rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
      </if>
      <if test="dt != null">
        dt = #{dt,jdbcType=TIMESTAMP},
      </if>
      <if test="rtuDt != null">
        rtu_dt = #{rtuDt,jdbcType=TIMESTAMP},
      </if>
      <if test="valveState != null">
        valve_state = #{valveState,jdbcType=TINYINT},
      </if>
      <if test="alarmRemainWater != null">
        alarm_remain_water = #{alarmRemainWater,jdbcType=TINYINT},
      </if>
      <if test="alarm0WaterRemain != null">
        alarm0_water_remain = #{alarm0WaterRemain,jdbcType=TINYINT},
      </if>
      <if test="alarmExceedYear != null">
        alarm_exceed_year = #{alarmExceedYear,jdbcType=TINYINT},
      </if>
      <if test="alarmWaterMeterFault != null">
        alarm_water_meter_fault = #{alarmWaterMeterFault,jdbcType=TINYINT},
      </if>
      <if test="alarmLoss != null">
        alarm_loss = #{alarmLoss,jdbcType=TINYINT},
      </if>
      <if test="alarmWaterMeterBreak != null">
        alarm_water_meter_break = #{alarmWaterMeterBreak,jdbcType=TINYINT},
      </if>
      <if test="alarmEleMeterFault != null">
        alarm_ele_meter_fault = #{alarmEleMeterFault,jdbcType=TINYINT},
      </if>
      <if test="alarm0MoneyRemain != null">
        alarm0_money_remain = #{alarm0MoneyRemain,jdbcType=TINYINT},
      </if>
      <if test="alarmInnerDoor != null">
        alarm_inner_door = #{alarmInnerDoor,jdbcType=TINYINT},
      </if>
      <if test="alarmOuterDoor != null">
        alarm_outer_door = #{alarmOuterDoor,jdbcType=TINYINT},
      </if>
      <if test="alarmEleMiss != null">
        alarm_ele_miss = #{alarmEleMiss,jdbcType=TINYINT},
      </if>
      <if test="alarmEleExceed != null">
        alarm_ele_exceed = #{alarmEleExceed,jdbcType=TINYINT},
      </if>
      <if test="alarmEleLowVolt != null">
        alarm_ele_low_volt = #{alarmEleLowVolt,jdbcType=TINYINT},
      </if>
      <if test="stateIcEnable != null">
        state_ic_enable = #{stateIcEnable,jdbcType=TINYINT},
      </if>
      <if test="alarmBatteryVolt != null">
        alarm_battery_volt = #{alarmBatteryVolt,jdbcType=TINYINT},
      </if>
     <if test="alarmValve != null">
        alarm_valve = #{alarmValve,jdbcType=TINYINT},
      </if>
    <if test="powerType != null">
        power_type = #{powerType,jdbcType=TINYINT},
      </if>
    </set>
    where id = #{id,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
    <!--@mbg.generated-->
    update rm_alarm_state_history
    set controller_id = #{controllerId,jdbcType=BIGINT},
      intake_id = #{intakeId,jdbcType=BIGINT},
      rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
      dt = #{dt,jdbcType=TIMESTAMP},
      rtu_dt = #{rtuDt,jdbcType=TIMESTAMP},
      valve_state = #{valveState,jdbcType=TINYINT},
      alarm_remain_water = #{alarmRemainWater,jdbcType=TINYINT},
      alarm0_water_remain = #{alarm0WaterRemain,jdbcType=TINYINT},
      alarm_exceed_year = #{alarmExceedYear,jdbcType=TINYINT},
      alarm_water_meter_fault = #{alarmWaterMeterFault,jdbcType=TINYINT},
      alarm_loss = #{alarmLoss,jdbcType=TINYINT},
      alarm_water_meter_break = #{alarmWaterMeterBreak,jdbcType=TINYINT},
      alarm_ele_meter_fault = #{alarmEleMeterFault,jdbcType=TINYINT},
      alarm0_money_remain = #{alarm0MoneyRemain,jdbcType=TINYINT},
      alarm_inner_door = #{alarmInnerDoor,jdbcType=TINYINT},
      alarm_outer_door = #{alarmOuterDoor,jdbcType=TINYINT},
      alarm_ele_miss = #{alarmEleMiss,jdbcType=TINYINT},
      alarm_ele_exceed = #{alarmEleExceed,jdbcType=TINYINT},
      alarm_ele_low_volt = #{alarmEleLowVolt,jdbcType=TINYINT},
      state_ic_enable = #{stateIcEnable,jdbcType=TINYINT},
      alarm_battery_volt = #{alarmBatteryVolt,jdbcType=TINYINT},
      alarm_valve = #{alarmValve,jdbcType=TINYINT},
      power_type = #{powerType,jdbcType=TINYINT}
    where id = #{id,jdbcType=BIGINT}
  </update>
        power_type
    </sql>
    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
        <!--@mbg.generated-->
        select
        <include refid="Base_Column_List"/>
        from rm_alarm_state_history
        where id = #{id,jdbcType=BIGINT}
    </select>
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
        <!--@mbg.generated-->
        delete
        from rm_alarm_state_history
        where id = #{id,jdbcType=BIGINT}
    </delete>
    <insert id="insert" parameterType="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
        <!--@mbg.generated-->
        insert into rm_alarm_state_history (id, controller_id, intake_id,
                                            rtu_addr, dt, rtu_dt,
                                            valve_state, alarm_remain_water, alarm0_water_remain,
                                            alarm_exceed_year, alarm_water_meter_fault,
                                            alarm_loss, alarm_water_meter_break, alarm_ele_meter_fault,
                                            alarm0_money_remain, alarm_inner_door, alarm_outer_door,
                                            alarm_ele_miss, alarm_ele_exceed, alarm_ele_low_volt,
                                            state_ic_enable, alarm_battery_volt, alarm_valve, power_type)
        values (#{id,jdbcType=BIGINT}, #{controllerId,jdbcType=BIGINT}, #{intakeId,jdbcType=BIGINT},
                #{rtuAddr,jdbcType=VARCHAR}, #{dt,jdbcType=TIMESTAMP}, #{rtuDt,jdbcType=TIMESTAMP},
                #{valveState,jdbcType=TINYINT}, #{alarmRemainWater,jdbcType=TINYINT},
                #{alarm0WaterRemain,jdbcType=TINYINT},
                #{alarmExceedYear,jdbcType=TINYINT}, #{alarmWaterMeterFault,jdbcType=TINYINT},
                #{alarmLoss,jdbcType=TINYINT}, #{alarmWaterMeterBreak,jdbcType=TINYINT},
                #{alarmEleMeterFault,jdbcType=TINYINT},
                #{alarm0MoneyRemain,jdbcType=TINYINT}, #{alarmInnerDoor,jdbcType=TINYINT},
                #{alarmOuterDoor,jdbcType=TINYINT},
                #{alarmEleMiss,jdbcType=TINYINT}, #{alarmEleExceed,jdbcType=TINYINT},
                #{alarmEleLowVolt,jdbcType=TINYINT},
                #{stateIcEnable,jdbcType=TINYINT}, #{alarmBatteryVolt,jdbcType=TINYINT}, #{alarmValve,jdbcType=TINYINT},
                #{powerType,jdbcType=TINYINT})
    </insert>
    <insert id="insertSelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
        <!--@mbg.generated-->
        insert into rm_alarm_state_history
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="id != null">
                id,
            </if>
            <if test="controllerId != null">
                controller_id,
            </if>
            <if test="intakeId != null">
                intake_id,
            </if>
            <if test="rtuAddr != null">
                rtu_addr,
            </if>
            <if test="dt != null">
                dt,
            </if>
            <if test="rtuDt != null">
                rtu_dt,
            </if>
            <if test="valveState != null">
                valve_state,
            </if>
            <if test="alarmRemainWater != null">
                alarm_remain_water,
            </if>
            <if test="alarm0WaterRemain != null">
                alarm0_water_remain,
            </if>
            <if test="alarmExceedYear != null">
                alarm_exceed_year,
            </if>
            <if test="alarmWaterMeterFault != null">
                alarm_water_meter_fault,
            </if>
            <if test="alarmLoss != null">
                alarm_loss,
            </if>
            <if test="alarmWaterMeterBreak != null">
                alarm_water_meter_break,
            </if>
            <if test="alarmEleMeterFault != null">
                alarm_ele_meter_fault,
            </if>
            <if test="alarm0MoneyRemain != null">
                alarm0_money_remain,
            </if>
            <if test="alarmInnerDoor != null">
                alarm_inner_door,
            </if>
            <if test="alarmOuterDoor != null">
                alarm_outer_door,
            </if>
            <if test="alarmEleMiss != null">
                alarm_ele_miss,
            </if>
            <if test="alarmEleExceed != null">
                alarm_ele_exceed,
            </if>
            <if test="alarmEleLowVolt != null">
                alarm_ele_low_volt,
            </if>
            <if test="stateIcEnable != null">
                state_ic_enable,
            </if>
            <if test="alarmBatteryVolt != null">
                alarm_battery_volt,
            </if>
            <if test="alarmValve != null">
                alarm_valve,
            </if>
            <if test="powerType != null">
                power_type,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="id != null">
                #{id,jdbcType=BIGINT},
            </if>
            <if test="controllerId != null">
                #{controllerId,jdbcType=BIGINT},
            </if>
            <if test="intakeId != null">
                #{intakeId,jdbcType=BIGINT},
            </if>
            <if test="rtuAddr != null">
                #{rtuAddr,jdbcType=VARCHAR},
            </if>
            <if test="dt != null">
                #{dt,jdbcType=TIMESTAMP},
            </if>
            <if test="rtuDt != null">
                #{rtuDt,jdbcType=TIMESTAMP},
            </if>
            <if test="valveState != null">
                #{valveState,jdbcType=TINYINT},
            </if>
            <if test="alarmRemainWater != null">
                #{alarmRemainWater,jdbcType=TINYINT},
            </if>
            <if test="alarm0WaterRemain != null">
                #{alarm0WaterRemain,jdbcType=TINYINT},
            </if>
            <if test="alarmExceedYear != null">
                #{alarmExceedYear,jdbcType=TINYINT},
            </if>
            <if test="alarmWaterMeterFault != null">
                #{alarmWaterMeterFault,jdbcType=TINYINT},
            </if>
            <if test="alarmLoss != null">
                #{alarmLoss,jdbcType=TINYINT},
            </if>
            <if test="alarmWaterMeterBreak != null">
                #{alarmWaterMeterBreak,jdbcType=TINYINT},
            </if>
            <if test="alarmEleMeterFault != null">
                #{alarmEleMeterFault,jdbcType=TINYINT},
            </if>
            <if test="alarm0MoneyRemain != null">
                #{alarm0MoneyRemain,jdbcType=TINYINT},
            </if>
            <if test="alarmInnerDoor != null">
                #{alarmInnerDoor,jdbcType=TINYINT},
            </if>
            <if test="alarmOuterDoor != null">
                #{alarmOuterDoor,jdbcType=TINYINT},
            </if>
            <if test="alarmEleMiss != null">
                #{alarmEleMiss,jdbcType=TINYINT},
            </if>
            <if test="alarmEleExceed != null">
                #{alarmEleExceed,jdbcType=TINYINT},
            </if>
            <if test="alarmEleLowVolt != null">
                #{alarmEleLowVolt,jdbcType=TINYINT},
            </if>
            <if test="stateIcEnable != null">
                #{stateIcEnable,jdbcType=TINYINT},
            </if>
            <if test="alarmBatteryVolt != null">
                #{alarmBatteryVolt,jdbcType=TINYINT},
            </if>
            <if test="alarmValve != null">
                #{alarmValve,jdbcType=TINYINT},
            </if>
            <if test="powerType != null">
                #{powerType,jdbcType=TINYINT},
            </if>
        </trim>
    </insert>
    <update id="updateByPrimaryKeySelective" parameterType="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
        <!--@mbg.generated-->
        update rm_alarm_state_history
        <set>
            <if test="controllerId != null">
                controller_id = #{controllerId,jdbcType=BIGINT},
            </if>
            <if test="intakeId != null">
                intake_id = #{intakeId,jdbcType=BIGINT},
            </if>
            <if test="rtuAddr != null">
                rtu_addr = #{rtuAddr,jdbcType=VARCHAR},
            </if>
            <if test="dt != null">
                dt = #{dt,jdbcType=TIMESTAMP},
            </if>
            <if test="rtuDt != null">
                rtu_dt = #{rtuDt,jdbcType=TIMESTAMP},
            </if>
            <if test="valveState != null">
                valve_state = #{valveState,jdbcType=TINYINT},
            </if>
            <if test="alarmRemainWater != null">
                alarm_remain_water = #{alarmRemainWater,jdbcType=TINYINT},
            </if>
            <if test="alarm0WaterRemain != null">
                alarm0_water_remain = #{alarm0WaterRemain,jdbcType=TINYINT},
            </if>
            <if test="alarmExceedYear != null">
                alarm_exceed_year = #{alarmExceedYear,jdbcType=TINYINT},
            </if>
            <if test="alarmWaterMeterFault != null">
                alarm_water_meter_fault = #{alarmWaterMeterFault,jdbcType=TINYINT},
            </if>
            <if test="alarmLoss != null">
                alarm_loss = #{alarmLoss,jdbcType=TINYINT},
            </if>
            <if test="alarmWaterMeterBreak != null">
                alarm_water_meter_break = #{alarmWaterMeterBreak,jdbcType=TINYINT},
            </if>
            <if test="alarmEleMeterFault != null">
                alarm_ele_meter_fault = #{alarmEleMeterFault,jdbcType=TINYINT},
            </if>
            <if test="alarm0MoneyRemain != null">
                alarm0_money_remain = #{alarm0MoneyRemain,jdbcType=TINYINT},
            </if>
            <if test="alarmInnerDoor != null">
                alarm_inner_door = #{alarmInnerDoor,jdbcType=TINYINT},
            </if>
            <if test="alarmOuterDoor != null">
                alarm_outer_door = #{alarmOuterDoor,jdbcType=TINYINT},
            </if>
            <if test="alarmEleMiss != null">
                alarm_ele_miss = #{alarmEleMiss,jdbcType=TINYINT},
            </if>
            <if test="alarmEleExceed != null">
                alarm_ele_exceed = #{alarmEleExceed,jdbcType=TINYINT},
            </if>
            <if test="alarmEleLowVolt != null">
                alarm_ele_low_volt = #{alarmEleLowVolt,jdbcType=TINYINT},
            </if>
            <if test="stateIcEnable != null">
                state_ic_enable = #{stateIcEnable,jdbcType=TINYINT},
            </if>
            <if test="alarmBatteryVolt != null">
                alarm_battery_volt = #{alarmBatteryVolt,jdbcType=TINYINT},
            </if>
            <if test="alarmValve != null">
                alarm_valve = #{alarmValve,jdbcType=TINYINT},
            </if>
            <if test="powerType != null">
                power_type = #{powerType,jdbcType=TINYINT},
            </if>
        </set>
        where id = #{id,jdbcType=BIGINT}
    </update>
    <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoRm.RmAlarmStateHistory">
        <!--@mbg.generated-->
        update rm_alarm_state_history
        set controller_id           = #{controllerId,jdbcType=BIGINT},
            intake_id               = #{intakeId,jdbcType=BIGINT},
            rtu_addr                = #{rtuAddr,jdbcType=VARCHAR},
            dt                      = #{dt,jdbcType=TIMESTAMP},
            rtu_dt                  = #{rtuDt,jdbcType=TIMESTAMP},
            valve_state             = #{valveState,jdbcType=TINYINT},
            alarm_remain_water      = #{alarmRemainWater,jdbcType=TINYINT},
            alarm0_water_remain     = #{alarm0WaterRemain,jdbcType=TINYINT},
            alarm_exceed_year       = #{alarmExceedYear,jdbcType=TINYINT},
            alarm_water_meter_fault = #{alarmWaterMeterFault,jdbcType=TINYINT},
            alarm_loss              = #{alarmLoss,jdbcType=TINYINT},
            alarm_water_meter_break = #{alarmWaterMeterBreak,jdbcType=TINYINT},
            alarm_ele_meter_fault   = #{alarmEleMeterFault,jdbcType=TINYINT},
            alarm0_money_remain     = #{alarm0MoneyRemain,jdbcType=TINYINT},
            alarm_inner_door        = #{alarmInnerDoor,jdbcType=TINYINT},
            alarm_outer_door        = #{alarmOuterDoor,jdbcType=TINYINT},
            alarm_ele_miss          = #{alarmEleMiss,jdbcType=TINYINT},
            alarm_ele_exceed        = #{alarmEleExceed,jdbcType=TINYINT},
            alarm_ele_low_volt      = #{alarmEleLowVolt,jdbcType=TINYINT},
            state_ic_enable         = #{stateIcEnable,jdbcType=TINYINT},
            alarm_battery_volt      = #{alarmBatteryVolt,jdbcType=TINYINT},
            alarm_valve             = #{alarmValve,jdbcType=TINYINT},
            power_type              = #{powerType,jdbcType=TINYINT}
        where id = #{id,jdbcType=BIGINT}
    </update>
    <!--根据指定条件获取记录总数-->
<select id="getRecordCount" resultType="java.lang.Long">
    select count(*)
    from rm_alarm_state_history rash
    Left join pr_intake pint on rash.intake_id = pint.id
    <where>
       <if test="alarmState == 1">
                and (
                    alarm_remain_water = 1
                    or alarm0_water_remain = 1
                    or alarm_exceed_year = 1
                    or alarm_water_meter_fault = 1
                    or alarm_loss = 1
                    or alarm_water_meter_break = 1
                    or alarm_ele_meter_fault = 1
                    or alarm0_money_remain = 1
                    or alarm_inner_door = 1
                    or alarm_outer_door = 1
                    or alarm_ele_miss = 1
                    or alarm_ele_exceed = 1
                    or alarm_ele_low_volt = 1
                    or alarm_battery_volt = 1
                    or alarm_valve = 1
                )
       </if>
       <if test="alarmState == 0">
           and (
                alarm_remain_water = 0
                and alarm0_water_remain = 0
                and alarm_exceed_year = 0
                and alarm_water_meter_fault = 0
                and alarm_loss = 0
                and alarm_water_meter_break = 0
                and alarm_ele_meter_fault = 0
                and alarm0_money_remain = 0
                and alarm_inner_door = 0
                and alarm_outer_door = 0
                and alarm_ele_miss = 0
                and alarm_ele_exceed = 0
                and alarm_ele_low_volt = 0
                and alarm_battery_volt = 0
                and alarm_valve = 0
                )
        </if>
        <if test="valveState != null">
            and rash.valve_state = #{valveState,jdbcType=TINYINT}
        </if>
        <if test="intakeName != null">
             and pint.name = #{intakeName,jdbcType=VARCHAR}
        </if>
        <if test="startDt != null">
             and rash.dt &gt;= #{startDt,jdbcType=TIMESTAMP}
        </if>
        <if test="endDt != null">
             and rash.dt &lt;= #{endDt,jdbcType=TIMESTAMP}
        </if>
        </where>
    </select>
    <!--根据指定条件获取记录-->
    <select id="getControllerAlarmStateHistory" resultType="com.dy.pipIrrGlobal.voRm.VoControllerAlarmState">
        select
        CAST(rash.controller_id AS char)AS controllerId,
        CAST(rash.intake_id AS char)AS intakeId,
        pint.name as intakeName,
        rash.rtu_addr as rtuAddr,
        rash.dt as dt,
        rash.valve_state as valveState,
        rash.alarm_remain_water as alarmRemainWater,
        rash.alarm0_water_remain as alarm0WaterRemain,
        rash.alarm_exceed_year as alarmExceedYear,
        rash.alarm_water_meter_fault as alarmWaterMeterFault,
        rash.alarm_loss as alarmLoss,
        rash.alarm_water_meter_break as alarmWaterMeterBreak,
        rash.alarm_ele_meter_fault as alarmEleMeterFault,
        rash.alarm0_money_remain as alarm0MoneyRemain,
        rash.alarm_inner_door as alarmInnerDoor,
        rash.alarm_outer_door as alarmOuterDoor,
        rash.alarm_ele_miss as alarmEleMiss,
        rash.alarm_ele_exceed as alarmEleExceed,
        rash.alarm_ele_low_volt as alarmEleLowVolt,
        rash.state_ic_enable as stateIcEnable,
        rash.alarm_battery_volt as alarmBatteryVolt,
        rash.alarm_valve as alarmValve,
        rash.power_type as powerType
        from rm_alarm_state_history rash
        Left join pr_intake pint on rash.intake_id = pint.id
        <where>
            <if test="alarmState == 1">
                and (
                alarm_remain_water = 1
                or alarm0_water_remain = 1
                or alarm_exceed_year = 1
                or alarm_water_meter_fault = 1
                or alarm_loss = 1
                or alarm_water_meter_break = 1
                or alarm_ele_meter_fault = 1
                or alarm0_money_remain = 1
                or alarm_inner_door = 1
                or alarm_outer_door = 1
                or alarm_ele_miss = 1
                or alarm_ele_exceed = 1
                or alarm_ele_low_volt = 1
                or alarm_battery_volt = 1
                or alarm_valve = 1
                )
            </if>
            <if test="alarmState == 0">
                and (
                alarm_remain_water = 0
                and alarm0_water_remain = 0
                and alarm_exceed_year = 0
                and alarm_water_meter_fault = 0
                and alarm_loss = 0
                and alarm_water_meter_break = 0
                and alarm_ele_meter_fault = 0
                and alarm0_money_remain = 0
                and alarm_inner_door = 0
                and alarm_outer_door = 0
                and alarm_ele_miss = 0
                and alarm_ele_exceed = 0
                and alarm_ele_low_volt = 0
                and alarm_battery_volt = 0
                and alarm_valve = 0
                )
            </if>
            <if test="valveState != null">
                and rash.valve_state = #{valveState,jdbcType=TINYINT}
            </if>
            <if test="intakeName != null">
                and pint.name like CONCAT('%',#{intakeName,jdbcType=VARCHAR},'%')
            </if>
            <if test="startDt != null">
                and rash.dt &gt;= #{startDt,jdbcType=TIMESTAMP}
            </if>
            <if test="endDt != null">
                and rash.dt &lt;= #{endDt,jdbcType=TIMESTAMP}
            </if>
        </where>
        ORDER BY rash.dt DESC
        <if test="pageCurr != null and pageSize != null">
            LIMIT ${(pageCurr-1)*pageSize}, ${pageSize}
        </if>
    </select>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmAlarmStateLastMapper.xml
@@ -331,4 +331,147 @@
      power_type = #{powerType,jdbcType=TINYINT}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <!--根据指定条件获取记录总数-->
  <select id="getRecordCount" resultType="java.lang.Long">
    select count(*)
    from rm_alarm_state_last rasl
    Left join pr_intake pint on intake_id = pint.id
    <where>
      <if test="alarmState == 1">
        and (
        alarm_remain_water = 1
        or alarm0_water_remain = 1
        or alarm_exceed_year = 1
        or alarm_water_meter_fault = 1
        or alarm_loss = 1
        or alarm_water_meter_break = 1
        or alarm_ele_meter_fault = 1
        or alarm0_money_remain = 1
        or alarm_inner_door = 1
        or alarm_outer_door = 1
        or alarm_ele_miss = 1
        or alarm_ele_exceed = 1
        or alarm_ele_low_volt = 1
        or alarm_battery_volt = 1
        or alarm_valve = 1
        )
      </if>
      <if test="alarmState == 0">
        and (
        alarm_remain_water = 0
        and alarm0_water_remain = 0
        and alarm_exceed_year = 0
        and alarm_water_meter_fault = 0
        and alarm_loss = 0
        and alarm_water_meter_break = 0
        and alarm_ele_meter_fault = 0
        and alarm0_money_remain = 0
        and alarm_inner_door = 0
        and alarm_outer_door = 0
        and alarm_ele_miss = 0
        and alarm_ele_exceed = 0
        and alarm_ele_low_volt = 0
        and alarm_battery_volt = 0
        and alarm_valve = 0
        )
      </if>
      <if test="valveState != null">
        and rasl.valve_state = #{valveState,jdbcType=TINYINT}
      </if>
      <if test="intakeName != null">
        and pint.name = #{intakeName,jdbcType=VARCHAR}
      </if>
      <if test="startDt != null">
        and rasl.dt &gt;= #{startDt,jdbcType=TIMESTAMP}
      </if>
      <if test="endDt != null">
        and rasl.dt &lt;= #{endDt,jdbcType=TIMESTAMP}
      </if>
    </where>
    </select>
  <!--根据指定条件获取记录-->
  <select id="getControllerAlarmStateLast" resultType="com.dy.pipIrrGlobal.voRm.VoControllerAlarmState">
    select
    CAST(rasl.controller_id AS char)AS controllerId,
    CAST(rasl.intake_id AS char)AS intakeId,
    pint.name as intakeName,
    rasl.rtu_addr as rtuAddr,
    rasl.dt as dt,
    rasl.valve_state as valveState,
    rasl.alarm_remain_water as alarmRemainWater,
    rasl.alarm0_water_remain as alarm0WaterRemain,
    rasl.alarm_exceed_year as alarmExceedYear,
    rasl.alarm_water_meter_fault as alarmWaterMeterFault,
    rasl.alarm_loss as alarmLoss,
    rasl.alarm_water_meter_break as alarmWaterMeterBreak,
    rasl.alarm_ele_meter_fault as alarmEleMeterFault,
    rasl.alarm0_money_remain as alarm0MoneyRemain,
    rasl.alarm_inner_door as alarmInnerDoor,
    rasl.alarm_outer_door as alarmOuterDoor,
    rasl.alarm_ele_miss as alarmEleMiss,
    rasl.alarm_ele_exceed as alarmEleExceed,
    rasl.alarm_ele_low_volt as alarmEleLowVolt,
    rasl.state_ic_enable as stateIcEnable,
    rasl.alarm_battery_volt as alarmBatteryVolt,
    rasl.alarm_valve as alarmValve,
    rasl.power_type as powerType
    from rm_alarm_state_last rasl
    Left join pr_intake pint on intake_id = pint.id
    <where>
      <if test="alarmState == 1">
        and (
        alarm_remain_water = 1
        or alarm0_water_remain = 1
        or alarm_exceed_year = 1
        or alarm_water_meter_fault = 1
        or alarm_loss = 1
        or alarm_water_meter_break = 1
        or alarm_ele_meter_fault = 1
        or alarm0_money_remain = 1
        or alarm_inner_door = 1
        or alarm_outer_door = 1
        or alarm_ele_miss = 1
        or alarm_ele_exceed = 1
        or alarm_ele_low_volt = 1
        or alarm_battery_volt = 1
        or alarm_valve = 1
        )
      </if>
      <if test="alarmState == 0">
        and (
        alarm_remain_water = 0
        and alarm0_water_remain = 0
        and alarm_exceed_year = 0
        and alarm_water_meter_fault = 0
        and alarm_loss = 0
        and alarm_water_meter_break = 0
        and alarm_ele_meter_fault = 0
        and alarm0_money_remain = 0
        and alarm_inner_door = 0
        and alarm_outer_door = 0
        and alarm_ele_miss = 0
        and alarm_ele_exceed = 0
        and alarm_ele_low_volt = 0
        and alarm_battery_volt = 0
        and alarm_valve = 0
        )
      </if>
      <if test="valveState != null">
        and rasl.valve_state = #{valveState,jdbcType=TINYINT}
      </if>
      <if test="intakeName != null">
        and pint.name like CONCAT('%',#{intakeName,jdbcType=VARCHAR},'%')
      </if>
      <if test="startDt != null">
        and rasl.dt &gt;= #{startDt,jdbcType=TIMESTAMP}
      </if>
      <if test="endDt != null">
        and rasl.dt &lt;= #{endDt,jdbcType=TIMESTAMP}
      </if>
    </where>
    ORDER BY rasl.dt DESC
    <if test="pageCurr != null and pageSize != null">
      LIMIT ${(pageCurr-1)*pageSize}, ${pageSize}
    </if>
  </select>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmClientAmountDayLastMapper.xml
@@ -188,4 +188,53 @@
      rtu_dt_last = #{rtuDtLast,jdbcType=TIMESTAMP}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <!--根据指定条件获取记录总数-->
  <select id="getRecordCount" resultType="java.lang.Long">
    select count(*)
    from rm_client_amount_day_last rcadl
    Left join se_client sc on sc.id = rcadl.client_id
    <where>
      <if test="clientName != null">
        and sc.name = #{clientName,jdbcType=VARCHAR}
      </if>
      <if test="startDt != null">
        and rash.dt &gt;= #{startDt,jdbcType=TIMESTAMP}
      </if>
      <if test="endDt != null">
        and rash.dt &lt;= #{endDt,jdbcType=TIMESTAMP}
      </if>
    </where>
    </select>
  <!--根据指定条件获取记录-->
  <select id="getClientAmountDayLast" resultType="com.dy.pipIrrGlobal.voRm.VoClientAmountDay">
    select
    CAST(rcadl.client_id AS char)AS clientId,
    rcadl.amount as amount,
    rcadl.money as money,
    rcadl.dt as dt,
    rcadl.open_dt_last as openDtLast,
    rcadl.close_dt_last as closeDtLast,
    rcadl.this_amount_last as thisAmountLast,
    rcadl.this_money_last as thisMoneyLast,
    rcadl.this_time_last as thisTimeLast,
    rcadl.rtu_dt_last as rtuDtLast,
    sc.name as clientName
    from rm_client_amount_day_last rcadl
    Left join se_client sc on sc.id = rcadl.client_id
    <where>
      <if test="clientName != null">
        and sc.name = #{clientName,jdbcType=VARCHAR}
      </if>
      <if test="startDt != null">
        and rash.dt &gt;= #{startDt,jdbcType=TIMESTAMP}
      </if>
      <if test="endDt != null">
        and rash.dt &lt;= #{endDt,jdbcType=TIMESTAMP}
      </if>
    </where>
    ORDER BY rcadl.dt DESC
    <if test="pageCurr != null and pageSize != null">
      LIMIT ${(pageCurr-1)*pageSize}, ${pageSize}
    </if>
  </select>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/RmClientAmountDayMapper.xml
@@ -178,4 +178,53 @@
      rtu_dt_last = #{rtuDtLast,jdbcType=TIMESTAMP}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <!--根据指定条件获取记录总数-->
  <select id="getRecordCount" resultType="java.lang.Long">
    select count(*)
    from rm_client_amount_day rcad
           Left join se_client sc on sc.id = rcad.client_id
    <where>
      <if test="clientName != null">
        and sc.name = #{clientName,jdbcType=VARCHAR}
      </if>
      <if test="startDt != null">
        and rash.dt &gt;= #{startDt,jdbcType=TIMESTAMP}
      </if>
      <if test="endDt != null">
        and rash.dt &lt;= #{endDt,jdbcType=TIMESTAMP}
      </if>
    </where>
    </select>
  <!--根据指定条件获取记录-->
  <select id="getClientAmountDayHistory" resultType="com.dy.pipIrrGlobal.voRm.VoClientAmountDay">
    select
    CAST(rcad.client_id AS char)AS clientId,
    rcad.amount as amount,
    rcad.money as money,
    rcad.dt as dt,
    rcad.open_dt_last as openDtLast,
    rcad.close_dt_last as closeDtLast,
    rcad.this_amount_last as thisAmountLast,
    rcad.this_money_last as thisMoneyLast,
    rcad.this_time_last as thisTimeLast,
    rcad.rtu_dt_last as rtuDtLast,
    sc.name as clientName
    from rm_client_amount_day rcad
    Left join se_client sc on sc.id = rcad.client_id
    <where>
      <if test="clientName != null">
        and sc.name = #{clientName,jdbcType=VARCHAR}
      </if>
      <if test="startDt != null">
        and rash.dt &gt;= #{startDt,jdbcType=TIMESTAMP}
      </if>
      <if test="endDt != null">
        and rash.dt &lt;= #{endDt,jdbcType=TIMESTAMP}
      </if>
    </where>
    ORDER BY rcad.dt DESC
    <if test="pageCurr != null and pageSize != null">
      LIMIT ${(pageCurr-1)*pageSize}, ${pageSize}
    </if>
  </select>
</mapper>
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/MidResultActionError.java
@@ -2,6 +2,7 @@
import com.dy.common.mw.protocol.MidResult;
import com.dy.common.mw.protocol.MidResultAction;
import com.dy.common.mw.protocol.MidResultError;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -12,13 +13,13 @@
    @Override
    public void doAction(MidResult result) {
        //if(result != null && result instanceof MidResultError){
        //    MidResultError rs = (MidResultError)result ;
        //    log.error("解析或构造" + (rs.protocolName==null?"":("通信协议" + rs.protocolName + "的")) + "RTU" + (rs.rtuAddr==null?"":("(地址" + rs.rtuAddr + ")" )) + "数据出错" + (rs.message == null?"":(":" + rs.message)));
        //    if(rs.e != null){
        //        log.error(rs.e);
        //        rs.e.printStackTrace();
        //    }
        //}
        if(result != null && result instanceof MidResultError){
            MidResultError rs = (MidResultError)result ;
            log.error("解析或构造" + (rs.protocolName==null?"":("通信协议" + rs.protocolName + "的")) + "RTU" + (rs.rtuAddr==null?"":("(地址" + rs.rtuAddr + ")" )) + "数据出错" + (rs.message == null?"":(":" + rs.message)));
            if(rs.e != null){
                log.error(rs.e);
                rs.e.printStackTrace();
            }
        }
    }
}
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/application-database.yml
@@ -3,9 +3,9 @@
    datasource: #配置数据源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
#        url: jdbc:mysql://192.168.40.166:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
        url: jdbc:mysql://192.168.40.166: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
        url: jdbc:mysql://8.140.179.55:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull
#        url: jdbc:mysql://8.140.179.55: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-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/CommandResultCtrl.java
@@ -27,7 +27,7 @@
    @PostMapping(path = "receive", consumes = MediaType.APPLICATION_JSON_VALUE)
    public void receive(@RequestBody Data data) {
        JSONObject job_data = (JSONObject) JSON.toJSON(data);
        //System.out.println(job_data.toJSONString());
        String job_dataS = job_data.toJSONString();
        JSONObject job_subData = job_data.getJSONObject("subData").getJSONObject("subData");
        JSONObject job_response = new JSONObject();
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/common/dto/AutomaticClose.java
New file
@@ -0,0 +1,44 @@
package com.dy.pipIrrRemote.common.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2024-07-23 10:36
 * @LastEditTime 2024-07-23 10:36
 * @Description 自动关阀(定时关阀、定量关阀)传输对象
 */
@Data
public class AutomaticClose extends DtoBase {
    public static final long serialVersionUID = 202407231039001L;
    /**
     * 阀控器地址
     */
    @NotBlank(message = "阀控器地址不能为空")
    private String rtuAddr;
    /**
     * 虚拟卡编号
     */
    @NotBlank(message = "虚拟卡编号不能为空")
    private String vcNum;
    /**
     * 订单号
     */
    @NotBlank(message = "订单号不能为空")
    private String orderNo;
    /**
     * 用水时长,拥有定时关阀
     */
    private Integer minutes;
    /**
     * 预用水量,拥有定量关阀
     */
    private Integer waterAmount;
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/records/ClientAmountDayQueryVo.java
New file
@@ -0,0 +1,38 @@
package com.dy.pipIrrRemote.records;
import com.dy.common.webUtil.QueryConditionVo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * @author :WuZeYu
 * @Date :2024/7/23  15:55
 * @LastEditTime :2024/7/23  15:55
 * @Description
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(name = "农户日用水量统计查询条件")
public class ClientAmountDayQueryVo extends QueryConditionVo {
    @Schema(description = "农户姓名", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private String clientName;
    @Schema(description = "统计开始日期", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startDt;
    @Schema(description = "统计结束日期", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date endDt;
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/records/ControllerAlarmStateQueryVo.java
New file
@@ -0,0 +1,44 @@
package com.dy.pipIrrRemote.records;
import com.dy.common.webUtil.QueryConditionVo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * @author :WuZeYu
 * @Date :2024/7/22  20:01
 * @LastEditTime :2024/7/22  20:01
 * @Description
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(name = "控制器报警与状态查询条件")
public class ControllerAlarmStateQueryVo extends QueryConditionVo {
    @Schema(description = "取水口名称", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    private String intakeName;
    @Schema(description = "阀门状态", requiredMode = Schema.RequiredMode.NOT_REQUIRED)//(0打开、1关闭)
    private Byte valveState;
    @Schema(description = "开始时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date startDt;
    @Schema(description = "结束时间", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date endDt;
    @Schema(description = "报警状态", requiredMode = Schema.RequiredMode.NOT_REQUIRED)//(0正常、1报警)
    private Byte alarmState;
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/records/RecordsCtrl.java
New file
@@ -0,0 +1,153 @@
package com.dy.pipIrrRemote.records;
import com.dy.common.aop.SsoAop;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.common.webUtil.ResultCodeMsg;
import com.dy.pipIrrGlobal.voRm.VoClientAmountDay;
import com.dy.pipIrrGlobal.voRm.VoControllerAlarmState;
import com.dy.pipIrrGlobal.voSe.VoActiveCard;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * @author :WuZeYu
 * @Date :2024/7/22  20:00
 * @LastEditTime :2024/7/22  20:00
 * @Description
 */
@Slf4j
@Tag(name = "检测控制查询", description = "检测控制查询")
@RestController
@RequestMapping(path = "remoteRecords")
public class RecordsCtrl {
    @Autowired
    private RecordsSv recordsSv;
    /**
     * 根据指定条件获取控制器报警与状态列表(历史)
     *
     * @param vo 查询条件
     * @return 符合条件的控制器报警与状态列表(历史)
     */
    @Operation(summary = "获得一页控制器报警与状态记录", description = "返回一页控制器报警与状态数据")
    @ApiResponses(value = {
            @ApiResponse(
                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
                    description = "返回一页控制器报警与状态数据(BaseResponse.content:QueryResultVo[{}])",
                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                            schema = @Schema(implementation = VoActiveCard.class))}
            )
    })
    @GetMapping(path = "/getControllerAlarmStateHistory")
    @SsoAop()
    public BaseResponse<QueryResultVo<List<VoControllerAlarmState>>> getControllerAlarmStateHistory(@RequestBody ControllerAlarmStateQueryVo vo) {
        try {
            QueryResultVo<List<VoControllerAlarmState>> res = recordsSv.getControllerAlarmStateHistory(vo);
            return BaseResponseUtils.buildSuccess(res);
        } catch (Exception e) {
            log.error("获取控制器报警与状态记录异常", e);
            return BaseResponseUtils.buildException(e.getMessage());
        }
    }
    /**
     * 根据指定条件获取控制器报警与状态列表(最新)
     *
     * @param vo 查询条件
     * @return 符合条件的控制器报警与状态列表(最新)
     */
    @Operation(summary = "获得一页控制器报警与状态记录", description = "返回一页控制器报警与状态数据")
    @ApiResponses(value = {
            @ApiResponse(
                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
                    description = "返回一页控制器报警与状态数据(BaseResponse.content:QueryResultVo[{}])",
                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                            schema = @Schema(implementation = VoActiveCard.class))}
            )
    })
    @GetMapping(path = "/getControllerAlarmStateLast")
    @SsoAop()
    public BaseResponse<QueryResultVo<List<VoControllerAlarmState>>> getControllerAlarmStateLast(@RequestBody ControllerAlarmStateQueryVo vo) {
        try {
            QueryResultVo<List<VoControllerAlarmState>> res = recordsSv.getControllerAlarmStateLast(vo);
            return BaseResponseUtils.buildSuccess(res);
        } catch (Exception e) {
            log.error("获取控制器记录异常", e);
            return BaseResponseUtils.buildException(e.getMessage());
        }
    }
    /**
     * 根据指定条件获取农户日用水量统计列表(历史)
     *
     * @param vo 查询条件
     * @return 符合条件的农户日用水量统计列表(历史)
     */
    @Operation(summary = "获得一页农户日用水量统计记录", description = "返回一页农户日用水量统计数据")
    @ApiResponses(value = {
            @ApiResponse(
                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
                    description = "返回一页控制器报警与状态数据(BaseResponse.content:QueryResultVo[{}])",
                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                            schema = @Schema(implementation = VoActiveCard.class))}
            )
    })
    @GetMapping(path = "/getClientAmountDayHistory")
    @SsoAop()
    public BaseResponse<QueryResultVo<List<VoClientAmountDay>>> getClientAmountDayHistory(@RequestBody ClientAmountDayQueryVo vo) {
        try {
            QueryResultVo<List<VoClientAmountDay>> res = recordsSv.getClientAmountDayHistory(vo);
            return BaseResponseUtils.buildSuccess(res);
        } catch (Exception e) {
            log.error("获取农户日用水量统计记录异常", e);
            return BaseResponseUtils.buildException(e.getMessage());
        }
    }
    /**
     * 根据指定条件获取农户日用水量统计列表(最新)
     *
     * @param vo 查询条件
     * @return 符合条件的农户日用水量统计列表(最新)
     */
    @Operation(summary = "获得一页农户日用水量统计记录", description = "返回一页农户日用水量统计数据")
    @ApiResponses(value = {
            @ApiResponse(
                    responseCode = ResultCodeMsg.RsCode.SUCCESS_CODE,
                    description = "返回一页控制器报警与状态数据(BaseResponse.content:QueryResultVo[{}])",
                    content = {@Content(mediaType = MediaType.APPLICATION_JSON_VALUE,
                            schema = @Schema(implementation = VoActiveCard.class))}
            )
    })
    @GetMapping(path = "/getClientAmountDayLast")
    @SsoAop()
    public BaseResponse<QueryResultVo<List<VoClientAmountDay>>> getClientAmountDayLast(@RequestBody ClientAmountDayQueryVo vo) {
        try {
            QueryResultVo<List<VoClientAmountDay>> res = recordsSv.getClientAmountDayLast(vo);
            return BaseResponseUtils.buildSuccess(res);
        } catch (Exception e) {
            log.error("获取农户日用水量统计记录异常", e);
            return BaseResponseUtils.buildException(e.getMessage());
        }
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/records/RecordsSv.java
New file
@@ -0,0 +1,121 @@
package com.dy.pipIrrRemote.records;
import com.dy.common.webUtil.QueryResultVo;
import com.dy.pipIrrGlobal.daoRm.RmAlarmStateHistoryMapper;
import com.dy.pipIrrGlobal.daoRm.RmAlarmStateLastMapper;
import com.dy.pipIrrGlobal.daoRm.RmClientAmountDayLastMapper;
import com.dy.pipIrrGlobal.daoRm.RmClientAmountDayMapper;
import com.dy.pipIrrGlobal.voRm.VoClientAmountDay;
import com.dy.pipIrrGlobal.voRm.VoControllerAlarmState;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.common.utils.PojoUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
 * @author :WuZeYu
 * @Date :2024/7/22  20:01
 * @LastEditTime :2024/7/22  20:01
 * @Description
 */
@Slf4j
@Service
public class RecordsSv {
    @Autowired
    private RmAlarmStateHistoryMapper rmAlarmStateHistoryMapper;
    @Autowired
    private RmAlarmStateLastMapper rmAlarmStateLastMapper;
    @Autowired
    private RmClientAmountDayLastMapper rmClientAmountDayLastMapper;
    @Autowired
    private RmClientAmountDayMapper rmClientAmountDayMapper;
    /**
     * 获得一页控制器报警与状态记录(历史)
     * @param vo
     * @return
     */
    public QueryResultVo<List<VoControllerAlarmState>> getControllerAlarmStateHistory(ControllerAlarmStateQueryVo vo) {
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo);
        Long itemTotal = rmAlarmStateHistoryMapper.getRecordCount(params);
        QueryResultVo<List<VoControllerAlarmState>> rsVo = new QueryResultVo<>();
        rsVo.pageSize = vo.pageSize;
        rsVo.pageCurr = vo.pageCurr;
        rsVo.calculateAndSet(itemTotal, params);
        rsVo.obj = rmAlarmStateHistoryMapper.getControllerAlarmStateHistory(params);
        return rsVo;
    }
    /**
     * 获得一页控制器报警与状态记录(最新)
     * @param vo
     * @return
     */
    public QueryResultVo<List<VoControllerAlarmState>> getControllerAlarmStateLast(ControllerAlarmStateQueryVo vo) {
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo);
        Long itemTotal = rmAlarmStateLastMapper.getRecordCount(params);
        QueryResultVo<List<VoControllerAlarmState>> rsVo = new QueryResultVo<>();
        rsVo.pageSize = vo.pageSize;
        rsVo.pageCurr = vo.pageCurr;
        rsVo.calculateAndSet(itemTotal, params);
        rsVo.obj = rmAlarmStateLastMapper.getControllerAlarmStateLast(params);
        return rsVo;
    }
    /**
     * 获得一页农户日用水量统计记录(历史)
     * @param vo
     * @return
     */
    public QueryResultVo<List<VoClientAmountDay>> getClientAmountDayHistory(ClientAmountDayQueryVo vo) {
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo);
        Long itemTotal = rmClientAmountDayMapper.getRecordCount(params);
        QueryResultVo<List<VoClientAmountDay>> rsVo = new QueryResultVo<>();
        rsVo.pageSize = vo.pageSize;
        rsVo.pageCurr = vo.pageCurr;
        rsVo.calculateAndSet(itemTotal, params);
        rsVo.obj = rmClientAmountDayMapper.getClientAmountDayHistory(params);
        return rsVo;
    }
    /**
     * 获得一页农户日用水量统计记录(最新)
     * @param vo
     * @return
     */
    public QueryResultVo<List<VoClientAmountDay>> getClientAmountDayLast(ClientAmountDayQueryVo vo) {
        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo);
        Long itemTotal = rmClientAmountDayLastMapper.getRecordCount(params);
        QueryResultVo<List<VoClientAmountDay>> rsVo = new QueryResultVo<>();
        rsVo.pageSize = vo.pageSize;
        rsVo.pageCurr = vo.pageCurr;
        rsVo.calculateAndSet(itemTotal, params);
        rsVo.obj = rmClientAmountDayLastMapper.getClientAmountDayLast(params);
        return rsVo;
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/rtu/RtuCtrl.java
@@ -32,9 +32,6 @@
import java.util.Objects;
//import com.dy.common.mw.protocol.p206V1_0_0.downVos.Com97Vo;
//import com.dy.common.mw.protocol.p206V1_0_0.downVos.ComXyVo;
/**
 * @author ZhuBaoMin
 * @date 2024-05-21 14:31
@@ -93,11 +90,6 @@
        Long intakeId = po.getIntakeId();
        Long operator = po.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
@@ -179,11 +171,6 @@
        Long operator = po.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
        if(job_rtu == null) {
@@ -243,11 +230,6 @@
        Long intakeId = po.getIntakeId();
        Long operator = po.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
@@ -310,11 +292,6 @@
        Long operator = po.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
        if(job_rtu == null) {
@@ -374,11 +351,6 @@
        Long intakeId = po.getIntakeId();
        Long operator = po.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
pipIrr-platform/pipIrr-web/pipIrr-web-remote/src/main/java/com/dy/pipIrrRemote/valve/ValveCtrl.java
@@ -5,8 +5,13 @@
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.p206V1_0_0.downVos.Com99Vo;
import com.dy.common.mw.protocol.p206V1_0_0.downVos.ComA0Vo;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.*;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd15Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd93_A3Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd9CVo;
import com.dy.common.util.IDLongGenerator;
import com.dy.common.webUtil.BaseResponse;
import com.dy.common.webUtil.BaseResponseUtils;
@@ -104,11 +109,6 @@
            if(vcId == null) {
                return BaseResponseUtils.buildErrorMsg(RemoteResultCode.PLEASE_SELECT_A_VC.getMessage());
            }
        }
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 虚拟卡ID换虚拟卡对象
@@ -239,11 +239,6 @@
        String orderNo = voUnclosedParam.getOrderNo();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 阀控器地址换取水口ID和通讯协议
        JSONObject job_rtu = getRtu(null, rtuAddr);
        if(job_rtu == null) {
@@ -317,6 +312,168 @@
    }
    /**
     * 定时关阀
     * @param automaticClose
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "timed_close", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> timedClose(@RequestBody @Valid AutomaticClose automaticClose, BindingResult bindingResult) {
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Long intakeId = automaticClose.getIntakeId();
        String rtuAddr = automaticClose.getRtuAddr();
        String vcNum = automaticClose.getVcNum();
        String orderNo = automaticClose.getOrderNo();
        Integer minutes = automaticClose.getMinutes();
        Long operator = automaticClose.getOperator();
        Long vcId = Optional.ofNullable(seVirtualCardMapper.getVcIdByNum(vcNum)).orElse(0L);
        Long comId = idLongGenerator.generate();
        // 虚拟卡ID换虚拟卡对象
        VoVirtualCard vc = commandSv.getVcById(vcId);
        if (vc == null) {
            return BaseResponseUtils.buildErrorMsg(RemoteResultCode.PLEASE_SELECT_A_VC.getMessage());
        }
        Double moneyRemain = vc.getMoney();
        // 获取水价
        Double waterPrice = commandSv.getPrice();
        // 阀控器地址换取水口ID和通讯协议
        JSONObject job_rtu = getRtu(null, rtuAddr);
        if(job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(RemoteResultCode.RTU_NOT_EXIST.getMessage());
        }
        String protocol = job_rtu.getString("protocol");
        String orgTag = job_rtu.getString("orgTag");
        comSendUrl = env.getProperty(pro_mw + "." + orgTag + "." + key_mw);
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
            return BaseResponseUtils.buildSuccess();
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_99;
            // 创建视图
            Com99Vo param = new Com99Vo();
            param.setIcCardNo(vcNum);
            param.setMoneyRemain(moneyRemain);
            param.setWaterPrice(waterPrice);
            param.setMinutes(minutes);
            param.setOrderNo(orderNo);
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)2);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuCallbackUrl_rm);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
    }
    /**
     * 定量关阀
     * @param automaticClose
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "quantify_close", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> quantifyClose(@RequestBody @Valid AutomaticClose automaticClose, BindingResult bindingResult) {
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Long intakeId = automaticClose.getIntakeId();
        String rtuAddr = automaticClose.getRtuAddr();
        String vcNum = automaticClose.getVcNum();
        String orderNo = automaticClose.getOrderNo();
        Integer waterAmount = automaticClose.getWaterAmount();
        Long operator = automaticClose.getOperator();
        Long vcId = Optional.ofNullable(seVirtualCardMapper.getVcIdByNum(vcNum)).orElse(0L);
        Long comId = idLongGenerator.generate();
        // 虚拟卡ID换虚拟卡对象
        VoVirtualCard vc = commandSv.getVcById(vcId);
        if (vc == null) {
            return BaseResponseUtils.buildErrorMsg(RemoteResultCode.PLEASE_SELECT_A_VC.getMessage());
        }
        Double moneyRemain = vc.getMoney();
        // 获取水价
        Double waterPrice = commandSv.getPrice();
        // 阀控器地址换取水口ID和通讯协议
        JSONObject job_rtu = getRtu(null, rtuAddr);
        if(job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(RemoteResultCode.RTU_NOT_EXIST.getMessage());
        }
        String protocol = job_rtu.getString("protocol");
        String orgTag = job_rtu.getString("orgTag");
        comSendUrl = env.getProperty(pro_mw + "." + orgTag + "." + key_mw);
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
            return BaseResponseUtils.buildSuccess();
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_A0;
            // 创建视图
            ComA0Vo param = new ComA0Vo();
            param.setIcCardNo(vcNum);
            param.setMoneyRemain(moneyRemain);
            param.setWaterPrice(waterPrice);
            param.setWaterAmount(waterAmount);
            param.setOrderNo(orderNo);
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)2);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuCallbackUrl_rm);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
    }
    /**
     * 根据操作员ID获取未关阀记录
     * @param operator
     * @return
@@ -354,11 +511,6 @@
        Long operator = po.getOperator();
        String flowNo = RandomStringUtils.randomNumeric(12); // 生成12位随机数
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
@@ -433,11 +585,6 @@
        Long operator = card.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
        if(job_rtu == null) {
@@ -498,11 +645,6 @@
    //    Boolean valid = usability.getValid();
    //    Long operator = usability.getOperator();
    //    Long comId = idLongGenerator.generate();
    //
    //    // 获取系统参数
    //    if(!setuped) {
    //        setUp();
    //    }
    //
    //    // 取水口ID换阀控器地址及通讯协议
    //    JSONObject job_rtu = getRtu(intakeId, null);
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/CommandResultCtrl.java
@@ -1,8 +1,8 @@
package com.dy.pipIrrWechat.command;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
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;
@@ -25,16 +25,21 @@
@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());
        }
    public void receive(@RequestBody Data data) {
        JSONObject job_data = (JSONObject) JSON.toJSON(data);
        String job_dataS = job_data.toJSONString();
        JSONObject job_subData = job_data.getJSONObject("subData").getJSONObject("subData");
        CompletableFuture<Data> feature = (CompletableFuture<Data>) features.get(comId);
        JSONObject job_response = new JSONObject();
        job_response.put("data", job_subData);
        job_response.put("commandCode", job_data.getString("code"));
        job_response.put("commandId", job_data.getString("commandId"));
        CompletableFuture<JSONObject> feature = (CompletableFuture<JSONObject>) features.get(job_data.getLong("commandId"));
        if(feature != null) {
            feature.complete(data);
            feature.complete(job_response);
        }else{
            feature.complete(new JSONObject());
        }
        return BaseResponseUtils.buildSuccess("ok");
    }
}
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/ValveCtrl.java
@@ -1,9 +1,12 @@
package com.dy.pipIrrWechat.command;
import com.alibaba.fastjson2.JSONObject;
import com.dy.common.aop.SsoAop;
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.p206V1_0_0.downVos.Com99Vo;
import com.dy.common.mw.protocol.p206V1_0_0.downVos.ComA0Vo;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd15Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd92_A2Vo;
@@ -17,6 +20,7 @@
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.voRm.VoUnclosedValve;
import com.dy.pipIrrGlobal.voSe.VoVirtualCard;
import com.dy.pipIrrWechat.command.dto.AutomaticClose;
import com.dy.pipIrrWechat.command.dto.Recharge;
import com.dy.pipIrrWechat.command.dto.ValveClose;
import com.dy.pipIrrWechat.command.dto.ValveOpen;
@@ -116,11 +120,6 @@
            if (vcId == null) {
                return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
            }
        }
        // 获取系统参数
        if (!setuped) {
            setUp();
        }
        // 虚拟卡ID换虚拟卡对象
@@ -240,11 +239,6 @@
        Long operator = valve.getOperator();
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if (!setuped) {
            setUp();
        }
        // 阀控器地址换取水口ID和通讯协议
        JSONObject job_rtu = getRtu(null, rtuAddr);
        if (job_rtu == null) {
@@ -318,6 +312,168 @@
    }
    /**
     * 定时关阀
     * @param automaticClose
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "timed_close", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> timedClose(@RequestBody @Valid AutomaticClose automaticClose, BindingResult bindingResult) {
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Long intakeId = automaticClose.getIntakeId();
        String rtuAddr = automaticClose.getRtuAddr();
        String vcNum = automaticClose.getVcNum();
        String orderNo = automaticClose.getOrderNo();
        Integer minutes = automaticClose.getMinutes();
        Long operator = automaticClose.getOperator();
        Long vcId = Optional.ofNullable(seVirtualCardMapper.getVcIdByNum(vcNum)).orElse(0L);
        Long comId = idLongGenerator.generate();
        // 虚拟卡ID换虚拟卡对象
        VoVirtualCard vc = commandSv.getVcById(vcId);
        if (vc == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
        }
        Double moneyRemain = vc.getMoney();
        // 获取水价
        Double waterPrice = commandSv.getPrice();
        // 阀控器地址换取水口ID和通讯协议
        JSONObject job_rtu = getRtu(null, rtuAddr);
        if(job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage());
        }
        String protocol = job_rtu.getString("protocol");
        String orgTag = job_rtu.getString("orgTag");
        comSendUrl = env.getProperty(pro_mw + "." + orgTag + "." + key_mw);
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
            return BaseResponseUtils.buildSuccess();
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_99;
            // 创建视图
            Com99Vo param = new Com99Vo();
            param.setIcCardNo(vcNum);
            param.setMoneyRemain(moneyRemain);
            param.setWaterPrice(waterPrice);
            param.setMinutes(minutes);
            param.setOrderNo(orderNo);
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)2);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
    }
    /**
     * 定量关阀
     * @param automaticClose
     * @param bindingResult
     * @return
     */
    @PostMapping(path = "quantify_close", consumes = MediaType.APPLICATION_JSON_VALUE)
    @Transactional(rollbackFor = Exception.class)
    @SsoAop()
    public BaseResponse<Boolean> quantifyClose(@RequestBody @Valid AutomaticClose automaticClose, BindingResult bindingResult) {
        if(bindingResult != null && bindingResult.hasErrors()){
            return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
        }
        Long intakeId = automaticClose.getIntakeId();
        String rtuAddr = automaticClose.getRtuAddr();
        String vcNum = automaticClose.getVcNum();
        String orderNo = automaticClose.getOrderNo();
        Integer waterAmount = automaticClose.getWaterAmount();
        Long operator = automaticClose.getOperator();
        Long vcId = Optional.ofNullable(seVirtualCardMapper.getVcIdByNum(vcNum)).orElse(0L);
        Long comId = idLongGenerator.generate();
        // 虚拟卡ID换虚拟卡对象
        VoVirtualCard vc = commandSv.getVcById(vcId);
        if (vc == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.PLEASE_SELECT_A_VC.getMessage());
        }
        Double moneyRemain = vc.getMoney();
        // 获取水价
        Double waterPrice = commandSv.getPrice();
        // 阀控器地址换取水口ID和通讯协议
        JSONObject job_rtu = getRtu(null, rtuAddr);
        if(job_rtu == null) {
            return BaseResponseUtils.buildErrorMsg(WechatResultCode.RTU_NOT_EXIST.getMessage());
        }
        String protocol = job_rtu.getString("protocol");
        String orgTag = job_rtu.getString("orgTag");
        comSendUrl = env.getProperty(pro_mw + "." + orgTag + "." + key_mw);
        String commandCode = null;
        if(protocol.equals("p206V202404")) {
            return BaseResponseUtils.buildSuccess();
        } else if(protocol.equals("p206V1_0_1")) {
            // 获取功能码
            commandCode = CodeV1_0_1.cd_A0;
            // 创建视图
            ComA0Vo param = new ComA0Vo();
            param.setIcCardNo(vcNum);
            param.setMoneyRemain(moneyRemain);
            param.setWaterPrice(waterPrice);
            param.setWaterAmount(waterAmount);
            param.setOrderNo(orderNo);
            /**
             * 构造命令、发送命令并处理请求结果及执行结果
             * 1 准备参数
             * 2 调用公共方法
             */
            Param myParam = new Param();
            myParam.setComId(comId);
            myParam.setComType((byte)2);
            myParam.setCommandCode(commandCode);
            myParam.setCommandName(CodeV202404.getCodeName(commandCode));
            myParam.setIntakeId(intakeId);
            myParam.setRtuAddr(rtuAddr);
            myParam.setProtocol(protocol);
            myParam.setVcId(vcId);
            myParam.setParam(param);
            myParam.setRtuResultSendWebUrl(rtuCallbackUrl_wx);
            myParam.setOperator(operator);
            return dealWithCommandResult(myParam);
        } else {
            return BaseResponseUtils.buildErrorMsg("系统暂不支持该协议");
        }
    }
    /**
     * 根据操作员ID获取未关阀记录
     *
     * @param operator
@@ -354,11 +510,6 @@
        Long operator = po.getOperator();
        String flowNo = RandomStringUtils.randomNumeric(12); // 生成12位随机数
        Long comId = idLongGenerator.generate();
        // 获取系统参数
        if(!setuped) {
            setUp();
        }
        // 取水口ID换阀控器地址及通讯协议
        JSONObject job_rtu = getRtu(intakeId, null);
pipIrr-platform/pipIrr-web/pipIrr-web-wechat/src/main/java/com/dy/pipIrrWechat/command/dto/AutomaticClose.java
New file
@@ -0,0 +1,43 @@
package com.dy.pipIrrWechat.command.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
 * @author ZhuBaoMin
 * @date 2024-07-23 10:55
 * @LastEditTime 2024-07-23 10:55
 * @Description
 */
@Data
public class AutomaticClose extends DtoBase {
    public static final long serialVersionUID = 202407231056001L;
    /**
     * 阀控器地址
     */
    @NotBlank(message = "阀控器地址不能为空")
    private String rtuAddr;
    /**
     * 虚拟卡编号
     */
    @NotBlank(message = "虚拟卡编号不能为空")
    private String vcNum;
    /**
     * 订单号
     */
    @NotBlank(message = "订单号不能为空")
    private String orderNo;
    /**
     * 用水时长,拥有定时关阀
     */
    private Integer minutes;
    /**
     * 预用水量,拥有定量关阀
     */
    private Integer waterAmount;
}