package com.dy.pipIrrTerminal.card; import com.dy.common.webUtil.BaseResponse; import com.dy.pipIrrGlobal.daoPr.PrWaterPriceMapper; import com.dy.pipIrrGlobal.daoSe.SeCardOperateMapper; import com.dy.pipIrrGlobal.daoSe.SeClientCardMapper; import com.dy.pipIrrGlobal.daoSe.SeClientMapper; import com.dy.pipIrrGlobal.pojoSe.SeCardOperate; import com.dy.pipIrrGlobal.pojoSe.SeClientCard; import com.dy.pipIrrGlobal.voSe.VoTermRecharge; import com.dy.pipIrrTerminal.card.dto.ActiveCard; import com.dy.pipIrrTerminal.card.dto.DtoRecharge; import com.dy.pipIrrTerminal.card.enums.CardStateENUM; import com.dy.pipIrrTerminal.card.enums.LastOperateENUM; import com.dy.pipIrrTerminal.card.enums.OperateTypeENUM; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; /** * @author ZhuBaoMin * @date 2025-05-08 10:15 * @LastEditTime 2025-05-08 10:15 * @Description */ @Slf4j @Service public class CardSv { @Autowired private SeCardOperateMapper seCardOperateMapper; @Autowired private SeClientCardMapper seClientCardMapper; @Autowired private SeClientMapper seClientMapper; @Autowired private PrWaterPriceMapper prWaterPriceMapper; @Value("${project.projectNo}") private Integer projectNo; /** * 根据水卡地址判断该卡是否可以开卡 * @param cardAddr * @return true:可以开卡 */ public Boolean canActiveCard(String cardAddr) { // 指定水卡地址的水卡数量,无效卡片排除在外 Long cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddr(cardAddr)).orElse(0L); if (cardCount == 0) { return true; } // 指定水卡地址且正常状态或挂失状态的水卡数量 cardCount = Optional.ofNullable(seClientCardMapper.getCountByCardAddrAndState(cardAddr)).orElse(0L); if (cardCount == 0) { return true; } return false; } /** * 根据农户编号获取5级行政区划串areaCode,补卡过程中开新卡使用 * @param clientId * @return */ public Long getAreaCodeById(Long clientId) { return seClientMapper.getAreaCodeById(clientId); } public String getCardNumOfMax(String areaCode) { return seClientCardMapper.getCardNumOfMax(areaCode); } public Map generateCardNum(Long clientId) { Map map_cardNum = new HashMap<>(); map_cardNum.put("success", false); map_cardNum.put("content", null); // 获取5级行政区划串areaCode Long areaCodeL = getAreaCodeById(clientId); if (areaCodeL == null) { map_cardNum.put("msg", "该农户行政区划异常"); return map_cardNum; } String areaCode = String.valueOf(areaCodeL); String cardNum = Optional.ofNullable(getCardNumOfMax(areaCode)).orElse(""); if (cardNum != null && cardNum.trim().length() > 0) { Integer number = Integer.parseInt(cardNum.substring(12)); number = number + 1; if (number > 65535) { map_cardNum.put("msg", "水卡编号已满"); return map_cardNum; } cardNum = cardNum.substring(0, 12) + String.format("%05d", number); } else { cardNum = areaCode + "00001"; } map_cardNum.put("success", true); map_cardNum.put("content", cardNum); return map_cardNum; } public String generateOrderNo() { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyMMddHHmmss"); LocalDateTime dateTime = LocalDateTime.now(); Random random = new Random(); String CHARACTERS = "0123456789"; StringBuilder sb = new StringBuilder(4); for (int i = 0; i < 4; i++) { int index = random.nextInt(CHARACTERS.length()); sb.append(CHARACTERS.charAt(index)); } return dtf.format(dateTime) + sb.toString(); } public Map addCardAndOperate(ActiveCard po, Long cardNum, String orderNo) { Map map = new HashMap<>(); map.put("success", false); map.put("content", null); // amount:充值接口为输入参数,补卡接口为原卡退还金额 SeClientCard seClientCard = new SeClientCard(); seClientCard.setProtocol(po.getProtocol()); seClientCard.setCardaddr(po.getCardAddr()); seClientCard.setCardnum(String.valueOf(cardNum)); seClientCard.setClientid(po.getClientId()); seClientCard.setMoney(po.getAmount()); seClientCard.setState(CardStateENUM.INVALID.getCode()); if (po.getOriginalCardId() != null) { // 补卡 seClientCard.setOriginalCardId(po.getOriginalCardId()); seClientCard.setLastoper(LastOperateENUM.REPLACE.getCode()); seClientCard.setReplacedt(new Date()); } else { // 开新卡 seClientCard.setLastoper(LastOperateENUM.ACTIVE.getCode()); seClientCard.setCreatedt(new Date()); } seClientCardMapper.insert(seClientCard); Long cardId = Optional.ofNullable(seClientCard.getId()).orElse(0L); if (cardId == 0) { map.put("msg", "开卡失败-农户卡写入异常"); return map; } SeCardOperate seCardOperate = new SeCardOperate(); seCardOperate.setCardId(cardId); seCardOperate.setClientId(po.getClientId()); seCardOperate.setMoney(0f); seCardOperate.setCardCost(po.getCardCost()); seCardOperate.setPaymentId(po.getPaymentId()); if (po.getOriginalCardId() != null) { // 补卡 seCardOperate.setOperateType(OperateTypeENUM.REISSUE.getCode()); seCardOperate.setNoTradeAmount(po.getAmount()); } else { // 开新卡 seCardOperate.setOperateType(OperateTypeENUM.ACTIVE.getCode()); } seCardOperate.setRemarks(po.getRemarks()); seCardOperate.setOperator(po.getOperator()); seCardOperate.setOperateDt(new Date()); seCardOperate.setOrderNo(orderNo); seCardOperate.setOperateValid((byte) 1); seCardOperateMapper.insert(seCardOperate); Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L); if (rec == 0) { map.put("msg", "开卡失败-开卡记录写入异常"); return map; } map.put("success", true); return map; } public Map plusRecharge(ActiveCard po, Long cardNum) { Map map = new HashMap<>(); map.put("success", false); map.put("content", null); DtoRecharge dtoRecharge = new DtoRecharge(); dtoRecharge.setCardNum(cardNum); dtoRecharge.setAmount(po.getAmount()); dtoRecharge.setPaymentId(po.getPaymentId()); dtoRecharge.setRemarks(po.getRemarks()); dtoRecharge.setOperator(po.getOperator()); dtoRecharge.setMoney(0f); dtoRecharge.setGift(0f); dtoRecharge.setPrice(0f); //BaseResponse job = cardOperateSv.addRecharge(dtoRecharge); BaseResponse job = null; if (!job.getCode().equals("0001")) { map.put("msg", "开卡失败-充值异常"); return map; } map.put("success", true); return map; } public Map activeOrReissueTermCard(ActiveCard po) { Map map = new HashMap<>(); map.put("success", false); map.put("content", null); Float amount = po.getAmount(); Long originalCardId = po.getOriginalCardId(); if (!canActiveCard(po.getCardAddr())) { map.put("msg", "开卡失败-此卡已存在"); return map; } Map map_cardNum = generateCardNum(po.getClientId()); if(map_cardNum.get("success").equals(false)) { map.put("msg", map_cardNum.get("msg").toString()); return map; } Long cardNum = Long.parseLong(map_cardNum.get("content").toString()); String orderNo = generateOrderNo(); Map map_addCardAndOperate = addCardAndOperate(po, cardNum, orderNo); if(map_addCardAndOperate.get("success").equals(false)) { map.put("msg", map_addCardAndOperate.get("msg").toString()); return map; } if (amount != null && amount > 0 && originalCardId == null) { Map map_plusRecharge = plusRecharge(po, cardNum); if(map_plusRecharge.get("success").equals(false)) { map.put("msg", map_plusRecharge.get("msg").toString()); return map; } } Float balance = Optional.ofNullable(seClientCardMapper.getMoneyByCardNum(cardNum)).orElse(0f); Double waterPrice = prWaterPriceMapper.getPrice(); VoTermRecharge voTermRecharge = new VoTermRecharge(); voTermRecharge.setProjectNo(projectNo); voTermRecharge.setCardNum(cardNum); voTermRecharge.setBalance(balance); voTermRecharge.setWaterPrice(waterPrice); voTermRecharge.setTime(new Date()); voTermRecharge.setOrderNo(orderNo); map.put("success", true); map.put("msg", "操作成功"); map.put("content", voTermRecharge); return map; } }