|
|
@@ -5,19 +5,21 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.ruoyi.common.core.component.TaskCodeGenerator;
|
|
|
+import com.ruoyi.common.core.constant.ServiceConstants;
|
|
|
import com.ruoyi.common.core.exception.base.BaseException;
|
|
|
import com.ruoyi.common.core.utils.OrderNoGenerator;
|
|
|
import com.ruoyi.wms.domain.constant.TaskStatus;
|
|
|
import com.ruoyi.wms.domain.dto.TaskAddDto;
|
|
|
import com.ruoyi.wms.domain.dto.TaskItemSkuDto;
|
|
|
import com.ruoyi.wms.domain.entity.*;
|
|
|
+import com.ruoyi.wms.domain.po.UnitPo;
|
|
|
import com.ruoyi.wms.mapper.WmsTaskMapper;
|
|
|
import com.ruoyi.wms.service.*;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
@@ -41,8 +43,6 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
|
|
|
|
|
|
private final WmsBomItemService wmsBomItemService;
|
|
|
|
|
|
- private final WmsBomVersionService wmsBomVersionService;
|
|
|
-
|
|
|
private final ShipmentOrderService shipmentOrderService;
|
|
|
|
|
|
private final ShipmentOrderDetailService shipmentOrderDetailService;
|
|
|
@@ -70,72 +70,73 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
|
|
|
|
|
|
// 任务明细
|
|
|
List<WmsTaskDetails> wmsTaskDetails = wmsTaskDetailsService.lambdaQuery().eq(WmsTaskDetails::getTaskId, wmsTask.getId()).list();
|
|
|
- List<Long> versionList = wmsTaskDetails.stream().map(WmsTaskDetails::getVersionId).toList();
|
|
|
+ Map<Long, Integer> versionMap = wmsTaskDetails.stream().collect(Collectors.toMap(WmsTaskDetails::getVersionId, WmsTaskDetails::getQuantity));
|
|
|
+
|
|
|
// BOM明细
|
|
|
- List<WmsBomItem> wmsBomItems = wmsBomItemService.lambdaQuery().in(WmsBomItem::getVersionId, versionList).list();
|
|
|
+ List<WmsBomItem> wmsBomItems = wmsBomItemService.lambdaQuery().in(WmsBomItem::getVersionId, versionMap.keySet()).list();
|
|
|
List<Long> itemSkuIdList = wmsBomItems.stream().map(WmsBomItem::getItemSkuId).toList();
|
|
|
// 库存
|
|
|
List<Inventory> inventoryList = inventoryService.lambdaQuery()
|
|
|
.eq(Inventory::getSkuId, itemSkuIdList)
|
|
|
.orderByDesc(Inventory::getQuantity)
|
|
|
.list();
|
|
|
-
|
|
|
// 库存处理
|
|
|
Map<Long, List<Inventory>> inventoryMap = inventoryList.stream().collect(Collectors.groupingBy(Inventory::getSkuId));
|
|
|
|
|
|
// 出库单
|
|
|
- Map<String, ShipmentOrder> shipmentOrderMap = new HashMap<>();
|
|
|
+ Map<Long, ShipmentOrder> shipmentOrderMap = new HashMap<>();
|
|
|
+
|
|
|
Map<String, ShipmentOrderDetail> shipmentOrderDetailMap = new HashMap<>();
|
|
|
- //
|
|
|
|
|
|
- List<Inventory> list = new ArrayList<>();
|
|
|
- for (WmsBomItem wmsBomItem : wmsBomItems) {
|
|
|
- List<Inventory> inventories = inventoryMap.get(wmsBomItem.getItemSkuId());
|
|
|
- for (Inventory inventory : inventories) {
|
|
|
- list.add(inventory);
|
|
|
- String shipmentOrderDetailKey = inventory.getWarehouseId() + "," + wmsBomItem.getItemSkuId();
|
|
|
- String shipmentOrderKey = inventory.getWarehouseId() + ",";
|
|
|
- ShipmentOrder shipmentOrder = shipmentOrderMap.get(inventory.getWarehouseId() + "");
|
|
|
+ // 汇总出库原料
|
|
|
+ Map<Long, UnitPo> bomItemQuantityMap = getLongBigDecimalMap(wmsBomItems, versionMap);
|
|
|
+
|
|
|
+ for (Long skuId : bomItemQuantityMap.keySet()) {
|
|
|
+ List<Inventory> inventories = inventoryMap.get(skuId);
|
|
|
+
|
|
|
+ for (int i = 0; i < inventories.size(); i++) {
|
|
|
+ Inventory inventory = inventories.get(i);
|
|
|
+ String shipmentOrderDetailKey = inventory.getWarehouseId() + "," + skuId;
|
|
|
+ Long warehouseId = inventory.getWarehouseId();
|
|
|
+
|
|
|
+ // 出库单
|
|
|
+ ShipmentOrder shipmentOrder = shipmentOrderMap.get(warehouseId);
|
|
|
if (shipmentOrder == null) {
|
|
|
shipmentOrder = new ShipmentOrder();
|
|
|
shipmentOrder.setId(IdWorker.getId());
|
|
|
shipmentOrder.setOrderNo(OrderNoGenerator.generateCK());
|
|
|
+ shipmentOrder.setTaskId(wmsTask.getId());
|
|
|
shipmentOrder.setWarehouseId(inventory.getWarehouseId());
|
|
|
- shipmentOrderMap.putIfAbsent(shipmentOrderKey, shipmentOrder);
|
|
|
+ shipmentOrder.setOrderStatus(ServiceConstants.ShipmentOrderStatus.PENDING);
|
|
|
+ shipmentOrderMap.putIfAbsent(warehouseId, shipmentOrder);
|
|
|
}
|
|
|
|
|
|
+ // 出库明细
|
|
|
ShipmentOrderDetail shipmentOrderDetail = shipmentOrderDetailMap.get(shipmentOrderDetailKey);
|
|
|
if (shipmentOrderDetail == null) {
|
|
|
shipmentOrderDetail = new ShipmentOrderDetail();
|
|
|
shipmentOrderDetail.setWarehouseId(inventory.getWarehouseId());
|
|
|
- shipmentOrderDetail.setSkuId(wmsBomItem.getItemSkuId());
|
|
|
+ shipmentOrderDetail.setSkuId(skuId);
|
|
|
shipmentOrderDetail.setOrderId(shipmentOrder.getId());
|
|
|
- shipmentOrderDetail.setQuantity(wmsBomItem.getQuantity());
|
|
|
- shipmentOrderDetail.setUnit(wmsBomItem.getUnit());
|
|
|
- shipmentOrderMap.putIfAbsent(shipmentOrderKey, shipmentOrder);
|
|
|
shipmentOrderDetailMap.putIfAbsent(shipmentOrderDetailKey, shipmentOrderDetail);
|
|
|
- } else {
|
|
|
- shipmentOrderDetail.setQuantity(shipmentOrderDetail.getQuantity().add(wmsBomItem.getQuantity()));
|
|
|
}
|
|
|
|
|
|
- if (inventory.getQuantity().compareTo(wmsBomItem.getQuantity()) > 0) {
|
|
|
- BigDecimal subtract = inventory.getQuantity().subtract(wmsBomItem.getQuantity());
|
|
|
- wmsBomItem.setQuantity(new BigDecimal(0));
|
|
|
- inventory.setQuantity(subtract);
|
|
|
+ UnitPo unitPo = bomItemQuantityMap.get(skuId);
|
|
|
+ shipmentOrderDetail.setUnit(unitPo.getBaseUnit());
|
|
|
+ shipmentOrderDetail.setBaseUnit(unitPo.getBaseUnit());
|
|
|
+ if (unitPo.getBaseQuantity().compareTo(inventory.getQuantity()) < 0 || i == inventories.size() - 1) {
|
|
|
+ shipmentOrderDetail.setQuantity(unitPo.getBaseQuantity());
|
|
|
+ shipmentOrderDetail.setBaseQuantity(unitPo.getBaseQuantity());
|
|
|
break;
|
|
|
} else {
|
|
|
- BigDecimal subtract = wmsBomItem.getQuantity().subtract(inventory.getQuantity());
|
|
|
- wmsBomItem.setQuantity(subtract);
|
|
|
- inventory.setQuantity(new BigDecimal(0));
|
|
|
- }
|
|
|
-
|
|
|
- if (wmsBomItem.getQuantity().compareTo(new BigDecimal(0)) > 0) {
|
|
|
- throw new BaseException("库存不足:%s".formatted(wmsBomItem.getItemSkuId()));
|
|
|
+ shipmentOrderDetail.setQuantity(inventory.getQuantity());
|
|
|
+ shipmentOrderDetail.setBaseQuantity(inventory.getQuantity());
|
|
|
}
|
|
|
-
|
|
|
+ BigDecimal subtract = unitPo.getBaseQuantity().subtract(inventory.getQuantity());
|
|
|
+ unitPo.setBaseQuantity(subtract);
|
|
|
}
|
|
|
}
|
|
|
- inventoryService.updateBatchById(list);
|
|
|
+
|
|
|
shipmentOrderService.saveBatch(shipmentOrderMap.values());
|
|
|
shipmentOrderDetailService.saveBatch(shipmentOrderDetailMap.values());
|
|
|
|
|
|
@@ -143,11 +144,37 @@ public class WmsTaskServiceImpl extends ServiceImpl<WmsTaskMapper, WmsTask>
|
|
|
this.updateById(wmsTask);
|
|
|
}
|
|
|
|
|
|
+ @NotNull
|
|
|
+ private static Map<Long, UnitPo> getLongBigDecimalMap(List<WmsBomItem> wmsBomItems, Map<Long, Integer> versionMap) {
|
|
|
+ Map<Long, UnitPo> bomItemQuantityMap = new HashMap<>();
|
|
|
+ for (WmsBomItem wmsBomItem : wmsBomItems) {
|
|
|
+ UnitPo unitPo = bomItemQuantityMap.get(wmsBomItem.getItemSkuId());
|
|
|
+ Integer i = versionMap.get(wmsBomItem.getVersionId());
|
|
|
+ BigDecimal add = wmsBomItem.getBaseQuantity().add(new BigDecimal(i));
|
|
|
+ if (unitPo == null) {
|
|
|
+ bomItemQuantityMap.put(wmsBomItem.getItemSkuId(), new UnitPo(wmsBomItem.getBaseUnit(), add));
|
|
|
+ } else {
|
|
|
+ BigDecimal add1 = unitPo.getBaseQuantity().add(add);
|
|
|
+ unitPo.setBaseQuantity(add1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return bomItemQuantityMap;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void revoke(String id) {
|
|
|
WmsTask wmsTask = this.getById(id);
|
|
|
Assert.notNull(wmsTask, "任务单不存在");
|
|
|
|
|
|
+ List<ShipmentOrder> list = shipmentOrderService.lambdaQuery()
|
|
|
+ .eq(ShipmentOrder::getTaskId, wmsTask.getId())
|
|
|
+ .eq(ShipmentOrder::getOrderStatus, ServiceConstants.ShipmentOrderStatus.FINISH)
|
|
|
+ .list();
|
|
|
+
|
|
|
+ if (!list.isEmpty()) {
|
|
|
+ throw new BaseException("生产任务所需要的原料已出库,生产任务已无法作废");
|
|
|
+ }
|
|
|
+
|
|
|
wmsTask.setStatus(TaskStatus.TASK_STATUS_3.getCode());
|
|
|
this.updateById(wmsTask);
|
|
|
}
|