From 656aa4f953eb52502a6414965e46642c31b6e8ee Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期二, 29 四月 2025 15:33:09 +0800
Subject: [PATCH] 设备会在多种功能码上报数据中携带报警与状态数据,这样数据库保存设备报警与状态数据可能很多,为此修改逻辑,当前实现为一设备一个小时内只保存一条报警与状态数据。

---
 pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealClientAmountDay.java |  344 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 344 insertions(+), 0 deletions(-)

diff --git a/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealClientAmountDay.java b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealClientAmountDay.java
new file mode 100644
index 0000000..ca51f91
--- /dev/null
+++ b/pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/p206V1/TkDealClientAmountDay.java
@@ -0,0 +1,344 @@
+package com.dy.rtuMw.server.rtuData.p206V1;
+
+import com.dy.common.mw.protocol.Data;
+import com.dy.common.mw.protocol.p206V1.DataV1;
+import com.dy.common.mw.protocol.p206V1.upVos.DataCd83CloseVo;
+import com.dy.common.util.DateTime;
+import com.dy.pipIrrGlobal.pojoPr.PrController;
+import com.dy.pipIrrGlobal.pojoRm.RmClientAmountDay;
+import com.dy.pipIrrGlobal.pojoRm.RmClientAmountDayLast;
+import com.dy.pipIrrGlobal.pojoSe.SeClient;
+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;
+
+import java.util.Date;
+
+/**
+ * @Author: liurunyu
+ * @Date: 2024/7/9 10:00
+ * @Description 鍐滄埛鏃ョ敤姘撮噺缁熻
+ */
+public class TkDealClientAmountDay  extends TaskSurpport {
+
+    private static final Logger log = LogManager.getLogger(TkDealClientAmountDay.class.getName());
+
+    //绫籌D锛屼竴瀹氫笌Tree.xml閰嶇疆鏂囦欢涓厤缃竴鑷�
+    public static final String taskId = "TkDealClientAmountDay";
+
+    /**
+     * 鎵ц鑺傜偣浠诲姟: 鍙栨按鍙f棩鐢ㄦ按閲忓拰婕忔崯閲�
+     *
+     * @param data 闇�瑕佸鐞嗙殑鏁版嵁
+     */
+    @Override
+    public void execute(Object data) {
+        Data d = (Data) data;
+        DataV1 dV1 = (DataV1) d.getSubData();//鍓嶉潰浠诲姟宸茬粡鍒ゆ柇涓嶄负null
+        Object cdObj = dV1.subData;
+        if (cdObj != null && cdObj instanceof DataCd83CloseVo) {
+            /*
+            鍙兘閲囩敤DataCd83CloseVo鏉ヨ绠楀啘鎴锋棩鐢ㄦ按閲忕殑鍘熷洜锛�
+            1銆佸鏋滈噰鐢―ataCd84Vo(寮�闃�宸ヤ綔鎶�)鏉ヨ绠楀啘鎴锋棩鐢ㄦ按閲忥紝蹇呴』閲囩敤鏈绱娴侀噺鍑忎笂娆$疮娴侀噺鐨勫樊鍊间綔涓洪樁娈靛啘鎴风敤姘撮噺锛�
+               鐒跺悗鍚勪釜闃舵鐩稿姞锛屽緱鍒版湰娆″啘鎴风敤姘撮噺锛岃繖涓敤姘撮噺杩樻病鍔犲埌鍐滄埛鏃ョ敤姘撮噺涓紝鍥犱负鍙湁鏀朵笉鍒癉ataCd83CloseVo(鍏抽榾鎶�)
+               涓婃姤鏁版嵁鏃舵墠鑳藉姞鍒板啘鎴风敤姘撮噺涓紝鍚﹀垯灏变細閲嶅璁$畻锛屼絾浠�涔堟椂鍊欏強鑳藉惁鏀跺埌DataCd83CloseVo涓嶅彲棰勭煡銆�
+            2銆佸鏋滃啘鎴锋湁澶氬紶IC鍗★紝鍚屾椂鍦ㄥ涓彇姘村彛鍙栨按锛屽皢浼氭槸鏇村鏉傜殑璁$畻锛岃澶氭儏褰㈡洿涓嶅彲棰勬祴锛屼笖鏃堕棿澶嶆潅搴�
+               蹇呯劧寰堥珮锛岃繖鏍风▼搴忚繍琛屾椂闂存洿闀匡紝灏嗕細閫犳垚涓婅鏁版嵁鍫靛鐜拌薄銆�
+            3銆佹墍浠ュ彧閲囩敤涓婃姤鏁版嵁DataCd83CloseVo浣滀负璁$畻鍐滄埛鐢ㄦ按閲忕殑鏁版嵁鏉ユ簮锛岃繖鏃跺繀鐒朵細鏈夋紡鎶ョ己澶辨儏鍐靛彂鐢燂紝閲囩敤琛ユ姤鏈哄埗鍙互寮ヨˉ涓�浜涖��
+             */
+            /*
+             琛ユ姤DataCd83CloseVo澶勭悊鏂规硶锛�
+             閲囩敤DataCd83CloseVo鏁版嵁涓殑鍏抽榾鏃堕棿closeDt璁$畻鍑哄啘鎴风敤姘存棩鏈燂紝涓嶈兘鐢ㄦ暟鎹帴鏀舵棩鏈熸椂闂翠綔涓哄啘鎴风敤姘存棩鏈燂紝
+             浣嗚繖绉嶈绠楁柟娉曞彲鑳戒細鏈夐噸澶嶄笂鎶ユ儏鍐靛彂鐢燂紝鍗抽噸澶嶈绠椾簡锛屽鏋滆鍒ゆ柇閲嶅锛屽繀鐒惰澧炲姞涓�涓叧闃�鏃堕棿鏁版嵁搴撹〃锛屽鍔犳椂闂�
+             澶嶆潅搴︼紝璁$畻鐢ㄦ椂灏嗕細闀匡紝鏈郴缁熷亣璁惧彧瑕丷TU涓婃姤涓婃潵鏁版嵁浜嗭紝璇存槑褰撳墠缃戠粶杈冨ソ锛屽繀鐒惰兘鏀跺埌涓嬭搴旂瓟锛屼笉浼氬彂鐢熼噸澶嶈ˉ鎶ャ��
+             */
+            Object[] objs = this.getTaskResults(TkPreGenObjs.taskId);
+            DbSv sv = (DbSv) objs[0];
+            PrController controller = (PrController) objs[1];
+            SeClient clientVo = (SeClient)objs[3] ;//杩欎釜鍊煎璞′腑鍙湁id鍜宯ame浼氭湁鍊�
+            if(clientVo != null && clientVo.getId() != null)
+            try {
+                this.doDeal(sv, clientVo, controller, d.getRtuAddr(), dV1, (DataCd83CloseVo) cdObj);
+            } catch (Exception e) {
+                log.error("淇濆瓨鍙栨按鍙f棩鐢ㄦ按閲忓拰婕忔崯閲忔暟鎹椂鍙戠敓寮傚父", e);
+            }
+        }
+    }
+
+    /**
+     * 涓氬姟澶勭悊
+     *
+     * @param sv         鏈嶅姟
+     * @param clientVo   鍐滄埛瀵硅薄
+     * @param controller 鎺у埗鍣ㄥ璞�
+     * @param rtuAddr    鎺у埗鍣ㄥ湴鍧�
+     * @param dV1    涓婃姤鏁版嵁
+     * @param cdData     涓婃姤鍏抽榾鏁版嵁瀵硅薄
+     */
+    private void doDeal(DbSv sv, SeClient clientVo, PrController controller, String rtuAddr, DataV1 dV1, DataCd83CloseVo cdData) throws Exception {
+        RmClientAmountDayLast poLast = sv.getRmClientAmountLast(clientVo.getId());
+        if (poLast == null) {
+            //鏁版嵁搴撲腑涓嶅瓨鍦ㄨ鍐滄埛鐨勬棩鍙栨按閲忔暟鎹�
+            //棣栧厛鐢熸垚鏈�鏂版暟鎹強鍘嗗彶鏁版嵁锛屽苟鍏堜繚瀛�
+            poLast = this.newRmClientAmountLast(clientVo, dV1, cdData);
+            this.newAndSaveHistoryDataDeal(sv, clientVo, dV1, cdData, poLast);
+            sv.saveRmClientAmountLast(poLast);
+        } else {
+            if(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt).equals(poLast.rtuDtLast)){
+                //RTU鏃堕挓绛変簬鏈湴鏈�鏂版暟鎹腑鐨凴TU鏃堕挓锛岄噸澶嶄笂鎶ユ暟鎹紝涓嶈繘琛屼换浣曞鐞�
+            }else if(DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt).after(poLast.rtuDtLast)){
+                //RTU鏃堕挓鏅氫簬鏈湴鏈�鏂版暟鎹腑鐨凴TU鏃堕挓锛屾槸鏂颁笂鎶ユ暟鎹�
+                Date upYmd = DateTime.dateFrom_yyyy_MM_dd1(cdData.closeDt);//閲囩敤鍏抽榾鏃ユ湡浣滀负缁熻鏃ユ湡
+                if(upYmd.equals(poLast.dt)){
+                    //鍚屼竴澶╂暟鎹�
+                    poLast = this.updateRmClientAmountLastBySameDateNewData(clientVo, dV1, cdData, poLast);
+                    RmClientAmountDay poHistory = null ;
+                    if(poLast.lastHistoryId != null){
+                        poHistory = sv.getRmClientAmountDay(poLast.lastHistoryId) ;
+                    }
+                    if(poHistory == null){
+                        this.newAndSaveHistoryDataDeal(sv, clientVo, dV1, cdData, poLast);
+                    }else{
+                        poHistory = this.updateRmClientAmountBySameDateNewData(clientVo, poHistory, poLast, dV1, cdData);
+                        sv.updateRmClientAmountDay(poHistory);
+                    }
+                }else if(upYmd.after(poLast.dt)){
+                    //鏂扮殑鏃ユ湡
+                    poLast = this.updateRmClientAmountLastByNewDateNewData(clientVo, dV1, cdData, poLast);
+                    this.newAndSaveHistoryDataDeal(sv, clientVo, dV1, cdData, poLast);
+                }else{
+                    //杩欑鎯呭喌涓嶅瓨鍦�
+                }
+                sv.updateRmClientAmountLast(poLast);
+            }else{
+                //RTU鏃堕挓鏃╀簬鏈湴鏈�鏂版暟鎹腑鐨凴TU鏃堕挓锛屾槸琛ユ姤鏁版嵁
+                Date upYmd = DateTime.dateFrom_yyyy_MM_dd1(cdData.closeDt);//閲囩敤鍏抽榾鏃ユ湡浣滀负缁熻鏃ユ湡
+                RmClientAmountDay poHistory = sv.getRmClientAmountByClientAndDate(clientVo.getId(), upYmd) ;
+                if(poHistory == null){
+                    //鏃犲巻鍙叉暟鎹�
+                    this.newAndSaveHistoryDataDeal(sv, clientVo, dV1, cdData, null);
+                }else{
+                    poHistory = this.updateOldRmClientAmountBySupplyData(clientVo, poHistory, dV1, cdData);
+                    sv.updateRmClientAmountDay(poHistory);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * 鐢熸垚鏂扮殑鎺у埗鍣ㄦ紡鎹熸棩缁熻鏈�鏂拌褰�
+     * @param clientVo
+     * @param dV1
+     * @param cdData
+     * @return
+     * @throws Exception
+     */
+    private RmClientAmountDayLast newRmClientAmountLast(SeClient clientVo, DataV1 dV1, DataCd83CloseVo cdData)throws Exception {
+        RmClientAmountDayLast po = new RmClientAmountDayLast() ;
+        po.clientId = clientVo.getId();
+        po.amount = cdData.thisAmount ;
+        po.money = cdData.thisMoney ;
+        po.dt = DateTime.dateFrom_yyyy_MM_dd1(cdData.closeDt);//閲囩敤鍏抽榾鏃ユ湡浣滀负缁熻鏃ユ湡
+        po.openDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.openDt);
+        po.closeDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.closeDt);
+        po.thisAmountLast = cdData.thisAmount ;
+        po.thisMoneyLast = cdData.thisMoney ;
+        po.thisTimeLast = cdData.thisTime ;
+        po.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
+        return po ;
+    }
+
+    /**
+     * 鐢熸垚鏂扮殑鎺у埗鍣ㄦ紡鎹熸棩缁熻鍘嗗彶璁板綍
+     * @param clientVo
+     * @param dV1
+     * @param cdData
+     * @param lastPo
+     * @return
+     * @throws Exception
+     */
+    private RmClientAmountDay newRmClientAmountDay(SeClient clientVo, DataV1 dV1, DataCd83CloseVo cdData, RmClientAmountDayLast lastPo)throws Exception {
+        RmClientAmountDay poHistory = new RmClientAmountDay() ;
+        poHistory.clientId = clientVo.getId();
+        if(lastPo != null){
+            if(poHistory.amount != null){
+                poHistory.amount += lastPo.amount ;
+            }else{
+                poHistory.amount = lastPo.amount ;
+            }
+            if(poHistory.money != null){
+                poHistory.money += lastPo.money ;
+            }else{
+                poHistory.money = lastPo.money ;
+            }
+            poHistory.times = 1 ;
+            poHistory.dt = lastPo.dt ;
+            poHistory.openDtLast = lastPo.openDtLast ;
+            poHistory.closeDtLast = lastPo.closeDtLast ;
+            poHistory.thisAmountLast = lastPo.thisAmountLast ;
+            poHistory.thisMoneyLast = lastPo.thisMoneyLast ;
+            poHistory.thisTimeLast = lastPo.thisTimeLast ;
+            poHistory.rtuDtLast = lastPo.rtuDtLast ;
+        }else{
+            poHistory.amount = cdData.thisAmount ;
+            poHistory.money = cdData.thisMoney ;
+            poHistory.times = 1 ;
+            poHistory.dt = DateTime.dateFrom_yyyy_MM_dd1(cdData.closeDt);//閲囩敤鍏抽榾鏃ユ湡浣滀负缁熻鏃ユ湡
+            poHistory.openDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.openDt);
+            poHistory.closeDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.closeDt);
+            poHistory.thisAmountLast = cdData.thisAmount ;
+            poHistory.thisMoneyLast = cdData.thisMoney ;
+            poHistory.thisTimeLast = cdData.thisTime ;
+            poHistory.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
+        }
+        return poHistory ;
+    }
+
+
+    /**
+     * 淇濆瓨鏂扮殑鍘嗗彶鏁版嵁璁板綍锛屽苟鎶奍D璧嬪�肩粰鏈�鏂拌褰曠殑 lastHistoryId
+     * @param sv
+     * @param clientVo
+     * @param dV1
+     * @param cdData
+     * @param lastPo
+     * @throws Exception
+     * @return RmIntakeAmountDay
+     */
+    private RmClientAmountDay newAndSaveHistoryDataDeal(DbSv sv, SeClient clientVo, DataV1 dV1, DataCd83CloseVo cdData, RmClientAmountDayLast lastPo)throws Exception {
+        RmClientAmountDay poHistory = this.newRmClientAmountDay(clientVo, dV1, cdData, lastPo) ;
+        sv.saveRmClientAmountDay(poHistory);
+        //鐢辨渶鏂版暟鎹寔鏈夊巻鍙叉暟鎹腑鐨勬渶鏂拌褰旾D锛屼互鏂逛究蹇�熸煡璇�
+        lastPo.lastHistoryId = poHistory == null ? null: poHistory.id ;
+        return poHistory ;
+    }
+
+    /**
+     * 鏇存柊鏈�鏂版暟鎹�
+     * @param clientVo
+     * @param dV1
+     * @param cdData
+     * @param lastPo
+     * @return
+     * @throws Exception
+     */
+    private RmClientAmountDayLast updateRmClientAmountLastBySameDateNewData(SeClient clientVo, DataV1 dV1, DataCd83CloseVo cdData, RmClientAmountDayLast lastPo)throws Exception {
+        lastPo.clientId = clientVo.getId();
+        if(lastPo.amount != null){
+            lastPo.amount += cdData.thisAmount ;
+        }else{
+            lastPo.amount = cdData.thisAmount ;
+        }
+       if(lastPo.money != null){
+            lastPo.money += cdData.thisMoney ;
+        }else{
+            lastPo.money = cdData.thisMoney ;
+        }
+        lastPo.dt = DateTime.dateFrom_yyyy_MM_dd1(cdData.closeDt);//閲囩敤鍏抽榾鏃ユ湡浣滀负缁熻鏃ユ湡
+        lastPo.openDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.openDt);
+        lastPo.closeDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.closeDt);
+        lastPo.thisAmountLast = cdData.thisAmount ;
+        lastPo.thisMoneyLast = cdData.thisMoney ;
+        lastPo.thisTimeLast = cdData.thisTime ;
+        lastPo.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
+        return lastPo ;
+    }
+
+
+    /**
+     * 鏇存柊鏈�鏂版暟鎹�
+     * @param clientVo
+     * @param dV1
+     * @param cdData
+     * @param lastPo
+     * @return
+     * @throws Exception
+     */
+    private RmClientAmountDayLast updateRmClientAmountLastByNewDateNewData(SeClient clientVo, DataV1 dV1, DataCd83CloseVo cdData, RmClientAmountDayLast lastPo)throws Exception {
+        lastPo.clientId = clientVo.getId();
+        lastPo.amount = cdData.thisAmount ;
+        lastPo.money = cdData.thisMoney ;
+        lastPo.dt = DateTime.dateFrom_yyyy_MM_dd1(cdData.closeDt);//閲囩敤鍏抽榾鏃ユ湡浣滀负缁熻鏃ユ湡
+        lastPo.openDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.openDt);
+        lastPo.closeDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.closeDt);
+        lastPo.thisAmountLast = cdData.thisAmount ;
+        lastPo.thisMoneyLast = cdData.thisMoney ;
+        lastPo.thisTimeLast = cdData.thisTime ;
+        lastPo.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt);
+        return lastPo ;
+    }
+    /**
+     * 鏇存柊鏈�鏂版暟鎹�
+     * @param clientVo
+     * @param poHistory
+     * @param dV1
+     * @param cdData
+     * @param lastPo
+     * @return
+     * @throws Exception
+     */
+    private RmClientAmountDay updateRmClientAmountBySameDateNewData(SeClient clientVo, RmClientAmountDay poHistory, RmClientAmountDayLast lastPo, DataV1 dV1, DataCd83CloseVo cdData)throws Exception {
+        poHistory.clientId = clientVo.getId();
+        if(poHistory.amount != null){
+            poHistory.amount += cdData.thisAmount ;
+        }else{
+            poHistory.amount = cdData.thisAmount ;
+        }
+        if(poHistory.money != null){
+            poHistory.money += cdData.thisMoney ;
+        }else{
+            poHistory.money = cdData.thisMoney ;
+        }
+        if(poHistory.times != null){
+            poHistory.times += 1 ;
+        }else{
+            poHistory.times = 1 ;
+        }
+        poHistory.dt = lastPo.dt ;
+        poHistory.openDtLast = lastPo.openDtLast ;
+        poHistory.closeDtLast = lastPo.closeDtLast ;
+        poHistory.thisAmountLast = lastPo.thisAmountLast ;
+        poHistory.thisMoneyLast = lastPo.thisMoneyLast ;
+        poHistory.thisTimeLast = lastPo.thisTimeLast ;
+        poHistory.rtuDtLast = lastPo.rtuDtLast ;
+        return poHistory ;
+    }
+
+    /**
+     * 鏇存柊鏈�鏂版暟鎹�
+     * @param clientVo
+     * @param poHistory
+     * @param dV1
+     * @param cdData
+     * @return
+     * @throws Exception
+     */
+    private RmClientAmountDay updateOldRmClientAmountBySupplyData(SeClient clientVo, RmClientAmountDay poHistory, DataV1 dV1, DataCd83CloseVo cdData)throws Exception {
+        poHistory.clientId = clientVo.getId();
+        if(poHistory.amount != null){
+            poHistory.amount += cdData.thisAmount ;
+        }else{
+            poHistory.amount = cdData.thisAmount ;
+        }
+        if(poHistory.money != null){
+            poHistory.money += cdData.thisMoney ;
+        }else{
+            poHistory.money = cdData.thisMoney ;
+        }
+        if(poHistory.times != null){
+            poHistory.times += 1 ;
+        }else{
+            poHistory.times = 1 ;
+        }
+        poHistory.dt = DateTime.dateFrom_yyyy_MM_dd1(cdData.closeDt);//閲囩敤鍏抽榾鏃ユ湡浣滀负缁熻鏃ユ湡
+        poHistory.openDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.openDt) ;
+        poHistory.closeDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.closeDt) ;
+        poHistory.thisAmountLast = cdData.thisAmount ;
+        poHistory.thisMoneyLast = cdData.thisMoney ;
+        poHistory.thisTimeLast = cdData.thisTime ;
+        poHistory.rtuDtLast = DateTime.dateFrom_yyyy_MM_dd_HH_mm_ss(cdData.rtuDt) ;
+        return poHistory ;
+    }
+}
\ No newline at end of file

--
Gitblit v1.8.0