liurunyu
3 天以前 2507f1d9d720ffcc1a1ef1eed31a88db976c9abd
Merge branch 'master' of http://8.140.179.55:20000/r/pipIrr-SV
6个文件已修改
3个文件已添加
462 ■■■■■ 已修改文件
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/daoSe/SeCardOperateMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplement.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplementSimple.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeManagerCardMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardCtrl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRepaySupplement.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplement.java
New file
@@ -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;
}
pipIrr-platform/pipIrr-global/src/main/java/com/dy/pipIrrGlobal/voSe/VoRepaySupplementSimple.java
New file
@@ -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 水卡操作记录传输对象,补扣及返还使用
 */
@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;
}
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeCardOperateMapper.xml
@@ -1129,4 +1129,18 @@
    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>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeClientCardMapper.xml
@@ -804,7 +804,7 @@
        card.protocol AS cardAgreement
    FROM se_client_card card
        INNER JOIN se_client cli ON cli.id = card.clientId
    WHERE card.cardAddr = #{cardAddr}
    WHERE card.cardAddr = #{cardAddr} AND card.state != 4
    LIMIT 1
  </select>
</mapper>
pipIrr-platform/pipIrr-global/src/main/resources/mapper/SeManagerCardMapper.xml
@@ -158,7 +158,7 @@
      NULL AS lastRechargeTime,
      card.protocol AS cardcardAgreement
    FROM se_manager_card card
    WHERE card.card_addr = #{cardAddr}
    WHERE card.card_addr = #{cardAddr} AND card.state != 4
      LIMIT 1
  </select>
</mapper>
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
@@ -196,7 +245,11 @@
    @SsoAop()
    public BaseResponse<VoTermCard> readCard(@RequestParam String cardAddr){
        try {
            return BaseResponseUtils.buildSuccess(cardSv.readCard(cardAddr));
            VoTermCard voTermCard = cardSv.readCard(cardAddr);
            if(voTermCard == null) {
                return BaseResponseUtils.buildNonExist();
            }
            return BaseResponseUtils.buildSuccess(voTermCard);
        } catch (Exception e) {
            log.error("查询农户异常", e);
            return BaseResponseUtils.buildException(e.getMessage()) ;
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("正常")) {
            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("正常")) {
            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
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/dto/DtoRepaySupplement.java
New file
@@ -0,0 +1,53 @@
package com.dy.pipIrrTerminal.card.dto;
import jakarta.validation.constraints.NotNull;
import lombok.*;
/**
 * @author ZhuBaoMin
 * @date 2025-06-11 13:46
 * @LastEditTime 2025-06-11 13:46
 * @Description 补扣/返还传传输对象
 */
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class DtoRepaySupplement {
    public static final long serialVersionUID = 202506111347001L;
    /**
     * 水卡编号
     */
    @NotNull(message = "水卡编号不能为空")
    private Long cardNum;
    /**
     * 补扣金额,补扣接口使用,代码中判断是否为空
     */
    private Float repayMorny;
    /**
     * 返还金额,返还接口使用,代码中判断是否为空
     */
    private Float supplementMoney;
    /**
     * 补扣前余额
     */
    @NotNull(message = "补扣前余额不能为空")
    private Float balance;
    /**
     * 备注信息
     */
    private String remarks;
    /**
     * 操作人编号
     */
    @NotNull(message = "操作人不能为空")
    private Long operator;
}