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 4a4c850a..74553dde 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 @@ -521,7 +521,7 @@ public class ComplianceCheckUtil { String capCode = standard.getProfessionalCapabilityCode(); long required = standard.getPersonNum() == null ? 0L : standard.getPersonNum(); long assigned = assignedMap.getOrDefault(industryCode + "::" + capCode, 0L); - appendIfShort(industryCode, capCode, required, assigned, failureMsg); + appendIfShort(industryCode, standard, required, assigned, failureMsg); } } @@ -540,22 +540,22 @@ public class ComplianceCheckUtil { long available = personCapabilityMap.values().stream() .filter(caps -> caps.contains(capCode)) .count(); - appendIfShort(industryName, capCode, required, available, failureMsg); + appendIfShort(industryName, standard, required, available, failureMsg); } } /** * 当实际人数小于需求时,追加一条失败明细 */ - private static void appendIfShort(String industryOrCode, String capCode, long required + private static void appendIfShort(String industryOrCode, IndustryProfessionalStandardsDO standard, long required , long available, StringBuilder failureMsg) { if (available >= required) { return; } IndustryEnum industryEnum = IndustryEnum.ofCode(industryOrCode); String industryName = industryEnum != null ? industryEnum.getValue() : industryOrCode; - ProfessionalCapabilityEnum capEnum = ProfessionalCapabilityEnum.ofCode(capCode); - String capName = capEnum != null ? capEnum.getValue() : capCode; + ProfessionalCapabilityEnum capEnum = ProfessionalCapabilityEnum.ofCode(standard.getProfessionalCapabilityCode()); + String capName = capEnum != null ? capEnum.getValue() : standard.getProfessionalCapabilityCode(); failureMsg.append(industryName) .append(CommonUtil.COLON) .append(capName) @@ -566,81 +566,6 @@ public class ComplianceCheckUtil { .append("人;"); } - /** - * 行业专业能力人员要求校验(一人一岗) - *

- * 每个人员(sourcePersonnelId)可能具备多个专业能力,但只能被分配到一个专业能力岗位。 - * 使用最大流算法(Dinic)求解最优分配方案,判断是否能满足所有专业能力的人数要求。 - *

- * 核心约束:certCapabilityList 中 personnelId == industryProfessionalPersonCos 中 sourcePersonnelId 标识同一人, - * 一个人最多只能占用一个专业能力名额。 - * - * @param standardsDOList 人员要求标准(按 行业code + 专业能力code 分类的人数要求) - * @param industryProfessionalPersonCos 当前实际人员(用于确定参检人员范围) - * @param certCapabilityList 人员证书专业能力信息(提供人员→专业能力映射) - * @return Pair key 是否通过 ,value 失败消息(通过时为 null) - */ - public static Pair doIndustryProfessionalStandardsValid( - List standardsDOList - , List industryProfessionalPersonCos - , List certCapabilityList) { - - if (CollectionUtils.isEmpty(standardsDOList)) { - return Pair.of(true, null); - } - - Map requiredMap = new HashMap<>(); - for (IndustryProfessionalStandardsDO standardsDO : standardsDOList) { - requiredMap.put(standardsDO.getProfessionalCapabilityCode(), standardsDO.getPersonNum()); - } - - // 3. 构建人员→可担任专业能力code集合(同一人可能具备多个专业能力) - Map personnelMap = industryProfessionalPersonCos.stream() - .collect(Collectors.toMap(IndustryProfessionalPersonCo::getSourcePersonnelId, Function.identity())); - - Map> personCapabilityMap = new HashMap<>(); - for (OrgPersonnelCertCapabilityComplianceCheckCO pc : certCapabilityList) { - // 人员证书的能力 - personCapabilityMap.computeIfAbsent(pc.getPersonnelId(), k -> new HashSet<>()) - .add(pc.getProfessionalCapabilityCode()); - IndustryProfessionalPersonCo co = personnelMap.get(pc.getPersonnelId()); - if (co != null) { - // 人员学科能力 - Set pdcSet = Arrays.stream(co.getProfessionalCapabilityCode().split(CommonUtil.COMMA)) - .collect(Collectors.toSet()); - personCapabilityMap.computeIfAbsent(pc.getPersonnelId(), k -> new HashSet<>()) - .addAll(pdcSet); - } - } - - // 数据来源:industryProfessionalPersonCos(备案人员自带专业能力)+ certCapabilityList(证书专业能力) - Map assignedMap = canFullyAssign(personCapabilityMap, requiredMap); - - IndustryEnum industryEnum = IndustryEnum.ofCode(standardsDOList.get(0).getIndustryCode()); - String industryName = industryEnum != null ? industryEnum.getValue() : standardsDOList.get(0).getIndustryCode(); - - boolean allMet = true; - StringBuilder failureMsg = new StringBuilder(); - for (Map.Entry entry : requiredMap.entrySet()) { - String capCode = entry.getKey(); - long required = entry.getValue() == null ? 0L : entry.getValue(); - long assigned = assignedMap.getOrDefault(capCode, 0L); - if (assigned < required) { - allMet = false; - ProfessionalCapabilityEnum capEnum = ProfessionalCapabilityEnum.ofCode(capCode); - String capName = capEnum != null ? capEnum.getValue() : capCode; - failureMsg.append(industryName) - .append(CommonUtil.COLON) - .append(capName) - .append(" 需要") - .append(required) - .append("人,当前可用") - .append(assigned) - .append("人;"); - } - } - return allMet ? Pair.of(true, null) : Pair.of(false, failureMsg.toString()); - } /**