zhubaomin
2 天以前 5a9dbde4116479e4823be8dbf5cb4f57f5f85efe
销卡、充值回调、销卡回调
1 文件已重命名
6个文件已修改
1个文件已添加
291 ■■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeClientCardMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoTermCommon.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoCancel.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}