dev-tmp1
luotaiqian 2026-08-08 18:29:48 +08:00
parent ef3d3f751b
commit 8698b88518
4 changed files with 129 additions and 53 deletions

View File

@ -0,0 +1,38 @@
package org.qinan.safetyeval.client.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.qinan.safetyeval.domain.entity.CapabilityAssessmentDTO;
import org.qinan.safetyeval.domain.entity.TitleCodeCo;
import java.util.List;
/**
*
*
* @author safety-eval
*/
@Data
public class QualFilingPersonnelFilingCheckDTO {
@ApiModelProperty("人员id")
private Long id;
@ApiModelProperty(value = "人员岗位类型: TECHNICAL_LEADER=>技术负责人; PROCESS_CONTROL_LEADER=>过程控制负责人")
private String personnelPositionType;
@ApiModelProperty(value = "能力认定")
private List<CapabilityAssessmentDTO> capabilityAssessment;
@ApiModelProperty(value = "是否技术负责人(false否true是)")
private Boolean technicalDirectorFlag;
@ApiModelProperty(value = "是否过程控制负责人(false否true是)")
private Boolean processControlLeaderFlag;
@ApiModelProperty(value = "职称(多个逗号分隔)")
private List<TitleCodeCo> titleCodeArr;
// @ApiModelProperty(value = "人员证书信息")
// private List<PersonnelCertFilingPageCO> personnelCertFilingPageCOList;
}

View File

@ -12,11 +12,12 @@ public enum PersonnelPositionTypeEnum {
TECHNICAL_LEADER("TECHNICAL_LEADER", "技术负责人"),
PROCESS_CONTROL_LEADER("PROCESS_CONTROL_LEADER", "过程控制负责人"),
BASIC("BASIC", "基础人员"),
;
private final String value;
private final String label;
public static final String REMARKS = "人员岗位类型: TECHNICAL_LEADER=>技术负责人;" +
"PROCESS_CONTROL_LEADER=>过程控制负责人";
"PROCESS_CONTROL_LEADER=>过程控制负责人;BASIC=>基础人员" ;
}

View File

@ -13,8 +13,10 @@ import org.qinan.safetyeval.client.dto.*;
import org.qinan.safetyeval.domain.constant.*;
import org.qinan.safetyeval.domain.constant.basic.IndustryEnum;
import org.qinan.safetyeval.domain.constant.basic.ProfessionalCapabilityEnum;
import org.qinan.safetyeval.domain.entity.CapabilityAssessmentDTO;
import org.qinan.safetyeval.domain.entity.TitleCodeCo;
import org.qinan.safetyeval.domain.exception.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.infrastructure.dataobject.OrgPersonnelDO;
import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelCertMapper;
import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelMapper;
@ -53,12 +55,15 @@ public class ComplianceCheckUtil {
List<QualFilingComplianceCheckResultCO> results = new ArrayList<>();
// 0. 查询人员证书专业能力信息
List<OrgPersonnelCertCapabilityComplianceCheckCO>
certCapabilityList = queryOrgPersonnelCertCapability(personnelList);
// 0. 查询人员备案数据
List<QualFilingPersonnelFilingCheckDTO> personnelFilingCheckList = queryPersonnelFilingCheck(personnelList);
// // 0. 查询人员证书专业能力信息
// List<OrgPersonnelCertCapabilityComplianceCheckCO>
// certCapabilityList = queryOrgPersonnelCertCapability(personnelList);
// 0.1 查询人员职称信息并回填到 personnelList
fillTitleCodeArr(personnelList);
fillTitleCodeArr(personnelList, personnelFilingCheckList);
// 1. 独立法人资格
results.add(checkMainQualification(filing));
@ -77,7 +82,7 @@ public class ComplianceCheckUtil {
results.add(checkPersonnelCount(filing, personnelList));
// 6. 人员比例
results.add(checkPersonnelRatio(filing.getBusinessScope(), personnelList, certCapabilityList, throwException));
results.add(checkPersonnelRatio(filing.getBusinessScope(), personnelList, personnelFilingCheckList, throwException));
// 7. 负责人配备
results.add(checkKeyPosition(filing, personnelList));
@ -142,36 +147,72 @@ public class ComplianceCheckUtil {
}
/**
* org_personnel title_code_arr
*
* <p>
* sourcePersonnelId org_personnel.id title_code_arr
* JSON {@link TitleCodeCo} personnelList
* sourcePersonnelId org_personnel.id
*
*
* @param personnelList
* @return
*/
private void fillTitleCodeArr(List<QualFilingPersonnelAddCmd> personnelList) {
private List<QualFilingPersonnelFilingCheckDTO> queryPersonnelFilingCheck(
List<QualFilingPersonnelAddCmd> personnelList) {
if (CollectionUtils.isEmpty(personnelList)) {
return;
}
List<Long> sourcePersonnelIds = personnelList.stream()
.map(QualFilingPersonnelAddCmd::getSourcePersonnelId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (sourcePersonnelIds.isEmpty()) {
return;
return Collections.emptyList();
}
Map<Long, QualFilingPersonnelAddCmd> sourcePersonnelIds = personnelList.stream()
.collect(Collectors.toMap(QualFilingPersonnelAddCmd::getSourcePersonnelId, Function.identity()));
LambdaQueryWrapper<OrgPersonnelDO> wrapper = new LambdaQueryWrapper<OrgPersonnelDO>()
.select(OrgPersonnelDO::getId, OrgPersonnelDO::getTitleCodeArr)
.in(OrgPersonnelDO::getId, sourcePersonnelIds);
.select(OrgPersonnelDO::getId, OrgPersonnelDO::getPersonnelPositionType,
OrgPersonnelDO::getCapabilityAssessment, OrgPersonnelDO::getTechnicalDirectorFlag,
OrgPersonnelDO::getProcessControlLeaderFlag, OrgPersonnelDO::getTitleCodeArr)
.in(OrgPersonnelDO::getId, sourcePersonnelIds.keySet());
List<OrgPersonnelDO> orgPersonnelList = SpringUtil.getBean(OrgPersonnelMapper.class).selectList(wrapper);
Map<Long, String> titleCodeArrMap = orgPersonnelList.stream()
.filter(p -> p.getTitleCodeArr() != null)
.collect(Collectors.toMap(OrgPersonnelDO::getId, OrgPersonnelDO::getTitleCodeArr, (a, b) -> a));
List<QualFilingPersonnelFilingCheckDTO> result = new ArrayList<>();
for (OrgPersonnelDO personnel : orgPersonnelList) {
sourcePersonnelIds.remove(personnel.getId());
QualFilingPersonnelFilingCheckDTO dto = new QualFilingPersonnelFilingCheckDTO();
dto.setId(personnel.getId());
dto.setPersonnelPositionType(personnel.getPersonnelPositionType());
dto.setCapabilityAssessment(
JSONUtil.toList(personnel.getCapabilityAssessment(), CapabilityAssessmentDTO.class));
dto.setTechnicalDirectorFlag(personnel.getTechnicalDirectorFlag());
dto.setProcessControlLeaderFlag(personnel.getProcessControlLeaderFlag());
dto.setTitleCodeArr(JSONUtil.toList(personnel.getTitleCodeArr(), TitleCodeCo.class));
result.add(dto);
}
// 人员缺少返回
if (!CollectionUtils.isEmpty(sourcePersonnelIds)) {
String collect = sourcePersonnelIds.values().stream()
.map(QualFilingPersonnelAddCmd::getPersonName)
.filter(Objects::nonNull)
.collect(Collectors.joining(CommonUtil.COMMA));
throw new BizException(ErrorCode.UNKNOWN_ERROR, "人员信息不存在" + collect);
}
return result;
}
/**
*
*
* @param personnelList
* @param personnelFilingCheckList
*/
private void fillTitleCodeArr(List<QualFilingPersonnelAddCmd> personnelList,
List<QualFilingPersonnelFilingCheckDTO> personnelFilingCheckList) {
if (CollectionUtils.isEmpty(personnelList) || CollectionUtils.isEmpty(personnelFilingCheckList)) {
return;
}
Map<Long, List<TitleCodeCo>> titleCodeArrMap = personnelFilingCheckList.stream()
.filter(p -> p.getId() != null && p.getTitleCodeArr() != null)
.collect(Collectors.toMap(QualFilingPersonnelFilingCheckDTO::getId,
QualFilingPersonnelFilingCheckDTO::getTitleCodeArr, (a, b) -> a));
for (QualFilingPersonnelAddCmd personnel : personnelList) {
String titleCodeArrJson = titleCodeArrMap.get(personnel.getSourcePersonnelId());
if (StringUtils.hasText(titleCodeArrJson)) {
personnel.setTitleCodeArr(JSONUtil.toList(titleCodeArrJson, TitleCodeCo.class));
List<TitleCodeCo> titleCodeArr = titleCodeArrMap.get(personnel.getSourcePersonnelId());
if (titleCodeArr != null) {
personnel.setTitleCodeArr(titleCodeArr);
}
}
}
@ -191,7 +232,7 @@ public class ComplianceCheckUtil {
boolean pass = filing.getFixedAssetAmount() != null
&& filing.getFixedAssetAmount() >= 800L;
String currentValue = filing.getFixedAssetAmount() != null
? filing.getFixedAssetAmount() + " 万元" : "未填写";
? filing.getFixedAssetAmount() + " 万元" : "未填写" ;
return buildResult(QualFilingComplianceCheckEnum.FIXED_AMOUNT,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL,
currentValue);
@ -204,22 +245,22 @@ public class ComplianceCheckUtil {
boolean pass = filing.getWorkplaceArea() != null
&& filing.getWorkplaceArea()
.compareTo(new BigDecimal(QualFilingComplianceCheckEnum.WORKPLACE_LOWER)) >= 0;
String workplace = filing.getWorkplaceArea() != null ? filing.getWorkplaceArea().toPlainString() : "未填写";
String archive = filing.getArchiveRoomArea() != null ? filing.getArchiveRoomArea().toPlainString() : "未填写";
String currentValue = "工作场所 " + workplace + " 平方米,档案室 " + archive + " 平方米";
String workplace = filing.getWorkplaceArea() != null ? filing.getWorkplaceArea().toPlainString() : "未填写" ;
String archive = filing.getArchiveRoomArea() != null ? filing.getArchiveRoomArea().toPlainString() : "未填写" ;
String currentValue = "工作场所 " + workplace + " 平方米,档案室 " + archive + " 平方米" ;
return buildResult(QualFilingComplianceCheckEnum.WORKPLACE,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL,
currentValue);
}
/**
* >= 25
* >= 25+-1*5
*/
private QualFilingComplianceCheckResultCO checkPersonnelCount(QualFilingAddCmd filing, List<QualFilingPersonnelAddCmd> personnelList) {
int scopeCount = filing.getBusinessScope() != null ? filing.getBusinessScope().size() : 0;
int total = personnelList == null ? 0 : personnelList.size();
boolean pass = total >= QualFilingComplianceCheckEnum.PERSONNEL_COUNT_LOWER + (scopeCount - 1) * 5;
String currentValue = scopeCount + " 个业务范围," + total + " 人";
String currentValue = scopeCount + " 个业务范围," + total + " 人" ;
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_COUNT,
pass ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL,
currentValue);
@ -230,16 +271,16 @@ public class ComplianceCheckUtil {
*/
private QualFilingComplianceCheckResultCO checkPersonnelRatio(
List<String> businessScope, List<QualFilingPersonnelAddCmd> personnelList
, List<OrgPersonnelCertCapabilityComplianceCheckCO> personnelCertCoList, boolean throwException) {
, List<QualFilingPersonnelFilingCheckDTO> personnelCertCoList, boolean throwException) {
if (personnelList == null || personnelList.isEmpty()) {
return buildResult(QualFilingComplianceCheckEnum.PERSONNEL_RATIO,
QualFilingComplianceCheckEnum.STATUS_FAIL, "无人员数据");
}
int total = personnelList.size();
Set<Long> engineerSet = personnelCertCoList.stream()
.filter(p -> CertTypeCodeEnum.REGISTERED_SAFETY_ENGINEER
.getCode().equals(p.getCertTypeCode()) && !CertLevelEnum.JUNIOR.getCode().equals(p.getCertLevel()))
.map(OrgPersonnelCertCapabilityComplianceCheckCO::getPersonnelId)
// .filter(p -> CertTypeCodeEnum.REGISTERED_SAFETY_ENGINEER
// .getCode().equals(p.getCertTypeCode()) && !CertLevelEnum.JUNIOR.getCode().equals(p.getCertLevel()))
.map(QualFilingPersonnelFilingCheckDTO::getId)
.collect(Collectors.toSet());
Set<Long> seniorTitleSet = personnelList.stream()
.filter(p -> p.getTitleCodeArr() != null && p.getTitleCodeArr().stream()
@ -253,7 +294,7 @@ public class ComplianceCheckUtil {
boolean pass = engineerRate >= QualFilingComplianceCheckEnum.PERSONNEL_RATE
&& seniorTitleRate >= QualFilingComplianceCheckEnum.PERSONNEL_RATE
&& sumRate >= 60;
String currentValue = "注册安工程师 " + engineerRate + "%,高级职称 " + seniorTitleRate + "%,合计 " + sumRate + "%";
String currentValue = "注册安工程师 " + engineerRate + "%,高级职称 " + seniorTitleRate + "%,合计 " + sumRate + "%" ;
if (!pass && throwException) {
throw new BizException(PERSON_NOT_ENOUGH, currentValue);
}
@ -266,7 +307,11 @@ public class ComplianceCheckUtil {
List<IndustryProfessionalPersonCo> personnelCoList = SpringUtil.getBean(OrgPersonnelMapper.class)
.selectProfessionalCapabilityByPersonnelIds(sourcePersonnelIds);
Pair<Boolean, String> booleanStringPair = industryProfessionalStandardsValid(
businessScope, personnelCoList, personnelCertCoList);
businessScope, personnelCoList, null);
/*Pair<Boolean, String> booleanStringPair = industryProfessionalStandardsValid(
businessScope, personnelCoList, personnelCertCoList);*/
boolean personPassed = Boolean.TRUE.equals(booleanStringPair.getKey());
if (!personPassed && throwException) {
throw new BizException(PERSON_NOT_ENOUGH, booleanStringPair.getValue());
@ -286,15 +331,11 @@ public class ComplianceCheckUtil {
*/
private QualFilingComplianceCheckResultCO checkKeyPosition(QualFilingAddCmd filing,
List<QualFilingPersonnelAddCmd> personnelList) {
if(true){
if (true) {
// todo 暂时无法判定因为 人员去掉了业务范围 ;后面填报资质的时候需要修改
return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, QualFilingComplianceCheckEnum.STATUS_PASS ,
return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION, QualFilingComplianceCheckEnum.STATUS_PASS,
"满足条件");
}
if (personnelList == null || personnelList.isEmpty()) {
return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION,
QualFilingComplianceCheckEnum.STATUS_FAIL, "无人员数据");
}
// 提取所有来源人员id对应 org_personnel.id
List<Long> sourcePersonnelIds = personnelList.stream()
@ -303,10 +344,6 @@ public class ComplianceCheckUtil {
.distinct()
.collect(Collectors.toList());
if (sourcePersonnelIds.isEmpty()) {
return buildResult(QualFilingComplianceCheckEnum.KEY_POSITION,
QualFilingComplianceCheckEnum.STATUS_FAIL, "无来源人员id");
}
// 通过 SpringUtil 获取 OrgPersonnelMapper按业务范围qual_scope分组统计负责人数量
OrgPersonnelMapper orgPersonnelMapper = SpringUtil.getBean(OrgPersonnelMapper.class);
@ -338,7 +375,7 @@ public class ComplianceCheckUtil {
if (industryEnum != null) {
scope = industryEnum.getValue();
} else {
scope = "未知行业范围";
scope = "未知行业范围" ;
}
currentValue.append("业务[").append(scope).append("] 技术负责人 ")
.append(technicalDirectorCount).append("/1过程控制负责人 ")
@ -376,7 +413,7 @@ public class ComplianceCheckUtil {
&& m.getUploadStatusCode() == QualFilingMaterialUploadStatusEnum.UPLOADED.getCode()
&& m.getMaterialType() != null
&& m.getMaterialType() == MaterialTypeEnum.NO_VIOLATION_RECORD.getCode());
String currentValue = hasRecord ? "未命中重大违法失信记录" : "命中重大违法失信记录";
String currentValue = hasRecord ? "未命中重大违法失信记录" : "命中重大违法失信记录" ;
return buildResult(QualFilingComplianceCheckEnum.CREDIT_RECORD,
hasRecord ? QualFilingComplianceCheckEnum.STATUS_PASS : QualFilingComplianceCheckEnum.STATUS_FAIL,
currentValue);

View File

@ -91,10 +91,10 @@
AND p.user_name LIKE CONCAT('%', #{query.personName}, '%')
</if>
<if test="query.managementFlag != null and query.managementFlag == true">
AND (p.technical_director_flag =1 or p.process_control_leader_flag =1)
AND (p.personnel_position_type =1 or p.process_control_leader_flag =1)
</if>
<if test="query.managementFlag != null and query.managementFlag == false">
AND (p.technical_director_flag !=1 and p.process_control_leader_flag !=1)
AND (p.technical_director_flag =0 and p.process_control_leader_flag =0)
</if>
</where>
ORDER BY p.id DESC