✅P295_商城业务-订单服务-监听库存解锁

gong_yz大约 2 分钟谷粒商城

库存解锁的两种场景

  1. 下单成功,订单过期没有支付被系统自动取消、被用户手动取消。都要解锁
  2. 下单成功,库存锁定成功,接下来的业务调用失败,导致订单回滚。之前锁定的库存就要自动解锁

加上全参和无参构造器注解

package com.gyz.cfmall.ware.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

import java.io.Serializable;
import java.util.Date;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 库存工作单
 * 
 * @author gong_yuzhuo
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
@TableName("wms_ware_order_task_detail")
public class WareOrderTaskDetailEntity implements Serializable {
	private static final long serialVersionUID = 1L;

	/**
	 * id
	 */
	@TableId
	private Long id;
	/**
	 * sku_id
	 */
	private Long skuId;
	/**
	 * sku_name
	 */
	private String skuName;
	/**
	 * 购买个数
	 */
	private Integer skuNum;
	/**
	 * 工作单id
	 */
	private Long taskId;
	/**
	 * 仓库id
	 */
	private Long wareId;
	/**
	 * 锁定状态
	 */
	private Integer lockStatus;

}

保存工作单详情方便回溯

Common服务中创建To,方便MQ发送消息

package com.gyz.common.to.mq;

import lombok.Data;


@Data
public class StockLockedTo {

    /**
     * 库存工作单的id
     */
    private Long id;
    /**
     * 库存工作单详情id
     */
	private Long detailId;

}

如果To仅仅保存这个两个数据的话,会存在一些问题, 当1号订单在1号仓库扣减1件商品成功,2号订单在2号仓库扣减2件商品成功,3号订单在3号仓库扣减3件商品失败时,库存工作单的数据将会回滚,此时,数据库中将查不到1号和2号订单的库存工作单的数据,但是库存扣减是成功的,导致无法解锁库存。

解决方案: 保存库存工作详情To

package com.gyz.common.to.mq;

import lombok.Data;


@Data
public class StockDetailTo {

    private Long id;
    /**
     * sku_id
     */
    private Long skuId;
    /**
     * sku_name
     */
    private String skuName;
    /**
     * 购买个数
     */
    private Integer skuNum;
    /**
     * 工作单id
     */
    private Long taskId;

    /**
     * 仓库id
     */
    private Long wareId;

    /**
     * 1-锁定、2-已解锁、3-扣减
     */
    private Integer lockStatus;

}
package com.gyz.common.to.mq;

import lombok.Data;


@Data
public class StockLockedTo {

    /**
     * 库存工作单的id
     */
    private Long id;

    /**
     * 工作单详情的所有信息
     */
    private StockDetailTo detailTo;
}

向MQ发送库存锁定成功的消息