Merge branch 'feature/REQ-4418' into feature/REQ-4418_Enum

# Conflicts:
#	workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/ApproverSpecifyEnum.java
This commit is contained in:
wangli 2025-09-02 09:41:38 +08:00
commit 89a005469c
26 changed files with 253 additions and 51 deletions

View File

@ -9,6 +9,7 @@ import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
@ -155,6 +156,17 @@ public interface ProcessInstanceApi {
@InvokeMode(SYNC)
CommonResponse<BpmnProcessInstanceVO> getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto);
/**
* 批量获得流程实例
*
* @param dto
* @return
*/
@Operation(summary = "批量获得流程实例")
@PostMapping("/api/process/instance/batch/get")
@InvokeMode(SYNC)
CommonResponse<List<BpmnProcessInstanceVO>> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto);
/**
* 获取指定流程实例的流程变量
*

View File

@ -16,7 +16,6 @@ import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocStatusDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocTenantQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocUpdateDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.RestPrintTemplateConfigDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelDetailVO;
@ -220,17 +219,6 @@ public interface ProcessModelApi {
@InvokeMode(SYNC)
CommonResponse<List<String>> getModelTenantIds();
/**
* 打印模板配置内容更新保存
*
* @param dto
* @return
*/
@Operation(summary = "打印模板配置内容更新保存")
@PostMapping("/api/process/model/print/template/upsert")
@InvokeMode(SYNC)
CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto);
/**
* 获取打印模板配置内容
*

View File

@ -5,6 +5,7 @@ import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
@ -26,20 +27,50 @@ import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
* @since 2025-01-16 17:35
*/
@WorkflowEngineFeignClient
@Manageable
public interface PrintAdminApi {
/**
* 查询指定审批流程是否能打印打印开关是否开启是否存在打印模板
*
* @param processInstanceId
* @return
*/
@Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板")
@GetMapping("/api/print/admin/template/exists")
@InvokeMode(SYNC)
CommonResponse<Boolean> hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
/**
* 打印模板配置内容更新保存
*
* @param dto
* @return
*/
@Operation(summary = "打印模板配置内容更新保存")
@PostMapping("/api/print/admin/template/upsert")
@InvokeMode(SYNC)
CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto);
/**
* 获取打印模板中可打印的字段
*
* @param dto
* @return
*/
@Operation(summary = "获取打印模板中可打印的字段")
@PostMapping("/api/print/admin/fields")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<PrintFieldDTO>> getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto);
/**
* 获取指定流程下用于替换打印的相关变量
*
* @param processInstanceId
* @return
*/
@Operation(summary = "获取指定流程下用于替换打印的相关变量")
@GetMapping("/api/print/admin/field/variables")
@Manageable
@InvokeMode(SYNC)
CommonResponse<Map<String, Object>> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
}

View File

@ -35,7 +35,7 @@ public enum ApproverSpecifyEnum {
initiator_v2("initiator_v2", "发起人自己", 2),
initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2),
fixedPerson_v2("fixedPerson_v2", "固定人员", 2),
preAllNodApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2),
preAllNodeApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2),
@JsonEnumDefaultValue
unknown("unknown", "未知", 1),
;

View File

@ -0,0 +1,35 @@
package cn.axzo.workflow.common.model.request.bpmn.process;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.util.List;
/**
* 批量查询流程实例的入参模型
*
* @author wangli
* @since 2023/7/14 10:12
*/
@Data
@ApiModel("批量查询流程实例的入参模型")
@Accessors(chain = true)
public class BpmnProcessInstanceBatchQueryDTO {
/**
* 流程实例 ID 列表
*/
@NotEmpty(message = "流程实例 ID 列表不能为空")
@Size(max = 20, message = "一次性查询不能超过 20个")
private List<String> processInstanceIds;
/**
* 是否包含流程变量默认 false
* <p>
* 注意开启后可能会严重影响查询性能
*/
private Boolean hasVariables;
}

View File

@ -81,6 +81,11 @@ public class ProcessInstanceDTO implements Serializable {
*/
private String businessProcessInstanceName;
/**
* 模型定义的原始名称
*/
private String definitionName;
/**
* 发起人信息
*/

View File

@ -320,7 +320,7 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
break;
case fixedPerson_v2:
break;
case preAllNodApprover_v2:
case preAllNodeApprover_v2:
break;
default:
break;

View File

@ -24,12 +24,21 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.*;
import static cn.axzo.workflow.common.constant.BpmnConstants.*;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANT_ABORT;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_DELETE_PROCESS_FLAG;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_DELETE_REASON;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_TYPE_ABORT;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_ASSIGNEE_SKIP_FLAT;
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_ABORT;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.ABORTED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.CANCELLED;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.*;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.completeVirtualTask;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVirtualTask;
/**
* 自定义的中止流程实例的命令实现
@ -119,7 +128,9 @@ public class CustomAbortProcessInstanceCmd extends AbstractCommand<Void> impleme
batchAddAttachment(commandContext, task.getProcessInstanceId(), task, attachmentList, assigner);
completeVirtualTask(commandContext, task);
runtimeService.setVariable(processInstanceId, CLOSE_PROCESS_ASSIGNER, assigner);
if (Objects.nonNull(assigner)) {
runtimeService.setVariable(processInstanceId, CLOSE_PROCESS_ASSIGNER, assigner);
}
return null;
}

View File

@ -161,7 +161,9 @@ public class CustomApproveTaskCmd extends AbstractCommand<Void> implements Seria
resetApproverNode(task.getProcessInstanceId());
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
if (Objects.nonNull(approver)) {
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
}
executeSynchronous(task, taskService, runtimeService);
return null;

View File

@ -180,7 +180,9 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
resetApproverNode(task.getProcessInstanceId());
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
if (Objects.nonNull(approver)) {
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
}
executeSynchronous(task, taskService, runtimeService, commandContext, historicTaskInstance.getTenantId());
return null;

View File

@ -140,7 +140,9 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand<Void> implem
completeVirtualTask(commandContext, task);
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, initiator);
if (Objects.nonNull(initiator)) {
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, initiator);
}
return null;
}

View File

@ -125,7 +125,9 @@ public class CustomRejectionTaskCmd extends AbstractCommand<Void> implements Ser
variables.put(INTERNAL_DELETE_PROCESS_FLAG, INTERNAL_PROCESS_TYPE_REJECT);
variables.put(INTERNAL_PROCESS_DELETE_REASON, reason);
runtimeService.setVariables(task.getProcessInstanceId(), variables);
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
if (Objects.nonNull(approver)) {
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
}
CommandContextUtil.getAgenda(commandContext)
.planOperation(new DeleteProcessInstanceOperation(commandContext, task.getProcessInstanceId(),
extAxHiTaskInstService, REJECTED));

View File

@ -87,7 +87,7 @@ public class CustomTransferUserTaskAsyncCmd extends AbstractCommand<Void> implem
private void validTargetAssigneeNodeId(String processDefinitionId) {
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
if (categoryVersion > 0 && StringUtils.isNotBlank(dto.getTargetAssigner().getNodeId())) {
if (categoryVersion > 0 && StringUtils.isBlank(dto.getTargetAssigner().getNodeId())) {
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人");
}
}

View File

@ -1,5 +1,6 @@
package cn.axzo.workflow.core.engine.tx.listener;
import cn.axzo.framework.jackson.utility.JSON;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskAsyncCmd;
@ -53,7 +54,7 @@ public class AutoPassTransactionListener implements TransactionListener {
RuntimeService runtimeService = springProcessEngineConfiguration.getRuntimeService();
BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible(
runtimeService.getVariable(delegateTask.getProcessInstanceId(), INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId()));
log.info("auto pass transaction listener, assigner: {}", JSON.toJSONString(assigner));
CommandConfig commandConfig = new CommandConfig().transactionRequired();
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
BpmnTaskAuditDTO pass = new BpmnTaskAuditDTO();

View File

@ -3,6 +3,7 @@ package cn.axzo.workflow.core.service;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
@ -136,6 +137,14 @@ public interface BpmnProcessInstanceService {
*/
BpmnProcessInstanceVO getProcessInstanceVO(BpmnProcessInstanceQueryDTO dto);
/**
* 批量获得流程实例 VO 信息
*
* @param dto
* @return
*/
List<BpmnProcessInstanceVO> getBatchProcessInstanceVO(BpmnProcessInstanceBatchQueryDTO dto);
ObjectNode getProcessInstanceGraphical(String processInstanceId, @Nullable String tenantId);
BpmPageResult<HistoricProcessInstanceVO> historicProcessInstancePage(HistoricProcessInstanceSearchDTO dto);
@ -184,6 +193,7 @@ public interface BpmnProcessInstanceService {
/**
* 获取指定流程实例对应的模型 ID
*
* @param processInstanceId
* @return
*/

View File

@ -22,6 +22,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
@ -93,6 +94,7 @@ import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.BpmnModel;
@ -829,6 +831,61 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
processInstance.getProcessDefinitionKey()), runningTasks);
}
@Override
public List<BpmnProcessInstanceVO> getBatchProcessInstanceVO(BpmnProcessInstanceBatchQueryDTO dto) {
List<HistoricProcessInstance> processInstanceList = historyService.createHistoricProcessInstanceQuery().processInstanceIds(Sets.newHashSet(dto.getProcessInstanceIds())).list();
Map<String, Map<String, Object>> variableMaps = historyService.createNativeHistoricVariableInstanceQuery()
.sql("select * from act_hi_varinst where PROC_INST_ID_ in (#{ids}) and (NAME_ = '" + INTERNAL_INITIATOR + "' or NAME_ = '" + OLD_INTERNAL_INITIATOR + "' or NAME_ = '" + WORKFLOW_ENGINE_VERSION + "')")
.parameter("ids", dto.getProcessInstanceIds()).list()
.stream()
.collect(Collectors.groupingBy(HistoricVariableInstance::getProcessInstanceId, Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue, (s, t) -> s)));
Map<String, Task> taskMaps = taskService.createTaskQuery().processInstanceIdIn(dto.getProcessInstanceIds())
.active()
.list()
.stream().collect(Collectors.groupingBy(
Task::getProcessInstanceId,
Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparing(Task::getCreateTime)),
Optional::get
)
));
Map<String, CategoryItemVO> categoryMaps = categoryService.getByValues(processInstanceList.stream().map(HistoricProcessInstance::getProcessDefinitionKey).filter(StringUtils::hasText).distinct().collect(Collectors.toList()))
.stream()
.filter(i -> Objects.equals(i.getType(), BPM_MODEL_CATEGORY))
.collect(Collectors.toMap(CategoryItemVO::getValue, Function.identity(), (s, t) -> s));
return processInstanceList.stream().map(e -> {
BpmnProcessInstanceVO vo = new BpmnProcessInstanceVO();
vo.setId(e.getId());
vo.setName(e.getName());
vo.setCategory(e.getProcessDefinitionKey());
CategoryItemVO category = categoryMaps.getOrDefault(e.getProcessDefinitionKey(), null);
if (Objects.nonNull(category)) {
vo.setCategoryDesc(category.getLabel());
vo.setWorkspaceType(WorkspaceType.getType(Integer.valueOf(category.getWorkspaceTypeCode())));
}
vo.setResult(BpmnProcessInstanceResultEnum.valueOfStatus(e.getBusinessStatus()));
vo.setCreateAt(e.getStartTime());
vo.setEndTime(e.getEndTime());
vo.setProcessDefinitionKey(e.getProcessDefinitionKey());
vo.setProcessDefinitionId(e.getProcessDefinitionId());
vo.setBusinessKey(e.getBusinessKey());
vo.setBusinessStatus(e.getBusinessStatus());
vo.setTenantId(e.getTenantId());
Task task = taskMaps.getOrDefault(e.getId(), null);
if (Objects.nonNull(task)) {
vo.setCurrentDefinitionKey(task.getTaskDefinitionKey());
}
Map<String, Object> variables = variableMaps.getOrDefault(e.getId(), Collections.emptyMap());
if (!CollectionUtils.isEmpty(variables)) {
vo.setInitiator(BpmnTaskDelegateAssigner.toObjectCompatible(variables.getOrDefault(INTERNAL_INITIATOR, variables.getOrDefault(OLD_INTERNAL_INITIATOR, null))));
vo.setWorkflowEngineVersion(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, "").toString());
}
return vo;
}).collect(Collectors.toList());
}
/**
* 获得流程实例 Map
*

View File

@ -104,7 +104,8 @@ public class BasedIdentityV2TaskAssigneeSelector extends AbstractBpmnTaskAssigne
break;
case pre_node_approver:
log.info("executing role v2 with pre_node_approver");
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
BpmnTaskDelegateAssigner lastOperationApprover =
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(CLOSE_PROCESS_ASSIGNER));
if (Objects.isNull(lastOperationApprover)) {
return Collections.emptyList();
}

View File

@ -125,7 +125,8 @@ public class BasedPositionV2TaskAssigneeSelector extends AbstractBpmnTaskAssigne
case pre_node_approver:
log.info("executing position v2 with pre_node_approver");
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement);
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
BpmnTaskDelegateAssigner lastOperationApprover =
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(CLOSE_PROCESS_ASSIGNER));
if (Objects.isNull(lastOperationApprover)) {
return Collections.emptyList();
}

View File

@ -35,7 +35,7 @@ public class BasedPreAllNodeTaskAssigneeSelector extends AbstractBpmnTaskAssigne
@Override
public String getType() {
return ApproverSpecifyEnum.preAllNodApprover_v2.getType();
return ApproverSpecifyEnum.preAllNodeApprover_v2.getType();
}
@Override

View File

@ -18,6 +18,7 @@ import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.ListUtils;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.stereotype.Component;
@ -55,6 +56,8 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecial
public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
@Resource
private OrgNodeUserApi orgNodeUserApi;
@Resource
private RuntimeService runtimeService;
@Override
public String getType() {
@ -124,7 +127,9 @@ public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSel
case pre_node_approver:
log.info("executing role v2 with pre_node_approver");
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement);
BpmnTaskDelegateAssigner lastOperationApprover = execution.getVariable(CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class);
BpmnTaskDelegateAssigner lastOperationApprover =
BpmnTaskDelegateAssigner.toObjectCompatible(runtimeService.getVariable(execution.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class));
log.info("lastOperationApprover:{}", JSON.toJSONString(lastOperationApprover));
if (Objects.isNull(lastOperationApprover)) {
return Collections.emptyList();
}

View File

@ -85,7 +85,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
.setStartTime(((ExecutionEntityImpl) event.getEntity()).getStartTime())
.setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId())
.setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getBusinessKey())
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName());
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName())
.setDefinitionName(mainProcess.getName());
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
@ -154,7 +155,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
.setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime())
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName());
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
.setDefinitionName(mainProcess.getName());
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
@ -194,7 +196,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
.setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime())
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName());
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
.setDefinitionName(mainProcess.getName());
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
@ -229,7 +232,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
.setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime())
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName());
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
.setDefinitionName(mainProcess.getName());
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
@ -264,7 +268,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
.setStartTime(((ExecutionEntityImpl) event.getEntity()).getStartTime())
.setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId())
.setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getProcessInstanceBusinessKey())
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName());
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName())
.setDefinitionName(mainProcess.getName());
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);

View File

@ -32,6 +32,7 @@ import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
@ -89,13 +90,23 @@ public class CheckApproverServiceImpl implements CheckApproverService {
return exists.get();
}
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
processEngineConfiguration.getActivityInstanceEntityManager()
.findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false)
List<ActivityInstanceEntity> actInsts = processEngineConfiguration.getActivityInstanceEntityManager()
.findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false);
actInsts.stream().map(i -> new StringBuilder()
.append(i.getActivityId()).append(":")
.append(i.getActivityType()).append(":")
.append(i.getEndTime()))
.collect(Collectors.toList())
.forEach(i -> log.info("checkApproveServiceImpl inst: {}", i.toString()));
actInsts
.stream()
.filter(i -> !Objects.equals(i.getActivityId(), userTask.getId()))
.filter(i -> !Objects.equals(i.getActivityType(), "exclusiveGateway"))
.filter(i -> !Objects.equals(i.getActivityType(), "sequenceFlow"))
.filter(i -> !Objects.equals(i.getActivityType(), "startEvent"))
.filter(i -> Objects.nonNull(i.getEndTime()))
.max(Comparator.comparing(ActivityInstanceEntity::getEndTime))
.ifPresent(i -> {
log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点ID:{},类型:{}", i.getActivityId(), i.getActivityType());

View File

@ -295,6 +295,9 @@ public class TestController {
if (!StringUtils.hasText(keyword)) {
return "命令不能为空";
}
if (StringUtils.hasText(date)) {
return ShellUtil.grepLog(profile, keyword, StringUtils.hasText(date) ? DateUtil.parseDate(date) : new Date(), grepKeyword);
}
String s = ShellUtil.grepRealTimeLog(profile, keyword);
if (StringUtils.hasText(s)) {
return s;

View File

@ -13,6 +13,7 @@ import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
@ -281,6 +282,20 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
return success(result);
}
/**
* 批量获得流程实例
*
* @param dto
* @return
*/
@Operation(summary = "批量获得流程实例")
@GetMapping("/batch/get")
@Override
public CommonResponse<List<BpmnProcessInstanceVO>> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto) {
log.info("批量获得历史的流程实例 getProcessInstanceVO===>>>参数:{}", JSONUtil.toJsonStr(dto));
return success(bpmnProcessInstanceService.getBatchProcessInstanceVO(dto));
}
/**
* 更新指定流程定义的版本的状态, 处于 suspended 状态的流程模型将不能再发起实例
*

View File

@ -410,21 +410,6 @@ public class BpmnProcessModelController implements ProcessModelApi {
return success(bpmnProcessModelService.getTenantIds());
}
/**
* 打印模板配置内容
*
* @param dto
* @return
*/
@Operation(summary = "打印模板配置内容")
@PostMapping("/print/template/upsert")
@Override
public CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto) {
log.info("操作打印模板配置内容: {}", JSON.toJSONString(dto));
bpmnProcessModelService.printTemplateConfig(dto);
return success();
}
/**
* 获取打印模板配置内容
*

View File

@ -9,6 +9,7 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.dto.print.FieldAttributeDTO;
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.request.category.CategoryGroupVarSearchDto;
@ -20,6 +21,7 @@ import cn.axzo.workflow.core.engine.cmd.CustomGetFormInstanceLatestValuesCmd;
import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesCmd;
import cn.axzo.workflow.core.service.BpmnProcessDefinitionService;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.core.service.BpmnProcessModelService;
import cn.axzo.workflow.core.service.CategoryGroupService;
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
import cn.axzo.workflow.server.common.util.RpcExternalUtil;
@ -130,6 +132,8 @@ public class PrintAdminController implements PrintAdminApi {
private BpmnProcessInstanceService bpmnProcessInstanceService;
@Resource
private CategoryGroupService categoryGroupService;
@Resource
private BpmnProcessModelService bpmnProcessModelService;
/**
* 查询指定流程实例是否能使用打印
@ -144,6 +148,20 @@ public class PrintAdminController implements PrintAdminApi {
return CommonResponse.success(bpmnProcessInstanceService.hasPrintTemplate(processInstanceId, null));
}
/**
* 打印模板配置内容
*
* @param dto
* @return
*/
@Operation(summary = "打印模板配置内容")
@PostMapping("/template/upsert")
@Override
public CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto) {
log.info("操作打印模板配置内容: {}", JSON.toJSONString(dto));
bpmnProcessModelService.printTemplateConfig(dto);
return success();
}
/**
* 获取打印模板中可打印的字段, 或者是 WPS 模板中可配置的变量字段
*