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<FileContentReceipt> 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("物理存储回执不完整,不能登记中心文件");
|
}
|
}
|