From f5a352df9e40f98ec4ba43fcc0f280952decbe84 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期五, 12 九月 2025 17:06:42 +0800
Subject: [PATCH] 分享虚拟商品优惠劵

---
 framework/src/main/java/cn/lili/modules/lmk/service/impl/CouponVirtualServiceImpl.java |  131 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 131 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..a0906b9 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,45 @@
 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.goods.service.GoodsService;
 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.domain.vo.CouponVirtualVOInfo;
 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.COSUtil;
 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 +51,27 @@
  */
 @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;
+
+    private final GoodsService goodsService;
+
+    private final COSUtil cosUtil;
     /**
      * 娣诲姞
+     *
      * @param form
      * @return
      */
@@ -46,6 +84,7 @@
 
     /**
      * 淇敼
+     *
      * @param form
      * @return
      */
@@ -62,6 +101,7 @@
 
     /**
      * 鎵归噺鍒犻櫎
+     *
      * @param ids
      * @return
      */
@@ -73,6 +113,7 @@
 
     /**
      * id鍒犻櫎
+     *
      * @param id
      * @return
      */
@@ -84,6 +125,7 @@
 
     /**
      * 鍒嗛〉鏌ヨ
+     *
      * @param query
      * @return
      */
@@ -96,6 +138,7 @@
 
     /**
      * 鏍规嵁id鏌ユ壘
+     *
      * @param id
      * @return
      */
@@ -108,6 +151,7 @@
 
     /**
      * 鍒楄〃
+     *
      * @return
      */
     @Override
@@ -118,4 +162,91 @@
                 .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().data(cardInfo.getCouponId());
+        } 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();
+    }
+
+    @Override
+    public Result couponCardInfo(String cardId) {
+        CouponVirtual couponVirtual = this.getById(cardId);
+        if (couponVirtual == null) {
+            throw new ServiceException("褰撳墠璐墿鍗′笉瀛樺湪");
+        }
+        CouponVirtualVOInfo virtualVOInfo = new CouponVirtualVOInfo();
+        BeanUtils.copyProperties(couponVirtual, virtualVOInfo);
+
+        String goodsId = virtualVOInfo.getGoodsId();
+        String url = goodsService.getById(goodsId).getOriginal();
+        if (StringUtils.isNotBlank(url) && !url.contains("http")) {
+            virtualVOInfo.setGoodsUrl(cosUtil.getPreviewUrl(url));
+        }
+        return Result.ok().data(virtualVOInfo);
+    }
 }

--
Gitblit v1.8.0