From 0381fd4ab5cd89328601dc1c4553ff74ebfa97b4 Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Tue, 4 Mar 2025 15:20:52 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=90=E5=88=B6=E7=94=A8=E6=88=B7=E4=B8=8B?= =?UTF-8?q?=E5=8D=95=E9=A2=91=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OrdersServiceImpl.java | 15 +++-- .../modules/redisService/RedisService.java | 12 ++++ .../redisService/impl/RedisServiceImpl.java | 14 ++++ src/test/java/com/sqx/Tets.java | 65 ++++++++++++++++++- 4 files changed, 99 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java b/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java index 8ee40531..09fee37f 100644 --- a/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java +++ b/src/main/java/com/sqx/modules/orders/service/impl/OrdersServiceImpl.java @@ -30,8 +30,6 @@ import com.sqx.modules.course.entity.CourseDetails; import com.sqx.modules.course.entity.CourseUser; import com.sqx.modules.course.service.CourseDetailsService; import com.sqx.modules.course.service.CourseUserService; -import com.sqx.modules.invite.service.InviteMoneyService; -import com.sqx.modules.invite.service.InviteService; import com.sqx.modules.orders.dao.OrdersDao; import com.sqx.modules.orders.dto.SummaryDTO; import com.sqx.modules.orders.entity.Orders; @@ -43,6 +41,7 @@ import com.sqx.modules.pay.entity.CashOut; import com.sqx.modules.pay.entity.PayDetails; import com.sqx.modules.pay.service.DyService; import com.sqx.modules.pay.service.WxService; +import com.sqx.modules.redisService.RedisService; import com.sqx.modules.sys.dao.SysUserDao; import com.sqx.modules.sys.entity.SysUserEntity; import com.sqx.modules.utils.AliPayOrderUtil; @@ -88,10 +87,6 @@ public class OrdersServiceImpl extends ServiceImpl implements @Autowired private UserService userService; @Autowired - private InviteService inviteService; - @Autowired - private InviteMoneyService inviteMoneyService; - @Autowired private DyService dyService; @Autowired private CourseDetailsDao courseDetailsDao; @@ -106,6 +101,9 @@ public class OrdersServiceImpl extends ServiceImpl implements @Autowired private PayDetailsDao payDetailsDao; + @Autowired + private RedisService redisService; + private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true); @@ -262,6 +260,11 @@ public class OrdersServiceImpl extends ServiceImpl implements @Override public Result insertCourseOrders(Long courseId, Long courseDetailsId, Long userId) { log.info("生成商品订单信息接口入参为:{},{}", courseId, userId); + + if (!redisService.getUserCanCreateOrder(userId)) { + return Result.error("操作过于频繁,请稍后再试!"); + } + redisService.setUserCanCreateOrder(userId); UserEntity userEntity = userService.getById(userId); if (userEntity == null) { throw new SqxException("用户不存在"); diff --git a/src/main/java/com/sqx/modules/redisService/RedisService.java b/src/main/java/com/sqx/modules/redisService/RedisService.java index a81dc759..3a485492 100644 --- a/src/main/java/com/sqx/modules/redisService/RedisService.java +++ b/src/main/java/com/sqx/modules/redisService/RedisService.java @@ -35,4 +35,16 @@ public interface RedisService { void removeCanCashFlag(Long userId); + /** + * 设置用户上次创建订单时间 + * @param userId 用户id + */ + void setUserCanCreateOrder(Long userId); + + /** + * 判断用户是否可以创建订单 30s 内只能创建一次订单 + * @param userId 用户id + */ + boolean getUserCanCreateOrder(Long userId); + } diff --git a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java index be06f1b2..a262ac4e 100644 --- a/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java +++ b/src/main/java/com/sqx/modules/redisService/impl/RedisServiceImpl.java @@ -361,4 +361,18 @@ public class RedisServiceImpl implements RedisService { Set keys = redisTemplate.keys("createOrder:" + userId + ":*"); return keys != null && keys.size() > 22; } + + @Override + public void setUserCanCreateOrder(Long userId) { + String key = "user:canCreateOrder:" + userId; + redisTemplate.opsForValue().set(key, "1", 30, TimeUnit.SECONDS); + } + + @Override + public boolean getUserCanCreateOrder(Long userId) { + String key = "user:canCreateOrder:" + userId; + String s = redisTemplate.opsForValue().get(key); + return StrUtil.isBlank(s); + } + } diff --git a/src/test/java/com/sqx/Tets.java b/src/test/java/com/sqx/Tets.java index aca25da4..c3036ee7 100644 --- a/src/test/java/com/sqx/Tets.java +++ b/src/test/java/com/sqx/Tets.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.sqx.common.utils.Result; import com.sqx.modules.app.dao.UserDao; import com.sqx.modules.app.dao.UserMoneyDao; import com.sqx.modules.app.dao.UserMoneyDetailsDao; @@ -25,6 +26,7 @@ import com.sqx.modules.pay.dao.CashOutDao; import com.sqx.modules.pay.dao.PayDetailsDao; import com.sqx.modules.pay.entity.PayDetails; import com.sqx.modules.pay.service.PayDetailsService; +import com.sqx.modules.redisService.RedisService; import com.sqx.modules.sys.service.SysUserService; import org.junit.jupiter.api.Test; import org.slf4j.Logger; @@ -42,7 +44,7 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; -@ActiveProfiles("pay") +@ActiveProfiles("test") @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class Tets { private static final Logger log = LoggerFactory.getLogger(Tets.class); @@ -74,6 +76,67 @@ public class Tets { @Autowired private OrdersService ordersService; + @Autowired + private RedisService redisService; + + @Test + public void testRedis2() { + Result result = ordersService.insertCourseOrders(1L, 1L, 22L); + System.out.println(result); + + try { + Thread.sleep(3 * 1000); + + result = ordersService.insertCourseOrders(1L, 1L, 22L); + System.out.println(result); + + Thread.sleep(30 * 1000); + + result = ordersService.insertCourseOrders(1L, 1L, 22L); + System.out.println(result); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + @Test + public void testRedis() { + Long userId = 1221L; + boolean createOrder = redisService.getUserCanCreateOrder(userId); + System.out.println(createOrder); + if (!createOrder) { + System.out.println("用户不能创建订单"); + } else { + System.out.println("用户可以创建订单"); + } + + redisService.setUserCanCreateOrder(userId); + + createOrder = redisService.getUserCanCreateOrder(userId); + System.out.println(createOrder); + if (!createOrder) { + System.out.println("用户不能创建订单"); + } else { + System.out.println("用户可以创建订单"); + } + + + try { + Thread.sleep(31 * 1000); + + createOrder = redisService.getUserCanCreateOrder(userId); + System.out.println(createOrder); + + if (!createOrder) { + System.out.println("用户不能创建订单"); + } else { + System.out.println("用户可以创建订单"); + } + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + @Test public void testOrder() { String orderNo = "70ae4e2707834bad8f06c9555dbf2528";