diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/PrintAdminApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/PrintAdminApi.java index 3e4fe494c..21da22094 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/PrintAdminApi.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/manage/PrintAdminApi.java @@ -96,7 +96,7 @@ public interface PrintAdminApi { * 后端请求指定流程日志 PDF 文件生成, 实现是异步的。 *

* 请使用 {@link PrintAdminApi#queryProcessLogPdfResult(QueryProcessLogPdfDTO)} 函数查询, - * 或者使用 {@link cn.axzo.nanopart.doc.api.conversion.DocConversionApi#queryConvertResultByBiz(cn.axzo.nanopart.doc.api.conversion.req.QueryConversionTaskRequestV2)} 函数查询,该接口入参默认情况下应该为:bizCode:固定为"workflow-process-log", bizKey:为实例 ID + * 或者使用 {@link cn.axzo.nanopart.doc.api.conversion.DocConversionApi#queryConvertResultByBiz(cn.axzo.nanopart.doc.api.conversion.req.QueryConversionTaskRequestV2)} 函数查询,该接口入参默认情况下应该为:bizCode:固定为"workflow-process-log", bizKey:为实例 ID+":"+访问人 personId * * @return */ diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java index c368e3a12..11ad6951d 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/code/OtherRespCode.java @@ -22,7 +22,8 @@ public enum OtherRespCode implements IModuleRespCode { ASYNC_JOB_EXECUTION_ERROR("007", "获取指定实例 ID【{}】的锁失败"), ILLEGAL_PARAM_ERROR("008", "非法的参数:【{}】"), MESSAGE_IM_EVENT_BUILD_ERROR("009", "不能使用 createEvent 函数创建`IM 消息`的事件, 请调用 createIMEvent 函数"), - ASSIGNEE_NODE_ID_NOT_EXISTS("010", "【{}】 nodeId 不存在, 请检查参数是否正确") + ASSIGNEE_NODE_ID_NOT_EXISTS("010", "【{}】 nodeId 不存在, 请检查参数是否正确"), + CANT_GENERATE_PROCESS_LOG_PDF("011", "流程未处于终态不能用默认参数创建,请自行添加 BizCode和 BizKey"), ; private final String code; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintProcessLogPdfDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintProcessLogPdfDTO.java index 8b813bef4..883af2d55 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintProcessLogPdfDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/PrintProcessLogPdfDTO.java @@ -5,7 +5,9 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.util.StringUtils; +import javax.validation.constraints.AssertTrue; import javax.validation.constraints.NotBlank; /** @@ -45,4 +47,11 @@ public class PrintProcessLogPdfDTO { * 可不传, 默认值为:{@link PrintProcessLogPdfDTO#processInstanceId} */ private String bizKey; + + @AssertTrue(message = "bizKey和bizCode必须同时为空或同时不为空") + public boolean isBizKeyAndCodeValid() { + boolean hasBizCode = StringUtils.hasText(bizCode); + boolean hasBizKey = StringUtils.hasText(bizKey); + return hasBizCode == hasBizKey; + } } diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/QueryProcessLogPdfDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/QueryProcessLogPdfDTO.java index ec0e16a0e..299ca2865 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/QueryProcessLogPdfDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/print/QueryProcessLogPdfDTO.java @@ -5,7 +5,9 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.util.StringUtils; +import javax.validation.constraints.AssertTrue; import javax.validation.constraints.NotBlank; /** @@ -27,6 +29,13 @@ public class QueryProcessLogPdfDTO { @NotBlank(message = "审批实例 ID 不能为空") private String processInstanceId; + /** + * 访问人的 personId + */ + @ApiModelProperty(value = "对应生成时的访问人 personId") + @NotBlank(message = "访问者的 personId 不能为空") + private String personId; + /** * 自定义该审批日志的 bizCode * 可不传,默认值为: workflow-process-log @@ -38,4 +47,12 @@ public class QueryProcessLogPdfDTO { * 可不传, 默认值为:{@link QueryProcessLogPdfDTO#processInstanceId} */ private String bizKey; + + @AssertTrue(message = "bizKey和bizCode必须同时为空或同时不为空") + public boolean isBizKeyAndCodeValid() { + boolean hasBizCode = StringUtils.hasText(bizCode); + boolean hasBizKey = StringUtils.hasText(bizKey); + return hasBizCode == hasBizKey; + } + } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java index 2a27e71d4..a42ed79d6 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/manage/PrintAdminController.java @@ -59,7 +59,9 @@ import io.swagger.v3.oas.annotations.Operation; import org.apache.commons.collections4.ListUtils; import org.flowable.common.engine.api.FlowableObjectNotFoundException; import org.flowable.common.engine.impl.interceptor.CommandExecutor; +import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; +import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.task.Attachment; import org.flowable.form.api.FormInfo; import org.flowable.form.api.FormRepositoryService; @@ -93,6 +95,7 @@ import java.util.Optional; import java.util.stream.Collectors; import static cn.axzo.workflow.common.code.FormModelRespCode.FORM_MODEL_NOT_EXISTS; +import static cn.axzo.workflow.common.code.OtherRespCode.CANT_GENERATE_PROCESS_LOG_PDF; import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_IMAGE; import static cn.axzo.workflow.common.constant.FormConstants.FORM_FIELD_TYPE_INPUT; import static cn.axzo.workflow.common.constant.VariableConstants.PRINT_VAR_PROCESS_DEFINITION_KEY; @@ -182,6 +185,8 @@ public class PrintAdminController implements PrintAdminApi { private DocConversionApi docConversionApi; @Resource private SupportRefreshProperties refreshProperties; + @Resource + private RuntimeService runtimeService; /** * 查询指定流程实例是否能使用打印 @@ -594,9 +599,15 @@ public class PrintAdminController implements PrintAdminApi { @PostMapping("/process/log/pdf") @Override public CommonResponse createProcessLogPdf(@Validated @RequestBody PrintProcessLogPdfDTO dto) { + if (!StringUtils.hasText(dto.getBizCode())) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(dto.getProcessInstanceId()).singleResult(); + if (Objects.nonNull(processInstance)) { + throw new WorkflowEngineException(CANT_GENERATE_PROCESS_LOG_PDF); + } + } SubmitConversionTaskRequest request = new SubmitConversionTaskRequest(); request.setBizCode(StringUtils.hasText(dto.getBizCode()) ? dto.getBizCode() : "workflow-process-log"); - request.setBizKey(StringUtils.hasText(dto.getBizKey()) ? dto.getBizKey() : dto.getProcessInstanceId()); + request.setBizKey(StringUtils.hasText(dto.getBizKey()) ? dto.getBizKey() : dto.getProcessInstanceId() + ":" + dto.getPersonId()); request.setConversionType(DocConversionTypeEnum.HTML_URL_TO_PDF); request.setFileName(String.format(refreshProperties.getProcessLogHtmlUrl(), dto.getProcessInstanceId(), dto.getPersonId())); String taskId = RpcExternalUtil.rpcApiResultProcessor(() -> docConversionApi.submitConvertTask(request), "创建网页转 PDF 的异步任务", request); @@ -609,7 +620,7 @@ public class PrintAdminController implements PrintAdminApi { public CommonResponse queryProcessLogPdfResult(@Validated @RequestBody QueryProcessLogPdfDTO dto) { QueryConversionTaskRequestV2 request = new QueryConversionTaskRequestV2(); request.setBizCode(StringUtils.hasText(dto.getBizCode()) ? dto.getBizCode() : "workflow-process-log"); - request.setBizKeys(Lists.newArrayList(StringUtils.hasText(dto.getBizKey()) ? dto.getBizKey() : dto.getProcessInstanceId())); + request.setBizKeys(Lists.newArrayList(StringUtils.hasText(dto.getBizKey()) ? dto.getBizKey() : dto.getProcessInstanceId() + ":" + dto.getPersonId())); List taskConvertResults = RpcExternalUtil.rpcApiResultProcessor(() -> docConversionApi.queryConvertResultByBiz(request), "查询流程日志转 PDF 的结果", request); List results = BeanMapper.copyList(taskConvertResults, ProcessLogPdfResultDTO.class, (s, t) -> { t.setPdfFileKey(s.getResultFileFileKey());