|
|
@@ -48,6 +48,7 @@ public class ReplenishmentOrderServiceImpl extends ServiceImpl<ReplenishmentOrde
|
|
|
private final DeviceInventoryMapper deviceInventoryMapper;
|
|
|
private final ProductMapper productMapper;
|
|
|
private final ErpGoodsMapper erpGoodsMapper;
|
|
|
+ private final com.haha.service.DeviceInventoryService deviceInventoryService;
|
|
|
|
|
|
@Autowired(required = false)
|
|
|
private QdbClient qdbClient;
|
|
|
@@ -454,48 +455,73 @@ public class ReplenishmentOrderServiceImpl extends ServiceImpl<ReplenishmentOrde
|
|
|
throw new BusinessException(400, "仅已同步ERP的补货单可完成");
|
|
|
}
|
|
|
|
|
|
- // 同步更新设备库存
|
|
|
+ // 同步更新设备库存(批量优化)
|
|
|
List<ReplenishmentOrderItem> items = orderItemMapper.selectByOrderId(id);
|
|
|
- for (ReplenishmentOrderItem item : items) {
|
|
|
- if (item.getPlannedQuantity() == null || item.getPlannedQuantity() <= 0) continue;
|
|
|
-
|
|
|
- // 查找或创建库存记录(用 productId 匹配,与其他路径保持一致)
|
|
|
- DeviceInventory inv = deviceInventoryMapper.selectByDeviceAndProduct(
|
|
|
- order.getDeviceId(), item.getProductId());
|
|
|
- if (inv == null) {
|
|
|
- inv = new DeviceInventory();
|
|
|
- inv.setDeviceId(order.getDeviceId());
|
|
|
- inv.setProductId(item.getProductId());
|
|
|
- inv.setProductCode(item.getProductCode());
|
|
|
- inv.setProductName(item.getProductName());
|
|
|
- inv.setStock(0);
|
|
|
- inv.setShelfNum(item.getShelfNum());
|
|
|
- inv.setPosition(item.getPosition());
|
|
|
- inv.setWarningThreshold(5);
|
|
|
- inv.setCreateTime(LocalDateTime.now());
|
|
|
- inv.setUpdateTime(LocalDateTime.now());
|
|
|
+ List<ReplenishmentOrderItem> validItems = items.stream()
|
|
|
+ .filter(it -> it.getPlannedQuantity() != null && it.getPlannedQuantity() > 0)
|
|
|
+ .toList();
|
|
|
+
|
|
|
+ if (!validItems.isEmpty()) {
|
|
|
+ // 1. 批量查询已有库存(1 次 SELECT IN)
|
|
|
+ List<Long> productIds = validItems.stream()
|
|
|
+ .map(ReplenishmentOrderItem::getProductId).toList();
|
|
|
+ List<DeviceInventory> existingInventories = deviceInventoryMapper.selectList(
|
|
|
+ new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<DeviceInventory>()
|
|
|
+ .eq(DeviceInventory::getDeviceId, order.getDeviceId())
|
|
|
+ .in(DeviceInventory::getProductId, productIds));
|
|
|
+ Map<Long, DeviceInventory> inventoryByProductId = new HashMap<>();
|
|
|
+ for (DeviceInventory inv : existingInventories) {
|
|
|
+ inventoryByProductId.put(inv.getProductId(), inv);
|
|
|
}
|
|
|
|
|
|
- int beforeStock = inv.getStock() != null ? inv.getStock() : 0;
|
|
|
- int afterStock = beforeStock + item.getPlannedQuantity();
|
|
|
- inv.setStock(afterStock);
|
|
|
- inv.setLastRestockTime(LocalDateTime.now());
|
|
|
- inv.setUpdateTime(LocalDateTime.now());
|
|
|
- if (inv.getId() == null) {
|
|
|
- deviceInventoryMapper.insert(inv);
|
|
|
- } else {
|
|
|
- deviceInventoryMapper.updateById(inv);
|
|
|
+ // 2. 区分新建和更新
|
|
|
+ List<DeviceInventory> toInsert = new ArrayList<>();
|
|
|
+ List<DeviceInventory> toUpdate = new ArrayList<>();
|
|
|
+
|
|
|
+ for (ReplenishmentOrderItem item : validItems) {
|
|
|
+ DeviceInventory inv = inventoryByProductId.get(item.getProductId());
|
|
|
+ if (inv == null) {
|
|
|
+ inv = new DeviceInventory();
|
|
|
+ inv.setDeviceId(order.getDeviceId());
|
|
|
+ inv.setProductId(item.getProductId());
|
|
|
+ inv.setProductCode(item.getProductCode());
|
|
|
+ inv.setProductName(item.getProductName());
|
|
|
+ inv.setStock(0);
|
|
|
+ inv.setShelfNum(item.getShelfNum());
|
|
|
+ inv.setPosition(item.getPosition());
|
|
|
+ inv.setWarningThreshold(5);
|
|
|
+ inv.setCreateTime(LocalDateTime.now());
|
|
|
+ }
|
|
|
+
|
|
|
+ int beforeStock = inv.getStock() != null ? inv.getStock() : 0;
|
|
|
+ int afterStock = beforeStock + item.getPlannedQuantity();
|
|
|
+ inv.setStock(afterStock);
|
|
|
+ inv.setLastRestockTime(LocalDateTime.now());
|
|
|
+ inv.setUpdateTime(LocalDateTime.now());
|
|
|
+ (inv.getId() == null ? toInsert : toUpdate).add(inv);
|
|
|
+
|
|
|
+ item.setBeforeStock(beforeStock);
|
|
|
+ item.setAfterStock(afterStock);
|
|
|
+ if (item.getActualQuantity() == null) {
|
|
|
+ item.setActualQuantity(item.getPlannedQuantity());
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("更新设备库存: deviceId={}, productCode={}, {} -> {}",
|
|
|
+ order.getDeviceId(), item.getProductCode(), beforeStock, afterStock);
|
|
|
}
|
|
|
|
|
|
- item.setBeforeStock(beforeStock);
|
|
|
- item.setAfterStock(afterStock);
|
|
|
- if (item.getActualQuantity() == null) {
|
|
|
- item.setActualQuantity(item.getPlannedQuantity());
|
|
|
+ // 3. 批量写入(1 次批量 INSERT + 1 次批量 UPDATE)
|
|
|
+ if (!toInsert.isEmpty()) {
|
|
|
+ deviceInventoryService.saveBatch(toInsert);
|
|
|
+ }
|
|
|
+ if (!toUpdate.isEmpty()) {
|
|
|
+ deviceInventoryService.updateBatchById(toUpdate);
|
|
|
}
|
|
|
- orderItemMapper.updateById(item);
|
|
|
|
|
|
- log.info("更新设备库存: deviceId={}, productCode={}, {} -> {}",
|
|
|
- order.getDeviceId(), item.getProductCode(), beforeStock, afterStock);
|
|
|
+ // 4. 更新补货单明细的 beforeStock/afterStock(已从内存设置,逐条 updateById)
|
|
|
+ for (ReplenishmentOrderItem item : validItems) {
|
|
|
+ orderItemMapper.updateById(item);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
order.setStatus(ReplenishmentOrderStatusEnum.COMPLETED.getCode());
|