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} + ) + + +