From 04585acb4f7af05e9a944c2914a8550963fbcf59 Mon Sep 17 00:00:00 2001
From: liurunyu <lry9898@163.com>
Date: 星期五, 27 六月 2025 09:16:41 +0800
Subject: [PATCH] Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV

---
 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java | 1347 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 1,324 insertions(+), 23 deletions(-)

diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
index e244ab3..645050d 100644
--- a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
+++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
@@ -1,23 +1,35 @@
 package com.dy.pipIrrTerminal.card;
 
-import com.dy.common.webUtil.BaseResponse;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.dy.common.webUtil.BaseResponseUtils;
+import com.dy.common.webUtil.QueryResultVo;
 import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper;
-import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper;
-import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper;
-import com.dy.pipIrrGlobal.daoSe.SeClientMapper;
+import com.dy.pipIrrGlobal.daoSe.*;
 import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
 import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
-import com.dy.pipIrrGlobal.voSe.VoTermRecharge;
-import com.dy.pipIrrTerminal.card.dto.ActiveCard;
-import com.dy.pipIrrTerminal.card.dto.DtoRecharge;
+import com.dy.pipIrrGlobal.pojoSe.SeManagementCard;
+import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory;
+import com.dy.pipIrrGlobal.voSe.*;
+import com.dy.pipIrrTerminal.card.dto.*;
+import com.dy.pipIrrTerminal.card.qo.QoCards;
+import com.dy.pipIrrTerminal.card.qo.QoLostCards;
 import com.dy.pipIrrTerminal.card.enums.CardStateENUM;
 import com.dy.pipIrrTerminal.card.enums.LastOperateENUM;
+import com.dy.pipIrrTerminal.card.enums.ManagementCardStateENUM;
 import com.dy.pipIrrTerminal.card.enums.OperateTypeENUM;
+import com.dy.pipIrrTerminal.card.enums.RechargeTypeENUM;
+import com.dy.pipIrrTerminal.card.qo.QoTransaction;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.common.utils.PojoUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.dy.common.util.IDLongGenerator;
 
+import java.text.DecimalFormat;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -44,11 +56,24 @@
     @Autowired
     private PrWaterPriceMapper prWaterPriceMapper;
 
+    @Autowired
+    private SeRechargeHistoryMapper seRechargeHistoryMapper;
+
+    @Autowired
+    private SeManagerCardMapper seManagerCardMapper;
+
+    @Autowired
+    private SeManagementCardMapper seManagementCardMapper;
+
+    @Autowired
+    private IDLongGenerator idLongGenerator;
+
     @Value("${project.projectNo}")
     private Integer projectNo;
 
     /**
      * 鏍规嵁姘村崱鍦板潃鍒ゆ柇璇ュ崱鏄惁鍙互寮�鍗�
+     * 
      * @param cardAddr
      * @return true:鍙互寮�鍗�
      */
@@ -69,7 +94,250 @@
     }
 
     /**
+     * 鏍规嵁姘村崱缂栧彿鍒ゆ柇璇ュ崱鏄惁鍙互鍏呭��
+     * 
+     * @param po
+     * @return true:鍙互鍏呭��
+     */
+    public Map canRecharge(DtoRecharge po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        String stateName = Optional.ofNullable(seClientCardMapper.getCardStateByCardNum(po.getCardNum())).orElse("");
+        // 鍗曠嫭鍏呭�兼椂鍗$墖蹇呴』涓烘甯�
+        if ((po.getRechargeType() == RechargeTypeENUM.RECHARGE.getCode()) && !stateName.equals("姝e父")) {
+            map.put("msg", stateName + ", " + "姘村崱鐘舵�佷笉鏀寔褰撳墠鎿嶄綔");
+            return map;
+        }
+
+        map.put("success", true);
+        return map;
+    }
+
+    /**
+     * 鏍规嵁姘村崱缂栧彿鍒ゆ柇璇ュ崱鏄惁鍙互鎸傚け
+     * 
+     * @param po
+     * @return true:鍙互鎶ュけ
+     */
+    public Map canReportLoss(DtoLoss po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Long cardNum = po.getCardNum();
+        String stateName = seClientCardMapper.getCardStateByCardNum(cardNum);
+        if (stateName == null || stateName.equals("") || !stateName.equals("姝e父")) {
+            map.put("msg", stateName + ", " + "姘村崱鐘舵�佷笉鏀寔褰撳墠鎿嶄綔");
+            return map;
+        }
+
+        /**
+         * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
+         */
+        Map map_card = Optional.ofNullable(seClientCardMapper.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
+        if (map_card == null || map_card.size() <= 0) {
+            map.put("msg", "鍗″彿閿欒锛岃鍗′笉瀛樺湪");
+            return map;
+        }
+        CardSimple card = new CardSimple();
+        card.setCardId(Long.parseLong(map_card.get("cardId").toString()));
+        card.setClientId(Long.parseLong(map_card.get("clientId").toString()));
+        // card.setProtocol(map_card.get("protocol").toString());
+
+        map.put("success", true);
+        map.put("content", card);
+        return map;
+    }
+
+    /**
+     * 鏍规嵁姘村崱缂栧彿鍒ゆ柇璇ュ崱鏄惁鍙互瑙i攣
+     * 
+     * @param po
+     * @return
+     */
+    public Map canUnlock(DtoUnlock po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Long cardNum = po.getCardNum();
+        // 鍒ゆ柇褰撳墠姘村崱鏄惁涓烘寕澶辩姸鎬佷笖鏈ˉ鍗★紝浠呭凡缁忔寕澶卞叾鏈ˉ鍗$殑鍙互瑙i攣
+        if (!isLostAndUnreplaced(cardNum)) {
+            map.put("msg", "姘村崱鐘舵�佷笉鏀寔褰撳墠鎿嶄綔");
+            return map;
+        }
+
+        /**
+         * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
+         */
+        Map map_card = Optional.ofNullable(seClientCardMapper.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
+        if (map_card == null || map_card.size() <= 0) {
+            map.put("msg", "鍗″彿閿欒锛岃鍗′笉瀛樺湪");
+            return map;
+        }
+        CardSimple card = new CardSimple();
+        card.setCardId(Long.parseLong(map_card.get("cardId").toString()));
+        card.setClientId(Long.parseLong(map_card.get("clientId").toString()));
+
+        map.put("success", true);
+        map.put("content", card);
+        return map;
+    }
+
+    /**
+     * 鏍规嵁姘村崱缂栧彿鍒ゆ柇璇ュ崱鏄惁鍙互琛ュ崱
+     * 
+     * @param po
+     * @return true:鍙互琛ュ崱
+     */
+    public Map canReissue(DtoReissue po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Long cardNum = po.getCardNum();
+        Integer lostCount = seClientCardMapper.getLostCount(cardNum);
+        Integer replacedCount = seClientCardMapper.getReplacedCount(cardNum);
+        if (lostCount == 0 || replacedCount > 0) {
+            map.put("msg", "姘村崱鏈寕澶辨垨宸茶ˉ鍗★紝涓嶈兘琛ュ崱");
+            return map;
+        }
+
+        Float reissueAmount = po.getReissueAmount();
+        if (reissueAmount != null && reissueAmount > 0) {
+            Double tradeAmount = seCardOperateMapper.getTradeAmountByCardNo(cardNum);
+            if (tradeAmount != null && tradeAmount > 0) {
+                map.put("msg", "鍘熷崱鎸傚け鏃跺凡閫�娆撅紝琛ュ崱鏃朵笉鑳借ˉ璐圭敤");
+                return map;
+            }
+        }
+
+        Map map_card = Optional.ofNullable(seClientCardMapper.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
+        if (map_card == null || map_card.size() <= 0) {
+            map.put("msg", "鍗″彿閿欒锛岃鍗′笉瀛樺湪");
+            return map;
+        }
+
+        CardSimple card = new CardSimple();
+        card.setCardId(Long.parseLong(map_card.get("cardId").toString()));
+        card.setClientId(Long.parseLong(map_card.get("clientId").toString()));
+        card.setProtocol(map_card.get("protocol").toString());
+
+        map.put("success", true);
+        map.put("content", card);
+        return map;
+    }
+
+    /**
+     * 鏍规嵁姘村崱缂栧彿鍒ゆ柇璇ュ崱鏄惁鍙互娉ㄩ攢
+     * 
+     * @param po
+     * @return
+     */
+    public Map canCancel(DtoCancel po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Long cardNum = po.getCardNum();
+        String stateName = seClientCardMapper.getCardStateByCardNum(cardNum);
+        if (stateName == null || stateName.equals("") || !stateName.equals("姝e父")) {
+            map.put("msg", stateName + ", " + "姘村崱鐘舵�佷笉鏀寔褰撳墠鎿嶄綔");
+            return map;
+        }
+
+        /**
+         * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
+         */
+        Map map_card = Optional.ofNullable(seClientCardMapper.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
+        if (map_card == null || map_card.size() <= 0) {
+            map.put("msg", "鍗″彿閿欒锛岃鍗′笉瀛樺湪");
+            return map;
+        }
+        CardSimple card = new CardSimple();
+        card.setCardId(Long.parseLong(map_card.get("cardId").toString()));
+        card.setClientId(Long.parseLong(map_card.get("clientId").toString()));
+
+        map.put("success", true);
+        map.put("content", card);
+        return map;
+    }
+
+    /**
+     * 鏍规嵁姘村崱缂栧彿鍒ゆ柇璇ュ崱鏄惁鍙互琛ユ墸
+     * 
+     * @param po
+     * @return
+     */
+    public Map canRepay(DtoRepaySupplement po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Long cardNum = po.getCardNum();
+        String stateName = seClientCardMapper.getCardStateByCardNum(cardNum);
+        if (stateName == null || stateName.equals("") || !stateName.equals("姝e父")) {
+            map.put("msg", stateName + ", " + "姘村崱鐘舵�佷笉鏀寔褰撳墠鎿嶄綔");
+            return map;
+        }
+
+        /**
+         * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
+         */
+        Map map_card = Optional.ofNullable(seClientCardMapper.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
+        if (map_card == null || map_card.size() <= 0) {
+            map.put("msg", "鍗″彿閿欒锛岃鍗′笉瀛樺湪");
+            return map;
+        }
+        CardSimple card = new CardSimple();
+        card.setCardId(Long.parseLong(map_card.get("cardId").toString()));
+        card.setClientId(Long.parseLong(map_card.get("clientId").toString()));
+
+        map.put("success", true);
+        map.put("content", card);
+        return map;
+    }
+
+    /**
+     * 鏍规嵁姘村崱缂栧彿鍒ゆ柇璇ュ崱鏄惁鍙互杩旇繕
+     * 
+     * @param po
+     * @return
+     */
+    public Map canSupplement(DtoRepaySupplement po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Long cardNum = po.getCardNum();
+        String stateName = seClientCardMapper.getCardStateByCardNum(cardNum);
+        if (stateName == null || stateName.equals("") || !stateName.equals("姝e父")) {
+            map.put("msg", stateName + ", " + "姘村崱鐘舵�佷笉鏀寔褰撳墠鎿嶄綔");
+            return map;
+        }
+
+        /**
+         * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
+         */
+        Map map_card = Optional.ofNullable(seClientCardMapper.getCardIdAndClientNum(cardNum)).orElse(new HashMap());
+        if (map_card == null || map_card.size() <= 0) {
+            map.put("msg", "鍗″彿閿欒锛岃鍗′笉瀛樺湪");
+            return map;
+        }
+        CardSimple card = new CardSimple();
+        card.setCardId(Long.parseLong(map_card.get("cardId").toString()));
+        card.setClientId(Long.parseLong(map_card.get("clientId").toString()));
+
+        map.put("success", true);
+        map.put("content", card);
+        return map;
+    }
+
+    /**
      * 鏍规嵁鍐滄埛缂栧彿鑾峰彇5绾ц鏀垮尯鍒掍覆areaCode锛岃ˉ鍗¤繃绋嬩腑寮�鏂板崱浣跨敤
+     * 
      * @param clientId
      * @return
      */
@@ -125,7 +393,7 @@
         return dtf.format(dateTime) + sb.toString();
     }
 
-
+    @Transactional(rollbackFor = Exception.class)
     public Map addCardAndOperate(ActiveCard po, Long cardNum, String orderNo) {
         Map map = new HashMap<>();
         map.put("success", false);
@@ -139,6 +407,7 @@
         seClientCard.setClientid(po.getClientId());
         seClientCard.setMoney(po.getAmount());
         seClientCard.setState(CardStateENUM.INVALID.getCode());
+        seClientCard.setOrderNo(orderNo);
         if (po.getOriginalCardId() != null) {
             // 琛ュ崱
             seClientCard.setOriginalCardId(po.getOriginalCardId());
@@ -188,11 +457,22 @@
         return map;
     }
 
-    public Map plusRecharge(ActiveCard po, Long cardNum) {
+    /**
+     * 寮�鍗¢檮鍔犲厖鍊�
+     * 
+     * @param po
+     * @param cardNum
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map plusRecharge(ActiveCard po, Long cardNum, String orderNo) {
         Map map = new HashMap<>();
         map.put("success", false);
         map.put("content", null);
 
+        /**
+         * 娣诲姞姘村崱鎿嶄綔璁板綍
+         */
         DtoRecharge dtoRecharge = new DtoRecharge();
         dtoRecharge.setCardNum(cardNum);
         dtoRecharge.setAmount(po.getAmount());
@@ -202,17 +482,22 @@
         dtoRecharge.setMoney(0f);
         dtoRecharge.setGift(0f);
         dtoRecharge.setPrice(0f);
-        //BaseResponse<Boolean> job = cardOperateSv.addRecharge(dtoRecharge);
-        BaseResponse<Boolean> job = null;
-        if (!job.getCode().equals("0001")) {
+        Map map_plusRecharge = addRecharge(dtoRecharge, orderNo);
+        if (!map_plusRecharge.get("success").equals(true)) {
             map.put("msg", "寮�鍗″け璐�-鍏呭�煎紓甯�");
             return map;
         }
-
         map.put("success", true);
         return map;
     }
 
+    /**
+     * 婵�娲绘垨琛ュ崱
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
     public Map activeOrReissueTermCard(ActiveCard po) {
         Map map = new HashMap<>();
         map.put("success", false);
@@ -226,7 +511,7 @@
         }
 
         Map map_cardNum = generateCardNum(po.getClientId());
-        if(map_cardNum.get("success").equals(false)) {
+        if (map_cardNum.get("success").equals(false)) {
             map.put("msg", map_cardNum.get("msg").toString());
             return map;
         }
@@ -234,29 +519,122 @@
 
         String orderNo = generateOrderNo();
         Map map_addCardAndOperate = addCardAndOperate(po, cardNum, orderNo);
-        if(map_addCardAndOperate.get("success").equals(false)) {
+        if (map_addCardAndOperate.get("success").equals(false)) {
             map.put("msg", map_addCardAndOperate.get("msg").toString());
             return map;
         }
 
         if (amount != null && amount > 0 && originalCardId == null) {
-            Map map_plusRecharge = plusRecharge(po, cardNum);
-            if(map_plusRecharge.get("success").equals(false)) {
+            Map map_plusRecharge = plusRecharge(po, cardNum, orderNo);
+            if (map_plusRecharge.get("success").equals(false)) {
                 map.put("msg", map_plusRecharge.get("msg").toString());
                 return map;
             }
         }
 
-        Float balance = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum)).orElse(0f);
+        Float balance = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum, null)).orElse(0f);
         Double waterPrice = prWaterPriceMapper.getPrice();
 
-        VoTermRecharge voTermRecharge = new VoTermRecharge();
+        VoTermActiveCard voTermActiveCard = new VoTermActiveCard();
+        voTermActiveCard.setProjectNo(projectNo);
+        voTermActiveCard.setCardNum(cardNum);
+        voTermActiveCard.setBalance(balance);
+        voTermActiveCard.setWaterPrice(waterPrice);
+        voTermActiveCard.setTime(new Date());
+        voTermActiveCard.setOrderNo(orderNo);
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        map.put("content", voTermActiveCard);
+        return map;
+    }
+
+    /**
+     * 鍏呭��
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map addRecharge(DtoRecharge po, String orderNo) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Map map_canRecharge = canRecharge(po);
+        if (map_canRecharge.get("success").equals(false)) {
+            map.put("msg", map_canRecharge.get("msg").toString());
+            return map;
+        }
+
+        /**
+         * 渚濇嵁姘村崱缂栧彿鑾峰彇姘村崱琛ㄤ富閿強鍐滄埛缂栧彿
+         */
+        Map map_cardAndClient = seClientCardMapper.getCardIdAndClientNum(po.getCardNum());
+        if (map_cardAndClient == null || map_cardAndClient.size() <= 0) {
+            map.put("msg", "鍗″彿閿欒锛岃鍗′笉瀛樺湪");
+            return map;
+        }
+        Long cardId = Long.parseLong(map_cardAndClient.get("cardId").toString());
+        Long clientId = Long.parseLong(map_cardAndClient.get("clientId").toString());
+        if (orderNo == null || orderNo.length() <= 0) {
+            orderNo = generateOrderNo();
+        }
+
+        /**
+         * 娣诲姞姘村崱鍏呭�兼搷浣滆褰�
+         */
+        SeCardOperate seCardOperate = new SeCardOperate();
+        seCardOperate.setCardId(cardId);
+        seCardOperate.setClientId(clientId);
+        seCardOperate.setMoney(po.getMoney());
+        seCardOperate.setTradeAmount(po.getAmount());
+        seCardOperate.setGift(po.getGift());
+        seCardOperate.setOperateType(OperateTypeENUM.RECHARGE.getCode());
+        seCardOperate.setPaymentId(po.getPaymentId());
+        seCardOperate.setPrice(po.getPrice());
+        seCardOperate.setRemarks(po.getRemarks());
+        seCardOperate.setOperator(po.getOperator());
+        seCardOperate.setOperateDt(new Date());
+        seCardOperate.setOrderNo(orderNo + "p");
+        seCardOperate.setOperateValid((byte) 1);
+        seCardOperateMapper.insert(seCardOperate);
+        Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L);
+        if (rec == 0) {
+            map.put("msg", "鍏呭�煎け璐�-鍏呭�艰褰曞啓鍏ュ紓甯�");
+            return map;
+        }
+
+        /**
+         * 娣诲姞鍏呭�煎巻鍙茶褰�
+         */
+        SeRechargeHistory seRechargeHistory = new SeRechargeHistory();
+        seRechargeHistory.setCardid(cardId);
+        seRechargeHistory.setClientid(clientId);
+        seRechargeHistory.setMoney(po.getMoney());
+        seRechargeHistory.setAmount(po.getAmount());
+        seRechargeHistory.setGift(po.getGift());
+        Float afterRecharge = po.getMoney() + po.getAmount() + po.getGift();
+        seRechargeHistory.setAfterrecharge(afterRecharge);
+        seRechargeHistory.setPaymentid(po.getPaymentId());
+        seRechargeHistory.setPrice(po.getPrice());
+        seRechargeHistory.setRemarks(po.getRemarks());
+        seRechargeHistory.setOperator(po.getOperator());
+        seRechargeHistory.setOperatedt(new Date());
+        seRechargeHistory.setOperateValid((byte) 1);
+        seRechargeHistory.setOrderNo(orderNo);
+        seRechargeHistoryMapper.insert(seRechargeHistory);
+        Long rec_seRechargeHistory = Optional.ofNullable(seRechargeHistory.getId()).orElse(0L);
+        if (rec_seRechargeHistory == 0) {
+            map.put("msg", "鍏呭�煎け璐�-鍏呭�煎巻鍙茶褰曞啓鍏ュ紓甯�");
+            return map;
+        }
+
+        VoTermCommon voTermRecharge = new VoTermCommon();
         voTermRecharge.setProjectNo(projectNo);
-        voTermRecharge.setCardNum(cardNum);
-        voTermRecharge.setBalance(balance);
-        voTermRecharge.setWaterPrice(waterPrice);
-        voTermRecharge.setTime(new Date());
+        voTermRecharge.setCardNum(po.getCardNum());
         voTermRecharge.setOrderNo(orderNo);
+        voTermRecharge.setBalance(afterRecharge);
 
         map.put("success", true);
         map.put("msg", "鎿嶄綔鎴愬姛");
@@ -264,4 +642,927 @@
         return map;
     }
 
+    /**
+     * 琛ュ崱
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map reissue(DtoReissue po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Map map_canReissue = canReissue(po);
+        if (map_canReissue.get("success").equals(false)) {
+            map.put("msg", map_canReissue.get("msg").toString());
+            return map;
+        }
+        CardSimple card = (CardSimple) map_canReissue.get("content");
+        Long cardId = card.getCardId();
+        Long clientId = card.getClientId();
+        String protocol = card.getProtocol();
+
+        /**
+         * 娣诲姞寮�鍗¤褰曪紝閫�杩橀噾棰濆啿鍒版柊鍗′腑
+         */
+        ActiveCard activeCard = new ActiveCard();
+        activeCard.setProtocol(protocol);
+        activeCard.setCardAddr(po.getCardAddr());
+        activeCard.setClientId(clientId);
+        activeCard.setOriginalCardId(cardId);
+        activeCard.setCardCost(po.getCardCost());
+        activeCard.setAmount(po.getReissueAmount());
+        activeCard.setPaymentId(po.getPaymentId());
+        activeCard.setRemarks(po.getRemarks());
+        activeCard.setOperator(po.getOperator());
+
+        Map map_newCard = activeOrReissueTermCard(activeCard);
+        VoTermActiveCard voTermActiveCard = (VoTermActiveCard) map_newCard.get("content");
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        map.put("content", voTermActiveCard);
+        return map;
+    }
+
+    /**
+     * 鎸傚け
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map reportLoss(DtoLoss po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Map map_canReportLoss = canReportLoss(po);
+        if (map_canReportLoss.get("success").equals(false)) {
+            map.put("msg", map_canReportLoss.get("msg").toString());
+            return map;
+        }
+        CardSimple card = (CardSimple) map_canReportLoss.get("content");
+        Long cardId = card.getCardId();
+        Long clientId = card.getClientId();
+
+        Float money = Optional.ofNullable(po.getMoney()).orElse(0f);
+        Float refund = Optional.ofNullable(po.getRefund()).orElse(0f);
+
+        SeClientCard seClientCard = new SeClientCard();
+        seClientCard.setId(cardId);
+        seClientCard.setMoney(money);
+        seClientCard.setLossdtdt(new Date());
+        seClientCard.setState(CardStateENUM.LOSS.getCode());
+        seClientCard.setLastoper(LastOperateENUM.LOSS.getCode());
+        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard))
+                .orElse(0);
+        if (rec_updateClientCard == 0) {
+            map.put("msg", "鎸傚け澶辫触-鍐滄埛鍗′慨鏀瑰紓甯�");
+            return map;
+        }
+
+        SeCardOperate seCardOperate = new SeCardOperate();
+        seCardOperate.setCardId(cardId);
+        seCardOperate.setClientId(clientId);
+        seCardOperate.setMoney(money);
+        seCardOperate.setTradeAmount(-refund);
+        seCardOperate.setPaymentId(1L);
+        seCardOperate.setOperateType(OperateTypeENUM.LOSS.getCode());
+        seCardOperate.setRemarks(po.getRemarks());
+        seCardOperate.setOperator(po.getOperator());
+        seCardOperate.setOperateDt(new Date());
+        seCardOperate.setOperateValid((byte) 2);
+        seCardOperateMapper.insert(seCardOperate);
+        if (seCardOperate.getId() == 0) {
+            map.put("msg", "鎸傚け澶辫触-鎸傚け璁板綍鍐欏叆寮傚父");
+            return map;
+        }
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        return map;
+    }
+
+    /**
+     * 瑙i攣
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map unlock(DtoUnlock po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        Map map_canUnlock = canUnlock(po);
+        if (map_canUnlock.get("success").equals(false)) {
+            map.put("msg", map_canUnlock.get("msg").toString());
+            return map;
+        }
+        CardSimple card = (CardSimple) map_canUnlock.get("content");
+        Long cardId = card.getCardId();
+        Long clientId = card.getClientId();
+
+        /**
+         * 淇敼鍐滄埛鍗′俊鎭細
+         * 鎸傚け鏃堕棿
+         * 鏈�鍚庢搷浣滅被鍨�-4
+         */
+        SeClientCard seClientCard = new SeClientCard();
+        seClientCard.setId(cardId);
+        seClientCard.setUnlockdt(new Date());
+        seClientCard.setMoney(po.getMoney());
+        seClientCard.setState(CardStateENUM.NORMAL.getCode());
+        seClientCard.setLastoper(LastOperateENUM.UNLOCK.getCode());
+        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard))
+                .orElse(0);
+        if (rec_updateClientCard == 0) {
+            map.put("msg", "瑙i攣澶辫触-鍐滄埛鍗′慨鏀瑰紓甯�");
+            return map;
+        }
+
+        /**
+         * 娣诲姞瑙i攣璁板綍
+         */
+        SeCardOperate seCardOperate = new SeCardOperate();
+        seCardOperate.setCardId(cardId);
+        seCardOperate.setClientId(clientId);
+        seCardOperate.setMoney(po.getMoney());
+        seCardOperate.setOperateType(OperateTypeENUM.UNLOCK.getCode());
+        seCardOperate.setRemarks(po.getRemarks());
+        seCardOperate.setOperator(po.getOperator());
+        seCardOperate.setOperateDt(new Date());
+        seCardOperate.setOperateValid((byte) 2);
+        seCardOperateMapper.insert(seCardOperate);
+        Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L);
+        if (rec == 0) {
+            map.put("msg", "瑙i攣澶辫触-瑙i攣璁板綍鍐欏叆寮傚父");
+            return map;
+        }
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        return map;
+    }
+
+    /**
+     * 閿�鍗�
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map cancel(DtoCancel po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+        String orderNo = generateOrderNo();
+
+        Map map_canCancel = canCancel(po);
+        if (map_canCancel.get("success").equals(false)) {
+            map.put("msg", map_canCancel.get("msg").toString());
+            return map;
+        }
+        CardSimple card = (CardSimple) map_canCancel.get("content");
+        Long cardId = card.getCardId();
+        Long clientId = card.getClientId();
+
+        SeCardOperate seCardOperate = new SeCardOperate();
+        seCardOperate.setCardId(cardId);
+        seCardOperate.setClientId(clientId);
+        seCardOperate.setTradeAmount(-po.getRefund());
+        seCardOperate.setPaymentId(po.getRefundType());
+        seCardOperate.setOperateType(OperateTypeENUM.CANCEL.getCode());
+        seCardOperate.setRemarks(po.getRemarks());
+        seCardOperate.setOperator(po.getOperator());
+        seCardOperate.setOperateDt(new Date());
+        seCardOperate.setOrderNo(orderNo);
+        seCardOperate.setOperateValid((byte) 1);
+        seCardOperateMapper.insert(seCardOperate);
+        if (seCardOperate.getId() == 0) {
+            map.put("msg", "閿�鍗″け璐�-閿�鍗¤褰曞啓鍏ュ紓甯�");
+            return map;
+        }
+
+        VoTermCommon voTermCandel = new VoTermCommon();
+        voTermCandel.setProjectNo(projectNo);
+        voTermCandel.setCardNum(po.getCardNum());
+        voTermCandel.setOrderNo(orderNo);
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        map.put("content", voTermCandel);
+        return map;
+    }
+
+    /**
+     * 琛ユ墸
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map repay(DtoRepaySupplement po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+        String orderNo = generateOrderNo();
+        Date operateTime = new Date();
+        Double waterPrice = Optional.ofNullable(prWaterPriceMapper.getPrice()).orElse(0.0);
+
+        Map map_canRepay = canRepay(po);
+        if (map_canRepay.get("success").equals(false)) {
+            map.put("msg", map_canRepay.get("msg").toString());
+            return map;
+        }
+        CardSimple card = (CardSimple) map_canRepay.get("content");
+        Long cardId = card.getCardId();
+        Long clientId = card.getClientId();
+
+        SeCardOperate seCardOperate = new SeCardOperate();
+        seCardOperate.setCardId(cardId);
+        seCardOperate.setClientId(clientId);
+        seCardOperate.setMoney(po.getBalance());
+        seCardOperate.setRefundAmount(po.getRepayMorny());
+        seCardOperate.setOperateType(OperateTypeENUM.REFUND.getCode());
+        seCardOperate.setRemarks(po.getRemarks());
+        seCardOperate.setOperator(po.getOperator());
+        seCardOperate.setOperateDt(operateTime);
+        seCardOperate.setOrderNo(orderNo);
+        seCardOperate.setOperateValid((byte) 1);
+        seCardOperateMapper.insert(seCardOperate);
+        if (seCardOperate.getId() == 0) {
+            map.put("msg", "琛ユ墸澶辫触-琛ユ墸璁板綍鍐欏叆寮傚父");
+            return map;
+        }
+
+        VoRepaySupplement voRepaySupplement = new VoRepaySupplement();
+        voRepaySupplement.setBalance(po.getBalance() - po.getRepayMorny());
+        voRepaySupplement.setWaterPrice(waterPrice);
+        voRepaySupplement.setTime(operateTime);
+        voRepaySupplement.setOrderNo(orderNo);
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        map.put("content", voRepaySupplement);
+        return map;
+    }
+
+    /**
+     * 杩旇繕
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map supplement(DtoRepaySupplement po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+        String orderNo = generateOrderNo();
+        Date operateTime = new Date();
+        Double waterPrice = Optional.ofNullable(prWaterPriceMapper.getPrice()).orElse(0.0);
+
+        Map map_canSupplement = canSupplement(po);
+        if (map_canSupplement.get("success").equals(false)) {
+            map.put("msg", map_canSupplement.get("msg").toString());
+            return map;
+        }
+        CardSimple card = (CardSimple) map_canSupplement.get("content");
+        Long cardId = card.getCardId();
+        Long clientId = card.getClientId();
+
+        SeCardOperate seCardOperate = new SeCardOperate();
+        seCardOperate.setCardId(cardId);
+        seCardOperate.setClientId(clientId);
+        seCardOperate.setMoney(po.getBalance());
+        seCardOperate.setRefundAmount(po.getSupplementMoney());
+        seCardOperate.setOperateType(OperateTypeENUM.SUPPLEMENT.getCode());
+        seCardOperate.setRemarks(po.getRemarks());
+        seCardOperate.setOperator(po.getOperator());
+        seCardOperate.setOperateDt(operateTime);
+        seCardOperate.setOrderNo(orderNo);
+        seCardOperate.setOperateValid((byte) 1);
+        seCardOperateMapper.insert(seCardOperate);
+        if (seCardOperate.getId() == 0) {
+            map.put("msg", "杩旇繕澶辫触-杩旇繕璁板綍鍐欏叆寮傚父");
+            return map;
+        }
+        VoRepaySupplement voRepaySupplement = new VoRepaySupplement();
+        voRepaySupplement.setBalance(po.getBalance() + po.getSupplementMoney());
+        voRepaySupplement.setWaterPrice(waterPrice);
+        voRepaySupplement.setTime(operateTime);
+        voRepaySupplement.setOrderNo(orderNo);
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        map.put("content", voRepaySupplement);
+        return map;
+    }
+
+    /**
+     * 鎿嶄綔鍥炶皟
+     * 
+     * @param po
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map callBack(DtoCallBack po) {
+        Map map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        String cardAddr = po.getCardAddr();
+        Integer operateType = po.getOperateType();
+        String orderNumber = po.getOrderNumber();
+
+        // 鍏堟鏌ユ槸鍚︿负绠$悊鍗�
+        if (operateType.equals(OperateTypeENUM.MANAGEMENT_CARD_WRITE.getCode().intValue())) {
+            // 绠$悊绫诲瀷鍗″啓鍗¢�昏緫
+            return handleManagementCardWrite(cardAddr, orderNumber);
+        }
+
+        // 澶勭悊鍐滄埛鍗¢�昏緫
+        Long cardId = seClientCardMapper.getCardIdByAddr(cardAddr);
+        if (cardId == null || cardId.equals(0)) {
+            map.put("msg", "鎮ㄦ寚瀹氱殑姘村崱涓嶅瓨鍦�");
+            return map;
+        }
+
+        if (operateType.equals(OperateTypeENUM.ACTIVE.getCode().intValue())) {
+            /**
+             * 寮�鍗℃搷浣滄墽琛岄�氱煡
+             * 1.渚濇嵁璁㈠崟鍙峰皢鏃犳晥鐘舵�佺殑鎿嶄綔璁板綍鏀逛负鏈夋晥
+             * 2.渚濇嵁姘村崱ID灏嗘棤鏁堢姸鎬佺殑姘村崱璁板綍鏀逛负鏈夋晥
+             * 3.濡傛灉寮�鍗″悓姝ュ厖鍊�
+             * 淇敼鍏呭�兼搷浣滆褰曚负鏈夋晥
+             * 淇敼鍏呭�煎巻鍙茶褰曚负鏈夋晥
+             * 淇敼姘村崱琛ㄧ殑鎿嶄綔淇℃伅
+             */
+            Integer rec_ope = turnOperateValidByOrderNumber(orderNumber);
+            Integer rec_card = turnCardValidByOrderNumber(orderNumber);
+            if (rec_ope == 0 || rec_card == 0) {
+                map.put("msg", "涓嶅瓨鍦ㄦ湭鐢熸晥鐨勬按鍗�");
+                return map;
+            }
+
+            if (isMergeRecharge(cardId)) {
+                turnOperateValidByOrderNumber(orderNumber + "p");
+                turnRechargeHistoryValidByOrderNumber(orderNumber);
+                updateCard(cardId, orderNumber + "p");
+            }
+        } else if (operateType.equals(OperateTypeENUM.RECHARGE.getCode().intValue())) {
+            /**
+             * 鍏呭�兼搷浣滄墽琛岄�氱煡
+             * 1. 鎿嶄綔璁板綍鏀逛负鏈夋晥
+             * 2. 鍏呭�煎巻鍙茶褰曟敼涓烘湁鏁�
+             * 3. 淇敼姘村崱琛ㄧ殑鎿嶄綔淇℃伅
+             */
+            turnOperateValidByOrderNumber(orderNumber + "p");
+            turnRechargeHistoryValidByOrderNumber(orderNumber);
+            updateCard(cardId, orderNumber + "p");
+        } else if (operateType.equals(OperateTypeENUM.CANCEL.getCode().intValue())) {
+            /**
+             * 閿�鍗℃搷浣滄墽琛岄�氱煡
+             * 1. 鎿嶄綔璁板綍鏀逛负鏈夋晥
+             * 2. 淇敼姘村崱琛ㄦ搷浣滀俊鎭強浣欓
+             */
+
+            Integer rec_ope = turnOperateValidByOrderNumber(orderNumber);
+            Integer rec_card = updateCardInfo(cardId, orderNumber);
+            if (rec_ope == 0 || rec_card == 0) {
+                map.put("msg", "閿�鍗″洖璋冨け璐�");
+                return map;
+            }
+
+        } else if (operateType.equals(OperateTypeENUM.REISSUE.getCode().intValue())) {
+            /**
+             * 琛ュ崱鎿嶄綔鎵ц閫氱煡
+             * 1. 鏂版按鍗¤褰曟敼涓烘湁鏁�
+             * 2. 寮�鍗℃搷浣滆褰曟敼涓烘湁鏁�
+             * 3. 濡傛灉瀛樺湪閫�杩橀噾棰�
+             * 娓呯┖鍘熷崱浣欓
+             */
+            Integer rec_card = turnCardValidByOrderNumber(orderNumber);
+            Integer rec_ope = turnOperateValidByOrderNumber(orderNumber);
+            emptyCardBalance(orderNumber);
+            if (rec_card == 0 || rec_ope == 0) {
+                map.put("msg", "琛ュ崱鍥炶皟澶辫触");
+                return map;
+            }
+        } else if (operateType.equals(OperateTypeENUM.REFUND.getCode().intValue())) {
+            /**
+             * 琛ユ墸鎿嶄綔鎵ц閫氱煡
+             * 1. 鎿嶄綔璁板綍鏀逛负鏈夋晥
+             * 2. 淇敼姘村崱琛ㄦ搷浣滀俊鎭強浣欓
+             */
+            Integer rec_ope = turnOperateValidByOrderNumber(orderNumber);
+            Integer rec_card = updateCardInfo_repay(cardId, orderNumber);
+            if (rec_ope == 0 || rec_card == 0) {
+                map.put("msg", "琛ユ墸鍥炶皟澶辫触");
+                return map;
+            }
+        } else if (operateType.equals(OperateTypeENUM.SUPPLEMENT.getCode().intValue())) {
+            /**
+             * 杩旇繕鎿嶄綔鎵ц閫氱煡
+             * 1. 鎿嶄綔璁板綍鏀逛负鏈夋晥
+             * 2. 淇敼姘村崱琛ㄦ搷浣滀俊鎭強浣欓
+             */
+            Integer rec_ope = turnOperateValidByOrderNumber(orderNumber);
+            Integer rec_card = updateCardInfo_supplement(cardId, orderNumber);
+            if (rec_ope == 0 || rec_card == 0) {
+                map.put("msg", "杩旇繕鍥炶皟澶辫触");
+                return map;
+            }
+        }
+
+        map.put("success", true);
+        map.put("msg", "鎿嶄綔鎴愬姛");
+        return map;
+    }
+
+    /**
+     * 澶勭悊绠$悊绫诲瀷鍗″啓鍗″洖璋�
+     * 
+     * @param cardAddr    鍗″湴鍧�
+     * @param orderNumber 璁㈠崟鍙�
+     * @return 澶勭悊缁撴灉
+     */
+    private Map<String, Object> handleManagementCardWrite(String cardAddr, String orderNumber) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("success", false);
+        map.put("content", null);
+
+        try {
+            // 鏍规嵁鍗″湴鍧�鍜岃鍗曞彿鏌ユ壘绠$悊鍗�
+            SeManagementCard managementCard = seManagementCardMapper.selectOne(
+                    com.baomidou.mybatisplus.core.toolkit.Wrappers.<SeManagementCard>lambdaQuery()
+                            .eq(SeManagementCard::getCardAddr, cardAddr)
+                            .eq(SeManagementCard::getOrderNo, orderNumber));
+
+            if (managementCard == null) {
+                map.put("msg", "鏈壘鍒板搴旂殑绠$悊鍗¤褰�");
+                return map;
+            }
+
+            // 鏇存柊绠$悊鍗$姸鎬佷负姝e父
+            managementCard.setState(ManagementCardStateENUM.NORMAL.getCode());
+
+            int updateResult = seManagementCardMapper.updateByPrimaryKeySelective(managementCard);
+            if (updateResult > 0) {
+                map.put("success", true);
+                map.put("msg", "绠$悊鍗″啓鍗″畬鎴愶紝鐘舵�佸凡鏇存柊涓烘甯�");
+            } else {
+                map.put("msg", "绠$悊鍗$姸鎬佹洿鏂板け璐�");
+            }
+        } catch (Exception e) {
+            log.error("澶勭悊绠$悊鍗″啓鍗″洖璋冨紓甯�", e);
+            map.put("msg", "澶勭悊绠$悊鍗″啓鍗″洖璋冩椂鍙戠敓寮傚父锛�" + e.getMessage());
+        }
+
+        return map;
+    }
+
+    // 鏍规嵁璁㈠崟鍙峰皢鎿嶄綔璁板綍鏀逛负鏈夋晥
+    public Integer turnOperateValidByOrderNumber(String orderNumber) {
+        return seCardOperateMapper.turnOperateValidByOrderNumber(orderNumber);
+    }
+
+    // 鏍规嵁璁㈠崟鍙峰皢姘村崱鏀逛负鏈夋晥
+    public Integer turnCardValidByOrderNumber(String orderNumber) {
+        return seClientCardMapper.turnCardValidByOrderNumber(orderNumber);
+    }
+
+    // 鏍规嵁璁㈠崟鍙峰皢鍏呭�煎巻鍙叉敼涓烘湁鏁�
+    public Integer turnRechargeHistoryValidByOrderNumber(String orderNumber) {
+        return seRechargeHistoryMapper.turnRechargeHistoryValidByOrderNumber(orderNumber);
+    }
+
+    // 鏍规嵁cardId鍒ゆ柇鏄惁鏄悎骞跺厖鍊�
+    public Boolean isMergeRecharge(Long cardId) {
+        Integer plusRechargeCount = seCardOperateMapper.getPlusRechargeCount(cardId);
+        if (plusRechargeCount == 0) {
+            return false;
+        }
+        return true;
+    }
+
+    // 淇敼姘村崱淇℃伅
+    public Boolean updateCard(Long cardId, String orderNumber) {
+        VoAfterRecharge voAfterRecharge = seCardOperateMapper.getBalanceAfterRecharge(orderNumber);
+
+        SeClientCard clientCard = new SeClientCard();
+        clientCard.setId(cardId);
+        clientCard.setMoney(voAfterRecharge.getBalanceAfterRecharge());
+        clientCard.setRechargedt(voAfterRecharge.getOperateTime());
+        clientCard.setLastoper(LastOperateENUM.RECHARGE.getCode());
+        Integer rec_updateClientCard = seClientCardMapper.updateByPrimaryKeySelective(clientCard);
+        if (rec_updateClientCard == null || rec_updateClientCard == 0) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 濡傛灉琛ュ崱鏃堕��杩樹簡閲戦锛屾竻绌烘寕澶卞崱浣欓
+     * 
+     * @param orderNumber
+     */
+    public Integer emptyCardBalance(String orderNumber) {
+        Integer rec_empty = 0;
+        Float noTradeAmount = seCardOperateMapper.getNoTradeAmount(orderNumber);
+        if (noTradeAmount != null && noTradeAmount > 0) {
+            rec_empty = seClientCardMapper.emptyCardBalance(orderNumber);
+        }
+        return rec_empty;
+    }
+
+    /**
+     * 淇敼娉ㄩ攢姘村崱琛ㄧ殑璁板綍鍙婁綑棰濓紙0锛�
+     * 
+     * @param orderNumber
+     * @return
+     */
+    public Integer updateCardInfo(Long cardId, String orderNumber) {
+        Date operateTime = seCardOperateMapper.getOperateTime(orderNumber);
+
+        SeClientCard clientCard = new SeClientCard();
+        clientCard.setId(cardId);
+        clientCard.setCanceldt(operateTime);
+        clientCard.setMoney(0f);
+        clientCard.setState(CardStateENUM.CANCELLED.getCode());
+        clientCard.setLastoper(LastOperateENUM.CANCEL.getCode());
+        return seClientCardMapper.updateByPrimaryKeySelective(clientCard);
+    }
+
+    /**
+     * 淇敼琛ユ墸姘村崱琛ㄨ褰曞強浣欓
+     * 
+     * @param cardId
+     * @param orderNumber
+     * @return
+     */
+    public Integer updateCardInfo_repay(Long cardId, String orderNumber) {
+        VoRepaySupplementSimple po = seCardOperateMapper.getCardOperateByOrderNumber(orderNumber);
+        Float money = Optional.ofNullable(po.getMoney()).orElse(0f);
+        Float refundAmount = Optional.ofNullable(po.getRefundAmount()).orElse(0f);
+        Date operateTime = po.getOperateTime();
+
+        SeClientCard clientCard = new SeClientCard();
+        clientCard.setId(cardId);
+        clientCard.setRefunddt(operateTime);
+        clientCard.setMoney(money - refundAmount);
+        clientCard.setState(CardStateENUM.NORMAL.getCode());
+        clientCard.setLastoper(LastOperateENUM.REFUND.getCode());
+        return seClientCardMapper.updateByPrimaryKeySelective(clientCard);
+    }
+
+    /**
+     * 淇敼杩旇繕姘村崱琛ㄨ褰曞強浣欓
+     * 
+     * @param cardId
+     * @param orderNumber
+     * @return
+     */
+    public Integer updateCardInfo_supplement(Long cardId, String orderNumber) {
+        VoRepaySupplementSimple po = seCardOperateMapper.getCardOperateByOrderNumber(orderNumber);
+        Float money = Optional.ofNullable(po.getMoney()).orElse(0f);
+        Float refundAmount = Optional.ofNullable(po.getRefundAmount()).orElse(0f);
+        Date operateTime = po.getOperateTime();
+
+        SeClientCard clientCard = new SeClientCard();
+        clientCard.setId(cardId);
+        clientCard.setRefunddt(operateTime);
+        clientCard.setMoney(money + refundAmount);
+        clientCard.setState(CardStateENUM.NORMAL.getCode());
+        clientCard.setLastoper(LastOperateENUM.WRITE_BACK.getCode());
+        return seClientCardMapper.updateByPrimaryKeySelective(clientCard);
+    }
+
+    /**
+     * 鍒ゆ柇鎸囧畾姘村崱鏄惁涓烘寕澶辩姸鎬佷笖鏃犺ˉ鍗¤褰�
+     * 
+     * @param cardNum
+     * @return
+     */
+    public Boolean isLostAndUnreplaced(Long cardNum) {
+        Integer lostCount = seClientCardMapper.getLostCount(cardNum);
+        Integer replacedCount = seClientCardMapper.getReplacedCount(cardNum);
+        if (lostCount > 0 && replacedCount == 0) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 璇诲彇姘村崱淇℃伅
+     * 
+     * @param cardAddr
+     * @return
+     */
+    public VoTermCard readCard(String cardAddr) {
+        VoTermCard voTermCard = seClientCardMapper.getTermCardInfo(cardAddr);
+        if (voTermCard != null) {
+            return voTermCard;
+        }
+
+        VoTermCard voTermManagerCard = seManagerCardMapper.getTermManagerCardInfo(cardAddr);
+        if (voTermManagerCard != null) {
+            return voTermManagerCard;
+        }
+
+        return null;
+    }
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鑾峰彇姘村崱鍒楄〃
+     * 
+     * @param vo 鏌ヨ鏉′欢
+     * @return 姘村崱鍒楄〃
+     */
+    public QueryResultVo<List<VoCards>> getCards(QoCards vo) {
+        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo);
+        Long itemTotal = seClientCardMapper.getCardsCount(params);
+
+        QueryResultVo<List<VoCards>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = vo.pageSize;
+        rsVo.pageCurr = vo.pageCurr;
+
+        if (itemTotal > 0) {
+            rsVo.calculateAndSet(itemTotal, params);
+            List<VoCards> list = seClientCardMapper.getCards(params);
+            rsVo.obj = list;
+        } else {
+            rsVo.obj = new ArrayList<>();
+            rsVo.itemTotal = 0L;
+        }
+
+        return rsVo;
+    }
+
+    /**
+     * 鑾峰彇宸叉寕澶辩殑姘村崱鍒楄〃
+     * 
+     * @param vo 鏌ヨ鏉′欢
+     * @return 宸叉寕澶辩殑姘村崱鍒楄〃
+     */
+    public QueryResultVo<List<VoCards>> getLostCards(QoLostCards vo) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("pageCurr", vo.pageCurr);
+        params.put("pageSize", vo.pageSize);
+        params.put("state", 2); // 鎸傚け鐘舵��
+
+        Long itemTotal = seClientCardMapper.getLostCardsCount(params);
+
+        QueryResultVo<List<VoCards>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = vo.pageSize;
+        rsVo.pageCurr = vo.pageCurr;
+
+        if (itemTotal > 0) {
+            rsVo.calculateAndSet(itemTotal, params);
+            List<VoCards> list = seClientCardMapper.getLostCards(params);
+            rsVo.obj = list;
+        } else {
+            rsVo.obj = new ArrayList<>();
+            rsVo.itemTotal = 0L;
+        }
+
+        return rsVo;
+    }
+
+    /**
+     * 鏍规嵁姘村崱缂栧彿鑾峰彇鍗′俊鎭�
+     * 
+     * @param cardNum 姘村崱缂栧彿
+     * @return 鍗′俊鎭�
+     */
+    public VoCardByClientNum getCardByCardNum(String cardNum) {
+        return seClientCardMapper.getCardByCardNum(cardNum);
+    }
+
+    /**
+     * 鍒涘缓绠$悊鍗�
+     * 
+     * @param dto 鍒涘缓绠$悊鍗TO
+     * @return 鍒涘缓缁撴灉
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> createManagementCard(CreateManagementCardDto dto) {
+        Map<String, Object> result = new HashMap<>();
+        result.put("success", false);
+
+        try {
+            // 妫�鏌ュ崱鍦板潃鏄惁宸插瓨鍦�
+            if (isCardAddrExists(dto.getCardAddr())) {
+                result.put("msg", "鍒涘缓澶辫触-姝ゅ崱鍦板潃宸插瓨鍦�");
+                return result;
+            }
+
+            // 鍙傝�僼ermActiveCard閫昏緫锛氱敓鎴愯鍗曞彿
+            String orderNo = generateOrderNo();
+
+            // 浣跨敤IDLongGenerator鐢熸垚鍞竴ID
+            Long id = idLongGenerator.generate();
+            Date createTime = new Date();
+
+            // 鏋勫缓绠$悊鍗″璞�
+            SeManagementCard managementCard = SeManagementCard.builder()
+                    .id(id)
+                    .protocol(dto.getProtocol())
+                    .cardAddr(dto.getCardAddr())
+                    .securityCode(dto.getSecurityCode())
+                    .cardType(dto.getCardType())
+                    .createTime(createTime)
+                    .orderNo(orderNo)
+                    .districtCode(dto.getDistrictCode())
+                    .projectNo(dto.getProjectNo() != null ? dto.getProjectNo() : this.projectNo)
+                    .ip(dto.getIp())
+                    .domain(dto.getDomain())
+                    .openClostTime(dto.getOpenClostTime())
+                    .remarks(dto.getRemarks())
+                    .state(ManagementCardStateENUM.UNWRITTEN.getCode()) // 榛樿鐘舵�佷负鏈啓鍗�
+                    .build();
+
+            // 鎻掑叆鏁版嵁搴�
+            int insertResult = seManagementCardMapper.insertSelective(managementCard);
+
+            if (insertResult > 0) {
+                result.put("success", true);
+                result.put("content", orderNo); // 杩斿洖璁㈠崟鍙�
+                result.put("msg", "璇锋眰鎴愬姛");
+            } else {
+                result.put("msg", "绠$悊鍗″垱寤哄け璐�-鏁版嵁搴撴彃鍏ュ紓甯�");
+            }
+
+        } catch (Exception e) {
+            log.error("鍒涘缓绠$悊鍗″紓甯�: {}", e.getMessage(), e);
+            result.put("msg", "绠$悊鍗″垱寤哄け璐�: " + e.getMessage());
+        }
+
+        return result;
+    }
+
+    /**
+     * 妫�鏌ュ崱鐗囧湴鍧�鏄惁宸插瓨鍦�
+     * 
+     * @param cardAddr 鍗$墖鍦板潃
+     * @return true-宸插瓨鍦紝false-涓嶅瓨鍦�
+     */
+    public boolean isCardAddrExists(String cardAddr) {
+        // 浣跨敤涓�娆℃煡璇㈡鏌ヤ袱涓〃涓槸鍚﹀瓨鍦ㄨ鍗″湴鍧�
+        // 1. 绠$悊鍗¤〃锛氭墍鏈夎褰曢兘妫�鏌�
+        // 2. 鍐滄埛姘村崱琛細鍙鏌ユ甯�(1)鍜屾寕澶�(3)鐘舵�佺殑璁板綍
+        Long totalCount = seClientCardMapper.checkCardAddrExists(cardAddr);
+        return totalCount != null && totalCount > 0;
+    }
+
+    /**
+     * 鏍规嵁鎸囧畾鏉′欢鑾峰彇浜ゆ槗璁板綍
+     *
+     * @param vo
+     * @return
+     */
+    public Map getTransactions(QoTransaction vo) {
+        DecimalFormat df = new DecimalFormat("0.00");
+        // 琛ラ綈鏌ヨ鏃堕棿
+        String operateTimeStart = vo.operateTimeStart;
+        String operateTimeStop = vo.operateTimeStop;
+        if (operateTimeStart != null) {
+            operateTimeStart = operateTimeStart + " 00:00:00";
+            vo.setOperateTimeStart(operateTimeStart);
+        }
+        if (operateTimeStop != null) {
+            operateTimeStop = operateTimeStop + " 23:59:59";
+            vo.setOperateTimeStop(operateTimeStop);
+        }
+
+        // 鐢熸垚鏌ヨ鍙傛暟
+        Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(vo);
+
+        // 鑾峰彇绗﹀悎鏉′欢鐨勮褰曟暟
+        Long itemTotal = Optional.ofNullable(seCardOperateMapper.getTransactionRecordCount(params)).orElse(0L);
+
+        QueryResultVo<List<VoTradeDetails>> rsVo = new QueryResultVo<>();
+        rsVo.pageSize = vo.pageSize;
+        rsVo.pageCurr = vo.pageCurr;
+        rsVo.calculateAndSet(itemTotal, params);
+
+        rsVo.obj = seCardOperateMapper.getTransactions(params);
+        List<VoTradeDetails> list = rsVo.obj;
+        if (list.size() == 0) {
+            return new HashMap();
+        }
+//鍏冭皨涓�鏈熼檰甯镐附闇�姹傛妸璧犻�侀噾棰濅笌鍏呭�奸噾棰濆垎寮�鏄剧ず
+        for (int i = list.size()-1; i >= 0 ; i--) {
+            Optional.ofNullable(list.get(i).getGift()).orElse(0d);
+            if (!list.get(i).getGift().equals(0d)){
+                Double gift1 = list.get(i).getGift();//璧犻�侀噾棰�
+                String districtTitle = list.get(i).getDistrictTitle();//鍦板潃
+                String clientNum = list.get(i).getClientNum();//鍐滄埛缂栧彿
+                String clientName = list.get(i).getClientName();//鍐滄埛濮撳悕
+                String phone = list.get(i).getPhone();//鎵嬫満鍙�
+                Date tradeTime = list.get(i).getTradeTime();//浜ゆ槗鏃堕棿
+                String orderNumber = list.get(i).getOrderNumber();//璁㈠崟缂栧彿
+                String cardNum = list.get(i).getCardNum();//鍗$紪鍙�
+                String idCard = list.get(i).getIdCard();//韬唤璇�
+                String cashierName = list.get(i).getCashierName();//鎿嶄綔浜�
+                Double money = list.get(i).getMoney();//浣欓
+                Double cardCost1 = list.get(i).getCardCost();//璐崱閲戦
+                Double tradeAmount = list.get(i).getTradeAmount();//浜ゆ槗閲戦
+                Double waterCost1 = list.get(i).getWaterCost();//璐按閲戦
+                Double refundAmount1 = list.get(i).getRefundAmount();//杩斿洖閲戦
+                String paymentName = list.get(i).getPaymentName();//鏀粯鏂瑰紡
+                String operateType = list.get(i).getOperateType();//涓氬姟绫诲瀷
+                String cardState = list.get(i).getCardState();//鍗$姸鎬�
+                Long villageId = list.get(i).getVillageId();//鏉慽d
+                Long cashierId = list.get(i).getCashierId();//鏀堕摱鍛榠d
+
+                list.get(i).setGift(0d);
+                list.get(i).setMoney(money-gift1);
+
+                VoTradeDetails voTradeDetail = new VoTradeDetails();
+                voTradeDetail.setDistrictTitle(districtTitle);//2
+                voTradeDetail.setClientNum(clientNum);//2
+                voTradeDetail.setClientName(clientName);//2
+                voTradeDetail.setPhone(phone);//2
+                voTradeDetail.setOperateType("璧犻��");//2
+                voTradeDetail.setTradeTime(tradeTime);//2
+                voTradeDetail.setWaterCost(0d);//2
+                voTradeDetail.setCardCost(0d);//2
+                voTradeDetail.setGift(gift1);//2
+                voTradeDetail.setTradeAmount(0d);//2
+                voTradeDetail.setRefundAmount(refundAmount1);//2
+                voTradeDetail.setMoney(money);//寰�2
+                voTradeDetail.setPaymentName("璧犻��");//2
+                voTradeDetail.setOrderNumber(orderNumber);//2
+                voTradeDetail.setCardNum(cardNum);//2
+                voTradeDetail.setIdCard(idCard);//2
+                voTradeDetail.setCashierName(cashierName);//2
+                voTradeDetail.setCashierId(cashierId);//2
+                voTradeDetail.setCardState(cardState);//2
+                voTradeDetail.setVillageId(villageId);//2
+
+                list.add(voTradeDetail);
+                itemTotal = itemTotal + 1;
+            }
+        }
+        list.sort(Comparator.comparing(VoTradeDetails::getTradeTime));
+        rsVo.obj = list;
+        rsVo.calculateAndSet(itemTotal, params);
+
+        // 閬嶅巻浜ゆ槗鏄庣粏璁板綍锛屾眹鎬昏喘姘撮噾棰濄�佽喘鍗¢噾棰�
+        Double totalWaterCost = 0.0;
+        Double totalCardCost = 0.0;
+        Double totalGift = 0.0;
+        Double totalRefund = 0.0;
+
+        JSONArray array = JSONArray.parseArray(JSON.toJSONString(list));
+        for (int i = 0; i < array.size(); i++) {
+            JSONObject job = array.getJSONObject(i);
+            Double waterCost = Optional.ofNullable(job.getDouble("waterCost")).orElse(0.0);
+            Double cardCost = Optional.ofNullable(job.getDouble("cardCost")).orElse(0.0);
+            Double gift = Optional.ofNullable(job.getDouble("gift")).orElse(0.0);
+            Double refundAmount = Optional.ofNullable(job.getDouble("refundAmount")).orElse(0.0);
+
+            totalWaterCost = totalWaterCost + waterCost;
+            totalCardCost = totalCardCost + cardCost;
+            totalGift = totalGift + gift;
+            totalRefund = totalRefund + refundAmount;
+        }
+
+        Map map_record = new HashMap();
+        map_record.put("list", rsVo);
+
+        Map map_result = new HashMap();
+        map_result.put("waterCost", df.format(totalWaterCost));
+        map_result.put("cardCost", df.format(totalCardCost));
+        map_result.put("gift", df.format(totalGift));
+        map_result.put("refund", df.format(totalRefund));
+
+        map_result.put("records", map_record);
+
+        return map_result;
+    }
+
+    /**
+     * 鏍规嵁姘村崱缂栧彿鎴栨按鍗″湴鍧�鑾峰彇鎿嶄綔璁板綍鍙婁綑棰�
+     * @param cardNum
+     * @return
+     */
+    public Map getOperateRecordsAndMoney(Long cardNum, String cardAddr) {
+
+        List<Map<String, Object>> list = Optional.ofNullable(seClientCardMapper.getOperateRecordsByCardNum(cardNum, cardAddr)).orElse(new ArrayList<>());
+        Float mondy = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum, cardAddr)).orElse(0f);
+        Float amount = Optional.ofNullable(seClientCardMapper.sumRechargeByCardNum(cardNum, cardAddr)).orElse(0f);
+
+        Map map = new HashMap();
+        map.put("mondy", mondy);
+        map.put("amount", amount);
+        map.put("list", list);
+        return map;
+    }
 }

--
Gitblit v1.8.0