|
@@ -1,7 +1,6 @@
|
|
|
package com.sd.business.service.production.impl;
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
-import com.baomidou.mybatisplus.core.toolkit.Assert;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.ruoyi.common.constant.StatusConstant;
|
|
@@ -16,6 +15,7 @@ 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.inventory.po.Inventory;
|
|
|
import com.sd.business.entity.order.enums.OrderExceptionTypeEnum;
|
|
|
import com.sd.business.entity.order.enums.OrderStatusEnum;
|
|
|
import com.sd.business.entity.order.po.OrderInfo;
|
|
@@ -24,6 +24,7 @@ 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.OutBomVo;
|
|
|
import com.sd.business.entity.production.vo.PackageBomVo;
|
|
|
import com.sd.business.entity.production.vo.StockPreparationVo;
|
|
|
import com.sd.business.entity.production.vo.UncompletedVo;
|
|
@@ -35,6 +36,7 @@ import com.sd.business.service.bom.BomClassifyService;
|
|
|
import com.sd.business.service.bom.BomService;
|
|
|
import com.sd.business.service.bom.BomSpecService;
|
|
|
import com.sd.business.service.in.InOutStorageService;
|
|
|
+import com.sd.business.service.inventory.InventoryService;
|
|
|
import com.sd.business.service.order.OrderService;
|
|
|
import com.sd.business.service.order.OrderSkuBomService;
|
|
|
import com.sd.business.service.order.OrderSkuService;
|
|
@@ -43,6 +45,7 @@ import com.sd.business.service.production.ProductionWorkOrderService;
|
|
|
import com.sd.business.service.production.StockPreparationService;
|
|
|
import com.sd.business.service.sku.SkuService;
|
|
|
import com.sd.business.service.sku.SkuSpecService;
|
|
|
+import com.sd.framework.util.Assert;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -93,19 +96,13 @@ public class StockPreparationServiceImpl implements StockPreparationService {
|
|
|
@Autowired
|
|
|
private BomClassifyService bomClassifyService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private InventoryService inventoryService;
|
|
|
+
|
|
|
@Override
|
|
|
public List<UncompletedVo> uncompletedList(StockPreparationDto dto) {
|
|
|
- Assert.notNull(dto.getDepartmentId(), "事业部id不能为空");
|
|
|
|
|
|
- IWrapper<StockPreparationVo> wrapper = IWrapper.getWrapper();
|
|
|
- wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.STOCK_PREPARATION.getKey());
|
|
|
- wrapper.eq("oi", OrderInfo::getExceptionType, OrderExceptionTypeEnum.NORMAL.getKey().toString());
|
|
|
- wrapper.eq("os", OrderSku::getStockPreparationStatus, StatusConstant.NO);
|
|
|
- wrapper.eq("oi", OrderInfo::getDepartmentId, dto.getDepartmentId());
|
|
|
- wrapper.eq("bs", BomSpec::getCode, dto.getBomSpecCode());
|
|
|
- wrapper.eq("bs", BomSpec::getName, dto.getBomSpecName());
|
|
|
- wrapper.eq("ss", SkuSpec::getCode, dto.getSkuSpecCode());
|
|
|
- wrapper.eq("ss", SkuSpec::getName, dto.getSkuSpecName());
|
|
|
+ IWrapper<StockPreparationVo> wrapper = getWrapper(dto);
|
|
|
List<StockPreparationVo> stockPreparationVoList = stockPreparationMapper.uncompletedList(wrapper);
|
|
|
|
|
|
return new ArrayList<>(stockPreparationVoList.stream().collect(Collectors.toMap(
|
|
@@ -255,6 +252,130 @@ public class StockPreparationServiceImpl implements StockPreparationService {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<OutBomVo> outBomList(StockPreparationDto dto) {
|
|
|
+ Long outDepartmentId = dto.getOutDepartmentId();
|
|
|
+ Assert.notNull(outDepartmentId, "出库事业部id不能为空");
|
|
|
+
|
|
|
+ // 订单sku列表
|
|
|
+ IWrapper<StockPreparationVo> wrapper = getWrapper(dto);
|
|
|
+ List<StockPreparationVo> stockPreparationVoList = stockPreparationMapper.uncompletedList(wrapper);
|
|
|
+
|
|
|
+ // 订单sku包材列表
|
|
|
+ List<Long> orderSkuIdList = stockPreparationVoList.stream().map(StockPreparationVo::getOrderSkuId).collect(Collectors.toList());
|
|
|
+ List<OrderSkuBom> orderSkuBomList = orderSkuBomService.listByIds(orderSkuIdList);
|
|
|
+
|
|
|
+ // 合并列表
|
|
|
+ List<OutBomVo> outBomVoList = stockPreparationVoList.stream().map(item -> {
|
|
|
+ OutBomVo outBomVo = new OutBomVo();
|
|
|
+ outBomVo.setBomSpecId(item.getBomSpecId());
|
|
|
+ outBomVo.setOutQuantity(item.getQuantity());
|
|
|
+ return outBomVo;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ for (OrderSkuBom orderSkuBom : orderSkuBomList) {
|
|
|
+ OutBomVo outBomVo = new OutBomVo();
|
|
|
+ outBomVo.setBomSpecId(orderSkuBom.getBomSpecId());
|
|
|
+ outBomVo.setOutQuantity(orderSkuBom.getQuantity());
|
|
|
+ outBomVoList.add(outBomVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 合并数量
|
|
|
+ Map<Long, OutBomVo> map = outBomVoList.stream().collect(Collectors.toMap(
|
|
|
+ OutBomVo::getBomSpecId,
|
|
|
+ Function.identity(),
|
|
|
+ (v1, v2) -> {
|
|
|
+ v1.setOutQuantity(v1.getOutQuantity().add(v2.getOutQuantity()));
|
|
|
+ return v1;
|
|
|
+ }
|
|
|
+ ));
|
|
|
+ outBomVoList = new ArrayList<>(map.values());
|
|
|
+
|
|
|
+ // 区分半成品仓和包材仓库
|
|
|
+ Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(map.keySet());
|
|
|
+
|
|
|
+ for (OutBomVo outBomVo : outBomVoList) {
|
|
|
+ Long bomSpecId = outBomVo.getBomSpecId();
|
|
|
+ BomSpecBo bomSpecBo = bomSpecBoMap.get(bomSpecId);
|
|
|
+ outBomVo.setBomSpecCode(bomSpecBo.getBomSpecCode());
|
|
|
+ outBomVo.setBomSpecName(bomSpecBo.getBomSpecName());
|
|
|
+ // 主材
|
|
|
+ if (Objects.equals(bomSpecBo.getClassifyParentId(), 1L)) {
|
|
|
+ outBomVo.setWarehouseId(WarehouseConstant.SEMI_FINISHED_PRODUCT);
|
|
|
+ outBomVo.setWarehouseName("半成品仓");
|
|
|
+ }
|
|
|
+ // 包材
|
|
|
+ else {
|
|
|
+ outBomVo.setWarehouseId(WarehouseConstant.PACKAGING_MATERIAL);
|
|
|
+ outBomVo.setWarehouseName("包材仓");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 主材库存
|
|
|
+ Map<Long, BigDecimal> semiFinishedProductInventoryMap = Collections.emptyMap();
|
|
|
+ List<Long> semiFinishedProductBomSpecIdList = outBomVoList.stream()
|
|
|
+ .filter(item -> WarehouseConstant.SEMI_FINISHED_PRODUCT.equals(item.getWarehouseId()))
|
|
|
+ .map(OutBomVo::getBomSpecId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (semiFinishedProductBomSpecIdList.size() > 0) {
|
|
|
+ semiFinishedProductInventoryMap = inventoryService.mapKV(
|
|
|
+ Inventory::getBomSpecId,
|
|
|
+ Inventory::getQuantity,
|
|
|
+ q -> q.eq(Inventory::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
|
|
|
+ .eq(Inventory::getDepartmentId, outDepartmentId)
|
|
|
+ .in(Inventory::getBomSpecId, semiFinishedProductBomSpecIdList)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // 包材库存
|
|
|
+ Map<Long, BigDecimal> packagingMaterialInventoryMap = Collections.emptyMap();
|
|
|
+ List<Long> packagingMaterialBomSpecIdList = outBomVoList.stream()
|
|
|
+ .filter(item -> WarehouseConstant.PACKAGING_MATERIAL.equals(item.getWarehouseId()))
|
|
|
+ .map(OutBomVo::getBomSpecId)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (packagingMaterialBomSpecIdList.size() > 0) {
|
|
|
+ packagingMaterialInventoryMap = inventoryService.mapKV(
|
|
|
+ Inventory::getBomSpecId,
|
|
|
+ Inventory::getQuantity,
|
|
|
+ q -> q.eq(Inventory::getWarehouseId, WarehouseConstant.PACKAGING_MATERIAL)
|
|
|
+ .eq(Inventory::getDepartmentId, outDepartmentId)
|
|
|
+ .in(Inventory::getBomSpecId, semiFinishedProductBomSpecIdList)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // 赋值库存
|
|
|
+ for (OutBomVo outBomVo : outBomVoList) {
|
|
|
+ if (WarehouseConstant.SEMI_FINISHED_PRODUCT.equals(outBomVo.getWarehouseId())) {
|
|
|
+ outBomVo.setInventoryQuantity(semiFinishedProductInventoryMap.getOrDefault(outBomVo.getBomSpecId(), BigDecimal.ZERO));
|
|
|
+ } else {
|
|
|
+ outBomVo.setInventoryQuantity(packagingMaterialInventoryMap.getOrDefault(outBomVo.getBomSpecId(), BigDecimal.ZERO));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return outBomVoList.stream()
|
|
|
+ .sorted(Comparator.comparing(OutBomVo::getWarehouseId, Comparator.reverseOrder()).thenComparing(OutBomVo::getBomSpecCode))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取wrapper
|
|
|
+ */
|
|
|
+ private IWrapper<StockPreparationVo> getWrapper(StockPreparationDto dto) {
|
|
|
+ Assert.notNull(dto.getDepartmentId(), "事业部id不能为空");
|
|
|
+
|
|
|
+ IWrapper<StockPreparationVo> wrapper = IWrapper.getWrapper();
|
|
|
+ wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.STOCK_PREPARATION.getKey());
|
|
|
+ wrapper.eq("oi", OrderInfo::getExceptionType, OrderExceptionTypeEnum.NORMAL.getKey().toString());
|
|
|
+ wrapper.eq("os", OrderSku::getStockPreparationStatus, StatusConstant.NO);
|
|
|
+ wrapper.eq("oi", OrderInfo::getDepartmentId, dto.getDepartmentId());
|
|
|
+ wrapper.eq("bs", BomSpec::getCode, dto.getBomSpecCode());
|
|
|
+ wrapper.eq("bs", BomSpec::getName, dto.getBomSpecName());
|
|
|
+ wrapper.eq("ss", SkuSpec::getCode, dto.getSkuSpecCode());
|
|
|
+ wrapper.eq("ss", SkuSpec::getName, dto.getSkuSpecName());
|
|
|
+ return wrapper;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 订单状态改为 生产中
|
|
|
*/
|