下单锁定优惠券使用记录RPC接口初步开发
This commit is contained in:
parent
19df3331c6
commit
9816b81bd3
@ -0,0 +1,17 @@
|
|||||||
|
package net.jieyuu.enums;
|
||||||
|
|
||||||
|
public enum StockTaskStateEnum {
|
||||||
|
/**
|
||||||
|
* 锁定
|
||||||
|
*/
|
||||||
|
LOCK,
|
||||||
|
/**
|
||||||
|
* 完成
|
||||||
|
*/
|
||||||
|
FINISHED,
|
||||||
|
/**
|
||||||
|
* 取消
|
||||||
|
*/
|
||||||
|
CANCEL;
|
||||||
|
|
||||||
|
}
|
@ -4,6 +4,7 @@ package net.jieyuu.controller;
|
|||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import io.swagger.annotations.ApiParam;
|
import io.swagger.annotations.ApiParam;
|
||||||
import net.jieyuu.enums.BizCodeEnum;
|
import net.jieyuu.enums.BizCodeEnum;
|
||||||
|
import net.jieyuu.request.LockCouponRecordRequest;
|
||||||
import net.jieyuu.service.CouponRecordService;
|
import net.jieyuu.service.CouponRecordService;
|
||||||
import net.jieyuu.utils.JsonData;
|
import net.jieyuu.utils.JsonData;
|
||||||
import net.jieyuu.vo.CouponRecordVO;
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,6 +2,9 @@ package net.jieyuu.mapper;
|
|||||||
|
|
||||||
import net.jieyuu.model.CouponRecordDO;
|
import net.jieyuu.model.CouponRecordDO;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@ -13,4 +16,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
*/
|
*/
|
||||||
public interface CouponRecordMapper extends BaseMapper<CouponRecordDO> {
|
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);
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,9 @@ package net.jieyuu.mapper;
|
|||||||
|
|
||||||
import net.jieyuu.model.CouponTaskDO;
|
import net.jieyuu.model.CouponTaskDO;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@ -13,4 +16,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
*/
|
*/
|
||||||
public interface CouponTaskMapper extends BaseMapper<CouponTaskDO> {
|
public interface CouponTaskMapper extends BaseMapper<CouponTaskDO> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量插入
|
||||||
|
*
|
||||||
|
* @param couponTaskDOList
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int insertBatch(@Param("couponTaskList") List<CouponTaskDO> couponTaskDOList);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -2,6 +2,8 @@ package net.jieyuu.service;
|
|||||||
|
|
||||||
import net.jieyuu.model.CouponRecordDO;
|
import net.jieyuu.model.CouponRecordDO;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import net.jieyuu.request.LockCouponRecordRequest;
|
||||||
|
import net.jieyuu.utils.JsonData;
|
||||||
import net.jieyuu.vo.CouponRecordVO;
|
import net.jieyuu.vo.CouponRecordVO;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -17,17 +19,26 @@ import java.util.Map;
|
|||||||
public interface CouponRecordService extends IService<CouponRecordDO> {
|
public interface CouponRecordService extends IService<CouponRecordDO> {
|
||||||
/**
|
/**
|
||||||
* 分页查询领券记录
|
* 分页查询领券记录
|
||||||
|
*
|
||||||
* @param page
|
* @param page
|
||||||
* @param size
|
* @param size
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Map<String, Object>page(int page, int size);
|
public Map<String, Object> page(int page, int size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据id查询详情
|
* 根据id查询详情
|
||||||
|
*
|
||||||
* @param recordId
|
* @param recordId
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
CouponRecordVO findById(long recordId);
|
CouponRecordVO findById(long recordId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 锁定优惠券
|
||||||
|
*
|
||||||
|
* @param recordRequest
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
JsonData lockCouponRecords(LockCouponRecordRequest recordRequest);
|
||||||
}
|
}
|
||||||
|
@ -3,18 +3,30 @@ package net.jieyuu.service.impl;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
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.interceptor.LoginInterceptor;
|
||||||
|
import net.jieyuu.mapper.CouponTaskMapper;
|
||||||
import net.jieyuu.model.CouponRecordDO;
|
import net.jieyuu.model.CouponRecordDO;
|
||||||
import net.jieyuu.mapper.CouponRecordMapper;
|
import net.jieyuu.mapper.CouponRecordMapper;
|
||||||
|
import net.jieyuu.model.CouponTaskDO;
|
||||||
import net.jieyuu.model.LoginUser;
|
import net.jieyuu.model.LoginUser;
|
||||||
|
import net.jieyuu.request.LockCouponRecordRequest;
|
||||||
import net.jieyuu.service.CouponRecordService;
|
import net.jieyuu.service.CouponRecordService;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import net.jieyuu.utils.JsonData;
|
||||||
import net.jieyuu.vo.CouponRecordVO;
|
import net.jieyuu.vo.CouponRecordVO;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -27,10 +39,13 @@ import java.util.stream.Collectors;
|
|||||||
* @since 2024-07-15
|
* @since 2024-07-15
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
|
@Slf4j
|
||||||
public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, CouponRecordDO> implements CouponRecordService {
|
public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, CouponRecordDO> implements CouponRecordService {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CouponRecordMapper couponRecordMapper;
|
private CouponRecordMapper couponRecordMapper;
|
||||||
|
@Autowired
|
||||||
|
private CouponTaskMapper couponTaskMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> page(int page, int size) {
|
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);
|
Page<CouponRecordDO> pageInfo = new Page<>(page, size);
|
||||||
|
|
||||||
IPage<CouponRecordDO> couponDOIPage = couponRecordMapper.selectPage(pageInfo, new QueryWrapper<CouponRecordDO>()
|
IPage<CouponRecordDO> couponDOIPage = couponRecordMapper.selectPage(pageInfo, new QueryWrapper<CouponRecordDO>().eq("user_id", loginUser.getId()).orderByDesc("create_time"));
|
||||||
.eq("user_id", loginUser.getId())
|
|
||||||
.orderByDesc("create_time"));
|
|
||||||
|
|
||||||
Map<String, Object> pageMap = new HashMap<>(3);
|
Map<String, Object> pageMap = new HashMap<>(3);
|
||||||
|
|
||||||
@ -54,9 +67,7 @@ public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, Cou
|
|||||||
@Override
|
@Override
|
||||||
public CouponRecordVO findById(long recordId) {
|
public CouponRecordVO findById(long recordId) {
|
||||||
LoginUser loginUser = LoginInterceptor.threadLocal.get();
|
LoginUser loginUser = LoginInterceptor.threadLocal.get();
|
||||||
CouponRecordDO couponRecordDO = couponRecordMapper.selectOne(new QueryWrapper<CouponRecordDO>()
|
CouponRecordDO couponRecordDO = couponRecordMapper.selectOne(new QueryWrapper<CouponRecordDO>().eq("id", recordId).eq("user_id", loginUser.getId()));
|
||||||
.eq("id", recordId)
|
|
||||||
.eq("user_id", loginUser.getId()));
|
|
||||||
|
|
||||||
if (couponRecordDO == null) {
|
if (couponRecordDO == null) {
|
||||||
return null;
|
return null;
|
||||||
@ -65,6 +76,49 @@ public class CouponRecordServiceImpl extends ServiceImpl<CouponRecordMapper, Cou
|
|||||||
return beanProcess(couponRecordDO);
|
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) {
|
private CouponRecordVO beanProcess(CouponRecordDO couponRecordDO) {
|
||||||
CouponRecordVO couponRecordVO = new CouponRecordVO();
|
CouponRecordVO couponRecordVO = new CouponRecordVO();
|
||||||
BeanUtils.copyProperties(couponRecordDO, couponRecordVO);
|
BeanUtils.copyProperties(couponRecordDO, couponRecordVO);
|
||||||
|
@ -4,23 +4,34 @@
|
|||||||
|
|
||||||
<!-- 通用查询映射结果 -->
|
<!-- 通用查询映射结果 -->
|
||||||
<resultMap id="BaseResultMap" type="net.jieyuu.model.CouponRecordDO">
|
<resultMap id="BaseResultMap" type="net.jieyuu.model.CouponRecordDO">
|
||||||
<id column="id" property="id" />
|
<id column="id" property="id"/>
|
||||||
<result column="coupon_id" property="couponId" />
|
<result column="coupon_id" property="couponId"/>
|
||||||
<result column="create_time" property="createTime" />
|
<result column="create_time" property="createTime"/>
|
||||||
<result column="use_state" property="useState" />
|
<result column="use_state" property="useState"/>
|
||||||
<result column="user_id" property="userId" />
|
<result column="user_id" property="userId"/>
|
||||||
<result column="user_name" property="userName" />
|
<result column="user_name" property="userName"/>
|
||||||
<result column="coupon_title" property="couponTitle" />
|
<result column="coupon_title" property="couponTitle"/>
|
||||||
<result column="start_time" property="startTime" />
|
<result column="start_time" property="startTime"/>
|
||||||
<result column="end_time" property="endTime" />
|
<result column="end_time" property="endTime"/>
|
||||||
<result column="order_id" property="orderId" />
|
<result column="order_id" property="orderId"/>
|
||||||
<result column="price" property="price" />
|
<result column="price" property="price"/>
|
||||||
<result column="condition_price" property="conditionPrice" />
|
<result column="condition_price" property="conditionPrice"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<!-- 通用查询结果列 -->
|
<!-- 通用查询结果列 -->
|
||||||
<sql id="Base_Column_List">
|
<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>
|
</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>
|
</mapper>
|
||||||
|
@ -4,16 +4,37 @@
|
|||||||
|
|
||||||
<!-- 通用查询映射结果 -->
|
<!-- 通用查询映射结果 -->
|
||||||
<resultMap id="BaseResultMap" type="net.jieyuu.model.CouponTaskDO">
|
<resultMap id="BaseResultMap" type="net.jieyuu.model.CouponTaskDO">
|
||||||
<id column="id" property="id" />
|
<id column="id" property="id"/>
|
||||||
<result column="coupon_record_id" property="couponRecordId" />
|
<result column="coupon_record_id" property="couponRecordId"/>
|
||||||
<result column="create_time" property="createTime" />
|
<result column="create_time" property="createTime"/>
|
||||||
<result column="out_trade_no" property="outTradeNo" />
|
<result column="out_trade_no" property="outTradeNo"/>
|
||||||
<result column="lock_state" property="lockState" />
|
<result column="lock_state" property="lockState"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<!-- 通用查询结果列 -->
|
<!-- 通用查询结果列 -->
|
||||||
<sql id="Base_Column_List">
|
<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>
|
||||||
|
|
||||||
|
<!-- 通用查询结果列 -->
|
||||||
|
<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>
|
</mapper>
|
||||||
|
Loading…
Reference in New Issue
Block a user