refactor(wms): 优化调拨订单和钢卷信息更新逻辑
- 使用LambdaUpdateWrapper替代直接对象更新,支持显式设置NULL值 - 在审批通过时设置调拨状态为1 - 修复钢卷信息批量更新逻辑,使用updateBatchById提高性能 - 添加调拨后物料ID和类型校验,确保数据一致性 - 批量更新调拨明细的isTransferred字段标记为已调拨 - 过滤条件从调拨前值改为调拨后值进行验证 - 添加空值检查避免无效更新操作
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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())
|
||||
));
|
||||
|
||||
// 校验原料
|
||||
|
||||
Reference in New Issue
Block a user