From 4a50bcf8eff9b9bf0c50664600077bb92bd7cdc2 Mon Sep 17 00:00:00 2001 From: zhubaomin <zhubaomin> Date: 星期四, 12 六月 2025 17:43:14 +0800 Subject: [PATCH] 补扣接口、返还接口、补扣及返还的回调 --- pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplement.java | 42 ++++++ pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java | 243 ++++++++++++++++++++++++++++++++++ pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml | 13 + pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java | 7 + pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java | 57 +++++++ pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplementSimple.java | 36 +++++ 6 files changed, 389 insertions(+), 9 deletions(-) diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java index ac754fc..ab50970 100644 --- a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java +++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java @@ -275,4 +275,11 @@ * @return */ Date getOperateTime(String orderNumber); + + /** + * 鍏呭�兼満浣跨敤鏍规嵁璁㈠崟鍙疯幏鍙栨搷浣滆褰� + * @param orderNumber + * @return + */ + VoRepaySupplementSimple getCardOperateByOrderNumber(String orderNumber); } \ No newline at end of file diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplement.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplement.java new file mode 100644 index 0000000..338751c --- /dev/null +++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplement.java @@ -0,0 +1,42 @@ +package com.dy.pipIrrGlobal.voSe; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.Data; + +import java.util.Date; + +/** + * @author ZhuBaoMin + * @date 2025-06-12 13:41 + * @LastEditTime 2025-06-12 13:41 + * @Description 鍏呭�兼満鐢ㄨ繑鍥炶鍥惧璞★紙琛ユ墸銆佽繑杩橈級 + */ + +@Data +@JsonPropertyOrder({"balance", "waterPrice", "time", "orderNo"}) +public class VoRepaySupplement { + public static final long serialVersionUID = 202506121348001L; + + /** + * 琛ユ墸/杩旇繕鍚庝綑棰� + */ + private Float balance; + + /** + * 姘翠环 + */ + private Double waterPrice; + + /** + * 鎿嶄綔鏃堕棿 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") + private Date time; + + /** + * 璁㈠崟鍙� + */ + private String orderNo; + +} diff --git a/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplementSimple.java b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplementSimple.java new file mode 100644 index 0000000..cde9455 --- /dev/null +++ b/pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplementSimple.java @@ -0,0 +1,36 @@ +package com.dy.pipIrrGlobal.voSe; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import lombok.Data; + +import java.util.Date; + +/** + * @author ZhuBaoMin + * @date 2025-06-12 16:55 + * @LastEditTime 2025-06-12 16:55 + * @Description 姘村崱鎿嶄綔璁板綍浼犺緭瀵硅薄锛岃ˉ鎵e強杩旇繕浣跨敤 + */ + +@Data +@JsonPropertyOrder({"money", "refundAmount", "operateTime"}) +public class VoRepaySupplementSimple { + public static final long serialVersionUID = 202506121646001L; + + /** + * 鎿嶄綔鍓嶄綑棰� + */ + private Float money; + + /** + * 琛ユ墸閲戦鎴栬繑杩橀噾棰� + */ + private Float refundAmount; + + /** + * 鎿嶄綔鏃堕棿 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8") + private Date operateTime; +} diff --git a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml index 5f0e848..73d8b05 100644 --- a/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml +++ b/pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml @@ -1129,4 +1129,17 @@ ORDER BY operate_dt DESC LIMIT 1 </select> + + <!--鍏呭�兼満浣跨敤鏍规嵁璁㈠崟鍙疯幏鍙栨搷浣滆褰�--> + <select id="getCardOperateByOrderNumber" resultType="com.dy.pipIrrGlobal.voSe.VoRepaySupplementSimple"> + SELECT + money, + refund_amount AS refundAmount, + operate_dt AS operateTime + FROM se_card_operate + WHERE order_no = #{orderNumber} + ORDER BY operate_dt DESC + LIMIT 1 + + </select> </mapper> \ No newline at end of file diff --git a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java index ce0f2b4..3eef618 100644 --- a/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java +++ b/pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java @@ -4,10 +4,7 @@ import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.common.webUtil.QueryResultVo; -import com.dy.pipIrrGlobal.voSe.VoTermActiveCard; -import com.dy.pipIrrGlobal.voSe.VoTermCard; -import com.dy.pipIrrGlobal.voSe.VoTermClient; -import com.dy.pipIrrGlobal.voSe.VoTermCommon; +import com.dy.pipIrrGlobal.voSe.*; import com.dy.pipIrrTerminal.card.dto.*; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -167,6 +164,58 @@ } /** + * 琛ユ墸 + * @param po + * @param bindingResult + * @return + */ + @PostMapping(path = "termRepay", consumes = MediaType.APPLICATION_JSON_VALUE) + @SsoAop() + public BaseResponse<VoRepaySupplement> termRepay(@RequestBody @Valid DtoRepaySupplement po, BindingResult bindingResult) { + if (bindingResult != null && bindingResult.hasErrors()) { + return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); + } + + if(po.getRepayMorny() == null || po.getRepayMorny() <= 0) { + return BaseResponseUtils.buildErrorMsg("琛ユ墸閲戦涓嶈兘涓虹┖涓旈渶澶т簬0"); + } + + if(po.getRepayMorny() > po.getBalance()) { + return BaseResponseUtils.buildErrorMsg("琛ユ墸閲戦涓嶈兘澶т簬琛ユ墸鍓嶄綑棰�"); + } + + Map map_result = cardSv.repay(po); + if (map_result.get("success").equals(false)) { + return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString()); + } + return BaseResponseUtils.buildSuccess(map_result.get("content")); + } + + /** + * 杩旇繕 + * @param po + * @param bindingResult + * @return + */ + @PostMapping(path = "supplement", consumes = MediaType.APPLICATION_JSON_VALUE) + @SsoAop() + public BaseResponse<VoRepaySupplement> supplement(@RequestBody @Valid DtoRepaySupplement po, BindingResult bindingResult) { + if (bindingResult != null && bindingResult.hasErrors()) { + return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); + } + + if(po.getSupplementMoney() == null || po.getSupplementMoney() <= 0) { + return BaseResponseUtils.buildErrorMsg("杩旇繕閲戦涓嶈兘涓虹┖涓旈渶澶т簬0"); + } + + Map map_result = cardSv.supplement(po); + if (map_result.get("success").equals(false)) { + return BaseResponseUtils.buildErrorMsg(map_result.get("msg").toString()); + } + return BaseResponseUtils.buildSuccess(map_result.get("content")); + } + + /** * 鎿嶄綔鎵ц鍥炶皟 * * @param po 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 d915722..bb6f4c4 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 @@ -6,10 +6,7 @@ import com.dy.pipIrrGlobal.pojoSe.SeCardOperate; import com.dy.pipIrrGlobal.pojoSe.SeClientCard; import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory; -import com.dy.pipIrrGlobal.voSe.VoAfterRecharge; -import com.dy.pipIrrGlobal.voSe.VoTermActiveCard; -import com.dy.pipIrrGlobal.voSe.VoTermCard; -import com.dy.pipIrrGlobal.voSe.VoTermCommon; +import com.dy.pipIrrGlobal.voSe.*; import com.dy.pipIrrTerminal.card.dto.*; import com.dy.pipIrrTerminal.card.enums.CardStateENUM; import com.dy.pipIrrTerminal.card.enums.LastOperateENUM; @@ -215,6 +212,74 @@ * @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); @@ -757,6 +822,109 @@ } /** + * 琛ユ墸 + * @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.WRITE_BACK.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 @@ -838,7 +1006,30 @@ map.put("msg", "琛ュ崱鍥炶皟澶辫触"); return map; } - + } else if (operateType == 5) { + /** + * 琛ユ墸鎿嶄綔鎵ц閫氱煡 + * 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 == 6) { + /** + * 杩旇繕鎿嶄綔鎵ц閫氱煡 + * 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); @@ -917,6 +1108,48 @@ } /** + * 淇敼琛ユ墸姘村崱琛ㄨ褰曞強浣欓 + * @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 -- Gitblit v1.8.0