|
@@ -1,6 +1,5 @@
|
|
|
package com.ylx.giftCard.service.impl;
|
|
package com.ylx.giftCard.service.impl;
|
|
|
|
|
|
|
|
-import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import cn.hutool.core.util.RandomUtil;
|
|
import cn.hutool.core.util.RandomUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
@@ -22,10 +21,8 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
|
-import java.util.ArrayList;
|
|
|
|
|
-import java.util.List;
|
|
|
|
|
|
|
|
|
|
-@Slf4j
|
|
|
|
|
|
|
+@Slf4j // 添加日志注解
|
|
|
@Service
|
|
@Service
|
|
|
public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, GiftCardOrder> implements IGiftCardOrderService {
|
|
public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, GiftCardOrder> implements IGiftCardOrderService {
|
|
|
|
|
|
|
@@ -34,7 +31,8 @@ public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, G
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
- public List<GiftCardOrder> buildOrders(GiftCard card, Integer quantity, String merchantId) {
|
|
|
|
|
|
|
+ public GiftCardOrder buildOrder(GiftCard card, Integer quantity, String merchantId) {
|
|
|
|
|
+
|
|
|
// 1. 参数校验
|
|
// 1. 参数校验
|
|
|
if (ObjectUtil.isNull(card)) {
|
|
if (ObjectUtil.isNull(card)) {
|
|
|
throw new IllegalArgumentException("购物卡信息不能为空");
|
|
throw new IllegalArgumentException("购物卡信息不能为空");
|
|
@@ -50,71 +48,48 @@ public class GiftCardOrderServiceImpl extends ServiceImpl<GiftCardOrderMapper, G
|
|
|
throw new ServiceException("用户未登录");
|
|
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();
|
|
GiftCardOrder order = new GiftCardOrder();
|
|
|
|
|
|
|
|
- // 生成唯一订单号
|
|
|
|
|
- String orderNo = generateUniqueOrderNo(currentSeq);
|
|
|
|
|
|
|
+ // 4. 生成唯一订单号(使用更安全的方式)
|
|
|
|
|
+ String orderNo = generateUniqueOrderNo();
|
|
|
order.setOrderNo(orderNo);
|
|
order.setOrderNo(orderNo);
|
|
|
|
|
|
|
|
- // 设置购物卡信息
|
|
|
|
|
|
|
+ // 5. 设置购物卡信息
|
|
|
setGiftCardInfo(order, card);
|
|
setGiftCardInfo(order, card);
|
|
|
|
|
|
|
|
- // 设置用户信息
|
|
|
|
|
|
|
+ // 6. 设置用户信息
|
|
|
setUserInfo(order, wxLoginUser);
|
|
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.setStatus(1); // 已支付
|
|
|
order.setCreateTime(DateUtils.getNowDate());
|
|
order.setCreateTime(DateUtils.getNowDate());
|
|
|
order.setUpdateTime(order.getCreateTime());
|
|
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;
|
|
return order;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 生成唯一订单号(带序列号)
|
|
|
|
|
|
|
+ * 生成唯一订单号
|
|
|
*/
|
|
*/
|
|
|
- private String generateUniqueOrderNo(int sequence) {
|
|
|
|
|
|
|
+ private String generateUniqueOrderNo() {
|
|
|
|
|
+ // 使用时间戳 + 随机数 + 更多信息避免冲突
|
|
|
long timestamp = System.currentTimeMillis();
|
|
long timestamp = System.currentTimeMillis();
|
|
|
String randomNum = RandomUtil.randomNumbers(6);
|
|
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)) {
|
|
if (ObjectUtil.isNotNull(merchant)) {
|
|
|
- order.setMerchantId(merchant.getId());
|
|
|
|
|
|
|
+ order.setMerchantId(merchantId);
|
|
|
order.setMerchantName(merchant.getcName());
|
|
order.setMerchantName(merchant.getcName());
|
|
|
order.setMerchantNickName(merchant.getcNickName());
|
|
order.setMerchantNickName(merchant.getcNickName());
|
|
|
|
|
+ // 注意:如果 TJs 表有收款账号字段,可以在这里设置
|
|
|
// order.setMerchantAccount(merchant.getAccount());
|
|
// 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);
|
|
order.setPayAmount(payAmount);
|
|
|
|
|
|
|
|
- // 单张卡的佣金金额 = 面额 * 佣金率 / 100
|
|
|
|
|
BigDecimal commissionAmount = payAmount
|
|
BigDecimal commissionAmount = payAmount
|
|
|
.multiply(card.getCommissionRate())
|
|
.multiply(card.getCommissionRate())
|
|
|
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
|
|
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
|
|
|
|
|
+
|
|
|
order.setCommissionAmount(commissionAmount);
|
|
order.setCommissionAmount(commissionAmount);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|