From 127a0f6ab38866d0b05b32d2102cc85638a06e62 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期四, 11 九月 2025 15:59:55 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' 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