package jnpf.dmsService; import jnpf.dmsEntity.DmsWenjianBanbenEntity; import jnpf.dmsEntity.DmsWenjianZiyuanEntity; import jnpf.dmsEntity.permission.entity.DmsFileVersionEntity; import jnpf.dmsEntity.storage.entity.DmsFileObjectEntity; import jnpf.dmsMapper.DmsFileObjectMapper; import jnpf.dmsMapper.DmsFileVersionMapper; import jnpf.dmsMapper.DmsWenjianBanbenMapper; import jnpf.dmsMapper.DmsWenjianZiyuanMapper; import jnpf.exception.DataException; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.UUID; @Service @RequiredArgsConstructor public class DmsWorkflowFileResolutionService { private final DmsWenjianZiyuanMapper businessFileMapper; private final DmsWenjianBanbenMapper businessVersionMapper; private final DmsFileVersionMapper fileVersionMapper; private final DmsFileObjectMapper fileObjectMapper; public ResolvedFile resolve(String tenantId, String detailId, String fileReferenceId, String fileNumber, String fileName, String versionLabel) { DmsWenjianZiyuanEntity businessFile = resolveBusinessFile( tenantId, detailId, fileReferenceId, fileNumber); String requestedNumber = trimToNull(fileNumber); if (requestedNumber != null && !requestedNumber.equals(businessFile.getWenjianBianhao())) { throw new DataException("申请明细的文件编号与文件资产不一致:" + detailId); } String requestedName = trimToNull(fileName); if (requestedName != null && !requestedName.equals(businessFile.getWenjianMingcheng())) { throw new DataException("申请明细的文件名称与文件资产不一致:" + detailId); } String requestedVersion = trimToNull(versionLabel); DmsWenjianBanbenEntity businessVersion = requestedVersion == null ? businessVersionMapper.selectById(tenantId, requiredText(businessFile.getDangqianBanbenId(), "文件资产缺少当前版本")) : businessVersionMapper.selectByFileAndVersionLabel( tenantId, businessFile.getId(), requestedVersion); if (businessVersion == null) { throw new DataException("申请对应的业务文件版本不存在:" + detailId); } UUID fileVersionId; try { fileVersionId = UUID.fromString(requiredText(businessVersion.getWenjianZhongxinBanbenId(), "业务文件版本尚未关联文件中心版本")); } catch (IllegalArgumentException exception) { throw new DataException("业务文件版本关联的文件中心版本ID无效:" + detailId); } DmsFileVersionEntity fileVersion = fileVersionMapper.selectReadableByTenantAndId( tenantId, fileVersionId); DmsFileObjectEntity fileObject = fileObjectMapper.selectByTenantAndFileVersionId( tenantId, fileVersionId); if (fileVersion == null || fileObject == null) { throw new DataException("申请对应的文件中心版本或存储对象不存在:" + detailId); } String documentId = trimToNull(businessFile.getWenjianZhongxinWenjianId()); if (documentId != null && !fileVersion.getDocumentId().toString().equals(documentId)) { throw new DataException("业务文件与文件中心版本不匹配:" + detailId); } return new ResolvedFile(businessFile, businessVersion, fileVersion); } private DmsWenjianZiyuanEntity resolveBusinessFile( String tenantId, String detailId, String fileReferenceId, String fileNumber) { String referenceId = trimToNull(fileReferenceId); DmsWenjianZiyuanEntity result = null; if (referenceId != null) { result = businessFileMapper.selectByIdForUpdate(tenantId, referenceId); if (result == null) { result = businessFileMapper.selectActiveByNumberDetailForUpdate(tenantId, referenceId); } } if (result == null) { String requestedNumber = requiredText(fileNumber, "申请明细无法定位文件资产:" + detailId); result = businessFileMapper.selectActiveByNumberForUpdate(tenantId, requestedNumber); } if (result == null) { throw new DataException("申请明细关联的文件资产不存在:" + detailId); } return result; } private String requiredText(String value, String message) { String normalized = trimToNull(value); if (normalized == null) { throw new DataException(message); } return normalized; } private String trimToNull(String value) { return value == null || value.trim().isEmpty() ? null : value.trim(); } @Getter @RequiredArgsConstructor public static final class ResolvedFile { private final DmsWenjianZiyuanEntity businessFile; private final DmsWenjianBanbenEntity businessVersion; private final DmsFileVersionEntity fileVersion; } }