From 5e0204cd73f83d712c059d9ab4c88400b8dcd403 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 19 Dec 2025 18:10:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(REQ-5965)=20-=20=E6=96=B0=E5=A2=9Ewps=20?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=8F=98=E9=87=8F=E6=97=B6=EF=BC=8C=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=AF=B9=E6=97=A0=E5=86=85=E5=AD=98=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=BA=E7=A9=BA=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/category/CategoryCreateDTO.java | 6 ++ .../response/category/CategoryItemVO.java | 3 + ...etProcessInstanceVariablesToObjectCmd.java | 7 +-- .../core/repository/entity/ExtAxDict.java | 5 ++ .../service/impl/CategoryServiceImpl.java | 1 + .../workflow/server/common/util/WpsUtil.java | 61 ++++++++++++++++++- .../FileArchiveProcessEventListener.java | 16 +++-- 7 files changed, 87 insertions(+), 12 deletions(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java index e478bb7cf..7800100ff 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/category/CategoryCreateDTO.java @@ -93,4 +93,10 @@ public class CategoryCreateDTO { @ApiModelProperty(value = "版本号") private Integer version; + /** + * 自定替换未设置的变量为空串 + */ + @ApiModelProperty(value = "是否自动替换变量为空串,默认false") + private Boolean autoReplaceVariables; + } diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java index 14f697fca..ee1d4865f 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/category/CategoryItemVO.java @@ -47,6 +47,9 @@ public class CategoryItemVO { @ApiModelProperty(value = "版本号") private Integer version; + @ApiModelProperty(value = "自定替换未设置的变量为空串") + private Boolean autoReplaceVariables; + @ApiModelProperty(value = "更新时间") private Date updateAt; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetProcessInstanceVariablesToObjectCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetProcessInstanceVariablesToObjectCmd.java index 15ee7e83c..6266be5cf 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetProcessInstanceVariablesToObjectCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomGetProcessInstanceVariablesToObjectCmd.java @@ -272,15 +272,10 @@ public class CustomGetProcessInstanceVariablesToObjectCmd extends AbstractComman groupVariables.forEach(group -> { if (!CollectionUtils.isEmpty(group.getVars())) { group.getVars().forEach(variable -> { - Object value = bizVariables.getOrDefault(variable.getCode(), null); - if (Objects.isNull(value)) { - // 目前为了减少 wps 替换耗时,所以将没有值的变量,直接踢出 - return; - } variables.add(VariableObjectDTO.builder() .key(variable.getCode()) .desc(group.getGroupName() + variable.getName()) - .value(value) + .value(bizVariables.getOrDefault(variable.getCode(), null)) .type(convert(variable.getType())) .build()); }); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/entity/ExtAxDict.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/entity/ExtAxDict.java index cbbd6de63..2ea1187e7 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/entity/ExtAxDict.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/entity/ExtAxDict.java @@ -84,4 +84,9 @@ public class ExtAxDict extends BaseEntity { * 版本号 */ private Integer version; + + /** + * 自定替换未设置的变量为空串 + */ + private Boolean autoReplaceVariables; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/CategoryServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/CategoryServiceImpl.java index fb77462df..8d9293004 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/CategoryServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/CategoryServiceImpl.java @@ -119,6 +119,7 @@ public class CategoryServiceImpl extends ServiceImpl dict.setIcon(dto.getIcon()); dict.setDisplayInitiateMenu(dto.getDisplayInitiateMenu()); dict.setVersion(dto.getVersion()); + dict.setAutoReplaceVariables(Boolean.TRUE.equals(dto.getAutoReplaceVariables())); } @Override diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/util/WpsUtil.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/util/WpsUtil.java index 1c8e9d116..ec16627e7 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/util/WpsUtil.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/util/WpsUtil.java @@ -29,6 +29,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -60,6 +61,60 @@ public class WpsUtil { @Resource private OrganizationalNodeUserQueryApi organizationalNodeUserQueryApi; + public String wpsFileVariableReplace(List wpsVariables, + String fileCode, String fileKey, String fileName, Boolean autoReplaceVariables) { + List variables = wpsVariables.stream() + .filter(i -> Objects.equals(i.getType().name(), VariableObjectDTO.Type.img.name()) || Objects.equals(i.getType().name(), VariableObjectDTO.Type.text.name())) + .filter(i -> { + if (Objects.equals(Boolean.TRUE, autoReplaceVariables)) { + return true; + } else { + return Objects.nonNull(i.getValue()); + } + }).collect(Collectors.toList()); + List fileReplaceContents = BeanMapper.copyList(variables, FileReplaceContent.class, (s, t) -> { + t.setKey(s.getDesc()); + if (Objects.equals(s.getType().name(), VariableObjectDTO.Type.img.name())) { + List uploadFieldDTOS = new ArrayList<>(); + if (isJson(s.getValue().toString())) { + uploadFieldDTOS.addAll(JSON.parseArray(s.getValue().toString(), UploadFieldDTO.class)); + } else { + uploadFieldDTOS.addAll(JSON.parseArray(JSON.toJSONString(s.getValue()), UploadFieldDTO.class)); + } + t.setContent(CollectionUtils.isEmpty(uploadFieldDTOS) ? "" : uploadFieldDTOS.get(0).getFileUrl()); + } else { + t.setContent(Objects.nonNull(s.getValue()) ? s.getValue().toString() : ""); + } + t.setType(s.getType().name()); + t.setPrefix("["); + t.setSuffix("]"); + }); + + // 处理空值 + if (Objects.equals(Boolean.TRUE, autoReplaceVariables)) { + fileReplaceContents.stream() + .filter(i -> !StringUtils.hasText(i.getContent())) + .forEach(i -> { + // TODO 将变量替换未空串 + }); + } + + + if (StringUtils.hasText(fileCode)) { + FileTemplateReplaceRequest request = new FileTemplateReplaceRequest(); + request.setFileCode(fileCode); + request.setFileKey(fileKey); + request.setReplaceContentList(fileReplaceContents); + return RpcExternalUtil.rpcProcessor(() -> fileTemplateApi.replaceWordText(request), "替换 WPS 文档变量", request); + } else { + SimpleFileTemplateReplaceRequest request = new SimpleFileTemplateReplaceRequest(); + request.setFileName(fileName); + request.setFileKey(fileKey); + request.setReplaceContentList(fileReplaceContents); + return RpcExternalUtil.rpcProcessor(() -> fileTemplateApi.replaceWordTextForFileKey(request), "替换 WPS 文档变量(simple)", request); + } + } + /** * 调用 wps 文件变量替换接口 * @@ -77,11 +132,13 @@ public class WpsUtil { .collect(Collectors.toList()), FileReplaceContent.class, (s, t) -> { t.setKey(s.getDesc()); if (Objects.equals(s.getType().name(), "img")) { + List uploadFieldDTOS; if (isJson(s.getValue().toString())) { - t.setContent(JSON.parseArray(s.getValue().toString(), UploadFieldDTO.class).get(0).getFileUrl()); + uploadFieldDTOS = JSON.parseArray(s.getValue().toString(), UploadFieldDTO.class); } else { - t.setContent(JSON.parseArray(JSON.toJSONString(s.getValue()), UploadFieldDTO.class).get(0).getFileUrl()); + uploadFieldDTOS = JSON.parseArray(JSON.toJSONString(s.getValue()), UploadFieldDTO.class); } + t.setContent(CollectionUtils.isEmpty(uploadFieldDTOS) ? "" : uploadFieldDTOS.get(0).getFileUrl()); } else { t.setContent(Objects.nonNull(s.getValue()) ? s.getValue().toString() : ""); } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/FileArchiveProcessEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/FileArchiveProcessEventListener.java index 301382d72..b3611ccd1 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/FileArchiveProcessEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/process/FileArchiveProcessEventListener.java @@ -4,12 +4,14 @@ import cn.axzo.workflow.common.enums.FileTypeEnum; import cn.axzo.workflow.common.model.dto.SignFileDTO; import cn.axzo.workflow.common.model.dto.VariableObjectDTO; import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf; +import cn.axzo.workflow.common.model.response.category.CategoryItemVO; import cn.axzo.workflow.core.common.context.ProcessOperationContext; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.listener.AbstractBpmnEventListener; import cn.axzo.workflow.core.listener.BpmnProcessEventListener; import cn.axzo.workflow.core.repository.entity.ExtAxDocContent; import cn.axzo.workflow.core.repository.entity.ExtAxProcessSign; +import cn.axzo.workflow.core.service.CategoryService; import cn.axzo.workflow.core.service.ExtAxDocContentService; import cn.axzo.workflow.core.service.ExtAxModelDocService; import cn.axzo.workflow.core.service.ExtAxProcessSignService; @@ -35,6 +37,8 @@ import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY; + /** * 签署业务,审批完成后,进行文件归档,并对所有工人发送业务待办 * @@ -55,6 +59,8 @@ public class FileArchiveProcessEventListener extends AbstractBpmnEventListener

wpsReplaceVariables = wpsUtil.getWpsReplaceVariables(processEngineConfiguration, instance.getId()); + processSign.getFileArchive().stream().filter(i -> Objects.equals(i.getFileType(), FileTypeEnum.WORD) || Objects.equals(i.getFileType(), FileTypeEnum.EXCEL)) .filter(i -> Boolean.TRUE.equals(i.getNeedReplaceVariables())) .forEach(docBaseVO -> { - String newFileKey = wpsUtil.wpsFileVariableReplace(wpsReplaceVariables, null, docBaseVO.getFileKey(), docBaseVO.getTemplateName() + docBaseVO.getFileType().getSuffix()); + String newFileKey = wpsUtil.wpsFileVariableReplace(wpsReplaceVariables, null, docBaseVO.getFileKey(), docBaseVO.getTemplateName() + docBaseVO.getFileType().getSuffix(), autoReplaceVariables); docBaseVO.setFileKey(newFileKey); }); // 删除非 WPS 的临时文档 @@ -116,6 +124,6 @@ public class FileArchiveProcessEventListener extends AbstractBpmnEventListener