archive file
parent
426bd3e22b
commit
2a4421a274
|
|
@ -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("人;");
|
||||
}
|
||||
|
||||
/**
|
||||
* 行业专业能力人员要求校验(一人一岗)
|
||||
* <p>
|
||||
* 每个人员(sourcePersonnelId)可能具备多个专业能力,但只能被分配到一个专业能力岗位。
|
||||
* 使用最大流算法(Dinic)求解最优分配方案,判断是否能满足所有专业能力的人数要求。
|
||||
* <p>
|
||||
* 核心约束:certCapabilityList 中 personnelId == industryProfessionalPersonCos 中 sourcePersonnelId 标识同一人,
|
||||
* 一个人最多只能占用一个专业能力名额。
|
||||
*
|
||||
* @param standardsDOList 人员要求标准(按 行业code + 专业能力code 分类的人数要求)
|
||||
* @param industryProfessionalPersonCos 当前实际人员(用于确定参检人员范围)
|
||||
* @param certCapabilityList 人员证书专业能力信息(提供人员→专业能力映射)
|
||||
* @return Pair<Boolean, String> key 是否通过 ,value 失败消息(通过时为 null)
|
||||
*/
|
||||
public static Pair<Boolean, String> doIndustryProfessionalStandardsValid(
|
||||
List<IndustryProfessionalStandardsDO> standardsDOList
|
||||
, List<IndustryProfessionalPersonCo> industryProfessionalPersonCos
|
||||
, List<OrgPersonnelCertCapabilityComplianceCheckCO> certCapabilityList) {
|
||||
|
||||
if (CollectionUtils.isEmpty(standardsDOList)) {
|
||||
return Pair.of(true, null);
|
||||
}
|
||||
|
||||
Map<String, Long> requiredMap = new HashMap<>();
|
||||
for (IndustryProfessionalStandardsDO standardsDO : standardsDOList) {
|
||||
requiredMap.put(standardsDO.getProfessionalCapabilityCode(), standardsDO.getPersonNum());
|
||||
}
|
||||
|
||||
// 3. 构建人员→可担任专业能力code集合(同一人可能具备多个专业能力)
|
||||
Map<Long, IndustryProfessionalPersonCo> personnelMap = industryProfessionalPersonCos.stream()
|
||||
.collect(Collectors.toMap(IndustryProfessionalPersonCo::getSourcePersonnelId, Function.identity()));
|
||||
|
||||
Map<Long, Set<String>> 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<String> pdcSet = Arrays.stream(co.getProfessionalCapabilityCode().split(CommonUtil.COMMA))
|
||||
.collect(Collectors.toSet());
|
||||
personCapabilityMap.computeIfAbsent(pc.getPersonnelId(), k -> new HashSet<>())
|
||||
.addAll(pdcSet);
|
||||
}
|
||||
}
|
||||
|
||||
// 数据来源:industryProfessionalPersonCos(备案人员自带专业能力)+ certCapabilityList(证书专业能力)
|
||||
Map<String, Long> 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<String, Long> 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());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue