feat(REQ-5965) - 优化流程日志 PDF 生成逻辑

This commit is contained in:
wangli 2025-11-14 14:31:25 +08:00
parent edf617cb6b
commit cd3ee2f46a
5 changed files with 42 additions and 4 deletions

View File

@ -96,7 +96,7 @@ public interface PrintAdminApi {
* 后端请求指定流程日志 PDF 文件生成, 实现是异步的
* <p>
* 请使用 {@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
*/

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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<String> 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<ProcessLogPdfResultDTO> 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<FileConvertResultResp> taskConvertResults = RpcExternalUtil.rpcApiResultProcessor(() -> docConversionApi.queryConvertResultByBiz(request), "查询流程日志转 PDF 的结果", request);
List<ProcessLogPdfResultDTO> results = BeanMapper.copyList(taskConvertResults, ProcessLogPdfResultDTO.class, (s, t) -> {
t.setPdfFileKey(s.getResultFileFileKey());