package com.stylefeng.guns.modular.system.service.impl;
|
|
import com.baomidou.mybatisplus.plugins.Page;
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
import com.stylefeng.guns.core.common.constant.travelcard.TravelCardStatusEnum;
|
import com.stylefeng.guns.modular.system.dao.TravelCardMapper;
|
import com.stylefeng.guns.modular.system.model.TravelCard;
|
import com.stylefeng.guns.modular.system.service.ITravelCardService;
|
import lombok.AllArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.security.SecureRandom;
|
import java.util.*;
|
|
/**
|
* <p>
|
* 出行卡,服务实现类
|
* </p>
|
* @author Lux
|
* @version 1.0.0
|
* @since 2026/6/17 18:21
|
*/
|
@Slf4j
|
@Service
|
@AllArgsConstructor
|
public class TravelCardServiceImpl extends ServiceImpl<TravelCardMapper, TravelCard> implements ITravelCardService {
|
|
private static final char[] PASSWORD_CHARS = {'A','B','C','D','E','F','G','H', 'J','K','M','N','P','Q','R','S', 'T','U','V','W','X','Y','Z'};
|
private static final SecureRandom RANDOM = new SecureRandom();
|
|
/**
|
* 生成出行卡
|
*
|
* @param packageId 卡包ID
|
* @param amount 卡金额
|
* @param total 卡数量
|
*/
|
public boolean generateTravelCard(Integer packageId, BigDecimal amount, Integer total) {
|
if(Objects.isNull(packageId)) {
|
log.error("生成出行卡-卡包ID为空,则不执行生成逻辑!");
|
return false;
|
}
|
if(Objects.isNull(total) || Objects.isNull(amount)) {
|
log.error("生成出行卡-金额或数量为空,则不执行生成逻辑!");
|
return false;
|
}
|
// 1、查询当前最大卡号
|
String maxCardNo = this.baseMapper.getMaxCardNo();
|
int startNo;
|
// 第一批卡从011001开始
|
if (StringUtils.isBlank(maxCardNo)) {
|
startNo = 11001;
|
} else {
|
startNo = Integer.parseInt(maxCardNo) + 1;
|
}
|
// 2、生成卡信息
|
List<TravelCard> dataList = new ArrayList<>(total);
|
Date now = new Date();
|
for (int i = 0; i < total; i++) {
|
TravelCard card = new TravelCard();
|
card.setPackageId(packageId);
|
String cardNo = String.format("%06d", startNo + i);
|
card.setCardNo(cardNo); // 卡号
|
card.setCardPassword(generatePassword()); // 密码
|
card.setAmount(amount); // 金额
|
card.setStatus(TravelCardStatusEnum.UN_RECHARGE.getCode()); // 未充值
|
card.setInsertTime(now);
|
dataList.add(card);
|
}
|
return true;
|
}
|
|
/**
|
* 生成6位密码
|
*/
|
private String generatePassword() {
|
StringBuilder sb = new StringBuilder(6);
|
for (int i = 0; i < 6; i++) {
|
sb.append(PASSWORD_CHARS[RANDOM.nextInt(PASSWORD_CHARS.length)]);
|
}
|
return sb.toString();
|
}
|
|
/**
|
* 根据卡包查询出行卡
|
*
|
* @param packageId 卡包ID
|
* @return 出行卡列表
|
*/
|
public List<Map<String, Object>> getTravelCardByPackageId(Integer packageId) {
|
return this.baseMapper.getTravelCardByPackageId(packageId);
|
}
|
|
/**
|
* 出行卡列表
|
*
|
* @param page 分页
|
* @param packageId 包id
|
* @param cardNo 卡号
|
* @param rechargeUserPhone 充值用户手机
|
* @param status 状态
|
* @return 列表数据
|
*/
|
public List<Map<String, Object>> getTravelCardList(Page<Map<String, Object>> page, String packageId, String cardNo, String rechargeUserPhone, Integer status) {
|
|
return this.baseMapper.getTravelCardList(page, packageId, cardNo, rechargeUserPhone, status);
|
}
|
|
/**
|
* 查询已充值数量
|
*
|
* @param packageId 包ID
|
* @return 充值数量
|
*/
|
public Integer rechargeCount(Integer packageId) {
|
return this.baseMapper.rechargeCount(packageId, TravelCardStatusEnum.RECHARGED.getCode());
|
}
|
}
|