archive file
parent
426bd3e22b
commit
2a4421a274
|
|
@ -521,7 +521,7 @@ public class ComplianceCheckUtil {
|
||||||
String capCode = standard.getProfessionalCapabilityCode();
|
String capCode = standard.getProfessionalCapabilityCode();
|
||||||
long required = standard.getPersonNum() == null ? 0L : standard.getPersonNum();
|
long required = standard.getPersonNum() == null ? 0L : standard.getPersonNum();
|
||||||
long assigned = assignedMap.getOrDefault(industryCode + "::" + capCode, 0L);
|
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()
|
long available = personCapabilityMap.values().stream()
|
||||||
.filter(caps -> caps.contains(capCode))
|
.filter(caps -> caps.contains(capCode))
|
||||||
.count();
|
.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) {
|
, long available, StringBuilder failureMsg) {
|
||||||
if (available >= required) {
|
if (available >= required) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
IndustryEnum industryEnum = IndustryEnum.ofCode(industryOrCode);
|
IndustryEnum industryEnum = IndustryEnum.ofCode(industryOrCode);
|
||||||
String industryName = industryEnum != null ? industryEnum.getValue() : industryOrCode;
|
String industryName = industryEnum != null ? industryEnum.getValue() : industryOrCode;
|
||||||
ProfessionalCapabilityEnum capEnum = ProfessionalCapabilityEnum.ofCode(capCode);
|
ProfessionalCapabilityEnum capEnum = ProfessionalCapabilityEnum.ofCode(standard.getProfessionalCapabilityCode());
|
||||||
String capName = capEnum != null ? capEnum.getValue() : capCode;
|
String capName = capEnum != null ? capEnum.getValue() : standard.getProfessionalCapabilityCode();
|
||||||
failureMsg.append(industryName)
|
failureMsg.append(industryName)
|
||||||
.append(CommonUtil.COLON)
|
.append(CommonUtil.COLON)
|
||||||
.append(capName)
|
.append(capName)
|
||||||
|
|
@ -566,81 +566,6 @@ public class ComplianceCheckUtil {
|
||||||
.append("人;");
|
.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