From f827be041253b7aef34196a432c625b9c4f6cd94 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期四, 11 九月 2025 16:51:41 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/send_coupon' into send_coupon

---
 framework/src/main/java/cn/lili/modules/lmk/service/impl/CouponVirtualServiceImpl.java |  107 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 107 insertions(+), 0 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/CouponVirtualServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/CouponVirtualServiceImpl.java
index d7a3acb..dc1a5f2 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/CouponVirtualServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/CouponVirtualServiceImpl.java
@@ -1,22 +1,42 @@
 package cn.lili.modules.lmk.service.impl;
 
 import cn.lili.base.Result;
+import cn.lili.common.exception.ServiceException;
+import cn.lili.common.security.AuthUser;
+import cn.lili.common.security.context.UserContext;
 import cn.lili.modules.lmk.domain.entity.CouponVirtual;
 import cn.lili.modules.lmk.domain.form.CouponVirtualForm;
 import cn.lili.modules.lmk.domain.query.CouponVirtualQuery;
 import cn.lili.modules.lmk.domain.vo.CouponVirtualVO;
 import cn.lili.modules.lmk.mapper.CouponVirtualMapper;
 import cn.lili.modules.lmk.service.CouponVirtualService;
+import cn.lili.modules.order.order.entity.dos.Order;
+import cn.lili.modules.order.order.entity.dos.OrderItem;
+import cn.lili.modules.order.order.entity.enums.ClaimStatusEnum;
+import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
+import cn.lili.modules.order.order.entity.enums.RefundStatusEnum;
+import cn.lili.modules.order.order.entity.enums.ShareStatusEnum;
+import cn.lili.modules.order.order.service.OrderItemService;
+import cn.lili.modules.order.order.service.OrderService;
+import cn.lili.modules.promotion.service.MemberCouponService;
 import cn.lili.utils.PageUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
 
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -28,12 +48,23 @@
  */
 @Service
 @RequiredArgsConstructor
+@Slf4j
 public class CouponVirtualServiceImpl extends ServiceImpl<CouponVirtualMapper, CouponVirtual> implements CouponVirtualService {
 
     private final CouponVirtualMapper couponVirtualMapper;
 
+    private final RedissonClient redissonClient;
+
+    private final static String LOCK_COUPON_VIRTUAL_CARD_ID = "lock_coupon_virtual_card_id:";
+
+    private final OrderItemService orderItemService;
+
+    private final OrderService orderService;
+
+    private final MemberCouponService memberCouponService;
     /**
      * 娣诲姞
+     *
      * @param form
      * @return
      */
@@ -46,6 +77,7 @@
 
     /**
      * 淇敼
+     *
      * @param form
      * @return
      */
@@ -62,6 +94,7 @@
 
     /**
      * 鎵归噺鍒犻櫎
+     *
      * @param ids
      * @return
      */
@@ -73,6 +106,7 @@
 
     /**
      * id鍒犻櫎
+     *
      * @param id
      * @return
      */
@@ -84,6 +118,7 @@
 
     /**
      * 鍒嗛〉鏌ヨ
+     *
      * @param query
      * @return
      */
@@ -96,6 +131,7 @@
 
     /**
      * 鏍规嵁id鏌ユ壘
+     *
      * @param id
      * @return
      */
@@ -108,6 +144,7 @@
 
     /**
      * 鍒楄〃
+     *
      * @return
      */
     @Override
@@ -118,4 +155,74 @@
                 .collect(Collectors.toList());
         return Result.ok().data(vos);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result tackCardById(String cardId) {
+        log.info("琚鍙栫殑绀煎搧鍗$殑id涓�--------------------------->{}",cardId);
+        AuthUser currentUser = UserContext.getCurrentUser();
+        if (currentUser == null) {
+            throw new ServiceException("褰撳墠鐢ㄦ埛娌℃湁鐧诲綍");
+        }
+        String userId = currentUser.getId();
+        String nickName = currentUser.getNickName();
+        RLock lock = null;
+        try {
+            lock = redissonClient.getLock(LOCK_COUPON_VIRTUAL_CARD_ID + cardId);
+            LambdaQueryWrapper<CouponVirtual> forUpdate = Wrappers.<CouponVirtual>lambdaQuery().eq(CouponVirtual::getId, cardId).last("FOR UPDATE");
+            CouponVirtual cardInfo = this.getOne(forUpdate);
+            if (ClaimStatusEnum.CLAIM.name().equals(cardInfo.getClaimStatus())) {
+                throw new ServiceException("褰撳墠璐墿鍗″凡缁忚棰嗗彇");
+            }
+            //鏍¢獙璁㈠崟鐘舵�佹槸鍚︽甯�
+            String orderNo = cardInfo.getOrderId();
+            if (StringUtils.isBlank(orderNo)) {
+                throw new ServiceException("褰撳墠璁㈠崟涓嶅瓨鍦ㄦ棤娉曢鍙�");
+            }
+            String itemOrderId = cardInfo.getItemOrderId();
+            Order order = orderService.getBySn(orderNo);
+            if (order == null) {
+                throw new ServiceException("褰撳墠璁㈠崟涓嶅瓨鍦ㄦ棤娉曢鍙�");
+            }
+            if (!OrderStatusEnum.COMPLETED.name().equals(order.getOrderStatus())) {
+                throw new ServiceException("璁㈠崟鐘舵�佸紓甯告棤娉曢鍙�");
+            }
+            OrderItem orderItem = orderItemService.getById(itemOrderId);
+            if (orderItem == null) {
+                throw new ServiceException("褰撳墠璁㈠崟涓嶅瓨鍦�");
+            }
+            String orderSn = orderItem.getOrderSn();
+            if (!orderNo.equals(orderSn)) {
+                throw new ServiceException("璁㈠崟鏃犳硶瀵瑰簲鏃犳硶棰嗗彇");
+            }
+            if (!RefundStatusEnum.NO_REFUND.name().equals(orderItem.getIsRefund())) {
+                throw new ServiceException("褰撳墠璁㈠崟宸查��娆炬棤娉曢鍙�");
+            }
+            //棰嗗彇瀵瑰簲鐨勪紭鎯犲嵎
+            memberCouponService.receiveCoupon(cardInfo.getCouponId(),userId , nickName);
+            cardInfo.setUserNickname(nickName);
+            cardInfo.setUserId(userId);
+            cardInfo.setClaimStatus(ClaimStatusEnum.CLAIM.name());
+            cardInfo.setClaimTime(new Date());
+            boolean b = this.updateById(cardInfo);
+            //鍘婚鍙栦紭鎯犲嵎
+            if (!b) {
+                throw new RuntimeException("棰嗗彇澶辫触");
+            }
+            return Result.ok("棰嗗彇鎴愬姛");
+        } finally {
+            assert lock != null;
+            if (lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+    }
+
+    @Override
+    public Result changShareStatus(String cardId) {
+        CouponVirtual couponVirtual = this.getById(cardId);
+        couponVirtual.setShareStatus(ShareStatusEnum.SHARE.name());
+        this.updateById(couponVirtual);
+        return Result.ok();
+    }
 }

--
Gitblit v1.8.0