diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/orchestrator/QualFilingOrchestrator.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/orchestrator/QualFilingOrchestrator.java index d75ae09..6a7220d 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/orchestrator/QualFilingOrchestrator.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/orchestrator/QualFilingOrchestrator.java @@ -23,7 +23,6 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -815,17 +814,12 @@ public class QualFilingOrchestrator { * 人员数量与结构:专职技术人员 >= 25人,中级注安师 >= 30% */ private QualFilingComplianceCheckResultCO checkPersonnelCount(Long filingId) { - List personnelList = - qualFilingPersonnelGateway.listByFilingId(filingId); - int total = personnelList.size(); + int total = qualFilingPersonnelGateway.countByFilingId(filingId); if (total == 0) { return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT, QualFilingComplianceCheckEnum.STATUS_FAIL); } - long engineerCount = personnelList.stream() - .filter(p -> p.getRegisterEngineerFlag() != null - && p.getRegisterEngineerFlag() == 1) - .count(); + int engineerCount = qualFilingPersonnelGateway.countByFilingIdAndRegisterEngineerFlag(filingId, 1); boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER && engineerCount * 100 / total >= QualFilingComplianceCheckEnum.PERSONNEL_RATE; return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT, @@ -836,16 +830,13 @@ public class QualFilingOrchestrator { * 人员资历:所有专职技术人员在本行业领域工作二年以上 */ private QualFilingComplianceCheckResultCO checkPersonnelExperience(Long filingId) { - List personnelList = - qualFilingPersonnelGateway.listByFilingId(filingId); - if (personnelList.isEmpty()) { + int total = qualFilingPersonnelGateway.countByFilingId(filingId); + if (total == 0) { return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_EXPERIENCE, QualFilingComplianceCheckEnum.STATUS_FAIL); } - LocalDate now = LocalDate.now(); - boolean allQualified = personnelList.stream() - .allMatch(p -> p.getJoinWorkDate() != null - && ChronoUnit.YEARS.between(p.getJoinWorkDate(), now) >= 2); + LocalDate threshold = LocalDate.now().minusYears(2); + boolean allQualified = qualFilingPersonnelGateway.countByFilingIdAndJoinWorkDateAfter(filingId, threshold) == 0; return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_EXPERIENCE, allQualified ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL); } @@ -874,14 +865,12 @@ public class QualFilingOrchestrator { * 信用记录:qual_filing_material 表 upload_status_code=2 且 material_type=4 */ private QualFilingComplianceCheckResultCO checkCreditRecord(Long filingId) { - List materials = - qualFilingMaterialGateway.listByFilingId(filingId); - boolean pass = materials.stream() - .anyMatch(m -> m.getUploadStatusCode() != null - && m.getUploadStatusCode() == QualFilingMaterialUploadStatusEnum.UPLOADED.getCode() - && MaterialTypeEnum.NO_VIOLATION_RECORD.getCode() == m.getMaterialType()); + int count = qualFilingMaterialGateway.countByFilingIdAndUploadStatusCodeAndMaterialType( + filingId, + QualFilingMaterialUploadStatusEnum.UPLOADED.getCode(), + MaterialTypeEnum.NO_VIOLATION_RECORD.getCode()); return buildResult(QualFilingComplianceCheckEnum.CREDIT_RECORD, - pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL); + count > 0 ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL); } private QualFilingComplianceCheckResultCO buildResult(QualFilingComplianceCheckEnum item, String status) { diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/QualFilingMaterialGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/QualFilingMaterialGateway.java index a9dcfd0..48054d8 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/QualFilingMaterialGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/QualFilingMaterialGateway.java @@ -23,4 +23,9 @@ public interface QualFilingMaterialGateway { void delete(Long id); PageResult page(QualFilingMaterialQuery query); + + /** + * 统计指定备案下满足上传状态和材料类型的记录数 + */ + int countByFilingIdAndUploadStatusCodeAndMaterialType(Long filingId, Integer uploadStatusCode, Integer materialType); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/QualFilingPersonnelGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/QualFilingPersonnelGateway.java index dfe5569..08e72fd 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/QualFilingPersonnelGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/QualFilingPersonnelGateway.java @@ -3,6 +3,8 @@ package org.qinan.safetyeval.domain.gateway; import org.qinan.safetyeval.domain.entity.QualFilingPersonnelEntity; import org.qinan.safetyeval.domain.query.QualFilingPersonnelQuery; import org.qinan.safetyeval.domain.query.PageResult; + +import java.time.LocalDate; import java.util.List; /** @@ -23,4 +25,19 @@ public interface QualFilingPersonnelGateway { void delete(Long id); PageResult page(QualFilingPersonnelQuery query); + + /** + * 统计指定备案下的人员总数 + */ + int countByFilingId(Long filingId); + + /** + * 统计指定备案下注册工程师数量 + */ + int countByFilingIdAndRegisterEngineerFlag(Long filingId, Integer registerEngineerFlag); + + /** + * 统计指定备案下参加工作时间晚于指定日期的人数 + */ + int countByFilingIdAndJoinWorkDateAfter(Long filingId, LocalDate joinWorkDate); } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingMaterialGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingMaterialGatewayImpl.java index 2b74e73..59023e5 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingMaterialGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingMaterialGatewayImpl.java @@ -86,6 +86,16 @@ public class QualFilingMaterialGatewayImpl implements QualFilingMaterialGateway return PageResult.of(entities, result.getTotal(), result.getCurrent(), result.getSize()); } + @Override + public int countByFilingIdAndUploadStatusCodeAndMaterialType(Long filingId, Integer uploadStatusCode, Integer materialType) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(QualFilingMaterialDO::getFilingId, filingId); + wrapper.eq(QualFilingMaterialDO::getDeleteEnum, "false"); + wrapper.eq(QualFilingMaterialDO::getUploadStatusCode, uploadStatusCode); + wrapper.eq(QualFilingMaterialDO::getMaterialType, materialType); + return qualFilingMaterialMapper.selectCount(wrapper).intValue(); + } + private QualFilingMaterialDO toDO(QualFilingMaterialEntity entity) { QualFilingMaterialDO dataObject = new QualFilingMaterialDO(); dataObject.setFilingId(entity.getFilingId()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingPersonnelGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingPersonnelGatewayImpl.java index 3410460..72e07b7 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingPersonnelGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/QualFilingPersonnelGatewayImpl.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; @@ -86,6 +87,32 @@ public class QualFilingPersonnelGatewayImpl implements QualFilingPersonnelGatewa return PageResult.of(entities, result.getTotal(), result.getCurrent(), result.getSize()); } + @Override + public int countByFilingId(Long filingId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(QualFilingPersonnelDO::getFilingId, filingId); + wrapper.eq(QualFilingPersonnelDO::getDeleteEnum, "false"); + return qualFilingPersonnelMapper.selectCount(wrapper).intValue(); + } + + @Override + public int countByFilingIdAndRegisterEngineerFlag(Long filingId, Integer registerEngineerFlag) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(QualFilingPersonnelDO::getFilingId, filingId); + wrapper.eq(QualFilingPersonnelDO::getDeleteEnum, "false"); + wrapper.eq(QualFilingPersonnelDO::getRegisterEngineerFlag, registerEngineerFlag); + return qualFilingPersonnelMapper.selectCount(wrapper).intValue(); + } + + @Override + public int countByFilingIdAndJoinWorkDateAfter(Long filingId, LocalDate joinWorkDate) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(QualFilingPersonnelDO::getFilingId, filingId); + wrapper.eq(QualFilingPersonnelDO::getDeleteEnum, "false"); + wrapper.gt(QualFilingPersonnelDO::getJoinWorkDate, joinWorkDate); + return qualFilingPersonnelMapper.selectCount(wrapper).intValue(); + } + private QualFilingPersonnelDO toDO(QualFilingPersonnelEntity entity) { QualFilingPersonnelDO dataObject = new QualFilingPersonnelDO(); dataObject.setFilingId(entity.getFilingId());