From 7f81abd4d840b19ad0dc7a6e6e380e37eec61d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Tue, 14 Apr 2026 17:05:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(qc-material):=20=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=95=B0=E6=8D=AE=E4=B8=AD=E8=81=94=E5=90=88?= =?UTF-8?q?=E4=B8=BB=E9=94=AE=E5=94=AF=E4=B8=80=E6=80=A7=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=9B=B8=E5=85=B3=E8=BE=85=E5=8A=A9=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在导入质检物料时检查物料编号+图号版本号的联合主键是否存在重复 - 新增buildCompositeKey方法用于构建联合主键字符串,便于重复检测 - 新增findByCompositeKey方法根据联合主键查询物料,替换原查询逻辑 - 修改导入DTO,新增QmsQcMaterialImportDTO类并完善注释 - 调整导出DTO中图号版本号字段注释,明确其作为联合主键且可为空 - 规范错误信息设置,明确指出Excel中存在重复的联合主键组合情况 --- .../QmsQcMaterialControllerService.java | 54 ++++++++++++++----- .../pojo/dto/QmsQcMaterialExportDTO.java | 4 +- .../pojo/dto/QmsQcMaterialImportDTO.java | 4 +- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsQcMaterialControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsQcMaterialControllerService.java index f851c838..c19b92f4 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsQcMaterialControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsQcMaterialControllerService.java @@ -38,7 +38,9 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 质检物料业务逻辑 @@ -242,6 +244,13 @@ public class QmsQcMaterialControllerService { LocalDateTime now = LocalDateTime.now(); boolean allSuccess = true; + // 检查Excel数据中是否存在重复的联合主键(物料编号+图号版本号) + Map compositeKeyCount = new HashMap<>(); + for (QmsQcMaterialImportDTO dto : data) { + String compositeKey = buildCompositeKey(dto.getMaterialNo(), dto.getDrawingNoVer()); + compositeKeyCount.merge(compositeKey, 1L, Long::sum); + } + for (QmsQcMaterialImportDTO dto : data) { StringBuilder sb = new StringBuilder(); @@ -252,7 +261,6 @@ public class QmsQcMaterialControllerService { if (StrUtil.isBlank(dto.getMaterialCategoryCode())) { sb.append("物料类别编码不能为空;"); } - // 图号版本号可以为空,作为联合主键的一部分 if (!sb.isEmpty()) { dto.setError(sb.toString()); @@ -260,6 +268,15 @@ public class QmsQcMaterialControllerService { continue; } + // 检查Excel中是否有重复的联合主键 + String compositeKey = buildCompositeKey(dto.getMaterialNo(), dto.getDrawingNoVer()); + if (compositeKeyCount.get(compositeKey) > 1) { + sb.append("Excel中存在重复的物料编号+图号版本号组合;"); + dto.setError(sb.toString()); + allSuccess = false; + continue; + } + // 校验物料类别是否存在 QmsQcMaterialCategory category = qcMaterialCategoryService.lambdaQuery() .eq(QmsQcMaterialCategory::getCategoryCode, dto.getMaterialCategoryCode()) @@ -271,18 +288,8 @@ public class QmsQcMaterialControllerService { continue; } - // 根据物料编号+图号版本号查询是否存在 - var query = qcMaterialService.lambdaQuery() - .eq(QmsQcMaterial::getMaterialNo, dto.getMaterialNo()); - // 图号版本号为空时查询为空的记录 - if (StrUtil.isBlank(dto.getDrawingNoVer())) { - query.and(q -> q.isNull(QmsQcMaterial::getDrawingNoVer) - .or() - .eq(QmsQcMaterial::getDrawingNoVer, "")); - } else { - query.eq(QmsQcMaterial::getDrawingNoVer, dto.getDrawingNoVer()); - } - QmsQcMaterial exist = query.one(); + // 根据物料编号+图号版本号查询是否存在(联合主键) + QmsQcMaterial exist = findByCompositeKey(dto.getMaterialNo(), dto.getDrawingNoVer()); String categoryPathName = buildCategoryPathName(category); @@ -329,6 +336,27 @@ public class QmsQcMaterialControllerService { return allSuccess; } + /** + * 根据联合主键(物料编号+图号版本号)查询物料 + */ + private QmsQcMaterial findByCompositeKey(String materialNo, String drawingNoVer) { + return qcMaterialService.lambdaQuery() + .eq(QmsQcMaterial::getMaterialNo, materialNo) + .and(StrUtil.isBlank(drawingNoVer), + q -> q.isNull(QmsQcMaterial::getDrawingNoVer) + .or() + .eq(QmsQcMaterial::getDrawingNoVer, "")) + .eq(StrUtil.isNotBlank(drawingNoVer), QmsQcMaterial::getDrawingNoVer, drawingNoVer) + .one(); + } + + /** + * 构建联合主键字符串(用于重复检查) + */ + private String buildCompositeKey(String materialNo, String drawingNoVer) { + return materialNo + "|" + (StrUtil.isBlank(drawingNoVer) ? "" : drawingNoVer); + } + /** * 导出质检物料(不分页) */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsQcMaterialExportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsQcMaterialExportDTO.java index 87b7b321..a13972f7 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsQcMaterialExportDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsQcMaterialExportDTO.java @@ -42,9 +42,9 @@ public class QmsQcMaterialExportDTO { private String drawingNo; /** - * 图号版本号 + * 图号版本号(联合主键,可为空) */ - @ExcelColumn("*图号版本号") + @ExcelColumn("图号版本号") private String drawingNoVer; /** diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsQcMaterialImportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsQcMaterialImportDTO.java index 1a93965a..cade7402 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsQcMaterialImportDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsQcMaterialImportDTO.java @@ -36,9 +36,9 @@ public class QmsQcMaterialImportDTO { private String drawingNo; /** - * 图号版本号(联合主键) + * 图号版本号(联合主键,可为空) */ - @ExcelColumn("*图号版本号") + @ExcelColumn("图号版本号") private String drawingNoVer; /**