|
@@ -44,12 +44,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -522,29 +520,231 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
|
|
|
return "导入成功";
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public DirectChargingImportVO importDirectCharging(DirectChargingImportRequest request) {
|
|
|
+ // 1. 校验数据
|
|
|
+ validateImportData(request);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 2. 创建批次记录
|
|
|
+ RechargeCardBatchRecord batchRecord = createBatchRecord(request);
|
|
|
+
|
|
|
+ // 3. 获取门店和用户信息
|
|
|
+ Map<String, SysStore> storeMap = getStoreMap(request.getImportList());
|
|
|
+ Map<String, AppUser> userMap = getUserMap(request.getImportList());
|
|
|
+
|
|
|
+ // 4. 构建并保存充值卡
|
|
|
+ List<RechargePasswordCard> rechargeCards = buildAndSaveRechargeCards(
|
|
|
+ request.getImportList(),
|
|
|
+ batchRecord,
|
|
|
+ storeMap,
|
|
|
+ userMap
|
|
|
+ );
|
|
|
+
|
|
|
+ // 5. 创建订单和账单
|
|
|
+ createOrdersAndBills(rechargeCards);
|
|
|
+
|
|
|
+ // 6. 构建返回结果
|
|
|
+ return DirectChargingImportVO.builder()
|
|
|
+ .batchNo(batchRecord.getBatchNo())
|
|
|
+ .totalCount(request.getImportList().size())
|
|
|
+ .successCount(rechargeCards.size())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("直充导入失败", e);
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ throw new ServiceException("导入失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
- * 直充导入
|
|
|
- *
|
|
|
- * @param importVOS 充值卡数据列表
|
|
|
- * @return
|
|
|
+ * 校验导入数据
|
|
|
*/
|
|
|
- @Override
|
|
|
- public String directChargingImportData(List<RechargeBatchImportDTO> importVOS, RechargeCardBatchRecord rechargeCardBatchRecord, List<String> phoneNumbers) {
|
|
|
- Map<String, SysStore> storeMap = sysStoreService.list(new QueryWrapper<SysStore>().lambda()
|
|
|
- .in(SysStore::getCode, importVOS.stream().filter(item -> StringUtils.isNotEmpty(item.getStoreCode()))
|
|
|
- .map(RechargeBatchImportDTO::getStoreCode).collect(Collectors.toSet()))).stream()
|
|
|
- .collect(Collectors.toMap(SysStore::getCode, SysStore -> SysStore));
|
|
|
- List<String> phoneNumberList = phoneNumbers.stream().distinct().filter(StrUtil::isNotEmpty).collect(Collectors.toList());
|
|
|
+ private void validateImportData(DirectChargingImportRequest request) {
|
|
|
+ if (CollUtil.isEmpty(request.getImportList())) {
|
|
|
+ throw new ServiceException("导入数据不能为空");
|
|
|
+ }
|
|
|
|
|
|
- Map<String, AppUser> appUserMap = appUserService.list(new QueryWrapper<AppUser>().lambda()
|
|
|
- .in(AppUser::getPhoneNumber, phoneNumberList)).stream()
|
|
|
- .collect(Collectors.toMap(AppUser::getPhoneNumber, AppUser -> AppUser));
|
|
|
+ if (request.getImportList().size() > 2000) {
|
|
|
+ throw new ServiceException("单次导入数量不能超过2000条");
|
|
|
+ }
|
|
|
|
|
|
- this.buildDirectCharging(importVOS, rechargeCardBatchRecord, storeMap, appUserMap);
|
|
|
+ if (StringUtils.isEmpty(request.getBatchName())) {
|
|
|
+ throw new ServiceException("批次名称不能为空");
|
|
|
+ }
|
|
|
|
|
|
- return "导入成功";
|
|
|
+ if (request.getExpireTime() != null && request.getExpireTime().before(new Date())) {
|
|
|
+ throw new ServiceException("过期时间不能早于当前时间");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建批次记录
|
|
|
+ */
|
|
|
+ private RechargeCardBatchRecord createBatchRecord(DirectChargingImportRequest request) {
|
|
|
+ RechargeCardBatchRecord batchRecord = new RechargeCardBatchRecord();
|
|
|
+ batchRecord.setBatchNo(orderNoUtils.getOrderNo());
|
|
|
+ batchRecord.setBatchName(request.getBatchName());
|
|
|
+ batchRecord.setLastExpireTime(request.getExpireTime());
|
|
|
+ batchRecord.setRemark(request.getRemark());
|
|
|
+ batchRecord.setIsDirectRecharge(SysBoolType.YES.getCode());
|
|
|
+ batchRecord.setCreateById(request.getOperatorId());
|
|
|
+ batchRecord.setCreateBy(request.getOperatorName());
|
|
|
+ batchRecord.setCreateTime(new Date());
|
|
|
+
|
|
|
+ rechargeCardBatchRecordService.save(batchRecord);
|
|
|
+ return batchRecord;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 获取门店信息
|
|
|
+ */
|
|
|
+ private Map<String, SysStore> getStoreMap(List<DirectChargingImportDTO> importList) {
|
|
|
+ Set<String> storeCodes = importList.stream()
|
|
|
+ .map(DirectChargingImportDTO::getStoreCode)
|
|
|
+ .filter(StringUtils::isNotEmpty)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ if (CollUtil.isEmpty(storeCodes)) {
|
|
|
+ return new HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ return sysStoreService.list(new QueryWrapper<SysStore>().lambda()
|
|
|
+ .in(SysStore::getCode, storeCodes))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.toMap(SysStore::getCode, Function.identity()));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取用户信息
|
|
|
+ */
|
|
|
+ private Map<String, AppUser> getUserMap(List<DirectChargingImportDTO> importList) {
|
|
|
+ Set<String> phones = importList.stream()
|
|
|
+ .map(DirectChargingImportDTO::getAppUserPhoneNumber)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ Map<String, AppUser> userMap = appUserService.list(new QueryWrapper<AppUser>().lambda()
|
|
|
+ .in(AppUser::getPhoneNumber, phones))
|
|
|
+ .stream()
|
|
|
+ .collect(Collectors.toMap(AppUser::getPhoneNumber, Function.identity()));
|
|
|
+
|
|
|
+ if (userMap.size() != phones.size()) {
|
|
|
+ List<String> notExistPhones = phones.stream()
|
|
|
+ .filter(phone -> !userMap.containsKey(phone))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ throw new ServiceException("以下手机号未注册:" + String.join(",", notExistPhones));
|
|
|
+ }
|
|
|
+
|
|
|
+ return userMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建并保存充值卡
|
|
|
+ */
|
|
|
+ private List<RechargePasswordCard> buildAndSaveRechargeCards(
|
|
|
+ List<DirectChargingImportDTO> importList,
|
|
|
+ RechargeCardBatchRecord batchRecord,
|
|
|
+ Map<String, SysStore> storeMap,
|
|
|
+ Map<String, AppUser> userMap) {
|
|
|
+
|
|
|
+ List<RechargePasswordCard> rechargeCards = importList.stream()
|
|
|
+ .map(importDTO -> buildRechargeCard(importDTO, batchRecord, storeMap, userMap))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ saveBatch(rechargeCards);
|
|
|
+ return rechargeCards;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建充值卡
|
|
|
+ */
|
|
|
+ private RechargePasswordCard buildRechargeCard(
|
|
|
+ DirectChargingImportDTO importDTO,
|
|
|
+ RechargeCardBatchRecord batchRecord,
|
|
|
+ Map<String, SysStore> storeMap,
|
|
|
+ Map<String, AppUser> userMap) {
|
|
|
+
|
|
|
+ RechargePasswordCard card = new RechargePasswordCard();
|
|
|
+
|
|
|
+ // 设置基本信息
|
|
|
+ card.setBatchNo(batchRecord.getBatchNo());
|
|
|
+ card.setCardNo(orderNoUtils.getOrderNo());
|
|
|
+ card.setPassword(Utils.getPassWordOne(8));
|
|
|
+ card.setCreateType(RechargeCreateType.IMPORT.getCode());
|
|
|
+
|
|
|
+ // 设置金额
|
|
|
+ card.setRechargeAmount(importDTO.getRechargeAmount());
|
|
|
+ card.setGiveAmount(BigDecimal.ZERO);
|
|
|
+ card.setGivePointAmount(0);
|
|
|
+ card.setRechargeBalance(card.getRechargeAmount());
|
|
|
+ card.setGiveBalance(card.getGiveAmount());
|
|
|
+
|
|
|
+ // 设置状态
|
|
|
+ card.setDelFlag(DeleteStatus.OK.getCode());
|
|
|
+ card.setRechargeStatus(RechargeStatusType.HAS_USE.getCode());
|
|
|
+ card.setRechargeTime(new Date());
|
|
|
+
|
|
|
+ // 设置用户
|
|
|
+ AppUser user = userMap.get(importDTO.getAppUserPhoneNumber());
|
|
|
+ card.setRechargeUserId(user.getId());
|
|
|
+
|
|
|
+ // 设置权限
|
|
|
+ card.setIsSupportLife(SysBoolType.YES.getCode());
|
|
|
+ card.setIsSupportGoods(SysBoolType.YES.getCode());
|
|
|
+ card.setIsSupportCloth(SysBoolType.YES.getCode());
|
|
|
+ card.setIsSupportCar(SysBoolType.YES.getCode());
|
|
|
+
|
|
|
+ // 设置创建信息
|
|
|
+ card.setCreateById(batchRecord.getCreateById());
|
|
|
+ card.setCreateBy(batchRecord.getCreateBy());
|
|
|
+ card.setCreateTime(new Date());
|
|
|
+
|
|
|
+ // 设置门店
|
|
|
+ if (StringUtils.isNotEmpty(importDTO.getStoreCode())) {
|
|
|
+ SysStore store = storeMap.get(importDTO.getStoreCode());
|
|
|
+ if (store != null) {
|
|
|
+ card.setRechargeStoreId(store.getId());
|
|
|
+ card.setUseBindStoreId(store.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return card;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建订单和账单
|
|
|
+ */
|
|
|
+ private void createOrdersAndBills(List<RechargePasswordCard> rechargeCards) {
|
|
|
+ for (RechargePasswordCard card : rechargeCards) {
|
|
|
+ try {
|
|
|
+ // 创建充值订单
|
|
|
+ OrderRecharge orderRecharge = orderRechargeService.buildOrderRechargeByCardPassword(
|
|
|
+ card,
|
|
|
+ OrderRechargeCreateDTO.buildDirectChargingCardByOrder(card.getRechargeUserId())
|
|
|
+ );
|
|
|
+
|
|
|
+ // 创建账单记录
|
|
|
+ appUserBillMstrService.consumeRecord(
|
|
|
+ ConsumeOrderDTO.buildOrderRechargeData(orderRecharge)
|
|
|
+ );
|
|
|
+
|
|
|
+ // 更新充值卡订单号
|
|
|
+ card.setOrderNo(orderRecharge.getOrderNo());
|
|
|
+ updateById(card);
|
|
|
+
|
|
|
+ log.info("创建订单成功, 充值卡号:{}, 订单号:{}",
|
|
|
+ card.getCardNo(), orderRecharge.getOrderNo());
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("创建订单失败, 充值卡号:{}", card.getCardNo(), e);
|
|
|
+ throw new ServiceException("创建订单失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 保存导入-未使用的充值卡
|
|
|
*
|
|
@@ -586,79 +786,6 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
|
|
|
saveBatch(rechargePasswordCards);
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 保存直充
|
|
|
- *
|
|
|
- * @param importVOS
|
|
|
- */
|
|
|
- @Transactional(rollbackFor = Exception.class)
|
|
|
- public void buildDirectCharging(List<RechargeBatchImportDTO> importVOS, RechargeCardBatchRecord rechargeCardBatchRecord, Map<String, SysStore> storeMap, Map<String, AppUser> appUserMap) {
|
|
|
- List<RechargePasswordCard> rechargePasswordCards = new ArrayList<>();
|
|
|
- for (RechargeBatchImportDTO importDTO : importVOS) {
|
|
|
- RechargePasswordCard rechargePasswordCard = new RechargePasswordCard();
|
|
|
- rechargePasswordCard.setBatchNo(rechargeCardBatchRecord.getBatchNo());
|
|
|
- rechargePasswordCard.setCardNo(orderNoUtils.getOrderNo());
|
|
|
- rechargePasswordCard.setPassword(Utils.getPassWordOne(8));
|
|
|
- rechargePasswordCard.setCreateType(RechargeCreateType.IMPORT.getCode());
|
|
|
- rechargePasswordCard.setRechargeAmount(importDTO.getRechargeAmount());
|
|
|
- rechargePasswordCard.setGiveAmount(BigDecimal.ZERO);
|
|
|
- rechargePasswordCard.setGivePointAmount(0);
|
|
|
- rechargePasswordCard.setRechargeTime(DateUtils.getNowDate());
|
|
|
- rechargePasswordCard.setRechargeBalance(rechargePasswordCard.getRechargeAmount());
|
|
|
- rechargePasswordCard.setGiveBalance(rechargePasswordCard.getGiveAmount());
|
|
|
- rechargePasswordCard.setDelFlag(DeleteStatus.OK.getCode());
|
|
|
- rechargePasswordCard.setRechargeStatus(RechargeStatusType.HAS_USE.getCode());
|
|
|
- rechargePasswordCard.setRechargeUserId(appUserMap.get(importDTO.getAppUserPhoneNumber()).getId());
|
|
|
- rechargePasswordCard.setIsSupportLife(SysBoolType.YES.getCode());
|
|
|
- rechargePasswordCard.setIsSupportGoods(SysBoolType.YES.getCode());
|
|
|
- rechargePasswordCard.setIsSupportCloth(SysBoolType.YES.getCode());
|
|
|
- rechargePasswordCard.setIsSupportCar(SysBoolType.YES.getCode());
|
|
|
- // 设置客户星级
|
|
|
- rechargePasswordCard.setCreateById(rechargeCardBatchRecord.getCreateById());
|
|
|
- rechargePasswordCard.setCreateBy(rechargeCardBatchRecord.getCreateBy());
|
|
|
- rechargePasswordCard.setCreateTime(DateUtils.getNowDate());
|
|
|
- if (CollUtil.isNotEmpty(storeMap) && storeMap.get(importDTO.getStoreCode()) != null) {
|
|
|
- rechargePasswordCard.setRechargeStoreId(storeMap.get(importDTO.getStoreCode()).getId());
|
|
|
- rechargePasswordCard.setUseBindStoreId(storeMap.get(importDTO.getStoreCode()).getId());
|
|
|
- }
|
|
|
- rechargePasswordCards.add(rechargePasswordCard);
|
|
|
- }
|
|
|
- this.saveBatch(rechargePasswordCards);
|
|
|
- for (RechargePasswordCard rechargePasswordCard : rechargePasswordCards) {
|
|
|
- // 保存订单
|
|
|
- OrderRecharge orderRecharge = orderRechargeService.buildOrderRechargeByCardPassword(rechargePasswordCard, OrderRechargeCreateDTO.buildDirectChargingCardByOrder(rechargePasswordCard.getRechargeUserId()));
|
|
|
- // 保存消费日志
|
|
|
- appUserBillMstrService.consumeRecord(ConsumeOrderDTO.buildOrderRechargeData(orderRecharge));
|
|
|
- rechargePasswordCard.setOrderNo(orderRecharge.getOrderNo());
|
|
|
- this.updateById(rechargePasswordCard);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * 保存批次号信息
|
|
|
- *
|
|
|
- * @param batchName
|
|
|
- * @param expireTime
|
|
|
- * @param remark
|
|
|
- * @param starLevel
|
|
|
- * @return
|
|
|
- */
|
|
|
- @Override
|
|
|
- public RechargeCardBatchRecord buildRechargeCardBatchRecord(String batchName, Date expireTime, String remark, Integer starLevel, String isDirectRecharge) {
|
|
|
- RechargeCardBatchRecord rechargeCardBatchRecord = new RechargeCardBatchRecord();
|
|
|
- rechargeCardBatchRecord.buildCreateData();
|
|
|
- rechargeCardBatchRecord.setBatchNo(orderNoUtils.getOrderNo());
|
|
|
- rechargeCardBatchRecord.setBatchName(batchName);
|
|
|
- rechargeCardBatchRecord.setLastExpireTime(expireTime);
|
|
|
- rechargeCardBatchRecord.setRemark(remark);
|
|
|
- rechargeCardBatchRecord.setStarLevel(starLevel);
|
|
|
- rechargeCardBatchRecord.setIsDirectRecharge(isDirectRecharge);
|
|
|
- rechargeCardBatchRecordService.save(rechargeCardBatchRecord);
|
|
|
- return rechargeCardBatchRecord;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
/**
|
|
|
* 按客户获取充值卡信息
|
|
|
*/
|