大大的豆芽 3 months ago
parent
commit
9eec5d9cb4

+ 1 - 2
yiqi-admin/src/main/java/com/yiqi/admin/controller/order/OrderGoodsController.java

@@ -108,8 +108,7 @@ public class OrderGoodsController extends BaseController {
         }
         return R.ok(goodsOrderInfoVO);
     }
-    //</editor-folder>
-    //<editor-folder desc="商品订单相关">
+
     /**
      * 新增零售商品订单-下单
      */

+ 42 - 58
yiqi-admin/src/main/java/com/yiqi/admin/controller/recharge/RechargePasswordCardController.java

@@ -37,6 +37,8 @@ import com.yiqi.recharge.service.IRechargePasswordCardService;
 import com.yiqi.common.utils.poi.ExcelUtil;
 import com.yiqi.common.core.page.TableDataInfo;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.format.annotation.DateTimeFormat;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * 密码充值卡管理Controller
@@ -47,6 +49,7 @@ import org.springframework.web.multipart.MultipartFile;
 @Api(tags = "管理后台 - 密码充值卡管理")
 @RestController
 @RequestMapping(UrlConstants.managerApi + "/recharge/card")
+@Slf4j
 public class RechargePasswordCardController extends BaseController {
     @Autowired
     private IRechargePasswordCardService rechargePasswordCardService;
@@ -141,68 +144,49 @@ public class RechargePasswordCardController extends BaseController {
         util.importTemplateExcel(response, "充值卡数据");
     }
 
-    @PostMapping("/importDirectChargingTemplate")
-    public void importDirectChargingTemplate(HttpServletResponse response) {
-        ExcelUtil<RechargeBatchImportDTO> util = new ExcelUtil<RechargeBatchImportDTO>(RechargeBatchImportDTO.class);
-        util.importTemplateExcel(response, "直充用户数据");
-    }
-
-    @Transactional(rollbackFor = Exception.class)
-    @Log(title = "充值卡管理", businessType = BusinessType.IMPORT)
-    @PreAuthorize("@ss.hasPermi('recharge:card:import')")
-    @PostMapping("/importData")
-    @ApiOperation("批量导入生成充值卡")
-    public AjaxResult importData(MultipartFile file, String batchName, Date expireTime, String remark) throws Exception {
-        ExcelUtil<RechargePasswordImportDTO> util = new ExcelUtil<RechargePasswordImportDTO>(RechargePasswordImportDTO.class);
-        List<RechargePasswordImportDTO> rechargePasswordImportDTOS = util.importExcel(file.getInputStream());
-        if (StringUtils.isNull(rechargePasswordImportDTOS) || rechargePasswordImportDTOS.size() == 0) {
-            throw new ServiceException("导入数据不能为空!");
-        }
-        List<String> cardNos = rechargePasswordImportDTOS.stream()
-                .map(RechargePasswordImportDTO::getCardNo).collect(Collectors.toList());
-        List<String> duplicates = cardNos.stream()
-                .distinct().filter(element -> cardNos.indexOf(element) != cardNos.lastIndexOf(element))
-                .collect(Collectors.toList());
-        if (duplicates != null && duplicates.size() > 0) {
-            throw new ServiceException("导入数据存在重复的卡号:" + Arrays.toString(duplicates.toArray()));
-        }
-        List<RechargePasswordCard> distinctCards = rechargePasswordCardService.list(new QueryWrapper<RechargePasswordCard>().lambda()
-                .in(RechargePasswordCard::getCardNo, cardNos)
-                .eq(RechargePasswordCard::getDelFlag, DeleteStatus.OK.getCode()));
-        if (distinctCards != null && distinctCards.size() > 0) {
-            throw new ServiceException("存在已重复的卡号:" + Arrays.toString(distinctCards.stream()
-                    .map(RechargePasswordCard::getCardNo)
-                    .collect(Collectors.toList()).toArray()));
-        }
-        // 保存批次号信息
-        RechargeCardBatchRecord rechargeCardBatchRecord = rechargePasswordCardService.buildRechargeCardBatchRecord(batchName, expireTime, remark, null, SysBoolType.NO.getCode());
-        String message = rechargePasswordCardService.importData(rechargePasswordImportDTOS, rechargeCardBatchRecord);
-        return success(message);
-    }
-
-
-    @Transactional(rollbackFor = Exception.class)
+    /**
+     * 直充用户导入 (会绑定门店)
+     */
     @Log(title = "直充用户-导入", businessType = BusinessType.IMPORT)
     @ApiOperation(value = "直充用户-导入")
     @PostMapping("/directChargingImportData")
-    public R<String> directChargingImportData(MultipartFile file, String batchName, Date expireTime, String remark) throws Exception {
-        ExcelUtil<RechargeBatchImportDTO> util = new ExcelUtil<>(RechargeBatchImportDTO.class);
-        List<RechargeBatchImportDTO> importVOS = util.importExcel(file.getInputStream());
-        if (StringUtils.isNull(importVOS) || importVOS.size() == 0) {
-            throw new ServiceException("导入数据不能为空!");
-        }
-        List<String> phoneNumbers = importVOS.stream()
-                .map(RechargeBatchImportDTO::getAppUserPhoneNumber).collect(Collectors.toList());
-        List<String> duplicates = phoneNumbers.stream()
-                .distinct().filter(element -> phoneNumbers.indexOf(element) != phoneNumbers.lastIndexOf(element))
-                .collect(Collectors.toList());
-        if (duplicates != null && duplicates.size() > 0) {
-            throw new ServiceException("导入数据存在重复的手机号:" + Arrays.toString(duplicates.toArray()));
+    public R<DirectChargingImportVO> directChargingImportData(
+            @RequestParam("file") MultipartFile file,
+            @RequestParam("batchName") String batchName,
+            @RequestParam("expireTime") @DateTimeFormat(pattern = "yyyy-MM-dd") Date expireTime,
+            @RequestParam(value = "remark", required = false) String remark) {
+
+        try {
+            // 1. 校验文件
+            if (file == null || file.isEmpty()) {
+                return R.fail("请选择要导入的文件");
+            }
+
+            // 2. 解析Excel
+            ExcelUtil<DirectChargingImportDTO> util = new ExcelUtil<>(DirectChargingImportDTO.class);
+            List<DirectChargingImportDTO> importList = util.importExcel(file.getInputStream());
+
+            // 3. 执行导入
+            DirectChargingImportVO result = rechargePasswordCardService.importDirectCharging(
+                    DirectChargingImportRequest.builder()
+                            .importList(importList)
+                            .batchName(batchName)
+                            .expireTime(expireTime)
+                            .remark(remark)
+                            .operatorId(getUserId())
+                            .operatorName(getUsername())
+                            .build()
+            );
+
+            return R.ok(result);
+
+        } catch (ServiceException e) {
+            log.error("直充导入失败", e);
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("直充导入异常", e);
+            return R.fail("导入失败,请联系管理员");
         }
-        // 保存批次号信息
-        RechargeCardBatchRecord rechargeCardBatchRecord = rechargePasswordCardService.buildRechargeCardBatchRecord(batchName, expireTime, remark, null, SysBoolType.YES.getCode());
-        threadPoolTaskExecutor.execute(() -> rechargePasswordCardService.directChargingImportData(importVOS, rechargeCardBatchRecord, phoneNumbers));
-        return R.ok("导入成功");
     }
 
     @Log(title = "充值卡管理", businessType = BusinessType.IMPORT)

+ 1 - 1
yiqi-common/src/main/java/com/yiqi/order/domain/OrderRecharge.java

@@ -246,7 +246,7 @@ public class OrderRecharge extends BaseEntity {
      * 下单渠道(APP=APP,WXAPP=小程序)
      */
     @Excel(name = "下单渠道", readConverterExp = "APP=APP,WXAPP=小程序")
-    @ApiModelProperty("下单渠道(APP=APP,WXAPP=小程序,SYSTEM=系统)")
+    @ApiModelProperty("下单渠道(APP=APP,WXAPP=小程序,HQ=系统)")
     private String orderSource;
 
     /**

+ 31 - 0
yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/DirectChargingImportDTO.java

@@ -0,0 +1,31 @@
+package com.yiqi.recharge.domain.dto;
+
+import com.yiqi.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import javax.validation.constraints.DecimalMin;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel("直充导入DTO")
+public class DirectChargingImportDTO {
+    
+    @Excel(name = "手机号")
+    @NotBlank(message = "手机号不能为空")
+    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
+    private String appUserPhoneNumber;
+
+    @Excel(name = "充值金额")
+    @NotNull(message = "充值金额不能为空")
+    @DecimalMin(value = "0.01", message = "充值金额必须大于0")
+    private BigDecimal rechargeAmount;
+
+    @Excel(name = "门店编号")
+    private String storeCode;
+}
+
+

+ 18 - 0
yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/DirectChargingImportRequest.java

@@ -0,0 +1,18 @@
+package com.yiqi.recharge.domain.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Builder
+public class DirectChargingImportRequest {
+    private List<DirectChargingImportDTO> importList;
+    private String batchName;
+    private Date expireTime;
+    private String remark;
+    private Long operatorId;
+    private String operatorName;
+}

+ 15 - 0
yiqi-common/src/main/java/com/yiqi/recharge/domain/dto/DirectChargingImportVO.java

@@ -0,0 +1,15 @@
+package com.yiqi.recharge.domain.dto;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Builder
+public class DirectChargingImportVO {
+    private String batchNo;
+    private Integer totalCount;
+    private Integer successCount;
+    private List<String> failDetails;
+}

+ 3 - 14
yiqi-common/src/main/java/com/yiqi/recharge/service/IRechargePasswordCardService.java

@@ -124,23 +124,12 @@ public interface IRechargePasswordCardService extends IService<RechargePasswordC
      */
     public String importData(List<RechargePasswordImportDTO> rechargePasswordImportDTOS, RechargeCardBatchRecord rechargeCardBatchRecord);
 
-    /**
-     * 导入充值卡数据
-     *
-     * @param importVOS        充值卡数据列表
-     * @return 结果
-     */
-    public String directChargingImportData(List<RechargeBatchImportDTO> importVOS, RechargeCardBatchRecord rechargeCardBatchRecord, List<String> phoneNumbers);
 
     /**
-     * 保存批次号信息
-     * @param batchName
-     * @param expireTime
-     * @param level
-     * @param starLevel
-     * @return
+     * 直充导入
      */
-    public RechargeCardBatchRecord buildRechargeCardBatchRecord(String batchName, Date expireTime, String remark, Integer starLevel, String isDirectRecharge);
+    DirectChargingImportVO importDirectCharging(DirectChargingImportRequest request);
+
 
     /**
      * 消费日志

+ 4 - 3
yiqi-core/src/main/java/com/yiqi/core/service/impl/GoodsInfoServiceImpl.java

@@ -82,7 +82,7 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
         goodsInfoDto.setSkuList(goodsSkuList);
         List<GoodsSpec> goodsSpecList = goodsSpecService.selectByGoodsId(id);
         goodsInfoDto.setSpecList(goodsSpecList);
-        if(goodsInfoDto.getSkuType() == 0){
+        if (goodsInfoDto.getSkuType() == 0 && goodsSkuList.size() > 0) {
             goodsInfoDto.setSingleSkuPrice(goodsInfoDto.getSkuList().get(0).getSalePrice());
             goodsInfoDto.setSingleSkuWholesalePrice(goodsInfoDto.getSkuList().get(0).getWholesalePrice());
             goodsInfoDto.setSingleSkuPurchasePrice(goodsInfoDto.getSkuList().get(0).getPurchasePrice());
@@ -251,7 +251,8 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
             //单规格处理,找到默认规格,更新默认规格,新增其他规格
             GoodsSku oriSku = null;
             List<GoodsSku> originalSkuList = goodsSkuMapper.selectGoodsSkuListByGoodsId(goods.getId());
-            if (originalSkuList == null) {
+            if (originalSkuList == null || originalSkuList.size() == 0) {
+                oriSku = new GoodsSku();
                 oriSku.setSalePrice(goods.getSingleSkuPrice());
                 oriSku.setWholesalePrice(goods.getSingleSkuWholesalePrice());
                 oriSku.setPurchasePrice(goods.getSingleSkuPurchasePrice());
@@ -265,7 +266,7 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
                 oriSku.setCreateBy(SecurityUtils.getUsername());
                 oriSku.setGoodsId(goods.getId());
                 goodsSkuMapper.insert(oriSku);
-            }else {
+            } else {
                 oriSku = originalSkuList.get(0);
                 oriSku.setSalePrice(goods.getSingleSkuPrice());
                 oriSku.setWholesalePrice(goods.getSingleSkuWholesalePrice());

+ 0 - 3
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderGoodsServiceImpl.java

@@ -171,9 +171,6 @@ public class OrderGoodsServiceImpl extends ServiceImpl<OrderGoodsMapper, OrderGo
         }
         return baseMapper.selectOrderGoodsList(goodsOrderQueryDTO);
     }
-    //</editor-folder>
-
-    //<editor-folder desc="订单操作">
 
     /**
      * 新增零售商品订单

+ 2 - 9
yiqi-core/src/main/java/com/yiqi/order/service/impl/OrderRechargeServiceImpl.java

@@ -649,15 +649,7 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         orderRecharge.setCashPayAmount(BigDecimal.ZERO);
         orderRecharge.setAliPayAmount(BigDecimal.ZERO);
         orderRecharge.setWxPayAmount(BigDecimal.ZERO);
-        // app支付充值
-        if (OrderSourceType.APP.getCode().equals(orderRechargeCreateDTO.getOrderSource())) {
-            orderRecharge.setStoreId(orderRechargeCreateDTO.getOrgId());
-            orderRecharge.setSource("APP_ORDER");
-        } else {
-            // 门店支付充值
-            orderRecharge.setSource("STORE_ORDER");
-            orderRecharge.setStoreId(orderRechargeCreateDTO.getOrgId());
-        }
+        orderRecharge.setStoreId(orderRechargeCreateDTO.getOrgId());
         return orderRecharge;
     }
 
@@ -686,6 +678,7 @@ public class OrderRechargeServiceImpl extends ServiceImpl<OrderRechargeMapper, O
         orderRecharge.setRechargeCardNo(rechargePasswordCard.getCardNo());
         orderRecharge.setPayAmount(rechargePasswordCard.getRechargeAmount());
         orderRecharge.setCashPayAmount(rechargePasswordCard.getRechargeAmount());
+        orderRecharge.setWelfareAmount(rechargePasswordCard.getWelfareAmount());
         orderRecharge.setWxPayAmount(BigDecimal.ZERO);
         orderRecharge.setAliPayAmount(BigDecimal.ZERO);
         orderRecharge.setRechargeAmount(rechargePasswordCard.getRechargeAmount() == null ? BigDecimal.ZERO : rechargePasswordCard.getRechargeAmount());

+ 220 - 93
yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargePasswordCardServiceImpl.java

@@ -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;
-    }
-
-
     /**
      * 按客户获取充值卡信息
      */

+ 1 - 13
yiqi-core/src/main/resources/mapper/recharge/RechargeCardBatchRecordMapper.xml

@@ -80,7 +80,7 @@
     <select id="listCardDetailByBatchNo"
             resultType="com.yiqi.recharge.domain.vo.RechargeBatchCardDetailListQueryVO">
         select rpc.batch_no as batchNo, rpc.id as rechargeCardId, rpc.card_no as cardNo, rpc.recharge_status as rechargeStatus,
-        rpc.recharge_org_id as rechargeOrgId, rpc.recharge_source_type as rechargeSourceType, rpc.id as rechargeUserId,
+        rpc.id as rechargeUserId,
         rpc.recharge_amount as rechargeAmount, rpc.recharge_balance as rechargeBalance, rpc.give_balance as giveBalance,
         rpc.welfare_balance as welfareBalance, rpc.give_amount as giveAmount, rpc.welfare_amount as welfareAmount,
         rpc.is_support_cloth as isSupportCloth, rpc.is_support_goods as isSupportGoods, rpc.is_support_life as isSupportLife,
@@ -102,12 +102,6 @@
             <if test="phoneNumber != null  and phoneNumber != ''">
                 and au.phone_number = #{phoneNumber}
             </if>
-            <if test="orgId != null  and orgId != ''">
-                and rpc.recharge_org_id = #{orgId}
-            </if>
-            <if test="sourceType != null  and sourceType != ''">
-                and rpc.recharge_source_type = #{sourceType}
-            </if>
         </where>
         order by rpc.create_time desc
         limit #{startRow},#{pageSize}
@@ -130,12 +124,6 @@
             <if test="phoneNumber != null  and phoneNumber != ''">
                 and au.phone_number = #{phoneNumber}
             </if>
-            <if test="orgId != null  and orgId != ''">
-                and rpc.recharge_org_id = #{orgId}
-            </if>
-            <if test="sourceType != null  and sourceType != ''">
-                and rpc.recharge_source_type = #{sourceType}
-            </if>
         </where>
     </select>
 </mapper>