diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/OrgPersonnelMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/OrgPersonnelMapper.java index ae449ae..de1aba9 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/OrgPersonnelMapper.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/mapper/OrgPersonnelMapper.java @@ -2,8 +2,20 @@ package org.qinan.safetyeval.infrastructure.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.qinan.safetyeval.infrastructure.dataobject.OrgPersonnelDO; +import org.qinan.safetyeval.infrastructure.persistence.domainobject.OrgPersonnelLeaderCountDO; + +import java.util.List; @Mapper public interface OrgPersonnelMapper extends BaseMapper { + + /** + * 根据人员id列表统计技术负责人和过程控制负责人数量 + * + * @param ids 人员id列表(org_personnel.id) + * @return 负责人标志位统计结果 + */ + OrgPersonnelLeaderCountDO countLeaderFlags(@Param("ids") List ids); } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/OrgPersonnelLeaderCountDO.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/OrgPersonnelLeaderCountDO.java new file mode 100644 index 0000000..c7489ba --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/domainobject/OrgPersonnelLeaderCountDO.java @@ -0,0 +1,22 @@ +package org.qinan.safetyeval.infrastructure.persistence.domainobject; + +import lombok.Data; + +/** + * 人员负责人标志位统计结果 + * + * @author safety-eval + */ +@Data +public class OrgPersonnelLeaderCountDO { + + /** + * 技术负责人数量 + */ + private Integer technicalDirectorCount; + + /** + * 过程控制负责人数量 + */ + private Integer processControlLeaderCount; +} 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 d517a5b..2228a41 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,12 +1,15 @@ package org.qinan.safetyeval.infrastructure.utils; import cn.hutool.core.lang.Pair; +import cn.hutool.extra.spring.SpringUtil; 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.*; +import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelMapper; import org.qinan.safetyeval.infrastructure.persistence.domainobject.IndustryProfessionalStandardsDO; +import org.qinan.safetyeval.infrastructure.persistence.domainobject.OrgPersonnelLeaderCountDO; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; @@ -14,6 +17,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -51,9 +55,8 @@ public class ComplianceCheckUtil { // 6. 人员比例 results.add(checkPersonnelRatio(personnelList)); - // 7. 负责人配备(暂无法判断,标记警告) - results.add(buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, - QualFilingComplianceCheckEnum.STATUS_WARN, "技术负责人 2/2,过程控制负责人 1/1")); + // 7. 负责人配备 + results.add(checkKeyPosition(filing, personnelList)); // 8. 制度与过程控制体系(暂无法判断,标记警告) results.add(buildResult(QualFilingComplianceCheckEnum.MANAGEMENT_SYSTEM, @@ -148,6 +151,53 @@ public class ComplianceCheckUtil { currentValue); } + /** + * 负责人配备:根据 org_personnel 的技术负责人、过程控制负责人标志位统计实际配备人数。 + * 要求:每个业务范围至少配备1名技术负责人,另配1名过程控制负责人。 + */ + private QualFilingComplianceCheckResultCO checkKeyPosition(QualFilingAddCmd filing, + List personnelList) { + if (personnelList == null || personnelList.isEmpty()) { + return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, + QualFilingComplianceCheckEnum.STATUS_FAIL, "无人员数据"); + } + + // 提取所有来源人员id(对应 org_personnel.id) + List sourcePersonnelIds = personnelList.stream() + .map(QualFilingPersonnelAddCmd::getSourcePersonnelId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + if (sourcePersonnelIds.isEmpty()) { + return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, + QualFilingComplianceCheckEnum.STATUS_FAIL, "无来源人员id"); + } + + // 通过 SpringUtil 获取 OrgPersonnelMapper,统计负责人数量 + OrgPersonnelMapper orgPersonnelMapper = SpringUtil.getBean(OrgPersonnelMapper.class); + OrgPersonnelLeaderCountDO countDO = orgPersonnelMapper.countLeaderFlags(sourcePersonnelIds); + + int technicalDirectorCount = countDO != null && countDO.getTechnicalDirectorCount() != null + ? countDO.getTechnicalDirectorCount() : 0; + int processControlLeaderCount = countDO != null && countDO.getProcessControlLeaderCount() != null + ? countDO.getProcessControlLeaderCount() : 0; + + // 需求:每个业务范围配备1名技术负责人,另配1名过程控制负责人 + int requiredTechnicalDirector = filing.getBusinessScope() != null ? filing.getBusinessScope().size() : 1; + int requiredProcessControlLeader = requiredTechnicalDirector; + + boolean pass = technicalDirectorCount >= requiredTechnicalDirector + && processControlLeaderCount >= requiredProcessControlLeader; + + String currentValue = "技术负责人 " + technicalDirectorCount + "/" + requiredTechnicalDirector + + ",过程控制负责人 " + processControlLeaderCount + "/" + requiredProcessControlLeader; + + return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, + pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, + currentValue); + } + /** * 承诺书/网站/报告查询:是否存在承诺书数据且信息公开链接已填写 */ diff --git a/safety-eval-infrastructure/src/main/resources/mapper/OrgPersonnelMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/OrgPersonnelMapper.xml index ed03a10..4cfe1aa 100644 --- a/safety-eval-infrastructure/src/main/resources/mapper/OrgPersonnelMapper.xml +++ b/safety-eval-infrastructure/src/main/resources/mapper/OrgPersonnelMapper.xml @@ -41,4 +41,17 @@ `id`, `org_id`, `dept_id`, `post_id`, `user_name`, `account`, `gender_code`, `gender_name`, `birth_date`, `id_card_no`, `current_address`, `office_address`, `education_code`, `education_name`, `graduate_school`, `major`, `employment_status_code`, `employment_status_name`, `delete_enum`, `remarks`, `create_name`, `update_name`, `tenant_id`, `version`, `create_time`, `update_time`, `create_id`, `update_id`, `env` + + +