下单锁定优惠券使用记录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.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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user