pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java
@@ -2,11 +2,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; import com.dy.pipIrrGlobal.voSe.VoVcRecharge; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** * @author ZhuBaoMin @@ -77,4 +79,17 @@ * @return */ void updateVcCardNoUseStateByIntakeId(@Param("intakeId")Long intakeId) ; /** * 获取虚拟卡充值记录 * @return */ List<VoVcRecharge> getVcRechargeRecords(Map<?, ?> params); /** * 获取虚拟卡充值记录数 * @param params * @return */ Long getRechargeRecordCount(Map<?, ?> params); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoVcRecharge.java
New file @@ -0,0 +1,51 @@ package com.dy.pipIrrGlobal.voSe; import com.dy.common.po.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.Date; /** * @author :WuZeYu * @Date :2024/6/17 11:24 * @LastEditTime :2024/6/17 11:24 * @Description */ @Data public class VoVcRecharge implements BaseEntity { @Schema(title = "充值ID") private Long id; @Schema(description = "虚拟卡ID") private Long vcId; @Schema(description = "农户ID") private Long clientId; @Schema(description = "钱包余额") private Double money; @Schema(description = "充值后余额") private Double afterRecharge; @Schema(description = "订单号") private String orderNumber; @Schema(description = "充值金额") private Integer rechargeAmount; @Schema(description = "下单时间") private Date orderTime; @Schema(description = "充值完成时间") private Date rechargeTime; @Schema(description = "订单状态") private Byte orderState; @Schema(description = "订单状态") private String orderStateName; } pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml
@@ -223,4 +223,35 @@ LIMIT 0,1 </select> <!--获取虚拟卡充值记录--> <select id="getVcRechargeRecords" resultType="com.dy.pipIrrGlobal.voSe.VoVcRecharge" > SELECT CAST(id AS char) AS id, CAST(vc_id AS char) AS vcId, CAST(client_id AS char) AS clientId, money, after_recharge AS afterRecharge, order_number AS orderNumber, recharge_amount AS rechargeAmount, order_time AS orderTime, recharge_time AS rechargeTime, order_state AS orderState, (CASE WHEN order_state = 1 THEN "未支付" WHEN order_state = 2 THEN "已支付" END) AS orderStateName FROM se_vc_recharge where order_state = 2 order by recharge_time DESC <if test="pageCurr != null and pageSize != null"> LIMIT ${(pageCurr-1)*pageSize}, ${pageSize} </if> </select> <select id="getRechargeRecordCount" resultType="java.lang.Long"> SELECT COUNT(*) FROM se_vc_recharge where order_state = 2 </select> </mapper> pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/Server.java
@@ -161,6 +161,12 @@ if(ServerProperties.cacheUpDownDataMaxCount <= ServerProperties.cacheUpDownDataWarnCount){ throw new Exception("cacheUpDownDataMaxCount必须大于cacheUpDownDataWarnCount") ; } //没有上行数据的分钟数,达到这个分钟数,认为RTU断网了,取值范围是2_100 ServerProperties.disconnectedByNoUpDataMinutes = 0L + conf.getSetAttrPlusInt(doc, "config.base", "disconnectedByNoUpDataMinutes", null, 1, 100, null) ; if(ServerProperties.disconnectedByNoUpDataMinutes < 1 || ServerProperties.disconnectedByNoUpDataMinutes > 100){ throw new Exception("disconnectedByNoUpDataMinutes取值必须是1~100") ; } ServerProperties.disconnectedByNoUpDataMinutes = ServerProperties.disconnectedByNoUpDataMinutes * 60 * 1000 ; //设置ID生成器的后缀 IDLongGenerator.setSuffix(ServerProperties.dbDataIdSuffix.intValue()); pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/ServerProperties.java
@@ -33,4 +33,7 @@ //上下行数据缓存队列中缓存数据个数的最大值,这个与实体项目所接水表数相关 public static Integer cacheUpDownDataMaxCount = 1100000 ; //没有上行数据的分钟数,达到这个分钟数,认为RTU断网了,取值范围是2000_100000 public static Long disconnectedByNoUpDataMinutes = 3000L ; } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSession.java
@@ -9,4 +9,5 @@ public String protocolName ;//通信协议名称 public Long lastDownComTime ;//上次下发命令时刻(毫秒时刻 System.currentTimeMillis()) public Long lastUpDataTime ;//上次收到上行数据时刻(毫秒时刻 System.currentTimeMillis()) public Long lastUpDataTimeForOnlineCtrl ;//上次收到上行数据时刻(毫秒时刻 System.currentTimeMillis()),用于上线情况控制 } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCache.java
@@ -2,12 +2,10 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.*; import java.util.Map.Entry; import com.dy.common.util.DateTime; import org.apache.mina.core.session.IoSession; import com.dy.rtuMw.server.ServerProperties; @@ -189,27 +187,54 @@ TcpSession tcpSe = sessionTable.get(rtuAddr) ; if(tcpSe != null){ tcpSe.lastUpDataTime = System.currentTimeMillis() ; tcpSe.lastUpDataTimeForOnlineCtrl = System.currentTimeMillis() ; } } /** * 更新上行数据时刻 * 当上行数据时刻已经过去一定时长,上行数据时刻清空 * 当一定时间内没有上行数据,则认为RTU离线 */ public static void updateUpDataTime(Long now){ public static void updateRtuStatus(Long now){ synchronized (sessionTable){ Iterator<TcpSession> it = sessionTable.values().iterator() ; Set<Map.Entry<String, TcpSession>> entrySet = sessionTable.entrySet() ; Iterator<Map.Entry<String, TcpSession>> it = entrySet.iterator() ; Map.Entry<String, TcpSession> entry ; TcpSession tcpSe ; while(it.hasNext()){ tcpSe = it.next() ; entry = it.next() ; tcpSe = entry.getValue(); if(tcpSe.lastUpDataTime != null){ if(now - tcpSe.lastUpDataTime > ServerProperties.lastUpDataTimeLive){ tcpSe.lastUpDataTime = null ; } } if(tcpSe.lastUpDataTimeForOnlineCtrl != null){ if(tcpSe.ioSession != null && tcpSe.ioSession.isConnected()){ if(now - tcpSe.lastUpDataTimeForOnlineCtrl > ServerProperties.disconnectedByNoUpDataMinutes){ tcpSe.ioSession.closeNow() ; } } } } } } // public static void updateRtuStatus(Long now){ // synchronized (sessionTable){ // Iterator<TcpSession> it = sessionTable.values().iterator() ; // TcpSession tcpSe ; // while(it.hasNext()){ // tcpSe = it.next() ; // if(tcpSe.lastUpDataTime != null){ // if(now - tcpSe.lastUpDataTime > ServerProperties.lastUpDataTimeLive){ // tcpSe.lastUpDataTime = null ; // } // } // } // } // } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealLoss.java
@@ -36,7 +36,7 @@ Object subD = d.getSubData(); if (subD != null) { DataV1_0_1 dV1_0_1 = (DataV1_0_1) subD; if (dV1_0_1 != null && dV1_0_1.subData != null) { if (dV1_0_1 != null && dV1_0_1.subData != null && dV1_0_1.subData instanceof DataCdC0Vo) { Object[] objs = this.getTaskResults(TkPreGenObjs.taskId); DbSv sv = (DbSv) objs[0]; PrController controller = (PrController) objs[1]; pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V202404/TkDealTimingReportV202404.java
@@ -48,7 +48,7 @@ } } /** * 处理阀开工作报数据 * 处理阀上报数据 * @param sv 服务 * @param controller 控制器对象 * @param rtuAddr 控制器地址 @@ -61,7 +61,7 @@ } /** * 保存或更新控制器工作报最新数据 * 保存或更新控制器该上报最新数据 * @param sv 服务bean * @param controller 控制器对象 * @param rtuAddr 控制器地址 @@ -86,7 +86,7 @@ } /** * 保存控制器工作报历史数据 * 保存或更新控制器该上报历史数据 * @param sv 服务bean * @param controller 控制器对象 * @param rtuAddr 控制器地址 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/tasks/ToRtuConstantTask.java
@@ -37,7 +37,7 @@ * 处理TCP缓存中的各个TCP Session的上行数据时刻 */ private void dealTcpSession(){ TcpSessionCache.updateUpDataTime(System.currentTimeMillis() ) ; TcpSessionCache.updateRtuStatus(System.currentTimeMillis() ) ; } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/config.xml
@@ -16,6 +16,7 @@ dbDataIdSuffix:数据库数据id生成器的id后缀,0是默认的后缀,一般web系统应用,数据中间件id后缀大于等于1 cacheUpDownDataWarnCount:上下行数据缓存队列中缓存数据个数的报警量,这个与现实项目所接水表数相关 cacheUpDownDataMaxCount:上下行数据缓存队列中缓存数据个数的最大值,这个与现实项目所接水表数相关 disconnectedByNoUpDataMinutes:没有上行数据的分钟数,达到这个分钟数,认为RTU断网了,取值范围是2_100 --> <base isLowPower="false" @@ -28,6 +29,7 @@ dbDataIdSuffix="0" cacheUpDownDataWarnCount="100000" cacheUpDownDataMaxCount="110000" disconnectedByNoUpDataMinutes="3" /> <!-- pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardCtrl.java
@@ -3,11 +3,15 @@ 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.pipIrrGlobal.pojoSe.SeVirtualCard; import com.dy.pipIrrGlobal.voPr.VoController; import com.dy.pipIrrGlobal.voSe.VoVcRecharge; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import com.dy.pipIrrSell.result.SellResultCode; import com.dy.pipIrrSell.util.PayHelper; import com.dy.pipIrrSell.virtualCard.dto.DtoRegist; import com.dy.pipIrrSell.virtualCard.dto.DtoVcRecharge; import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; @@ -248,4 +252,19 @@ // return BaseResponseUtils.buildSuccess(true) ; //} /** * 获取虚拟卡充值记录 * @return */ @GetMapping(path = "/getVcRechargeRecords") @SsoAop() public BaseResponse<QueryResultVo<List<VoVcRecharge>>> getVcRechargeRecords(DtoVcRecharge dtoVcRecharge){ try { QueryResultVo<List<VoVcRecharge>> res = virtualCardSv.getVcRechargeRecords(dtoVcRecharge); return BaseResponseUtils.buildSuccess(res); } catch (Exception e) { log.error("获取虚拟卡充值记录异常", e); return BaseResponseUtils.buildException(e.getMessage()) ; } } } pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/VirtualCardSv.java
@@ -2,24 +2,30 @@ import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pipIrrGlobal.daoSe.*; import com.dy.pipIrrGlobal.pojoSe.SeVcRecharge; import com.dy.pipIrrGlobal.pojoSe.SeVcRefund; import com.dy.pipIrrGlobal.pojoSe.SeVcRefundItem; import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; import com.dy.pipIrrGlobal.voPr.VoController; import com.dy.pipIrrGlobal.voSe.VoOrders; import com.dy.pipIrrGlobal.voSe.VoVcRecharge; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import com.dy.pipIrrSell.result.SellResultCode; import com.dy.pipIrrSell.virtualCard.dto.DtoVcRecharge; import com.dy.pipIrrSell.virtualCard.dto.DtoVirtualCard; import com.dy.pipIrrSell.virtualCard.enums.LastOperateENUM; import com.dy.pipIrrSell.virtualCard.enums.OrderStateENUM; 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 org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Map; /** * @author ZhuBaoMin @@ -325,4 +331,23 @@ public Long getRefundIdByRefundNumber(String refundNumber) { return seVcRefundItemMapper.getRefundIdByRefundNumber(refundNumber); } /** * 获取虚拟卡充值记录 * @param dtoVcRecharge * @return */ public QueryResultVo<List<VoVcRecharge>> getVcRechargeRecords(DtoVcRecharge dtoVcRecharge){ Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(dtoVcRecharge); Long itemTotal = seVirtualCardMapper.getRechargeRecordCount(params); QueryResultVo<List<VoVcRecharge>> rsVo = new QueryResultVo<>(); rsVo.pageSize = dtoVcRecharge.pageSize; rsVo.pageCurr = dtoVcRecharge.pageCurr; rsVo.calculateAndSet(itemTotal, params); rsVo.obj = seVirtualCardMapper.getVcRechargeRecords(params); return rsVo; } } pipIrr-platform/pipIrr-web/pipIrr-web-sell/src/main/java/com/dy/pipIrrSell/virtualCard/dto/DtoVcRecharge.java
New file @@ -0,0 +1,21 @@ package com.dy.pipIrrSell.virtualCard.dto; import com.dy.common.webUtil.QueryConditionVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import org.hibernate.validator.constraints.Length; /** * @author :WuZeYu * @Date :2024/6/17 17:15 * @LastEditTime :2024/6/17 17:15 * @Description */ @Data @Schema(name = "虚拟卡充值记录查询条件") public class DtoVcRecharge extends QueryConditionVo { // @Schema(description = "订单状态", requiredMode = Schema.RequiredMode.NOT_REQUIRED) // @Length(message = "订单状态不大于{max},不小于{min}", min = 1, max = 2) // private Byte orderState; }