diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingChangeExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingChangeExecutor.java index a8c5240f..e53529de 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingChangeExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingChangeExecutor.java @@ -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 equipmentEntities, List materialEntities , List personnelEntities, List personnelCertEntities) { Long changeId = cmd.getOriginChangeFilingId(); - List details = diffFromCmd(changeId - , entity, commitmentEntity, equipmentEntities - , materialEntities, personnelEntities, personnelCertEntities); + List 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 diffFromCmd( - Long changeId, QualFilingChangeEntity newEntity, QualFilingCommitmentChangeE newCommitment, - List newEquipments, List newMaterials, - List newPersonnel, List newCerts) { + private List diffBasicInfoDetail( + Long changeId, QualFilingChangeEntity newEntity, AggregationSaveOrEditQualFilingChangeCmd cmd) { + QualFilingDO filingDO = qualFilingMapper.selectOne( + new LambdaQueryWrapper() + .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 diffMaterialDetail( + Long changeId, List newMaterials, AggregationSaveOrEditQualFilingChangeCmd cmd) { + List existingMaterials = qualFilingMaterialMapper.selectList( + new LambdaQueryWrapper() + .select(QualFilingMaterialDO::getMaterialType, + QualFilingMaterialDO::getAttachmentUrl) + .eq(QualFilingMaterialDO::getFilingId, cmd.getQualFilingChangeAddCmd().getFilingId())); + return diffMaterial(changeId, existingMaterials, newMaterials); + } + + /** + * 管理人员变更明细 + */ + private List diffManagementPersonnelDetail( + Long changeId, List newPersonnel, + AggregationSaveOrEditQualFilingChangeCmd cmd) { + List existingMgmtPersonnel = qualFilingPersonnelChangeMapper + .listManagementPersonnelByFilingId(cmd.getQualFilingChangeAddCmd().getFilingId()); + return diffManagementPersonnel(changeId, existingMgmtPersonnel, newPersonnel); + } + + /** + * 基本信息变更明细(仅对比法定代表人、专职安全评价师数量、注册安全工程师数量) + */ + private List diffBasicInfo(Long changeId, QualFilingDO exist, QualFilingChangeEntity newEntity) { List 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 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 existingMaterials = qualFilingMaterialChangeGateway.listByFilingId(changeId); - if (materialListChanged(existingMaterials, newMaterials)) { - details.add(stepDetail(changeId, QualFilingFormStepEnum.MATERIALS, "备案材料上传变更", - "材料清单", "材料清单已变更")); - } - - // 人员变更 - List existingPersonnel = qualFilingPersonnelChangeGateway.listByFilingId(changeId); - if (personnelListChanged(existingPersonnel, newPersonnel)) { - details.add(stepDetail(changeId, QualFilingFormStepEnum.PERSONNEL, "备案人员管理变更", - "人员清单", "人员清单已变更")); - } - - // 人员证书变更 - List 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 exist, List newList) { - return !materialSignature(exist).equals(materialSignature(newList)); + /** + * 材料变更明细(按 materialType 对比 attachmentUrl)。 + * 原始数据来自 qual_filing_material,新数据来自本次提交,每个材料类型 URL 变更各生成一条明细。 + */ + private List diffMaterial(Long changeId + , List existList, List newList) { + List details = new ArrayList<>(); + // 已有材料: materialType -> attachmentUrl + Map 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 newMap = safeList(newList).stream() + .filter(m -> m.getMaterialType() != null) + .collect(Collectors.toMap(QualFilingMaterialChangeE::getMaterialType, + m -> Objects.toString(m.getAttachmentUrl(), ""), (a, b) -> a)); + // 对比每个 materialType + Set 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 list) { - return safeList(list).stream() - .map(m -> m.getMaterialContent() + ":" + m.getAttachmentUrl()) - .sorted() - .collect(Collectors.joining(";")); - } - - private boolean personnelListChanged(List exist, List newList) { - return !personnelSignature(exist).equals(personnelSignature(newList)); - } - - private String personnelSignature(List list) { - return safeList(list).stream() + /** + * 管理人员变更明细。 + * existList 为从 qual_filing_personnel 关联 org_personnel 查出的管理人员,newList 为本次提交的人员变更。 + * 每个增加或减少的管理人员各生成一条变更明细。 + */ + private List diffManagementPersonnel(Long changeId + , List existList, List newList) { + List details = new ArrayList<>(); + // 已有管理人员: sourcePersonnelId -> personName(SQL已筛选管理人员) + Map 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 newIds = safeList(newList).stream() .map(QualFilingPersonnelChangeE::getSourcePersonnelId) - .map(String::valueOf) - .sorted() - .collect(Collectors.joining(",")); + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Set 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 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 exist, List newList) { @@ -712,7 +767,7 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi { } private QualFilingChangeDetailDO stepDetail(Long changeId, QualFilingFormStepEnum step, - String content, String before, String after) { + String content, String before, String after) { QualFilingChangeDetailDO detail = new QualFilingChangeDetailDO(); detail.setChangeId(changeId); detail.setFormStepCode(step.getCode()); @@ -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; diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/mapper/QualFilingPersonnelChangeMapper.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/mapper/QualFilingPersonnelChangeMapper.java index d10b4073..51dbc509 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/mapper/QualFilingPersonnelChangeMapper.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/persistence/mapper/QualFilingPersonnelChangeMapper.java @@ -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 getFillingChangePersonInfo(@Param("filingChangeId") Long filingChangeId); + + /** + * 根据备案ID查询管理人员(technical_director_flag=1 或 process_control_leader_flag=1), + * 只返回 sourcePersonnelId 和 personName。 + * + * @param filingId 备案ID + * @return 管理人员列表 + */ + List listManagementPersonnelByFilingId(@Param("filingId") Long filingId); } diff --git a/safety-eval-infrastructure/src/main/resources/mapper/QualFilingPersonnelChangeMapper.xml b/safety-eval-infrastructure/src/main/resources/mapper/QualFilingPersonnelChangeMapper.xml index 051936b6..7af63ca1 100644 --- a/safety-eval-infrastructure/src/main/resources/mapper/QualFilingPersonnelChangeMapper.xml +++ b/safety-eval-infrastructure/src/main/resources/mapper/QualFilingPersonnelChangeMapper.xml @@ -108,4 +108,15 @@ and p.delete_enum = 'false' + + + \ No newline at end of file