import
parent
135ed094d3
commit
d1db56705f
|
|
@ -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<String> 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;不存在则抛出异常。
|
||||
* <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) {
|
||||
Set<String> 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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -79,4 +79,7 @@ public class OrgPersonnelImportRow {
|
|||
|
||||
/** 校验通过后回填的岗位ID(非Excel列)。 */
|
||||
private Long postId;
|
||||
|
||||
/** 校验通过后回填的学科基础专业对照表ID(非Excel列)。 */
|
||||
private Long basicDisciplineMajorId;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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", "人员证书不存在"),
|
||||
|
|
|
|||
|
|
@ -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<BasicDisciplineMajorE> listByProfessionalNames(Collection<String> professionalNames);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,14 @@ public interface BasicDisciplineMajorDoConvertor {
|
|||
*/
|
||||
BasicDisciplineMajorDO convertEeToDo(BasicDisciplineMajorE basicDisciplineMajorE);
|
||||
|
||||
/**
|
||||
* DO转领域对象
|
||||
*
|
||||
* @param basicDisciplineMajorDo DO
|
||||
* @return
|
||||
*/
|
||||
BasicDisciplineMajorE convertDoToEe(BasicDisciplineMajorDO basicDisciplineMajorDo);
|
||||
|
||||
/**
|
||||
* DO转Co
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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<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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,4 +78,4 @@ auth:
|
|||
template:
|
||||
personnel:
|
||||
import:
|
||||
url:
|
||||
url: https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a6fff4be4b021a75404b514.xlsx
|
||||
|
|
@ -79,4 +79,4 @@ auth:
|
|||
template:
|
||||
personnel:
|
||||
import:
|
||||
url:
|
||||
url: https://test-dragon-yf-pub.oss-cn-hangzhou.aliyuncs.com/jjb/6a6fff4be4b021a75404b514.xlsx
|
||||
Loading…
Reference in New Issue