feat(storage): 优化库存数据导入和查询功能
- 新增 StorageImportDTO 数据传输对象用于导入验证 - 重构 updateCheckAndImport 方法提升物料编号和工厂编号验证逻辑 - 实现批量新增和更新库存数据的分离处理 - 优化导入文件时的错误处理和异常捕获机制 - 在数据库查询中添加工厂编号字段关联查询 - 改进代码结构和变量命名规范性
This commit is contained in:
parent
7d67395036
commit
54af840fa9
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -6,6 +6,7 @@ import cn.hutool.core.util.IdUtil;
|
|||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
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.STATE;
|
||||
import com.nflg.wms.common.pojo.ApiResult;
|
||||
|
|
@ -44,9 +45,7 @@ import java.net.URLEncoder;
|
|||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
|
|
@ -139,18 +138,77 @@ public class StorageControllerService {
|
|||
|
||||
@Transactional
|
||||
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) {
|
||||
WmsStorage storage = new WmsStorage();
|
||||
if (StrUtil.isNotBlank(dto.getError())) {
|
||||
continue;
|
||||
}
|
||||
WmsStorage storage = null;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (StrUtil.isBlank(dto.getMaterialNo())) {
|
||||
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 {
|
||||
BomMaterialDTO material = bomMaterialService.getMaterialInfo(dto.getMaterialNo());
|
||||
if (Objects.isNull(material)) {
|
||||
sb.append("物料编号无效;");
|
||||
StorageImportDTO fwbo = fwbos.stream()
|
||||
.filter(f -> StrUtil.equals(f.getFactoryNo(), factoryNo)
|
||||
&& StrUtil.equals(f.getWarehouseNo(), warehouseNo)
|
||||
&& StrUtil.equals(f.getBinNo(), dto.getBinNo())
|
||||
)
|
||||
.findFirst()
|
||||
.get();
|
||||
if (StrUtil.isNotBlank(fwbo.getError())) {
|
||||
sb.append(fwbo.getError()).append(";");
|
||||
} 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)) {
|
||||
storage = new WmsStorage()
|
||||
.setId(IdUtil.getSnowflakeNextId())
|
||||
|
|
@ -159,56 +217,25 @@ public class StorageControllerService {
|
|||
.setMaterialDesc(material.getMaterialDesc())
|
||||
.setCreateBy(UserUtil.getUserName())
|
||||
.setCreateTime(LocalDateTime.now());
|
||||
storagesForAdd.add(storage);
|
||||
} else {
|
||||
storage.setUpdateBy(UserUtil.getUserName());
|
||||
storage.setUpdateTime(LocalDateTime.now());
|
||||
}
|
||||
}
|
||||
}
|
||||
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.setWarehouseId(fwbo.getWarehouseId());
|
||||
storage.setBinId(fwbo.getBinId());
|
||||
storage.setRemark(dto.getRemark());
|
||||
}
|
||||
}
|
||||
dto.setError(sb.toString());
|
||||
storages.add(storage);
|
||||
}
|
||||
if (data.stream().noneMatch(it -> StrUtil.isNotBlank(it.getError()))) {
|
||||
storageService.saveOrUpdateBatch(storages);
|
||||
// storageBinService.remove(new LambdaQueryWrapper<WmsStorageBin>()
|
||||
// .in(WmsStorageBin::getStorageId, storages.stream().map(WmsStorage::getId).toList()));
|
||||
// storageBinService.saveBatch(storageBinAll);
|
||||
if (CollectionUtil.isNotEmpty(storagesForAdd)) {
|
||||
storageService.saveBatch(storagesForAdd);
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(storagesForUpdate)) {
|
||||
storageService.updateBatchById(storagesForUpdate);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -10,10 +10,12 @@
|
|||
wh.id AS "warehouseId",
|
||||
wh.no AS "warehouseNo",
|
||||
s.bin_id,
|
||||
bin.no as "binNo"
|
||||
bin.no as "binNo",
|
||||
di.value as "factoryNo"
|
||||
FROM wms_storage s
|
||||
INNER JOIN wms_bin bin ON s.bin_id = bin.id
|
||||
LEFT JOIN wms_warehouse wh ON s.warehouse_id = wh.id
|
||||
LEFT JOIN dictionary_item di ON wh.factory_id = di."id"
|
||||
<where>
|
||||
<if test="request.warehouseNo!=null and request.warehouseNo!=''">
|
||||
and wh.no ilike concat('%', #{request.warehouseNo}, '%')
|
||||
|
|
@ -56,10 +58,12 @@
|
|||
wh.id AS "warehouseId",
|
||||
wh.no AS "warehouseNo",
|
||||
s.bin_id,
|
||||
bin.no as "binNo"
|
||||
bin.no as "binNo",
|
||||
di.value as "factoryNo"
|
||||
FROM wms_storage s
|
||||
INNER JOIN wms_bin bin ON s.bin_id = bin.id
|
||||
LEFT JOIN wms_warehouse wh ON s.warehouse_id = wh.id
|
||||
LEFT JOIN dictionary_item di ON wh.factory_id = di."id"
|
||||
<where>
|
||||
<if test="request.warehouseNo!=null and request.warehouseNo!=''">
|
||||
and wh.no like concat('%', #{request.warehouseNo}, '%')
|
||||
|
|
|
|||
Loading…
Reference in New Issue