Merge branch 'feature/countersign_ext' into dev

# Conflicts:
#	workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java
This commit is contained in:
wangli 2025-10-22 10:12:19 +08:00
commit a7e28e6914
6 changed files with 63 additions and 15 deletions

View File

@ -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;
/**
* 文件的类型

View File

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

View File

@ -1907,6 +1907,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
}
private List<DocBaseVO> getAndAddBizCustomDocs(String processInstanceId, List<DocBaseVO> docs) {
HistoricProcessInstance processInstance = null;
if (CollectionUtils.isEmpty(docs)) {
processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
}
List<CustomDocDTO> 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<DocBaseVO> 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) {

View File

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

View File

@ -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<CustomDocDTO> 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<SignFileDTO> docTemplates = copyTempTemplate(docs);
// 处理业务自定义文档
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
List<CustomDocDTO> customDocs = runtimeService.getVariable(processInstanceId, SIGN_BIZ_CUSTOM_DOCS, List.class);
List<SignFileDTO> 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);

View File

@ -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;
@ -23,6 +26,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;
@ -54,6 +58,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;
@ -113,6 +119,8 @@ public class TestController {
private TaskService taskService;
@Resource
private SupportRefreshProperties refreshProperties;
@Resource
private ServerFileServiceSdk serverFileServiceSdk;
@RepeatSubmit
@GetMapping("/test")
@ -405,5 +413,15 @@ public class TestController {
public CommonResponse<String> refreshProperties() {
return CommonResponse.success(JSON.toJSONString(refreshProperties));
}
@PostMapping("/server/file/upload")
@SneakyThrows
public CommonResponse<String> 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));
}
}