dev
luotaiqian 2026-07-14 14:07:52 +08:00
parent 36bdc1749b
commit 1b79f396e9
11 changed files with 397 additions and 290 deletions

View File

@ -6,7 +6,7 @@ import io.swagger.annotations.ApiParam;
import org.qinan.safetyeval.client.api.QualFilingChangeApi;
import org.qinan.safetyeval.client.co.QualFilingChangeAggregationCO;
import org.qinan.safetyeval.client.co.QualFilingChangeCO;
import org.qinan.safetyeval.client.co.QualFilingChangeComplianceCheckResultCO;
import org.qinan.safetyeval.client.co.QualFilingComplianceCheckResultCO;
import org.qinan.safetyeval.client.co.QualFilingChangeOrgCO;
import org.qinan.safetyeval.client.dto.*;
import org.qinan.safetyeval.domain.constant.QualFilingStatusEnum;
@ -70,7 +70,7 @@ public class QualFilingChangeController {
@ApiOperation("合规检查")
@GetMapping("/compliance-check")
public SingleResponse<List<QualFilingChangeComplianceCheckResultCO>> complianceCheck(@ApiParam("主键ID") @RequestParam Long id) {
public SingleResponse<List<QualFilingComplianceCheckResultCO>> complianceCheck(@ApiParam("主键ID") @RequestParam Long id) {
return qualFilingChangeApi.complianceCheck(id);
}

View File

@ -5,6 +5,7 @@ import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.qinan.safetyeval.client.co.QualFilingChangeAggregationCO;
import org.qinan.safetyeval.client.dto.QualFilingAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingChangeAddCmd;
import org.qinan.safetyeval.domain.entity.QualFilingChangeEntity;
import org.qinan.safetyeval.domain.entity.QualFilingEntity;
@ -58,4 +59,21 @@ public interface QualFilingChangeCmdConvertor {
default List<String> jsonStringToList(String json) {
return json == null || json.isEmpty() ? null : JSON.parseArray(json, String.class);
}
/**
* CmdCmd
*/
@Mapping(target = "filingReviewId", ignore = true)
@Mapping(target = "applyTypeCode", ignore = true)
@Mapping(target = "applyTypeName", ignore = true)
QualFilingAddCmd convertChangeCmdToFilingCmd(QualFilingChangeAddCmd qualFilingChangeAddCmd);
/**
* Cmd
*/
@Mapping(target = "businessScope", source = "businessScope", qualifiedByName = "jsonStringToList")
@Mapping(target = "filingReviewId", ignore = true)
@Mapping(target = "applyTypeCode", ignore = true)
@Mapping(target = "applyTypeName", ignore = true)
QualFilingAddCmd convertChangeEToFilingCmd(QualFilingChangeEntity changeEntity);
}

View File

@ -5,9 +5,13 @@ import org.mapstruct.Mapping;
import org.qinan.safetyeval.client.change.request.QualFilingCommitmentChangeAddCmd;
import org.qinan.safetyeval.client.change.request.QualFilingCommitmentChangeUpdateCmd;
import org.qinan.safetyeval.client.co.QualFilingCommitmentCO;
import org.qinan.safetyeval.client.dto.QualFilingCommitmentAddCmd;
import org.qinan.safetyeval.domain.change.model.QualFilingCommitmentChangeE;
import org.qinan.safetyeval.domain.entity.QualFilingCommitmentEntity;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* -
*
@ -48,4 +52,18 @@ public interface QualFilingCommitmentChangeCmdConvertor {
*/
@Mapping(source = "filingChangeId", target = "filingId")
QualFilingCommitmentCO convertChangeEToCO(QualFilingCommitmentChangeE changeE);
/**
* CmdCmd
*/
QualFilingCommitmentAddCmd convertChangeCmdToCmd(QualFilingCommitmentChangeAddCmd changeAddCmd);
/**
* Cmd
*/
QualFilingCommitmentAddCmd convertChangeEToCmd(QualFilingCommitmentChangeE changeE);
default LocalDate map(LocalDateTime dateTime) {
return dateTime == null ? null : dateTime.toLocalDate();
}
}

View File

@ -5,6 +5,7 @@ import org.mapstruct.Mapping;
import org.qinan.safetyeval.client.change.request.QualFilingMaterialChangeAddCmd;
import org.qinan.safetyeval.client.change.request.QualFilingMaterialChangeUpdateCmd;
import org.qinan.safetyeval.client.co.QualFilingMaterialCO;
import org.qinan.safetyeval.client.dto.QualFilingMaterialAddCmd;
import org.qinan.safetyeval.domain.change.model.QualFilingMaterialChangeE;
import org.qinan.safetyeval.domain.entity.QualFilingMaterialEntity;
@ -59,4 +60,24 @@ public interface QualFilingMaterialChangeCmdConvertor {
* CO
*/
List<QualFilingMaterialCO> convertChangeEListToCOList(List<QualFilingMaterialChangeE> changeEs);
/**
* CmdCmd
*/
QualFilingMaterialAddCmd convertChangeCmdToCmd(QualFilingMaterialChangeAddCmd changeAddCmd);
/**
* CmdCmd
*/
List<QualFilingMaterialAddCmd> convertChangeCmdListToCmdList(List<QualFilingMaterialChangeAddCmd> changeAddCmds);
/**
* Cmd
*/
QualFilingMaterialAddCmd convertChangeEToCmd(QualFilingMaterialChangeE changeE);
/**
* Cmd
*/
List<QualFilingMaterialAddCmd> convertChangeEListToCmdList(List<QualFilingMaterialChangeE> changeEs);
}

View File

@ -5,9 +5,12 @@ import org.mapstruct.Mapping;
import org.qinan.safetyeval.client.change.request.QualFilingPersonnelChangeAddCmd;
import org.qinan.safetyeval.client.change.request.QualFilingPersonnelChangeUpdateCmd;
import org.qinan.safetyeval.client.co.QualFilingPersonnelCO;
import org.qinan.safetyeval.client.dto.QualFilingPersonnelAddCmd;
import org.qinan.safetyeval.domain.change.model.QualFilingPersonnelChangeE;
import org.qinan.safetyeval.domain.entity.QualFilingPersonnelEntity;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
@ -60,4 +63,28 @@ public interface QualFilingPersonnelChangeCmdConvertor {
* CO
*/
List<QualFilingPersonnelCO> convertChangeEListToCOList(List<QualFilingPersonnelChangeE> changeEs);
/**
* CmdCmd
*/
QualFilingPersonnelAddCmd convertChangeCmdToCmd(QualFilingPersonnelChangeAddCmd changeAddCmd);
/**
* CmdCmd
*/
List<QualFilingPersonnelAddCmd> convertChangeCmdListToCmdList(List<QualFilingPersonnelChangeAddCmd> changeAddCmds);
/**
* Cmd
*/
QualFilingPersonnelAddCmd convertChangeEToCmd(QualFilingPersonnelChangeE changeE);
/**
* Cmd
*/
List<QualFilingPersonnelAddCmd> convertChangeEListToCmdList(List<QualFilingPersonnelChangeE> changeEs);
default LocalDate map(LocalDateTime dateTime) {
return dateTime == null ? null : dateTime.toLocalDate();
}
}

View File

@ -0,0 +1,41 @@
package org.qinan.safetyeval.app.convertor;
import com.alibaba.fastjson.JSON;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
import org.qinan.safetyeval.client.dto.QualFilingAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingCommitmentAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingMaterialAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingPersonnelAddCmd;
import org.qinan.safetyeval.domain.entity.QualFilingCommitmentEntity;
import org.qinan.safetyeval.domain.entity.QualFilingEntity;
import org.qinan.safetyeval.domain.entity.QualFilingMaterialEntity;
import org.qinan.safetyeval.domain.entity.QualFilingPersonnelEntity;
import java.util.List;
/**
* Cmd
*/
@Mapper(componentModel = "spring")
public interface QualFilingCmdConvertor {
@Mapping(target = "businessScope", source = "businessScope", qualifiedByName = "jsonStringToList")
QualFilingAddCmd convertEntityToCmd(QualFilingEntity entity);
QualFilingCommitmentAddCmd convertEntityToCmd(QualFilingCommitmentEntity entity);
QualFilingPersonnelAddCmd convertEntityToCmd(QualFilingPersonnelEntity entity);
List<QualFilingPersonnelAddCmd> convertEntityListPersonToCmdList(List<QualFilingPersonnelEntity> entities);
QualFilingMaterialAddCmd convertEntityToCmd(QualFilingMaterialEntity entity);
List<QualFilingMaterialAddCmd> convertEntityListToCmdList(List<QualFilingMaterialEntity> entities);
@Named("jsonStringToList")
default List<String> jsonStringToList(String json) {
return json == null || json.isEmpty() ? null : JSON.parseArray(json, String.class);
}
}

View File

@ -27,6 +27,7 @@ import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter;
import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter;
import org.qinan.safetyeval.infrastructure.dataobject.QualFilingChangeCountDO;
import org.qinan.safetyeval.infrastructure.mapper.QualFilingChangeMapper;
import org.qinan.safetyeval.infrastructure.utils.ComplianceCheckUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
@ -247,7 +248,7 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
}
@Override
public SingleResponse<List<QualFilingChangeComplianceCheckResultCO>> complianceCheck(Long id) {
public SingleResponse<List<QualFilingComplianceCheckResultCO>> complianceCheck(Long id) {
return SingleResponse.success(qualFilingOrchestrator.complianceCheckChange(id));
}
@ -256,6 +257,20 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
public SingleResponse<QualFilingChangeCO> aggregationSaveOrEdit(AggregationSaveOrEditQualFilingChangeCmd cmd) {
validateBeforeSaveOrEdit(cmd);
// 合规性校验:只要有一项未通过则抛出异常
if (reviewEnable) {
AggregationSaveOrEditQualFilingCmd qualFilingCmd = convertToQualFilingCmd(cmd);
List<QualFilingComplianceCheckResultCO> complianceResults = ComplianceCheckUtil.complianceCheck(qualFilingCmd);
List<String> failedItems = complianceResults.stream()
.filter(r -> QualFilingComplianceCheckEnum.STATUS_FAIL.equals(r.getStatus()))
.map(QualFilingComplianceCheckResultCO::getTitle)
.collect(Collectors.toList());
if (!failedItems.isEmpty()) {
throw new BizException(ErrorCode.QUAL_FILING_COMPLIANCE_CHECK_FAIL,
"合规性校验未通过:" + String.join("、", failedItems));
}
}
// 变更基本信息
QualFilingChangeEntity entity = qualFilingChangeCmdConvertor.convertCmdToE(cmd.getQualFilingChangeAddCmd());
entity.setOrgId(ThreadLocalUserInfoAdapter.getOrgId() == null ? entity.getOrgId() : ThreadLocalUserInfoAdapter.getOrgId());
@ -309,19 +324,6 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
Long id = qualFilingChangeDomainService.aggregationSaveOrEdit(entity, commitmentEntity
, equipmentEntities, materialEntities, personnelEntities, personnelCertEntities);
// 合规性校验:只要有一项未通过则抛出异常
if (reviewEnable) {
List<QualFilingChangeComplianceCheckResultCO> complianceResults = qualFilingOrchestrator.complianceCheckChange(id);
List<String> failedItems = complianceResults.stream()
.filter(r -> QualFilingComplianceCheckEnum.STATUS_FAIL.equals(r.getStatus()))
.map(QualFilingChangeComplianceCheckResultCO::getTitle)
.collect(Collectors.toList());
if (!failedItems.isEmpty()) {
throw new BizException(ErrorCode.QUAL_FILING_COMPLIANCE_CHECK_FAIL,
"合规性校验未通过:" + String.join("、", failedItems));
}
}
QualFilingChangeCO co = new QualFilingChangeCO();
co.setId(id);
return SingleResponse.success(co);
@ -378,22 +380,22 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
// 查询并转换装备清单
List<QualFilingEquipmentChangeE> equipmentChangeEs = qualFilingEquipmentChangeGateway.listByFilingId(changeFilingId);
List<QualFilingEquipmentEntity> equipmentEntities = qualFilingEquipmentChangeCmdConvertor.convertChangeEListToEntityList(equipmentChangeEs);
equipmentEntities.forEach(e -> e.setFilingId(changeEntity.getChangeFilingId()));
equipmentEntities.forEach(e -> e.setFilingId(changeEntity.getFilingId()));
// 查询并转换材料清单
List<QualFilingMaterialChangeE> materialChangeEs = qualFilingMaterialChangeGateway.listByFilingId(changeFilingId);
List<QualFilingMaterialEntity> materialEntities = qualFilingMaterialChangeCmdConvertor.convertChangeEListToEntityList(materialChangeEs);
materialEntities.forEach(e -> e.setFilingId(changeEntity.getChangeFilingId()));
materialEntities.forEach(e -> e.setFilingId(changeEntity.getFilingId()));
// 查询并转换人员
List<QualFilingPersonnelChangeE> personnelChangeEs = qualFilingPersonnelChangeGateway.listByFilingId(changeFilingId);
List<QualFilingPersonnelEntity> personnelEntities = qualFilingPersonnelChangeCmdConvertor.convertChangeEListToEntityList(personnelChangeEs);
personnelEntities.forEach(e -> e.setFilingId(changeEntity.getChangeFilingId()));
personnelEntities.forEach(e -> e.setFilingId(changeEntity.getFilingId()));
// 查询并转换人员证书
List<QualFilingPersonnelCertChangeE> personnelCertChangeEs = qualFilingPersonnelCertChangeGateway.listByFilingId(changeFilingId);
List<QualFilingPersonnelCertEntity> personnelCertEntities = qualFilingPersonnelCertChangeCmdConvertor.convertChangeEListToEntityList(personnelCertChangeEs);
personnelCertEntities.forEach(e -> e.setFilingId(changeEntity.getChangeFilingId()));
personnelCertEntities.forEach(e -> e.setFilingId(changeEntity.getFilingId()));
// 调用聚合保存,将变更数据写入正式备案表
qualFilingDomainService.aggregationSaveOrEdit(entity, commitmentEntity, equipmentEntities, materialEntities, personnelEntities, personnelCertEntities);
@ -451,6 +453,36 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
return SingleResponse.success(detail);
}
/**
* CmdCmd
*/
private AggregationSaveOrEditQualFilingCmd convertToQualFilingCmd(AggregationSaveOrEditQualFilingChangeCmd changeCmd) {
AggregationSaveOrEditQualFilingCmd cmd = new AggregationSaveOrEditQualFilingCmd();
// 基本信息
cmd.setQualFilingAddCmd(qualFilingChangeCmdConvertor.convertChangeCmdToFilingCmd(changeCmd.getQualFilingChangeAddCmd()));
// 承诺书
if (changeCmd.getQualFilingCommitmentChangeAddCmd() != null) {
cmd.setQualFilingCommitmentAddCmd(
qualFilingCommitmentChangeCmdConvertor.convertChangeCmdToCmd(changeCmd.getQualFilingCommitmentChangeAddCmd()));
}
// 人员
if (!CollectionUtils.isEmpty(changeCmd.getQualFilingPersonnelChangeAddCmds())) {
cmd.setQualFilingPersonnelAddCmds(
qualFilingPersonnelChangeCmdConvertor.convertChangeCmdListToCmdList(changeCmd.getQualFilingPersonnelChangeAddCmds()));
}
// 材料清单
if (!CollectionUtils.isEmpty(changeCmd.getQualFilingMaterialChangeAddCmds())) {
cmd.setQualFilingMaterialAddCmds(
qualFilingMaterialChangeCmdConvertor.convertChangeCmdListToCmdList(changeCmd.getQualFilingMaterialChangeAddCmds()));
}
return cmd;
}
/**
*
* <ul>

View File

@ -4,9 +4,19 @@ import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.alibaba.fastjson.JSON;
import org.qinan.safetyeval.app.support.*;
import org.qinan.safetyeval.app.change.convertor.QualFilingChangeCmdConvertor;
import org.qinan.safetyeval.app.change.convertor.QualFilingCommitmentChangeCmdConvertor;
import org.qinan.safetyeval.app.change.convertor.QualFilingMaterialChangeCmdConvertor;
import org.qinan.safetyeval.app.change.convertor.QualFilingPersonnelChangeCmdConvertor;
import org.qinan.safetyeval.app.convertor.QualFilingCmdConvertor;
import org.qinan.safetyeval.client.co.*;
import org.qinan.safetyeval.client.dto.AggregationSaveOrEditQualFilingCmd;
import org.qinan.safetyeval.client.dto.QualFilingAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingCommitmentAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingMaterialAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingModifyCmd;
import org.qinan.safetyeval.client.dto.QualFilingPageQuery;
import org.qinan.safetyeval.client.dto.QualFilingPersonnelAddCmd;
import org.qinan.safetyeval.client.dto.QualificationMonitoringQuery;
import org.qinan.safetyeval.domain.change.gateway.QualFilingCommitmentChangeGateway;
import org.qinan.safetyeval.domain.change.gateway.QualFilingMaterialChangeGateway;
@ -23,6 +33,7 @@ import org.qinan.safetyeval.domain.support.QualFilingExpertCheckSupport;
import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter;
import org.qinan.safetyeval.infrastructure.mapper.QualFilingMapper;
import org.qinan.safetyeval.infrastructure.support.OrgContextResolver;
import org.qinan.safetyeval.infrastructure.utils.ComplianceCheckUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@ -112,6 +123,17 @@ public class QualFilingOrchestrator {
@Value("${safety-eval.public-api.tenant-id:0}")
private Long fallbackTenantId;
@Resource
private QualFilingChangeCmdConvertor qualFilingChangeCmdConvertor;
@Resource
private QualFilingCommitmentChangeCmdConvertor qualFilingCommitmentChangeCmdConvertor;
@Resource
private QualFilingPersonnelChangeCmdConvertor qualFilingPersonnelChangeCmdConvertor;
@Resource
private QualFilingMaterialChangeCmdConvertor qualFilingMaterialChangeCmdConvertor;
@Resource
private QualFilingCmdConvertor qualFilingCmdConvertor;
@Transactional
public QualFilingCO createDraft(Integer applyTypeCode) {
QualFilingApplyTypeEnum applyType = QualFilingApplyTypeEnum.ofCode(applyTypeCode);
@ -821,274 +843,61 @@ public class QualFilingOrchestrator {
throw new BizException(ErrorCode.QUAL_FILING_NOT_FOUND);
}
List<QualFilingComplianceCheckResultCO> results = new ArrayList<>();
AggregationSaveOrEditQualFilingCmd cmd = new AggregationSaveOrEditQualFilingCmd();
// 1. 主体资格
results.add(checkMainQualification(filing));
// 基本信息
cmd.setQualFilingAddCmd(qualFilingCmdConvertor.convertEntityToCmd(filing));
// 2. 场所与设备
results.add(checkWorkplace(filing));
// 3. 人员数量与结构
results.add(checkPersonnelCount(id));
// 4. 人员资历
results.add(checkPersonnelExperience(id));
// 5. 关键岗位要求(暂默认通过,标记警告)
results.add(buildResult(QualFilingComplianceCheckEnum.KEY_POSITION,
QualFilingComplianceCheckEnum.STATUS_WARN));
// 6. 管理体系(暂无法判断,标记警告)
results.add(buildResult(QualFilingComplianceCheckEnum.MANAGEMENT_SYSTEM,
QualFilingComplianceCheckEnum.STATUS_WARN));
// 7. 责任承诺
results.add(checkCommitment(id));
// 8. 信息公开
results.add(checkInfoDisclosure(filing));
// 9. 信用记录
results.add(checkCreditRecord(id));
// 10. 其他
results.add(buildResult(QualFilingComplianceCheckEnum.OTHER,
QualFilingComplianceCheckEnum.STATUS_PASS));
return results;
// 备案承诺书
QualFilingCommitmentEntity commitment = qualFilingCommitmentGateway.getByFilingId(id);
if (commitment != null) {
cmd.setQualFilingCommitmentAddCmd(qualFilingCmdConvertor.convertEntityToCmd(commitment));
}
/**
* >= 1000
*/
private QualFilingComplianceCheckResultCO checkMainQualification(QualFilingEntity filing) {
// 1000万元 = 10,000,000元 = 1,000,000,000分
boolean pass = filing.getFixedAssetAmount() != null
&& filing.getFixedAssetAmount() >= 800L;
return buildResult(QualFilingComplianceCheckEnum.MAIN_QUALIFICATION,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
// 备案人员
cmd.setQualFilingPersonnelAddCmds(
qualFilingCmdConvertor.convertEntityListPersonToCmdList(qualFilingPersonnelGateway.listByFilingId(id)));
/**
* >= 1000
*/
private QualFilingComplianceCheckResultCO checkWorkplace(QualFilingEntity filing) {
boolean pass = filing.getWorkplaceArea() != null
&& filing.getWorkplaceArea()
.compareTo(new BigDecimal(QualFilingComplianceCheckEnum.WORKPLACE_LOWER)) >= 0;
return buildResult(QualFilingComplianceCheckEnum.WORKPLACE,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
// 备案材料清单
cmd.setQualFilingMaterialAddCmds(
qualFilingCmdConvertor.convertEntityListToCmdList(qualFilingMaterialGateway.listByFilingId(id)));
/**
* >= 25 >= 30%
*/
private QualFilingComplianceCheckResultCO checkPersonnelCount(Long filingId) {
int total = qualFilingPersonnelGateway.countByFilingId(filingId);
if (total == 0) {
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
QualFilingComplianceCheckEnum.STATUS_FAIL);
}
int engineerCount = qualFilingPersonnelGateway.countByFilingIdAndRegisterEngineerFlag(filingId, 1);
boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER
&& engineerCount * 100 / total >= QualFilingComplianceCheckEnum.PERSONNEL_RATE;
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
*
*/
private QualFilingComplianceCheckResultCO checkPersonnelExperience(Long filingId) {
int total = qualFilingPersonnelGateway.countByFilingId(filingId);
if (total == 0) {
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_EXPERIENCE,
QualFilingComplianceCheckEnum.STATUS_FAIL);
}
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);
}
/**
* qual_filing_commitment
*/
private QualFilingComplianceCheckResultCO checkCommitment(Long filingId) {
QualFilingCommitmentEntity commitment =
qualFilingCommitmentGateway.getByFilingId(filingId);
return buildResult(QualFilingComplianceCheckEnum.COMMITMENT,
commitment != null ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* info_disclosure_url
*/
private QualFilingComplianceCheckResultCO checkInfoDisclosure(QualFilingEntity filing) {
boolean pass = filing.getInfoDisclosureUrl() != null
&& !filing.getInfoDisclosureUrl().isEmpty();
return buildResult(QualFilingComplianceCheckEnum.INFO_DISCLOSURE,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* qual_filing_material upload_status_code=2 material_type=4
*/
private QualFilingComplianceCheckResultCO checkCreditRecord(Long filingId) {
int count = qualFilingMaterialGateway.countByFilingIdAndUploadStatusCodeAndMaterialType(
filingId,
QualFilingMaterialUploadStatusEnum.UPLOADED.getCode(),
MaterialTypeEnum.NO_VIOLATION_RECORD.getCode());
return buildResult(QualFilingComplianceCheckEnum.CREDIT_RECORD,
count > 0 ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
private QualFilingComplianceCheckResultCO buildResult(QualFilingComplianceCheckEnum item, String status) {
QualFilingComplianceCheckResultCO co = new QualFilingComplianceCheckResultCO();
co.setTitle(item.getTitle());
co.setDescription(item.getDescription());
co.setStatus(status);
return co;
return ComplianceCheckUtil.complianceCheck(cmd);
}
/**
* ID
*/
public List<QualFilingChangeComplianceCheckResultCO> complianceCheckChange(Long changeId) {
public List<QualFilingComplianceCheckResultCO> complianceCheckChange(Long changeId) {
QualFilingChangeEntity change = qualFilingChangeGateway.get(changeId);
if (change == null) {
throw new BizException(ErrorCode.QUAL_FILING_NOT_FOUND);
}
List<QualFilingChangeComplianceCheckResultCO> results = new ArrayList<>();
// 查询变更数据转换为备案聚合Cmd后复用ComplianceCheckUtil
AggregationSaveOrEditQualFilingCmd qualFilingCmd = new AggregationSaveOrEditQualFilingCmd();
// 1. 主体资格
results.add(checkMainQualificationChange(change));
// 基本信息
qualFilingCmd.setQualFilingAddCmd(qualFilingChangeCmdConvertor.convertChangeEToFilingCmd(change));
// 2. 场所与设备
results.add(checkWorkplaceChange(change));
// 3. 人员数量与结构
results.add(checkPersonnelCountChange(changeId));
// 4. 人员资历
results.add(checkPersonnelExperienceChange(changeId));
// 5. 关键岗位要求(暂默认通过,标记警告)
results.add(buildChangeResult(QualFilingComplianceCheckEnum.KEY_POSITION,
QualFilingComplianceCheckEnum.STATUS_WARN));
// 6. 管理体系(暂无法判断,标记警告)
results.add(buildChangeResult(QualFilingComplianceCheckEnum.MANAGEMENT_SYSTEM,
QualFilingComplianceCheckEnum.STATUS_WARN));
// 7. 责任承诺
results.add(checkCommitmentChange(changeId));
// 8. 信息公开
results.add(checkInfoDisclosureChange(change));
// 9. 信用记录
results.add(checkCreditRecordChange(changeId));
// 10. 其他
results.add(buildChangeResult(QualFilingComplianceCheckEnum.OTHER,
QualFilingComplianceCheckEnum.STATUS_PASS));
return results;
// 承诺书
QualFilingCommitmentChangeE commitmentChange = qualFilingCommitmentChangeGateway.getByFilingId(changeId);
if (commitmentChange != null) {
qualFilingCmd.setQualFilingCommitmentAddCmd(
qualFilingCommitmentChangeCmdConvertor.convertChangeEToCmd(commitmentChange));
}
/**
* >= 1000
*/
private QualFilingChangeComplianceCheckResultCO checkMainQualificationChange(QualFilingChangeEntity change) {
boolean pass = change.getFixedAssetAmount() != null
&& change.getFixedAssetAmount() >= 800L;
return buildChangeResult(QualFilingComplianceCheckEnum.MAIN_QUALIFICATION,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
// 人员
qualFilingCmd.setQualFilingPersonnelAddCmds(
qualFilingPersonnelChangeCmdConvertor.convertChangeEListToCmdList(
qualFilingPersonnelChangeGateway.listByFilingId(changeId)));
/**
* >= 1000
*/
private QualFilingChangeComplianceCheckResultCO checkWorkplaceChange(QualFilingChangeEntity change) {
boolean pass = change.getWorkplaceArea() != null
&& change.getWorkplaceArea()
.compareTo(new BigDecimal(QualFilingComplianceCheckEnum.WORKPLACE_LOWER)) >= 0;
return buildChangeResult(QualFilingComplianceCheckEnum.WORKPLACE,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
// 材料清单
qualFilingCmd.setQualFilingMaterialAddCmds(
qualFilingMaterialChangeCmdConvertor.convertChangeEListToCmdList(
qualFilingMaterialChangeGateway.listByFilingId(changeId)));
/**
* >= 25 >= 30%
*/
private QualFilingChangeComplianceCheckResultCO checkPersonnelCountChange(Long filingId) {
int total = qualFilingPersonnelChangeGateway.countByFilingId(filingId);
if (total == 0) {
return buildChangeResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
QualFilingComplianceCheckEnum.STATUS_FAIL);
}
int engineerCount = qualFilingPersonnelChangeGateway.countByFilingIdAndRegisterEngineerFlag(filingId, 1);
boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER
&& engineerCount * 100 / total >= QualFilingComplianceCheckEnum.PERSONNEL_RATE;
return buildChangeResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
*
*/
private QualFilingChangeComplianceCheckResultCO checkPersonnelExperienceChange(Long filingId) {
int total = qualFilingPersonnelChangeGateway.countByFilingId(filingId);
if (total == 0) {
return buildChangeResult(QualFilingComplianceCheckEnum.PERSONNEL_EXPERIENCE,
QualFilingComplianceCheckEnum.STATUS_FAIL);
}
LocalDate threshold = LocalDate.now().minusYears(2);
boolean allQualified = qualFilingPersonnelChangeGateway.countByFilingIdAndJoinWorkDateAfter(filingId, threshold) == 0;
return buildChangeResult(QualFilingComplianceCheckEnum.PERSONNEL_EXPERIENCE,
allQualified ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* qual_filing_commitment_change
*/
private QualFilingChangeComplianceCheckResultCO checkCommitmentChange(Long filingId) {
QualFilingCommitmentChangeE commitment =
qualFilingCommitmentChangeGateway.getByFilingId(filingId);
return buildChangeResult(QualFilingComplianceCheckEnum.COMMITMENT,
commitment != null ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* info_disclosure_url
*/
private QualFilingChangeComplianceCheckResultCO checkInfoDisclosureChange(QualFilingChangeEntity change) {
boolean pass = change.getInfoDisclosureUrl() != null
&& !change.getInfoDisclosureUrl().isEmpty();
return buildChangeResult(QualFilingComplianceCheckEnum.INFO_DISCLOSURE,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* qual_filing_material_change upload_status_code=2 material_type=4
*/
private QualFilingChangeComplianceCheckResultCO checkCreditRecordChange(Long filingId) {
int count = qualFilingMaterialChangeGateway.countByFilingIdAndUploadStatusCodeAndMaterialType(
filingId,
QualFilingMaterialUploadStatusEnum.UPLOADED.getCode(),
String.valueOf(MaterialTypeEnum.NO_VIOLATION_RECORD.getCode()));
return buildChangeResult(QualFilingComplianceCheckEnum.CREDIT_RECORD,
count > 0 ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
private QualFilingChangeComplianceCheckResultCO buildChangeResult(QualFilingComplianceCheckEnum item, String status) {
QualFilingChangeComplianceCheckResultCO co = new QualFilingChangeComplianceCheckResultCO();
co.setTitle(item.getTitle());
co.setDescription(item.getDescription());
co.setStatus(status);
return co;
return ComplianceCheckUtil.complianceCheck(qualFilingCmd);
}
private Long resolveOrgId() {

View File

@ -1,7 +1,7 @@
package org.qinan.safetyeval.client.api;
import org.qinan.safetyeval.client.co.QualFilingChangeAggregationCO;
import org.qinan.safetyeval.client.co.QualFilingChangeComplianceCheckResultCO;
import org.qinan.safetyeval.client.co.QualFilingComplianceCheckResultCO;
import org.qinan.safetyeval.client.co.QualFilingChangeHistoryCO;
import org.qinan.safetyeval.client.co.QualFilingChangeCO;
import org.qinan.safetyeval.client.co.QualFilingChangeOrgCO;
@ -44,7 +44,7 @@ public interface QualFilingChangeApi {
SingleResponse<Void> reject(QualFilingRejectCmd cmd);
SingleResponse<List<QualFilingChangeComplianceCheckResultCO>> complianceCheck(Long id);
SingleResponse<List<QualFilingComplianceCheckResultCO>> complianceCheck(Long id);
SingleResponse<QualFilingChangeCO> aggregationSaveOrEdit(AggregationSaveOrEditQualFilingChangeCmd cmd);

View File

@ -1,22 +0,0 @@
package org.qinan.safetyeval.client.co;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* CO
*
* @author safety-eval
*/
@Data
public class QualFilingChangeComplianceCheckResultCO {
@ApiModelProperty(value = "检查项标题")
private String title;
@ApiModelProperty(value = "检查项描述")
private String description;
@ApiModelProperty(value = "检查结果状态PASS 通过 / NOT_PASS 未通过 / WARN 警告")
private String status;
}

View File

@ -0,0 +1,163 @@
package org.qinan.safetyeval.infrastructure.utils;
import lombok.experimental.UtilityClass;
import org.qinan.safetyeval.client.co.QualFilingComplianceCheckResultCO;
import org.qinan.safetyeval.client.dto.AggregationSaveOrEditQualFilingCmd;
import org.qinan.safetyeval.client.dto.QualFilingAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingCommitmentAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingMaterialAddCmd;
import org.qinan.safetyeval.client.dto.QualFilingPersonnelAddCmd;
import org.qinan.safetyeval.domain.constant.MaterialTypeEnum;
import org.qinan.safetyeval.domain.constant.QualFilingComplianceCheckEnum;
import org.qinan.safetyeval.domain.constant.QualFilingMaterialUploadStatusEnum;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
@UtilityClass
public class ComplianceCheckUtil {
/**
*
*/
public List<QualFilingComplianceCheckResultCO> complianceCheck(AggregationSaveOrEditQualFilingCmd cmd) {
QualFilingAddCmd filing = cmd.getQualFilingAddCmd();
List<QualFilingPersonnelAddCmd> personnelList = cmd.getQualFilingPersonnelAddCmds();
List<QualFilingMaterialAddCmd> materialList = cmd.getQualFilingMaterialAddCmds();
List<QualFilingComplianceCheckResultCO> results = new ArrayList<>();
// 1. 主体资格
results.add(checkMainQualification(filing));
// 2. 场所与设备
results.add(checkWorkplace(filing));
// 3. 人员数量与结构
results.add(checkPersonnelCount(personnelList));
// 4. 人员资历
results.add(checkPersonnelExperience(personnelList));
// 5. 关键岗位要求(暂默认通过,标记警告)
results.add(buildResult(QualFilingComplianceCheckEnum.KEY_POSITION,
QualFilingComplianceCheckEnum.STATUS_WARN));
// 6. 管理体系(暂无法判断,标记警告)
results.add(buildResult(QualFilingComplianceCheckEnum.MANAGEMENT_SYSTEM,
QualFilingComplianceCheckEnum.STATUS_WARN));
// 7. 责任承诺
results.add(checkCommitment(cmd.getQualFilingCommitmentAddCmd()));
// 8. 信息公开
results.add(checkInfoDisclosure(filing));
// 9. 信用记录
results.add(checkCreditRecord(materialList));
// 10. 其他
results.add(buildResult(QualFilingComplianceCheckEnum.OTHER,
QualFilingComplianceCheckEnum.STATUS_PASS));
return results;
}
/**
* >= 1000
*/
private QualFilingComplianceCheckResultCO checkMainQualification(QualFilingAddCmd filing) {
boolean pass = filing.getFixedAssetAmount() != null
&& filing.getFixedAssetAmount() >= 800L;
return buildResult(QualFilingComplianceCheckEnum.MAIN_QUALIFICATION,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* >= 1000
*/
private QualFilingComplianceCheckResultCO checkWorkplace(QualFilingAddCmd filing) {
boolean pass = filing.getWorkplaceArea() != null
&& filing.getWorkplaceArea()
.compareTo(new BigDecimal(QualFilingComplianceCheckEnum.WORKPLACE_LOWER)) >= 0;
return buildResult(QualFilingComplianceCheckEnum.WORKPLACE,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* >= 25 >= 30%
*/
private QualFilingComplianceCheckResultCO checkPersonnelCount(List<QualFilingPersonnelAddCmd> personnelList) {
if (personnelList == null || personnelList.isEmpty()) {
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
QualFilingComplianceCheckEnum.STATUS_FAIL);
}
int total = personnelList.size();
long engineerCount = personnelList.stream()
.filter(p -> p.getRegisterEngineerFlag() != null && p.getRegisterEngineerFlag() == 1)
.count();
boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER
&& engineerCount * 100 / total >= QualFilingComplianceCheckEnum.PERSONNEL_RATE;
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
*
*/
private QualFilingComplianceCheckResultCO checkPersonnelExperience(List<QualFilingPersonnelAddCmd> personnelList) {
if (personnelList == null || personnelList.isEmpty()) {
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_EXPERIENCE,
QualFilingComplianceCheckEnum.STATUS_FAIL);
}
LocalDate threshold = LocalDate.now().minusYears(2);
boolean allQualified = personnelList.stream()
.noneMatch(p -> p.getJoinWorkDate() != null && p.getJoinWorkDate().isAfter(threshold));
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_EXPERIENCE,
allQualified ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
*
*/
private QualFilingComplianceCheckResultCO checkCommitment(QualFilingCommitmentAddCmd commitment) {
return buildResult(QualFilingComplianceCheckEnum.COMMITMENT,
commitment != null ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* info_disclosure_url
*/
private QualFilingComplianceCheckResultCO checkInfoDisclosure(QualFilingAddCmd filing) {
boolean pass = filing.getInfoDisclosureUrl() != null
&& !filing.getInfoDisclosureUrl().isEmpty();
return buildResult(QualFilingComplianceCheckEnum.INFO_DISCLOSURE,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
/**
* upload_status_code=2 material_type=4
*/
private QualFilingComplianceCheckResultCO checkCreditRecord(List<QualFilingMaterialAddCmd> materialList) {
boolean hasRecord = materialList != null && materialList.stream().anyMatch(m ->
m.getUploadStatusCode() != null
&& m.getUploadStatusCode() == QualFilingMaterialUploadStatusEnum.UPLOADED.getCode()
&& m.getMaterialType() != null
&& m.getMaterialType() == MaterialTypeEnum.NO_VIOLATION_RECORD.getCode());
return buildResult(QualFilingComplianceCheckEnum.CREDIT_RECORD,
hasRecord ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
}
private QualFilingComplianceCheckResultCO buildResult(QualFilingComplianceCheckEnum item, String status) {
QualFilingComplianceCheckResultCO co = new QualFilingComplianceCheckResultCO();
co.setTitle(item.getTitle());
co.setDescription(item.getDescription());
co.setStatus(status);
return co;
}
}