feat(REQ-3769) - 解决一些兼容问题

This commit is contained in:
wangli 2025-04-17 19:33:00 +08:00
parent 4677aa7bf2
commit 0040b6e233
5 changed files with 54 additions and 25 deletions

View File

@ -3,6 +3,7 @@ package cn.axzo.workflow.client.feign.bpmn;
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.model.dto.SignFileDTO;
import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
@ -318,4 +319,13 @@ public interface ProcessInstanceApi {
@PostMapping("/api/process/instance/approver/read/status/change")
@InvokeMode(SYNC)
CommonResponse<Boolean> approveReadStatusChange(@Validated @RequestBody ChangeApproverReadStatusDTO dto);
/**
* 获取签署业务流程最后替换的文档 fileKey 集合
*
* @return
*/
@Operation(summary = "获取签署业务流程最后替换的文档 fileKey 集合")
@GetMapping("/api/process/instance/final/docs")
CommonResponse<List<SignFileDTO>> getProcessInstanceFinalDocs(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId);
}

View File

@ -46,14 +46,33 @@ public class WpsUtil {
/**
* 调用 wps 文件变量替换接口
*
* @param processEngineConfiguration
* @param processInstanceId
* @param fileCode 基于该模板进行变量替换
* @param fileKey 如果有值则变量替换完成后直接将文档覆盖该 fileKey 对应的文件
* @return 返回替换变量后的文件oss fileKey
*/
public String wpsFileVariableReplace(ProcessEngineConfigurationImpl processEngineConfiguration,
String processInstanceId, String fileCode, String fileKey) {
public String wpsFileVariableReplace(List<VariableObjectDTO> wpsVariables,
String fileCode, String fileKey) {
FileTemplateReplaceRequest request = new FileTemplateReplaceRequest();
request.setFileCode(fileCode);
request.setFileKey(fileKey);
request.setReplaceContentList(BeanMapper.copyList(wpsVariables.stream()
.filter(i -> Objects.equals(i.getType().name(), "img") || Objects.equals(i.getType().name(), "text"))
.collect(Collectors.toList()), FileReplaceContent.class, (s, t) -> {
if (Objects.equals(s.getType().name(), "img")) {
if (isJson(s.getValue().toString())) {
t.setContent(JSON.parseArray(s.getValue().toString(), UploadFieldDTO.class).get(0).getFileUrl());
} else {
t.setContent(JSON.parseArray(JSON.toJSONString(s.getValue()), UploadFieldDTO.class).get(0).getFileUrl());
}
} else {
t.setContent(Objects.nonNull(s.getValue()) ? s.getValue().toString() : "");
}
t.setType(s.getType().name());
}));
return RpcExternalUtil.rpcProcessor(() -> fileTemplateApi.replaceWordText(request), "替换 WPS 文档变量", request);
}
public List<VariableObjectDTO> getWpsReplaceVariables(ProcessEngineConfigurationImpl processEngineConfiguration, String processInstanceId) {
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor();
List<VariableObjectDTO> wpsVariables =
commandExecutor.execute(new CustomGetProcessInstanceVariablesToObjectCmd(processInstanceId));
@ -79,24 +98,7 @@ public class WpsUtil {
}
});
wpsVariables.addAll(signatureAndAdvices);
FileTemplateReplaceRequest request = new FileTemplateReplaceRequest();
request.setFileCode(fileCode);
request.setFileKey(fileKey);
request.setReplaceContentList(BeanMapper.copyList(wpsVariables.stream()
.filter(i -> Objects.equals(i.getType().name(), "img") || Objects.equals(i.getType().name(), "text"))
.collect(Collectors.toList()), FileReplaceContent.class, (s, t) -> {
if (Objects.equals(s.getType().name(), "img")) {
if (isJson(s.getValue().toString())) {
t.setContent(JSON.parseArray(s.getValue().toString(), UploadFieldDTO.class).get(0).getFileUrl());
} else {
t.setContent(JSON.parseArray(JSON.toJSONString(s.getValue()), UploadFieldDTO.class).get(0).getFileUrl());
}
} else {
t.setContent(Objects.nonNull(s.getValue()) ? s.getValue().toString() : "");
}
t.setType(s.getType().name());
}));
return RpcExternalUtil.rpcProcessor(() -> fileTemplateApi.replaceWordText(request), "替换 WPS 文档变量", request);
return wpsVariables;
}
public void deleteWpsFile(String wpsCode) {

View File

@ -1,6 +1,7 @@
package cn.axzo.workflow.server.controller.listener.activity;
import cn.axzo.workflow.common.enums.FileTypeEnum;
import cn.axzo.workflow.common.model.dto.VariableObjectDTO;
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
import cn.axzo.workflow.core.common.context.ActivityOperationContext;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
@ -20,6 +21,7 @@ import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@ -52,10 +54,11 @@ public class TempFileArchiveActivityEvent_101_Listener extends AbstractBpmnEvent
}
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
ExtAxProcessSign processSign = extAxProcessSignService.findByProcessInstanceId(execution.getProcessInstanceId());
List<VariableObjectDTO> wpsReplaceVariables = wpsUtil.getWpsReplaceVariables(processEngineConfiguration, execution.getProcessInstanceId());
processSign.getFileArchive().stream().filter(i -> Objects.equals(i.getFileType(), FileTypeEnum.WORD)
|| Objects.equals(i.getFileType(), FileTypeEnum.EXCEL))
.forEach(docBaseVO -> {
String newFileKey = wpsUtil.wpsFileVariableReplace(processEngineConfiguration, execution.getProcessInstanceId(), docBaseVO.getFileCode(), docBaseVO.getFileKey());
String newFileKey = wpsUtil.wpsFileVariableReplace(wpsReplaceVariables, docBaseVO.getFileCode(), docBaseVO.getFileKey());
docBaseVO.setFileKey(newFileKey);
});
extAxProcessSignService.updateById(processSign);

View File

@ -4,6 +4,7 @@ import cn.axzo.nanopart.doc.api.anonymous.DocAnonymousDatabaseApi;
import cn.axzo.nanopart.doc.api.index.request.CopyNodeRequest;
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.bpmn.model.doc.DocBaseVO;
import cn.axzo.workflow.core.common.context.ProcessOperationContext;
@ -112,6 +113,7 @@ public class FileArchiveProcessEventListener extends AbstractBpmnEventListener<P
private List<SignFileDTO> replaceTemplateVariable(List<SignFileDTO> docTemplates, ProcessEngineConfigurationImpl processEngineConfiguration, String processInstanceId) {
List<SignFileDTO> archives = new ArrayList<>();
List<VariableObjectDTO> wpsReplaceVariables = wpsUtil.getWpsReplaceVariables(processEngineConfiguration, processInstanceId);
docTemplates.forEach(template -> {
SignFileDTO signFileDTO = new SignFileDTO();
signFileDTO.setId(template.getId());
@ -119,7 +121,7 @@ public class FileArchiveProcessEventListener extends AbstractBpmnEventListener<P
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(processEngineConfiguration, processInstanceId, template.getFileCode(), null);
String fileKey = wpsUtil.wpsFileVariableReplace(wpsReplaceVariables, template.getFileCode(), null);
signFileDTO.setFileKey(fileKey);
}
archives.add(signFileDTO);
@ -177,10 +179,11 @@ public class FileArchiveProcessEventListener extends AbstractBpmnEventListener<P
private void archiveFinalDocs(HistoricProcessInstance instance) {
ProcessEngineConfigurationImpl processEngineConfiguration = (ProcessEngineConfigurationImpl) getEngineConfiguration();
ExtAxProcessSign processSign = extAxProcessSignService.findByProcessInstanceId(instance.getId());
List<VariableObjectDTO> wpsReplaceVariables = wpsUtil.getWpsReplaceVariables(processEngineConfiguration, instance.getId());
processSign.getFileArchive().stream().filter(i -> Objects.equals(i.getFileType(), FileTypeEnum.WORD)
|| Objects.equals(i.getFileType(), FileTypeEnum.EXCEL))
.forEach(docBaseVO -> {
String newFileKey = wpsUtil.wpsFileVariableReplace(processEngineConfiguration, instance.getId(), docBaseVO.getFileCode(), docBaseVO.getFileKey());
String newFileKey = wpsUtil.wpsFileVariableReplace(wpsReplaceVariables, docBaseVO.getFileCode(), docBaseVO.getFileKey());
docBaseVO.setFileKey(newFileKey);
});
// 删除非 WPS 的临时文档

View File

@ -6,6 +6,7 @@ import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.dto.SignFileDTO;
import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
@ -43,6 +44,7 @@ import cn.axzo.workflow.core.engine.cmd.CustomGetModelDocsCmd;
import cn.axzo.workflow.core.repository.mapper.ExtAxModelDocMapper;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.core.service.BpmnProcessTaskService;
import cn.axzo.workflow.core.service.ExtAxProcessSignService;
import cn.axzo.workflow.core.service.ExtAxReadRecordService;
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
import cn.axzo.workflow.server.common.annotation.RepeatSubmit;
@ -109,6 +111,8 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
private ExtAxModelDocMapper extAxModelDocMapper;
@Resource
private SpringProcessEngineConfiguration processEngineConfiguration;
@Resource
private ExtAxProcessSignService extAxProcessSignService;
/**
* 超管查询所有流程实例
@ -504,4 +508,11 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
return success(readRecordService.changeReadStatus(dto));
}
@Override
@Operation(summary = "获取签署业务流程最后替换的文档 fileKey 集合")
@GetMapping("/api/process/instance/final/docs")
public CommonResponse<List<SignFileDTO>> getProcessInstanceFinalDocs(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId) {
return success(extAxProcessSignService.findByProcessInstanceId(processInstanceId).getFileArchive());
}
}