pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java
@@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; import java.util.Map; @@ -260,4 +261,18 @@ * @return */ SeCardOperate getCardOperate(@Param("operateType") Integer operateType, @Param("cardId") Long cardId); /** * 充值机用根据订单号获取非交易金额 * @param orderNumber * @return */ Float getNoTradeAmount(String orderNumber); /** * 充值机用根据订单号获取操作时间 * @param orderNumber * @return */ Date getOperateTime(String orderNumber); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java
@@ -258,4 +258,10 @@ */ Long getOriginalCardIdByCardId(@Param("cardId") Long cardId); /** * 充值机用根据补卡的订单号将挂失水卡余额置零 * @param orderNumber * @return */ Integer emptyCardBalance(@Param("orderNumber")String orderNumber); } pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermCommon.java
File was renamed from pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermRecharge.java @@ -12,12 +12,12 @@ * @author ZhuBaoMin * @date 2025-05-08 15:59 * @LastEditTime 2025-05-08 15:59 * @Description 充值机充值返回视图对象 * @Description 充值机通用返回视图对象(充值、销卡) */ @Data @JsonPropertyOrder({"projectNo", "cardNum", "orderNo"}) public class VoTermRecharge { public class VoTermCommon { public static final long serialVersionUID = 202505081559001L; private Integer projectNo; pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
@@ -1111,4 +1111,22 @@ SELECT * FROM se_card_operate WHERE operate_type = #{operateType} AND card_id = #{cardId} ORDER BY operate_dt DESC LIMIT 1 </select> <!--充值机用根据订单号获取非交易金额--> <select id="getNoTradeAmount" resultType="java.lang.Float"> SELECT IFNULL(SUM(trade_amount), 0) AS noTradeAmount FROM se_card_operate WHERE order_no = #{orderNumber} </select> <!--充值机用根据订单号获取操作时间--> <select id="getOperateTime" resultType="java.util.Date"> SELECT operate_dt AS operateTime FROM se_card_operate WHERE order_no = #{orderNumber} ORDER BY operate_dt DESC LIMIT 1 </select> </mapper> pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -781,4 +781,11 @@ <select id="getOriginalCardIdByCardId" resultType="java.lang.Long"> SELECT original_card_id AS originalCardId FROM se_client_card WHERE id = #{cardId}; </select> <!--充值机用根据补卡的订单号将挂失水卡余额置零--> <update id="emptyCardBalance"> UPDATE se_client_card SET money = 0 WHERE id = (SELECT original_card_id FROM se_client_card WHERE id = (SELECT card_id FROM se_card_operate WHERE order_no = #{orderNumber})) </update> </mapper> pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java
@@ -4,7 +4,7 @@ import com.dy.common.webUtil.BaseResponse; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.voSe.VoTermActiveCard; import com.dy.pipIrrGlobal.voSe.VoTermRecharge; import com.dy.pipIrrGlobal.voSe.VoTermCommon; import com.dy.pipIrrTerminal.card.dto.*; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -62,7 +62,7 @@ */ @PostMapping(path = "termRecharge", consumes = MediaType.APPLICATION_JSON_VALUE) @SsoAop() public BaseResponse<VoTermRecharge> termRecharge(@RequestBody @Valid DtoRecharge po, BindingResult bindingResult) { public BaseResponse<VoTermCommon> termRecharge(@RequestBody @Valid DtoRecharge po, BindingResult bindingResult) { if (bindingResult != null && bindingResult.hasErrors()) { return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } @@ -104,7 +104,7 @@ */ @PostMapping(path = "termReissue", consumes = MediaType.APPLICATION_JSON_VALUE) @SsoAop() public BaseResponse<VoTermRecharge> termReissue(@RequestBody @Valid DtoReissue po, BindingResult bindingResult) { public BaseResponse<VoTermCommon> termReissue(@RequestBody @Valid DtoReissue po, BindingResult bindingResult) { if (bindingResult != null && bindingResult.hasErrors()) { return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } @@ -118,6 +118,27 @@ } /** * 销卡 * @param po * @param bindingResult * @return */ @PostMapping(path = "termCancel", consumes = MediaType.APPLICATION_JSON_VALUE) @SsoAop() public BaseResponse<VoTermCommon> termCancel(@RequestBody @Valid DtoCancel po, BindingResult bindingResult) { if (bindingResult != null && bindingResult.hasErrors()) { return BaseResponseUtils.buildErrorMsg(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage()); } Map map_result = cardSv.cancel(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 pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
@@ -1,6 +1,5 @@ package com.dy.pipIrrTerminal.card; import com.dy.common.webUtil.BaseResponseUtils; import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper; import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper; @@ -11,7 +10,7 @@ import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory; import com.dy.pipIrrGlobal.voSe.VoAfterRecharge; import com.dy.pipIrrGlobal.voSe.VoTermActiveCard; import com.dy.pipIrrGlobal.voSe.VoTermRecharge; import com.dy.pipIrrGlobal.voSe.VoTermCommon; import com.dy.pipIrrTerminal.card.dto.*; import com.dy.pipIrrTerminal.card.enums.CardStateENUM; import com.dy.pipIrrTerminal.card.enums.LastOperateENUM; @@ -23,7 +22,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -170,6 +168,40 @@ 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("正常")) { 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); @@ -467,7 +499,7 @@ return map; } VoTermRecharge voTermRecharge = new VoTermRecharge(); VoTermCommon voTermRecharge = new VoTermCommon(); voTermRecharge.setProjectNo(projectNo); voTermRecharge.setCardNum(po.getCardNum()); voTermRecharge.setOrderNo(orderNo); @@ -522,6 +554,11 @@ return map; } /** * 挂失 * @param po * @return */ @Transactional(rollbackFor = Exception.class) public Map reportLoss(DtoLoss po) { Map map = new HashMap<>(); @@ -575,6 +612,55 @@ } /** * 销卡 * @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 @@ -617,6 +703,46 @@ turnRechargeHistoryValidByOrderNumber(orderNumber); updateCard(cardId, orderNumber+"p"); } } else if (operateType == 2) { /** * 充值操作执行通知 * 1. 操作记录改为有效 * 2. 充值历史记录改为有效 * 3. 修改水卡表的操作信息 */ turnOperateValidByOrderNumber(orderNumber + "p"); turnRechargeHistoryValidByOrderNumber(orderNumber); updateCard(cardId, orderNumber+"p"); }else if (operateType == 3) { /** * 销卡操作执行通知 * 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 == 4) { /** * 补卡操作执行通知 * 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; } } map.put("success", true); @@ -663,4 +789,34 @@ } 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); } } pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoCancel.java
New file @@ -0,0 +1,50 @@ package com.dy.pipIrrTerminal.card.dto; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; import lombok.*; /** * @author ZhuBaoMin * @date 2025-06-10 10:33 * @LastEditTime 2025-06-10 10:33 * @Description 销卡传输对象 */ @Data @Builder @ToString @NoArgsConstructor @AllArgsConstructor public class DtoCancel { public static final long serialVersionUID = 202506101034001L; /** * 水卡编号 */ @NotNull(message = "水卡编号不能为空") private Long cardNum; /** * 退款金额 */ private Float refund; /** * 退款方式; */ private Long refundType; /** * 备注信息 */ private String remarks; /** * 操作人编号 */ @NotNull(message = "操作人编号不能为空") private Long operator; }