From 1667ef24b0cb63e6b76f451470fdba067f7c8370 Mon Sep 17 00:00:00 2001
From: luotaiqian <1147642922@qq.com>
Date: Wed, 26 Aug 2026 15:18:57 +0800
Subject: [PATCH] archive file
---
.../support/OrgPersonnelExcelImporter.java | 78 +++++++++++--------
1 file changed, 44 insertions(+), 34 deletions(-)
diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelExcelImporter.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelExcelImporter.java
index 4d94c911..92b5c9fc 100644
--- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelExcelImporter.java
+++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelExcelImporter.java
@@ -56,7 +56,7 @@ import java.util.stream.Collectors;
*
* 模板包含两个 sheet:sheet1「专职人员基础信息」、sheet2「专职人员能力信息」,
* 解析后按 身份证号(为空时按姓名) 将能力信息关联到基础信息行;
- * 再批量校验部门/岗位名称并回填ID(部门或部门下岗位不存在时自动新增) -> 校验账号重复并收集异常 -> 逐行落库。
+ * 再批量校验部门/岗位名称并回填ID(部门或部门下岗位不存在时自动新增) -> 设置所学专业/系列专业(基础学科专业不存在时自动新增) -> 校验账号重复并收集异常 -> 逐行落库。
*
*
* @author safety-eval
@@ -144,13 +144,8 @@ public class OrgPersonnelExcelImporter {
return result;
}
- // 3. 批量校验所学专业、系列/专业(两个字段名称合并为一次 in 查询基础学科专业对照表)
- validateAndFillMajor(rows, errors);
- rows = rows.stream().filter(it -> !it.isValidateFail()).collect(Collectors.toList());
- if (rows.isEmpty()) {
- result.setErrors(errors);
- return result;
- }
+ // 3. 批量设置所学专业、系列/专业(基础学科专业对照表中已存在则使用库中记录,不存在则自动新增)
+ fillOrCreateMajor(rows);
// 4. 批量查询库中已存在的账号(未删除)
Set existingAccounts = batchQueryExistingAccounts(rows, orgId);
@@ -1013,15 +1008,15 @@ public class OrgPersonnelExcelImporter {
}
/**
- * 批量校验 所学专业(major)与 系列/专业(seriesMajor)名称在基础学科专业对照表中是否存在
- * (basic_discipline_major.professional_name),两个字段名称合并为一次 in 查询;
- * 有值但查询不到的记录异常并标记 validateFail,为空的字段不参与校验(字段可空)。
+ * 批量设置 所学专业(major)与 系列/专业(seriesMajor)对应的基础学科专业:
+ * 两个字段名称合并为一次 in 查询基础学科专业对照表(basic_discipline_major.professional_name),
+ * 库中已存在则直接使用库中记录;不存在则自动新增(仅填专业名称)并使用新增记录,同一文件中同名专业仅新增一次。
*
- * 校验通过后回填:所学专业 -> basicDisciplineMajorId 与 {@link OrgPersonnelImportRow.CapabilityRow#setBdmMajor};
- * 系列/专业 -> {@link OrgPersonnelImportRow.CapabilityRow#setBdmSeriesMajor}。
+ * 回填规则:所学专业 -> basicDisciplineMajorId 与 {@link OrgPersonnelImportRow.CapabilityRow#setBdmMajor};
+ * 系列/专业 -> {@link OrgPersonnelImportRow.CapabilityRow#setBdmSeriesMajor};字段为空不处理。
*
*/
- private void validateAndFillMajor(List rows, List errors) {
+ private void fillOrCreateMajor(List rows) {
// 所学专业、系列/专业 两个字段名称合并收集,一次 in 查询
Set majorNames = new LinkedHashSet<>();
for (OrgPersonnelImportRow row : rows) {
@@ -1049,42 +1044,57 @@ public class OrgPersonnelExcelImporter {
}
}
- // 逐行校验:字段为空跳过;对照表中不存在的记录异常并标记;校验通过则回填
+ // 逐行回填:字段为空跳过;库中已存在使用库中记录,不存在自动新增
for (OrgPersonnelImportRow row : rows) {
OrgPersonnelImportRow.CapabilityRow capability = row.getCapability();
if (capability == null) {
continue;
}
- // 所学专业:查询不到记录异常;查询到回填 basicDisciplineMajorId、bdmMajor
+ // 所学专业:回填 basicDisciplineMajorId、bdmMajor
String majorName = trim(capability.getMajor());
if (StringUtils.hasText(majorName)) {
- BasicDisciplineMajorE major = majorMap.get(majorName);
- if (major == null) {
- errors.add(new OrgPersonnelImportErrorCO(row.getBasic().getRowIndex(), row.getBasic().getAccount(), row.getBasic().getUserName(),
- ErrorCode.ORG_PERSONNEL_IMPORT_MAJOR_NOT_FOUND.getMessage() + ":" + majorName));
- row.setValidateFail(true);
- } else {
- row.setBasicDisciplineMajorId(major.getId());
- capability.setBdmMajor(basicDisciplineMajorDoConvertor.convertEeToDo(major));
- }
+ BasicDisciplineMajorE major = getOrCreateMajor(majorName, majorMap);
+ row.setBasicDisciplineMajorId(major.getId());
+ capability.setBdmMajor(basicDisciplineMajorDoConvertor.convertEeToDo(major));
}
- // 系列/专业:查询不到记录异常;查询到回填 bdmSeriesMajor
+ // 系列/专业:回填 bdmSeriesMajor
String seriesMajorName = trim(capability.getSeriesMajor());
if (StringUtils.hasText(seriesMajorName)) {
- BasicDisciplineMajorE seriesMajor = majorMap.get(seriesMajorName);
- if (seriesMajor == null) {
- errors.add(new OrgPersonnelImportErrorCO(row.getBasic().getRowIndex(), row.getBasic().getAccount(), row.getBasic().getUserName(),
- ErrorCode.ORG_PERSONNEL_IMPORT_MAJOR_NOT_FOUND.getMessage() + ":" + seriesMajorName));
- row.setValidateFail(true);
- } else {
- capability.setBdmSeriesMajor(basicDisciplineMajorDoConvertor.convertEeToDo(seriesMajor));
- }
+ BasicDisciplineMajorE seriesMajor = getOrCreateMajor(seriesMajorName, majorMap);
+ capability.setBdmSeriesMajor(basicDisciplineMajorDoConvertor.convertEeToDo(seriesMajor));
}
}
}
+ /**
+ * 按专业名称获取基础学科专业:库中已存在直接返回库中记录;
+ * 不存在则自动新增(仅填专业名称)并放入缓存,保证同一文件中同名专业仅新增一次。
+ *
+ * @param professionalName 专业名称(已去除首尾空格)
+ * @param majorMap 专业名称索引(key: 专业名称),新增的记录会写入该索引
+ * @return 库中已存在或新增后的基础学科专业实体
+ */
+ private BasicDisciplineMajorE getOrCreateMajor(String professionalName, Map majorMap) {
+ BasicDisciplineMajorE exist = majorMap.get(professionalName);
+ if (exist != null) {
+ return exist;
+ }
+
+ BasicDisciplineMajorE created = new BasicDisciplineMajorE();
+ created.setProfessionalName(professionalName);
+ InsertFieldDefaults.apply(created);
+ Boolean res = basicDisciplineMajorGateway.add(created);
+ if (res == null || !res) {
+ throw new BizException(ErrorCode.ORG_PERSONNEL_IMPORT_MAJOR_NOT_FOUND,
+ "基础学科专业[" + professionalName + "]自动新增失败");
+ }
+ majorMap.put(professionalName, created);
+ LOGGER.info("人员导入自动新增基础学科专业, professionalName={}, id={}", professionalName, created.getId());
+ return created;
+ }
+
private Set batchQueryExistingAccounts(List rows, Long orgId) {
Set accounts = rows.stream()
.map(r -> trim(r.getBasic().getAccount()))