liurunyu
7 天以前 ce1985a0fc44cb2a8ca5f70cb2361556712804d0
pipIrr-platform/pipIrr-web/pipIrr-web-terminal/src/main/java/com/dy/pipIrrTerminal/card/CardSv.java
@@ -6,6 +6,7 @@
import com.dy.pipIrrGlobal.daoSe.*;
import com.dy.pipIrrGlobal.pojoSe.SeCardOperate;
import com.dy.pipIrrGlobal.pojoSe.SeClientCard;
import com.dy.pipIrrGlobal.pojoSe.SeManagementCard;
import com.dy.pipIrrGlobal.pojoSe.SeRechargeHistory;
import com.dy.pipIrrGlobal.voSe.*;
import com.dy.pipIrrTerminal.card.dto.*;
@@ -13,6 +14,7 @@
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 lombok.extern.slf4j.Slf4j;
@@ -21,6 +23,7 @@
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.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -54,11 +57,18 @@
    @Autowired
    private SeManagerCardMapper seManagerCardMapper;
    @Autowired
    private SeManagementCardMapper seManagementCardMapper;
    @Autowired
    private IDLongGenerator idLongGenerator;
    @Value("${project.projectNo}")
    private Integer projectNo;
    /**
     * 根据水卡地址判断该卡是否可以开卡
     *
     * @param cardAddr
     * @return true:可以开卡
     */
@@ -80,6 +90,7 @@
    /**
     * 根据水卡编号判断该卡是否可以充值
     *
     * @param po
     * @return true:可以充值
     */
@@ -101,6 +112,7 @@
    /**
     * 根据水卡编号判断该卡是否可以挂失
     *
     * @param po
     * @return true:可以报失
     */
@@ -136,6 +148,7 @@
    /**
     * 根据水卡编号判断该卡是否可以解锁
     *
     * @param po
     * @return
     */
@@ -167,8 +180,10 @@
        map.put("content", card);
        return map;
    }
    /**
     * 根据水卡编号判断该卡是否可以补卡
     *
     * @param po
     * @return true:可以补卡
     */
@@ -212,6 +227,7 @@
    /**
     * 根据水卡编号判断该卡是否可以注销
     *
     * @param po
     * @return
     */
@@ -246,6 +262,7 @@
    /**
     * 根据水卡编号判断该卡是否可以补扣
     *
     * @param po
     * @return
     */
@@ -280,6 +297,7 @@
    /**
     * 根据水卡编号判断该卡是否可以返还
     *
     * @param po
     * @return
     */
@@ -314,6 +332,7 @@
    /**
     * 根据农户编号获取5级行政区划串areaCode,补卡过程中开新卡使用
     *
     * @param clientId
     * @return
     */
@@ -435,6 +454,7 @@
    /**
     * 开卡附加充值
     *
     * @param po
     * @param cardNum
     * @return
@@ -468,6 +488,7 @@
    /**
     * 激活或补卡
     *
     * @param po
     * @return
     */
@@ -525,6 +546,7 @@
    /**
     * 充值
     *
     * @param po
     * @return
     */
@@ -617,6 +639,7 @@
    /**
     * 补卡
     *
     * @param po
     * @return
     */
@@ -661,6 +684,7 @@
    /**
     * 挂失
     *
     * @param po
     * @return
     */
@@ -688,7 +712,8 @@
        seClientCard.setLossdtdt(new Date());
        seClientCard.setState(CardStateENUM.LOSS.getCode());
        seClientCard.setLastoper(LastOperateENUM.LOSS.getCode());
        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard)).orElse(0);
        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard))
                .orElse(0);
        if (rec_updateClientCard == 0) {
            map.put("msg", "挂失失败-农户卡修改异常");
            return map;
@@ -718,6 +743,7 @@
    /**
     * 解锁
     *
     * @param po
     * @return
     */
@@ -747,7 +773,8 @@
        seClientCard.setMoney(po.getMoney());
        seClientCard.setState(CardStateENUM.NORMAL.getCode());
        seClientCard.setLastoper(LastOperateENUM.UNLOCK.getCode());
        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard)).orElse(0);
        Integer rec_updateClientCard = Optional.ofNullable(seClientCardMapper.updateByPrimaryKeySelective(seClientCard))
                .orElse(0);
        if (rec_updateClientCard == 0) {
            map.put("msg", "解锁失败-农户卡修改异常");
            return map;
@@ -779,6 +806,7 @@
    /**
     * 销卡
     *
     * @param po
     * @return
     */
@@ -828,6 +856,7 @@
    /**
     * 补扣
     *
     * @param po
     * @return
     */
@@ -880,6 +909,7 @@
    /**
     * 返还
     *
     * @param po
     * @return
     */
@@ -906,7 +936,7 @@
        seCardOperate.setClientId(clientId);
        seCardOperate.setMoney(po.getBalance());
        seCardOperate.setRefundAmount(po.getSupplementMoney());
        seCardOperate.setOperateType(OperateTypeENUM.WRITE_BACK.getCode());
        seCardOperate.setOperateType(OperateTypeENUM.SUPPLEMENT.getCode());
        seCardOperate.setRemarks(po.getRemarks());
        seCardOperate.setOperator(po.getOperator());
        seCardOperate.setOperateDt(operateTime);
@@ -931,6 +961,7 @@
    /**
     * 操作回调
     *
     * @param po
     * @return
     */
@@ -944,13 +975,20 @@
        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 == 1) {
        if (operateType.equals(OperateTypeENUM.ACTIVE.getCode().intValue())) {
            /**
             * 开卡操作执行通知
             *  1.依据订单号将无效状态的操作记录改为有效
@@ -972,7 +1010,7 @@
                turnRechargeHistoryValidByOrderNumber(orderNumber);
                updateCard(cardId, orderNumber+"p");
            }
        } else if (operateType == 2) {
        } else if (operateType.equals(OperateTypeENUM.RECHARGE.getCode().intValue())) {
            /**
             * 充值操作执行通知
             * 1. 操作记录改为有效
@@ -982,7 +1020,7 @@
            turnOperateValidByOrderNumber(orderNumber + "p");
            turnRechargeHistoryValidByOrderNumber(orderNumber);
            updateCard(cardId, orderNumber+"p");
        }else if (operateType == 3) {
        } else if (operateType.equals(OperateTypeENUM.CANCEL.getCode().intValue())) {
            /**
             * 销卡操作执行通知
             * 1. 操作记录改为有效
@@ -996,7 +1034,7 @@
                return map;
            }
        } else if (operateType == 4) {
        } else if (operateType.equals(OperateTypeENUM.REISSUE.getCode().intValue())) {
            /**
             * 补卡操作执行通知
             * 1. 新水卡记录改为有效
@@ -1011,7 +1049,7 @@
                map.put("msg", "补卡回调失败");
                return map;
            }
        } else if (operateType == 5) {
        } else if (operateType.equals(OperateTypeENUM.REFUND.getCode().intValue())) {
            /**
             * 补扣操作执行通知
             * 1. 操作记录改为有效
@@ -1023,7 +1061,7 @@
                map.put("msg", "补扣回调失败");
                return map;
            }
        } else if (operateType == 6) {
        } else if (operateType.equals(OperateTypeENUM.SUPPLEMENT.getCode().intValue())) {
            /**
             * 返还操作执行通知
             * 1. 操作记录改为有效
@@ -1039,6 +1077,48 @@
        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;
            }
            // 更新管理卡状态为正常
            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;
    }
@@ -1084,6 +1164,7 @@
    /**
     * 如果补卡时退还了金额,清空挂失卡余额
     *
     * @param orderNumber
     */
    public Integer emptyCardBalance(String orderNumber) {
@@ -1097,6 +1178,7 @@
    /**
     * 修改注销水卡表的记录及余额(0)
     *
     * @param orderNumber
     * @return
     */
@@ -1114,6 +1196,7 @@
    /**
     * 修改补扣水卡表记录及余额
     *
     * @param cardId
     * @param orderNumber
     * @return
@@ -1135,6 +1218,7 @@
    /**
     * 修改返还水卡表记录及余额
     *
     * @param cardId
     * @param orderNumber
     * @return
@@ -1156,6 +1240,7 @@
    /**
     * 判断指定水卡是否为挂失状态且无补卡记录
     *
     * @param cardNum
     * @return
     */
@@ -1170,6 +1255,7 @@
    /**
     * 读取水卡信息
     *
     * @param cardAddr
     * @return
     */
@@ -1189,6 +1275,7 @@
    /**
     * 根据指定条件获取水卡列表
     *
     * @param vo 查询条件
     * @return 水卡列表
     */
@@ -1214,6 +1301,7 @@
    /**
     * 获取已挂失的水卡列表
     *
     * @param vo 查询条件
     * @return 已挂失的水卡列表
     */
@@ -1243,10 +1331,87 @@
    /**
     * 根据水卡编号获取卡信息
     *
     * @param cardNum 水卡编号
     * @return 卡信息
     */
    public VoCardByClientNum getCardByCardNum(String cardNum) {
        return seClientCardMapper.getCardByCardNum(cardNum);
    }
    /**
     * 创建管理卡
     *
     * @param dto 创建管理卡DTO
     * @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;
            }
            // 参考termActiveCard逻辑:生成订单号
            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;
    }
}