diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/QualFilingPersonnelFilingCheckDTO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/QualFilingPersonnelFilingCheckDTO.java new file mode 100644 index 00000000..2103dd9d --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/QualFilingPersonnelFilingCheckDTO.java @@ -0,0 +1,38 @@ +package org.qinan.safetyeval.client.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.qinan.safetyeval.domain.entity.CapabilityAssessmentDTO; +import org.qinan.safetyeval.domain.entity.TitleCodeCo; + +import java.util.List; + +/** + * 备案申请人员新增命令 + * + * @author safety-eval + */ +@Data +public class QualFilingPersonnelFilingCheckDTO { + @ApiModelProperty("人员id") + private Long id; + + @ApiModelProperty(value = "人员岗位类型: TECHNICAL_LEADER=>技术负责人; PROCESS_CONTROL_LEADER=>过程控制负责人") + private String personnelPositionType; + + @ApiModelProperty(value = "能力认定") + private List capabilityAssessment; + + + @ApiModelProperty(value = "是否技术负责人(false否true是)") + private Boolean technicalDirectorFlag; + + @ApiModelProperty(value = "是否过程控制负责人(false否true是)") + private Boolean processControlLeaderFlag; + + @ApiModelProperty(value = "职称(多个逗号分隔)") + private List titleCodeArr; + +// @ApiModelProperty(value = "人员证书信息") +// private List personnelCertFilingPageCOList; +} diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/basic/PersonnelPositionTypeEnum.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/basic/PersonnelPositionTypeEnum.java index 3737c120..15fcb2e5 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/basic/PersonnelPositionTypeEnum.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/basic/PersonnelPositionTypeEnum.java @@ -12,11 +12,12 @@ public enum PersonnelPositionTypeEnum { TECHNICAL_LEADER("TECHNICAL_LEADER", "技术负责人"), PROCESS_CONTROL_LEADER("PROCESS_CONTROL_LEADER", "过程控制负责人"), + BASIC("BASIC", "基础人员"), ; private final String value; private final String label; public static final String REMARKS = "人员岗位类型: TECHNICAL_LEADER=>技术负责人;" + - "PROCESS_CONTROL_LEADER=>过程控制负责人"; + "PROCESS_CONTROL_LEADER=>过程控制负责人;BASIC=>基础人员" ; } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/utils/ComplianceCheckUtil.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/utils/ComplianceCheckUtil.java index be2c5dc3..90c3d03e 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/utils/ComplianceCheckUtil.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/utils/ComplianceCheckUtil.java @@ -13,8 +13,10 @@ import org.qinan.safetyeval.client.dto.*; import org.qinan.safetyeval.domain.constant.*; import org.qinan.safetyeval.domain.constant.basic.IndustryEnum; import org.qinan.safetyeval.domain.constant.basic.ProfessionalCapabilityEnum; +import org.qinan.safetyeval.domain.entity.CapabilityAssessmentDTO; import org.qinan.safetyeval.domain.entity.TitleCodeCo; import org.qinan.safetyeval.domain.exception.BizException; +import org.qinan.safetyeval.domain.exception.ErrorCode; import org.qinan.safetyeval.infrastructure.dataobject.OrgPersonnelDO; import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelCertMapper; import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelMapper; @@ -53,12 +55,15 @@ public class ComplianceCheckUtil { List results = new ArrayList<>(); - // 0. 查询人员证书专业能力信息 - List - certCapabilityList = queryOrgPersonnelCertCapability(personnelList); + // 0. 查询人员备案数据 + List personnelFilingCheckList = queryPersonnelFilingCheck(personnelList); + +// // 0. 查询人员证书专业能力信息 +// List +// certCapabilityList = queryOrgPersonnelCertCapability(personnelList); // 0.1 查询人员职称信息并回填到 personnelList - fillTitleCodeArr(personnelList); + fillTitleCodeArr(personnelList, personnelFilingCheckList); // 1. 独立法人资格 results.add(checkMainQualification(filing)); @@ -77,7 +82,7 @@ public class ComplianceCheckUtil { results.add(checkPersonnelCount(filing, personnelList)); // 6. 人员比例 - results.add(checkPersonnelRatio(filing.getBusinessScope(), personnelList, certCapabilityList, throwException)); + results.add(checkPersonnelRatio(filing.getBusinessScope(), personnelList, personnelFilingCheckList, throwException)); // 7. 负责人配备 results.add(checkKeyPosition(filing, personnelList)); @@ -142,36 +147,72 @@ public class ComplianceCheckUtil { } /** - * 查询 org_personnel 的 title_code_arr(职称信息)并回填到备案人员列表。 + * 查询人员备案检查数据 *

- * 根据 sourcePersonnelId(对应 org_personnel.id)查询 title_code_arr, - * 解析 JSON 字符串为 {@link TitleCodeCo} 列表后设置到 personnelList 中。 + * 根据 sourcePersonnelId(对应 org_personnel.id)查询人员的岗位类型、能力认定、 + * 技术负责人标志、过程控制负责人标志和职称信息。 * * @param personnelList 备案人员列表 + * @return 人员备案检查数据列表 */ - private void fillTitleCodeArr(List personnelList) { + private List queryPersonnelFilingCheck( + List personnelList) { if (CollectionUtils.isEmpty(personnelList)) { - return; - } - List sourcePersonnelIds = personnelList.stream() - .map(QualFilingPersonnelAddCmd::getSourcePersonnelId) - .filter(Objects::nonNull) - .distinct() - .collect(Collectors.toList()); - if (sourcePersonnelIds.isEmpty()) { - return; + return Collections.emptyList(); } + Map sourcePersonnelIds = personnelList.stream() + .collect(Collectors.toMap(QualFilingPersonnelAddCmd::getSourcePersonnelId, Function.identity())); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() - .select(OrgPersonnelDO::getId, OrgPersonnelDO::getTitleCodeArr) - .in(OrgPersonnelDO::getId, sourcePersonnelIds); + .select(OrgPersonnelDO::getId, OrgPersonnelDO::getPersonnelPositionType, + OrgPersonnelDO::getCapabilityAssessment, OrgPersonnelDO::getTechnicalDirectorFlag, + OrgPersonnelDO::getProcessControlLeaderFlag, OrgPersonnelDO::getTitleCodeArr) + .in(OrgPersonnelDO::getId, sourcePersonnelIds.keySet()); List orgPersonnelList = SpringUtil.getBean(OrgPersonnelMapper.class).selectList(wrapper); - Map titleCodeArrMap = orgPersonnelList.stream() - .filter(p -> p.getTitleCodeArr() != null) - .collect(Collectors.toMap(OrgPersonnelDO::getId, OrgPersonnelDO::getTitleCodeArr, (a, b) -> a)); + List result = new ArrayList<>(); + for (OrgPersonnelDO personnel : orgPersonnelList) { + sourcePersonnelIds.remove(personnel.getId()); + QualFilingPersonnelFilingCheckDTO dto = new QualFilingPersonnelFilingCheckDTO(); + dto.setId(personnel.getId()); + dto.setPersonnelPositionType(personnel.getPersonnelPositionType()); + dto.setCapabilityAssessment( + JSONUtil.toList(personnel.getCapabilityAssessment(), CapabilityAssessmentDTO.class)); + dto.setTechnicalDirectorFlag(personnel.getTechnicalDirectorFlag()); + dto.setProcessControlLeaderFlag(personnel.getProcessControlLeaderFlag()); + dto.setTitleCodeArr(JSONUtil.toList(personnel.getTitleCodeArr(), TitleCodeCo.class)); + result.add(dto); + } + + // 人员缺少返回 + if (!CollectionUtils.isEmpty(sourcePersonnelIds)) { + String collect = sourcePersonnelIds.values().stream() + .map(QualFilingPersonnelAddCmd::getPersonName) + .filter(Objects::nonNull) + .collect(Collectors.joining(CommonUtil.COMMA)); + throw new BizException(ErrorCode.UNKNOWN_ERROR, "人员信息不存在" + collect); + } + return result; + } + + /** + * 将人员备案检查数据中的职称信息回填到备案人员列表。 + * + * @param personnelList 备案人员列表 + * @param personnelFilingCheckList 人员备案检查数据(已包含职称信息) + */ + private void fillTitleCodeArr(List personnelList, + List personnelFilingCheckList) { + if (CollectionUtils.isEmpty(personnelList) || CollectionUtils.isEmpty(personnelFilingCheckList)) { + return; + } + Map> titleCodeArrMap = personnelFilingCheckList.stream() + .filter(p -> p.getId() != null && p.getTitleCodeArr() != null) + .collect(Collectors.toMap(QualFilingPersonnelFilingCheckDTO::getId, + QualFilingPersonnelFilingCheckDTO::getTitleCodeArr, (a, b) -> a)); for (QualFilingPersonnelAddCmd personnel : personnelList) { - String titleCodeArrJson = titleCodeArrMap.get(personnel.getSourcePersonnelId()); - if (StringUtils.hasText(titleCodeArrJson)) { - personnel.setTitleCodeArr(JSONUtil.toList(titleCodeArrJson, TitleCodeCo.class)); + List titleCodeArr = titleCodeArrMap.get(personnel.getSourcePersonnelId()); + if (titleCodeArr != null) { + personnel.setTitleCodeArr(titleCodeArr); } } } @@ -191,7 +232,7 @@ public class ComplianceCheckUtil { boolean pass = filing.getFixedAssetAmount() != null && filing.getFixedAssetAmount() >= 800L; String currentValue = filing.getFixedAssetAmount() != null - ? filing.getFixedAssetAmount() + " 万元" : "未填写"; + ? filing.getFixedAssetAmount() + " 万元" : "未填写" ; return buildResult(QualFilingComplianceCheckEnum.FIXED_AMOUNT, pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, currentValue); @@ -204,22 +245,22 @@ public class ComplianceCheckUtil { boolean pass = filing.getWorkplaceArea() != null && filing.getWorkplaceArea() .compareTo(new BigDecimal(QualFilingComplianceCheckEnum.WORKPLACE_LOWER)) >= 0; - String workplace = filing.getWorkplaceArea() != null ? filing.getWorkplaceArea().toPlainString() : "未填写"; - String archive = filing.getArchiveRoomArea() != null ? filing.getArchiveRoomArea().toPlainString() : "未填写"; - String currentValue = "工作场所 " + workplace + " 平方米,档案室 " + archive + " 平方米"; + String workplace = filing.getWorkplaceArea() != null ? filing.getWorkplaceArea().toPlainString() : "未填写" ; + String archive = filing.getArchiveRoomArea() != null ? filing.getArchiveRoomArea().toPlainString() : "未填写" ; + String currentValue = "工作场所 " + workplace + " 平方米,档案室 " + archive + " 平方米" ; return buildResult(QualFilingComplianceCheckEnum.WORKPLACE, pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, currentValue); } /** - * 专职技术人员数量:>= 25人 + * 专职技术人员数量:>= 25+(业务范围数量-1)*5人 */ private QualFilingComplianceCheckResultCO checkPersonnelCount(QualFilingAddCmd filing, List personnelList) { int scopeCount = filing.getBusinessScope() != null ? filing.getBusinessScope().size() : 0; int total = personnelList == null ? 0 : personnelList.size(); boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER + (scopeCount - 1) * 5; - String currentValue = scopeCount + " 个业务范围," + total + " 人"; + String currentValue = scopeCount + " 个业务范围," + total + " 人" ; return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT, pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, currentValue); @@ -230,16 +271,16 @@ public class ComplianceCheckUtil { */ private QualFilingComplianceCheckResultCO checkPersonnelRatio( List businessScope, List personnelList - , List personnelCertCoList, boolean throwException) { + , List personnelCertCoList, boolean throwException) { if (personnelList == null || personnelList.isEmpty()) { return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_RATIO, QualFilingComplianceCheckEnum.STATUS_FAIL, "无人员数据"); } int total = personnelList.size(); Set engineerSet = personnelCertCoList.stream() - .filter(p -> CertTypeCodeEnum.REGISTERED_SAFETY_ENGINEER - .getCode().equals(p.getCertTypeCode()) && !CertLevelEnum.JUNIOR.getCode().equals(p.getCertLevel())) - .map(OrgPersonnelCertCapabilityComplianceCheckCO::getPersonnelId) +// .filter(p -> CertTypeCodeEnum.REGISTERED_SAFETY_ENGINEER +// .getCode().equals(p.getCertTypeCode()) && !CertLevelEnum.JUNIOR.getCode().equals(p.getCertLevel())) + .map(QualFilingPersonnelFilingCheckDTO::getId) .collect(Collectors.toSet()); Set seniorTitleSet = personnelList.stream() .filter(p -> p.getTitleCodeArr() != null && p.getTitleCodeArr().stream() @@ -253,7 +294,7 @@ public class ComplianceCheckUtil { boolean pass = engineerRate >= QualFilingComplianceCheckEnum.PERSONNEL_RATE && seniorTitleRate >= QualFilingComplianceCheckEnum.PERSONNEL_RATE && sumRate >= 60; - String currentValue = "注册安工程师 " + engineerRate + "%,高级职称 " + seniorTitleRate + "%,合计 " + sumRate + "%"; + String currentValue = "注册安工程师 " + engineerRate + "%,高级职称 " + seniorTitleRate + "%,合计 " + sumRate + "%" ; if (!pass && throwException) { throw new BizException(PERSON_NOT_ENOUGH, currentValue); } @@ -266,7 +307,11 @@ public class ComplianceCheckUtil { List personnelCoList = SpringUtil.getBean(OrgPersonnelMapper.class) .selectProfessionalCapabilityByPersonnelIds(sourcePersonnelIds); Pair booleanStringPair = industryProfessionalStandardsValid( - businessScope, personnelCoList, personnelCertCoList); + businessScope, personnelCoList, null); + + /*Pair booleanStringPair = industryProfessionalStandardsValid( + businessScope, personnelCoList, personnelCertCoList);*/ + boolean personPassed = Boolean.TRUE.equals(booleanStringPair.getKey()); if (!personPassed && throwException) { throw new BizException(PERSON_NOT_ENOUGH, booleanStringPair.getValue()); @@ -286,15 +331,11 @@ public class ComplianceCheckUtil { */ private QualFilingComplianceCheckResultCO checkKeyPosition(QualFilingAddCmd filing, List personnelList) { - if(true){ + if (true) { // todo 暂时无法判定因为 人员去掉了业务范围 ;后面填报资质的时候需要修改 - return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, QualFilingComplianceCheckEnum.STATUS_PASS , + return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, QualFilingComplianceCheckEnum.STATUS_PASS, "满足条件"); } - if (personnelList == null || personnelList.isEmpty()) { - return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, - QualFilingComplianceCheckEnum.STATUS_FAIL, "无人员数据"); - } // 提取所有来源人员id(对应 org_personnel.id) List sourcePersonnelIds = personnelList.stream() @@ -303,10 +344,6 @@ public class ComplianceCheckUtil { .distinct() .collect(Collectors.toList()); - if (sourcePersonnelIds.isEmpty()) { - return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, - QualFilingComplianceCheckEnum.STATUS_FAIL, "无来源人员id"); - } // 通过 SpringUtil 获取 OrgPersonnelMapper,按业务范围(qual_scope)分组统计负责人数量 OrgPersonnelMapper orgPersonnelMapper = SpringUtil.getBean(OrgPersonnelMapper.class); @@ -338,7 +375,7 @@ public class ComplianceCheckUtil { if (industryEnum != null) { scope = industryEnum.getValue(); } else { - scope = "未知行业范围"; + scope = "未知行业范围" ; } currentValue.append("业务[").append(scope).append("] 技术负责人 ") .append(technicalDirectorCount).append("/1,过程控制负责人 ") @@ -376,7 +413,7 @@ public class ComplianceCheckUtil { && m.getUploadStatusCode() == QualFilingMaterialUploadStatusEnum.UPLOADED.getCode() && m.getMaterialType() != null && m.getMaterialType() == MaterialTypeEnum.NO_VIOLATION_RECORD.getCode()); - String currentValue = hasRecord ? "未命中重大违法失信记录" : "命中重大违法失信记录"; + String currentValue = hasRecord ? "未命中重大违法失信记录" : "命中重大违法失信记录" ; return buildResult(QualFilingComplianceCheckEnum.CREDIT_RECORD, hasRecord ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, currentValue); diff --git a/safety-eval-infrastructure/src/main/resources/mapper/OrgPersonnelMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/OrgPersonnelMapper.xml index 4120e816..380ac1ce 100644 --- a/safety-eval-infrastructure/src/main/resources/mapper/OrgPersonnelMapper.xml +++ b/safety-eval-infrastructure/src/main/resources/mapper/OrgPersonnelMapper.xml @@ -91,10 +91,10 @@ AND p.user_name LIKE CONCAT('%', #{query.personName}, '%') - AND (p.technical_director_flag =1 or p.process_control_leader_flag =1) + AND (p.personnel_position_type =1 or p.process_control_leader_flag =1) - AND (p.technical_director_flag !=1 and p.process_control_leader_flag !=1) + AND (p.technical_director_flag =0 and p.process_control_leader_flag =0) ORDER BY p.id DESC