dev
luotaiqian 2026-08-03 10:41:37 +08:00
parent 135ed094d3
commit d1db56705f
8 changed files with 111 additions and 5 deletions

View File

@ -12,6 +12,8 @@ import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.gateway.OrgDepartmentGateway; import org.qinan.safetyeval.domain.gateway.OrgDepartmentGateway;
import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway; import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway;
import org.qinan.safetyeval.domain.gateway.OrgPositionGateway; 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.domain.service.OrgPersonnelDomainService;
import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -61,6 +63,9 @@ public class OrgPersonnelExcelImporter {
@Resource @Resource
private OrgPersonnelGateway orgPersonnelGateway; private OrgPersonnelGateway orgPersonnelGateway;
@Resource
private BasicDisciplineMajorGateway basicDisciplineMajorGateway;
@Resource @Resource
private OrgPersonnelDomainService orgPersonnelDomainService; private OrgPersonnelDomainService orgPersonnelDomainService;
@ -87,10 +92,13 @@ public class OrgPersonnelExcelImporter {
// 2. 批量校验并回填岗位ID // 2. 批量校验并回填岗位ID
validateAndFillPosition(rows, orgId); validateAndFillPosition(rows, orgId);
// 3. 批量查询库中已存在的账号(未删除) // 3. 批量校验并回填所学专业ID
validateAndFillMajor(rows);
// 4. 批量查询库中已存在的账号(未删除)
Set<String> existingAccounts = batchQueryExistingAccounts(rows, orgId); Set<String> existingAccounts = batchQueryExistingAccounts(rows, orgId);
// 4. 逐行转换、落库 // 5. 逐行转换、落库
int successCount = 0; int successCount = 0;
for (OrgPersonnelImportRow row : rows) { for (OrgPersonnelImportRow row : rows) {
@ -270,6 +278,54 @@ public class OrgPersonnelExcelImporter {
} }
} }
/**
* basic_discipline_major.professional_name
* basicDisciplineMajorId
* <p></p>
*/
private void validateAndFillMajor(List<OrgPersonnelImportRow> rows) {
Set<String> majorNames = rows.stream()
.map(r -> trim(r.getMajor()))
.filter(StringUtils::hasText)
.collect(Collectors.toCollection(LinkedHashSet::new));
Map<String, BasicDisciplineMajorE> majorMap = new HashMap<>();
if (!majorNames.isEmpty()) {
for (BasicDisciplineMajorE major : basicDisciplineMajorGateway.listByProfessionalNames(majorNames)) {
if (major.getProfessionalName() != null) {
majorMap.putIfAbsent(major.getProfessionalName().trim(), major);
}
}
}
// 收集所有缺失专业(保留出现顺序,附带首个出现行号)
Map<String, Integer> 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<String> batchQueryExistingAccounts(List<OrgPersonnelImportRow> rows, Long orgId) { private Set<String> batchQueryExistingAccounts(List<OrgPersonnelImportRow> rows, Long orgId) {
Set<String> accounts = rows.stream() Set<String> accounts = rows.stream()
.map(r -> trim(r.getAccount())) .map(r -> trim(r.getAccount()))
@ -292,6 +348,7 @@ public class OrgPersonnelExcelImporter {
entity.setOrgId(orgId); entity.setOrgId(orgId);
entity.setDeptId(row.getDeptId()); entity.setDeptId(row.getDeptId());
entity.setPostId(row.getPostId()); entity.setPostId(row.getPostId());
entity.setBasicDisciplineMajorId(row.getBasicDisciplineMajorId());
entity.setUserName(trim(row.getUserName())); entity.setUserName(trim(row.getUserName()));
entity.setAccount(trim(row.getAccount())); entity.setAccount(trim(row.getAccount()));
entity.setIdCardNo(trim(row.getIdCardNo())); 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; return entity;
} }

View File

@ -79,4 +79,7 @@ public class OrgPersonnelImportRow {
/** 校验通过后回填的岗位ID非Excel列。 */ /** 校验通过后回填的岗位ID非Excel列。 */
private Long postId; private Long postId;
/** 校验通过后回填的学科基础专业对照表ID非Excel列。 */
private Long basicDisciplineMajorId;
} }

View File

@ -34,6 +34,7 @@ public enum ErrorCode {
ORG_PERSONNEL_IMPORT_PARSE_ERROR("01-05-008", "导入文件解析失败"), ORG_PERSONNEL_IMPORT_PARSE_ERROR("01-05-008", "导入文件解析失败"),
ORG_PERSONNEL_IMPORT_DEPT_NOT_FOUND("01-05-009", "导入文件中存在不存在的部门"), ORG_PERSONNEL_IMPORT_DEPT_NOT_FOUND("01-05-009", "导入文件中存在不存在的部门"),
ORG_PERSONNEL_IMPORT_POSITION_NOT_FOUND("01-05-010", "导入文件中存在不存在的岗位"), 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", "人员证书不存在"), ORG_PERSONNEL_CERT_NOT_FOUND("01-06-001", "人员证书不存在"),

View File

@ -2,6 +2,9 @@ package org.qinan.safetyeval.domain.major.gateway;
import org.qinan.safetyeval.domain.major.model.BasicDisciplineMajorE; import org.qinan.safetyeval.domain.major.model.BasicDisciplineMajorE;
import java.util.Collection;
import java.util.List;
/** /**
* *
* *
@ -41,4 +44,12 @@ public interface BasicDisciplineMajorGateway {
* @return * @return
*/ */
Boolean deletedBasicDisciplineMajorByIds(Long[] ids); Boolean deletedBasicDisciplineMajorByIds(Long[] ids);
/**
*
*
* @param professionalNames
* @return
*/
List<BasicDisciplineMajorE> listByProfessionalNames(Collection<String> professionalNames);
} }

View File

@ -25,6 +25,14 @@ public interface BasicDisciplineMajorDoConvertor {
*/ */
BasicDisciplineMajorDO convertEeToDo(BasicDisciplineMajorE basicDisciplineMajorE); BasicDisciplineMajorDO convertEeToDo(BasicDisciplineMajorE basicDisciplineMajorE);
/**
* DO
*
* @param basicDisciplineMajorDo DO
* @return
*/
BasicDisciplineMajorE convertDoToEe(BasicDisciplineMajorDO basicDisciplineMajorDo);
/** /**
* DOCo * DOCo
* *

View File

@ -1,13 +1,21 @@
package org.qinan.safetyeval.infrastructure.gateway; package org.qinan.safetyeval.infrastructure.gateway;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.qinan.safetyeval.domain.major.gateway.BasicDisciplineMajorGateway; import org.qinan.safetyeval.domain.major.gateway.BasicDisciplineMajorGateway;
import org.qinan.safetyeval.domain.major.model.BasicDisciplineMajorE; import org.qinan.safetyeval.domain.major.model.BasicDisciplineMajorE;
import org.qinan.safetyeval.infrastructure.convertor.BasicDisciplineMajorDoConvertor; import org.qinan.safetyeval.infrastructure.convertor.BasicDisciplineMajorDoConvertor;
import org.qinan.safetyeval.infrastructure.persistence.domainobject.BasicDisciplineMajorDO; 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.infrastructure.persistence.repository.BasicDisciplineMajorRepository;
import org.qinan.safetyeval.domain.constant.BooleanQAEnum;
import org.springframework.stereotype.Service; 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 { public class BasicDisciplineMajorGatewayImpl implements BasicDisciplineMajorGateway {
private final BasicDisciplineMajorRepository basicDisciplineMajorRepository; private final BasicDisciplineMajorRepository basicDisciplineMajorRepository;
private final BasicDisciplineMajorDoConvertor basicDisciplineMajorDoConvertor; private final BasicDisciplineMajorDoConvertor basicDisciplineMajorDoConvertor;
private final BasicDisciplineMajorMapper basicDisciplineMajorMapper;
@Override @Override
public Boolean add(BasicDisciplineMajorE basicDisciplineMajorE) { public Boolean add(BasicDisciplineMajorE basicDisciplineMajorE) {
@ -45,4 +54,21 @@ public class BasicDisciplineMajorGatewayImpl implements BasicDisciplineMajorGate
public Boolean deletedBasicDisciplineMajorByIds(Long[] ids) { public Boolean deletedBasicDisciplineMajorByIds(Long[] ids) {
return basicDisciplineMajorRepository.deletedBasicDisciplineMajorByIds(ids); return basicDisciplineMajorRepository.deletedBasicDisciplineMajorByIds(ids);
} }
@Override
public List<BasicDisciplineMajorE> listByProfessionalNames(Collection<String> professionalNames) {
if (professionalNames == null || professionalNames.isEmpty()) {
return Collections.emptyList();
}
LambdaQueryWrapper<BasicDisciplineMajorDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BasicDisciplineMajorDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue());
wrapper.in(BasicDisciplineMajorDO::getProfessionalName, professionalNames);
List<BasicDisciplineMajorDO> list = basicDisciplineMajorMapper.selectList(wrapper);
if (list == null || list.isEmpty()) {
return Collections.emptyList();
}
return list.stream()
.map(basicDisciplineMajorDoConvertor::convertDoToEe)
.collect(Collectors.toList());
}
} }

View File

@ -78,4 +78,4 @@ auth:
template: template:
personnel: personnel:
import: import:
url: url: https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a6fff4be4b021a75404b514.xlsx

View File

@ -79,4 +79,4 @@ auth:
template: template:
personnel: personnel:
import: import:
url: url: https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a6fff4be4b021a75404b514.xlsx