From 5298b5f3206de768f7a457670ea44bb03a141660 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 22 Oct 2025 10:09:38 +0800 Subject: [PATCH] =?UTF-8?q?feat=20-=20=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BB=85=E4=B8=9A=E5=8A=A1=E8=87=AA=E5=AE=9A=E4=B9=89=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=98=AF=E5=8F=91=E7=8E=B0=E7=9A=84=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/model/dto/CustomDocDTO.java | 11 +++++++- .../process/BpmnProcessInstanceCreateDTO.java | 11 ++++++++ .../impl/BpmnProcessInstanceServiceImpl.java | 8 +++++- .../server/WorkflowEngineApplication.java | 2 +- ...opyTemplateFileTaskEvent_105_Listener.java | 28 +++++++++++-------- .../server/controller/web/TestController.java | 25 +++++++++++++++++ 6 files changed, 70 insertions(+), 15 deletions(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/CustomDocDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/CustomDocDTO.java index 73b87367b..40d4f5de5 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/CustomDocDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/CustomDocDTO.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; import java.io.Serializable; /** @@ -23,7 +24,10 @@ import java.io.Serializable; public class CustomDocDTO implements Serializable { private static final long serialVersionUID = -8709597975507074853L; - + /** + * 该属性内部使用,无需赋值 + */ + private Long id; /** * 文件名称,可能会包含变量 */ @@ -40,6 +44,11 @@ public class CustomDocDTO implements Serializable { * wps 文件的标识,通过{@link cn.axzo.nanopart.doc.api.anonymous.DocAnonymousDatabaseApi#createFile(cn.axzo.nanopart.doc.api.anonymous.request.AnonymousCreateFileRequest)} 接口创建文件后返回的 fileCode */ private String fileCode; + /** + * oss 地址的文件标识 + */ + @NotBlank(message = "文件的 oss key 不能为空") + private String fileKey; /** * 文件的类型 diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java index 8e05cd85b..88cfab976 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCreateDTO.java @@ -11,6 +11,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.commons.lang3.math.NumberUtils; +import org.springframework.util.CollectionUtils; import javax.validation.Valid; import javax.validation.constraints.NotBlank; @@ -149,4 +150,14 @@ public class BpmnProcessInstanceCreateDTO extends BpmnProcessInstanceCreateWithF } return null; } + + public List getCustomDocs() { + if (CollectionUtils.isEmpty(customDocs)) { + return customDocs; + } + for (int i = 0; i < customDocs.size(); i++) { + customDocs.get(i).setId(i - (i + 1L)); // 负数 ID,避免冲突 + } + return customDocs; + } } \ No newline at end of file diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java index 4399045f0..45d59fca0 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java @@ -1907,6 +1907,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic } private List getAndAddBizCustomDocs(String processInstanceId, List docs) { + HistoricProcessInstance processInstance = null; + if (CollectionUtils.isEmpty(docs)) { + processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + } List bizCustomDocs = Optional.ofNullable( runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOCS, List.class)) .orElse(Collections.emptyList()); @@ -1925,7 +1929,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic } int baseOrder = baseOpt.map(DocBaseVO::getOrder).orElse(0); - String tenantId = baseOpt.map(DocBaseVO::getTenantId).orElse(null); + String tenantId = baseOpt.map(DocBaseVO::getTenantId).orElse(Objects.nonNull(processInstance) ? processInstance.getTenantId() : null); AtomicInteger orderCounter = new AtomicInteger(baseOrder); int delta = appendLast ? 1 : -1; @@ -1933,8 +1937,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic List docBaseVOS = BeanMapper.copyList(bizCustomDocs, DocBaseVO.class, (s, t) -> { t.setStatus(true); t.setTempFile(false); + t.setTemplateName(s.getFileName()); t.setOrder(orderCounter.addAndGet(delta)); t.setTenantId(tenantId); + t.setFileRelationId(s.getFileKey()); }); if (appendLast) { diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/WorkflowEngineApplication.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/WorkflowEngineApplication.java index 31e42d3b1..5a3685b65 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/WorkflowEngineApplication.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/WorkflowEngineApplication.java @@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @MapperScan({"cn.axzo.workflow.core.**.mapper", "cn.axzo.workflow.admin.**.mapper"}) -@ComponentScan({"cn.axzo.workflow"}) +@ComponentScan({"cn.axzo.workflow", "cn.axzo.oss"}) @EnableFeignClients({"cn.axzo.oss", "cn.axzo.riven.client.feign", "cn.axzo.msg.center", "cn.axzo.basics.profiles"}) @SpringBootApplication(exclude = RabbitAutoConfiguration.class) @EnableTransactionManagement diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/FirstCopyTemplateFileTaskEvent_105_Listener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/FirstCopyTemplateFileTaskEvent_105_Listener.java index 61a003629..29f567740 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/FirstCopyTemplateFileTaskEvent_105_Listener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/FirstCopyTemplateFileTaskEvent_105_Listener.java @@ -94,24 +94,28 @@ public class FirstCopyTemplateFileTaskEvent_105_Listener extends AbstractBpmnEve processSign.setProcessInstanceId(processInstanceId); processSign.setSignType(signConfig.get().getSignType().getType()); processSign.setPendingMessageId(signConfig.get().getSignPendingProperty().getPendingMessageId()); - if (CollectionUtils.isEmpty(docs)) { + + // 业务自定义文档 + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + List customDocs = runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOCS, List.class); + + if (CollectionUtils.isEmpty(docs) && CollectionUtils.isEmpty(customDocs)) { processSign.setDocTemplate(Collections.emptyList()); processSign.setFileArchive(Collections.emptyList()); } else { // 复制基础模板 List docTemplates = copyTempTemplate(docs); - // 处理业务自定义文档 - RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); - List customDocs = runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOCS, List.class); + List customDocTemplates = new ArrayList<>(); - for (int i = 0; i < customDocs.size(); i++) { + for (CustomDocDTO customDoc : customDocs) { customDocTemplates.add(SignFileDTO.builder() - .id(i - (i + 1L)) // 负数 ID,避免冲突 - .fileName(customDocs.get(i).getFileName()) - .templateName(customDocs.get(i).getFileName()) - .fileTag(customDocs.get(i).getFileTag()) - .fileCode(customDocs.get(i).getFileCode()) - .fileType(customDocs.get(i).getFileType()) + .id(customDoc.getId()) + .fileName(customDoc.getFileName()) + .templateName(customDoc.getFileName()) + .fileTag(customDoc.getFileTag()) + .fileCode(customDoc.getFileCode()) + .fileKey(customDoc.getFileKey()) + .fileType(customDoc.getFileType()) .build()); } @@ -142,7 +146,7 @@ public class FirstCopyTemplateFileTaskEvent_105_Listener extends AbstractBpmnEve signFileDTO.setFileType(template.getFileType()); signFileDTO.setFileCode(template.getFileCode()); if (Objects.equals(template.getFileType(), FileTypeEnum.WORD) || Objects.equals(template.getFileType(), FileTypeEnum.EXCEL)) { - String fileKey = wpsUtil.wpsFileVariableReplace(wpsReplaceVariables, template.getFileCode(), null, template.getTemplateName() + template.getFileType().getSuffix()); + String fileKey = wpsUtil.wpsFileVariableReplace(wpsReplaceVariables, template.getFileCode(), template.getFileKey(), template.getTemplateName() + template.getFileType().getSuffix()); signFileDTO.setFileKey(fileKey); } archives.add(signFileDTO); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java index ffd36aa5c..cee43032d 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java @@ -1,6 +1,9 @@ package cn.axzo.workflow.server.controller.web; import cn.axzo.framework.domain.ServiceException; +import cn.axzo.oss.http.api.ServerFileServiceSdk; +import cn.axzo.oss.http.model.ServerFileUploadSdkRequest; +import cn.axzo.oss.http.model.ServerFileUploadSdkResponse; import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi; import cn.axzo.workflow.common.model.dto.VariableObjectDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO; @@ -22,6 +25,7 @@ import cn.axzo.workflow.server.xxljob.SpecifyProcessInstanceSyncEsJobHandler; import cn.azxo.framework.common.model.CommonResponse; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.flowable.bpmn.model.FlowElement; import org.flowable.common.engine.impl.interceptor.CommandExecutor; @@ -53,6 +57,8 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Paths; import java.util.Date; import java.util.List; import java.util.Map; @@ -110,6 +116,10 @@ public class TestController { private SpecifyProcessInstanceSyncEsJobHandler specifyProcessInstanceSyncEsJobHandler; @Resource private TaskService taskService; + @Resource + private SupportRefreshProperties refreshProperties; + @Resource + private ServerFileServiceSdk serverFileServiceSdk; @RepeatSubmit @GetMapping("/test") @@ -397,5 +407,20 @@ public class TestController { taskService.complete(taskId); return CommonResponse.success(true); } + + @GetMapping("/properties/refresh") + public CommonResponse refreshProperties() { + return CommonResponse.success(JSON.toJSONString(refreshProperties)); + } + + @PostMapping("/server/file/upload") + @SneakyThrows + public CommonResponse serverFileUpload(@RequestBody ServerFileUploadSdkRequest request) { + String filePath = "/Users/wangli/Downloads/锦绣碧湖B区B-1工程模板施工专项方案4-30.docx"; + byte[] fileBytes = Files.readAllBytes(Paths.get(filePath)); + request.setFileContent(fileBytes); + ServerFileUploadSdkResponse serverFileUploadSdkResponse = serverFileServiceSdk.uploadFile(request); + return CommonResponse.success(JSON.toJSONString(serverFileUploadSdkResponse)); + } }