diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/QualFilingChangeOrgCO.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/QualFilingChangeOrgCO.java index 60ec84f..083b840 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/QualFilingChangeOrgCO.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/co/QualFilingChangeOrgCO.java @@ -6,6 +6,7 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; +import java.util.List; /** * 备案变更机构端CO(Client Object) @@ -61,7 +62,7 @@ public class QualFilingChangeOrgCO { private String filingNo; @ApiModelProperty(value = "经营范围") - private String businessScope; + private List businessScope; @ApiModelProperty(value = "注册地址") private String registerAddress; diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/QualFilingPersonnelCoConvertor.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/QualFilingPersonnelCoConvertor.java new file mode 100644 index 0000000..933c51a --- /dev/null +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/convertor/QualFilingPersonnelCoConvertor.java @@ -0,0 +1,24 @@ +package org.qinan.safetyeval.infrastructure.convertor; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.qinan.safetyeval.client.co.IndustryProfessionalPersonCo; +import org.qinan.safetyeval.client.dto.QualFilingPersonnelAddCmd; + +import java.util.List; + +/** + * 备案申请人员对象转行业专业能力人员CO + * + * @Author: ltq + * @date 2026-07-15 10:00:00 + */ +@Mapper(componentModel = "spring") +public interface QualFilingPersonnelCoConvertor { + + @Mapping(target = "industryCode", source = "qualScope") + @Mapping(target = "personNum", constant = "1L") + IndustryProfessionalPersonCo convertCmdToCo(QualFilingPersonnelAddCmd qualFilingPersonnelAddCmd); + + List convertCmdsToCos(List qualFilingPersonnelAddCmds); +} 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 2c786b9..6604964 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 @@ -2,27 +2,28 @@ package org.qinan.safetyeval.infrastructure.utils; import cn.hutool.core.lang.Pair; import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; 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.convertor.QualFilingPersonnelCoConvertor; 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.qinan.safetyeval.infrastructure.persistence.mapper.IndustryProfessionalStandardsMapper; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** * 资质备案合规检查工具类 */ +@Slf4j @UtilityClass public class ComplianceCheckUtil { @@ -53,7 +54,7 @@ public class ComplianceCheckUtil { results.add(checkPersonnelCount(filing, personnelList)); // 6. 人员比例 - results.add(checkPersonnelRatio(personnelList)); + results.add(checkPersonnelRatio(filing.getBusinessScope(), personnelList)); // 7. 负责人配备 results.add(checkKeyPosition(filing, personnelList)); @@ -127,7 +128,8 @@ public class ComplianceCheckUtil { /** * 人员比例:中级注安师 >= 30%,高级职称 >= 30%,合计 >= 60% */ - private QualFilingComplianceCheckResultCO checkPersonnelRatio(List personnelList) { + private QualFilingComplianceCheckResultCO checkPersonnelRatio(List businessScope + , List personnelList) { if (personnelList == null || personnelList.isEmpty()) { return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_RATIO, QualFilingComplianceCheckEnum.STATUS_FAIL, "无人员数据"); @@ -147,7 +149,10 @@ public class ComplianceCheckUtil { && sumRate >= 60; String currentValue = "注册安全工程师 " + engineerRate + "%,高级职称 " + seniorTitleRate + "%,合计 " + sumRate + "%"; - // TODO 是否需要校验 @{org.qinan.safetyeval.infrastructure.utils.ComplianceCheckUtil.industryProfessionalStandardsValid} + + List industryProfessionalPersonCos = SpringUtil.getBean(QualFilingPersonnelCoConvertor.class) + .convertCmdsToCos(personnelList); + industryProfessionalStandardsValid(businessScope, industryProfessionalPersonCos); return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_RATIO, pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, @@ -252,6 +257,43 @@ public class ComplianceCheckUtil { return co; } + /** + * industryProfessionalStandardsValid + * + * @param industryCodeList industryCodeList + * @param industryProfessionalPersonCos industryProfessionalPersonCos + * @return Pair key 是否通过 ,value 失败消息(通过时为 null) + */ + public static Pair industryProfessionalStandardsValid(List industryCodeList + , List industryProfessionalPersonCos) { + if (CollectionUtils.isEmpty(industryCodeList)) { + return Pair.of(false, "没有业务范围"); + } + // 通过 SpringUtil 获取 Mapper,根据 industryCodeList 查询专业能力配备标准 + IndustryProfessionalStandardsMapper mapper = SpringUtil.getBean(IndustryProfessionalStandardsMapper.class); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(IndustryProfessionalStandardsDO::getIndustryCode, industryCodeList) + .eq(IndustryProfessionalStandardsDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue()); + List standardsDOList = mapper.selectList(queryWrapper); + + if (CollectionUtils.isEmpty(standardsDOList)) { + log.warn("没有配置标准"); + return Pair.of(true, null); + } + + // 按 industryCode 分组后循环调用 doIndustryProfessionalStandardsValid + Map> standardsGroupByIndustry = standardsDOList.stream() + .collect(Collectors.groupingBy(IndustryProfessionalStandardsDO::getIndustryCode)); + + StringJoiner failureMsg = new StringJoiner(";"); + for (Map.Entry> entry : standardsGroupByIndustry.entrySet()) { + Pair result = doIndustryProfessionalStandardsValid(entry.getValue(), industryProfessionalPersonCos); + if (Boolean.FALSE.equals(result.getKey()) && result.getValue() != null) { + failureMsg.add(result.getValue()); + } + } + return failureMsg.length() > 1 ? Pair.of(false, failureMsg.toString()) : Pair.of(true, null); + } /** * 行业专业能力人员要求校验 @@ -260,7 +302,7 @@ public class ComplianceCheckUtil { * @param industryProfessionalPersonCos 当前实际人员数(按 行业code + 专业能力code 分类汇总) * @return Pair key 是否通过 ,value 失败消息(通过时为 null) */ - public static Pair industryProfessionalStandardsValid(List standardsDOList + public static Pair doIndustryProfessionalStandardsValid(List standardsDOList , List industryProfessionalPersonCos) { if (CollectionUtils.isEmpty(standardsDOList)) { return Pair.of(true, null); diff --git a/safety-eval-infrastructure/src/main/resources/mapper/QualFilingChangeMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/QualFilingChangeMapper.xml index 1f85f00..e59620b 100644 --- a/safety-eval-infrastructure/src/main/resources/mapper/QualFilingChangeMapper.xml +++ b/safety-eval-infrastructure/src/main/resources/mapper/QualFilingChangeMapper.xml @@ -68,7 +68,8 @@ - +