dev
luotaiqian 2026-07-14 15:25:04 +08:00
parent ba4706cc66
commit 7176591ea0
3 changed files with 104 additions and 80 deletions

View File

@ -19,4 +19,10 @@ public class QualFilingComplianceCheckResultCO {
@ApiModelProperty(value = "检查结果状态PASS 通过 / NOT_PASS 未通过 / WARN 警告") @ApiModelProperty(value = "检查结果状态PASS 通过 / NOT_PASS 未通过 / WARN 警告")
private String status; private String status;
@ApiModelProperty(value = "当前值")
private String currentValue;
@ApiModelProperty(value = "来源字段")
private String sourceColumn;
} }

View File

@ -1,7 +1,5 @@
package org.qinan.safetyeval.domain.constant; package org.qinan.safetyeval.domain.constant;
import java.math.BigDecimal;
/** /**
* *
* *
@ -9,16 +7,17 @@ import java.math.BigDecimal;
*/ */
public enum QualFilingComplianceCheckEnum { public enum QualFilingComplianceCheckEnum {
MAIN_QUALIFICATION("主体资格", "独立法人资格,固定资产不少于一千万元"), INDEPENDENT_LEGAL("独立法人资格", "具有独立法人资格", "机构备案.法人类型、营业执照附件"),
WORKPLACE("场所与设备", "工作场所建筑面积不少于1000㎡"), FIXED_AMOUNT("固定资产", "不少于 800 万元", "财务材料.固定资产净值、审计报告"),
PERSONNEL_COUNT("人员数量与结构", "专职技术人员≥25人中级注安师≥30%"), WORKPLACE("工作场所", "建筑面积不少于 1000 平方米,档案室不少于 100 平方米", "场所核验.建筑面积、档案室核验.面积"),
PERSONNEL_EXPERIENCE("人员资历", "专职技术人员在本行业领域工作二年以上"), EQUIPMENT_SOFTWARE("设施设备软件", "具有与业务相适应的技术支撑条件", "设备台账.设备清单、软件授权.有效期"),
KEY_POSITION("关键岗位要求", "负责人具有高级职称,工作八年以上"), PERSONNEL_COUNT("专职技术人员数量", "单一业务范围不少于 25 人;每增加一个业务范围至少增加 5 人", "人员库.专职人员、业务范围.数量、社保比对.缴纳单位"),
MANAGEMENT_SYSTEM("管理体系", "需核验文件化管理体系是否符合要求"), PERSONNEL_RATIO("人员比例", "注册安全工程师比例不低于 30%,高级职称比例不低于 30%,二者合计不低于 60%", "人员库.注册安全工程师、人员库.职称等级"),
COMMITMENT("责任承诺", "法定代表人已出具承诺书"), KEY_POSITION("负责人配备", "每个业务范围配备专职技术负责人;另配过程控制负责人", "负责人备案.技术负责人、负责人备案.过程控制负责人"),
INFO_DISCLOSURE("信息公开", "未检测到公示网站"), MANAGEMENT_SYSTEM("制度与过程控制体系", "具有健全内部管理制度和安全评价过程控制体系", "制度文件.版本、过程控制.节点记录"),
CREDIT_RECORD("信用记录", "三年内无重大违法失信记录"), COMMITMENT("承诺书/网站/报告查询", "法定代表人承诺书已出具;网站正常运行并可查询机构信息和报告", "承诺书.上传状态、网站备案.报告查询状态"),
OTHER("其他", "法律、行政法规规定的其他条件"), CREDIT_RECORD("三年重大违法失信记录", "截至申请或核查日三年内无重大违法失信记录", "信用核查.重大违法失信记录"),
TERRITORIAL("属地满足情况", "在注册地所在直辖市、设区市行政区域范围内满足资质条件", "异地备案.注册地、本市社保.缴纳人数、场所核验.属地"),
; ;
/** /**
@ -43,10 +42,12 @@ public enum QualFilingComplianceCheckEnum {
private final String title; private final String title;
private final String description; private final String description;
private final String sourceColumn;
QualFilingComplianceCheckEnum(String title, String description) { QualFilingComplianceCheckEnum(String title, String description, String sourceColumn) {
this.title = title; this.title = title;
this.description = description; this.description = description;
this.sourceColumn = sourceColumn;
} }
public String getTitle() { public String getTitle() {
@ -56,4 +57,8 @@ public enum QualFilingComplianceCheckEnum {
public String getDescription() { public String getDescription() {
return description; return description;
} }
public String getSourceColumn() {
return sourceColumn;
}
} }

View File

@ -2,17 +2,12 @@ package org.qinan.safetyeval.infrastructure.utils;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.qinan.safetyeval.client.co.QualFilingComplianceCheckResultCO; import org.qinan.safetyeval.client.co.QualFilingComplianceCheckResultCO;
import org.qinan.safetyeval.client.dto.AggregationSaveOrEditQualFilingCmd; import org.qinan.safetyeval.client.dto.*;
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.MaterialTypeEnum;
import org.qinan.safetyeval.domain.constant.QualFilingComplianceCheckEnum; import org.qinan.safetyeval.domain.constant.QualFilingComplianceCheckEnum;
import org.qinan.safetyeval.domain.constant.QualFilingMaterialUploadStatusEnum; import org.qinan.safetyeval.domain.constant.QualFilingMaterialUploadStatusEnum;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -32,112 +27,118 @@ public class ComplianceCheckUtil {
List<QualFilingComplianceCheckResultCO> results = new ArrayList<>(); List<QualFilingComplianceCheckResultCO> results = new ArrayList<>();
// 1. 主体资格 // 1. 独立法人资格
results.add(checkMainQualification(filing)); results.add(checkMainQualification(filing));
// 2. 场所与设备 // 2. 固定资产
results.add(checkFixedAmount(filing));
// 3. 工作场所
results.add(checkWorkplace(filing)); results.add(checkWorkplace(filing));
// 3. 人员数量与结构 // 4. 设施设备软件(暂无法判断,标记警告)
results.add(buildResult(QualFilingComplianceCheckEnum.EQUIPMENT_SOFTWARE,
QualFilingComplianceCheckEnum.STATUS_WARN, null));
// 5. 专职技术人员数量
results.add(checkPersonnelCount(personnelList)); results.add(checkPersonnelCount(personnelList));
// 4. 人员资历 // 6. 人员比例
results.add(checkPersonnelExperience(personnelList)); results.add(checkPersonnelRatio(personnelList));
// 5. 关键岗位要求(暂默认通过,标记警告) // 7. 负责人配备(暂无法判断,标记警告)
results.add(buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, results.add(buildResult(QualFilingComplianceCheckEnum.KEY_POSITION,
QualFilingComplianceCheckEnum.STATUS_WARN)); QualFilingComplianceCheckEnum.STATUS_WARN, null));
// 6. 管理体系(暂无法判断,标记警告) // 8. 制度与过程控制体系(暂无法判断,标记警告)
results.add(buildResult(QualFilingComplianceCheckEnum.MANAGEMENT_SYSTEM, results.add(buildResult(QualFilingComplianceCheckEnum.MANAGEMENT_SYSTEM,
QualFilingComplianceCheckEnum.STATUS_WARN)); QualFilingComplianceCheckEnum.STATUS_WARN, null));
// 7. 责任承诺 // 9. 承诺书/网站/报告查询
results.add(checkCommitment(cmd.getQualFilingCommitmentAddCmd())); results.add(checkCommitment(cmd.getQualFilingCommitmentAddCmd(), filing));
// 8. 信息公开 // 10. 三年重大违法失信记录
results.add(checkInfoDisclosure(filing));
// 9. 信用记录
results.add(checkCreditRecord(materialList)); results.add(checkCreditRecord(materialList));
// 10. 其他 // 11. 属地满足情况(暂无法判断,标记警告)
results.add(buildResult(QualFilingComplianceCheckEnum.OTHER, results.add(buildResult(QualFilingComplianceCheckEnum.TERRITORIAL,
QualFilingComplianceCheckEnum.STATUS_PASS)); QualFilingComplianceCheckEnum.STATUS_WARN, null));
return results; return results;
} }
/** /**
* >= 1000 *
*/ */
private QualFilingComplianceCheckResultCO checkMainQualification(QualFilingAddCmd filing) { private QualFilingComplianceCheckResultCO checkMainQualification(QualFilingAddCmd filing) {
boolean pass = filing.getFixedAssetAmount() != null return buildResult(QualFilingComplianceCheckEnum.INDEPENDENT_LEGAL,
&& filing.getFixedAssetAmount() >= 800L; QualFilingComplianceCheckEnum.STATUS_PASS, "独立法人");
return buildResult(QualFilingComplianceCheckEnum.MAIN_QUALIFICATION,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL);
} }
/** /**
* >= 1000 * >= 800
*/
private QualFilingComplianceCheckResultCO checkFixedAmount(QualFilingAddCmd filing) {
boolean pass = filing.getFixedAssetAmount() != null
&& filing.getFixedAssetAmount() >= 800L;
return buildResult(QualFilingComplianceCheckEnum.FIXED_AMOUNT,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, null);
}
/**
* >= 1000
*/ */
private QualFilingComplianceCheckResultCO checkWorkplace(QualFilingAddCmd filing) { private QualFilingComplianceCheckResultCO checkWorkplace(QualFilingAddCmd filing) {
boolean pass = filing.getWorkplaceArea() != null boolean pass = filing.getWorkplaceArea() != null
&& filing.getWorkplaceArea() && filing.getWorkplaceArea()
.compareTo(new BigDecimal(QualFilingComplianceCheckEnum.WORKPLACE_LOWER)) >= 0; .compareTo(new BigDecimal(QualFilingComplianceCheckEnum.WORKPLACE_LOWER)) >= 0;
return buildResult(QualFilingComplianceCheckEnum.WORKPLACE, return buildResult(QualFilingComplianceCheckEnum.WORKPLACE,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL); pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, null);
} }
/** /**
* >= 25 >= 30% * >= 25
*/ */
private QualFilingComplianceCheckResultCO checkPersonnelCount(List<QualFilingPersonnelAddCmd> personnelList) { private QualFilingComplianceCheckResultCO checkPersonnelCount(List<QualFilingPersonnelAddCmd> personnelList) {
if (personnelList == null || personnelList.isEmpty()) { if (personnelList == null || personnelList.isEmpty()) {
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT, return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
QualFilingComplianceCheckEnum.STATUS_FAIL); QualFilingComplianceCheckEnum.STATUS_FAIL, null);
}
int total = personnelList.size();
boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER;
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL, null);
}
/**
* >= 30%
*/
private QualFilingComplianceCheckResultCO checkPersonnelRatio(List<QualFilingPersonnelAddCmd> personnelList) {
if (personnelList == null || personnelList.isEmpty()) {
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_RATIO,
QualFilingComplianceCheckEnum.STATUS_FAIL, null);
} }
int total = personnelList.size(); int total = personnelList.size();
long engineerCount = personnelList.stream() long engineerCount = personnelList.stream()
.filter(p -> p.getRegisterEngineerFlag() != null && p.getRegisterEngineerFlag() == 1) .filter(p -> p.getRegisterEngineerFlag() != null && p.getRegisterEngineerFlag() == 1)
.count(); .count();
boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER boolean pass = engineerCount * 100 / total >= QualFilingComplianceCheckEnum.PERSONNEL_RATE;
&& engineerCount * 100 / total >= QualFilingComplianceCheckEnum.PERSONNEL_RATE; return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_RATIO,
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT, pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL); , null);
} }
/** /**
* * //
*/ */
private QualFilingComplianceCheckResultCO checkPersonnelExperience(List<QualFilingPersonnelAddCmd> personnelList) { private QualFilingComplianceCheckResultCO checkCommitment(QualFilingCommitmentAddCmd commitment, QualFilingAddCmd filing) {
if (personnelList == null || personnelList.isEmpty()) { boolean hasCommitment = commitment != null;
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_EXPERIENCE, boolean hasInfoDisclosure = filing.getInfoDisclosureUrl() != null
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(); && !filing.getInfoDisclosureUrl().isEmpty();
return buildResult(QualFilingComplianceCheckEnum.INFO_DISCLOSURE, boolean pass = hasCommitment && hasInfoDisclosure;
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL); return buildResult(QualFilingComplianceCheckEnum.COMMITMENT,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL
, null);
} }
/** /**
@ -150,14 +151,26 @@ public class ComplianceCheckUtil {
&& m.getMaterialType() != null && m.getMaterialType() != null
&& m.getMaterialType() == MaterialTypeEnum.NO_VIOLATION_RECORD.getCode()); && m.getMaterialType() == MaterialTypeEnum.NO_VIOLATION_RECORD.getCode());
return buildResult(QualFilingComplianceCheckEnum.CREDIT_RECORD, return buildResult(QualFilingComplianceCheckEnum.CREDIT_RECORD,
hasRecord ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL); hasRecord ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL
, null);
} }
private QualFilingComplianceCheckResultCO buildResult(QualFilingComplianceCheckEnum item, String status) { /**
* buildResult
*
* @param item item
* @param status status
* @param currentValued currentValued
* @return QualFilingComplianceCheckResultCO
*/
private QualFilingComplianceCheckResultCO buildResult(QualFilingComplianceCheckEnum item
, String status, String currentValued) {
QualFilingComplianceCheckResultCO co = new QualFilingComplianceCheckResultCO(); QualFilingComplianceCheckResultCO co = new QualFilingComplianceCheckResultCO();
co.setTitle(item.getTitle()); co.setTitle(item.getTitle());
co.setDescription(item.getDescription()); co.setDescription(item.getDescription());
co.setStatus(status); co.setStatus(status);
co.setSourceColumn(item.getSourceColumn());
co.setCurrentValue(currentValued);
return co; return co;
} }
} }