From 9816b81bd3e730ab605e0cb27562913f3f3b05d3 Mon Sep 17 00:00:00 2001
From: jieyuu <645634619@qq.com>
Date: Tue, 27 Aug 2024 16:52:54 +0800
Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E5=8D=95=E9=94=81=E5=AE=9A=E4=BC=98?=
=?UTF-8?q?=E6=83=A0=E5=88=B8=E4=BD=BF=E7=94=A8=E8=AE=B0=E5=BD=95RPC?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=88=9D=E6=AD=A5=E5=BC=80=E5=8F=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../net/jieyuu/enums/StockTaskStateEnum.java | 17 +++++
.../controller/CouponRecordController.java | 9 +++
.../net/jieyuu/mapper/CouponRecordMapper.java | 14 +++-
.../net/jieyuu/mapper/CouponTaskMapper.java | 12 +++-
.../request/LockCouponRecordRequest.java | 26 ++++++++
.../jieyuu/service/CouponRecordService.java | 13 +++-
.../service/impl/CouponRecordServiceImpl.java | 66 +++++++++++++++++--
.../resources/mapper/CouponRecordMapper.xml | 37 +++++++----
.../resources/mapper/CouponTaskMapper.xml | 33 ++++++++--
9 files changed, 199 insertions(+), 28 deletions(-)
create mode 100644 xdclass-common/src/main/java/net/jieyuu/enums/StockTaskStateEnum.java
create mode 100644 xdclass-coupon-service/src/main/java/net/jieyuu/request/LockCouponRecordRequest.java
diff --git a/xdclass-common/src/main/java/net/jieyuu/enums/StockTaskStateEnum.java b/xdclass-common/src/main/java/net/jieyuu/enums/StockTaskStateEnum.java
new file mode 100644
index 0000000..529694f
--- /dev/null
+++ b/xdclass-common/src/main/java/net/jieyuu/enums/StockTaskStateEnum.java
@@ -0,0 +1,17 @@
+package net.jieyuu.enums;
+
+public enum StockTaskStateEnum {
+ /**
+ * 锁定
+ */
+ LOCK,
+ /**
+ * 完成
+ */
+ FINISHED,
+ /**
+ * 取消
+ */
+ CANCEL;
+
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponRecordController.java b/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponRecordController.java
index de7be52..9bbd259 100644
--- a/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponRecordController.java
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/controller/CouponRecordController.java
@@ -4,6 +4,7 @@ package net.jieyuu.controller;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import net.jieyuu.enums.BizCodeEnum;
+import net.jieyuu.request.LockCouponRecordRequest;
import net.jieyuu.service.CouponRecordService;
import net.jieyuu.utils.JsonData;
import net.jieyuu.vo.CouponRecordVO;
@@ -47,5 +48,13 @@ public class CouponRecordController {
}
+ @ApiOperation("RPC-锁定优惠券记录")
+ @PostMapping("lock_records")
+ public JsonData lockCouponRecords(@ApiParam("锁定优惠券请求对象") @RequestBody LockCouponRecordRequest request) {
+
+ JsonData jsonData = couponRecordService.lockCouponRecords(request);
+ return JsonData.buildSuccess();
+ }
+
}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponRecordMapper.java b/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponRecordMapper.java
index 80258fc..e774b34 100644
--- a/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponRecordMapper.java
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponRecordMapper.java
@@ -2,10 +2,13 @@ package net.jieyuu.mapper;
import net.jieyuu.model.CouponRecordDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
/**
*
- * Mapper 接口
+ * Mapper 接口
*
*
* @author jieyuu
@@ -13,4 +16,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface CouponRecordMapper extends BaseMapper {
+ /**
+ * 批量更新优惠券使用记录
+ *
+ * @param id
+ * @param useState
+ * @param lockCouponRecordIds
+ * @return
+ */
+ int lockUseStateBatch(@Param("userId") Long id, @Param("useState")String useState, @Param("lockCouponRecordIds")List lockCouponRecordIds);
}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponTaskMapper.java b/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponTaskMapper.java
index b83ec7f..ffa4860 100644
--- a/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponTaskMapper.java
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/mapper/CouponTaskMapper.java
@@ -2,10 +2,13 @@ package net.jieyuu.mapper;
import net.jieyuu.model.CouponTaskDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
/**
*
- * Mapper 接口
+ * Mapper 接口
*
*
* @author jieyuu
@@ -13,4 +16,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface CouponTaskMapper extends BaseMapper {
+ /**
+ * 批量插入
+ *
+ * @param couponTaskDOList
+ * @return
+ */
+ int insertBatch(@Param("couponTaskList") List couponTaskDOList);
}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/request/LockCouponRecordRequest.java b/xdclass-coupon-service/src/main/java/net/jieyuu/request/LockCouponRecordRequest.java
new file mode 100644
index 0000000..efbb580
--- /dev/null
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/request/LockCouponRecordRequest.java
@@ -0,0 +1,26 @@
+package net.jieyuu.request;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@ApiModel(value = "优惠券锁定对象", description = "优惠券锁定对象")
+@Data
+public class LockCouponRecordRequest {
+
+ /**
+ * 优惠券记录id列表
+ */
+ @ApiModelProperty(value = "优惠券锁定数组", example = "[1,2,3]")
+ private List lockCouponRecordIds;
+
+ /**
+ * 订单号
+ */
+ @ApiModelProperty(value = "订单号", example = "32位uuid")
+ private String orderOutTradeNo;
+
+}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/service/CouponRecordService.java b/xdclass-coupon-service/src/main/java/net/jieyuu/service/CouponRecordService.java
index 21b275f..b7c3618 100644
--- a/xdclass-coupon-service/src/main/java/net/jieyuu/service/CouponRecordService.java
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/service/CouponRecordService.java
@@ -2,6 +2,8 @@ package net.jieyuu.service;
import net.jieyuu.model.CouponRecordDO;
import com.baomidou.mybatisplus.extension.service.IService;
+import net.jieyuu.request.LockCouponRecordRequest;
+import net.jieyuu.utils.JsonData;
import net.jieyuu.vo.CouponRecordVO;
import java.util.Map;
@@ -17,17 +19,26 @@ import java.util.Map;
public interface CouponRecordService extends IService {
/**
* 分页查询领券记录
+ *
* @param page
* @param size
* @return
*/
- public Mappage(int page, int size);
+ public Map page(int page, int size);
/**
* 根据id查询详情
+ *
* @param recordId
* @return
*/
CouponRecordVO findById(long recordId);
+ /**
+ * 锁定优惠券
+ *
+ * @param recordRequest
+ * @return
+ */
+ JsonData lockCouponRecords(LockCouponRecordRequest recordRequest);
}
diff --git a/xdclass-coupon-service/src/main/java/net/jieyuu/service/impl/CouponRecordServiceImpl.java b/xdclass-coupon-service/src/main/java/net/jieyuu/service/impl/CouponRecordServiceImpl.java
index 65fccc1..e51f5ea 100644
--- a/xdclass-coupon-service/src/main/java/net/jieyuu/service/impl/CouponRecordServiceImpl.java
+++ b/xdclass-coupon-service/src/main/java/net/jieyuu/service/impl/CouponRecordServiceImpl.java
@@ -3,18 +3,30 @@ package net.jieyuu.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import net.jieyuu.config.InterceptorConfig;
+import net.jieyuu.enums.BizCodeEnum;
+import net.jieyuu.enums.CouponStateEnum;
+import net.jieyuu.enums.StockTaskStateEnum;
+import net.jieyuu.exception.BizException;
import net.jieyuu.interceptor.LoginInterceptor;
+import net.jieyuu.mapper.CouponTaskMapper;
import net.jieyuu.model.CouponRecordDO;
import net.jieyuu.mapper.CouponRecordMapper;
+import net.jieyuu.model.CouponTaskDO;
import net.jieyuu.model.LoginUser;
+import net.jieyuu.request.LockCouponRecordRequest;
import net.jieyuu.service.CouponRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import net.jieyuu.utils.JsonData;
import net.jieyuu.vo.CouponRecordVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.util.Date;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -27,10 +39,13 @@ import java.util.stream.Collectors;
* @since 2024-07-15
*/
@Service
+@Slf4j
public class CouponRecordServiceImpl extends ServiceImpl implements CouponRecordService {
@Autowired
private CouponRecordMapper couponRecordMapper;
+ @Autowired
+ private CouponTaskMapper couponTaskMapper;
@Override
public Map page(int page, int size) {
@@ -38,9 +53,7 @@ public class CouponRecordServiceImpl extends ServiceImpl pageInfo = new Page<>(page, size);
- IPage couponDOIPage = couponRecordMapper.selectPage(pageInfo, new QueryWrapper()
- .eq("user_id", loginUser.getId())
- .orderByDesc("create_time"));
+ IPage couponDOIPage = couponRecordMapper.selectPage(pageInfo, new QueryWrapper().eq("user_id", loginUser.getId()).orderByDesc("create_time"));
Map pageMap = new HashMap<>(3);
@@ -54,9 +67,7 @@ public class CouponRecordServiceImpl extends ServiceImpl()
- .eq("id", recordId)
- .eq("user_id", loginUser.getId()));
+ CouponRecordDO couponRecordDO = couponRecordMapper.selectOne(new QueryWrapper().eq("id", recordId).eq("user_id", loginUser.getId()));
if (couponRecordDO == null) {
return null;
@@ -65,6 +76,49 @@ public class CouponRecordServiceImpl extends ServiceImpl lockCouponRecordIds = recordRequest.getLockCouponRecordIds();
+
+ int updateRows = couponRecordMapper.lockUseStateBatch(loginUser.getId(), CouponStateEnum.USED.name(), lockCouponRecordIds);
+
+ List couponTaskDOList = lockCouponRecordIds.stream().map(obj -> {
+ CouponTaskDO couponTaskDO = new CouponTaskDO();
+
+ couponTaskDO.setOutTradeNo(orderOutTradeNo);
+ couponTaskDO.setCouponRecordId(obj);
+ couponTaskDO.setCreateTime(new Date());
+ couponTaskDO.setLockState(StockTaskStateEnum.LOCK.name());
+ return couponTaskDO;
+ }).collect(Collectors.toList());
+
+ int insertRows = couponTaskMapper.insertBatch(couponTaskDOList);
+ log.info("优惠券记录锁定updateRows={}", updateRows);
+ log.info("新增优惠券记录task insertRows={}", insertRows);
+
+ //mq延迟队列投递
+ if (insertRows == couponTaskDOList.size() && insertRows == updateRows) {
+ //发送延迟消息 TODO
+
+ return JsonData.buildSuccess();
+ } else {
+ throw new BizException(BizCodeEnum.COUPON_RECORD_LOCK_FAIL);
+ }
+ }
+
private CouponRecordVO beanProcess(CouponRecordDO couponRecordDO) {
CouponRecordVO couponRecordVO = new CouponRecordVO();
BeanUtils.copyProperties(couponRecordDO, couponRecordVO);
diff --git a/xdclass-coupon-service/src/main/resources/mapper/CouponRecordMapper.xml b/xdclass-coupon-service/src/main/resources/mapper/CouponRecordMapper.xml
index 9c9e85e..9b6c233 100644
--- a/xdclass-coupon-service/src/main/resources/mapper/CouponRecordMapper.xml
+++ b/xdclass-coupon-service/src/main/resources/mapper/CouponRecordMapper.xml
@@ -4,23 +4,34 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
- id, coupon_id, create_time, use_state, user_id, user_name, coupon_title, start_time, end_time, order_id, price, condition_price
+ id
+ , coupon_id, create_time, use_state, user_id, user_name, coupon_title, start_time, end_time, order_id, price, condition_price
+
+
+ update coupon_record
+ set use_state =#{useState} where user_id = #{userId} and use_state = 'NEW'
+ and id in
+ #{id}
+
+
+
diff --git a/xdclass-coupon-service/src/main/resources/mapper/CouponTaskMapper.xml b/xdclass-coupon-service/src/main/resources/mapper/CouponTaskMapper.xml
index 8ad76b3..4759454 100644
--- a/xdclass-coupon-service/src/main/resources/mapper/CouponTaskMapper.xml
+++ b/xdclass-coupon-service/src/main/resources/mapper/CouponTaskMapper.xml
@@ -4,16 +4,37 @@
-
-
-
-
-
+
+
+
+
+
- id, coupon_record_id, create_time, out_trade_no, lock_state
+ id
+ , coupon_record_id, create_time, out_trade_no, lock_state
+
+
+ coupon_record_id
+ , create_time, out_trade_no, lock_state
+
+
+
+
+ insert into coupon_task()
+ values
+
+ (
+ #{item.couponRecordId},
+ #{item.createTime},
+ #{item.outTradeNo},
+ #{item.lockState}
+ )
+
+
+