package jnpf.dmsService;
|
|
import jnpf.dmsEntity.storage.enums.DmsWorkflowFileType;
|
import jnpf.dmsEntity.storage.form.DmsWorkflowFileForm;
|
import jnpf.dmsEntity.storage.form.DmsWorkflowFilePrepareForm;
|
import jnpf.dmsEntity.storage.form.DmsWorkflowUploadRegisterForm;
|
import jnpf.dmsEntity.storage.form.DmsWorkflowRevisionRegisterForm;
|
import jnpf.dmsEntity.storage.vo.DmsFileUploadVO;
|
import jnpf.dmsEntity.storage.vo.DmsWorkflowFilePrepareVO;
|
import jnpf.exception.DataException;
|
import jnpf.flowable.WorkFlowApi;
|
import jnpf.flowable.entity.TaskEntity;
|
import jnpf.flowable.enums.TaskStatusEnum;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.Objects;
|
|
@Service
|
@RequiredArgsConstructor
|
public class DmsWorkflowFileRegistrationService {
|
private final DmsWorkflowFilePrepareService prepareService;
|
private final DmsFileUploadService uploadService;
|
private final DmsFileRevisionService revisionService;
|
private final WorkFlowApi workFlowApi;
|
|
@Transactional(rollbackFor = Exception.class)
|
public DmsFileUploadVO upload(DmsWorkflowUploadRegisterForm form, String serviceId) {
|
DmsWorkflowFileForm workflow = form.getWorkflow();
|
DmsWorkflowFilePrepareVO context = validate(workflow, DmsWorkflowFileType.CREATE,
|
form.getSourceId(), form.getApprovedFileJson(), serviceId);
|
requireSame(context.getVersionLabel(), form.getVersionLabel());
|
requireSame(workflow.getFolderId(), form.getFolderId());
|
requireSame(workflow.getDocumentNo().trim(), form.getDocumentNo());
|
requireSame(workflow.getDocumentName().trim(), form.getDocumentName());
|
requireSame(workflow.getResponsibleDeptId().trim(), form.getResponsibleDeptId());
|
requireSame(workflow.getPreparedBy().trim(), form.getPreparedBy());
|
requireSame(workflow.getPreparedOn(), form.getPreparedOn());
|
DmsFileUploadVO result = uploadService.registerWorkflowPending(form, serviceId,
|
workflow.getSourceId().trim(), workflow.getTaskId().trim());
|
// 审核单锁一直持有至本事务结束;提交前复核任务仍可接受暂存。
|
requireStageableTask(workflow);
|
return result;
|
}
|
|
@Transactional(rollbackFor = Exception.class)
|
public DmsFileUploadVO revise(DmsWorkflowRevisionRegisterForm form, String serviceId) {
|
DmsWorkflowFileForm workflow = form.getWorkflow();
|
DmsWorkflowFilePrepareVO context = validate(workflow, DmsWorkflowFileType.REVISE,
|
form.getSourceId(), form.getApprovedFileJson(), serviceId);
|
requireSame(context.getDocumentId(), form.getDocumentId());
|
requireSame(workflow.getVersionId(), form.getBaseFileVersionId());
|
requireSame(context.getVersionLabel(), form.getVersionLabel());
|
requireSame(context.getRevisionReason(), form.getRevisionReason());
|
requireSame(workflow.getPreparedBy().trim(), form.getPreparedBy());
|
requireSame(workflow.getPreparedOn(), form.getPreparedOn());
|
DmsFileUploadVO result = revisionService.registerWorkflowPending(form, serviceId,
|
workflow.getSourceId().trim(), workflow.getTaskId().trim());
|
requireStageableTask(workflow);
|
return result;
|
}
|
|
private DmsWorkflowFilePrepareVO validate(DmsWorkflowFileForm workflow, DmsWorkflowFileType type,
|
String sourceKey, String approvedFile, String serviceId) {
|
if (workflow == null || workflow.getFileType() != type) {
|
throw new DataException("工作流登记上下文无效");
|
}
|
requireStageableTask(workflow);
|
DmsWorkflowFilePrepareVO context = prepareService.prepare(
|
DmsWorkflowFilePrepareForm.from(workflow), serviceId);
|
requireSame(context.getSourceKey(), sourceKey);
|
requireSame(context.getApprovedFileJson(), approvedFile);
|
return context;
|
}
|
|
private void requireSame(Object approved, Object registered) {
|
if (approved == null || !Objects.equals(approved, registered)) {
|
throw new DataException("登记内容与审核预校验结果不一致,请重新提交");
|
}
|
}
|
|
private void requireStageableTask(DmsWorkflowFileForm workflow) {
|
TaskEntity task = workFlowApi.getInfoSubmit(workflow.getTaskId().trim());
|
if (task == null || !workflow.getTaskId().trim().equals(task.getId())
|
|| !stageable(task.getStatus())) {
|
throw new DataException("流程任务不存在或已结束,不能暂存文件");
|
}
|
String flowId = workflow.getSourceId().trim();
|
if (!flowId.equals(task.getFlowId()) && !flowId.equals(task.getTemplateId())) {
|
throw new DataException("流程任务不属于指定flowID");
|
}
|
}
|
|
private boolean stageable(Integer status) {
|
return TaskStatusEnum.TO_BE_SUBMIT.getCode().equals(status)
|
|| TaskStatusEnum.RUNNING.getCode().equals(status);
|
}
|
}
|