24282 před 1 rokem
rodič
revize
d062cf425e

+ 9 - 1
sd-business/src/main/java/com/sd/business/controller/order/OrderController.java

@@ -57,7 +57,6 @@ public class OrderController {
      */
     @PostMapping("/add")
     public void add(@Validated @RequestBody OrderInfoDto orderDto) {
-//        orderDto.setFlowStatus(FlowStatusEnum.READY_START.getKey());
         orderDto.setFlowStatus(FlowStatusEnum.PASS.getKey());
         orderService.add(orderDto);
     }
@@ -71,6 +70,15 @@ public class OrderController {
     }
 
     /**
+     * 订单确认
+     */
+    @PostMapping("/confirmation")
+    public void confirmation(@RequestBody OrderInfoDto orderDto) {
+        orderService.confirmation(orderDto);
+    }
+
+
+    /**
      * 订单删除
      */
     @PostMapping("/delete")

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/inventory/po/Inventory.java

@@ -38,6 +38,11 @@ public class Inventory extends BasePo {
     private Long bomSpecId;
 
     /**
+     * 锁定库存
+     */
+    private BigDecimal lockQuantity;
+
+    /**
      * 数量
      */
     @ColumnWidth(15)

+ 0 - 7
sd-business/src/main/java/com/sd/business/entity/order/dto/OrderInfoDto.java

@@ -36,18 +36,11 @@ public class OrderInfoDto extends OrderInfo {
      */
     private List<ObsFile> fileList;
 
-
     /**
      * 订单包装bom
      */
     private List<OrderPackageBomDto> orderPackageBomList;
 
-
-    /**
-     * 外箱不干胶文件
-     */
-    private ObsFile outerBoxSelfAdhesiveStickerFile;
-
     /**
      * 包裹图片
      */

+ 1 - 1
sd-business/src/main/java/com/sd/business/entity/order/enums/OrderExceptionTypeEnum.java

@@ -24,6 +24,7 @@ public enum OrderExceptionTypeEnum {
     UNKNOWN_BOM_SPEC(6, "订单sku规格未绑定bom规格"),
     SKU_UPDATE(7, "订单商品被更改"),
     NO_DESIGN_DOCUMENT(8, "未绑定图稿"),
+    UNDERSTOCK(9, "主材库存不足"),
     ;
 
     private static final Map<Integer, OrderExceptionTypeEnum> map = new HashMap<>();
@@ -67,5 +68,4 @@ public enum OrderExceptionTypeEnum {
         return getEnum(key).getValue();
     }
 
-
 }

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/order/po/OrderInfo.java

@@ -293,6 +293,11 @@ public class OrderInfo extends BasePo {
     private Long masterOrderId;
 
     /**
+     * 是否锁定库存 1是 0否
+     */
+    private Integer lockStorage;
+
+    /**
      * 订单删除标记
      */
     private Integer delFlag;

+ 13 - 1
sd-business/src/main/java/com/sd/business/service/inventory/InventoryService.java

@@ -11,12 +11,12 @@ import com.sd.business.entity.inventory.po.Inventory;
 import com.sd.business.entity.inventory.vo.InventoryVo;
 import com.sd.business.entity.inventory.vo.QuantityByDepartmentVo;
 import com.sd.business.entity.inventory.vo.QuantityByWarehouseVo;
+import com.sd.business.entity.order.po.OrderSku;
 
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
-
 /**
  * <p>
  * 库存 服务类
@@ -86,8 +86,20 @@ public interface InventoryService extends BaseService<Inventory> {
     void exportBackExcel(InventorySelectDto dto);
 
     /**
+     * 锁定库存
+     */
+    boolean lockStorage(List<? extends OrderSku> orderSkuList);
+
+    /**
+     * 解锁库存
+     */
+    void unlockStorage(List<OrderSku> orderSkuList);
+
+    /**
      * 采购入库
+     *
      * @param
      */
     void purchaseInStorage(Long purchaseId, Long departmentId, Long warehouseId, List<? extends InOutFun> list);
+
 }

+ 73 - 5
sd-business/src/main/java/com/sd/business/service/inventory/impl/InventoryServiceImpl.java

@@ -10,6 +10,7 @@ import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.framework.mybatis.holder.LogicHolder;
 import com.sd.business.entity.bom.po.Bom;
 import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.entity.department.constant.DepartmentConstant;
 import com.sd.business.entity.in.dto.CorrectionDto;
 import com.sd.business.entity.in.po.InOutStorageBom;
 import com.sd.business.entity.in.po.InOutStorageDetails;
@@ -22,7 +23,9 @@ import com.sd.business.entity.inventory.po.InventoryBackup;
 import com.sd.business.entity.inventory.vo.InventoryVo;
 import com.sd.business.entity.inventory.vo.QuantityByDepartmentVo;
 import com.sd.business.entity.inventory.vo.QuantityByWarehouseVo;
+import com.sd.business.entity.order.po.OrderSku;
 import com.sd.business.entity.purchase.po.PurchaseBom;
+import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.inventory.InventoryMapper;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.in.InOutStorageDetailsService;
@@ -199,8 +202,7 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
     public void exportExcel(InventorySelectDto dto) {
         IWrapper<Inventory> wrapper = getDtoWrapper(dto);
         List<InventoryVo> list = baseMapper.getList(wrapper);
-        ExcelUtil.export(response, DateUtil.format(new Date(), "yyyy-MM-dd库存数据"),
-                "库存数据", list, InventoryVo.class);
+        ExcelUtil.export(response, DateUtil.format(new Date(), "yyyy-MM-dd库存数据"), "库存数据", list, InventoryVo.class);
     }
 
     @Override
@@ -329,8 +331,73 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
         IWrapper<Inventory> wrapper = getDtoWrapper(dto);
         Page<InventoryVo> inventoryBackup = baseMapper.getPage(dto.getPage(), wrapper, "inventory_backup");
         List<InventoryVo> list = inventoryBackup.getRecords();
-        ExcelUtil.export(response, DateUtil.format(dto.getBackupDate(), "yyyy-MM-dd库存数据"),
-                "库存数据", list, InventoryVo.class);
+        ExcelUtil.export(response, DateUtil.format(dto.getBackupDate(), "yyyy-MM-dd库存数据"), "库存数据", list, InventoryVo.class);
+    }
+
+    @Override
+    public boolean lockStorage(List<? extends OrderSku> orderSkuList) {
+
+        if (orderSkuList.size() == 0) {
+            return true;
+        }
+
+        Map<Long, BigDecimal> map = orderSkuList.stream()
+                .collect(Collectors.toMap(OrderSku::getBomSpecId, OrderSku::getQuantity, BigDecimal::add));
+
+        synchronized (this) {
+
+            List<Inventory> list = list(q -> q
+                    .in(Inventory::getBomSpecId, map.keySet())
+                    .eq(Inventory::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
+                    .eq(Inventory::getDepartmentId, DepartmentConstant.SD_SPORTS)
+            );
+
+            if (map.size() != list.size()) {
+                return false;
+            }
+
+            for (Inventory inventory : list) {
+                BigDecimal lockQuantity = map.get(inventory.getBomSpecId());
+                if (inventory.getQuantity().compareTo(lockQuantity) >= 0) {
+                    inventory.setQuantity(inventory.getQuantity().subtract(lockQuantity));
+                    inventory.setLockQuantity(inventory.getLockQuantity().add(lockQuantity));
+                } else {
+                    return false;
+                }
+            }
+
+            updateBatchById(list);
+        }
+
+        return true;
+    }
+
+    @Override
+    public void unlockStorage(List<OrderSku> orderSkuList) {
+
+        if (orderSkuList.size() == 0) {
+            return;
+        }
+
+        Map<Long, BigDecimal> map = orderSkuList.stream()
+                .collect(Collectors.toMap(OrderSku::getBomSpecId, OrderSku::getQuantity, BigDecimal::add));
+
+        synchronized (this) {
+
+            List<Inventory> list = list(q -> q
+                    .in(Inventory::getBomSpecId, map.keySet())
+                    .eq(Inventory::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
+                    .eq(Inventory::getDepartmentId, DepartmentConstant.SD_SPORTS)
+            );
+
+            for (Inventory inventory : list) {
+                BigDecimal lockQuantity = map.get(inventory.getBomSpecId());
+                inventory.setQuantity(inventory.getQuantity().add(lockQuantity));
+                inventory.setLockQuantity(inventory.getLockQuantity().subtract(lockQuantity));
+            }
+
+        }
+
     }
 
     @Override
@@ -382,7 +449,8 @@ public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory
                         .add(inOutFun.getQuantity().multiply(purchaseBom.getUnitPrice()));
 
                 // 获取入库结存单价
-                BigDecimal balanceUnitPrice = sumPrice.divide(sumQuantity, 2, RoundingMode.HALF_UP);;
+                BigDecimal balanceUnitPrice = sumPrice.divide(sumQuantity, 2, RoundingMode.HALF_UP);
+                ;
 
                 inventory.setQuantity(sumQuantity);
                 inventory.setBalanceUnitPrice(balanceUnitPrice);

+ 11 - 0
sd-business/src/main/java/com/sd/business/service/order/OrderService.java

@@ -44,11 +44,21 @@ public interface OrderService extends BaseService<OrderInfo> {
     void edit(OrderInfoDto orderDto);
 
     /**
+     * 订单确认
+     */
+    void confirmation(OrderInfoDto orderDto);
+
+    /**
      * 订单删除
      */
     void delete(Long id, boolean saveLog);
 
     /**
+     * 订单删除
+     */
+    void delete(Long id);
+
+    /**
      * 通过sku规格id获取产品价格
      */
     SkuSpecPriceVo getSkuSpecPrice(SkuSpecPriceDto dto);
@@ -99,6 +109,7 @@ public interface OrderService extends BaseService<OrderInfo> {
 
     /**
      * 订单是否存在包材
+     *
      * @param orderId
      * @return
      */

+ 133 - 46
sd-business/src/main/java/com/sd/business/service/order/impl/OrderServiceImpl.java

@@ -9,7 +9,6 @@ import com.alibaba.fastjson2.JSON;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.file.entity.ObsFile;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.ruoyi.common.annotation.LogicIgnore;
 import com.ruoyi.common.constant.StatusConstant;
@@ -251,12 +250,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
     @DSTransactional
     @Override
     public void add(OrderInfoDto orderDto) {
+
         List<OrderSkuDto> orderSkuList = orderDto.getOrderSkuList();
-        // 自建订单判断库存
-        if (ObjectUtil.equals(orderDto.getType(), 1)) {
-            this.checkSkuInventory(orderSkuList);
+        if (ObjectUtil.equal(orderDto.getStatus(), OrderStatusEnum.STOCK_PREPARATION.getKey())) {
+            lockStorage(orderSkuList);
+            orderDto.setLockStorage(StatusConstant.YES);
+        } else {
+            orderDto.setLockStorage(StatusConstant.NO);
         }
 
+        // 新增订单
         orderDto.setSource(1);
         orderDto.setCode("PI" + new Date().getTime());
         orderDto.setSettlementStatus(1);
@@ -265,6 +268,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
         orderDto.setExceptionType(OrderExceptionTypeEnum.NORMAL.getKey().toString());
         this.save(orderDto);
 
+        // 新增订单产品包材配件
         List<OrderSku> tempOrderSkuList = orderSkuList.stream()
                 .peek(item -> item.setOrderId(orderDto.getId()))
                 .peek(item -> item.setStockPreparationStatus(StatusConstant.NO))
@@ -272,10 +276,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
                 .collect(Collectors.toList());
         orderSkuService.saveBatch(tempOrderSkuList);
 
-        for (OrderSkuDto item : orderSkuList) {
-            ObsFileUtil.saveFile(Collections.singletonList(item.getSelfAdhesiveStickerFile()), item.getId());
-        }
-
+        // 新增订单产品包装信息
         List<OrderSkuBom> orderSkuBomList = orderSkuList.stream()
                 .flatMap(orderSku -> orderSku.getOrderSkuBomList().stream()
                         .peek(orderSkuBom -> orderSkuBom.setOrderId(orderDto.getId()))
@@ -283,8 +284,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
                 .collect(Collectors.toList());
         orderSkuBomService.saveBatch(orderSkuBomList);
 
+        // 保存订单包装信息
         if (ObjectUtil.isNotEmpty(orderDto.getOrderPackageBomList())) {
-            // 保存订单包装信息
             List<OrderPackageBomDto> tempOrderPackageBomList = orderDto.getOrderPackageBomList();
             List<OrderPackageBom> orderPackageBomList = tempOrderPackageBomList.stream()
                     .peek(item -> item.setOrderId(orderDto.getId()))
@@ -293,82 +294,125 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
             orderPackageBomService.saveBatch(orderPackageBomList);
         }
 
+        // 订单操作日志
         OrderOperatingLog orderOperatingLog = new OrderOperatingLog();
         orderOperatingLog.setType(10);
         orderOperatingLog.setOrderId(orderDto.getId());
         orderOperatingLog.setOrderCode(orderDto.getCode());
         orderOperatingLogService.save(orderOperatingLog);
 
-        ObsFileUtil.saveFile(orderDto.getFileList(), orderDto.getId());
-
-        // 保存 外箱不干胶图稿, 文件业务类型为 1
-        ObsFile outerBoxSelfAdhesiveStickerFile = orderDto.getOuterBoxSelfAdhesiveStickerFile();
-        if (ObjectUtil.isNotEmpty(outerBoxSelfAdhesiveStickerFile)) {
-            ObsFileUtil.saveFile(Collections.singletonList(outerBoxSelfAdhesiveStickerFile), orderDto.getId(), 1);
+        // 保存产品不干胶图稿
+        for (OrderSkuDto item : orderSkuList) {
+            ObsFileUtil.saveFile(item.getSelfAdhesiveStickerFile(), item.getId());
         }
 
+        // 保存附件
+        ObsFileUtil.saveFile(orderDto.getFileList(), orderDto.getId());
+
     }
 
     @DSTransactional
     @Override
-    public void edit(OrderInfoDto orderDto) {
-        List<OrderSkuDto> orderSkuList = orderDto.getOrderSkuList();
-        // 自建订单判断库存
-        if (ObjectUtil.equals(orderDto.getType(), 1)) {
-            this.checkSkuInventory(orderSkuList);
-        }
+    public void edit(OrderInfoDto dto) {
 
-        this.updateById(orderDto);
+        // 更新订单
+        this.updateById(dto);
 
+        // 更新订单产品
+        List<OrderSkuDto> orderSkuList = dto.getOrderSkuList();
         List<OrderSku> tempOrderSkuList = orderSkuList.stream()
-                .peek(item -> item.setOrderId(orderDto.getId()))
+                .peek(item -> item.setOrderId(dto.getId()))
                 .peek(item -> item.setStockPreparationStatus(StatusConstant.NO))
                 .map(item -> (OrderSku) item)
                 .collect(Collectors.toList());
-        orderSkuService.editLinked(tempOrderSkuList, OrderSku::getOrderId, orderDto.getId());
-
-        for (OrderSkuDto item : orderSkuList) {
-            ObsFileUtil.saveFile(Collections.singletonList(item.getSelfAdhesiveStickerFile()), item.getId());
-        }
+        orderSkuService.editLinked(tempOrderSkuList, OrderSku::getOrderId, dto.getId());
 
+        // 更新订单产品包材配件
         List<OrderSkuBom> orderSkuBomList = orderSkuList.stream()
                 .flatMap(orderSku -> orderSku.getOrderSkuBomList().stream()
-                        .peek(orderSkuBom -> orderSkuBom.setOrderId(orderDto.getId()))
+                        .peek(orderSkuBom -> orderSkuBom.setOrderId(dto.getId()))
                         .peek(orderSkuBom -> orderSkuBom.setOrderSkuId(orderSku.getId())))
                 .collect(Collectors.toList());
-        orderSkuBomService.editLinked(orderSkuBomList, OrderSkuBom::getOrderId, orderDto.getId());
+        orderSkuBomService.editLinked(orderSkuBomList, OrderSkuBom::getOrderId, dto.getId());
 
-        if (ObjectUtil.isNotEmpty(orderDto.getOrderPackageBomList())) {
-            // 更新订单包装信息
-            List<OrderPackageBomDto> tempOrderPackageBomList = orderDto.getOrderPackageBomList();
+        // 更新订单产品包装信息
+        if (ObjectUtil.isNotEmpty(dto.getOrderPackageBomList())) {
+            List<OrderPackageBomDto> tempOrderPackageBomList = dto.getOrderPackageBomList();
             List<OrderPackageBom> orderPackageBomList = tempOrderPackageBomList.stream()
-                    .peek(item -> item.setOrderId(orderDto.getId()))
+                    .peek(item -> item.setOrderId(dto.getId()))
                     .map(item -> (OrderPackageBom) item)
                     .collect(Collectors.toList());
-            orderPackageBomService.editLinked(orderPackageBomList, OrderPackageBom::getOrderId, orderDto.getId());
+            orderPackageBomService.editLinked(orderPackageBomList, OrderPackageBom::getOrderId, dto.getId());
         }
 
-        if (orderDto.getUpdateType() != null) {
+        // 订单操作日志
+        if (dto.getUpdateType() != null) {
             OrderOperatingLog orderOperatingLog = new OrderOperatingLog();
-            orderOperatingLog.setType(orderDto.getUpdateType());
-            orderOperatingLog.setOrderId(orderDto.getId());
-            orderOperatingLog.setOrderCode(orderDto.getCode());
+            orderOperatingLog.setType(dto.getUpdateType());
+            orderOperatingLog.setOrderId(dto.getId());
+            orderOperatingLog.setOrderCode(dto.getCode());
             orderOperatingLogService.save(orderOperatingLog);
         }
 
-        ObsFileUtil.editFile(orderDto.getFileList(), orderDto.getId());
+        // 更新订单产品不干胶图稿
+        for (OrderSkuDto item : orderSkuList) {
+            ObsFileUtil.saveFile(item.getSelfAdhesiveStickerFile(), item.getId());
+        }
+
+        // 更新订单附件
+        ObsFileUtil.editFile(dto.getFileList(), dto.getId());
+
+    }
+
+    @Override
+    public void confirmation(OrderInfoDto dto) {
+        OrderInfo order = getById(dto.getId());
+
+        if (ObjectUtil.notEqual(order.getStatus(), OrderStatusEnum.DRAFT.getKey())
+                || ObjectUtil.notEqual(order.getStatus(), OrderStatusEnum.UNDER_REVIEW.getKey())) {
+            throw new ServiceException("订单不在草稿或待确认状态");
+        }
 
-        // 更新 外箱不干胶图稿
-        ObsFile outerBoxSelfAdhesiveStickerFile = orderDto.getOuterBoxSelfAdhesiveStickerFile();
-        if (ObjectUtil.isNotEmpty(outerBoxSelfAdhesiveStickerFile)) {
-            ObsFileUtil.editFile(Collections.singletonList(outerBoxSelfAdhesiveStickerFile), orderDto.getId(), 1);
+        // 自主订单需要锁定库存
+        List<OrderSkuDto> orderSkuList = dto.getOrderSkuList();
+        if (Objects.equals(dto.getType(), 1)) {
+            lockStorage(orderSkuList);
+            dto.setLockStorage(StatusConstant.YES);
         }
 
+        // 更新订单
+        dto.setStatus(OrderStatusEnum.STOCK_PREPARATION.getKey());
+        this.updateById(dto);
+
+        // 更新订单产品
+        List<OrderSku> tempOrderSkuList = orderSkuList.stream()
+                .peek(item -> item.setOrderId(dto.getId()))
+                .peek(item -> item.setStockPreparationStatus(StatusConstant.NO))
+                .map(item -> (OrderSku) item)
+                .collect(Collectors.toList());
+        orderSkuService.editLinked(tempOrderSkuList, OrderSku::getOrderId, dto.getId());
+
+        // 更新包材
+        List<OrderSkuBom> orderSkuBomList = orderSkuList.stream()
+                .flatMap(orderSku -> orderSku.getOrderSkuBomList().stream()
+                        .peek(orderSkuBom -> orderSkuBom.setOrderId(dto.getId()))
+                        .peek(orderSkuBom -> orderSkuBom.setOrderSkuId(orderSku.getId())))
+                .collect(Collectors.toList());
+        orderSkuBomService.editLinked(orderSkuBomList, OrderSkuBom::getOrderId, dto.getId());
+
+        // 更新产品不干胶图稿
+        for (OrderSkuDto item : orderSkuList) {
+            ObsFileUtil.saveFile(item.getSelfAdhesiveStickerFile(), item.getId());
+        }
+
+        // 更新附件
+        ObsFileUtil.editFile(dto.getFileList(), dto.getId());
+
     }
 
     @DSTransactional
     @Override
-    public void delete(Long id, boolean saveLog) {
+    public synchronized void delete(Long id, boolean saveLog) {
         OrderInfo orderInfo = getById(id);
 
         if (orderInfo == null) {
@@ -380,6 +424,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
             throw new ServiceException("订单正在生产中,无法直接删除,需要走审批流程");
         }
 
+        unLockStorage(orderInfo);
+
         // 删除订单以及订单关联数据
         delete(id);
 
@@ -551,6 +597,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
             throw new ServiceException("未找到订单");
         }
 
+        unLockStorage(orderInfo);
+
         if (orderInfo.getStatus() <= OrderStatusEnum.STOCK_PREPARATION.getKey()) {
             return;
         }
@@ -716,7 +764,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
     /**
      * 删除订单以及订单关联数据
      */
-    private void delete(Long id) {
+    public void delete(Long id) {
         this.removeById(id);
         orderSkuService.remove(q -> q.eq(OrderSku::getOrderId, id));
         orderSkuBomService.remove(q -> q.eq(OrderSkuBom::getOrderId, id));
@@ -753,4 +801,43 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OrderInfo> implem
         }
     }
 
+    /**
+     * 锁定库存
+     */
+    private void lockStorage(List<? extends OrderSku> orderSkuList) {
+        List<Long> bomSpecIdList = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
+
+        boolean result = inventoryService.lockStorage(orderSkuList.stream()
+                .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
+                .collect(Collectors.toList())
+        );
+
+        if (!result) {
+            throw new ServiceException("主材库存不足,无法确认订单");
+        }
+
+    }
+
+    /**
+     * 解锁库存
+     */
+    private void unLockStorage(OrderInfo orderInfo) {
+
+        if (ObjectUtil.notEqual(orderInfo.getLockStorage(), StatusConstant.YES)) {
+            return;
+        }
+
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.eq(OrderSku::getOrderId, orderInfo.getId()));
+
+        List<Long> bomSpecIdList = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
+
+        orderSkuList = orderSkuList.stream()
+                .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
+                .collect(Collectors.toList());
+
+        inventoryService.unlockStorage(orderSkuList);
+    }
+
 }

+ 1 - 0
sd-business/src/main/java/com/sd/business/service/production/impl/StockPreparationServiceImpl.java

@@ -460,6 +460,7 @@ public class StockPreparationServiceImpl implements StockPreparationService {
      * 订单出库
      */
     private void orderDelivery(List<Long> orderIdList, StockPreparationDto dto) {
+
         List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIdList));
         List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderId, orderIdList));
         Map<Long, OrderSku> orderSkuMap = orderSkuList.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));

+ 11 - 10
sd-business/src/main/resources/mapper/production/StockPreparationMapper.xml

@@ -3,17 +3,18 @@
 <mapper namespace="com.sd.business.mapper.production.StockPreparationMapper">
 
     <select id="uncompletedList" resultType="com.sd.business.entity.production.vo.StockPreparationVo">
-        select bs.id         bomSpecId,
-               bs.code       bomSpecCode,
-               bs.name       bomSpecName,
-               ss.id         skuSpecId,
-               ss.code       skuSpecCode,
-               ss.name       skuSpecName,
+        select bs.id           bomSpecId,
+               bs.code         bomSpecCode,
+               bs.name         bomSpecName,
+               ss.id           skuSpecId,
+               ss.code         skuSpecCode,
+               ss.name         skuSpecName,
                os.quantity,
-               os.id         orderSkuId,
-               oi.id         orderId,
-               oi.code       orderCode,
-               os.print_type printType
+               os.id           orderSkuId,
+               oi.id           orderId,
+               oi.code         orderCode,
+               os.print_type   printType,
+               oi.lock_storage lockStorage
         from order_info oi
                  inner join order_sku os on oi.id = os.order_id
                  inner join sku_spec ss on os.sku_spec_id = ss.id

+ 10 - 0
sd-wln/src/main/java/com/sd/wln/service/WlnOrderService.java

@@ -26,4 +26,14 @@ public interface WlnOrderService {
      */
     void saveOrUpdateOrder(OrderContext context);
 
+    /**
+     * 锁定库存
+     */
+    void lockStorage(OrderContext context);
+
+    /**
+     * 解锁库存
+     */
+    void unlockStorage(OrderContext context);
+
 }

+ 1 - 1
sd-wln/src/main/java/com/sd/wln/service/impl/OrderHandleServiceImpl.java

@@ -49,7 +49,7 @@ public class OrderHandleServiceImpl implements OrderHandleService {
             if (Objects.equals(orderInfo.getDelFlag(), StatusConstant.NOT_DELETED)) {
                 throw new ServiceException("订单未被删除,无法重新同步");
             }
-            orderService.delete(orderInfo.getId(), false);
+            orderService.delete(orderInfo.getId());
         }
         LogicHolder.clear();
 

+ 72 - 0
sd-wln/src/main/java/com/sd/wln/service/impl/WlnOrderServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.fjhx.tenant.entity.dict.po.DictCommonData;
 import com.fjhx.tenant.service.dict.DictCommonDataService;
 import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.framework.mybatis.holder.LogicHolder;
 import com.sd.business.entity.bom.bo.BomSpecBo;
@@ -21,6 +22,7 @@ import com.sd.business.entity.order.po.OrderSkuBom;
 import com.sd.business.entity.price.po.PriceBillingStandardDetail;
 import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.entity.sku.po.SkuSpecLink;
+import com.sd.business.service.inventory.InventoryService;
 import com.sd.business.service.order.OrderPackageBomService;
 import com.sd.business.service.order.OrderService;
 import com.sd.business.service.order.OrderSkuBomService;
@@ -65,6 +67,9 @@ public class WlnOrderServiceImpl implements WlnOrderService {
     @Autowired
     private OrderPackageBomService orderPackageBomService;
 
+    @Autowired
+    private InventoryService inventoryService;
+
     @Override
     public void syncOrder() {
 
@@ -111,8 +116,10 @@ public class WlnOrderServiceImpl implements WlnOrderService {
 
                     // 创建订单
                     orderInfo = createOrder(context, wlnOrder);
+
                     // 添加订单到上下文
                     addOrder(context, wlnOrder, orderInfo);
+
                 }
                 // 存在修改
                 else {
@@ -124,6 +131,10 @@ public class WlnOrderServiceImpl implements WlnOrderService {
             // 开启事务
             TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
             try {
+                // 新增正常订单锁定库存
+                lockStorage(context);
+                // 修改正常订单为异常订单解锁库存
+                unlockStorage(context);
                 // 保存或更新数据
                 saveOrUpdateOrder(context);
                 // 提交事务
@@ -208,6 +219,8 @@ public class WlnOrderServiceImpl implements WlnOrderService {
             orderInfo.setStatus(OrderStatusEnum.UNDER_REVIEW.getKey());
         }
 
+        orderInfo.setLockStorage(StatusConstant.NO);
+
         return orderInfo;
     }
 
@@ -567,6 +580,65 @@ public class WlnOrderServiceImpl implements WlnOrderService {
 
     }
 
+    @Override
+    public void lockStorage(OrderContext context) {
+
+        Department department = context.getDepartment();
+
+        if (department == null || ObjectUtil.notEqual(department.getOrderMode(), "2")) {
+            return;
+        }
+
+        List<OrderInfo> saveOrderList = context.getSaveOrderList();
+        List<OrderSku> saveOrderSkuList = context.getSaveOrderSkuList();
+        Map<Long, BomSpecBo> bomSpecBoMap = context.getBomSpecBoMap();
+
+        Map<Long, OrderInfo> orderMap = saveOrderList.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
+
+        Map<Long, List<OrderSku>> orderSkuMap = saveOrderSkuList.stream()
+                .filter(item -> orderMap.get(item.getOrderId()).getExceptionType().equals(OrderExceptionTypeEnum.NORMAL.getKey().toString()))
+                .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
+                .collect(Collectors.groupingBy(OrderSku::getOrderId));
+
+        orderSkuMap.forEach((orderId, orderSkuList) -> {
+
+            OrderInfo orderInfo = orderMap.get(orderId);
+
+            boolean result = inventoryService.lockStorage(orderSkuList);
+
+            if (!result) {
+                addExceptionType(orderInfo, OrderExceptionTypeEnum.UNDERSTOCK);
+            } else {
+                orderInfo.setLockStorage(StatusConstant.YES);
+            }
+
+        });
+
+    }
+
+    @Override
+    public void unlockStorage(OrderContext context) {
+        List<OrderInfo> updateOrderList = context.getUpdateOrderList();
+        Map<Long, List<OrderSku>> existOrderSkuMap = context.getExistOrderSkuMap();
+        Map<Long, BomSpecBo> bomSpecBoMap = context.getBomSpecBoMap();
+
+        for (OrderInfo orderInfo : updateOrderList) {
+            if (ObjectUtil.notEqual(orderInfo.getExceptionType(), OrderExceptionTypeEnum.NORMAL.getKey().toString()) &&
+                    ObjectUtil.equal(orderInfo.getLockStorage(), StatusConstant.YES)) {
+
+                List<OrderSku> orderSkuList = existOrderSkuMap.get(orderInfo.getId())
+                        .stream()
+                        .filter(item -> bomSpecBoMap.get(item.getBomSpecId()).getClassifyParentId().equals(1L))
+                        .collect(Collectors.toList());
+
+                inventoryService.unlockStorage(orderSkuList);
+
+                orderInfo.setLockStorage(StatusConstant.NO);
+            }
+        }
+
+    }
+
     /**
      * 查询万里牛订单列表
      */