Solon v3.7.3

statefulflow - 审批场景的动作参考

</> markdown
2025年12月9日 下午1:41:36

审批场景需要定制 stateController、stateRepository。尤其是要定制 stateRepository

public class OaActionDemo {
    FlowEngine flowEngine = FlowEngine.newInstance();

    FlowStatefulService statefulService = flowEngine.forStateful();
    ActorStateController stateController = new ActorStateController();
    InMemoryStateRepository stateRepository = new InMemoryStateRepository();

    String instanceId = "i1";
    String graphId = "f1";

    //审批
    public void case1() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        context.put("actor", "A");
        StatefulTask task = statefulService.getTask(graphId, context);

        //展示界面,操作。然后:

        context.put("op", "审批");//作为状态的一部分
        statefulService.postOperation(task.getNode(), Operation.FORWARD, context);
    }

    //回退
    public void case2() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        context.put("actor", "A");
        StatefulTask task = statefulService.getTask(graphId, context);

        context.put("op", "回退");//作为状态的一部分
        statefulService.postOperation(task.getNode(), Operation.BACK, context);
    }

    //任意跳转(通过)
    public void case3_1() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);

        String nodeId = "demo1";

        statefulService.postOperation(graphId, nodeId, Operation.FORWARD_JUMP, context);
        StatefulTask task = statefulService.getTask(graphId, context);
    }

    //任意跳转(退回)
    public void case3_2() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);

        String nodeId = "demo1";

        statefulService.postOperation(graphId, nodeId, Operation.BACK_JUMP, context);
        StatefulTask task = statefulService.getTask(graphId, context);
    }

    //委派
    public void case4() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        context.put("actor", "A");
        context.put("delegate", "B"); //需要定制下状态操作员(用A检测,但留下B的状态记录)
        StatefulTask task = statefulService.getTask(graphId, context);

        context.put("op", "委派");//作为状态的一部分
        statefulService.postOperation(task.getNode(), Operation.FORWARD, context);
    }

    //转办(与委派技术实现差不多)
    public void case5() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        context.put("actor", "A");
        context.put("transfer", "B"); //需要定制下状态操作员(用A检测,但留下B的状态记录)
        StatefulTask task = statefulService.getTask(graphId, context);

        context.put("op", "转办");//作为状态的一部分
        statefulService.postOperation(task.getNode(), Operation.FORWARD, context);
    }

    //催办
    public void case6() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        StatefulTask task = statefulService.getTask(graphId, context);

        String actor = task.getNode().getMeta("actor");
        //发邮件(或通知)
    }

    //取回(技术上与回退差不多)
    public void case7() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        StatefulTask task = statefulService.getTask(graphId, context);

        //回退到顶(给发起人);相当于重新开始走流程
        context.put("op", "取回");//作为状态的一部分
        statefulService.postOperation(task.getNode(), Operation.RESTART, context);
    }

    //撤销(和回退没啥区别)
    public void case8() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        StatefulTask task = statefulService.getTask(graphId, context);

        context.put("op", "撤销");//作为状态的一部分
        statefulService.postOperation(task.getNode(), Operation.BACK, context);
    }

    //中止
    public void case9() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        StatefulTask task = statefulService.getTask(graphId, context);

        context.put("op", "中止");//作为状态的一部分
        statefulService.postOperation(task.getNode(), Operation.TERMINATED, context);
    }

    //抄送
    public void case10() throws Exception {
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        StatefulTask task = statefulService.getTask(graphId, context);

        statefulService.postOperation(task.getNode(), Operation.FORWARD, context);
        //提交后,会自动触发任务(如果有抄送配置,自动执行)
    }

    //加签
    public void case11() throws Exception {
        String gatewayId = "g1";
        Graph graph = GraphDecl.copy(flowEngine.getGraph(graphId)).create(decl->{
            //添加节点
            decl.addActivity("a3").linkAdd("b2");
            //graph(加上 a3 节点)
            decl.addParallel(gatewayId).linkAdd("a1").linkAdd("a2").linkAdd("a3");
        }); //复制

        //把新的图配置,做为实例对应的流配置
        String graphJson = graph.toJson();
    }

    //减签
    public void case12() throws Exception {
        //通过状态操作员和驱动定制,让某个节点不需要处理
        FlowContext context = FlowContext.of(instanceId, stateController, stateRepository);
        StatefulTask task = statefulService.getTask(graphId, context);

        statefulService.postOperation(task.getNode(), Operation.FORWARD, context);
    }

    //会签
    public void case13() throws Exception {
        //配置时,使用并行网关
    }

    //票签
    public void case15() throws Exception {
        //配置时,使用并行网关(收集投票);加一个排他网关(判断票数)
    }

    //或签
    public void case16() throws Exception {
        //配置时,使用并行网关 //驱动定制时,如果元数据申明是或签:一个分支“完成”,另一分支自动为“完成”
    }

    //暂存
    public void case17() throws Exception {
        //不提交操作即可
    }
}