package com.dy.pipIrrTerminal.card;
|
|
import com.dy.common.webUtil.BaseResponse;
|
import com.dy.common.webUtil.BaseResponseUtils;
|
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.pojoSe.SeRechargeHistory;
|
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 com.dy.pipIrrTerminal.card.enums.RechargeTypeENUM;
|
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<Boolean> job = cardOperateSv.addRecharge(dtoRecharge);
|
BaseResponse<Boolean> 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;
|
}
|
|
public Map canRecharge(DtoRecharge po) {
|
Map map = new HashMap<>();
|
map.put("success", false);
|
map.put("content", null);
|
|
String stateName = Optional.ofNullable(seClientCardMapper.getCardStateByCardNum(po.getCardNum())).orElse("");
|
// 单独充值时卡片必须为正常
|
if((po.getRechargeType() == RechargeTypeENUM.RECHARGE.getCode()) && !stateName.equals("正常")) {
|
map.put("msg", stateName + ", " + "水卡状态不支持当前操作");
|
return map;
|
}
|
|
map.put("success", true);
|
return map;
|
}
|
|
public Map addRecharge(DtoRecharge po) {
|
Map map = new HashMap<>();
|
map.put("success", false);
|
map.put("content", null);
|
|
/**
|
* cardId 水卡编号(依据水卡编号获取)
|
* clientId 农户编号(依据水卡编号获取)
|
* cardNum 水卡编号
|
* money 卡片余额
|
* amount 充值金额
|
* gift 赠送金额
|
* afterRecharge 充值后余额
|
* paymentId 支付方式编号
|
* price 水价
|
* remarks 备注
|
* operator 操作人编号
|
* rechargeTime 充值时间
|
*/
|
|
//Long cardId = 0L;
|
//Long clientId = 0L;
|
//Long cardNum = po.getCardNum();
|
//Float money = po.getMoney();
|
//Float amount = po.getAmount();
|
//Float gift = po.getGift();
|
//Float afterRecharge = money + amount + gift;
|
//Long paymentId = po.getPaymentId();
|
//Float price = po.getPrice();
|
//String remarks = po.getRemarks();
|
//Long operator = po.getOperator();
|
//Date rechargeTime = new Date();
|
|
Map map_canRecharge = canRecharge(po);
|
if(map_canRecharge.get("success").equals(false)) {
|
map.put("msg", map_canRecharge.get("msg").toString());
|
return map;
|
}
|
|
/**
|
* 依据水卡编号获取水卡表主键及农户编号
|
*/
|
Map map_cardAndClient = seClientCardMapper.getCardIdAndClientNum(po.getCardNum());
|
if (map_cardAndClient == null || map_cardAndClient.size() <= 0) {
|
map.put("msg", "卡号错误,该卡不存在");
|
return map;
|
}
|
Long cardId = Long.parseLong(map_cardAndClient.get("cardId").toString());
|
Long clientId = Long.parseLong(map_cardAndClient.get("clientId").toString());
|
|
/**
|
* 添加水卡充值操作记录
|
*/
|
SeCardOperate seCardOperate = new SeCardOperate();
|
seCardOperate.setCardId(cardId);
|
seCardOperate.setClientId(clientId);
|
seCardOperate.setMoney(po.getMoney());
|
seCardOperate.setTradeAmount(po.getAmount());
|
seCardOperate.setGift(po.getGift());
|
seCardOperate.setOperateType(OperateTypeENUM.RECHARGE.getCode());
|
seCardOperate.setPaymentId(po.getPaymentId());
|
seCardOperate.setPrice(po.getPrice());
|
seCardOperate.setRemarks(po.getRemarks());
|
seCardOperate.setOperator(po.getOperator());
|
seCardOperate.setOperateDt(new Date());
|
seCardOperate.setOperateValid((byte) 1);
|
seCardOperateMapper.insert(seCardOperate);
|
Long rec = Optional.ofNullable(seCardOperate.getId()).orElse(0L);
|
if (rec == 0) {
|
//return BaseResponseUtils.buildErrorMsg("充值失败-充值记录写入异常");
|
}
|
|
/**
|
* 添加充值历史记录
|
*/
|
SeRechargeHistory seRechargeHistory = new SeRechargeHistory();
|
seRechargeHistory.setCardid(cardId);
|
seRechargeHistory.setClientid(clientId);
|
seRechargeHistory.setMoney(po.getMoney());
|
seRechargeHistory.setAmount(po.getAmount());
|
seRechargeHistory.setGift(po.getGift());
|
Float afterRecharge = po.getMoney() + po.getAmount() + po.getGift();
|
seRechargeHistory.setAfterrecharge(afterRecharge);
|
seRechargeHistory.setPaymentid(po.getPaymentId());
|
seRechargeHistory.setPrice(po.getPrice());
|
seRechargeHistory.setRemarks(po.getRemarks());
|
seRechargeHistory.setOperator(po.getOperator());
|
seRechargeHistory.setOperatedt(new Date());
|
seRechargeHistory.setOperateValid((byte) 1);
|
//seRechargeHistoryMapper.insert(seRechargeHistory);
|
Long rec_seRechargeHistory = Optional.ofNullable(seRechargeHistory.getId()).orElse(0L);
|
//if (rec_seRechargeHistory == 0) {
|
// return BaseResponseUtils.buildErrorMsg("充值失败-充值历史记录写入异常");
|
//}
|
|
//Map map_response = new HashMap();
|
//map_response.put("projectNo", String.format("%02x", projectNo));
|
//map_response.put("orderNumber", rec);
|
//map_response.put("cardNum", cardNum);
|
//return BaseResponseUtils.buildSuccess(map_response);
|
|
return map;
|
}
|
|
}
|