# 流程执行

其实这部分不应该是Messenger的一部分,应该是对SDK封装的流程执行方法的介绍。

# 发起流程

有时候我们需要在业务系统中以代码的方式发起流程,这时候可以调用InfoPlusService的start方法。start方法有如下两个,区别是第二个可以指定入口节点。

/**
 * 启动一个表单实例
 *
 * @param owner         实例的拥有者
 * @param nextUser      第一步办理用户
 * @param businessId    业务系统id
 * @param workflowCode  流程代码
 * @param initialData   表单数据
 * @return              包含:1.instanceId, 2.第一步骤的String.valueOf(formStepId), 3.第一步骤的访问Uri
 */
Response<String> start(String owner, String nextUser, String businessId, String workflowCode, String initialData)


/**
 * 启动一个表单实例
 *
 * @param owner         实例的拥有者
 * @param nextUser      第一步办理用户
 * @param businessId    业务系统id
 * @param entrance      入口节点代码
 * @param workflowCode  流程代码
 * @param initialData   表单数据
 * @return              包含:1.instanceId, 2.第一步骤的String.valueOf(formStepId), 3.第一步骤的访问Uri
 */
Response<String> start(String owner, String nextUser, String businessId, String entrance, String workflowCode, String initialData)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

以下示例的start方法用account参数为owner以及第一步的执行者发起了一个请假流程,并且初始化了请假事由数据,返回的数据的entities数组里分别有流水号,步骤号以及渲染url。

@Resource
private InfoPlusService infoPlusService;

private void start(String account){
    Map<String,String> data = new HashMap<>();
    data.put("fieldReason","理由");
    Response<String> result =  infoPlusService.start(account,account,null,"infoplus_example_quick_start",(new Gson()).toJson(data));

    if(result.isSuccess()) {
        for (String entity : result.getEntities()) {
            System.out.println(entity);
        }
    } else {
        System.out.println("发起失败");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

注意用代码方式发起的流程需要设置sys_start的Scopes,另外一个需要注意的地方是InfoPlusService的debug属性,在本地测试时候需要设置为false,这样发起的就是测试实例(注意流程的版本务必勾上测试上线,否则测试发起也会失败),在生产环境需要设置debug属性为true。可以考虑设置打包参数,生产环境这个参数为true即可。

<bean id="infoPlusService" class="edu.sjtu.infoplus.applicationToolkit.InfoPlusService">
    <property name="engineUrl" value="${form.url}"/>
    <property name="debug" value="${form.debug}"/>
</bean>
1
2
3
4

# 执行流程

InfoPlusService有一个doAction方法可以执行流程

/**
 * 以系统身份执行一步工作流。
 * 由step所指定的步骤必须为当前待做步骤,且该步骤必须允许系统执行。
 *
 * @param workflowCode  要执行的流程code
 * @param instance		要执行的工作流的instance id
 * @param step			要执行的步骤的code
 * @param action		要执行的动作的code
 * @param nextUsers		指定执行后,下一步骤的执行人。Map的key为下一步骤的code,值为执行人。此参数可以为空,表示不指定。
 * @param comment		备注
 * @return              执行结果
 */
Response<Object> doAction(String workflowCode, long instance, String step, String action, Map<String, String>nextUsers, String comment) {
1
2
3
4
5
6
7
8
9
10
11
12
13

现在有个需求,就是请假流程如果到了用户确认节点并且日期已经过了请假的开始日期,那么就帮用户自动完成确认,那会用到一个定时任务检查,检查发现满足自动确认条件后就执行完成。

@Resource
private InfoPlusService infoPlusService;

private void autoFinish(long instanceId) {
    Response<Object> result= infoPlusService.doAction("infoplus_example_quick_start", instanceId, "Confirm", "Finish", null, "自动完成");
    if(result.isSuccess()) {
        System.out.println("执行成功");
    }
}
1
2
3
4
5
6
7
8
9

用代码方式执行流程需要配置sys_process_edit的Scopes,并且可以代码执行的步骤上要勾选允许系统用户执行此步骤。