From d1db56705ff1cff310e0e4a7ae7237d050bedc1c Mon Sep 17 00:00:00 2001 From: luotaiqian <1147642922@qq.com> Date: Mon, 3 Aug 2026 10:41:37 +0800 Subject: [PATCH] import --- .../support/OrgPersonnelExcelImporter.java | 63 ++++++++++++++++++- .../app/support/OrgPersonnelImportRow.java | 3 + .../domain/exception/ErrorCode.java | 1 + .../gateway/BasicDisciplineMajorGateway.java | 11 ++++ .../BasicDisciplineMajorDoConvertor.java | 8 +++ .../BasicDisciplineMajorGatewayImpl.java | 26 ++++++++ .../src/main/resources/sdk-prod.yml | 2 +- safety-eval-start/src/main/resources/sdk.yml | 2 +- 8 files changed, 111 insertions(+), 5 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 97e0776..443cfb5 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 @@ -12,6 +12,8 @@ import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.domain.gateway.OrgDepartmentGateway; import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway; import org.qinan.safetyeval.domain.gateway.OrgPositionGateway; +import org.qinan.safetyeval.domain.major.gateway.BasicDisciplineMajorGateway; +import org.qinan.safetyeval.domain.major.model.BasicDisciplineMajorE; import org.qinan.safetyeval.domain.service.OrgPersonnelDomainService; import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; import org.slf4j.Logger; @@ -61,6 +63,9 @@ public class OrgPersonnelExcelImporter { @Resource private OrgPersonnelGateway orgPersonnelGateway; + @Resource + private BasicDisciplineMajorGateway basicDisciplineMajorGateway; + @Resource private OrgPersonnelDomainService orgPersonnelDomainService; @@ -87,10 +92,13 @@ public class OrgPersonnelExcelImporter { // 2. 批量校验并回填岗位ID validateAndFillPosition(rows, orgId); - // 3. 批量查询库中已存在的账号(未删除) + // 3. 批量校验并回填所学专业ID + validateAndFillMajor(rows); + + // 4. 批量查询库中已存在的账号(未删除) Set existingAccounts = batchQueryExistingAccounts(rows, orgId); - // 4. 逐行转换、落库 + // 5. 逐行转换、落库 int successCount = 0; for (OrgPersonnelImportRow row : rows) { @@ -270,6 +278,54 @@ public class OrgPersonnelExcelImporter { } } + /** + * 批量校验所学专业名称在基础学科专业对照表中是否存在(basic_discipline_major.professional_name), + * 校验通过的同时回填 basicDisciplineMajorId;不存在则抛出异常。 + *

专业名称为空的行不参与校验(该字段可空)。

+ */ + private void validateAndFillMajor(List rows) { + Set majorNames = rows.stream() + .map(r -> trim(r.getMajor())) + .filter(StringUtils::hasText) + .collect(Collectors.toCollection(LinkedHashSet::new)); + + Map majorMap = new HashMap<>(); + if (!majorNames.isEmpty()) { + for (BasicDisciplineMajorE major : basicDisciplineMajorGateway.listByProfessionalNames(majorNames)) { + if (major.getProfessionalName() != null) { + majorMap.putIfAbsent(major.getProfessionalName().trim(), major); + } + } + } + + // 收集所有缺失专业(保留出现顺序,附带首个出现行号) + Map missingMajorRows = new LinkedHashMap<>(); + for (OrgPersonnelImportRow row : rows) { + String name = trim(row.getMajor()); + if (!StringUtils.hasText(name)) { + continue; + } + if (!majorMap.containsKey(name)) { + missingMajorRows.putIfAbsent(name, row.getRowIndex()); + } + } + if (!missingMajorRows.isEmpty()) { + String detail = missingMajorRows.entrySet().stream() + .map(e -> e.getKey() + "(第" + e.getValue() + "行)") + .collect(Collectors.joining("; ")); + throw new BizException(ErrorCode.ORG_PERSONNEL_IMPORT_MAJOR_NOT_FOUND, + ErrorCode.ORG_PERSONNEL_IMPORT_MAJOR_NOT_FOUND.getMessage() + ":" + detail); + } + + // 校验通过,回填专业ID + for (OrgPersonnelImportRow row : rows) { + String name = trim(row.getMajor()); + if (StringUtils.hasText(name)) { + row.setBasicDisciplineMajorId(majorMap.get(name).getId()); + } + } + } + private Set batchQueryExistingAccounts(List rows, Long orgId) { Set accounts = rows.stream() .map(r -> trim(r.getAccount())) @@ -292,6 +348,7 @@ public class OrgPersonnelExcelImporter { entity.setOrgId(orgId); entity.setDeptId(row.getDeptId()); entity.setPostId(row.getPostId()); + entity.setBasicDisciplineMajorId(row.getBasicDisciplineMajorId()); entity.setUserName(trim(row.getUserName())); entity.setAccount(trim(row.getAccount())); entity.setIdCardNo(trim(row.getIdCardNo())); @@ -345,7 +402,7 @@ public class OrgPersonnelExcelImporter { } // 职称:无字典,按分隔符拆分后原样存入(保留信息,待后续字典完善) - entity.setTitleCodeArr(parseTitles(trim(row.getTitle()))); +// entity.setTitleCodeArr(parseTitles(trim(row.getTitle()))); return entity; } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelImportRow.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelImportRow.java index ab453f9..971b517 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelImportRow.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/support/OrgPersonnelImportRow.java @@ -79,4 +79,7 @@ public class OrgPersonnelImportRow { /** 校验通过后回填的岗位ID(非Excel列)。 */ private Long postId; + + /** 校验通过后回填的学科基础专业对照表ID(非Excel列)。 */ + private Long basicDisciplineMajorId; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java index e84c413..a4a29f1 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java @@ -34,6 +34,7 @@ public enum ErrorCode { ORG_PERSONNEL_IMPORT_PARSE_ERROR("01-05-008", "导入文件解析失败"), ORG_PERSONNEL_IMPORT_DEPT_NOT_FOUND("01-05-009", "导入文件中存在不存在的部门"), ORG_PERSONNEL_IMPORT_POSITION_NOT_FOUND("01-05-010", "导入文件中存在不存在的岗位"), + ORG_PERSONNEL_IMPORT_MAJOR_NOT_FOUND("01-05-011", "导入文件中存在不存在的所学专业"), // ---- 人员证书 ---- ORG_PERSONNEL_CERT_NOT_FOUND("01-06-001", "人员证书不存在"), diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/major/gateway/BasicDisciplineMajorGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/major/gateway/BasicDisciplineMajorGateway.java index 93528f1..3d0d804 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/major/gateway/BasicDisciplineMajorGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/major/gateway/BasicDisciplineMajorGateway.java @@ -2,6 +2,9 @@ package org.qinan.safetyeval.domain.major.gateway; import org.qinan.safetyeval.domain.major.model.BasicDisciplineMajorE; +import java.util.Collection; +import java.util.List; + /** * 基础学科专业网关 * @@ -41,4 +44,12 @@ public interface BasicDisciplineMajorGateway { * @return 结果 */ Boolean deletedBasicDisciplineMajorByIds(Long[] ids); + + /** + * 按专业名称集合批量精确查询未删除的基础学科专业(用于导入名称解析)。 + * + * @param professionalNames 专业名称集合 + * @return 基础学科专业列表 + */ + List listByProfessionalNames(Collection professionalNames); } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/BasicDisciplineMajorDoConvertor.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/BasicDisciplineMajorDoConvertor.java index d7d4ee1..927c790 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/BasicDisciplineMajorDoConvertor.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/BasicDisciplineMajorDoConvertor.java @@ -25,6 +25,14 @@ public interface BasicDisciplineMajorDoConvertor { */ BasicDisciplineMajorDO convertEeToDo(BasicDisciplineMajorE basicDisciplineMajorE); + /** + * DO转领域对象 + * + * @param basicDisciplineMajorDo DO + * @return + */ + BasicDisciplineMajorE convertDoToEe(BasicDisciplineMajorDO basicDisciplineMajorDo); + /** * DO转Co * diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gateway/BasicDisciplineMajorGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gateway/BasicDisciplineMajorGatewayImpl.java index 01848a3..fabd08b 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gateway/BasicDisciplineMajorGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gateway/BasicDisciplineMajorGatewayImpl.java @@ -1,13 +1,21 @@ package org.qinan.safetyeval.infrastructure.gateway; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.AllArgsConstructor; import org.qinan.safetyeval.domain.major.gateway.BasicDisciplineMajorGateway; import org.qinan.safetyeval.domain.major.model.BasicDisciplineMajorE; import org.qinan.safetyeval.infrastructure.convertor.BasicDisciplineMajorDoConvertor; import org.qinan.safetyeval.infrastructure.persistence.domainobject.BasicDisciplineMajorDO; +import org.qinan.safetyeval.infrastructure.persistence.mapper.BasicDisciplineMajorMapper; import org.qinan.safetyeval.infrastructure.persistence.repository.BasicDisciplineMajorRepository; +import org.qinan.safetyeval.domain.constant.BooleanQAEnum; import org.springframework.stereotype.Service; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + /** * 基础学科专业网关实现 * @@ -19,6 +27,7 @@ import org.springframework.stereotype.Service; public class BasicDisciplineMajorGatewayImpl implements BasicDisciplineMajorGateway { private final BasicDisciplineMajorRepository basicDisciplineMajorRepository; private final BasicDisciplineMajorDoConvertor basicDisciplineMajorDoConvertor; + private final BasicDisciplineMajorMapper basicDisciplineMajorMapper; @Override public Boolean add(BasicDisciplineMajorE basicDisciplineMajorE) { @@ -45,4 +54,21 @@ public class BasicDisciplineMajorGatewayImpl implements BasicDisciplineMajorGate public Boolean deletedBasicDisciplineMajorByIds(Long[] ids) { return basicDisciplineMajorRepository.deletedBasicDisciplineMajorByIds(ids); } + + @Override + public List listByProfessionalNames(Collection professionalNames) { + if (professionalNames == null || professionalNames.isEmpty()) { + return Collections.emptyList(); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(BasicDisciplineMajorDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue()); + wrapper.in(BasicDisciplineMajorDO::getProfessionalName, professionalNames); + List list = basicDisciplineMajorMapper.selectList(wrapper); + if (list == null || list.isEmpty()) { + return Collections.emptyList(); + } + return list.stream() + .map(basicDisciplineMajorDoConvertor::convertDoToEe) + .collect(Collectors.toList()); + } } diff --git a/safety-eval-start/src/main/resources/sdk-prod.yml b/safety-eval-start/src/main/resources/sdk-prod.yml index 0f2d215..a2d821f 100644 --- a/safety-eval-start/src/main/resources/sdk-prod.yml +++ b/safety-eval-start/src/main/resources/sdk-prod.yml @@ -78,4 +78,4 @@ auth: template: personnel: import: - url: \ No newline at end of file + url: https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a6fff4be4b021a75404b514.xlsx \ No newline at end of file diff --git a/safety-eval-start/src/main/resources/sdk.yml b/safety-eval-start/src/main/resources/sdk.yml index 1bdd8a4..069e45d 100644 --- a/safety-eval-start/src/main/resources/sdk.yml +++ b/safety-eval-start/src/main/resources/sdk.yml @@ -79,4 +79,4 @@ auth: template: personnel: import: - url: \ No newline at end of file + url: https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a6fff4be4b021a75404b514.xlsx \ No newline at end of file