feat(qc-material): 校验导入数据中联合主键唯一性,新增相关辅助方法

- 在导入质检物料时检查物料编号+图号版本号的联合主键是否存在重复
- 新增buildCompositeKey方法用于构建联合主键字符串,便于重复检测
- 新增findByCompositeKey方法根据联合主键查询物料,替换原查询逻辑
- 修改导入DTO,新增QmsQcMaterialImportDTO类并完善注释
- 调整导出DTO中图号版本号字段注释,明确其作为联合主键且可为空
- 规范错误信息设置,明确指出Excel中存在重复的联合主键组合情况
This commit is contained in:
曹鹏飞 2026-04-14 17:05:39 +08:00
parent 2a7b4df62c
commit 7f81abd4d8
3 changed files with 45 additions and 17 deletions

View File

@ -38,7 +38,9 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 质检物料业务逻辑 * 质检物料业务逻辑
@ -242,6 +244,13 @@ public class QmsQcMaterialControllerService {
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
boolean allSuccess = true; boolean allSuccess = true;
// 检查Excel数据中是否存在重复的联合主键物料编号+图号版本号
Map<String, Long> compositeKeyCount = new HashMap<>();
for (QmsQcMaterialImportDTO dto : data) {
String compositeKey = buildCompositeKey(dto.getMaterialNo(), dto.getDrawingNoVer());
compositeKeyCount.merge(compositeKey, 1L, Long::sum);
}
for (QmsQcMaterialImportDTO dto : data) { for (QmsQcMaterialImportDTO dto : data) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -252,7 +261,6 @@ public class QmsQcMaterialControllerService {
if (StrUtil.isBlank(dto.getMaterialCategoryCode())) { if (StrUtil.isBlank(dto.getMaterialCategoryCode())) {
sb.append("物料类别编码不能为空;"); sb.append("物料类别编码不能为空;");
} }
// 图号版本号可以为空作为联合主键的一部分
if (!sb.isEmpty()) { if (!sb.isEmpty()) {
dto.setError(sb.toString()); dto.setError(sb.toString());
@ -260,6 +268,15 @@ public class QmsQcMaterialControllerService {
continue; 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() QmsQcMaterialCategory category = qcMaterialCategoryService.lambdaQuery()
.eq(QmsQcMaterialCategory::getCategoryCode, dto.getMaterialCategoryCode()) .eq(QmsQcMaterialCategory::getCategoryCode, dto.getMaterialCategoryCode())
@ -271,18 +288,8 @@ public class QmsQcMaterialControllerService {
continue; continue;
} }
// 根据物料编号+图号版本号查询是否存在 // 根据物料编号+图号版本号查询是否存在联合主键
var query = qcMaterialService.lambdaQuery() QmsQcMaterial exist = findByCompositeKey(dto.getMaterialNo(), dto.getDrawingNoVer());
.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();
String categoryPathName = buildCategoryPathName(category); String categoryPathName = buildCategoryPathName(category);
@ -329,6 +336,27 @@ public class QmsQcMaterialControllerService {
return allSuccess; 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);
}
/** /**
* 导出质检物料不分页 * 导出质检物料不分页
*/ */

View File

@ -42,9 +42,9 @@ public class QmsQcMaterialExportDTO {
private String drawingNo; private String drawingNo;
/** /**
* 图号版本号 * 图号版本号联合主键可为空
*/ */
@ExcelColumn("*图号版本号") @ExcelColumn("图号版本号")
private String drawingNoVer; private String drawingNoVer;
/** /**

View File

@ -36,9 +36,9 @@ public class QmsQcMaterialImportDTO {
private String drawingNo; private String drawingNo;
/** /**
* 图号版本号联合主键 * 图号版本号联合主键可为空
*/ */
@ExcelColumn("*图号版本号") @ExcelColumn("图号版本号")
private String drawingNoVer; private String drawingNoVer;
/** /**