|
@@ -1,23 +1,35 @@
|
|
|
package com.sd.business.service.production.impl;
|
|
|
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.ruoyi.common.constant.StatusConstant;
|
|
|
import com.ruoyi.common.core.domain.BaseIdPo;
|
|
|
+import com.ruoyi.common.utils.SecurityUtils;
|
|
|
import com.ruoyi.common.utils.wrapper.IWrapper;
|
|
|
+import com.sd.business.entity.bom.bo.BomSpecBo;
|
|
|
import com.sd.business.entity.bom.po.BomSpec;
|
|
|
+import com.sd.business.entity.department.constant.DepartmentConstant;
|
|
|
import com.sd.business.entity.department.po.Department;
|
|
|
+import com.sd.business.entity.in.dto.InOutStorageDto;
|
|
|
+import com.sd.business.entity.in.emums.InOutTypeEnum;
|
|
|
+import com.sd.business.entity.in.emums.OutDetailTypeEnum;
|
|
|
+import com.sd.business.entity.in.po.InOutStorageBom;
|
|
|
import com.sd.business.entity.order.enums.OrderStatusEnum;
|
|
|
import com.sd.business.entity.order.po.OrderInfo;
|
|
|
import com.sd.business.entity.order.po.OrderSku;
|
|
|
+import com.sd.business.entity.order.po.OrderSkuBom;
|
|
|
import com.sd.business.entity.production.dto.StockPreparationDto;
|
|
|
import com.sd.business.entity.production.po.ProductionTask;
|
|
|
import com.sd.business.entity.production.po.ProductionWorkOrder;
|
|
|
import com.sd.business.entity.production.vo.StockPreparationVo;
|
|
|
import com.sd.business.entity.sku.po.Sku;
|
|
|
import com.sd.business.entity.sku.po.SkuSpec;
|
|
|
+import com.sd.business.entity.warehouse.constant.WarehouseConstant;
|
|
|
import com.sd.business.mapper.production.StockPreparationMapper;
|
|
|
+import com.sd.business.service.in.InOutStorageService;
|
|
|
import com.sd.business.service.order.OrderService;
|
|
|
+import com.sd.business.service.order.OrderSkuBomService;
|
|
|
import com.sd.business.service.order.OrderSkuService;
|
|
|
import com.sd.business.service.production.ProductionTaskService;
|
|
|
import com.sd.business.service.production.ProductionWorkOrderService;
|
|
@@ -32,6 +44,7 @@ import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
@Service
|
|
|
public class StockPreparationServiceImpl implements StockPreparationService {
|
|
@@ -40,10 +53,13 @@ public class StockPreparationServiceImpl implements StockPreparationService {
|
|
|
private StockPreparationMapper stockPreparationMapper;
|
|
|
|
|
|
@Autowired
|
|
|
+ private OrderService orderService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
private OrderSkuService orderSkuService;
|
|
|
|
|
|
@Autowired
|
|
|
- private OrderService orderService;
|
|
|
+ private OrderSkuBomService orderSkuBomService;
|
|
|
|
|
|
@Autowired
|
|
|
private ProductionTaskService productionTaskService;
|
|
@@ -52,10 +68,13 @@ public class StockPreparationServiceImpl implements StockPreparationService {
|
|
|
private ProductionWorkOrderService productionWorkOrderService;
|
|
|
|
|
|
@Autowired
|
|
|
+ private SkuService skuService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
private SkuSpecService skuSpecService;
|
|
|
|
|
|
@Autowired
|
|
|
- private SkuService skuService;
|
|
|
+ private InOutStorageService inOutStorageService;
|
|
|
|
|
|
@Override
|
|
|
public List<StockPreparationVo> uncompletedList(StockPreparationDto dto) {
|
|
@@ -80,7 +99,6 @@ public class StockPreparationServiceImpl implements StockPreparationService {
|
|
|
|
|
|
// 更爱状态为已备料
|
|
|
List<OrderSku> orderSkuList = orderSkuService.list(q -> q
|
|
|
- .select(BaseIdPo::getId, OrderSku::getStockPreparationStatus, OrderSku::getOrderId)
|
|
|
.eq(OrderSku::getStockPreparationStatus, StatusConstant.NO)
|
|
|
.in(BaseIdPo::getId, orderSkuIdList));
|
|
|
|
|
@@ -88,45 +106,34 @@ public class StockPreparationServiceImpl implements StockPreparationService {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ // 订单sku出库
|
|
|
Date stockPreparationTime = new Date();
|
|
|
- for (OrderSku orderSku : orderSkuList) {
|
|
|
- orderSku.setStockPreparationTime(stockPreparationTime);
|
|
|
- orderSku.setStockPreparationStatus(StatusConstant.YES);
|
|
|
- }
|
|
|
+ orderSkuList.forEach(item -> {
|
|
|
+ item.setStockPreparationTime(stockPreparationTime);
|
|
|
+ item.setStockPreparationStatus(StatusConstant.YES);
|
|
|
+ });
|
|
|
orderSkuService.updateBatchById(orderSkuList);
|
|
|
|
|
|
+ // 订单id列表
|
|
|
List<Long> orderIdList = orderSkuList.stream().map(OrderSku::getOrderId).distinct().collect(Collectors.toList());
|
|
|
- List<OrderSku> list = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIdList));
|
|
|
- Map<Long, List<OrderSku>> map = list.stream().collect(Collectors.groupingBy(OrderSku::getOrderId));
|
|
|
+
|
|
|
+ // 订单出库
|
|
|
+ orderDelivery(orderIdList, orderSkuList);
|
|
|
|
|
|
List<OrderInfo> orderInfoList = new ArrayList<>();
|
|
|
List<ProductionTask> productionTaskList = new ArrayList<>();
|
|
|
List<ProductionWorkOrder> productionWorkOrderList = new ArrayList<>();
|
|
|
|
|
|
+ // 生产任务、生产工单
|
|
|
+ Map<Long, List<OrderSku>> map = orderSkuList.stream().collect(Collectors.groupingBy(OrderSku::getOrderId));
|
|
|
map.forEach((orderId, itemOrderSkuList) -> {
|
|
|
-
|
|
|
- // 订单中未备料数量
|
|
|
- long count = itemOrderSkuList.stream()
|
|
|
- .map(OrderSku::getStockPreparationStatus)
|
|
|
- .filter(StatusConstant.NO::equals)
|
|
|
- .count();
|
|
|
-
|
|
|
- // 存在未备料的订单sku,不执行以下逻辑
|
|
|
- if (count > 0) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
// 订单状态改为 生产中
|
|
|
addOrderInfo(orderId, orderInfoList);
|
|
|
-
|
|
|
// 添加 生产任务、工单
|
|
|
addTaskAndWorkOrder(orderId, itemOrderSkuList, productionTaskList, productionWorkOrderList);
|
|
|
-
|
|
|
- // 出库
|
|
|
-
|
|
|
-
|
|
|
});
|
|
|
|
|
|
+ // 保存数据
|
|
|
if (orderInfoList.size() > 0) {
|
|
|
orderService.updateBatchById(orderInfoList);
|
|
|
}
|
|
@@ -223,4 +230,66 @@ public class StockPreparationServiceImpl implements StockPreparationService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 订单出库
|
|
|
+ */
|
|
|
+ private void orderDelivery(List<Long> orderIdList, List<OrderSku> orderSkuList) {
|
|
|
+
|
|
|
+ List<OrderSkuBom> orderSkuBomList = orderSkuBomService.list(q -> q.in(OrderSkuBom::getOrderId, orderIdList));
|
|
|
+
|
|
|
+ Stream<InOutStorageBom> streamList = Stream.concat(
|
|
|
+ orderSkuList.stream().map(item -> {
|
|
|
+ InOutStorageBom inOutStorageBom = new InOutStorageBom();
|
|
|
+ inOutStorageBom.setBomSpecId(item.getBomSpecId());
|
|
|
+ inOutStorageBom.setQuantity(item.getQuantity());
|
|
|
+ return inOutStorageBom;
|
|
|
+ }),
|
|
|
+ orderSkuBomList.stream().map(item -> {
|
|
|
+ InOutStorageBom inOutStorageBom = new InOutStorageBom();
|
|
|
+ inOutStorageBom.setBomSpecId(item.getBomSpecId());
|
|
|
+ inOutStorageBom.setQuantity(item.getQuantity());
|
|
|
+ return inOutStorageBom;
|
|
|
+ })
|
|
|
+ );
|
|
|
+
|
|
|
+ List<Long> bomSpecIdList = streamList.map(InOutStorageBom::getBomSpecId).collect(Collectors.toList());
|
|
|
+ Map<Long, BomSpecBo> bomSpecBo = skuSpecService.getBomSpecBoByIdList(bomSpecIdList);
|
|
|
+
|
|
|
+
|
|
|
+ // 主材从半成品仓出库
|
|
|
+ InOutStorageDto semiFinishedProduct = new InOutStorageDto();
|
|
|
+ semiFinishedProduct.setType(InOutTypeEnum.OUT.getKey());
|
|
|
+ semiFinishedProduct.setDetailType(OutDetailTypeEnum.PRODUCTION.getKey());
|
|
|
+ semiFinishedProduct.setWarehouseId(WarehouseConstant.SEMI_FINISHED_PRODUCT);
|
|
|
+ semiFinishedProduct.setDepartmentId(DepartmentConstant.SD_SPORTS);
|
|
|
+ semiFinishedProduct.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
|
|
|
+ List<InOutStorageBom> semiFinishedProductInOutStorageBomList = streamList.filter(item -> {
|
|
|
+ BomSpecBo tempBomSpecBo = bomSpecBo.get(item.getBomSpecId());
|
|
|
+ if (tempBomSpecBo == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return ObjectUtil.equal(tempBomSpecBo.getClassifyParentId(), 1L);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ semiFinishedProduct.setInOutStorageBomList(semiFinishedProductInOutStorageBomList);
|
|
|
+ inOutStorageService.add(semiFinishedProduct);
|
|
|
+
|
|
|
+ // 包材从包材仓出库
|
|
|
+ InOutStorageDto packagingMaterial = new InOutStorageDto();
|
|
|
+ packagingMaterial.setType(InOutTypeEnum.OUT.getKey());
|
|
|
+ packagingMaterial.setDetailType(OutDetailTypeEnum.PRODUCTION.getKey());
|
|
|
+ packagingMaterial.setWarehouseId(WarehouseConstant.PACKAGING_MATERIAL);
|
|
|
+ packagingMaterial.setDepartmentId(DepartmentConstant.SD_SPORTS);
|
|
|
+ packagingMaterial.setApplicant(SecurityUtils.getLoginUser().getUser().getNickName());
|
|
|
+ List<InOutStorageBom> packagingMaterialInOutStorageBomList = streamList.filter(item -> {
|
|
|
+ BomSpecBo tempBomSpecBo = bomSpecBo.get(item.getBomSpecId());
|
|
|
+ if (tempBomSpecBo == null) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return ObjectUtil.notEqual(tempBomSpecBo.getClassifyParentId(), 1L);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ packagingMaterial.setInOutStorageBomList(packagingMaterialInOutStorageBomList);
|
|
|
+ inOutStorageService.add(packagingMaterial);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|