LockCouponRecordRequest
 @ApiModel(value = "优惠券锁定对象",description = "优惠券锁定对象")
@Data
public class LockCouponRecordRequest {
    /**
     * 优惠券记录id列表
     */
    @ApiModelProperty(value = "优惠券记录id列表",example = "[1,2,3]")
    private List<Long> lockCouponRecordIds;
    /**
     * 订单号
     */
    @ApiModelProperty(value = "订单号",example = "3234fw234rfd232")
    private String orderOutTradeNo;
}
 Controller
     @ApiOperation("rpc-锁定,优惠券记录")
    @PostMapping("lock_records")
    public JsonData lockCouponRecords(@ApiParam("锁定优惠券请求对象") @RequestBody LockCouponRecordRequest recordRequest){
        JsonData jsonData = couponRecordService.lockCouponRecords(recordRequest);
        return jsonData;
    } Service
     /**
     * 锁定优惠券
     * @param recordRequest
     * @return
     */
    JsonData lockCouponRecords(LockCouponRecordRequest recordRequest); CouponRecordServiceImpl
  /**
     * 锁定优惠券
     *
     * 1)锁定优惠券记录
     * 2)task表插入记录
     * 3)发送延迟消息
     *
     * @param recordRequest
     * @return
     */
    @Override
    public JsonData lockCouponRecords(LockCouponRecordRequest recordRequest) {
        LoginUser loginUser = LoginInterceptor.threadLocal.get();
        //订单号
        String orderOutTradeNo = recordRequest.getOrderOutTradeNo();
        //锁定的优惠券ID  可能不止一张
        List<Long> lockCouponRecordIds = recordRequest.getLockCouponRecordIds();
        //锁定优惠券 (用户id,更新成什么,更新的id)
        int updateRows = couponRecordMapper.lockUseStateBatch(loginUser.getId(), CouponStateEnum.USED.name(),lockCouponRecordIds);
        List<CouponTaskDO> couponTaskDOList =  lockCouponRecordIds.stream().map(obj->{
            CouponTaskDO couponTaskDO = new CouponTaskDO();
            couponTaskDO.setCreateTime(new Date());
            couponTaskDO.setOutTradeNo(orderOutTradeNo);
            couponTaskDO.setCouponRecordId(obj);
            couponTaskDO.setLockState(StockTaskStateEnum.LOCK.name());
            return couponTaskDO;
        }).collect(Collectors.toList());
        int insertRows = couponTaskMapper.insertBatch(couponTaskDOList);
        log.info("优惠券记录锁定updateRows={}",updateRows);
        log.info("新增优惠券记录task insertRows={}",insertRows);
        if(lockCouponRecordIds.size() == insertRows && insertRows==updateRows){
            //发送延迟消息  TODO
            return JsonData.buildSuccess();
        }else {
            throw new BizException(BizCodeEnum.COUPON_RECORD_LOCK_FAIL);
        }
    } 需要用到的类方法
    /**
     * 批量插入
     * @param couponTaskDOList
     * @return
     */
    int insertBatch(@Param("couponTaskList") List<CouponTaskDO> couponTaskDOList);
    /**
     * 批量更新优惠券使用记录
     * @param userId
     * @param useState
     * @param lockCouponRecordIds
     * @return
     */
    int lockUseStateBatch(@Param("userId") Long userId, @Param("useState") String useState, @Param("lockCouponRecordIds") List<Long> lockCouponRecordIds);
 两个自定义xml
CouponTaskMapper
   <!-- 通用查询结果列 -->
    <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"/> )
        values
        <foreach collection="couponTaskList" item="item" index="index" separator=",">
            (
            #{item.couponRecordId},
            #{item.createTime},
            #{item.outTradeNo},
            #{item.lockState}
            )
        </foreach>
    </insert> CouponRecordMapper
     <!--批量锁定优惠券记录-->
    <update id="lockUseStateBatch">
        update coupon_record set use_state=#{useState} where user_id=#{userId} and use_state='NEW'
        and id in
        <!--open 拼接最开始  close 拼接结束  目的是构件成这样  (1,2,3)-->
        <foreach collection="lockCouponRecordIds" index="index" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </update> 新枚举类StockTaskStateEnum 
 public enum StockTaskStateEnum {
    /**
     * 锁定
     */
    LOCK,
    /**
     * 完成
     */
    FINISH,
    /**
     * 取消,释放库存
     */
    CANCEL;
}
 本文作者为DBC,转载请注明。
