From 54af840fa9166967b49ca49e6a69eec9751ae325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 24 Jun 2026 18:28:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(storage):=20=E4=BC=98=E5=8C=96=E5=BA=93?= =?UTF-8?q?=E5=AD=98=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=E5=92=8C=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 StorageImportDTO 数据传输对象用于导入验证 - 重构 updateCheckAndImport 方法提升物料编号和工厂编号验证逻辑 - 实现批量新增和更新库存数据的分离处理 - 优化导入文件时的错误处理和异常捕获机制 - 在数据库查询中添加工厂编号字段关联查询 - 改进代码结构和变量命名规范性 --- .../wms/admin/pojo/dto/StorageImportDTO.java | 26 ++++ .../service/StorageControllerService.java | 137 +++++++++++------- .../resources/mapper/WmsStorageMapper.xml | 8 +- 3 files changed, 114 insertions(+), 57 deletions(-) create mode 100644 nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/StorageImportDTO.java diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/StorageImportDTO.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/StorageImportDTO.java new file mode 100644 index 00000000..cd7658e2 --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/StorageImportDTO.java @@ -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; +} diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StorageControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StorageControllerService.java index d0f24434..568fc392 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StorageControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/StorageControllerService.java @@ -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 @@ -124,14 +123,14 @@ public class StorageControllerService { if (updateCheckAndImport(data)) { return ApiResult.success(); } else { - try(ByteArrayOutputStream osOut = new ByteArrayOutputStream()) { + try (ByteArrayOutputStream osOut = new ByteArrayOutputStream()) { new Workbook() .addSheet(new ListSheet<>(data)) .writeTo(osOut); - try(ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) { + try (ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) { return ApiResult.error(STATE.DataNoCheckPass, "导入文件失败", fileUploadService.upload("temp/" + DateTimeUtil.format(LocalDate.now(), "yyyyMMdd") + "/" + IdUtil.fastUUID() + ".xlsx", isIn, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); } - }catch (Exception e){ + } catch (Exception e) { return ApiResult.error(STATE.BusinessError, "保存文件出错"); } } @@ -139,18 +138,77 @@ public class StorageControllerService { @Transactional public boolean updateCheckAndImport(List data) { - List storages = new ArrayList<>(); + List storagesForAdd = new ArrayList<>(); + Set materialNos = data.stream().map(StorageExcelExportDTO::getMaterialNo).collect(Collectors.toSet()); + List dtos = bomMaterialService.getList(materialNos); + Set 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 factories = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_FACTORY); + List fwbos = new ArrayList<>(); + fwbs.forEach(fwb -> { + List 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 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()); - }else { + storagesForAdd.add(storage); + } else { storage.setUpdateBy(UserUtil.getUserName()); storage.setUpdateTime(LocalDateTime.now()); } + storage.setWarehouseId(fwbo.getWarehouseId()); + storage.setBinId(fwbo.getBinId()); + storage.setRemark(dto.getRemark()); } } - 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()); dto.setError(sb.toString()); - storages.add(storage); } if (data.stream().noneMatch(it -> StrUtil.isNotBlank(it.getError()))) { - storageService.saveOrUpdateBatch(storages); -// storageBinService.remove(new LambdaQueryWrapper() -// .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; @@ -233,7 +260,7 @@ public class StorageControllerService { } public void exportSearch(HttpServletResponse response, @Valid StorageSearchQO request) throws IOException { - List list=storageService.searchNonPage(request); + List list = storageService.searchNonPage(request); List datas = list.stream().map(bin -> Convert.convert(StorageExcelExportDTO.class, bin)).collect(Collectors.toList()); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("物料存储导出.xlsx", StandardCharsets.UTF_8)); diff --git a/nflg-wms-repository/src/main/resources/mapper/WmsStorageMapper.xml b/nflg-wms-repository/src/main/resources/mapper/WmsStorageMapper.xml index 889c6988..688be53a 100644 --- a/nflg-wms-repository/src/main/resources/mapper/WmsStorageMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/WmsStorageMapper.xml @@ -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" 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" and wh.no like concat('%', #{request.warehouseNo}, '%')