update - 自测相关功能点
This commit is contained in:
parent
6ec8f5d465
commit
d4d1d02dc6
4
Changelog.md
Normal file
4
Changelog.md
Normal file
@ -0,0 +1,4 @@
|
||||
# Change logs
|
||||
|
||||
- 1.0-SNAPSHOT 初始化版本
|
||||
- 1.0.1-SNAPSHOT 枢智版本
|
||||
@ -1,4 +0,0 @@
|
||||
# 发布记录
|
||||
|
||||
1.0-SNAPSHOT
|
||||
1.0.1-SNAPSHOT
|
||||
@ -37,6 +37,8 @@ public interface ProcessInstanceApi {
|
||||
* 1. 当前流程实例会依次触发 process-instance-created 和 process-instance-started 事件
|
||||
* 2. 第一个审批任务会依次触发 process-task-assigned 和 process-task-created 事件
|
||||
* </pre>
|
||||
*
|
||||
* @param dto {@link BpmnProcessInstanceCreateDTO}
|
||||
*/
|
||||
@PostMapping("/create")
|
||||
CommonResponse<String> createProcessInstance(@Validated @RequestBody BpmnProcessInstanceCreateDTO dto);
|
||||
@ -44,6 +46,18 @@ public interface ProcessInstanceApi {
|
||||
@PostMapping("/form/create")
|
||||
CommonResponse<String> createProcessInstanceWith(@Validated @RequestBody BpmnProcessInstanceCreateWithFormDTO dto);
|
||||
|
||||
/**
|
||||
* 发起人主动撤销审核
|
||||
*
|
||||
* <pre>
|
||||
* MQ 触发规则:
|
||||
* 1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件
|
||||
* 2. 当前流程实例会触发 process-instance-cancelled 事件
|
||||
* </pre>
|
||||
*
|
||||
* @param dto {@link BpmnProcessInstanceCancelDTO}
|
||||
* @return
|
||||
*/
|
||||
@DeleteMapping("/cancel")
|
||||
CommonResponse<Boolean> cancelProcessInstance(@Validated @RequestBody BpmnProcessInstanceCancelDTO dto);
|
||||
|
||||
|
||||
@ -46,8 +46,10 @@ public interface ProcessTaskApi {
|
||||
*
|
||||
* <pre>
|
||||
* MQ 触发规则:
|
||||
* 1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件
|
||||
* 2. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件
|
||||
* 1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,
|
||||
* 如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件)
|
||||
* 2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件
|
||||
* 2.2. 流程实例正常结束会触发 process-instance-completed 事件
|
||||
* </pre>
|
||||
*/
|
||||
@PutMapping("/approve")
|
||||
|
||||
@ -23,8 +23,8 @@ public interface BpmConstants {
|
||||
String INTERNAL_PROCESS_TYPE_CANCEL = "_INTERNAL_PROCESS_TYPE_CANCEL";
|
||||
String INTERNAL_PROCESS_TYPE_REJECT = "_INTERNAL_PROCESS_TYPE_REJECT";
|
||||
String INTERNAL_SPECIFY_NEXT_APPROVER = "_INTERNAL_SPECIFY_NEXT_APPROVER";
|
||||
String TASK_RELATION_ASSIGNEE_INFO = "[_ASSIGNEE_INFO_]";
|
||||
String TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT = "[_ASSIGNEE_INFO_SNAPSHOT_]";
|
||||
String INTERNAL_TASK_RELATION_ASSIGNEE_INFO = "[_ASSIGNEE_INFO_]";
|
||||
String INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT = "[_ASSIGNEE_INFO_SNAPSHOT_]";
|
||||
|
||||
String PROCESS_PREFIX = "Flowable";
|
||||
String START_EVENT_ID = "startEventNode";
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
package cn.axzo.workflow.common.model.request.bpmn.process;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* 取消流程实例的入参模型
|
||||
@ -24,8 +25,8 @@ public class BpmnProcessInstanceCancelDTO {
|
||||
|
||||
/**
|
||||
* 流程实例对应的 businessKey
|
||||
*
|
||||
* modify: businessKey 不是唯一的, flowable 允许 businessKey 想同,暂时不能通过该属性进行取消流程实例
|
||||
* <p>
|
||||
* modify: businessKey 不是唯一的, flowable 允许 businessKey 相同, 暂时不能通过该属性进行取消流程实例
|
||||
*/
|
||||
@ApiModelProperty(value = "流程实例的 businessKey", example = "businessKey", notes = "与 id 必须二选一", hidden = true)
|
||||
@Deprecated
|
||||
@ -37,25 +38,29 @@ public class BpmnProcessInstanceCancelDTO {
|
||||
@ApiModelProperty(value = "取消的原因", example = "主动取消")
|
||||
private String reason;
|
||||
|
||||
/**
|
||||
* 租户 ID
|
||||
*/
|
||||
@NotBlank(message = "租户不能为空")
|
||||
@ApiModelProperty(value = "租户编号")
|
||||
private String tenantId;
|
||||
@ApiModelProperty(value = "审批流程发起人信息")
|
||||
@NotNull(message = "审批流程的发起人不能为空")
|
||||
private BpmnTaskDelegateAssigner initiator;
|
||||
|
||||
/**
|
||||
* 用户 ID
|
||||
*/
|
||||
@NotBlank(message = "用户编号不能为空")
|
||||
@ApiModelProperty(value = "操作人标识")
|
||||
private String userId;
|
||||
|
||||
/**
|
||||
* 用户姓名
|
||||
*/
|
||||
@ApiModelProperty(value = "操作人姓名")
|
||||
@NotBlank(message = "用户姓名不能为空")
|
||||
private String userName;
|
||||
// /**
|
||||
// * 租户 ID
|
||||
// */
|
||||
// @NotBlank(message = "租户不能为空")
|
||||
// @ApiModelProperty(value = "租户编号")
|
||||
// private String tenantId;
|
||||
//
|
||||
// /**
|
||||
// * 用户 ID
|
||||
// */
|
||||
// @NotBlank(message = "用户编号不能为空")
|
||||
// @ApiModelProperty(value = "操作人标识")
|
||||
// private String userId;
|
||||
//
|
||||
// /**
|
||||
// * 用户姓名
|
||||
// */
|
||||
// @ApiModelProperty(value = "操作人姓名")
|
||||
// @NotBlank(message = "用户姓名不能为空")
|
||||
// private String userName;
|
||||
|
||||
}
|
||||
|
||||
@ -21,12 +21,9 @@ public class BpmnTaskAssigneeDTO {
|
||||
private String taskId;
|
||||
|
||||
@ApiModelProperty(value = "审批任务原审批人", notes = "可以为空,意义在于可以将没有指派给任何人的任务转交给其他人")
|
||||
private String originUserId;
|
||||
private BpmnTaskDelegateAssigner originAssigner;
|
||||
|
||||
@ApiModelProperty(value = "审批任务转发给谁", notes = "可以为空,意义在于如果分配给某离职的人,可能需要置为空")
|
||||
private String newUserId;
|
||||
|
||||
@ApiModelProperty(value = "租户 ID")
|
||||
@NotBlank(message = "租户不能为空")
|
||||
private String tenantId;
|
||||
private BpmnTaskDelegateAssigner targetAssigner;
|
||||
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@ public interface BpmActivityEventListener extends Ordered {
|
||||
|
||||
/**
|
||||
* 由于Flowable BPMN Engine 没有直接对 UserTask 直接做相关事件,
|
||||
* 而是针对每一个节点做了 Activity 事件,但UserTask 又细分了单实例
|
||||
* 而是针对每一个节点做了 Activity 事件,但 UserTask 又细分了单实例
|
||||
* 和多实例,所以进行了简单包装,只要回调了该方法则一定是一个 Activity
|
||||
* (即一个节点,不管是什么节点"开始节点"/"网关"/"审批任务"等).
|
||||
* <p>
|
||||
|
||||
@ -11,22 +11,22 @@ public interface BpmTaskEventListener extends Ordered {
|
||||
/**
|
||||
* 用户任务已创建,未指派审核人
|
||||
*/
|
||||
void created(DelegateTask delegateTask);
|
||||
void onCreated(DelegateTask delegateTask);
|
||||
|
||||
/**
|
||||
* 用户任务已指派审核人
|
||||
*/
|
||||
void assigned(DelegateTask delegateTask);
|
||||
void onAssigned(DelegateTask delegateTask);
|
||||
|
||||
/**
|
||||
* 用户任务已通过
|
||||
* <p>
|
||||
* 仅审核通过一个用户任务时触发, 如果任务是拒绝了, 则直接走实例取消事件
|
||||
*/
|
||||
void completed(DelegateTask delegateTask);
|
||||
void onCompleted(DelegateTask delegateTask);
|
||||
|
||||
/**
|
||||
* 用户任务已删除
|
||||
*/
|
||||
void deleted(DelegateTask delegateTask);
|
||||
void onDeleted(DelegateTask delegateTask);
|
||||
}
|
||||
|
||||
@ -40,7 +40,7 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
public void notify(DelegateExecution execution) {
|
||||
log.info("execution Start: {}", JSON.toJSONString(execution));
|
||||
String currentActivityId = execution.getCurrentActivityId();
|
||||
String variable = TASK_RELATION_ASSIGNEE_INFO + currentActivityId;
|
||||
String variable = INTERNAL_TASK_RELATION_ASSIGNEE_INFO + currentActivityId;
|
||||
List usersValue = (List) execution.getVariable(variable);
|
||||
if (usersValue == null) {
|
||||
Process mainProcess = repositoryService.getBpmnModel(execution.getProcessDefinitionId()).getMainProcess();
|
||||
@ -78,7 +78,7 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
}
|
||||
execution.setVariable(variable, assigneeIdList);
|
||||
// FIXME 这里的快照并不通用, 未考虑多人审批的情况
|
||||
execution.setVariable(TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + currentActivityId,
|
||||
execution.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + currentActivityId,
|
||||
execution.getVariable(INTERNAL_SPECIFY_NEXT_APPROVER));
|
||||
});
|
||||
}
|
||||
|
||||
@ -24,6 +24,7 @@ import java.util.Set;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmConstants.*;
|
||||
import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.CANCELLED;
|
||||
import static cn.axzo.workflow.common.enums.BpmProcessInstanceResultEnum.REJECTED;
|
||||
|
||||
|
||||
@Slf4j
|
||||
@ -76,7 +77,7 @@ public class EngineProcessInstanceEventListener extends AbstractFlowableEngineEv
|
||||
resultEnum = CANCELLED;
|
||||
break;
|
||||
case INTERNAL_PROCESS_TYPE_REJECT:
|
||||
resultEnum = BpmProcessInstanceResultEnum.REJECTED;
|
||||
resultEnum = REJECTED;
|
||||
break;
|
||||
default:
|
||||
log.error("这里是不允许执行到的地方,为防止引擎一些未发现的地方,在这里输出错误日志! this current thread name: {}",
|
||||
|
||||
@ -35,18 +35,18 @@ public class EngineTaskEventListener implements TaskListener {
|
||||
getOrderedListeners().forEach(i -> {
|
||||
switch (delegateTask.getEventName()) {
|
||||
case EVENTNAME_CREATE:
|
||||
i.created(delegateTask);
|
||||
i.onCreated(delegateTask);
|
||||
break;
|
||||
case EVENTNAME_ASSIGNMENT:
|
||||
i.assigned(delegateTask);
|
||||
i.onAssigned(delegateTask);
|
||||
break;
|
||||
case EVENTNAME_COMPLETE:
|
||||
//审批完成
|
||||
i.completed(delegateTask);
|
||||
i.onCompleted(delegateTask);
|
||||
break;
|
||||
case EVENTNAME_DELETE:
|
||||
// 审批删除
|
||||
i.deleted(delegateTask);
|
||||
i.onDeleted(delegateTask);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
|
||||
@ -247,23 +247,23 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
public Boolean cancelProcessInstance(BpmnProcessInstanceCancelDTO dto) {
|
||||
HistoricProcessInstance instance = null;
|
||||
if (StringUtils.isNotBlank(dto.getId())) {
|
||||
instance = getProcessInstance(dto.getId(), dto.getTenantId(), false);
|
||||
instance = getProcessInstance(dto.getId(), dto.getInitiator().getTenantId(), false);
|
||||
} else if (StringUtils.isNotBlank(dto.getBusinessKey())) {
|
||||
instance = getProcessInstanceByBusinessKey(dto.getBusinessKey(), dto.getTenantId(), false);
|
||||
instance = getProcessInstanceByBusinessKey(dto.getBusinessKey(), dto.getInitiator().getTenantId(), false);
|
||||
} else {
|
||||
throw new WorkflowEngineException(PROCESS_OPERATION_PARAM_VALID_ERROR);
|
||||
}
|
||||
if (instance == null) {
|
||||
throw new WorkflowEngineException(PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS);
|
||||
}
|
||||
if (!Objects.equals(instance.getStartUserId(), dto.getUserId())) {
|
||||
if (!Objects.equals(instance.getStartUserId(), dto.getInitiator().getAssigneeId())) {
|
||||
throw new WorkflowEngineException(PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF);
|
||||
}
|
||||
|
||||
Map<String, Object> variables = new HashMap<>();
|
||||
variables.put(INTERNAL_END_TENANT_ID, dto.getTenantId());
|
||||
variables.put(INTERNAL_END_USER_ID, dto.getUserId());
|
||||
variables.put(INTERNAL_END_USER_NAME, dto.getUserName());
|
||||
variables.put(INTERNAL_END_TENANT_ID, dto.getInitiator().getTenantId());
|
||||
variables.put(INTERNAL_END_USER_ID, dto.getInitiator().getAssigneeId());
|
||||
variables.put(INTERNAL_END_USER_NAME, dto.getInitiator().getAssignerName());
|
||||
variables.put(INTERNAL_DELETE_PROCESS_FLAG, INTERNAL_PROCESS_TYPE_CANCEL);
|
||||
runtimeService.setVariables(instance.getId(), variables);
|
||||
|
||||
|
||||
@ -381,7 +381,7 @@ public class BpmnTaskServiceImpl implements BpmnTaskService {
|
||||
vo.setComments(commentConverter.toVos(comments));
|
||||
|
||||
HistoricVariableInstance assgineeSnapshot =
|
||||
variableInstanceMap.getOrDefault(TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + vo.getTaskDefinitionKey()
|
||||
variableInstanceMap.getOrDefault(INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + vo.getTaskDefinitionKey()
|
||||
, null);
|
||||
vo.setAssigneeSnapshot(Objects.nonNull(assgineeSnapshot) ?
|
||||
(BpmnTaskDelegateAssigner) assgineeSnapshot.getValue() : null);
|
||||
@ -460,18 +460,34 @@ public class BpmnTaskServiceImpl implements BpmnTaskService {
|
||||
|
||||
@Override
|
||||
public void assigneeTask(BpmnTaskAssigneeDTO dto) {
|
||||
TaskQuery query = taskService.createTaskQuery().taskId(dto.getTaskId());
|
||||
if (StringUtils.hasLength(dto.getTenantId())) {
|
||||
query.taskTenantId(dto.getTenantId());
|
||||
}
|
||||
Task task = query.singleResult();
|
||||
if (Objects.nonNull(task) && !Objects.equals(task.getAssignee(), dto.getOriginUserId())) {
|
||||
throw new WorkflowEngineException(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF);
|
||||
}
|
||||
Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).active().singleResult();
|
||||
if (Objects.isNull(task)) {
|
||||
throw new WorkflowEngineException(TASK_COMPLETE_FAIL_NOT_EXISTS);
|
||||
}
|
||||
taskService.setAssignee(task.getId(), dto.getNewUserId());
|
||||
if ((StringUtils.hasLength(task.getAssignee()) && Objects.isNull(dto.getOriginAssigner()))
|
||||
|| !Objects.equals(task.getAssignee(), dto.getOriginAssigner().getAssigneeId())) {
|
||||
throw new WorkflowEngineException(TASK_COMPLETE_FAIL_ASSIGN_NOT_SELF);
|
||||
}
|
||||
|
||||
if (Objects.isNull(dto.getTargetAssigner())) {
|
||||
taskService.setAssignee(task.getId(), "");
|
||||
runtimeService.removeVariable(task.getProcessInstanceId(), INTERNAL_SPECIFY_NEXT_APPROVER);
|
||||
runtimeService.removeVariable(task.getProcessInstanceId() + task.getTaskDefinitionKey(),
|
||||
INTERNAL_TASK_RELATION_ASSIGNEE_INFO);
|
||||
runtimeService.removeVariable(task.getProcessInstanceId() + task.getTaskDefinitionKey(),
|
||||
INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT);
|
||||
} else {
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), INTERNAL_SPECIFY_NEXT_APPROVER,
|
||||
dto.getTargetAssigner());
|
||||
runtimeService.setVariable(task.getProcessInstanceId(),
|
||||
INTERNAL_TASK_RELATION_ASSIGNEE_INFO + task.getTaskDefinitionKey(),
|
||||
dto.getTargetAssigner().getAssigneeId());
|
||||
runtimeService.setVariable(task.getProcessInstanceId(),
|
||||
INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + task.getTaskDefinitionKey(),
|
||||
dto.getTargetAssigner());
|
||||
|
||||
taskService.setAssignee(task.getId(), dto.getTargetAssigner().getAssigneeId());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -1,103 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
|
||||
xmlns:flowable="http://flowable.org/bpmn"
|
||||
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
|
||||
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
|
||||
typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
|
||||
targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler"
|
||||
exporterVersion="6.7.2">
|
||||
<process id="secend" name="secend" isExecutable="true">
|
||||
<documentation>secend</documentation>
|
||||
<startEvent id="startEvent1" flowable:formFieldValidation="true"></startEvent>
|
||||
<userTask id="sid-6589489F-EE93-43F2-A98F-78F5A578D39B" name="第一个审批" flowable:assignee="${assigneeName}"
|
||||
flowable:formFieldValidation="true">
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${engineExecutionStartListener}"></flowable:executionListener>
|
||||
<flowable:executionListener event="end"
|
||||
delegateExpression="${engineExecutionEndListener}"></flowable:executionListener>
|
||||
<flowable:taskListener event="all"
|
||||
delegateExpression="${engineTaskEventListener}"></flowable:taskListener>
|
||||
|
||||
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler">
|
||||
<![CDATA[false]]></modeler:initiator-can-complete>
|
||||
<assigneRule>
|
||||
<type>platform</type>
|
||||
<ruleType>dept</ruleType>
|
||||
<rule>11</rule>
|
||||
</assigneRule>
|
||||
</extensionElements>
|
||||
<multiInstanceLoopCharacteristics isSequential="false"
|
||||
flowable:collection="sid-6589489F-EE93-43F2-A98F-78F5A578D39B_assigneeList"
|
||||
flowable:elementVariable="assigneeName">
|
||||
<completionCondition>${nrOfCompletedInstances > 0}</completionCondition>
|
||||
</multiInstanceLoopCharacteristics>
|
||||
</userTask>
|
||||
<sequenceFlow id="sid-7A2B3B51-387C-4957-830C-F4B75147DD15" sourceRef="startEvent1"
|
||||
targetRef="sid-6589489F-EE93-43F2-A98F-78F5A578D39B"></sequenceFlow>
|
||||
<userTask id="sid-8C8483DD-4CD0-4228-9374-F4E4FA7D1B6A" name="第二个审批" flowable:assignee="a"
|
||||
flowable:formFieldValidation="true">
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${engineExecutionStartListener}"></flowable:executionListener>
|
||||
<flowable:taskListener event="all"
|
||||
delegateExpression="${engineTaskEventListener}"></flowable:taskListener>
|
||||
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler">
|
||||
<![CDATA[false]]></modeler:initiator-can-complete>
|
||||
</extensionElements>
|
||||
</userTask>
|
||||
<boundaryEvent id="sid-B36B57EB-AC4C-4C3E-A0E3-3DD9EC190191" name="边界定时"
|
||||
attachedToRef="sid-6589489F-EE93-43F2-A98F-78F5A578D39B" cancelActivity="false">
|
||||
|
||||
<timerEventDefinition>
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${checkDueDateDelegate}"></flowable:executionListener>
|
||||
</extensionElements>
|
||||
<timeCycle>R/PT1M</timeCycle>
|
||||
</timerEventDefinition>
|
||||
</boundaryEvent>
|
||||
<sequenceFlow id="sid-D6C7D39C-BF03-4883-A1DD-A325C6923F88" sourceRef="sid-6589489F-EE93-43F2-A98F-78F5A578D39B"
|
||||
targetRef="sid-8C8483DD-4CD0-4228-9374-F4E4FA7D1B6A"></sequenceFlow>
|
||||
<endEvent id="sid-13A464D9-EDD5-428E-A70D-984030D5EDAE"></endEvent>
|
||||
<sequenceFlow id="sid-AA453DEB-FA22-4314-B422-B70A439AE4EF" sourceRef="sid-8C8483DD-4CD0-4228-9374-F4E4FA7D1B6A"
|
||||
targetRef="sid-13A464D9-EDD5-428E-A70D-984030D5EDAE"></sequenceFlow>
|
||||
</process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_secend">
|
||||
<bpmndi:BPMNPlane bpmnElement="secend" id="BPMNPlane_secend">
|
||||
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
|
||||
<omgdc:Bounds height="30.0" width="30.0" x="100.0" y="160.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="sid-6589489F-EE93-43F2-A98F-78F5A578D39B"
|
||||
id="BPMNShape_sid-6589489F-EE93-43F2-A98F-78F5A578D39B">
|
||||
<omgdc:Bounds height="80.0" width="100.0" x="180.0" y="135.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="sid-8C8483DD-4CD0-4228-9374-F4E4FA7D1B6A"
|
||||
id="BPMNShape_sid-8C8483DD-4CD0-4228-9374-F4E4FA7D1B6A">
|
||||
<omgdc:Bounds height="80.0" width="100.0" x="315.0" y="135.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="sid-13A464D9-EDD5-428E-A70D-984030D5EDAE"
|
||||
id="BPMNShape_sid-13A464D9-EDD5-428E-A70D-984030D5EDAE">
|
||||
<omgdc:Bounds height="28.0" width="28.0" x="460.0" y="161.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge bpmnElement="sid-D6C7D39C-BF03-4883-A1DD-A325C6923F88"
|
||||
id="BPMNEdge_sid-D6C7D39C-BF03-4883-A1DD-A325C6923F88" flowable:sourceDockerX="50.0"
|
||||
flowable:sourceDockerY="40.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
|
||||
<omgdi:waypoint x="279.9499999999527" y="175.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="314.99999999997203" y="175.0"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sid-AA453DEB-FA22-4314-B422-B70A439AE4EF"
|
||||
id="BPMNEdge_sid-AA453DEB-FA22-4314-B422-B70A439AE4EF" flowable:sourceDockerX="50.0"
|
||||
flowable:sourceDockerY="40.0" flowable:targetDockerX="14.0" flowable:targetDockerY="14.0">
|
||||
<omgdi:waypoint x="414.95000000000005" y="175.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="460.0" y="175.0"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sid-7A2B3B51-387C-4957-830C-F4B75147DD15"
|
||||
id="BPMNEdge_sid-7A2B3B51-387C-4957-830C-F4B75147DD15" flowable:sourceDockerX="15.0"
|
||||
flowable:sourceDockerY="15.0" flowable:targetDockerX="50.0" flowable:targetDockerY="40.0">
|
||||
<omgdi:waypoint x="129.9499986183554" y="175.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="180.0" y="175.0"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</definitions>
|
||||
@ -4,16 +4,17 @@ import cn.axzo.workflow.core.listener.BpmActivityEventListener;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
|
||||
import org.flowable.engine.delegate.event.impl.FlowableActivityEventImpl;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* 自定义实现的流程监听器, 实现了 Ordered 接口
|
||||
*
|
||||
* 注意:Order 值越小,优先级越高
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2023/7/24 17:33
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
//@Component
|
||||
public class CustomBpmActivityEventListener implements BpmActivityEventListener {
|
||||
|
||||
@Override
|
||||
@ -22,6 +23,7 @@ public class CustomBpmActivityEventListener implements BpmActivityEventListener
|
||||
((FlowableActivityEventImpl) event).getActivityId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return 99;
|
||||
}
|
||||
|
||||
@ -6,7 +6,6 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
|
||||
import org.flowable.engine.delegate.event.FlowableCancelledEvent;
|
||||
import org.flowable.engine.delegate.event.FlowableProcessStartedEvent;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 自定义实现的流程监听器, 实现了 Ordered 接口
|
||||
@ -17,7 +16,7 @@ import org.springframework.stereotype.Component;
|
||||
* @since 2023/7/10 18:22
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
//@Component
|
||||
public class CustomBpmProcessEventListener implements BpmProcessEventListener {
|
||||
@Override
|
||||
public void onCreated(FlowableEngineEntityEvent event) {
|
||||
|
||||
@ -3,34 +3,35 @@ package cn.axzo.workflow.server.controller.listener;
|
||||
import cn.axzo.workflow.core.listener.BpmTaskEventListener;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.task.service.delegate.DelegateTask;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
* 自定义实现的流程监听器, 实现了 Ordered 接口
|
||||
* <p>
|
||||
* 注意:Order 值越小,优先级越高
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2023/9/25 18:50
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
//@Component
|
||||
public class CustomBpmTaskTaskEventListener implements BpmTaskEventListener {
|
||||
@Override
|
||||
public void created(DelegateTask delegateTask) {
|
||||
public void onCreated(DelegateTask delegateTask) {
|
||||
log.info("task created...");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assigned(DelegateTask delegateTask) {
|
||||
public void onAssigned(DelegateTask delegateTask) {
|
||||
log.info("task assigned...");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void completed(DelegateTask delegateTask) {
|
||||
public void onCompleted(DelegateTask delegateTask) {
|
||||
log.info("task completed...");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleted(DelegateTask delegateTask) {
|
||||
public void onDeleted(DelegateTask delegateTask) {
|
||||
log.info("task deleted...");
|
||||
}
|
||||
|
||||
|
||||
@ -56,7 +56,7 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener
|
||||
.setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId())
|
||||
.setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName());
|
||||
log.info("create processInstance mq data: {}", JSON.toJSONString(dto));
|
||||
log.info("RocketMqBpmProcessEventListener#onCreated MQ.Data: {}", JSON.toJSONString(dto));
|
||||
eventProducer.send(Event.builder()
|
||||
.shardingKey(event.getProcessInstanceId())
|
||||
.eventCode(PROCESS_INSTANCE_CREATED.getEventCode())
|
||||
@ -88,7 +88,7 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener
|
||||
.setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId())
|
||||
.setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getProcessInstance().getBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getProcessInstance().getName());
|
||||
log.info("start processInstance mq data: {}", JSON.toJSONString(dto));
|
||||
log.info("RocketMqBpmProcessEventListener#onStarted MQ.Data: {}", JSON.toJSONString(dto));
|
||||
eventProducer.send(Event.builder()
|
||||
.shardingKey(((ExecutionEntityImpl) event.getEntity()).getProcessInstanceId())
|
||||
.eventCode(PROCESS_INSTANCE_STARTED.getEventCode())
|
||||
@ -121,7 +121,7 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener
|
||||
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
|
||||
.setCancelReason(String.valueOf(event.getCause()));
|
||||
log.info("cancel processInstance mq data: {}", JSON.toJSONString(dto));
|
||||
log.info("RocketMqBpmProcessEventListener#onCancelled MQ.Data: {}", JSON.toJSONString(dto));
|
||||
eventProducer.send(Event.builder()
|
||||
.shardingKey(event.getProcessInstanceId())
|
||||
.eventCode(PROCESS_INSTANCE_CANCELLED.getEventCode())
|
||||
@ -142,7 +142,31 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener
|
||||
log.info("RocketMQ onRejected: ClassName: {}, event: {}", event.getClass().getName(),
|
||||
JSON.toJSONString(event));
|
||||
}
|
||||
log.info("rejected processInstance mq data: {}", JSON.toJSONString(null));
|
||||
Deployment deployment =
|
||||
repositoryService.createDeploymentQuery().deploymentId(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getDeploymentId())
|
||||
.singleResult();
|
||||
ProcessInstanceDTO dto = new ProcessInstanceDTO()
|
||||
.setType(PROCESS_INSTANCE_REJECTED)
|
||||
.setCategory(deployment.getCategory())
|
||||
.setProcessInstanceId(event.getProcessInstanceId())
|
||||
.setCurrentElementKey("取消流程实例无节点信息")
|
||||
.setProcessDefinitionId(event.getProcessDefinitionId())
|
||||
.setProcessDefinitionKey(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getProcessDefinitionKey())
|
||||
.setProcessDefinitionVersion(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getProcessDefinitionVersion())
|
||||
.setVariables(((FlowableProcessCancelledEventImpl) event).getExecution().getVariables())
|
||||
.setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime())
|
||||
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
|
||||
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
|
||||
.setCancelReason(String.valueOf(event.getCause()));
|
||||
log.info("RocketMqBpmProcessEventListener#onRejected MQ.Data: {}", JSON.toJSONString(dto));
|
||||
eventProducer.send(Event.builder()
|
||||
.shardingKey(event.getProcessInstanceId())
|
||||
.eventCode(PROCESS_INSTANCE_REJECTED.getEventCode())
|
||||
.targetId(event.getProcessInstanceId())
|
||||
.targetType(PROCESS_INSTANCE_REJECTED.getTag())
|
||||
.data(dto)
|
||||
.build());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -151,7 +175,30 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener
|
||||
log.info("RocketMQ onCompleted: ClassName: {}, event: {}", event.getClass().getName(),
|
||||
JSON.toJSONString(event));
|
||||
}
|
||||
log.info("completed processInstance mq data: {}", JSON.toJSONString(null));
|
||||
Deployment deployment =
|
||||
repositoryService.createDeploymentQuery().deploymentId(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getDeploymentId())
|
||||
.singleResult();
|
||||
ProcessInstanceDTO dto = new ProcessInstanceDTO()
|
||||
.setType(PROCESS_INSTANCE_COMPLETED)
|
||||
.setCategory(deployment.getCategory())
|
||||
.setProcessInstanceId(event.getProcessInstanceId())
|
||||
.setCurrentElementKey("取消流程实例无节点信息")
|
||||
.setProcessDefinitionId(event.getProcessDefinitionId())
|
||||
.setProcessDefinitionKey(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getProcessDefinitionKey())
|
||||
.setProcessDefinitionVersion(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getProcessDefinitionVersion())
|
||||
.setVariables(((FlowableProcessCancelledEventImpl) event).getExecution().getVariables())
|
||||
.setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime())
|
||||
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
|
||||
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName());
|
||||
log.info("RocketMqBpmProcessEventListener#onCompleted MQ.Data: {}", JSON.toJSONString(dto));
|
||||
eventProducer.send(Event.builder()
|
||||
.shardingKey(event.getProcessInstanceId())
|
||||
.eventCode(PROCESS_INSTANCE_COMPLETED.getEventCode())
|
||||
.targetId(event.getProcessInstanceId())
|
||||
.targetType(PROCESS_INSTANCE_COMPLETED.getTag())
|
||||
.data(dto)
|
||||
.build());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
package cn.axzo.workflow.server.controller.listener;
|
||||
|
||||
import cn.axzo.framework.jackson.utility.JSON;
|
||||
import cn.axzo.framework.rocketmq.Event;
|
||||
import cn.axzo.framework.rocketmq.EventProducer;
|
||||
import cn.axzo.workflow.common.enums.ProcessTaskEventEnum;
|
||||
@ -39,42 +38,42 @@ public class RocketMqBpmTaskEventListener implements BpmTaskEventListener {
|
||||
private RepositoryService repositoryService;
|
||||
|
||||
@Override
|
||||
public void created(DelegateTask delegateTask) {
|
||||
public void onCreated(DelegateTask delegateTask) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("task created event");
|
||||
}
|
||||
ProcessTaskDTO dto = build(delegateTask, PROCESS_TASK_CREATED);
|
||||
log.info("task created mq data: {}", JSON.toJSONString(dto));
|
||||
log.info("RocketMqBpmTaskEventListener#onCreated MQ.Data: {}", com.alibaba.fastjson.JSON.toJSONString(dto));
|
||||
sendMessageQueue(dto, PROCESS_TASK_CREATED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void assigned(DelegateTask delegateTask) {
|
||||
public void onAssigned(DelegateTask delegateTask) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("task assigned event");
|
||||
}
|
||||
ProcessTaskDTO dto = build(delegateTask, PROCESS_TASK_ASSIGNED);
|
||||
log.info("task assigned mq data: {}", JSON.toJSONString(dto));
|
||||
log.info("RocketMqBpmTaskEventListener#onAssigned MQ.Data: {}", com.alibaba.fastjson.JSON.toJSONString(dto));
|
||||
sendMessageQueue(dto, PROCESS_TASK_ASSIGNED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void completed(DelegateTask delegateTask) {
|
||||
public void onCompleted(DelegateTask delegateTask) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("task completed event");
|
||||
}
|
||||
ProcessTaskDTO dto = build(delegateTask, PROCESS_TASK_COMPLETED);
|
||||
log.info("task completed mq data: {}", JSON.toJSONString(dto));
|
||||
log.info("RocketMqBpmTaskEventListener#onCompleted MQ.Data: {}", com.alibaba.fastjson.JSON.toJSONString(dto));
|
||||
sendMessageQueue(dto, PROCESS_TASK_COMPLETED);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleted(DelegateTask delegateTask) {
|
||||
public void onDeleted(DelegateTask delegateTask) {
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("task deleted event");
|
||||
}
|
||||
ProcessTaskDTO dto = build(delegateTask, PROCESS_TASK_DELETED);
|
||||
log.info("task deleted mq data: {}", JSON.toJSONString(dto));
|
||||
log.info("RocketMqBpmTaskEventListener#onDeleted MQ.Data: {}", com.alibaba.fastjson.JSON.toJSONString(dto));
|
||||
sendMessageQueue(dto, PROCESS_TASK_DELETED);
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.*;
|
||||
import cn.axzo.workflow.common.valid.group.ValidGroup;
|
||||
import cn.axzo.workflow.core.service.BpmnTaskService;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
@ -56,7 +57,7 @@ public class BpmnTaskController implements ProcessTaskApi {
|
||||
*/
|
||||
@PutMapping("/approve")
|
||||
@Override
|
||||
public CommonResponse<Boolean> approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto) {
|
||||
public CommonResponse<Boolean> approveTask(@Validated(ValidGroup.Insert.class) @RequestBody BpmnTaskAuditDTO dto) {
|
||||
log.info("同意 approveTask===>>>参数:{}", dto);
|
||||
bpmnTaskService.approveTask(dto);
|
||||
return success(true);
|
||||
@ -67,7 +68,7 @@ public class BpmnTaskController implements ProcessTaskApi {
|
||||
*/
|
||||
@PutMapping("/reject")
|
||||
@Override
|
||||
public CommonResponse<Boolean> rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto) {
|
||||
public CommonResponse<Boolean> rejectTask(@Validated(ValidGroup.Update.class) @RequestBody BpmnTaskAuditDTO dto) {
|
||||
log.info("拒绝 rejectTask===>>>参数:{}", dto);
|
||||
bpmnTaskService.rejectTask(dto);
|
||||
return success(true);
|
||||
|
||||
@ -1,35 +1,35 @@
|
||||
{
|
||||
"id": "NODE1639041346796_0.5413743892974803_0",
|
||||
"id": "NODE_STARTER",
|
||||
"type": "NODE_STARTER",
|
||||
"name": "发起",
|
||||
"children": {
|
||||
"id": "NODE1639041346796_0.5413743892974803_2",
|
||||
"parentId": "NODE1639041346796_0.5413743892974803_1",
|
||||
"id": "NODE_CONFIG",
|
||||
"parentId": "NODE_STARTER",
|
||||
"type": "NODE_TASK",
|
||||
"name": "权限配置",
|
||||
"children": {
|
||||
"id": "NODE1639041346796_0.5413743892974803_3",
|
||||
"parentId": "NODE1639041346796_0.5413743892974803_2",
|
||||
"id": "NODE_RELEASE_DEV",
|
||||
"parentId": "NODE_CONFIG",
|
||||
"type": "NODE_TASK",
|
||||
"name": "发布 DEV",
|
||||
"children": {
|
||||
"id": "NODE1639041346796_0.5413743892974803_4",
|
||||
"parentId": "NODE1639041346796_0.5413743892974803_3",
|
||||
"id": "NODE_RELEASE_TEST",
|
||||
"parentId": "NODE_RELEASE_DEV",
|
||||
"type": "NODE_TASK",
|
||||
"name": "发布 TEST",
|
||||
"children": {
|
||||
"id": "NODE1639041346796_0.5413743892974803_5",
|
||||
"parentId": "NODE1639041346796_0.5413743892974803_4",
|
||||
"id": "NODE_RELEASE_PRE",
|
||||
"parentId": "NODE_RELEASE_TEST",
|
||||
"type": "NODE_TASK",
|
||||
"name": "发布 PRE",
|
||||
"children": {
|
||||
"id": "NODE1639041346796_0.5413743892974803_6",
|
||||
"parentId": "NODE1639041346796_0.5413743892974803_5",
|
||||
"id": "NODE_RELEASE_PROD",
|
||||
"parentId": "NODE_RELEASE_PRE",
|
||||
"type": "NODE_TASK",
|
||||
"name": "发布生产",
|
||||
"children": {
|
||||
"id": "NODE1639041346796_0.5413743892974803_7",
|
||||
"parentId": "NODE1639041346796_0.5413743892974803_6",
|
||||
"id": "NODE_ACCEPTANCE",
|
||||
"parentId": "NODE_RELEASE_PROD",
|
||||
"type": "NODE_TASK",
|
||||
"name": "产品验收"
|
||||
}
|
||||
|
||||
@ -4,10 +4,10 @@
|
||||
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
|
||||
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
|
||||
typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
|
||||
targetNamespace="auth_point">
|
||||
<process id="auth_point" name="权限点发布" isExecutable="true">
|
||||
<startEvent id="NODE1639041346796_0.5413743892974803_0" flowable:initiator="applyUserId"></startEvent>
|
||||
<userTask id="NODE1639041346796_0.5413743892974803_2" name="权限配置">
|
||||
targetNamespace="auth_point_category">
|
||||
<process id="auth_point_key" name="权限点发布" isExecutable="true">
|
||||
<startEvent id="NODE_STARTER" flowable:initiator="applyUserId"></startEvent>
|
||||
<userTask id="NODE_CONFIG" name="权限配置">
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${engineExecutionStartListener}"></flowable:executionListener>
|
||||
@ -15,10 +15,9 @@
|
||||
delegateExpression="${engineTaskEventListener}"></flowable:taskListener>
|
||||
</extensionElements>
|
||||
</userTask>
|
||||
<sequenceFlow id="sequenceFlow_9d9fe230fa824ac7b50ba77958fae08c"
|
||||
sourceRef="NODE1639041346796_0.5413743892974803_0"
|
||||
targetRef="NODE1639041346796_0.5413743892974803_2"></sequenceFlow>
|
||||
<userTask id="NODE1639041346796_0.5413743892974803_3" name="发布 DEV">
|
||||
<sequenceFlow id="sequenceFlow_3ab879d8c5684d4c8140a7875cf2ab8e" sourceRef="NODE_STARTER"
|
||||
targetRef="NODE_CONFIG"></sequenceFlow>
|
||||
<userTask id="NODE_RELEASE_DEV" name="发布 DEV">
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${engineExecutionStartListener}"></flowable:executionListener>
|
||||
@ -26,10 +25,9 @@
|
||||
delegateExpression="${engineTaskEventListener}"></flowable:taskListener>
|
||||
</extensionElements>
|
||||
</userTask>
|
||||
<sequenceFlow id="sequenceFlow_660c2d5efd304d61873e1775f9be9a98"
|
||||
sourceRef="NODE1639041346796_0.5413743892974803_2"
|
||||
targetRef="NODE1639041346796_0.5413743892974803_3"></sequenceFlow>
|
||||
<userTask id="NODE1639041346796_0.5413743892974803_4" name="发布 TEST">
|
||||
<sequenceFlow id="sequenceFlow_f2390ae5250945e2b0e85d35252cdc2c" sourceRef="NODE_CONFIG"
|
||||
targetRef="NODE_RELEASE_DEV"></sequenceFlow>
|
||||
<userTask id="NODE_RELEASE_TEST" name="发布 TEST">
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${engineExecutionStartListener}"></flowable:executionListener>
|
||||
@ -37,10 +35,9 @@
|
||||
delegateExpression="${engineTaskEventListener}"></flowable:taskListener>
|
||||
</extensionElements>
|
||||
</userTask>
|
||||
<sequenceFlow id="sequenceFlow_577b9a06d3924a68b40f2ccbd25e600d"
|
||||
sourceRef="NODE1639041346796_0.5413743892974803_3"
|
||||
targetRef="NODE1639041346796_0.5413743892974803_4"></sequenceFlow>
|
||||
<userTask id="NODE1639041346796_0.5413743892974803_5" name="发布 PRE">
|
||||
<sequenceFlow id="sequenceFlow_f2ec870d301044d4a0db3ba70ac8ddd2" sourceRef="NODE_RELEASE_DEV"
|
||||
targetRef="NODE_RELEASE_TEST"></sequenceFlow>
|
||||
<userTask id="NODE_RELEASE_PRE" name="发布 PRE">
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${engineExecutionStartListener}"></flowable:executionListener>
|
||||
@ -48,10 +45,9 @@
|
||||
delegateExpression="${engineTaskEventListener}"></flowable:taskListener>
|
||||
</extensionElements>
|
||||
</userTask>
|
||||
<sequenceFlow id="sequenceFlow_80f81c8b816c4445b3256fd565bcd3da"
|
||||
sourceRef="NODE1639041346796_0.5413743892974803_4"
|
||||
targetRef="NODE1639041346796_0.5413743892974803_5"></sequenceFlow>
|
||||
<userTask id="NODE1639041346796_0.5413743892974803_6" name="发布生产">
|
||||
<sequenceFlow id="sequenceFlow_d666cfe03d734fb5bbfb69b71c2c411f" sourceRef="NODE_RELEASE_TEST"
|
||||
targetRef="NODE_RELEASE_PRE"></sequenceFlow>
|
||||
<userTask id="NODE_RELEASE_PROD" name="发布生产">
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${engineExecutionStartListener}"></flowable:executionListener>
|
||||
@ -59,10 +55,9 @@
|
||||
delegateExpression="${engineTaskEventListener}"></flowable:taskListener>
|
||||
</extensionElements>
|
||||
</userTask>
|
||||
<sequenceFlow id="sequenceFlow_2438f09faa364d3ca153cd7ef5fe71fb"
|
||||
sourceRef="NODE1639041346796_0.5413743892974803_5"
|
||||
targetRef="NODE1639041346796_0.5413743892974803_6"></sequenceFlow>
|
||||
<userTask id="NODE1639041346796_0.5413743892974803_7" name="产品验收">
|
||||
<sequenceFlow id="sequenceFlow_4809c60fc59d47239b9339e7c3de959c" sourceRef="NODE_RELEASE_PRE"
|
||||
targetRef="NODE_RELEASE_PROD"></sequenceFlow>
|
||||
<userTask id="NODE_ACCEPTANCE" name="产品验收">
|
||||
<extensionElements>
|
||||
<flowable:executionListener event="start"
|
||||
delegateExpression="${engineExecutionStartListener}"></flowable:executionListener>
|
||||
@ -70,95 +65,87 @@
|
||||
delegateExpression="${engineTaskEventListener}"></flowable:taskListener>
|
||||
</extensionElements>
|
||||
</userTask>
|
||||
<sequenceFlow id="sequenceFlow_f8be843f5b38496ab776cc1f5db86b53"
|
||||
sourceRef="NODE1639041346796_0.5413743892974803_6"
|
||||
targetRef="NODE1639041346796_0.5413743892974803_7"></sequenceFlow>
|
||||
<sequenceFlow id="sequenceFlow_f0e287e9acb4441e9cf8e73be1e14abd" sourceRef="NODE_RELEASE_PROD"
|
||||
targetRef="NODE_ACCEPTANCE"></sequenceFlow>
|
||||
<endEvent id="endEventNode"></endEvent>
|
||||
<sequenceFlow id="sequenceFlow_e00a6ab0a8794541ab4ccab6acd63c7b"
|
||||
sourceRef="NODE1639041346796_0.5413743892974803_7" targetRef="endEventNode"></sequenceFlow>
|
||||
<sequenceFlow id="sequenceFlow_9b49b56d7ca2455fbb200f6f26aa27af" sourceRef="NODE_ACCEPTANCE"
|
||||
targetRef="endEventNode"></sequenceFlow>
|
||||
</process>
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_auth_point">
|
||||
<bpmndi:BPMNPlane bpmnElement="auth_point" id="BPMNPlane_auth_point">
|
||||
<bpmndi:BPMNShape bpmnElement="NODE1639041346796_0.5413743892974803_2"
|
||||
id="BPMNShape_NODE1639041346796_0.5413743892974803_2">
|
||||
<bpmndi:BPMNDiagram id="BPMNDiagram_auth_point_key">
|
||||
<bpmndi:BPMNPlane bpmnElement="auth_point_key" id="BPMNPlane_auth_point_key">
|
||||
<bpmndi:BPMNShape bpmnElement="NODE_RELEASE_PRE" id="BPMNShape_NODE_RELEASE_PRE">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="530.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE_ACCEPTANCE" id="BPMNShape_NODE_ACCEPTANCE">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="830.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE_RELEASE_PROD" id="BPMNShape_NODE_RELEASE_PROD">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="680.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE_CONFIG" id="BPMNShape_NODE_CONFIG">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="80.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE1639041346796_0.5413743892974803_3"
|
||||
id="BPMNShape_NODE1639041346796_0.5413743892974803_3">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="230.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE1639041346796_0.5413743892974803_0"
|
||||
id="BPMNShape_NODE1639041346796_0.5413743892974803_0">
|
||||
<omgdc:Bounds height="30.0" width="30.0" x="0.0" y="15.0"></omgdc:Bounds>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE_RELEASE_TEST" id="BPMNShape_NODE_RELEASE_TEST">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="380.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="endEventNode" id="BPMNShape_endEventNode">
|
||||
<omgdc:Bounds height="30.0" width="30.0" x="980.0" y="15.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE1639041346796_0.5413743892974803_6"
|
||||
id="BPMNShape_NODE1639041346796_0.5413743892974803_6">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="680.0" y="0.0"></omgdc:Bounds>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE_RELEASE_DEV" id="BPMNShape_NODE_RELEASE_DEV">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="230.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE1639041346796_0.5413743892974803_7"
|
||||
id="BPMNShape_NODE1639041346796_0.5413743892974803_7">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="830.0" y="0.0"></omgdc:Bounds>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE_STARTER" id="BPMNShape_NODE_STARTER">
|
||||
<omgdc:Bounds height="30.0" width="30.0" x="0.0" y="15.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE1639041346796_0.5413743892974803_4"
|
||||
id="BPMNShape_NODE1639041346796_0.5413743892974803_4">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="380.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNShape bpmnElement="NODE1639041346796_0.5413743892974803_5"
|
||||
id="BPMNShape_NODE1639041346796_0.5413743892974803_5">
|
||||
<omgdc:Bounds height="60.0" width="100.0" x="530.0" y="0.0"></omgdc:Bounds>
|
||||
</bpmndi:BPMNShape>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_2438f09faa364d3ca153cd7ef5fe71fb"
|
||||
id="BPMNEdge_sequenceFlow_2438f09faa364d3ca153cd7ef5fe71fb">
|
||||
<omgdi:waypoint x="630.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="642.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="642.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="680.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_9d9fe230fa824ac7b50ba77958fae08c"
|
||||
id="BPMNEdge_sequenceFlow_9d9fe230fa824ac7b50ba77958fae08c">
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_3ab879d8c5684d4c8140a7875cf2ab8e"
|
||||
id="BPMNEdge_sequenceFlow_3ab879d8c5684d4c8140a7875cf2ab8e">
|
||||
<omgdi:waypoint x="30.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="42.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="42.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="80.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_660c2d5efd304d61873e1775f9be9a98"
|
||||
id="BPMNEdge_sequenceFlow_660c2d5efd304d61873e1775f9be9a98">
|
||||
<omgdi:waypoint x="180.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="192.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="192.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="230.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_577b9a06d3924a68b40f2ccbd25e600d"
|
||||
id="BPMNEdge_sequenceFlow_577b9a06d3924a68b40f2ccbd25e600d">
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_f2ec870d301044d4a0db3ba70ac8ddd2"
|
||||
id="BPMNEdge_sequenceFlow_f2ec870d301044d4a0db3ba70ac8ddd2">
|
||||
<omgdi:waypoint x="330.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="342.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="342.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="380.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_e00a6ab0a8794541ab4ccab6acd63c7b"
|
||||
id="BPMNEdge_sequenceFlow_e00a6ab0a8794541ab4ccab6acd63c7b">
|
||||
<omgdi:waypoint x="930.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="942.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="942.0" y="30.000000000000004"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="980.0" y="30.000000000000004"></omgdi:waypoint>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_4809c60fc59d47239b9339e7c3de959c"
|
||||
id="BPMNEdge_sequenceFlow_4809c60fc59d47239b9339e7c3de959c">
|
||||
<omgdi:waypoint x="630.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="642.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="642.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="680.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_80f81c8b816c4445b3256fd565bcd3da"
|
||||
id="BPMNEdge_sequenceFlow_80f81c8b816c4445b3256fd565bcd3da">
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_f2390ae5250945e2b0e85d35252cdc2c"
|
||||
id="BPMNEdge_sequenceFlow_f2390ae5250945e2b0e85d35252cdc2c">
|
||||
<omgdi:waypoint x="180.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="192.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="192.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="230.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_d666cfe03d734fb5bbfb69b71c2c411f"
|
||||
id="BPMNEdge_sequenceFlow_d666cfe03d734fb5bbfb69b71c2c411f">
|
||||
<omgdi:waypoint x="480.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="492.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="492.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="530.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_f8be843f5b38496ab776cc1f5db86b53"
|
||||
id="BPMNEdge_sequenceFlow_f8be843f5b38496ab776cc1f5db86b53">
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_f0e287e9acb4441e9cf8e73be1e14abd"
|
||||
id="BPMNEdge_sequenceFlow_f0e287e9acb4441e9cf8e73be1e14abd">
|
||||
<omgdi:waypoint x="780.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="792.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="792.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="830.0" y="30.000000000000007"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_9b49b56d7ca2455fbb200f6f26aa27af"
|
||||
id="BPMNEdge_sequenceFlow_9b49b56d7ca2455fbb200f6f26aa27af">
|
||||
<omgdi:waypoint x="930.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="942.0" y="30.0"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="942.0" y="30.000000000000004"></omgdi:waypoint>
|
||||
<omgdi:waypoint x="980.0" y="30.000000000000004"></omgdi:waypoint>
|
||||
</bpmndi:BPMNEdge>
|
||||
</bpmndi:BPMNPlane>
|
||||
</bpmndi:BPMNDiagram>
|
||||
</definitions>
|
||||
|
||||
BIN
workflow-engine-server/src/main/resources/权限点流程图.png
Normal file
BIN
workflow-engine-server/src/main/resources/权限点流程图.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.6 KiB |
Loading…
Reference in New Issue
Block a user