From 73370b5d788f17bebd7532db193b3cc786fa26c6 Mon Sep 17 00:00:00 2001 From: zhanglei Date: Mon, 3 Aug 2026 15:52:12 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../institution/EvalSignTaskExecutor.java | 5 +++-- .../domain/constant/ProjectRoleEnum.java | 18 ++++++++++++++++++ .../gatewayimpl/SafetyMessageGatewayImpl.java | 7 ++----- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalSignTaskExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalSignTaskExecutor.java index 365d2a5..d611c07 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalSignTaskExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/institution/EvalSignTaskExecutor.java @@ -13,6 +13,7 @@ import org.qinan.safetyeval.client.dto.SingleResponse; import org.qinan.safetyeval.client.dto.institution.EditSignTaskSaveCmd; import org.qinan.safetyeval.client.dto.institution.EvalSignTaskPageQuery; import org.qinan.safetyeval.client.dto.institution.EvalSignTaskSaveCmd; +import org.qinan.safetyeval.domain.constant.ProjectRoleEnum; import org.qinan.safetyeval.domain.constant.ProjectStageEnum; import org.qinan.safetyeval.domain.constant.SignTaskStatusEnum; import org.qinan.safetyeval.domain.constant.SignatureTaskStatusEnum; @@ -106,7 +107,7 @@ public class EvalSignTaskExecutor implements EvalSignTaskApi { .last("limit 1")); if (!CollectionUtils.isEmpty(evalProjectMemberDOS)) { evalSignTaskCO.setSignerPersonnelName(evalProjectMemberDOS.get(0).getPersonnelName()); - evalSignTaskCO.setSignerRoles(ProjectStageEnum.fromVals(evalProjectMemberDOS.get(0).getRole())); + evalSignTaskCO.setSignerRoles(ProjectRoleEnum.fromVals(evalProjectMemberDOS.get(0).getRole())); } return evalSignTaskCO; }).collect(Collectors.toList()); @@ -172,7 +173,7 @@ public class EvalSignTaskExecutor implements EvalSignTaskApi { public SingleResponse signStatistics(EvalSignTaskPageQuery cmd) { EvalSignTaskStatisticsCO evalSignTaskStatisticsCO = new EvalSignTaskStatisticsCO(); List evalSignTaskDOS = evalSignTaskMapper.selectList(new LambdaQueryWrapper() - .eq(EvalSignTaskDO::getProjectId, cmd.getProjectId()) + .eq(Objects.nonNull(cmd.getProjectId()), EvalSignTaskDO::getProjectId, cmd.getProjectId()) .eq(EvalSignTaskDO::getSignerPersonnelId, cmd.getSignerPersonnelId())); if (!CollectionUtils.isEmpty(evalSignTaskDOS)) { long pendingSign = evalSignTaskDOS.stream().filter(f -> f.getTaskStatusCode() == 1).count(); diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/ProjectRoleEnum.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/ProjectRoleEnum.java index a63d397..ba27c7d 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/ProjectRoleEnum.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/constant/ProjectRoleEnum.java @@ -1,8 +1,11 @@ package org.qinan.safetyeval.domain.constant; +import cn.hutool.json.JSONUtil; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.List; + /** * 安平项目角色枚举 * 对应业务流程图中的各岗位角色 @@ -39,4 +42,19 @@ public enum ProjectRoleEnum { } return null; } + + public static String fromVals(String val) { + StringBuilder sb = new StringBuilder(); + List vals = jsonToList(val); + for (ProjectRoleEnum stage : values()) { + if (vals.contains(stage.val)) { + sb.append(stage.mas).append(","); + } + } + return sb.toString(); + } + + public static List jsonToList(String json) { + return json == null ? null : JSONUtil.toList(json, String.class); + } } \ No newline at end of file diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/SafetyMessageGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/SafetyMessageGatewayImpl.java index c6d639d..3ec6e16 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/SafetyMessageGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/SafetyMessageGatewayImpl.java @@ -4,10 +4,7 @@ import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.qinan.safetyeval.domain.constant.MessageSendStateEnum; -import org.qinan.safetyeval.domain.constant.MsgConstant; -import org.qinan.safetyeval.domain.constant.NoticeTypeEnum; -import org.qinan.safetyeval.domain.constant.ProjectStageEnum; +import org.qinan.safetyeval.domain.constant.*; import org.qinan.safetyeval.domain.entity.SafetyMessageEntity; import org.qinan.safetyeval.domain.exception.BizException; import org.qinan.safetyeval.domain.exception.ErrorCode; @@ -71,7 +68,7 @@ public class SafetyMessageGatewayImpl implements SafetyMessageGateway { .eq(EvalProjectMemberDO::getProjectId, projectId) .eq(EvalProjectMemberDO::getPersonnelId, signerPersonnelId) .last("limit 1")); - fillMap.put("role", ProjectStageEnum.fromVals(evalProjectMemberDOS.get(0).getRole())); + fillMap.put("role", ProjectRoleEnum.fromVals(evalProjectMemberDOS.get(0).getRole())); } params.put(MsgConstant.MSG_CONTENT_KEY_CONTENT, NoticeTypeEnum.SIGN_TASK_NOTICE.fillTemplate(fillMap)); From e8e4b615531088457373638b66dc7fd10baaedc1 Mon Sep 17 00:00:00 2001 From: luotaiqian <1147642922@qq.com> Date: Mon, 3 Aug 2026 16:39:12 +0800 Subject: [PATCH 2/2] import --- .../utils/ComplianceCheckUtil.java | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) 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 0e8501b..8704bf0 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 @@ -17,9 +17,11 @@ import org.qinan.safetyeval.infrastructure.persistence.domainobject.IndustryProf import org.qinan.safetyeval.infrastructure.persistence.domainobject.OrgPersonnelLeaderCountDO; import org.qinan.safetyeval.infrastructure.persistence.mapper.IndustryProfessionalStandardsMapper; import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import static org.qinan.safetyeval.domain.exception.ErrorCode.PERSON_NOT_ENOUGH; @@ -355,15 +357,16 @@ public class ComplianceCheckUtil { // 按 industryCode 分组后循环调用 doIndustryProfessionalStandardsValid Map> standardsGroupByIndustry = standardsDOList.stream() .collect(Collectors.groupingBy(IndustryProfessionalStandardsDO::getIndustryCode)); - Map> personnelCoGroupByIndustry = personnelCoList.stream() - .collect(Collectors.groupingBy(IndustryProfessionalPersonCo::getIndustryCode)); - Map> personnelCertCoGroupByIndustry = personnelCertCoList.stream() - .collect(Collectors.groupingBy(OrgPersonnelCertCapabilityComplianceCheckCO::getBusinessScope)); + + List personnelCoCopyList = new ArrayList<>(personnelCoList); + + Map> personnelCertCoGroupByIndustry = + personnelCertCoList.stream().collect( + Collectors.groupingBy(OrgPersonnelCertCapabilityComplianceCheckCO::getBusinessScope)); StringJoiner failureMsg = new StringJoiner(";"); for (Map.Entry> entry : standardsGroupByIndustry.entrySet()) { - Pair result = doIndustryProfessionalStandardsValid( - entry.getValue(), personnelCoGroupByIndustry.getOrDefault(entry.getKey(), new ArrayList<>()) + Pair result = doIndustryProfessionalStandardsValid(entry.getValue(), personnelCoCopyList , personnelCertCoGroupByIndustry.getOrDefault(entry.getKey(), new ArrayList<>())); if (Boolean.FALSE.equals(result.getKey()) && result.getValue() != null) { failureMsg.add(result.getValue()); @@ -386,8 +389,11 @@ public class ComplianceCheckUtil { * @param certCapabilityList 人员证书专业能力信息(提供人员→专业能力映射) * @return Pair key 是否通过 ,value 失败消息(通过时为 null) */ - public static Pair doIndustryProfessionalStandardsValid(List standardsDOList - , List industryProfessionalPersonCos, List certCapabilityList) { + public static Pair doIndustryProfessionalStandardsValid( + List standardsDOList + , List industryProfessionalPersonCos + , List certCapabilityList) { + if (CollectionUtils.isEmpty(standardsDOList)) { return Pair.of(true, null); } @@ -398,19 +404,26 @@ public class ComplianceCheckUtil { } // 3. 构建人员→可担任专业能力code集合(同一人可能具备多个专业能力) - Map> personCapabilityMap = new HashMap<>(); - industryProfessionalPersonCos.forEach(p -> - personCapabilityMap.computeIfAbsent(p.getSourcePersonnelId(), k -> new HashSet<>()) - .add(p.getProfessionalCapabilityCode())); - certCapabilityList.forEach(c -> - personCapabilityMap.computeIfAbsent(c.getPersonnelId(), k -> new HashSet<>()) - .add(c.getProfessionalCapabilityCode())); + 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()); + + // 人员学科能力 + Set pdcSet = Arrays.stream(co.getProfessionalCapabilityCode().split(",")) + .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();