package jnpf.dmsService; import jnpf.base.ActionResult; import jnpf.dmsEntity.storage.approval.DmsApprovedItem; import com.fasterxml.jackson.databind.ObjectMapper; import jnpf.dmsEntity.storage.approval.DmsApprovedBatch; import jnpf.dmsEntity.storage.form.*; import jnpf.dmsMapper.DmsApprovedBatchMapper; import jnpf.exception.DataException; import jnpf.file.FileContentApi; import jnpf.model.filecontent.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; /** Business orchestration: physical API -> durable task receipt -> in-module center registration. */ @Service @RequiredArgsConstructor public class DmsApprovedContentService { private final FileContentApi files; private final DmsApprovedBatchMapper progress; private final DmsApprovedFileAcceptanceService acceptance; private final ObjectMapper json; public DmsApprovedBatch register(DmsApprovedBatch batch) { DmsApprovedRegistrationCallback result = new DmsApprovedRegistrationCallback(); result.setTenantId(batch.getTenantId()); result.setBatchId(batch.getId()); result.setAttemptToken(batch.getLeaseToken()); result.setSourceDigest(batch.getSourceDigest()); for (DmsApprovedItem item : batch.getItems()) { if (!item.requiresContentRegistration()) continue; FileContentReceipt physical; try { if (item.getStorageReceipt() != null) { physical = json.readValue(item.getStorageReceipt(), FileContentReceipt.class); } else { FileContentImportForm request = new FileContentImportForm(); request.setRemoveDocxComments("xinzeng_shenhe".equals(batch.getAuditType()) || "xiuding_shenhe".equals(batch.getAuditType())); request.setDocumentId(item.getDocumentId()); request.setFileVersionId(item.getFileVersionId()); request.setFileJson(item.getFileJson()); request.setFileName(item.getDocumentName()); request.setSignaturePageId(item.getQianpiyeId()); request.setSignaturePageFiles(approvalPageFiles(item)); request.setSignaturePageValues(item.getApprovalValuesByTag()); request.setApprovalFlowVersionId(item.getApprovalFlowVersionId()); ActionResult response = files.importContent("jnpf-dms", request); if (response == null || !Integer.valueOf(200).equals(response.getCode()) || response.getData() == null) throw new DataException(response == null ? "物理存储接口无响应" : response.getMsg()); physical = response.getData(); requireReceipt(physical); String serialized = json.writeValueAsString(physical); if (progress.storePhysicalReceipt(batch.getTenantId(), batch.getId(), item.getSourceKey(), batch.getLeaseToken(), serialized) != 1) throw new DataException("物理存储结果未写入当前任务租约,停止中心登记"); item.setStorageReceipt(serialized); } } catch (java.io.IOException e) { throw new DataException("物理存储回执解析失败"); } requireReceipt(physical); DmsApprovedRegistrationCallback.StoredFile stored = new DmsApprovedRegistrationCallback.StoredFile(); stored.setSourceKey(item.getSourceKey()); stored.setFileJson(item.getFileJson()); DmsFileUploadRegisterForm content = new DmsFileUploadRegisterForm(); BeanUtils.copyProperties(physical, content); content.setDocumentId(item.getDocumentId()); content.setFileVersionId(item.getFileVersionId()); stored.setContent(content); result.getFiles().add(stored); } return acceptance.acceptStoredContent(result); } private String approvalPageFiles(DmsApprovedItem item) { if (item.getQianpiyeFiles() != null && !item.getQianpiyeFiles().isBlank()) { return item.getQianpiyeFiles(); } return item.getApprovalPageFileJson(); } private void requireReceipt(FileContentReceipt value) { if (value == null || value.getFileObjectId() == null || value.getChecksumSha256() == null || !value.getChecksumSha256().matches("[0-9a-fA-F]{64}") || value.getSizeBytes() == null || value.getSizeBytes() <= 0 || value.getStoragePlatform() == null || value.getStoragePlatform().isBlank() || value.getBucketName() == null || value.getBucketName().isBlank() || value.getObjectPath() == null || value.getObjectPath().isBlank() || value.getObjectName() == null || value.getObjectName().isBlank()) throw new DataException("物理存储回执不完整,不能登记中心文件"); } }