diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/IndustryProfessionalPersonCo.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/IndustryProfessionalPersonCo.java new file mode 100644 index 0000000..ad2ca47 --- /dev/null +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/IndustryProfessionalPersonCo.java @@ -0,0 +1,23 @@ +package org.qinan.safetyeval.client.co; + +import lombok.Data; + +@Data +public class IndustryProfessionalPersonCo { + + /** + * 行业code + */ + private String industryCode; + + /** + * 专业能力 code + */ + private String professionalCapabilityCode; + + + /** + * 人员数量 + */ + private Long personNum; +} 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 c9bfa4c..b8e96cb 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 @@ -1,16 +1,23 @@ package org.qinan.safetyeval.infrastructure.utils; +import cn.hutool.core.lang.Pair; import lombok.experimental.UtilityClass; +import org.qinan.safetyeval.client.co.IndustryProfessionalPersonCo; import org.qinan.safetyeval.client.co.QualFilingComplianceCheckResultCO; import org.qinan.safetyeval.client.dto.*; import org.qinan.safetyeval.domain.constant.MaterialTypeEnum; import org.qinan.safetyeval.domain.constant.QualFilingComplianceCheckEnum; import org.qinan.safetyeval.domain.constant.QualFilingMaterialUploadStatusEnum; import org.qinan.safetyeval.domain.constant.QualificationLevelEnum; +import org.qinan.safetyeval.infrastructure.persistence.domainobject.IndustryProfessionalStandardsDO; +import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 资质备案合规检查工具类 @@ -110,7 +117,7 @@ public class ComplianceCheckUtil { 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; + boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER + (scopeCount - 1) * 5; String currentValue = scopeCount + " 个业务范围," + total + " 人"; return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT, pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, @@ -194,4 +201,59 @@ public class ComplianceCheckUtil { co.setCurrentValue(currentValued); return co; } + + + /** + * 行业专业能力人员要求校验 + * + * @param standardsDOList 人员要求标准(按 行业code + 专业能力code 分类的人数要求) + * @param industryProfessionalPersonCos 当前实际人员数(按 行业code + 专业能力code 分类汇总) + * @return Pair key 是否通过 ,value 失败消息(通过时为 null) + */ + public static Pair industryProfessionalStandardsValid(List standardsDOList + , List industryProfessionalPersonCos) { + if (CollectionUtils.isEmpty(standardsDOList)) { + return Pair.of(true, null); + } + List currentList = + industryProfessionalPersonCos == null ? Collections.emptyList() : industryProfessionalPersonCos; + + // 当前人员数按 行业code + 专业能力code 分类汇总 + Map currentCountMap = currentList.stream() + .collect(Collectors.groupingBy( + c -> groupKey(c.getIndustryCode(), c.getProfessionalCapabilityCode()), + Collectors.summingLong(c -> c.getPersonNum() == null ? 0L : c.getPersonNum()))); + + // 要求按 行业code + 专业能力code 分类汇总,并记录专业能力名称 + StringBuilder failureMsg = new StringBuilder(); + for (IndustryProfessionalStandardsDO s : standardsDOList) { + String key = groupKey(s.getIndustryCode(), s.getProfessionalCapabilityCode()); + Long currentPerson = currentCountMap.getOrDefault(key, 0L); + requireNameMap.putIfAbsent(key, s.getProfessionalCapabilityName()); + } + + + for (Map.Entry entry : requireCountMap.entrySet()) { + long require = entry.getValue(); + long current = currentCountMap.getOrDefault(entry.getKey(), 0L); + if (current < require) { + if (failureMsg.length() > 0) { + failureMsg.append(";"); + } + String name = requireNameMap.get(entry.getKey()); + failureMsg.append(name != null ? name : entry.getKey()) + .append(" 需要").append(require).append("人,当前").append(current).append("人"); + } + } + + return failureMsg.length() > 0 ? Pair.of(false, failureMsg.toString()) : Pair.of(true, null); + } + + /** + * 行业code + 专业能力code 分组键 + */ + private static String groupKey(String industryCode, String professionalCapabilityCode) { + return (industryCode == null ? "" : industryCode) + "_" + + (professionalCapabilityCode == null ? "" : professionalCapabilityCode); + } }