下单锁定优惠券使用记录RPC接口初步开发

This commit is contained in:
jieyuu 2024-08-27 16:52:54 +08:00
parent 19df3331c6
commit 9816b81bd3
9 changed files with 199 additions and 28 deletions

View File

@ -0,0 +1,17 @@
package net.jieyuu.enums;
public enum StockTaskStateEnum {
/**
* 锁定
*/
LOCK,
/**
* 完成
*/
FINISHED,
/**
* 取消
*/
CANCEL;
}

View File

@ -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();
}
}

View File

@ -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;
/**
* <p>
* Mapper 接口
* Mapper 接口
* </p>
*
* @author jieyuu
@ -13,4 +16,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface CouponRecordMapper extends BaseMapper<CouponRecordDO> {
/**
* 批量更新优惠券使用记录
*
* @param id
* @param useState
* @param lockCouponRecordIds
* @return
*/
int lockUseStateBatch(@Param("userId") Long id, @Param("useState")String useState, @Param("lockCouponRecordIds")List<Long> lockCouponRecordIds);
}

View File

@ -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;
/**
* <p>
* Mapper 接口
* Mapper 接口
* </p>
*
* @author jieyuu
@ -13,4 +16,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface CouponTaskMapper extends BaseMapper<CouponTaskDO> {
/**
* 批量插入
*
* @param couponTaskDOList
* @return
*/
int insertBatch(@Param("couponTaskList") List<CouponTaskDO> couponTaskDOList);
}

View File

@ -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<Long> lockCouponRecordIds;
/**
* 订单号
*/
@ApiModelProperty(value = "订单号", example = "32位uuid")
private String orderOutTradeNo;
}

View File

@ -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<CouponRecordDO> {
/**
* 分页查询领券记录
*
* @param page
* @param size
* @return
*/
public Map<String, Object>page(int page, int size);
public Map<String, Object> page(int page, int size);
/**
* 根据id查询详情
*
* @param recordId
* @return
*/
CouponRecordVO findById(long recordId);
/**
* 锁定优惠券
*
* @param recordRequest
* @return
*/
JsonData lockCouponRecords(LockCouponRecordRequest recordRequest);
}

View File

@ -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<CouponRecordMapper, CouponRecordDO> implements CouponRecordService {
@Autowired
private CouponRecordMapper couponRecordMapper;
@Autowired
private CouponTaskMapper couponTaskMapper;
@Override
public Map<String, Object> page(int page, int size) {
@ -38,9 +53,7 @@ public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, Cou
Page<CouponRecordDO> pageInfo = new Page<>(page, size);
IPage<CouponRecordDO> couponDOIPage = couponRecordMapper.selectPage(pageInfo, new QueryWrapper<CouponRecordDO>()
.eq("user_id", loginUser.getId())
.orderByDesc("create_time"));
IPage<CouponRecordDO> couponDOIPage = couponRecordMapper.selectPage(pageInfo, new QueryWrapper<CouponRecordDO>().eq("user_id", loginUser.getId()).orderByDesc("create_time"));
Map<String, Object> pageMap = new HashMap<>(3);
@ -54,9 +67,7 @@ public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, Cou
@Override
public CouponRecordVO findById(long recordId) {
LoginUser loginUser = LoginInterceptor.threadLocal.get();
CouponRecordDO couponRecordDO = couponRecordMapper.selectOne(new QueryWrapper<CouponRecordDO>()
.eq("id", recordId)
.eq("user_id", loginUser.getId()));
CouponRecordDO couponRecordDO = couponRecordMapper.selectOne(new QueryWrapper<CouponRecordDO>().eq("id", recordId).eq("user_id", loginUser.getId()));
if (couponRecordDO == null) {
return null;
@ -65,6 +76,49 @@ public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, Cou
return beanProcess(couponRecordDO);
}
/**
* 锁定优惠券
* 1) 锁定优惠券信息
* 2) task表插入信息
* 3) 发送延迟消息
*
* @param recordRequest
* @return
*/
@Override
public JsonData lockCouponRecords(LockCouponRecordRequest recordRequest) {
LoginUser loginUser = LoginInterceptor.threadLocal.get();
// 查询是否存在
String orderOutTradeNo = recordRequest.getOrderOutTradeNo();
List<Long> lockCouponRecordIds = recordRequest.getLockCouponRecordIds();
int updateRows = couponRecordMapper.lockUseStateBatch(loginUser.getId(), CouponStateEnum.USED.name(), lockCouponRecordIds);
List<CouponTaskDO> 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);

View File

@ -4,23 +4,34 @@
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="net.jieyuu.model.CouponRecordDO">
<id column="id" property="id" />
<result column="coupon_id" property="couponId" />
<result column="create_time" property="createTime" />
<result column="use_state" property="useState" />
<result column="user_id" property="userId" />
<result column="user_name" property="userName" />
<result column="coupon_title" property="couponTitle" />
<result column="start_time" property="startTime" />
<result column="end_time" property="endTime" />
<result column="order_id" property="orderId" />
<result column="price" property="price" />
<result column="condition_price" property="conditionPrice" />
<id column="id" property="id"/>
<result column="coupon_id" property="couponId"/>
<result column="create_time" property="createTime"/>
<result column="use_state" property="useState"/>
<result column="user_id" property="userId"/>
<result column="user_name" property="userName"/>
<result column="coupon_title" property="couponTitle"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
<result column="order_id" property="orderId"/>
<result column="price" property="price"/>
<result column="condition_price" property="conditionPrice"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
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
</sql>
<!-- 批量更新优惠券 -->
<update id="lockUseStateBatch">
update coupon_record
set use_state =#{useState} where user_id = #{userId} and use_state = 'NEW'
and id in
<foreach collection="lockCouponRecordIds"
index="index" item="i" separator="," open="(" close=")">#{id}
</foreach>
</update>
</mapper>

View File

@ -4,16 +4,37 @@
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="net.jieyuu.model.CouponTaskDO">
<id column="id" property="id" />
<result column="coupon_record_id" property="couponRecordId" />
<result column="create_time" property="createTime" />
<result column="out_trade_no" property="outTradeNo" />
<result column="lock_state" property="lockState" />
<id column="id" property="id"/>
<result column="coupon_record_id" property="couponRecordId"/>
<result column="create_time" property="createTime"/>
<result column="out_trade_no" property="outTradeNo"/>
<result column="lock_state" property="lockState"/>
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, coupon_record_id, create_time, out_trade_no, lock_state
id
, coupon_record_id, create_time, out_trade_no, lock_state
</sql>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List_NO_Id">
coupon_record_id
, create_time, out_trade_no, lock_state
</sql>
<!-- 批量插入 -->
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
insert into coupon_task(<include refid="Base_Column_List_NO_Id"></include>)
values
<foreach collection="couponTaskList" item="item" index="index" separator=",">
(
#{item.couponRecordId},
#{item.createTime},
#{item.outTradeNo},
#{item.lockState}
)
</foreach>
</insert>
</mapper>