From af63efdfd4b82e1efa995992768c2f283fa6d98f Mon Sep 17 00:00:00 2001
From: Cui Zhi Feng <7426394+wuxixiaocui@user.noreply.gitee.com>
Date: 星期三, 04 九月 2024 15:43:04 +0800
Subject: [PATCH] 优惠券使用

---
 src/main/java/com/mzl/flower/service/payment/OrderService.java |  104 ++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 73 insertions(+), 31 deletions(-)

diff --git a/src/main/java/com/mzl/flower/service/payment/OrderService.java b/src/main/java/com/mzl/flower/service/payment/OrderService.java
index ca0a23a..71d5a97 100644
--- a/src/main/java/com/mzl/flower/service/payment/OrderService.java
+++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java
@@ -40,9 +40,11 @@
 import com.mzl.flower.mapper.system.UserWechatMapper;
 import com.mzl.flower.mapper.warehouse.WarehouseLocationMapper;
 import com.mzl.flower.service.BaseService;
+import com.mzl.flower.service.coupon.CouponRecordService;
 import com.mzl.flower.service.flower.FlowerService;
 import com.mzl.flower.service.menber.MemberGrowthRecordService;
 import com.mzl.flower.service.point.CustomerPointService;
+import com.mzl.flower.service.point.PointGoodsService;
 import com.mzl.flower.service.system.CodeService;
 import com.mzl.flower.service.system.WeChatService;
 import com.mzl.flower.service.transport.TransportService;
@@ -147,47 +149,77 @@
     @Autowired
     private CustomerPointService customerPointService;
 
+    @Autowired
+    private PointGoodsService pointGoodsService;
+
+    @Autowired
+    private RedisLockService lockService;
+
+    @Autowired
+    private CouponRecordService couponRecordService;
+
     public void changeFlower2Cart(CartSaveDTO dto) {
         String userId = SecurityUtils.getUserId();
-        Cart c = cartMapper.selectOne(new QueryWrapper<Cart>()
-                .eq("create_by", userId).eq("flower_id", dto.getId()));
-        if (c == null) {
-            if (dto.getNum() <= 0) {
-                throw new ValidationException("数量不能小于等于0,请刷新页面重试");
-            }
-            c = new Cart();
-            c.setFlowerId(dto.getId());
-            c.setNum(dto.getNum());
-            c.create(userId);
+        String key = userId + "_" + dto.getId();
+        boolean lock = lockService.getObjectLock(RedisLockService.LOCK_KEY_CART_, key);
+        if(!lock){
+            return;
+        }
 
-            cartMapper.insert(c);
-        } else {
-            c.setNum(c.getNum() + dto.getNum());
-            c.update(userId);
-            if (c.getNum() <= 0) {
-                cartMapper.deleteById(c.getId());
+        try {
+            Cart c = cartMapper.selectOne(new QueryWrapper<Cart>()
+                    .eq("create_by", userId).eq("flower_id", dto.getId()));
+            if (c == null) {
+                if (dto.getNum() <= 0) {
+                    throw new ValidationException("数量不能小于等于0,请刷新页面重试");
+                }
+                c = new Cart();
+                c.setFlowerId(dto.getId());
+                c.setNum(dto.getNum());
+                c.create(userId);
+
+                cartMapper.insert(c);
             } else {
-                cartMapper.updateById(c);
+                c.setNum(c.getNum() + dto.getNum());
+                c.update(userId);
+                if (c.getNum() <= 0) {
+                    cartMapper.deleteById(c.getId());
+                } else {
+                    cartMapper.updateById(c);
+                }
             }
+        } finally {
+            lockService.releaseObjectLock(RedisLockService.LOCK_KEY_CART_, key);
         }
     }
 
     public void saveFlower2Cart(CartSaveDTO dto) {
         String userId = SecurityUtils.getUserId();
-        Cart c = cartMapper.selectOne(new QueryWrapper<Cart>()
-                .eq("create_by", userId).eq("flower_id", dto.getId()));
-        if (c == null) {
-            c = new Cart();
-            c.setFlowerId(dto.getId());
-            c.setNum(dto.getNum());
-            c.create(userId);
 
-            cartMapper.insert(c);
-        } else {
-            c.setNum(dto.getNum());
-            c.update(userId);
+        String key = userId + "_" + dto.getId();
+        boolean lock = lockService.getObjectLock(RedisLockService.LOCK_KEY_CART_, key);
+        if(!lock){
+            return;
+        }
 
-            cartMapper.updateById(c);
+        try {
+            Cart c = cartMapper.selectOne(new QueryWrapper<Cart>()
+                    .eq("create_by", userId).eq("flower_id", dto.getId()));
+            if (c == null) {
+                c = new Cart();
+                c.setFlowerId(dto.getId());
+                c.setNum(dto.getNum());
+                c.create(userId);
+
+                cartMapper.insert(c);
+            } else {
+                c.setNum(dto.getNum());
+                c.update(userId);
+
+                cartMapper.updateById(c);
+            }
+        } finally {
+            lockService.releaseObjectLock(RedisLockService.LOCK_KEY_CART_, key);
         }
     }
 
@@ -503,7 +535,12 @@
     }
 
     private void usePointGoods(String orderId, List<Long> goodsRecordIdList){
-        //TODO 使用积分商品兑换券
+        //使用积分商品兑换券
+        if(goodsRecordIdList != null && goodsRecordIdList.size() > 0){
+            for(Long grId : goodsRecordIdList){
+                pointGoodsService.useExchangeGoods(grId, orderId);
+            }
+        }
     }
 
     /**
@@ -527,7 +564,9 @@
 
     private CouponRecordDO useCouponRecord(String orderId, BigDecimal amount, String couponRecordId){
         if(StringUtils.isNotEmpty(couponRecordId)){
-            //TODO 优惠券使用和验证,如果不符合使用条件需要抛出异常。需调用优惠券使用方法
+            //优惠券使用和验证,如果不符合使用条件需要抛出异常。需调用优惠券使用方法
+            couponRecordService.useCoupon(couponRecordId, orderId, amount);
+            return couponRecordService.getCouponRecordById(couponRecordId);
         }
 
         return null;
@@ -949,6 +988,9 @@
 
         if(checkList != null && checkList.size() > 0){
             for(OrderItemCheck c : checkList){
+                if(Constants.CHECK_TYPE.replace.name().equals(c.getType())){
+                    continue;
+                }
                 totalAmount = totalAmount.subtract(getAmount(c.getDeductAmount()));
             }
         }

--
Gitblit v1.9.3