修复采购入库之后更新库存商品内装数,再去更新采购入库,商品总库存没有变化的问题

This commit is contained in:
zjf committed 2025-10-21 16:52:53 +08:00
1 parent 2b7bc8deab
commit 1198def17e
5 files changed
+58 -38

No files matched your search

@@ -96,5 +96,6 @@ public class InventoryRecordEditItemDTO {
@Schema(description="包装单位id")
private Long unitId;
// 注意:packageNum 不需要前端传递,由后端根据 unitId 自动查询并设置
}
@@ -55,5 +55,6 @@ public class InventoryRecordSaveItemDTO {
@Schema(description="实际进价")
private Integer realPrice;
// 注意:packageNum 不需要前端传递,由后端根据 unitId 自动查询并设置
}
@@ -166,4 +166,10 @@ public class SmErpInventoryRecordsItemEntity extends Model<SmErpInventoryRecords
@Schema(description="实际单价")
private Integer realPrice;
/**
* 内装数(保存时的内装数,用于编辑时准确计算库存)
*/
@Schema(description="内装数")
private Integer packageNum;
}
@@ -155,10 +155,16 @@ public class SmErpInventoryRecordsController {
updateStockDTO.setId(cgPlanItemEntity.getErpSpuId());
Double quantity = cgPlanItemEntity.getQuantity();
String orderType = one.getOrderType();
// 使用保存时的内装数,如果没有则查询当前的
Integer packageNum = cgPlanItemEntity.getPackageNum();
if (packageNum == null) {
SmErpUnitEntity unit = smErpUnitService.getById(cgPlanItemEntity.getUnitId());
packageNum = unit != null ? unit.getPackageNum() : 1;
}
if (orderType.equals(OrderTypeEnum.RK.getType())){
updateStockDTO.setIncrCount(quantity);
updateStockDTO.setIncrCount(packageNum * quantity);
}else if (orderType.equals(OrderTypeEnum.CK.getType())){
updateStockDTO.setIncrCount(-quantity);
updateStockDTO.setIncrCount(-packageNum * quantity);
}else if (orderType.equals(OrderTypeEnum.No.getType())){
//无需更新库存
}else {
@@ -120,6 +120,8 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
String orderType = smErpCgDdEntity.getOrderType();
cgPlanItemEntity.setOrderType(orderType);
Integer packageNum = unitMap.get(cgPlanItemEntity.getUnitId()).getPackageNum();
// 保存内装数到item中,用于编辑时准确计算库存
cgPlanItemEntity.setPackageNum(packageNum);
if (orderType.equals(OrderTypeEnum.RK.getType())){
updateStockDTO.setIncrCount(packageNum*quantity);
}else if (orderType.equals(OrderTypeEnum.CK.getType())){
@@ -216,13 +218,19 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
//收集userids
Set<Long> userIds = records.stream()
.map(SmErpInventoryRecordsEntity::getHandlerUserId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
//收集supplierIds
Set<Long> supplierIds = records.stream()
.map(SmErpInventoryRecordsEntity::getSupplierId)
.collect(Collectors.toSet());
//请求得到所有的userIds
Map<Long, SysUser> userMap = remoteUserService.getUserMap(userIds).getData();
Map<Long, SysUser> userMap;
if (!CollectionUtils.isEmpty(userIds)){
userMap = remoteUserService.getUserMap(userIds).getData();
} else {
userMap = new HashMap<>();
}
// List<String> processInstanceIds= records.stream().map(SmErpInventoryRecordsEntity::getProcessInstanceId).filter(Objects::nonNull).collect(Collectors.toList());
LambdaQueryWrapper<SmErpInventoryRecordsItemEntity> smErpCgPlanItemEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -248,7 +256,6 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
// Integer totalAmount = inventoryTotalAmountMap.getOrDefault(record.getId(), 0);
List<SmErpInventoryRecordsItemEntity> smErpInventoryRecordsItemEntityList = smerpInventoryRecordsItemEntityMap.get(record.getId());
// record.setTotalAmount(totalAmount);
//todo 这里有一个问题就是出入库编辑的时候,没有更新主表的totalAmount,所以一直用的子表的totalAmount,子表的totalAmount又存在为空的情况,涉及到多个业务
//存在脏数据,判断下,防止空数据查询报错
if (!CollectionUtils.isEmpty(smErpInventoryRecordsItemEntityList)) {
record.setTotalAmount(smErpInventoryRecordsItemEntityList.stream().mapToInt(item -> item.getTotalAmount()==null?0:item.getTotalAmount()).sum());
@@ -279,19 +286,6 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
Collectors.toList()
)
));
//查询代办任务的task
// TaskQueryParamDto taskQueryParamDto = new TaskQueryParamDto();
// taskQueryParamDto.setProcessInstanceIds(processInstanceIds);
// taskQueryParamDto.setCurrent(1);
// taskQueryParamDto.setSize(processInstanceIds.size());
// R<Page<TaskDto>> pageR = remoteFlowApiFlowService.queryMineTask(taskQueryParamDto);
// Page<TaskDto> data = pageR.getData();
//
// final Map<String, TaskDto> processInstanceIdMap = (data != null && !ObjectUtil.isEmpty(data.getRecords()))
// ? data.getRecords().stream()
// .collect(Collectors.toMap(TaskDto::getProcessInstanceId, taskDto -> taskDto))
// : Collections.emptyMap();
// 设置商品名称到主表实体
records.forEach(plan -> {
//移动端自动扣款入库,无需经办人
@@ -304,15 +298,6 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
String supplierName = supplierMap.getOrDefault(plan.getSupplierId(), new SmErpSupplierEntity()).getSupplierName();
plan.setSupplierName(supplierName);
// if (!processInstanceIdMap.isEmpty()) {
// TaskDto taskDto = processInstanceIdMap.get(plan.getProcessInstanceId());
// if (taskDto != null) {
// plan.setTaskId(taskDto.getTaskId());
// plan.setFlowId(taskDto.getFlowId());
// plan.setParamMap(taskDto.getParamMap());
// plan.setNodeId(taskDto.getNodeId());
// }
// }
});
return pageData;
}
@@ -506,6 +491,8 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
String orderType = item.getOrderType();
smErpInventoryRecordsItemEntity.setOrderType(orderType);
Integer packageNum = unitMap.get(item.getUnitId()).getPackageNum();
// 保存内装数到item中,用于下次编辑时准确计算库存
smErpInventoryRecordsItemEntity.setPackageNum(packageNum);
if (orderType.equals(OrderTypeEnum.RK.getType())){
updateStockDTO.setIncrCount(packageNum*quantity);
}else if (orderType.equals(OrderTypeEnum.CK.getType())){
@@ -535,14 +522,15 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
List<SmErpInventoryRecordsItemEntity> dataBaseSmErpInventoryRecordsItemEntityList = smErpInventoryRecordsItemMapper
.selectList(new LambdaQueryWrapper<SmErpInventoryRecordsItemEntity>().eq(SmErpInventoryRecordsItemEntity::getInventoryId, inventoryRecordEditDTO.getId()));
Set<Long> unitsRemoved = dataBaseSmErpInventoryRecordsItemEntityList.stream().map(s -> s.getUnitId()).collect(Collectors.toSet());
List<SmErpUnitEntity> smErpUnitEntitiesRemoved = smErpUnitMapper.selectList(new LambdaQueryWrapper<SmErpUnitEntity>().in(SmErpUnitEntity::getId, unitsRemoved));
Map<Long, SmErpUnitEntity> unitMapRemoved = smErpUnitEntitiesRemoved.stream().collect(Collectors.toMap(SmErpUnitEntity::getId, unit -> unit));
//这部分是数据库原本添加的库存数据,需要全部减掉,重新添加更新的库存数据进去
dataBaseSmErpInventoryRecordsItemEntityList.forEach(item -> {
Integer packageNum = unitMapRemoved.get(item.getUnitId()).getPackageNum();
// 使用保存时的内装数,而不是查询最新的内装数,这样即使内装数改变了也能正确计算
Integer packageNum = item.getPackageNum();
// 如果之前的数据没有保存内装数(旧数据),则查询当前的内装数作为兜底
if (packageNum == null) {
SmErpUnitEntity unit = smErpUnitMapper.selectById(item.getUnitId());
packageNum = unit != null ? unit.getPackageNum() : 1;
}
UpdateStockDTO updateStockDTO = new UpdateStockDTO();
updateStockDTO.setId(item.getErpSpuId());
if (item.getOrderType().equals(OrderTypeEnum.RK.getType())){
@@ -555,8 +543,14 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
});
smErpInventoryRecordsItemMapper.updateById(updateItems);
smErpInventoryRecordsItemMapper.insert(insertItems);
// 批量更新已存在的明细(包括 packageNum 字段)
if (!CollectionUtils.isEmpty(updateItems)) {
updateItems.forEach(item -> smErpInventoryRecordsItemMapper.updateById(item));
}
// 批量插入新增的明细
if (!CollectionUtils.isEmpty(insertItems)) {
smErpInventoryRecordsItemMapper.insert(insertItems);
}
List<Long> existingCodeIds = smErpInventoryRecordsItemMapper.selectList(
new LambdaQueryWrapper<SmErpInventoryRecordsItemEntity>()
@@ -631,11 +625,17 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
updateStockDTO.setId(item.getErpSpuId());
Double quantity = item.getQuantity();
String orderType = item.getOrderType();
// 使用保存时的内装数,如果没有则查询当前的
Integer packageNum = item.getPackageNum();
if (packageNum == null) {
SmErpUnitEntity unit = smErpUnitMapper.selectById(item.getUnitId());
packageNum = unit != null ? unit.getPackageNum() : 1;
}
//入库的删除就是减去入的库存,所以是负数
if (orderType.equals(OrderTypeEnum.RK.getType())){
updateStockDTO.setIncrCount(-quantity);
updateStockDTO.setIncrCount(-packageNum * quantity);
}else if (orderType.equals(OrderTypeEnum.CK.getType())){
updateStockDTO.setIncrCount(quantity);
updateStockDTO.setIncrCount(packageNum * quantity);
}else {
throw new RuntimeException("订单类型错误");
}
@@ -788,8 +788,14 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventory
updateStockDTOS.add(updateStockDTO);
});
smErpInventoryRecordsItemMapper.updateById(updateItems);
smErpInventoryRecordsItemMapper.insert(insertItems);
// 批量更新已存在的明细
if (!CollectionUtils.isEmpty(updateItems)) {
updateItems.forEach(item -> smErpInventoryRecordsItemMapper.updateById(item));
}
// 批量插入新增的明细
if (!CollectionUtils.isEmpty(insertItems)) {
smErpInventoryRecordsItemMapper.insert(insertItems);
}
List<Long> existingCodeIds = smErpInventoryRecordsItemMapper.selectList(
new LambdaQueryWrapper<SmErpInventoryRecordsItemEntity>()