package jnpf.dmsService.center; import jnpf.base.UserInfo; import jnpf.dmsEntity.storage.form.DmsFileUploadRegisterForm; import jnpf.dmsEntity.storage.form.DmsFileRevisionRegisterForm; import jnpf.dmsEntity.storage.vo.DmsFileUploadVO; import jnpf.dmsMapper.DmsVersionStateMapper; import jnpf.dmsService.DmsFileUploadService; import jnpf.dmsService.DmsFileRevisionService; import jnpf.exception.DataException; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.UUID; /** Trusted in-module center entry; the caller supplies verified approval facts, never a form to look up. */ @Service @RequiredArgsConstructor public class DmsCenterRegistrationService { private final DmsFileUploadService uploads; private final DmsFileRevisionService revisions; private final DmsVersionStateMapper states; @Transactional(rollbackFor = Exception.class) public DmsFileUploadVO register(DmsFileUploadRegisterForm content, UUID baseVersionId, String revisionReason, String flowReference, String taskReference, UserInfo actor, Date approvedAt, Date scheduledAt, Date effectiveTo) { if (actor == null || actor.getTenantId() == null || actor.getUserId() == null || approvedAt == null || scheduledAt == null) throw new DataException("中心登记缺少已验证的操作人或批准日期"); // Retain the existing source namespace for idempotency of previously registered files. DmsFileUploadVO result; if (baseVersionId == null) { result = uploads.registerApproved(content, "jnpf-file", flowReference, taskReference, actor); } else { DmsFileRevisionRegisterForm revision = new DmsFileRevisionRegisterForm(); BeanUtils.copyProperties(content, revision); revision.setBaseFileVersionId(baseVersionId); revision.setRevisionReason(revisionReason); result = revisions.registerApproved(revision, "jnpf-file", flowReference, taskReference, actor); } if (result == null || !content.getDocumentId().equals(result.getDocumentId()) || !content.getFileVersionId().equals(result.getFileVersionId()) || !content.getChecksumSha256().equals(result.getChecksumSha256())) throw new DataException("中心登记结果与请求不一致"); if (states.approvePending(actor.getTenantId(), content.getFileVersionId(), approvedAt, scheduledAt, effectiveTo, actor.getUserId()) != 1) throw new DataException("文件登记批准事实失败"); return result; } }