pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java
@@ -4,6 +4,7 @@ import com.dy.pipIrrGlobal.pojoSe.SeClientCard; import com.dy.pipIrrGlobal.voSe.VoCardInfo; import com.dy.pipIrrGlobal.voSe.VoCardInfo1; import com.dy.pipIrrGlobal.voSe.VoCards; import com.dy.pipIrrGlobal.voSe.VoCards2; import com.dy.pipIrrGlobal.voWe.VoCards3; @@ -69,6 +70,14 @@ * @return */ Map getClientIdAndNameByCardAddrAndCardNo(@Param("cardAddr") String cardAddr, @Param("cardNum") Long cardNum); /** * 得到水卡对象 * @param cardAddr * @param cardNum * @return */ List<VoCardInfo1> getCardsByAddrAndNum(@Param("cardAddr") String cardAddr, @Param("cardNum") Long cardNum); /** * 根据农户主键获取水卡列表 @@ -166,4 +175,11 @@ * @return */ List<VoCards3> getCardsByClientID(String clientId); /** * 更新实体卡剩余金额 * @param id * @param money */ void updateMoney(@Param("id")Long id , @Param("money")Double money); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeVirtualCardMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dy.pipIrrGlobal.pojoSe.SeVirtualCard; import com.dy.pipIrrGlobal.voSe.VoCardInfo1; import com.dy.pipIrrGlobal.voSe.VoVcRecharge; import com.dy.pipIrrGlobal.voSe.VoVirtualCard; import org.apache.ibatis.annotations.Mapper; @@ -66,6 +67,12 @@ */ Map getClientIdAndNameByVsCardNo(@Param("vcNum") Long vcNum); /** * 得到水卡对象 * @param cardNum * @return */ List<VoCardInfo1> getCardsByNum(@Param("cardNum") Long cardNum); /** * 根据虚拟卡编号获取虚拟卡ID @@ -100,4 +107,11 @@ * @return */ Long getRechargeRecordCount(Map<?, ?> params); /** * 更新实体卡剩余金额 * @param id * @param money */ void updateMoney(@Param("id")Long id , @Param("money")Double money); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoCardInfo1.java
New file @@ -0,0 +1,25 @@ package com.dy.pipIrrGlobal.voSe; import com.dy.common.po.BaseEntity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; /** * @author ZhuBaoMin * @date 2023-12-27 19:22 * @LastEditTime 2023-12-27 19:22 * @Description */ @Data @Schema(title = "IC卡视图对象1") public class VoCardInfo1 implements BaseEntity { private static final long serialVersionUID = 202408071750001L; @Schema(title = "主键") public Long id ; @Schema(title = "余额") public Float money; } pipIrr-platform/pipIrr-global/src/main/resources/mapper/BaBlockMapper.xml
@@ -52,7 +52,7 @@ phone = #{phone,jdbcType=VARCHAR} and </if> <if test="area != null"> area = ${area} and area = #{area,jdbcType=INTEGER} and </if> </trim> </select> @@ -73,7 +73,7 @@ phone = #{phone,jdbcType=VARCHAR} and </if> <if test="area != null"> area = ${area} and area = #{area,jdbcType=INTEGER} and </if> </trim> order by id DESC pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -75,6 +75,16 @@ WHERE card.cardAddr = #{cardAddr} and card.cardNum = #{cardNum} </select> <!-- 根据水卡编号获取水卡 --> <select id="getCardsByAddrAndNum" resultType="com.dy.pipIrrGlobal.voSe.VoCardInfo1"> SELECT id, money FROM se_client_card WHERE cardAddr = #{cardAddr} and cardNum = #{cardNum} </select> <!--根据行政区划串模糊查询水卡编号--> <select id="getCardNumOfMax" resultType="java.lang.String"> SELECT cardNum @@ -104,6 +114,9 @@ <!--@mbg.generated--> insert into se_client_card <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null"> id, </if> <if test="protocol != null"> protocol, </if> @@ -160,6 +173,9 @@ </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null"> #{id,jdbcType=BIGINT}, </if> <if test="protocol != null"> #{protocol,jdbcType=VARCHAR}, </if> @@ -280,8 +296,8 @@ <update id="updateByPrimaryKey" parameterType="com.dy.pipIrrGlobal.pojoSe.SeClientCard"> <!--@mbg.generated--> update se_client_card set protocol = #{protocol,jdbcType=VARCHAR} cardAddr = #{cardaddr,jdbcType=VARCHAR}, set protocol = #{protocol,jdbcType=VARCHAR}, cardAddr = #{cardaddr,jdbcType=VARCHAR}, cardNum = #{cardnum,jdbcType=BIGINT}, clientId = #{clientid,jdbcType=BIGINT}, money = #{money,jdbcType=FLOAT}, @@ -300,7 +316,11 @@ remarks = #{remarks,jdbcType=VARCHAR} where id = #{id,jdbcType=BIGINT} </update> <update id="updateMoney" > update se_client_card set money = #{money,jdbcType=FLOAT} where id = #{id,jdbcType=BIGINT} </update> <!--根据农户主键获取水卡列表--> <select id="getCardInfoByClientId" resultType="com.dy.pipIrrGlobal.voSe.VoCardInfo"> SELECT @@ -308,22 +328,22 @@ '用户卡' AS cardType, money, (CASE WHEN state = 1 THEN "正常" WHEN state = 2 THEN "已注销" ELSE "已挂失" WHEN state = 1 THEN '正常' WHEN state = 2 THEN '已注销' ELSE '已挂失' END) AS state FROM se_client_card WHERE clientId = ${clientId} WHERE clientId = #{clientId,jdbcType=BIGINT} </select> <!--根据水卡编号获取操作记录列表--> <select id="getOperateRecordsByCardNum" resultType="java.util.HashMap"> SELECT * FROM v_operate WHERE cardNum = ${cardNum} SELECT * FROM v_operate WHERE cardNum = #{cardNum,jdbcType=BIGINT} </select> <!--根据水卡编号获取余额--> <select id="getMoneyByCardNum" resultType="java.lang.Float"> SELECT money FROM se_client_card WHERE cardNum = ${cardNum} SELECT money FROM se_client_card WHERE cardNum = #{cardNum,jdbcType=BIGINT} </select> <!--根据水卡编号获取充值总额--> @@ -332,7 +352,7 @@ SUM(his.amount) AS amount FROM se_recharge_history his INNER JOIN se_client_card card ON his.cardId = card.id WHERE card.cardNum = ${cardNum} WHERE card.cardNum = #{cardNum,jdbcType=BIGINT} </select> <!--根据水卡编号获取卡片状态:1-开卡,2-补卡,3-充值,4-挂失,5-注销,6-解锁,7-冲正,8-消费--> @@ -357,7 +377,7 @@ WHEN state = 3 THEN '已挂失' END) AS stateName FROM se_client_card WHERE cardNum = ${cardNum} WHERE cardNum = #{cardNum,jdbcType=BIGINT} </select> <!--根据指定条件获取水卡列表记录数,应用程序使用--> pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeVirtualCardMapper.xml
@@ -152,6 +152,11 @@ intake_id = null where intake_id = #{intakeId,jdbcType=BIGINT} </update> <update id="updateMoney" > update se_virtual_card set money = #{money,jdbcType=FLOAT} where id = #{id,jdbcType=BIGINT} </update> <!--验证农户是否拥有指定名称的虚拟卡--> <select id="getRecordCountByName" resultType="java.lang.Integer"> SELECT COUNT(*) AS recordCount @@ -176,8 +181,8 @@ money, in_use AS inUse, (CASE WHEN in_use = 0 THEN "未使用" WHEN in_use = 1 THEN "使用中" WHEN in_use = 0 THEN '未使用' WHEN in_use = 1 THEN '使用中' END) AS inUseName FROM se_virtual_card <where> @@ -196,8 +201,8 @@ money, in_use AS inUse, (CASE WHEN in_use = 0 THEN "未使用" WHEN in_use = 1 THEN "使用中" WHEN in_use = 0 THEN '未使用' WHEN in_use = 1 THEN '使用中' END) AS inUseName FROM se_virtual_card WHERE id = #{vcId} @@ -225,6 +230,15 @@ WHERE card.vc_num = #{vcNum} </select> <!-- 根据水卡编号获取虚拟水卡 --> <select id="getCardsByNum" resultType="com.dy.pipIrrGlobal.voSe.VoCardInfo1"> SELECT id, money FROM se_virtual_card WHERE vc_num = #{cardNum} </select> <!--根据行政区划串模糊查询虚拟卡编号--> <select id="getVcCardNumOfMax" resultType="java.lang.String"> SELECT vc_num @@ -248,14 +262,14 @@ recharge_time AS rechargeTime, order_state AS orderState, (CASE WHEN order_state = 1 THEN "未支付" WHEN order_state = 2 THEN "已支付" 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 test="start != null and count != null"> LIMIT #{start}, #{count} </if> </select> pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/dbSv/DbSv.java
@@ -10,6 +10,8 @@ import com.dy.pipIrrGlobal.pojoPr.PrControllerTramp; import com.dy.pipIrrGlobal.pojoRm.*; import com.dy.pipIrrGlobal.pojoSe.SeClient; import com.dy.pipIrrGlobal.pojoSe.SeClientCard; import com.dy.pipIrrGlobal.voSe.VoCardInfo1; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,9 +29,9 @@ @Service() public class DbSv { @Autowired private SeClientCardMapper seClientCardMapperDao;//农户水卡DAO private SeClientCardMapper seClientCardDao;//农户水卡DAO @Autowired private SeVirtualCardMapper seVirtualCardMapper;//农户虚拟水卡DAO private SeVirtualCardMapper seVirtualCardDao ;//虚拟卡相关DAO @Autowired private PrControllerTrampMapper prControllerTrampMapperDao;//流浪控制器DAO @Autowired @@ -60,8 +62,6 @@ private RmLossDayMapper rmLossHistoryMapperDao ;//控制器漏损水量统计历史数据DAO @Autowired private RmCommandHistoryMapper rmCommandHistoryDao ;//远程命令日志相关 @Autowired private SeVirtualCardMapper seVirtualCardDao ;//虚拟卡相关 @Autowired private RmTimingReportHistoryMapper rmTimingReportHistoryDao; // 定点上报历史数据DAO @@ -72,6 +72,7 @@ private RmOnHourReportHistoryMapper rmOnHourReportHistoryDao; // 整点上报历史数据DAO @Autowired private RmOnHourReportLastMapper rmOnHourReportLastDao; // 整点上报最新数据DAO //@Autowired //@Lazy @@ -93,7 +94,7 @@ SeClient vo = null ; if(NumUtil.isPlusIntNumber(icCardNo)){ Long icCardNoLong = Long.parseLong(icCardNo) ; Map<String, Object> map = seClientCardMapperDao.getClientIdAndNameByCardAddrAndCardNo(icCardAddr, icCardNoLong) ; Map<String, Object> map = seClientCardDao.getClientIdAndNameByCardAddrAndCardNo(icCardAddr, icCardNoLong) ; if(map != null && map.size() > 0) { vo = new SeClient() ; vo.setId(Long.parseLong(map.get("clientId").toString())); @@ -111,7 +112,7 @@ SeClient vo = null ; if(NumUtil.isPlusIntNumber(icCardNo)){ Long icCardNoLong = Long.parseLong(icCardNo) ; Map<String, Object> map = seVirtualCardMapper.getClientIdAndNameByVsCardNo(icCardNoLong) ; Map<String, Object> map = seVirtualCardDao.getClientIdAndNameByVsCardNo(icCardNoLong) ; if(map != null && map.size() > 0) { vo = new SeClient() ; vo.setId(Long.parseLong(map.get("clientId").toString())); @@ -634,12 +635,70 @@ ////////////////////////////////////////////////////// // // IC卡相关 // ////////////////////////////////////////////////////// /** * 得到农户卡 * @param cardAddr * @param cardNo * @return */ public VoCardInfo1 getIcCard(String cardAddr, String cardNo){ if(NumUtil.isPlusIntNumber(cardNo)){ Long icCardNoLong = Long.parseLong(cardNo) ; List<VoCardInfo1> list = seClientCardDao.getCardsByAddrAndNum(cardAddr, icCardNoLong) ; if(list != null && list.size() > 0){ return list.get(0) ; } } return null ; } /** * 得到农户虚拟卡 * @param cardNo * @return */ public VoCardInfo1 getVirIcCard(String cardNo){ if(NumUtil.isPlusIntNumber(cardNo)){ Long icCardNoLong = Long.parseLong(cardNo) ; List<VoCardInfo1> list = seVirtualCardDao.getCardsByNum(icCardNoLong) ; if(list != null && list.size() > 0){ return list.get(0) ; } } return null ; } /** * 更新实体卡剩余金额 * @param id * @param remainMoney */ @Transactional(rollbackFor = Exception.class) public void updateIcCardRemainMoney(Long id , Double remainMoney){ seClientCardDao.updateMoney(id,remainMoney); } /** * 更新虚拟卡剩余金额 * @param id * @param remainMoney */ @Transactional(rollbackFor = Exception.class) public void updateVirIcCardRemainMoney(Long id , Double remainMoney){ seVirtualCardDao.updateMoney(id,remainMoney); } ////////////////////////////////////////////////////// // // 命令日志相关 // ////////////////////////////////////////////////////// public RmCommandHistory getCommandLog(String commandId){ return rmCommandHistoryDao.selectByPrimaryKey(Long.parseLong(commandId)) ; } @Transactional(rollbackFor = Exception.class) public void updateCommandLog(RmCommandHistory po){ rmCommandHistoryDao.updateByPrimaryKey(po) ; } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1_0_0/TkDealIcRemainMoney.java
New file @@ -0,0 +1,167 @@ package com.dy.rtuMw.server.rtuData.p206V1_0_0; import com.dy.common.mw.protocol.Data; import com.dy.common.mw.protocol.p206V1_0_0.DataV1_0_1; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd83CloseVo; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd83OpenVo; import com.dy.common.mw.protocol.p206V1_0_0.upVos.DataCd84Vo; import com.dy.pipIrrGlobal.voSe.VoCardInfo1; import com.dy.rtuMw.server.rtuData.TaskSurpport; import com.dy.rtuMw.server.rtuData.dbSv.DbSv; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * @Author: liurunyu * @Date: 2024/8/7 17:05 * @Description 处理IC卡剩余金额 */ public class TkDealIcRemainMoney extends TaskSurpport { private static final Logger log = LogManager.getLogger(TkDealIcRemainMoney.class.getName()); //类ID,一定与Tree.xml配置文件中配置一致 public static final String taskId = "TkDealIcRemainMoney"; /** * 执行节点任务: 取水口日用水量和漏损量 * * @param data 需要处理的数据 */ @Override public void execute(Object data) { Data d = (Data) data; DataV1_0_1 dV1_0_1 = (DataV1_0_1) d.getSubData();//前面任务已经判断不为null Object cdObj = dV1_0_1.subData; if (cdObj != null && (cdObj instanceof DataCd84Vo || cdObj instanceof DataCd83OpenVo || cdObj instanceof DataCd83CloseVo)){ Object[] objs = this.getTaskResults(TkPreGenObjs.taskId) ; DbSv sv = (DbSv)objs[0] ; try{ TkDealIcRemainMoney.UpDataVo vo = new TkDealIcRemainMoney.UpDataVo() ; if(cdObj instanceof DataCd84Vo){ vo.valueFrom( (DataCd84Vo)cdObj, null, null); }else if(cdObj instanceof DataCd83OpenVo){ vo.valueFrom(null, (DataCd83OpenVo)cdObj,null); }else if(cdObj instanceof DataCd83CloseVo){ vo.valueFrom(null,null, (DataCd83CloseVo)cdObj); } this.doDeal(sv, dV1_0_1, vo); }catch (Exception e){ log.error("保存取水口日用水量和漏损量数据时发生异常", e); } } } /** * 业务处理 * @param sv 服务 * @param dV1_0_1 上报数据 * @param dataVo 上报数据对象 */ private void doDeal(DbSv sv, DataV1_0_1 dV1_0_1, TkDealIcRemainMoney.UpDataVo dataVo) throws Exception { if(dataVo.icCardNo != null){ if(!dataVo.isVirIcCard){ //实体卡 if(dataVo.remainMoney != null){ VoCardInfo1 vo = sv.getIcCard(dataVo.icCardAddr, dataVo.icCardNo) ; if(vo != null && vo.id != null){ if(vo.money != null){ if(vo.money > dataVo.remainMoney){ //本地的剩余金额 大于 RTU上报的剩余金额 this.updateIcCardRemainMoney(sv, vo.id, dataVo.remainMoney); }else{ //本地的剩余金额 小于 RTU上报的剩余金额,说明当前上报可能是补报或其他原因造成的现象 //不做处理 } }else{ //这种情况一般不会存在,除非有什么误操作造成 this.updateIcCardRemainMoney(sv, vo.id, dataVo.remainMoney); } } } }else{ //虚拟卡 if(dataVo.remainMoney != null){ VoCardInfo1 vo = sv.getVirIcCard(dataVo.icCardNo) ; if(vo != null && vo.id != null){ if(vo.money != null){ if(vo.money > dataVo.remainMoney){ //本地的剩余金额 大于 RTU上报的剩余金额 this.updateVirIcCardRemainMoney(sv, vo.id, dataVo.remainMoney); }else{ //本地的剩余金额 小于 RTU上报的剩余金额,说明当前上报可能是补报或其他原因造成的现象 //不做处理 } }else{ //这种情况一般不会存在,除非有什么误操作造成 this.updateVirIcCardRemainMoney(sv, vo.id, dataVo.remainMoney); } } } } } } /** * 更新实体卡剩余金额 * @param id * @param remainMoney */ private void updateIcCardRemainMoney(DbSv sv, Long id , Double remainMoney){ sv.updateIcCardRemainMoney(id,remainMoney); } /** * 更新虚拟卡剩余金额 * @param id * @param remainMoney */ private void updateVirIcCardRemainMoney(DbSv sv, Long id , Double remainMoney){ sv.updateVirIcCardRemainMoney(id, remainMoney); } private class UpDataVo{ public Boolean isVirIcCard ;//是否为虚拟卡 public String icCardAddr ;//卡地址 public String icCardNo ;//卡编号 public Double remainMoney ; //剩余金额 public void valueFrom(DataCd84Vo vo84, DataCd83OpenVo vo83Op, DataCd83CloseVo vo83Cl){ if(this.isAll0(this.icCardAddr)){ this.isVirIcCard = true ; }else{ this.isVirIcCard = false ; } if(vo84 != null){ this.icCardAddr = vo84.cardAddr ; this.icCardNo = vo84.cardNo ; this.remainMoney = vo84.remainMoney ; }else if(vo83Op != null){ this.icCardAddr = vo83Op.icCardAddr ; this.icCardNo = vo83Op.icCardNo ; this.remainMoney = vo83Op.remainMoney ; }else if(vo83Cl != null){ this.icCardAddr = vo83Cl.icCardAddr ; this.icCardNo = vo83Cl.icCardNo ; this.remainMoney = vo83Cl.remainMoney ; } } private boolean isAll0(String s){ if(s != null && !s.trim().equals("")){ s = s.replaceAll("0", "") ; if(s.equals("")){ return true ; }else{ return false ; } } return false ; } } } pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/resources/RtuDataDealTree.xml
@@ -22,7 +22,8 @@ <task id="TkDealCloseValveReport" name="控制器关阀上报(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1_0_0.TkDealCloseValveReport" /> <task id="TkDealLoss" name="取水口日漏损量(功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1_0_0.TkDealLoss" /> <task id="TkDealIntakeAmountDay" name="取水口日用水量(功能码84、功能码83、功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1_0_0.TkDealIntakeAmountDay" /> <task id="TkDealClientAmountDay" name="农户日用水量(功能码84、功能码83、功能码C0)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1_0_0.TkDealClientAmountDay" /> <task id="TkDealClientAmountDay" name="农户日用水量(功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1_0_0.TkDealClientAmountDay" /> <task id="TkDealIcRemainMoney" name="IC卡剩余金额(功能码84、功能码83)" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1_0_0.TkDealIcRemainMoney" /> </task> <!-- 识别命令响应数据 --> <task id="TkFindComResponse" name="识别响应命令数据" enable="true" class="com.dy.rtuMw.server.rtuData.p206V1_0_0.TkFindComResponse">