dev-tmp1
luotaiqian 2026-08-10 18:10:21 +08:00
parent 5242a486ed
commit ade4ccc34d
3 changed files with 190 additions and 100 deletions

View File

@ -1,5 +1,6 @@
package org.qinan.safetyeval.app.executor;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.toolkit.Db;
@ -10,13 +11,11 @@ import org.qinan.safetyeval.client.co.*;
import org.qinan.safetyeval.client.dto.*;
import org.qinan.safetyeval.domain.change.gateway.*;
import org.qinan.safetyeval.domain.change.model.*;
import org.qinan.safetyeval.domain.constant.QualFilingComplianceCheckEnum;
import org.qinan.safetyeval.domain.constant.QualFilingFormStepEnum;
import org.qinan.safetyeval.domain.constant.QualFilingReviewResultEnum;
import org.qinan.safetyeval.domain.constant.QualFilingStatusEnum;
import org.qinan.safetyeval.domain.constant.*;
import org.qinan.safetyeval.domain.entity.*;
import org.qinan.safetyeval.domain.exception.BizException;
import org.qinan.safetyeval.domain.exception.ErrorCode;
import org.qinan.safetyeval.domain.gateway.OrgPersonnelGateway;
import org.qinan.safetyeval.domain.gateway.QualFilingChangeDetailGateway;
import org.qinan.safetyeval.domain.query.PageResult;
import org.qinan.safetyeval.domain.query.QualFilingChangeQuery;
@ -25,9 +24,10 @@ import org.qinan.safetyeval.domain.service.QualFilingDomainService;
import org.qinan.safetyeval.domain.service.QualFilingReviewDomainService;
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.dataobject.QualFilingChangeDetailDO;
import org.qinan.safetyeval.infrastructure.dataobject.*;
import org.qinan.safetyeval.infrastructure.mapper.QualFilingChangeMapper;
import org.qinan.safetyeval.infrastructure.mapper.QualFilingMapper;
import org.qinan.safetyeval.infrastructure.mapper.QualFilingMaterialMapper;
import org.qinan.safetyeval.infrastructure.mapper.QualFilingPersonnelCertMapper;
import org.qinan.safetyeval.infrastructure.persistence.mapper.QualFilingPersonnelChangeMapper;
import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults;
@ -58,9 +58,15 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
@Resource
private QualFilingChangeMapper qualFilingChangeMapper;
@Resource
private QualFilingMapper qualFilingMapper;
@Resource
private QualFilingMaterialMapper qualFilingMaterialMapper;
@Resource
private QualFilingPersonnelChangeMapper qualFilingPersonnelChangeMapper;
@Resource
private QualFilingPersonnelCertMapper qualFilingPersonnelCertMapper;
@Resource
private OrgPersonnelGateway orgPersonnelGateway;
@Lazy
@Autowired(required = false)
@ -336,9 +342,10 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
, List<QualFilingEquipmentChangeE> equipmentEntities, List<QualFilingMaterialChangeE> materialEntities
, List<QualFilingPersonnelChangeE> personnelEntities, List<QualFilingPersonnelCertChangeE> personnelCertEntities) {
Long changeId = cmd.getOriginChangeFilingId();
List<QualFilingChangeDetailDO> details = diffFromCmd(changeId
, entity, commitmentEntity, equipmentEntities
, materialEntities, personnelEntities, personnelCertEntities);
List<QualFilingChangeDetailDO> details = new ArrayList<>();
details.addAll(diffBasicInfoDetail(changeId, entity, cmd));
details.addAll(diffMaterialDetail(changeId, materialEntities, cmd));
details.addAll(diffManagementPersonnelDetail(changeId, personnelEntities, cmd));
// 根据changeId先删除原有变更明细再新增
qualFilingChangeDetailGateway.deleteByChangeId(changeId);
if (!CollectionUtils.isEmpty(details)) {
@ -574,86 +581,75 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
}
/**
*
*
*/
private List<QualFilingChangeDetailDO> diffFromCmd(
Long changeId, QualFilingChangeEntity newEntity, QualFilingCommitmentChangeE newCommitment,
List<QualFilingEquipmentChangeE> newEquipments, List<QualFilingMaterialChangeE> newMaterials,
List<QualFilingPersonnelChangeE> newPersonnel, List<QualFilingPersonnelCertChangeE> newCerts) {
private List<QualFilingChangeDetailDO> diffBasicInfoDetail(
Long changeId, QualFilingChangeEntity newEntity, AggregationSaveOrEditQualFilingChangeCmd cmd) {
QualFilingDO filingDO = qualFilingMapper.selectOne(
new LambdaQueryWrapper<QualFilingDO>()
.select(QualFilingDO::getLegalRepresentative,
QualFilingDO::getFulltimeEvaluatorCount,
QualFilingDO::getRegisteredEngineerCount)
.eq(QualFilingDO::getId, cmd.getQualFilingChangeAddCmd().getFilingId()));
if (filingDO == null) {
return Collections.emptyList();
}
return diffBasicInfo(changeId, filingDO, newEntity);
}
/**
*
*/
private List<QualFilingChangeDetailDO> diffMaterialDetail(
Long changeId, List<QualFilingMaterialChangeE> newMaterials, AggregationSaveOrEditQualFilingChangeCmd cmd) {
List<QualFilingMaterialDO> existingMaterials = qualFilingMaterialMapper.selectList(
new LambdaQueryWrapper<QualFilingMaterialDO>()
.select(QualFilingMaterialDO::getMaterialType,
QualFilingMaterialDO::getAttachmentUrl)
.eq(QualFilingMaterialDO::getFilingId, cmd.getQualFilingChangeAddCmd().getFilingId()));
return diffMaterial(changeId, existingMaterials, newMaterials);
}
/**
*
*/
private List<QualFilingChangeDetailDO> diffManagementPersonnelDetail(
Long changeId, List<QualFilingPersonnelChangeE> newPersonnel,
AggregationSaveOrEditQualFilingChangeCmd cmd) {
List<QualFilingPersonnelDO> existingMgmtPersonnel = qualFilingPersonnelChangeMapper
.listManagementPersonnelByFilingId(cmd.getQualFilingChangeAddCmd().getFilingId());
return diffManagementPersonnel(changeId, existingMgmtPersonnel, newPersonnel);
}
/**
*
*/
private List<QualFilingChangeDetailDO> diffBasicInfo(Long changeId, QualFilingDO exist, QualFilingChangeEntity newEntity) {
List<QualFilingChangeDetailDO> details = new ArrayList<>();
// 基本信息变更
QualFilingChangeEntity existingEntity = qualFilingChangeDomainService.get(changeId);
if (existingEntity != null && basicInfoChanged(existingEntity, newEntity)) {
details.add(stepDetail(changeId, QualFilingFormStepEnum.BASIC_INFO, "备案基本信息变更",
summarizeBasic(existingEntity), summarizeBasic(newEntity)));
// 法定代表人
if (!Objects.equals(exist.getLegalRepresentative(), newEntity.getLegalRepresentative())) {
details.add(fieldDetail(changeId, QualFilingFormStepEnum.BASIC_INFO, "备案基本信息变更",
"法定代表人",
Objects.toString(exist.getLegalRepresentative(), ""),
Objects.toString(newEntity.getLegalRepresentative(), "")));
}
// 承诺书变更
QualFilingCommitmentChangeE existingCommitment = qualFilingCommitmentChangeGateway.getByFilingId(changeId);
if (commitmentChanged(existingCommitment, newCommitment)) {
details.add(stepDetail(changeId, QualFilingFormStepEnum.COMMITMENT, "法定代表人承诺书变更",
"承诺书", "承诺书已变更"));
// 专职安全评价师数量(人)
if (!Objects.equals(exist.getFulltimeEvaluatorCount(), newEntity.getFulltimeEvaluatorCount())) {
details.add(fieldDetail(changeId, QualFilingFormStepEnum.BASIC_INFO, "备案基本信息变更",
"专职安全评价师数量(人)",
Objects.toString(exist.getFulltimeEvaluatorCount(), ""),
Objects.toString(newEntity.getFulltimeEvaluatorCount(), "")));
}
// 装备清单变更
List<QualFilingEquipmentChangeE> existingEquipments = qualFilingEquipmentChangeGateway.listByFilingId(changeId);
if (equipmentListChanged(existingEquipments, newEquipments)) {
details.add(stepDetail(changeId, QualFilingFormStepEnum.EQUIPMENT, "装备清单变更",
"装备清单", "装备清单已变更"));
// 注册安全工程师数量(人)
if (!Objects.equals(exist.getRegisteredEngineerCount(), newEntity.getRegisteredEngineerCount())) {
details.add(fieldDetail(changeId, QualFilingFormStepEnum.BASIC_INFO, "备案基本信息变更",
"注册安全工程师数量(人)",
Objects.toString(exist.getRegisteredEngineerCount(), ""),
Objects.toString(newEntity.getRegisteredEngineerCount(), "")));
}
// 材料清单变更
List<QualFilingMaterialChangeE> existingMaterials = qualFilingMaterialChangeGateway.listByFilingId(changeId);
if (materialListChanged(existingMaterials, newMaterials)) {
details.add(stepDetail(changeId, QualFilingFormStepEnum.MATERIALS, "备案材料上传变更",
"材料清单", "材料清单已变更"));
}
// 人员变更
List<QualFilingPersonnelChangeE> existingPersonnel = qualFilingPersonnelChangeGateway.listByFilingId(changeId);
if (personnelListChanged(existingPersonnel, newPersonnel)) {
details.add(stepDetail(changeId, QualFilingFormStepEnum.PERSONNEL, "备案人员管理变更",
"人员清单", "人员清单已变更"));
}
// 人员证书变更
List<QualFilingPersonnelCertChangeE> existingCerts = qualFilingPersonnelCertChangeGateway.listByFilingId(changeId);
if (certListChanged(existingCerts, newCerts)) {
details.add(stepDetail(changeId, QualFilingFormStepEnum.PERSONNEL, "备案人员证书变更",
"人员证书清单", "人员证书清单已变更"));
}
return details;
}
private boolean basicInfoChanged(QualFilingChangeEntity exist, QualFilingChangeEntity newEntity) {
return !Objects.equals(exist.getFilingTerritoryCode(), newEntity.getFilingTerritoryCode())
|| !Objects.equals(exist.getBusinessScope(), newEntity.getBusinessScope())
|| !Objects.equals(exist.getRegisterAddress(), newEntity.getRegisterAddress())
|| !Objects.equals(exist.getOfficeAddress(), newEntity.getOfficeAddress())
|| !Objects.equals(exist.getCreditCode(), newEntity.getCreditCode())
|| !Objects.equals(exist.getFilingNo(), newEntity.getFilingNo())
|| !Objects.equals(exist.getQualCertNo(), newEntity.getQualCertNo())
|| !Objects.equals(exist.getLegalRepresentative(), newEntity.getLegalRepresentative())
|| !Objects.equals(exist.getLegalPersonPhone(), newEntity.getLegalPersonPhone())
|| !Objects.equals(exist.getContactName(), newEntity.getContactName())
|| !Objects.equals(exist.getContactPhone(), newEntity.getContactPhone())
|| !Objects.equals(exist.getFax(), newEntity.getFax())
|| !Objects.equals(exist.getInfoDisclosureUrl(), newEntity.getInfoDisclosureUrl())
|| !Objects.equals(exist.getFixedAssetAmount(), newEntity.getFixedAssetAmount())
|| !Objects.equals(exist.getArchiveRoomArea(), newEntity.getArchiveRoomArea())
|| !Objects.equals(exist.getFulltimeEvaluatorCount(), newEntity.getFulltimeEvaluatorCount())
|| !Objects.equals(exist.getRegisteredEngineerCount(), newEntity.getRegisteredEngineerCount())
|| !Objects.equals(exist.getWorkplaceArea(), newEntity.getWorkplaceArea())
|| !Objects.equals(exist.getUnitIntro(), newEntity.getUnitIntro())
|| !Objects.equals(exist.getAttachmentUrl(), newEntity.getAttachmentUrl());
}
private String summarizeBasic(QualFilingChangeEntity entity) {
return entity.getFilingUnitName() + "|" + entity.getBusinessScope();
}
private boolean commitmentChanged(QualFilingCommitmentChangeE exist, QualFilingCommitmentChangeE newEntity) {
String existSig = exist == null ? "" : exist.getCommitmentContent() + "|" + exist.getLegalRepSignatureUrl()
+ "|" + exist.getSignDate() + "|" + exist.getLegalRepPersonnelId() + "|" + exist.getLegalRepName();
@ -673,27 +669,86 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
.collect(Collectors.joining(";"));
}
private boolean materialListChanged(List<QualFilingMaterialChangeE> exist, List<QualFilingMaterialChangeE> newList) {
return !materialSignature(exist).equals(materialSignature(newList));
/**
* materialType attachmentUrl
* qual_filing_material URL
*/
private List<QualFilingChangeDetailDO> diffMaterial(Long changeId
, List<QualFilingMaterialDO> existList, List<QualFilingMaterialChangeE> newList) {
List<QualFilingChangeDetailDO> details = new ArrayList<>();
// 已有材料: materialType -> attachmentUrl
Map<Integer, String> existingMap = safeList(existList).stream()
.filter(m -> m.getMaterialType() != null)
.collect(Collectors.toMap(QualFilingMaterialDO::getMaterialType,
m -> Objects.toString(m.getAttachmentUrl(), ""), (a, b) -> a));
// 新材料: materialType -> attachmentUrl
Map<Integer, String> newMap = safeList(newList).stream()
.filter(m -> m.getMaterialType() != null)
.collect(Collectors.toMap(QualFilingMaterialChangeE::getMaterialType,
m -> Objects.toString(m.getAttachmentUrl(), ""), (a, b) -> a));
// 对比每个 materialType
Set<Integer> allTypes = new HashSet<>();
allTypes.addAll(existingMap.keySet());
allTypes.addAll(newMap.keySet());
for (Integer type : allTypes) {
String existUrl = existingMap.getOrDefault(type, "");
String newUrl = newMap.getOrDefault(type, "");
if (!existUrl.equals(newUrl)) {
MaterialTypeEnum typeEnum = MaterialTypeEnum.ofCode(type);
String typeName = typeEnum != null ? typeEnum.getName() : String.valueOf(type);
details.add(fieldDetail(changeId, QualFilingFormStepEnum.MATERIALS, "备案材料上传变更",
typeName, existUrl, newUrl));
}
}
return details;
}
private String materialSignature(List<QualFilingMaterialChangeE> list) {
return safeList(list).stream()
.map(m -> m.getMaterialContent() + ":" + m.getAttachmentUrl())
.sorted()
.collect(Collectors.joining(";"));
}
private boolean personnelListChanged(List<QualFilingPersonnelChangeE> exist, List<QualFilingPersonnelChangeE> newList) {
return !personnelSignature(exist).equals(personnelSignature(newList));
}
private String personnelSignature(List<QualFilingPersonnelChangeE> list) {
return safeList(list).stream()
/**
*
* existList qual_filing_personnel org_personnel newList
*
*/
private List<QualFilingChangeDetailDO> diffManagementPersonnel(Long changeId
, List<QualFilingPersonnelDO> existList, List<QualFilingPersonnelChangeE> newList) {
List<QualFilingChangeDetailDO> details = new ArrayList<>();
// 已有管理人员: sourcePersonnelId -> personNameSQL已筛选管理人员
Map<Long, String> existingMap = safeList(existList).stream()
.filter(p -> p.getSourcePersonnelId() != null)
.collect(Collectors.toMap(QualFilingPersonnelDO::getSourcePersonnelId,
p -> Objects.toString(p.getPersonName(), ""), (a, b) -> a));
// 收集新列表中的 sourcePersonnelId查询 org_personnel 获取管理人员标识
Set<Long> newIds = safeList(newList).stream()
.map(QualFilingPersonnelChangeE::getSourcePersonnelId)
.map(String::valueOf)
.sorted()
.collect(Collectors.joining(","));
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Set<Long> managementIds = new HashSet<>(existingMap.keySet());
if (!newIds.isEmpty()) {
managementIds.addAll(orgPersonnelGateway.listByIds(newIds).stream()
.filter(p -> Boolean.TRUE.equals(p.getTechnicalDirectorFlag())
|| Boolean.TRUE.equals(p.getProcessControlLeaderFlag()))
.map(OrgPersonnelEntity::getId)
.collect(Collectors.toSet()));
}
// 新管理人员: sourcePersonnelId -> personName
Map<Long, String> newMap = safeList(newList).stream()
.filter(p -> p.getSourcePersonnelId() != null && managementIds.contains(p.getSourcePersonnelId()))
.collect(Collectors.toMap(QualFilingPersonnelChangeE::getSourcePersonnelId,
p -> Objects.toString(p.getPersonName(), ""), (a, b) -> a));
// 增加
for (Long id : newMap.keySet()) {
if (!existingMap.containsKey(id)) {
details.add(fieldDetail(changeId, QualFilingFormStepEnum.PERSONNEL, "管理人员基本情况汇总表变更",
"增加", "", newMap.get(id)));
}
}
// 减少
for (Long id : existingMap.keySet()) {
if (!newMap.containsKey(id)) {
details.add(fieldDetail(changeId, QualFilingFormStepEnum.PERSONNEL, "管理人员基本情况汇总表变更",
"减少", existingMap.get(id), ""));
}
}
return details;
}
private boolean certListChanged(List<QualFilingPersonnelCertChangeE> exist, List<QualFilingPersonnelCertChangeE> newList) {
@ -725,6 +780,20 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi {
return detail;
}
private QualFilingChangeDetailDO fieldDetail(Long changeId, QualFilingFormStepEnum step,
String content, String itemName, String before, String after) {
QualFilingChangeDetailDO detail = new QualFilingChangeDetailDO();
detail.setChangeId(changeId);
detail.setFormStepCode(step.getCode());
detail.setFormStepName(step.getName());
detail.setChangeField("field:" + step.getCode() + ":" + itemName);
detail.setChangeContent(content);
detail.setChangeItemName(itemName);
detail.setBeforeValue(before);
detail.setAfterValue(after);
return detail;
}
private QualFilingChangeCO toCO(QualFilingChangeEntity entity) {
if (entity == null) {
return null;

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.qinan.safetyeval.client.co.QualFilingPersonnelChangeInfoCO;
import org.qinan.safetyeval.infrastructure.dataobject.QualFilingPersonnelDO;
import org.qinan.safetyeval.infrastructure.persistence.domainobject.QualFilingPersonnelChangeDO;
import java.util.List;
@ -24,4 +25,13 @@ public interface QualFilingPersonnelChangeMapper extends BaseMapper<QualFilingPe
* @return
*/
List<QualFilingPersonnelChangeInfoCO> getFillingChangePersonInfo(@Param("filingChangeId") Long filingChangeId);
/**
* IDtechnical_director_flag=1 process_control_leader_flag=1
* sourcePersonnelId personName
*
* @param filingId ID
* @return
*/
List<QualFilingPersonnelDO> listManagementPersonnelByFilingId(@Param("filingId") Long filingId);
}

View File

@ -108,4 +108,15 @@
and p.delete_enum = 'false'
</select>
<!-- 根据备案ID查询管理人员只返回 sourcePersonnelId 和 personName -->
<select id="listManagementPersonnelByFilingId"
resultType="org.qinan.safetyeval.infrastructure.dataobject.QualFilingPersonnelDO">
SELECT op.id AS source_personnel_id, op.user_name AS person_name
FROM qual_filing_personnel qfp
JOIN org_personnel op ON qfp.source_personnel_id = op.id
WHERE qfp.filing_id = #{filingId}
AND qfp.delete_enum = 'false'
AND (op.technical_director_flag = 1 OR op.process_control_leader_flag = 1)
</select>
</mapper>