Преглед на файлове

fix: 添加总库存增减日志记录

luofeiyun преди 2 седмици
родител
ревизия
18136089f0

+ 6 - 0
ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/api/VoyageApi.java

@@ -12,4 +12,10 @@ public interface VoyageApi {
      * @param reqDTO 请求参数
      */
     void preReduceStock(ReduceStockReqDTO reqDTO);
+
+    /**
+     * 初定取消还库存
+     * @param reqDTO 请求参数
+     */
+    void preCancelReduceStock(ReduceStockReqDTO reqDTO);
 }

+ 25 - 0
ship-module-product/ship-module-product-api/src/main/java/com/yc/ship/module/product/enums/VoyageStockLogTypeEnum.java

@@ -0,0 +1,25 @@
+package com.yc.ship.module.product.enums;
+
+import com.yc.ship.framework.common.core.IntArrayValuable;
+import lombok.Getter;
+
+import java.util.Arrays;
+
+@Getter
+public enum VoyageStockLogTypeEnum implements IntArrayValuable {
+    ADMIN_ADD(0,"管理员添加"),
+    ADMIN_SUB(1,"管理员减少"),
+    ORDER_PRE_SUB(3,"预定订单扣减"),
+    ORDER_PRE_CANCEL(4,"预定订单取消");
+    private final String name;
+    private final Integer value;
+    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(VoyageStockLogTypeEnum::getValue).toArray();
+    @Override
+    public int[] array() {
+        return ARRAYS;
+    }
+    VoyageStockLogTypeEnum(Integer value, String name) {
+        this.value = value;
+        this.name = name;
+    }
+}

+ 71 - 1
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java

@@ -7,14 +7,17 @@ import com.yc.ship.module.product.api.dto.ReduceStockReqDTO;
 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewDetailReqVO;
 import com.yc.ship.module.product.controller.admin.voyagestockdistributeNew.vo.VoyageStockDistributeNewRespVO;
 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockDO;
+import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockLogDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockRoomUsedDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdetail.VoyageStockDetailDO;
 import com.yc.ship.module.product.dal.dataobject.voyagestockdistribute.VoyageStockDistributeNewDO;
+import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockLogMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestock.VoyageStockRoomUsedMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdetail.VoyageStockDetailMapper;
 import com.yc.ship.module.product.dal.mysql.voyagestockdistribute.VoyageStockDistributeNewMapper;
 import com.yc.ship.module.product.enums.DistributorOrStoreEnum;
+import com.yc.ship.module.product.enums.VoyageStockLogTypeEnum;
 import com.yc.ship.module.product.framework.lock.ProductRedisKeyConstants;
 import com.yc.ship.module.product.service.voyagestockdistribute.VoyageStockDistributeNewService;
 import com.yc.ship.module.resource.api.room.RoomApi;
@@ -60,6 +63,9 @@ public class VoyageApiImpl implements VoyageApi{
     @Resource
     private VoyageStockRoomUsedMapper voyageStockRoomUsedMapper;
 
+    @Resource
+    private VoyageStockLogMapper voyageStockLogMapper;
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void preReduceStock(ReduceStockReqDTO reqDTO) {
@@ -84,11 +90,57 @@ public class VoyageApiImpl implements VoyageApi{
         }
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void preCancelReduceStock(ReduceStockReqDTO reqDTO) {
+        //TODO: 当前阶段不考虑门店库存
+
+        Long voyageId = reqDTO.getVoyageId();
+        //现在给整个航次的库存加锁
+        String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
+        RLock lock = redissonClient.getLock(lockKey);
+        try {
+            lock.lock(60, TimeUnit.SECONDS);
+            Integer type = reqDTO.getType();//判断是分销商还是门店下单 1:分销商,2:门店
+            if (type == DistributorOrStoreEnum.DISTRIBUTOR.getValue()) {//分销商下单,当前阶段不考虑门店下单
+                //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
+                //初定扣分销商库存
+                preCancelReduceStockDistributor(reqDTO);
+            }
+        }finally {
+            if(lock.isHeldByCurrentThread() && lock.isLocked()){
+                lock.unlock();
+            }
+        }
+    }
+
     /**
-     * 预定扣分销商库存
+     * 初定取消还分销商库存
+     * @param reqDTO
+     */
+    private void preCancelReduceStockDistributor(ReduceStockReqDTO reqDTO) {
+        Integer type = reqDTO.getType();
+        Long voyageId = reqDTO.getVoyageId(); //航次ID
+        Long distributorId = reqDTO.getDistributorId(); //分销商ID
+        Long storeId = reqDTO.getStoreId(); //门店ID
+        BigDecimal totalUseNum = reqDTO.getUseRoomNum(); //总共使用房间数量
+        Long orderId = reqDTO.getOrderId();
+        Integer orderStatus = reqDTO.getOrderStatus();
+
+        //删除已使用房间记录
+        voyageStockRoomUsedMapper.deleteByOrderId(orderId);
+
+
+    }
+
+    /**
+     * 初定扣分销商库存
      * @param reqDTO
      */
     private void preReduceStockDistributor(ReduceStockReqDTO reqDTO) {
+        //航次库存操作日志
+        VoyageStockLogDO voyageStockLogDO = new VoyageStockLogDO();
+
         Integer type = reqDTO.getType();
         Long voyageId = reqDTO.getVoyageId(); //航次ID
         Long distributorId = reqDTO.getDistributorId(); //分销商ID
@@ -97,6 +149,12 @@ public class VoyageApiImpl implements VoyageApi{
         Long orderId = reqDTO.getOrderId();
         Integer orderStatus = reqDTO.getOrderStatus();
 
+        voyageStockLogDO.setVoyageId(voyageId);
+        voyageStockLogDO.setType(2);//标识减少
+        voyageStockLogDO.setOrderId(orderId);
+        voyageStockLogDO.setOrderStatus(orderStatus);
+        voyageStockLogDO.setOperateType(VoyageStockLogTypeEnum.ORDER_PRE_SUB.getValue());
+
         // 获取航次总库存
         VoyageStockDO stockDO = voyageStockMapper.selectById(voyageId);
         if(stockDO == null) {
@@ -166,7 +224,11 @@ public class VoyageApiImpl implements VoyageApi{
             // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
             if(stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) {
                 stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum));
+                voyageStockLogDO.setVirtualNum(totalUseNum);
+                voyageStockLogDO.setRealNum(BigDecimal.ZERO);
             }else {
+                voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum());
+                voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum()));
                 stockDO.setVirtualNum(BigDecimal.ZERO);
                 // 扣实际房间数
                 stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum())));
@@ -175,6 +237,7 @@ public class VoyageApiImpl implements VoyageApi{
             stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum));
             // 扣共享库存
             stockDO.setShareNum(stockDO.getShareNum().subtract(totalUseNum));
+            voyageStockLogDO.setShareNum(totalUseNum);
             voyageStockMapper.updateById(stockDO);
         }else {
             //分销商已分配库存,扣自身库存
@@ -233,7 +296,11 @@ public class VoyageApiImpl implements VoyageApi{
             // 减虚拟房间数,此处初定,先扣虚拟库存,虚拟库存不足再扣实际库存
             if(stockDO.getVirtualNum().compareTo(totalUseNum) >= 0) {
                 stockDO.setVirtualNum(stockDO.getVirtualNum().subtract(totalUseNum));
+                voyageStockLogDO.setVirtualNum(totalUseNum);
+                voyageStockLogDO.setRealNum(BigDecimal.ZERO);
             }else {
+                voyageStockLogDO.setVirtualNum(stockDO.getVirtualNum());
+                voyageStockLogDO.setRealNum(totalUseNum.subtract(voyageStockLogDO.getVirtualNum()));
                 stockDO.setVirtualNum(BigDecimal.ZERO);
                 // 扣实际房间数
                 stockDO.setRealTotalNum(stockDO.getRealTotalNum().subtract(totalUseNum.subtract(stockDO.getVirtualNum())));
@@ -242,6 +309,7 @@ public class VoyageApiImpl implements VoyageApi{
             stockDO.setBookNum(stockDO.getBookNum().add(totalUseNum));
             // 扣共享库存
             stockDO.setShareNum(stockDO.getShareNum().subtract(totalUseNum));
+            voyageStockLogDO.setShareNum(totalUseNum);
             voyageStockMapper.updateById(stockDO);
         }
         // 添加房间使用记录
@@ -268,5 +336,7 @@ public class VoyageApiImpl implements VoyageApi{
             voyageStockRoomUsedMapper.insertBatch(roomUsedList);
         }
 
+        // 添加库存日志
+        voyageStockLogMapper.insert(voyageStockLogDO);
     }
 }

+ 78 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/dataobject/voyagestock/VoyageStockLogDO.java

@@ -0,0 +1,78 @@
+package com.yc.ship.module.product.dal.dataobject.voyagestock;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 航次库存log DO
+ *
+ * @author 管理员
+ */
+@TableName("product_voyage_stock_log")
+@KeySequence("product_voyage_stock_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class VoyageStockLogDO extends TenantBaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long ID;
+    /**
+     * 航次ID
+     */
+    private Long voyageId;
+
+
+    /**
+     * 游轮ID
+     */
+    private Long shipId;
+
+    /**
+     * 增加还是减少:1增加:2减少
+     */
+    private Integer type;
+
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+
+
+    /**
+     * 订单状态
+     */
+    private Integer orderStatus;
+    /**
+     * 虚拟房间数
+     */
+    private BigDecimal virtualNum;
+
+    /**
+     * 实际房间总数
+     */
+    private BigDecimal realNum;
+
+    /**
+     * 共享库存
+     */
+    private BigDecimal shareNum;
+
+    /**
+     * 操作类型
+     */
+    private Integer operateType;
+
+}

+ 15 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/dal/mysql/voyagestock/VoyageStockLogMapper.java

@@ -0,0 +1,15 @@
+package com.yc.ship.module.product.dal.mysql.voyagestock;
+
+import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.module.product.dal.dataobject.voyagestock.VoyageStockLogDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 航次库存Log Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface VoyageStockLogMapper extends BaseMapperX<VoyageStockLogDO> {
+
+}