Przeglądaj źródła

购物卡、购物卡订单代码提交

wangzhijun 1 tydzień temu
rodzic
commit
76723d951a

+ 5 - 0
nightFragrance-massage/src/main/java/com/ylx/giftCard/domain/GiftCardOrder.java

@@ -42,6 +42,11 @@ public class GiftCardOrder extends BaseEntity {
      */
     private BigDecimal giftCardAmount;
 
+    /**
+     * 购买数量
+     */
+    private Integer purchaseQuantity;
+
     /**
      * 下单时的提成比例(冗余,防卡后续修改影响历史订单)
      */

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/giftCard/service/IGiftCardOrderService.java

@@ -8,5 +8,5 @@ import java.util.List;
 
 public interface IGiftCardOrderService extends IService<GiftCardOrder> {
 
-    List<GiftCardOrder> buildOrders(GiftCard card, Integer quantity, String merchantId);
+    GiftCardOrder buildOrder(GiftCard card, Integer quantity, String merchantId);
 }

+ 41 - 57
nightFragrance-massage/src/main/java/com/ylx/giftCard/service/impl/GiftCardOrderServiceImpl.java

@@ -1,6 +1,5 @@
 package com.ylx.giftCard.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
@@ -22,10 +21,8 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.List;
 
-@Slf4j
+@Slf4j // 添加日志注解
 @Service
 public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, GiftCardOrder> implements IGiftCardOrderService {
 
@@ -34,7 +31,8 @@ public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, G
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<GiftCardOrder> buildOrders(GiftCard card, Integer quantity, String merchantId) {
+    public GiftCardOrder buildOrder(GiftCard card, Integer quantity, String merchantId) {
+
         // 1. 参数校验
         if (ObjectUtil.isNull(card)) {
             throw new IllegalArgumentException("购物卡信息不能为空");
@@ -50,71 +48,48 @@ public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, G
             throw new ServiceException("用户未登录");
         }
 
-        // 3. 查询商户信息(只查询一次,避免重复查询)
-        TJs merchant = null;
-        if (StrUtil.isNotEmpty(merchantId)) {
-            merchant = this.jsService.getById(merchantId);
-            if (ObjectUtil.isNull(merchant)) {
-                log.warn("商户信息不存在,ID: {}", merchantId);
-            }
-        }
-
-        // 4. 批量创建订单
-        List<GiftCardOrder> orders = new ArrayList<>(quantity);
-        for (int i = 0; i < quantity; i++) {
-            GiftCardOrder order = createSingleOrder(card, wxLoginUser, merchant, i + 1, quantity);
-            orders.add(order);
-        }
-
-        // 5. 批量插入订单
-        boolean insertResult = this.saveBatch(orders);
-        if (!insertResult) {
-            log.warn("批量创建购物卡订单失败,购物卡ID: {},下单人ID: {},总数量: {}", card.getId(), wxLoginUser.getId(), quantity);
-            throw new ServiceException("批量创建订单失败");
-        }
-
-        log.info("批量创建购物卡订单成功,购物卡ID: {},下单人ID: {},总数量: {}", card.getId(), wxLoginUser.getId(), quantity);
-        return orders;
-    }
-
-    /**
-     * 创建单个订单
-     */
-    private GiftCardOrder createSingleOrder(GiftCard card, WxLoginUser wxLoginUser, TJs merchant, int currentSeq, int totalQuantity) {
+        // 3. 创建订单对象
         GiftCardOrder order = new GiftCardOrder();
 
-        // 生成唯一订单号
-        String orderNo = generateUniqueOrderNo(currentSeq);
+        // 4. 生成唯一订单号(使用更安全的方式)
+        String orderNo = generateUniqueOrderNo();
         order.setOrderNo(orderNo);
 
-        // 设置购物卡信息
+        // 5. 设置购物卡信息
         setGiftCardInfo(order, card);
 
-        // 设置用户信息
+        // 6. 设置用户信息
         setUserInfo(order, wxLoginUser);
 
-        // 设置商户信息
-        setMerchantInfo(order, merchant);
+        // 7. 设置商户信息
+        setMerchantInfo(order, merchantId);
 
-        // 计算金额(每张卡的金额)
-        calculateAmountPerCard(order, card);
+        // 8. 计算金额
+        calculateAmount(order, card, quantity);
+        order.setPurchaseQuantity(quantity);
 
-        // 设置订单状态和时间
+        // 9. 设置订单状态和时间
         order.setStatus(1); // 已支付
         order.setCreateTime(DateUtils.getNowDate());
         order.setUpdateTime(order.getCreateTime());
-
+        int rowsAffected = this.baseMapper.insert(order);
+        if (rowsAffected <= 0) {
+            log.warn("购物卡订单创建失败,购物卡ID: {},下单人ID: {}", card.getId(), wxLoginUser.getId());
+            return null;
+        }
         return order;
     }
 
     /**
-     * 生成唯一订单号(带序列号)
+     * 生成唯一订单号
      */
-    private String generateUniqueOrderNo(int sequence) {
+    private String generateUniqueOrderNo() {
+        // 使用时间戳 + 随机数 + 更多信息避免冲突
         long timestamp = System.currentTimeMillis();
         String randomNum = RandomUtil.randomNumbers(6);
-        // 可以加入序列号信息,便于区分同批订单中的不同卡
-        return "GC" + timestamp + randomNum + String.format("%02d", sequence); // 序列号补零
+        // 可以加入用户ID后几位、线程ID等进一步降低冲突概率
+        String suffix = String.valueOf(timestamp % 1000000).substring(0, 3); // 取时间戳后3位
+        return "GC" + timestamp + randomNum + suffix;
     }
 
     /**
@@ -139,27 +114,36 @@ public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, G
     /**
      * 设置商户信息
      */
-    private void setMerchantInfo(GiftCardOrder order, TJs merchant) {
+    private void setMerchantInfo(GiftCardOrder order, String merchantId) {
+        if (StrUtil.isEmpty(merchantId)) {
+            log.warn("商户ID为空,跳过商户信息查询");
+            return;
+        }
+
+        TJs merchant = this.jsService.getById(merchantId);
         if (ObjectUtil.isNotNull(merchant)) {
-            order.setMerchantId(merchant.getId());
+            order.setMerchantId(merchantId);
             order.setMerchantName(merchant.getcName());
             order.setMerchantNickName(merchant.getcNickName());
+            // 注意:如果 TJs 表有收款账号字段,可以在这里设置
             // order.setMerchantAccount(merchant.getAccount());
         }
     }
 
     /**
-     * 计算单张卡的金额(每张卡的金额相同)
+     * 计算金额
      */
-    private void calculateAmountPerCard(GiftCardOrder order, GiftCard card) {
-        // 单张卡的支付金额 = 购物卡面额
-        BigDecimal payAmount = card.getAmount().setScale(2, RoundingMode.HALF_UP);
+    private void calculateAmount(GiftCardOrder order, GiftCard card, Integer quantity) {
+        BigDecimal payAmount = card.getAmount()
+                .multiply(new BigDecimal(quantity))
+                .setScale(2, RoundingMode.HALF_UP); // 保留两位小数
+
         order.setPayAmount(payAmount);
 
-        // 单张卡的佣金金额 = 面额 * 佣金率 / 100
         BigDecimal commissionAmount = payAmount
                 .multiply(card.getCommissionRate())
                 .divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
+
         order.setCommissionAmount(commissionAmount);
     }
 }

+ 36 - 7
nightFragrance-massage/src/main/java/com/ylx/giftCard/service/impl/GiftCardServiceImpl.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ylx.common.core.domain.model.WxLoginUser;
+import com.ylx.common.exception.ServiceException;
+import com.ylx.common.utils.SecurityUtils;
 import com.ylx.giftCard.domain.GiftCard;
 import com.ylx.giftCard.domain.GiftCardOrder;
 import com.ylx.giftCard.domain.dto.GiftCardPurchaseDTO;
@@ -15,6 +18,8 @@ import com.ylx.giftCard.domain.vo.GiftCardVO;
 import com.ylx.giftCard.mapper.GiftCardMapper;
 import com.ylx.giftCard.service.IGiftCardOrderService;
 import com.ylx.giftCard.service.IGiftCardService;
+import com.ylx.shopingfundsdetail.domain.vo.ShoppingFundsDetailAddDto;
+import com.ylx.shopingfundsdetail.service.ShoppingFundsDetailService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -22,7 +27,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -31,6 +35,8 @@ public class GiftCardServiceImpl extends ServiceImpl<GiftCardMapper, GiftCard> i
 
     @Resource
     private IGiftCardOrderService giftCardOrderService;
+    @Resource
+    private ShoppingFundsDetailService shoppingFundsDetailService;
 
     private static final int NOT_DELETE = 0;
     private static final int PUBLISHED = 1;
@@ -109,9 +115,10 @@ public class GiftCardServiceImpl extends ServiceImpl<GiftCardMapper, GiftCard> i
         log.info("购买成功,购物卡ID: {}, 数量: {}", id, quantity);
 
         // 5. 异步创建订单(传入完整的购物卡对象,避免异步方法中再次查询)
-        createOrderAsync(card, quantity, merchantId);
+        GiftCardOrder giftCardOrder = createOrderAsync(card, quantity, merchantId);
 
-        // 6. 异步添加购物金明细 TODO
+        // 6. 异步添加购物金明细
+        addShoppingFundsDetailAsync(card, giftCardOrder);
 
         return true;
     }
@@ -138,20 +145,42 @@ public class GiftCardServiceImpl extends ServiceImpl<GiftCardMapper, GiftCard> i
      * 异步创建订单
      */
     @Async
-    public void createOrderAsync(GiftCard card, Integer quantity, String merchantId) {
+    public GiftCardOrder createOrderAsync(GiftCard card, Integer quantity, String merchantId) {
         try {
             // 注意:异步方法中不要依赖主线程的事务,订单创建失败不应影响库存扣减
-            List<GiftCardOrder> orders = this.giftCardOrderService.buildOrders(card, quantity, merchantId);
+            GiftCardOrder order = this.giftCardOrderService.buildOrder(card, quantity, merchantId);
 
-            if (orders != null && !orders.isEmpty()) {
-                log.info("购物卡订单创建成功,订单数量: {},购物卡ID: {}", orders.size(), card.getId());
+            if (ObjectUtil.isNotNull(order)) {
+                log.info("购物卡订单创建成功,购物卡ID: {}", card.getId());
             } else {
                 log.warn("购物卡订单创建返回为空,购物卡ID: {}", card.getId());
             }
+            return order;
         } catch (Exception e) {
             log.error("异步创建订单失败,订单数据: cardId={}, quantity={}, merchantId={}",
                     card.getId(), quantity, merchantId, e);
         }
+        return null;
+    }
+
+    /**
+     * 异步新增购物金明细
+     */
+    @Async
+    public void addShoppingFundsDetailAsync(GiftCard card, GiftCardOrder giftCardOrder) {
+
+        try {
+            ShoppingFundsDetailAddDto dto = new ShoppingFundsDetailAddDto();
+            dto.setGiftCardId(card.getId());
+            dto.setAmount(card.getAmount());
+            dto.setUserId(giftCardOrder.getUserId());
+            dto.setExpenseType(0);
+            this.shoppingFundsDetailService.addShoppingFundsDetail(dto);
+
+        } catch (Exception e) {
+            log.error("异步新增购物金明细失败,订单数据: cardId={}, amount={}, userId={}",
+                    card.getId(), card.getAmount(), giftCardOrder.getUserId(), e);
+        }
     }
 
 }