feat(wms): 添加转库批量入库接口

- 在IWmsTransferOrderItemService中新增matchOrCreateItemByCoilIds方法
- 添加WmsTransferOrderItemBo的itemTypeAfter字段
- 新增WmsCoilItemTypePairBo导入依赖
- 实现matchOrCreateItemByCoilIds服务端逻辑
- 添加控制器端点/itemType/matchOrCreateByCoils
- 优化material coil更新逻辑的空行格式
- 实现基于钢卷ID列表的物料匹配或创建映射功能
This commit is contained in:
2026-05-18 11:09:39 +08:00
parent 825879c1a8
commit 4010a4dca5
4 changed files with 59 additions and 2 deletions

View File

@@ -624,7 +624,7 @@ public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemSer
// 使用 UpdateWrapper 显式更新字段包括NULL值
LambdaUpdateWrapper<WmsMaterialCoil> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(WmsMaterialCoil::getCoilId, coilId);
// 设置需要更新的字段
if (originalItemId != null && originalMaterialType != null) {
updateWrapper.set(WmsMaterialCoil::getItemId, originalItemId);
@@ -636,7 +636,7 @@ public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemSer
}
// 清空调拨类型显式设置为NULL
updateWrapper.set(WmsMaterialCoil::getTransferType, null);
coilMapper.update(null, updateWrapper);
// 逻辑删除调拨明细记录使用MyBatis-Plus的逻辑删除
@@ -644,4 +644,43 @@ public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemSer
return true;
}
/**
* 根据钢卷列表匹配或创建物料
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Map<Long, Long> matchOrCreateItemByCoilIds(List<WmsTransferOrderItemBo> pairs) {
List<Long> coilIds = pairs.stream().map(WmsTransferOrderItemBo::getCoilId).collect(Collectors.toList());
List<WmsMaterialCoil> coils = coilMapper.selectBatchIds(coilIds);
Map<Long, WmsMaterialCoil> coilMap = coils.stream().collect(Collectors.toMap(WmsMaterialCoil::getCoilId, v -> v, (a, b) -> a));
Map<Long, Long> result = new HashMap<>();
Map<Long, Long> conversionCache = new HashMap<>();
for (WmsTransferOrderItemBo pair : pairs) {
Long coilId = pair.getCoilId();
String itemTypeAfter = pair.getItemTypeAfter();
WmsMaterialCoil coil = coilMap.get(coilId);
if (coil == null) {
throw new IllegalArgumentException("钢卷不存在: " + coilId);
}
Long itemId;
if (Objects.equals(coil.getItemType(), itemTypeAfter)) {
itemId = coil.getItemId();
} else {
Long cached = conversionCache.get(coil.getItemId());
if (cached != null) {
itemId = cached;
} else {
itemId = matchOrCreateMaterial(coil.getItemId(), coil.getItemType());
conversionCache.put(coil.getItemId(), itemId);
}
}
result.put(coilId, itemId);
}
return result;
}
}