refactor(wms): 优化调拨订单和钢卷信息更新逻辑

- 使用LambdaUpdateWrapper替代直接对象更新,支持显式设置NULL值
- 在审批通过时设置调拨状态为1
- 修复钢卷信息批量更新逻辑,使用updateBatchById提高性能
- 添加调拨后物料ID和类型校验,确保数据一致性
- 批量更新调拨明细的isTransferred字段标记为已调拨
- 过滤条件从调拨前值改为调拨后值进行验证
- 添加空值检查避免无效更新操作
This commit is contained in:
2026-04-10 15:07:29 +08:00
parent 92441e569e
commit 57b07885e3
2 changed files with 53 additions and 23 deletions

View File

@@ -5,6 +5,7 @@ import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import com.klp.domain.*;
@@ -620,17 +621,23 @@ public class WmsTransferOrderItemServiceImpl implements IWmsTransferOrderItemSer
Long originalMaterialType = item.getMaterialTypeBefore();
Long originalWarehouseId = item.getWarehouseIdBefore();
// 使用 UpdateWrapper 显式更新字段包括NULL值
LambdaUpdateWrapper<WmsMaterialCoil> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(WmsMaterialCoil::getCoilId, coilId);
// 设置需要更新的字段
if (originalItemId != null && originalMaterialType != null) {
coil.setItemId(originalItemId);
coil.setItemType(originalMaterialType == 1 ? "raw_material" : "product");
coil.setMaterialType(originalMaterialType == 1 ? "原料" : "成品");
updateWrapper.set(WmsMaterialCoil::getItemId, originalItemId);
updateWrapper.set(WmsMaterialCoil::getItemType, originalMaterialType == 1 ? "raw_material" : "product");
updateWrapper.set(WmsMaterialCoil::getMaterialType, originalMaterialType == 1 ? "原料" : "成品");
}
if (originalWarehouseId != null) {
coil.setWarehouseId(originalWarehouseId);
updateWrapper.set(WmsMaterialCoil::getWarehouseId, originalWarehouseId);
}
// 清空调拨类型
coil.setTransferType(null);
coilMapper.updateById(coil);
// 清空调拨类型显式设置为NULL
updateWrapper.set(WmsMaterialCoil::getTransferType, null);
coilMapper.update(null, updateWrapper);
// 逻辑删除调拨明细记录使用MyBatis-Plus的逻辑删除
baseMapper.deleteById(orderItemId);

View File

@@ -5,6 +5,7 @@ import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
@@ -26,11 +27,7 @@ import com.klp.mapper.WmsProductMapper;
import com.klp.service.IWmsTransferOrderService;
import com.klp.service.IWmsTransferOrderItemService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -162,6 +159,7 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService {
order.setApproveStatus(approveStatus);
order.setApproveBy(LoginHelper.getUsername());
order.setApproveTime(new Date());
order.setTransferStatus(1L);
boolean updateResult = baseMapper.updateById(order) > 0;
// 3. 如果审批通过,批量更新钢卷信息
@@ -173,7 +171,7 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService {
}
/**
* 审批通过时批量更新钢卷信息
* 审批通过时批量更新钢卷信息 需要测试是否报错以及明细isTransfer字段是否改成1 钢卷是否被修改如果不改类型和逻辑库区钢卷的更新人时间就不会变
*/
private void batchUpdateCoilsOnApprove(Long orderId, String transferType) {
// 1. 批量查询调拨明细
@@ -207,9 +205,9 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService {
throw new RuntimeException("部分钢卷不存在");
}
// 5. 收集所有需要校验的itemId使用调拨的值)
// 5. 收集所有需要校验的itemId使用调拨的值)
List<Long> itemIdsToValidate = items.stream()
.map(WmsTransferOrderItem::getItemIdBefore)
.map(WmsTransferOrderItem::getItemIdAfter)
.filter(itemId -> itemId != null)
.distinct()
.collect(Collectors.toList());
@@ -230,6 +228,20 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService {
Long finalItemId = item.getItemIdAfter();
Long finalMaterialType = item.getMaterialTypeAfter();
Long finalWarehouseId = item.getWarehouseIdAfter();
// 如果调拨后的值为空,则不修改该钢卷
if (finalItemId == null && finalMaterialType == null && finalWarehouseId == null) {
return null;
}
// 如果不为空必须itemId和itemType都不为空才能修改
if ((finalItemId != null || finalMaterialType != null)
&& (finalItemId == null || finalMaterialType == null)) {
// itemId和materialType只有一个有值不符合要求跳过
return null;
}
// 计算itemType
String finalItemType = finalMaterialType != null && finalMaterialType == 1 ? "raw_material" : "product";
// 更新钢卷信息
@@ -241,14 +253,25 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService {
return coil;
})
.filter(coil -> coil != null)
.filter(Objects::nonNull)
.collect(Collectors.toList());
// 8. 批量更新数据库
// 8. 批量更新钢卷数据库
if (!coilsToUpdate.isEmpty()) {
for (WmsMaterialCoil coil : coilsToUpdate) {
coilMapper.updateById(coil);
}
coilMapper.updateBatchById(coilsToUpdate);
}
// 9. 批量更新明细的isTransferred字段为1已调拨
List<Long> itemIds = items.stream()
.map(WmsTransferOrderItem::getOrderItemId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (!itemIds.isEmpty()) {
LambdaUpdateWrapper<WmsTransferOrderItem> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(WmsTransferOrderItem::getOrderItemId, itemIds);
updateWrapper.set(WmsTransferOrderItem::getIsTransferred, 1);
wmsTransferOrderItemMapper.update(null, updateWrapper);
}
}
@@ -262,10 +285,10 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService {
// 按物料类型分组
Map<Long, List<Long>> materialTypeGroupMap = items.stream()
.filter(item -> item.getItemIdBefore() != null && item.getMaterialTypeBefore() != null)
.filter(item -> item.getItemIdAfter() != null && item.getMaterialTypeAfter() != null)
.collect(Collectors.groupingBy(
WmsTransferOrderItem::getMaterialTypeBefore,
Collectors.mapping(WmsTransferOrderItem::getItemIdBefore, Collectors.toList())
WmsTransferOrderItem::getMaterialTypeAfter,
Collectors.mapping(WmsTransferOrderItem::getItemIdAfter, Collectors.toList())
));
// 校验原料