前言

上文对工作流进行了一些基本的介绍,有了根底篇的内容,相信咱们能够很简略笼统了一些实体模型:流程模型、开端节点模型、完毕节点模型、使命节点模型、决议计划节点模型、分支节点模型、兼并节点模型、边模型。

根底模型

咱们把模型进行进一步笼统,能够得到根底模型,根底模型只包含两个特点,仅有编码和显现称号。

工作流引擎设计与实现模型抽象

public class BaseModel {
    private String name; // 仅有编码
    private String displayName; // 显现称号
}

模型行为

如果依照面向方针来看,流程模型本身除了特点外,还应该具有办法和行为,即节点和边所能做的事,这儿用Action接口来界说。

工作流引擎设计与实现模型抽象

public interface Action {
    public void execute(Execution execution);
}

因每个流程模型履行的条件或许不一样,这儿一致运用Execution类来界说,下面先简略界说其必要特点,后续依据需求再追加。

工作流引擎设计与实现模型抽象

public class Execution {
    private String processInstanceId; // 流程实例ID
    private String processTaskId; // 当时流程使命ID
    // 履行方针扩展参数
    private Dict args;
}

节点模型

流程模型由节点模型和边构成,节点的类型尽管许多,但是依然能够对其进行进一步笼统。节点都有自己通用性的行为,如前置阻拦、后置阻拦、日志处理等,除了通用性行为外,还能够依据子类不同的特性,完结exec笼统办法。

工作流引擎设计与实现模型抽象

public abstract class NodeModel extends BaseModel implements Action {
    private String layout;// 布局特点(x,y,w,h)
    // 输入边调集
    private List<TransitionModel> inputs = new ArrayList<TransitionModel>();
    // 输出边调集
    private List<TransitionModel> outputs = new ArrayList<TransitionModel>();
    private String preInterceptors; // 节点前置阻拦器
    private String postInterceptors; // 节点后置阻拦器
    /**
     * 由子类自界说履行办法
     * @param execution
     */
    @Override
    abstract void exec(Execution execution);
    @Override
    public void execute(Execution execution) {
        // 1. 调用前置阻拦器
        // 2. 调用子类的exec办法
        // 3. 调用后置阻拦器
        exec(execution);
    }
}

有了节点模型后,其他详细的节点模型就会显现相对简略。

开端节点模型

开端节点首要承继节点模型并完结其exec办法。

工作流引擎设计与实现模型抽象

public class StartModel extends NodeModel {
    @Override
    public void exec(Execution execution) {
        // 履行开端节点自界说履行逻辑
    }
}

完毕节点模型

完毕节点也是承继节点模型并完结exec办法。

工作流引擎设计与实现模型抽象

public class EndModel extends NodeModel {
    @Override
    public void exec(Execution execution) {
        // 履行完毕节点自界说履行逻辑
    }
}

使命节点模型

使命节点是流程中非常重要的节点,其具有更多自己的特点。当然,下面仅仅把常用的特点罗列出来,后续也依据详细完结的事务,增加和删去其特点。

工作流引擎设计与实现模型抽象

public class TaskModel extends NodeModel {
    private String form; // 表单标识
    private String assignee; // 参加人
    private String assignmentHandler; // 参加人处理类
    private TaskTypeEnum taskType; // 使命类型(主办/协办)
    private TaskPerformTypeEnum performType; // 参加类型(一般参加/会签参加)
    private String reminderTime; // 提示时刻
    private String reminderRepeat; // 重复提示距离
    private String expireTime; // 等待使命完结时刻变量key
    private String autoExecute; // 到期是否自动履行Y/N
    private String callback; // 自动履行回调类
    private Dict ext = Dict.create(); // 自界说扩展特点
    @Override
    public void exec(Execution execution) {
        // 履行使命节点自界说履行逻辑
    }
}

决议计划节点模型

决议计划节点也是一种特殊节点,其会有决议计划表达式,和决议计划处理类特点,首要用于动态计算下一个节点的走向。

工作流引擎设计与实现模型抽象

public class DecisionModel extends NodeModel {
    private String expr; // 决议计划表达式
    private String handleClass; // 决议计划处理类
    @Override
    public void exec(Execution execution) {
        // 履行决议计划节点自界说履行逻辑
    }
}

分支节点模型

当用到并行流程的时候,该节点就派上用场了,这儿仅仅先简略界说,后续也会依据详细的事务需求,扩展新的特点。

工作流引擎设计与实现模型抽象

public class ForkModel extends NodeModel {
    @Override
    public void exec(Execution execution) {
        // 履行分支节点自界说履行逻辑
    }
}

兼并节点模型

兼并节点和分支节点是一起出来的,这儿也是先依照最根底的界说。

工作流引擎设计与实现模型抽象

public class JoinModel extends NodeModel {
    @Override
    public void exec(Execution execution) {
        // 履行兼并节点自界说履行逻辑
    }
}

边模型

两节点连线,就构成一条边,所以边的关系特点便是source和target,边也有自己的履行办法。

工作流引擎设计与实现模型抽象

public class TransitionModel extends BaseModel implements Action {
    private NodeModel source; // 边源节点引用
    private NodeModel target; // 边方针节点引用
    private String to; // 方针节点称号
    private String expr; // 边表达式
    private String g; // 边点坐标调集(x1,y1;x2,y2,x3,y3……)开端、拐角、完毕
    private boolean enabled; // 是否可履行
    @Override
    public void execute(Execution execution) {
    }
}

流程模型

有了上面的元素,那么流程模型就很简略得到如下界说:

工作流引擎设计与实现模型抽象

public class ProcessModel extends BaseModel {
    private String type; // 流程界说分类
    private String instanceUrl; // 发动实例要填写的表单key
    private String expireTime; // 等待完结时刻变量key
    private String instanceNoClass; // 实例编号生成器完结类
    // 流程界说的所有节点
    private List<NodeModel> nodes = new ArrayList<NodeModel>();
    // 流程界说的所有使命节点
    private List<TaskModel> tasks = new ArrayList<TaskModel>();
}

来个简略的模型方针

工作流引擎设计与实现模型抽象

public class BuildProcessTest {
  @Test
  public void buildProcessModel() {
        ProcessModel processModel = new ProcessModel();
        StartModel startModel = new StartModel();
        startModel.setName("start");
        startModel.setDisplayName("开端");
        processModel.getNodes().add(startModel);
        TransitionModel t1 = new TransitionModel();
        t1.setName("t1");
        t1.setTo("apply");
        t1.setSource(startModel);
        startModel.getOutputs().add(t1);
        TaskModel applyTaskModel = new TaskModel();
        t1.setTarget(applyTaskModel);
        applyTaskModel.setName("apply");
        applyTaskModel.setDisplayName("请假申请");
        processModel.getNodes().add(applyTaskModel);
        processModel.getTasks().add(applyTaskModel);
        TransitionModel t2 = new TransitionModel();
        t2.setName("t2");
        t2.setTo("deptApprove");
        t2.setSource(applyTaskModel);
        applyTaskModel.getOutputs().add(t2);
        TaskModel deptApproveTaskModel = new TaskModel();
        t2.setTarget(deptApproveTaskModel);
        deptApproveTaskModel.setName("deptApprove");
        deptApproveTaskModel.setDisplayName("部门领导审批");
        processModel.getNodes().add(deptApproveTaskModel);
        processModel.getTasks().add(deptApproveTaskModel);
        TransitionModel t3 = new TransitionModel();
        t3.setName("t3");
        t3.setTo("end");
        t3.setSource(deptApproveTaskModel);
        deptApproveTaskModel.getOutputs().add(t3);
        EndModel endModel = new EndModel();
        t3.setTarget(endModel);
        endModel.setName("end");
        endModel.setDisplayName("完毕");
        processModel.getNodes().add(endModel);
  }
}

加入组织

知识星球

相关源码

mldong-flow-demo-01