update - 添加调用二方 Api 的耗时统计与记录;标准化日志中的操作描述

This commit is contained in:
wangli 2024-01-08 14:44:51 +08:00
parent d1ceb80431
commit 27fd38fc06
11 changed files with 39 additions and 29 deletions

View File

@ -5,13 +5,9 @@ public enum BpmnFlowNodeMode {
GENERAL("GENERAL", "普通节点"),
OR("OR", "或签节点"),
AND("AND", "会签节点"),
BUSINESS("BUSINESS", "业务节点"),
BUSINESS_BIZ_SPECIFY("BUSINESS_BIZ_SPECIFY", "业务节点(指定)"),
AUTO_PASSED("AUTO_PASSED", "自动通过"),
AUTO_REJECTED("AUTO_REJECTED", "自动驳回"),
COPY("COPY", "抄送节点"),
COMMENT("COMMENT", "评论节点"),
DUMMY("DUMMY", "机器人节点"),
AUTO_REJECTED("AUTO_REJECTED", "自动拒绝"),
BUSINESS_BIZ_SPECIFY("BUSINESS_BIZ_SPECIFY", "业务指定审批人"),
;
private String type;

View File

@ -7,15 +7,17 @@ import java.util.Objects;
public enum BpmnFlowNodeType {
//0 发起人 1审批 2抄送 3条件 4路由
NODE_STARTER("NODE_STARTER", "发起人节点"), // ROOT
NODE_EXCLUSIVE_GATEWAY("NODE_EXCLUSIVE_GATEWAY", "排它网关"), // CONDITIONS
NODE_CONDITION("NODE_CONDITION", "条件节点 - 隶属于排它网关"), // CONDITION
NODE_STARTER("NODE_STARTER", "发起人节点"),
NODE_EXCLUSIVE_GATEWAY("NODE_EXCLUSIVE_GATEWAY", "排它网关"),
NODE_CONDITION("NODE_CONDITION", "条件节点 - 隶属于排它网关"),
NODE_PARALLEL_GATEWAY("NODE_PARALLEL_GATEWAY", "并行网关"),
NODE_PARALLEL("NODE_PARALLEL", "并行节点 - 隶属于并行网关"),
NODE_TASK("NODE_TASK", "审核节点"), // APPROVAL
NODE_TASK("NODE_TASK", "审核节点"),
NODE_BUSINESS("NODE_BUSINESS", "业务节点"),
NODE_CARBON_COPY("NODE_CARBON_COPY", "抄送节点"),
NODE_TRIGGER("NODE_TRIGGER", "触发器节点"),
NODE_ROBOT("NODE_ROBOT", "机器人节点"),
NODE_COMMENT("NODE_COMMENT", "评论节点"),
NODE_EMPTY("NODE_EMPTY", "空节点"),
;

View File

@ -1,6 +1,7 @@
package cn.axzo.workflow.common.model.response.bpmn.process;
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import lombok.Data;
@ -27,10 +28,13 @@ public class ProcessNodeDetailVO {
* 节点名称
*/
private String name;
/**
* 节点类型
*/
private BpmnFlowNodeType nodeType;
/**
* 审批节点处理模式
*/
private BpmnFlowNodeMode nodeMode;
/**

View File

@ -10,7 +10,7 @@ import org.flowable.engine.delegate.DelegateExecution;
*/
public interface ApproverScopeProcessor {
default ApproverScopeDTO select(UserTask userTask, DelegateExecution execution) {
default ApproverScopeDTO build(UserTask userTask, DelegateExecution execution) {
return ApproverScopeDTO.builder().build();
}
}

View File

@ -26,7 +26,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
public class EntWorkspaceProcessor implements ApproverScopeProcessor {
@Override
public ApproverScopeDTO select(UserTask userTask, DelegateExecution execution) {
public ApproverScopeDTO build(UserTask userTask, DelegateExecution execution) {
// 获取组织信息
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
ApproverScopeDTO build = ApproverScopeDTO.builder().build();

View File

@ -26,7 +26,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_R
public class PreTaskUserProcessor implements ApproverScopeProcessor {
@Override
public ApproverScopeDTO select(UserTask userTask, DelegateExecution execution) {
public ApproverScopeDTO build(UserTask userTask, DelegateExecution execution) {
Optional<UserTask> preUserTaskOpt = BpmnMetaParserHelper.getPreNode(userTask, execution, null);
if (!preUserTaskOpt.isPresent()) {
log.info("the current node has no pre node, skip");

View File

@ -24,7 +24,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
public class ProjectWorkspaceProcessor implements ApproverScopeProcessor {
@Override
public ApproverScopeDTO select(UserTask userTask, DelegateExecution execution) {
public ApproverScopeDTO build(UserTask userTask, DelegateExecution execution) {
// 发起项目部
CooperationOrgDTO orgDTO =(CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
if (Objects.isNull(orgDTO)) {

View File

@ -17,6 +17,7 @@ import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.UserTask;
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
import org.flowable.engine.TaskService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
@ -38,6 +39,7 @@ import java.util.Objects;
import java.util.Optional;
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_ALLOW_SKIP_USER_TASK;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE;
import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION_121;
@ -67,6 +69,8 @@ public class EngineExecutionStartListener implements ExecutionListener {
private ObjectProvider<BpmnTaskDelegate> bpmTaskDelegate;
@Resource
private List<BpmnTaskAssigneeSelector> selectors;
@Resource
private TaskService taskService;
@Value("${workflow.mock:false}")
private Boolean mock;
@ -113,6 +117,8 @@ public class EngineExecutionStartListener implements ExecutionListener {
execution.setVariable(INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + currentActivityId, Lists.newArrayList(dummyApprover));
taskService.addComment(userTask.getId(), execution.getProcessInstanceId(),
COMMENT_TYPE_OPERATION_DESC, "业务指定审批人");
// 触发事件
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration();

View File

@ -81,6 +81,9 @@ import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.AUTO_PASSED;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.AUTO_REJECTED;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.BUSINESS_BIZ_SPECIFY;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.OR;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_BUSINESS;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CARBON_COPY;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_TASK;
import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
import static cn.axzo.workflow.core.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
import static cn.axzo.workflow.core.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_ID_NOT_EXISTS;
@ -562,7 +565,8 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
UserTask userTask = (UserTask) i;
node.setId(userTask.getId())
.setName(userTask.getName())
.setFormKey(userTask.getFormKey());
.setFormKey(userTask.getFormKey())
.setNodeType(NODE_TASK);
getApprovalMethod(userTask).ifPresent(approvalMethod -> {
switch (approvalMethod) {
@ -598,12 +602,14 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
ReceiveTask receiveTask = (ReceiveTask) i;
node.setId(receiveTask.getId())
.setName(receiveTask.getName());
node.setNodeMode(BpmnFlowNodeMode.BUSINESS);
node.setNodeType(NODE_BUSINESS);
node.setNodeMode(BpmnFlowNodeMode.GENERAL);
} else {
ServiceTask serviceTask = (ServiceTask) i;
node.setId(serviceTask.getId())
.setName(serviceTask.getName());
node.setNodeMode(BpmnFlowNodeMode.COPY);
node.setNodeType(NODE_CARBON_COPY);
node.setNodeMode(BpmnFlowNodeMode.GENERAL);
}
resultList.add(node);
});

View File

@ -85,7 +85,6 @@ import java.util.stream.Collectors;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO;
import static cn.axzo.workflow.common.constant.BpmnConstants.OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT;
@ -362,13 +361,6 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
vo.setEndTime(i.getTime());
});
// 处理"业务指定审批人" 特殊的日志
if (Objects.equals(DUMMY_ASSIGNEE_ID, vo.getAssignee())) {
vo.setOperationDesc("业务指定审批人");
}
List<Attachment> attachments = attachmentByTaskIdMap.getOrDefault(vo.getTaskId(), Collections.emptyList());
vo.setAttachments(attachmentConverter.toVos(attachments));

View File

@ -17,6 +17,7 @@ import org.flowable.engine.delegate.DelegateExecution;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.util.StopWatch;
import java.util.Collections;
import java.util.List;
@ -50,7 +51,7 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
ApproverScopeProcessor processor =
applicationContext.getBean(approverScopeEnum.getProcessor(),
ApproverScopeProcessor.class);
ApproverScopeDTO scopeDto = processor.select(userTask, execution);
ApproverScopeDTO scopeDto = processor.build(userTask, execution);
try {
return invokeService(userTask, execution, scopeDto);
} catch (Throwable t) {
@ -71,9 +72,12 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
}
protected final <T> T parseApiResult(Supplier<ApiResult<T>> supplier, String operatorDesc, Object... param) {
log.info(operatorDesc + "-Param: " + JSONUtil.toJsonStr(param));
StopWatch stopWatch = new StopWatch(operatorDesc);
log.info("{}-Param: {}", operatorDesc, JSONUtil.toJsonStr(param));
stopWatch.start();
ApiResult<T> result = supplier.get();
log.info(operatorDesc + "-Result: " + JSONUtil.toJsonStr(result));
stopWatch.stop();
log.info("{}-Cost:{}, Result: {}", operatorDesc, stopWatch.shortSummary(), JSONUtil.toJsonStr(result));
Assert.notNull(result, "服务调用异常");
// 200自定义处理
if (HttpStatus.HTTP_OK != result.getCode()) {