Ver código fonte

add:平台优惠券核销

lyx 6 meses atrás
pai
commit
410a29f633

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/OrderCouponMiddle.java

@@ -44,6 +44,9 @@ public class OrderCouponMiddle {
     @TableLogic
     private Integer deleteFlag;
 
+    @ApiModelProperty(value = "平均优惠价(优惠券价格平均到券的价格)")
+    private BigDecimal avgDiscountCouponPrice;
+
     @ApiModelProperty(value = "创建时间")
     @TableField(value = "created_time", fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

+ 21 - 8
alien-store/src/main/java/shop/alien/store/service/LifeUserOrderService.java

@@ -86,6 +86,8 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
     private final LifeGroupBuyMainMapper lifeGroupBuyMainMapper;
     private final AliApi aliApi;
 
+    private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
+
     private final WebSocketProcess webSocketProcess;
 
     @Value("${spring.web.resources.excel-path}")
@@ -709,9 +711,9 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         lifeUserOrder.setOrderNo(lifeUserOrderDto.getOrderNo());
         // 优惠券id
         lifeUserOrder.setQuanId(lifeUserOrderDto.getYhquanId());
-        // 付款金额
+        // 原价金额
         lifeUserOrder.setPrice(lifeUserOrderDto.getPrice());
-        // 订单金额
+        // 付款金额
         lifeUserOrder.setFinalPrice(lifeUserOrderDto.getFinalPrice());
         // 订单类型
         lifeUserOrder.setCouponType(null == lifeUserOrderDto.getCouponType() ? 1 : lifeUserOrderDto.getCouponType());
@@ -720,8 +722,19 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
         // 购买时间
         lifeUserOrder.setBuyTime(date);
         this.saveOrUpdate(lifeUserOrder);
+
+        //3.根据购买数量增加中间关系 订单id+券编号 确定一条数据
+        int buyCount = lifeUserOrderDto.getCount();
+        BigDecimal totalPrice = new BigDecimal(lifeUserOrderDto.getFinalPrice());
+        BigDecimal countDecimal = new BigDecimal(buyCount);
+        BigDecimal perPrice = totalPrice.divide(countDecimal, 2, RoundingMode.DOWN);
+        BigDecimal lastPrice = totalPrice.subtract(perPrice.multiply(countDecimal.subtract(BigDecimal.ONE)));
+
         //2.判断是否使用优惠券
         //查询优惠券信息
+        BigDecimal avgDiscountCouponPrice = BigDecimal.ZERO;
+        BigDecimal avgDiscountCouponLastPrice = BigDecimal.ZERO;
+        LifeDiscountCoupon lifeDiscountCoupon = null;
         if (StringUtils.isNotEmpty(lifeUserOrderDto.getYhquanId())) {
             LifeDiscountCouponUser lifeDiscountCouponUser = lifeDiscountCouponUserMapper.selectById(lifeUserOrderDto.getYhquanId());
             //将优惠券状态变更为已使用
@@ -729,13 +742,11 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             //将优惠券使用时间存入
             lifeDiscountCouponUser.setUseTime(date);
             lifeDiscountCouponUserMapper.updateById(lifeDiscountCouponUser);
+            lifeDiscountCoupon = lifeDiscountCouponMapper.selectById(lifeDiscountCouponUser.getCouponId());
+            avgDiscountCouponPrice = lifeDiscountCoupon.getNominalValue().divide(countDecimal, 2, RoundingMode.DOWN);
+            avgDiscountCouponLastPrice = lifeDiscountCoupon.getNominalValue().subtract(avgDiscountCouponPrice.multiply(countDecimal.subtract(BigDecimal.ONE)));
         }
-        //3.根据购买数量增加中间关系 订单id+券编号 确定一条数据
-        int buyCount = lifeUserOrderDto.getCount();
-        BigDecimal totalPrice = new BigDecimal(lifeUserOrderDto.getFinalPrice());
-        BigDecimal countDecimal = new BigDecimal(buyCount);
-        BigDecimal perPrice = totalPrice.divide(countDecimal, 2, RoundingMode.DOWN);
-        BigDecimal lastPrice = totalPrice.subtract(perPrice.multiply(countDecimal.subtract(BigDecimal.ONE)));
+
         for (int i = 0; i < buyCount; i++) {
             String code = UniqueRandomNumGenerator.generateUniqueCode(12);
             OrderCouponMiddle orderCouponMiddle = new OrderCouponMiddle();
@@ -749,6 +760,8 @@ public class LifeUserOrderService extends ServiceImpl<LifeUserOrderMapper, LifeU
             orderCouponMiddle.setPrice(i == buyCount - 1 ? lastPrice : perPrice);
             // 订单状态
             orderCouponMiddle.setStatus(0);
+            // 设置平均优惠价
+            orderCouponMiddle.setAvgDiscountCouponPrice(i == buyCount - 1 ? avgDiscountCouponLastPrice : avgDiscountCouponPrice);
             orderCouponMiddleService.save(orderCouponMiddle);
         }
         //4. 代金券/团购库存扣除 coupon_type 1 代金券 2团购

+ 29 - 11
alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java

@@ -1,6 +1,5 @@
 package shop.alien.store.service.impl;
 
-import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -64,6 +63,7 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
     private final StoreInfoMapper storeInfoMapper;
 
     private final BaseRedisService baseRedisService;
+    private final LifeDiscountCouponMapper lifeDiscountCouponMapper;
 
     @Override
     public LifeCoupon addOrUpdateCoupon(LifeCoupon lifeCoupon) {
@@ -249,20 +249,33 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
     public Map<String, String> newCouponVerify(String storeId, String quanCode) {
         Map<String, String> resultMap = new HashMap<>();
         String lockKey = "coupon:use:" + quanCode;
-        if(baseRedisService.hasKey(lockKey)) {
+        if (baseRedisService.hasKey(lockKey)) {
             resultMap.put("code", "false");
             resultMap.put("message", "请勿重复核销");
             return resultMap;
-        };
+        }
         baseRedisService.setListRight(lockKey, quanCode);
         try {
-            OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, quanCode).in(OrderCouponMiddle::getStatus,OrderStatusEnum.WAIT_USE.getStatus(),OrderStatusEnum.REFUND_FAILED.getStatus()));
+            OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, quanCode).in(OrderCouponMiddle::getStatus, OrderStatusEnum.WAIT_USE.getStatus(), OrderStatusEnum.REFUND_FAILED.getStatus()));
             if (!StringUtils.isEmpty(orderCouponMiddle)) {
                 // 查询总订单
                 LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
                 orderCouponMiddle.setStatus(OrderStatusEnum.USED.getStatus());
                 orderCouponMiddle.setUsedTime(new Date());
                 orderCouponMiddleMapper.updateById(orderCouponMiddle);
+                // 查看是否使用优惠券
+                Boolean platFormCoupon = false;
+                String quanId = lifeUserOrder.getQuanId();
+                if (org.apache.commons.lang3.StringUtils.isNotEmpty(quanId)) {
+                    LifeDiscountCoupon lifeDiscountCoupon = lifeDiscountCouponMapper.selectById(quanId);
+                    if (org.apache.commons.lang3.ObjectUtils.isNotEmpty(lifeDiscountCoupon)) {
+                        if (3 == lifeDiscountCoupon.getType()) {
+                            platFormCoupon = true;
+                        }
+                    }
+                }
+
+
                 //通过订单id查询中间表 如果该订单下所有劵都为已核销状态更改订单表状态为已核销
                 List<OrderCouponMiddle> couponMiddleList = orderCouponMiddleMapper.selectList(new LambdaQueryWrapper<OrderCouponMiddle>()
                         .eq(OrderCouponMiddle::getOrderId, lifeUserOrder.getId()));
@@ -297,11 +310,16 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
                 StoreInfo storeInfo = storeInfoMapper.selectOne(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId, lifeUserOrder.getStoreId()));
                 // 先将抽成比例转换为BigDecimal,再除以100
                 BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
-                        .divide(new BigDecimal(100));
+                        .divide(new BigDecimal("100"));
                 // 感觉有问题。HALF_UP有问题。 price 正常存储
-                BigDecimal commission = orderCouponMiddle.getPrice().multiply(new BigDecimal(100).multiply(commissionRate)).setScale(2, RoundingMode.HALF_UP);
-                BigDecimal money = orderCouponMiddle.getPrice().multiply(new BigDecimal(100)).subtract(commission);
-
+                BigDecimal commission = orderCouponMiddle.getPrice().multiply(new BigDecimal("100").multiply(commissionRate)).setScale(2, RoundingMode.HALF_UP);
+                // 如果使用了平台优惠券则需要加上平均优惠券价格
+                BigDecimal money = BigDecimal.ZERO;
+                if (platFormCoupon) {
+                    money = orderCouponMiddle.getPrice().add(orderCouponMiddle.getAvgDiscountCouponPrice()).multiply(new BigDecimal("100")).subtract(commission);
+                } else {
+                    money = orderCouponMiddle.getPrice().multiply(new BigDecimal("100")).subtract(commission);
+                }
                 // 插入收入明细表数据
                 StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
                 record.setStoreId(Integer.parseInt(storeId));
@@ -611,12 +629,12 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
         LocalTime now = LocalTime.now();
         int currentHour = now.getHour();
         // 验证输入的小时是否有效
-        if (buyUseStartTime < 0 || buyUseStartTime > 23 || buyUseEndTime < 0 || buyUseEndTime > 23) {
-            throw new IllegalArgumentException("小时必须在0-23之间");
+        if (buyUseStartTime < 0 || buyUseStartTime > 24 || buyUseEndTime < 0 || buyUseEndTime > 24) {
+            return R.fail("小时必须在0-23之间");
         }
         // 处理跨天的情况,例如22点到次日3点
         if (buyUseStartTime >= buyUseEndTime) {
-            if(currentHour<buyUseStartTime &&  currentHour>buyUseEndTime) {
+            if (currentHour < buyUseStartTime && currentHour > buyUseEndTime) {
                 return R.fail("该劵不在有效期内");
             }