feat(storage): 优化库存数据导入和查询功能

- 新增 StorageImportDTO 数据传输对象用于导入验证
- 重构 updateCheckAndImport 方法提升物料编号和工厂编号验证逻辑
- 实现批量新增和更新库存数据的分离处理
- 优化导入文件时的错误处理和异常捕获机制
- 在数据库查询中添加工厂编号字段关联查询
- 改进代码结构和变量命名规范性
This commit is contained in:
曹鹏飞 2026-06-24 18:28:10 +08:00
parent 7d67395036
commit 54af840fa9
3 changed files with 114 additions and 57 deletions

View File

@ -0,0 +1,26 @@
package com.nflg.wms.admin.pojo.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StorageImportDTO {
private String factoryNo;
private String warehouseNo;
private String binNo;
/**
* 库存地点ID
*/
private Long warehouseId;
private Long binId;
private String error;
}

View File

@ -6,6 +6,7 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.nflg.wms.admin.pojo.dto.StorageImportDTO;
import com.nflg.wms.common.constant.Constant; import com.nflg.wms.common.constant.Constant;
import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.ApiResult;
@ -44,9 +45,7 @@ import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Component @Component
@ -139,18 +138,77 @@ public class StorageControllerService {
@Transactional @Transactional
public boolean updateCheckAndImport(List<StorageExcelExportDTO> data) { public boolean updateCheckAndImport(List<StorageExcelExportDTO> data) {
List<WmsStorage> storages = new ArrayList<>(); List<WmsStorage> storagesForAdd = new ArrayList<>();
Set<String> materialNos = data.stream().map(StorageExcelExportDTO::getMaterialNo).collect(Collectors.toSet());
List<BomMaterialDTO> dtos = bomMaterialService.getList(materialNos);
Set<String> fwbs = new HashSet<>();
data.forEach(dto -> {
if (dtos.stream().noneMatch(d -> StrUtil.equals(d.getMaterialNo(), dto.getMaterialNo()))) {
dto.setError("物料编号无效;");
} else {
if (StrUtil.isNotBlank(dto.getBinNo())) {
fwbs.add(dto.getFactoryNo() + "$" + dto.getWarehouseNo() + "$" + dto.getBinNo());
}
}
});
List<DictionaryItem> factories = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_FACTORY);
List<StorageImportDTO> fwbos = new ArrayList<>();
fwbs.forEach(fwb -> {
List<String> fwbl = StrUtil.split(fwb, "$");
if (factories.stream().noneMatch(f -> StrUtil.equals(f.getValue(), fwbl.get(0)))) {
fwbos.add(new StorageImportDTO(fwbl.get(0), fwbl.get(1), fwbl.get(2), null, null, "工厂编号无效"));
} else {
WmsBin bin = wmsBinService.getByCode(fwbl.get(0), fwbl.get(1), fwbl.get(2));
if (Objects.isNull(bin)) {
fwbos.add(new StorageImportDTO(fwbl.get(0), fwbl.get(1), fwbl.get(2), null, null, "储位编号无效"));
} else {
fwbos.add(new StorageImportDTO(fwbl.get(0), fwbl.get(1), fwbl.get(2), bin.getWarehouseId(), bin.getId(), null));
}
}
});
List<WmsStorage> storagesForUpdate = storageService.lambdaQuery()
.in(WmsStorage::getMaterialNo, materialNos)
.list();
for (StorageExcelExportDTO dto : data) { for (StorageExcelExportDTO dto : data) {
WmsStorage storage = new WmsStorage(); if (StrUtil.isNotBlank(dto.getError())) {
continue;
}
WmsStorage storage = null;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if (StrUtil.isBlank(dto.getMaterialNo())) { if (StrUtil.isBlank(dto.getMaterialNo())) {
sb.append("物料编号不能为空;"); sb.append("物料编号不能为空;");
}
String factoryNo = StrUtil.trim(dto.getFactoryNo());
if (StrUtil.isBlank(factoryNo)) {
sb.append("工厂编号不能为空;");
}
String warehouseNo = StrUtil.trim(dto.getWarehouseNo());
if (StrUtil.isBlank(warehouseNo)) {
sb.append("库存地点编号不能为空;");
}
if (StrUtil.isBlank(dto.getBinNo())) {
sb.append("储位编号不能为空;");
} else { } else {
BomMaterialDTO material = bomMaterialService.getMaterialInfo(dto.getMaterialNo()); StorageImportDTO fwbo = fwbos.stream()
if (Objects.isNull(material)) { .filter(f -> StrUtil.equals(f.getFactoryNo(), factoryNo)
sb.append("物料编号无效;"); && StrUtil.equals(f.getWarehouseNo(), warehouseNo)
&& StrUtil.equals(f.getBinNo(), dto.getBinNo())
)
.findFirst()
.get();
if (StrUtil.isNotBlank(fwbo.getError())) {
sb.append(fwbo.getError()).append(";");
} else { } else {
storage = storageService.lambdaQuery().eq(WmsStorage::getMaterialNo, material.getMaterialNo()).one(); BomMaterialDTO material = dtos.stream()
.filter(d -> StrUtil.equals(d.getMaterialNo(), dto.getMaterialNo()))
.findFirst()
.get();
storage = storagesForUpdate.stream()
.filter(s -> StrUtil.equals(s.getMaterialNo(), dto.getMaterialNo())
&& s.getWarehouseId().equals(fwbo.getWarehouseId())
)
.findFirst()
.orElse(null);
if (Objects.isNull(storage)) { if (Objects.isNull(storage)) {
storage = new WmsStorage() storage = new WmsStorage()
.setId(IdUtil.getSnowflakeNextId()) .setId(IdUtil.getSnowflakeNextId())
@ -159,56 +217,25 @@ public class StorageControllerService {
.setMaterialDesc(material.getMaterialDesc()) .setMaterialDesc(material.getMaterialDesc())
.setCreateBy(UserUtil.getUserName()) .setCreateBy(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now()); .setCreateTime(LocalDateTime.now());
storagesForAdd.add(storage);
} else { } else {
storage.setUpdateBy(UserUtil.getUserName()); storage.setUpdateBy(UserUtil.getUserName());
storage.setUpdateTime(LocalDateTime.now()); storage.setUpdateTime(LocalDateTime.now());
} }
} storage.setWarehouseId(fwbo.getWarehouseId());
} storage.setBinId(fwbo.getBinId());
String factoryNo = StrUtil.trim(dto.getFactoryNo());
DictionaryItem item = null;
if (StrUtil.isBlank(factoryNo)) {
sb.append("工厂编号不能为空;");
} else {
item = dictionaryItemService.getByCode(Constant.DICTIONARY_FACTORY, factoryNo);
if (Objects.isNull(item)) {
sb.append("工厂编号无效;");
}
}
String warehouseNo = StrUtil.trim(dto.getWarehouseNo());
WmsWarehouse warehouse = null;
if (StrUtil.isBlank(warehouseNo)) {
sb.append("库存地点编号不能为空;");
} else if (Objects.nonNull(item)) {
warehouse = warehouseService.lambdaQuery().eq(WmsWarehouse::getFactoryId, item.getId()).eq(WmsWarehouse::getNo, warehouseNo).one();
if (Objects.isNull(warehouse)) {
sb.append("库存地点编号无效;");
} else {
storage.setWarehouseId(warehouse.getId());
}
}
if (StrUtil.isBlank(dto.getBinNo())) {
sb.append("储位编号不能为空;");
} else if (Objects.nonNull(warehouse)) {
WmsBin bin = wmsBinService.lambdaQuery()
.eq(WmsBin::getWarehouseId, warehouse.getId())
.eq(WmsBin::getNo, dto.getBinNo())
.one();
if (Objects.isNull(bin)) {
sb.append("储位编号无效;");
}else {
storage.setBinId(bin.getId());
}
}
storage.setRemark(dto.getRemark()); storage.setRemark(dto.getRemark());
}
}
dto.setError(sb.toString()); dto.setError(sb.toString());
storages.add(storage);
} }
if (data.stream().noneMatch(it -> StrUtil.isNotBlank(it.getError()))) { if (data.stream().noneMatch(it -> StrUtil.isNotBlank(it.getError()))) {
storageService.saveOrUpdateBatch(storages); if (CollectionUtil.isNotEmpty(storagesForAdd)) {
// storageBinService.remove(new LambdaQueryWrapper<WmsStorageBin>() storageService.saveBatch(storagesForAdd);
// .in(WmsStorageBin::getStorageId, storages.stream().map(WmsStorage::getId).toList())); }
// storageBinService.saveBatch(storageBinAll); if (CollectionUtil.isNotEmpty(storagesForUpdate)) {
storageService.updateBatchById(storagesForUpdate);
}
return true; return true;
} }
return false; return false;

View File

@ -10,10 +10,12 @@
wh.id AS "warehouseId", wh.id AS "warehouseId",
wh.no AS "warehouseNo", wh.no AS "warehouseNo",
s.bin_id, s.bin_id,
bin.no as "binNo" bin.no as "binNo",
di.value as "factoryNo"
FROM wms_storage s FROM wms_storage s
INNER JOIN wms_bin bin ON s.bin_id = bin.id INNER JOIN wms_bin bin ON s.bin_id = bin.id
LEFT JOIN wms_warehouse wh ON s.warehouse_id = wh.id LEFT JOIN wms_warehouse wh ON s.warehouse_id = wh.id
LEFT JOIN dictionary_item di ON wh.factory_id = di."id"
<where> <where>
<if test="request.warehouseNo!=null and request.warehouseNo!=''"> <if test="request.warehouseNo!=null and request.warehouseNo!=''">
and wh.no ilike concat('%', #{request.warehouseNo}, '%') and wh.no ilike concat('%', #{request.warehouseNo}, '%')
@ -56,10 +58,12 @@
wh.id AS "warehouseId", wh.id AS "warehouseId",
wh.no AS "warehouseNo", wh.no AS "warehouseNo",
s.bin_id, s.bin_id,
bin.no as "binNo" bin.no as "binNo",
di.value as "factoryNo"
FROM wms_storage s FROM wms_storage s
INNER JOIN wms_bin bin ON s.bin_id = bin.id INNER JOIN wms_bin bin ON s.bin_id = bin.id
LEFT JOIN wms_warehouse wh ON s.warehouse_id = wh.id LEFT JOIN wms_warehouse wh ON s.warehouse_id = wh.id
LEFT JOIN dictionary_item di ON wh.factory_id = di."id"
<where> <where>
<if test="request.warehouseNo!=null and request.warehouseNo!=''"> <if test="request.warehouseNo!=null and request.warehouseNo!=''">
and wh.no like concat('%', #{request.warehouseNo}, '%') and wh.no like concat('%', #{request.warehouseNo}, '%')