调用接口

平台模式使用的流程接口都是使用的restful接口完成的动作,所以accessToken是用来认证的是否可以使用接口的权限。

注:如果是发起流程,首先调用启动流程接口,再调用提交流程接口,如果是审批流程,则只需要调用提交流程接口。

启动流程

案例中把接口调用写在controller层,把我们的要调用的接口地方进行调用和其他的流程操作。

发起流程:POST /rest/bpm/runtime/start

需要的参数有:

参数名 参数类型 备注
accessToken String 认证的标识,参考常用参数获取方法-如何生成accessToken
applicationId String 平台模式软件的id(软件id固定),参考常用参数获取方法-如何获取applicationid
userCode String 启动流程审批人的账号(必须有审批权限)(并非用户UUID)
flowId String 流程ID,参考常用参数获取方法-如何获取flowId
postBody String 请求的包体必须按照如下个格式拼接({'id':'可设置自己的表单id','summary':'业务表单摘要描述','items':{‘自己的字段名 ':'值 ','name':'hahaha','age':24}})填写的表单内容字段,需要注意json的拼接

代码如下:

@RequestMapping("/add")
public String add(String name,String content,int type,String startetime,String endtime,Form form) {
    //获取accessToken
    String secret = "11e9-1ae6-a7f51dcc-aff9-e359336bcd13";//这里给的是超级管理员id,为了后面调用其他接口时验证
    String url1 =URL+"rest/accessToken?secret="+secret;
    String result1 = restTemplate.getForObject(url1,String.class);
    JSONObject jsonObject = JSONObject.parseObject(result1);
    String accessToken1 = jsonObject.getJSONObject("data").getString("accessToken");
    //流程启动接口的调用
    String url = URL+"rest/bpm/runtime/start?accessToken="+accessToken1+"&applicationId=odNYcX9VQu76lRaaGiM&userCode=admin1&flowId=gMQk2QAkwpL33z7gUJt";
    //拼接请求的包体
    JSONObject json = new JSONObject();
    json.put("id",form.getId());
    json.put("summary","Demo流程测试");//summary
    json.put("items",form);
    //调用http请求
    HttpHeaders headers = new HttpHeaders();
    MediaType type1 = MediaType.parseMediaType("application/json; charset=UTF-8");
    headers.setContentType(type1);
    HttpEntity<String> formEntity = new HttpEntity<String>(JSONObject.toJSONString(json), headers);
    String statResult =restTemplate.postForObject(url, formEntity,String.class);
    //解析流程启动返回的json进行解析(需要获取生成的流程实例id并放入表单中为后面的获取流程提交面板和提交流程)
    JSONObject startjsonObject = JSONObject.parseObject(statResult);
    String data = startjsonObject.getString("data");
    //流程实例id(因返回的json中包含list数据需要进行list遍历获取流程实例id)
    //data的格式:[{"instanceId":"kctdYk9GBOCmP0icER4","nodes":[{"auditors":[{"name":"admin","id":"11e4-63ff-5d9df2ad-9f19-57d7b83ae7be","userCode":"admin1"}],"stateLabel":"申请","coAuditors":[],"state":0,"nodeId":"1561633008392"}],"flowName":"demoflow","flowId":"gMQk2QAkwpL33z7gUJt"}]
    List studentList1 =  startjsonObject.parseArray(data);
    String instanceId = ((JSONArray) studentList1).getJSONObject(0).getString("instanceId");
    //流程启动完成之后生成的流程实例id,赋值在表单中
    form.setInstance(instanceId);
    boolean b = formService.addForm(form);
    return "redirect:/form/";
}

启动成功后会返回json需要拿到流程实例id,json如下

Errcode:返回状态码,0为成功;

Errmsg:返回错误信息,

instanceId:流程实例ID,如果针对同一张审批单,虽然审批状态会不断改变,流程实例ID是不变。

flowName:流程名称。

Flowid:流程ID。

Nodeid:当前状态的节点ID。

stateLabel:当前状态。

State:流程状态码,0为启动状态,256=审批中,流程正常流程的状态,65536=否决,流程被否决,1048576=流程已完结。

Auditors:当前审批人数组信息。

coAuditors:当前协办人的数组信息。

{"errcode":0,"errmsg":"success","data":[{"instanceId":"nGXxB33aRi0fv05ium5","flowName":"demo","flowId":"sdJnGepjKEirS2ctPQT","nodes":[{"nodeId":"1562684178918","stateLabel":"申请","state":0,"auditors":[{"id":"11e4-63ff-5d9df2ad-9f19-57d7b83ae7be","name":"admin","userCode":"admin1"},{"id":"11e8-46a9-8d876d13-94a7-9b60038597d7","name":"happy爱我中国信","userCode":"happy"}],"coAuditors":[]}]}]}

提交流程

获取流程提交面板:POST /rest/bpm/query/submission

需要的参数有:

参数名 参数类型 备注
accessToken String 认证的标识,参考常用参数获取方法-如何生成accessToken
applicationId String 平台模式软件的id(软件id固定),参考常用参数获取方法-如何获取applicationid
instanceId String 流程实例id,从接口启动流程或者上一步提交流程的接口返回值中获取
userCode String 审批的用户账号(有待办信息的用户)
flowid String 流程ID,参考常用参数获取方法-如何获取flowId
postBody String 请求的包体必须按照如下个格式拼接({'id':'可设置自己的表单id','summary':'业务表单摘要描述','items':{‘自己的字段名 ':'值 ','name':'hahaha','age':24}})

请求成功返回的json如下:

data的格式:[{"instanceId":"kctdYk9GBOCmP0icER4","nodes":[{"auditors":[{"name":"admin","id":"11e4-63ff-5d9df2ad-9f19-57d7b83ae7be","userCode":"admin1"}],"stateLabel":"申请","coAuditors":[],"state":0,"nodeId":"1561633008392"}],"flowName":"demoflow","flowId":"gMQk2QAkwpL33z7gUJt"}]

提交和审批流程:POST /rest/bpm/runtime/submission

需要的参数有:

参数名 参数类型 备注
accessToken String 认证的标识
applicationId String 平台模式软件的id
instanceId String 流程实例id
userCode String 审批的用户账号
postBody String 请求的包体必须按照如下个格式拼接({'id':'可设置自己的表单id','summary':'业务表单摘要描述','items':{‘自己的字段名 ':'值 ','name':'hahaha','age':24}})
flowtype String 类型不同数字不同,这里使用80提交(1>开始->手工 2>开始->自动 42>开始->子流程 8>终止 80>提交 81>退回 83>运行->自动 85>回撤)
currNodeId String 当前节点id(通过获取流程提交面板获取)
nextNodeids Array[string] 下一节点的节点定义对象的集合(数组)
comment String 审批意见可以为空

实现代码如下:

@RequestMapping("/Edit")
public String edit(Form form,String folw) {
   //获取accessToken认证restful接口
    String secret = "11e9-1ae6-a7f51dcc-aff9-e359336bcd13";//这里给的是超级管理员id,为了后面调用其他接口时验证
    String url1 =URL+"rest/accessToken?secret="+secret;
    String result1 = restTemplate.getForObject(url1,String.class);
    JSONObject jsonObject = JSONObject.parseObject(result1);
    String accessToken1 = jsonObject.getJSONObject("data").getString("accessToken");
    //流程实例id
    String instance = form.getInstance();
    //拼接请求的包体
    JSONObject json = new JSONObject();
    json.put("id", form.getId());
    json.put("summary", "Demo流程测试");//summary
    json.put("items", form);
    //调用http请求
    HttpHeaders headers = new HttpHeaders();
    MediaType type1 = MediaType.parseMediaType("application/json; charset=UTF-8");
    headers.setContentType(type1);
    HttpEntity<String> formEntity = new HttpEntity<String>(JSONObject.toJSONString(json), headers);
    //判断流程提交还是回退
    if(folw.equals("提交")){
        //获取流程提交面板的调用
        String url = URL + "rest/bpm/query/submission?accessToken=" + accessToken1 + "&applicationId=odNYcX9VQu76lRaaGiM&userCode=admin1&flowId=gMQk2QAkwpL33z7gUJt&&instanceId=" + instance;
        //获取提交面板(panel)
        String panelResult = restTemplate.postForObject(url, formEntity, String.class);       
        //解析流程启动返回的json进行解析(需要获取生成的流程实例id并放入表单中为后面的获取流程提交面板和提交流程)
        JSONObject paneljsonObject = JSONObject.parseObject(panelResult);
        String currentNodeId = paneljsonObject.getJSONObject("data").getString("currentNodeId");
        String nextNodes = paneljsonObject.getJSONObject("data").getString("nextNodes");
        //流程实例id(因返回的json中包含list数据需要进行list遍历获取流程实例id)
        List studentList1 = paneljsonObject.parseArray(nextNodes);
        //下一节点id
        String nextNode = ((JSONArray) studentList1).getJSONObject(0).getString("id");
        //提交流程restful url = rest/bpm/runtime/submission
        String urlSubmission = URL + "rest/bpm/runtime/submission?accessToken=" + accessToken1 + "&applicationId=odNYcX9VQu76lRaaGiM&userCode=admin1&comment=111111&instanceId=" + instance + "&nextNodeIds=" + nextNode + "&flowType=80&currNodeId=" + currentNodeId;
        //获取提交的成功返回值
        String submissionResult = restTemplate.postForObject(urlSubmission, formEntity, String.class);
    }else{   } 
    formService.updateForm(form);
    return "redirect:/form/";
}

思路需要先获取流程提交的面板,获取返回的json数据,解析出来需要使用的参数值如:(currNodeId和nextNodeids参数),再进行流程的提交。

流程回退

表单中的按钮来进行流程的回退,回退需要利用获取流程回退的面板,先获取之前走过的流程节点信息,之后再调用回退的接口,回退历史指定节点。

例子如下:

获取流程回退面板:POST /rest/bpm/query/back

需要的参数有:

参数名 参数类型 备注
accessToken String 认证的标识,参考常用参数获取方法-如何生成accessToken
applicationId String 平台模式软件的id(软件id固定),参考常用参数获取方法-如何获取applicationid
instanceId String 从接口上一步提交流程的接口返回值中获取
userCode String 审批的用户账号

返回值结果

流程驳回:POST /rest/bpm/runtime/back

需要的参数有:

参数名 参数类型 备注
accessToken String 认证的标识,参考常用参数获取方法-如何生成accessToken
applicationId String 平台模式软件的id(软件id固定),参考常用参数获取方法-如何获取applicationid
instanceId String 从接口上一步提交流程的接口返回值中获取
userCode String 审批的用户账号
postBody String 请求的包体必须按照如下个格式拼接({'id':'可设置自己的表单id','summary':'业务表单摘要描述','items':{‘自己的字段名 ':'值 ','name':'hahaha','age':24}})
flowtype String 类型不同数字不同,这里使用81回退(1>开始->手工 2>开始->自动 42>开始->子流程 8>终止 80>提交 81>退回 83>运行->自动 85>回撤)
currNodeId String 当前节点id(通过获取流程提交面板获取currNodeId)
nextNodeids Array[string] 下一节点的节点定义对象的集合(backNodes的某个节点id)
comment String 审批意见必须填写
flowid String 流程ID,参考常用参数获取方法-如何获取flowId

代码如下:

//获取流程回退面板的调用
String url = URL + "/rest/bpm/query/back?accessToken=" + accessToken1 + "&applicationId=odNYcX9VQu76lRaaGiM&userCode=admin1&instanceId=" + instance;

//获取提交面板(panel)
String panelResult = restTemplate.postForObject(url, formEntity, String.class);

//解析流程启动返回的json进行解析(需要获取生成的流程实例id并放入表单中为后面的获取流程提交面板和提交流程)
JSONObject paneljsonObject = JSONObject.parseObject(panelResult);
String currentNodeId = paneljsonObject.getJSONObject("data").getString("currentNodeId");
String nextNodes = paneljsonObject.getJSONObject("data").getString("backNodes");//上一节点id数组

//流程实例id(因返回的json中包含list数据需要进行list遍历获取流程实例id)
//data的格式:[{"instanceId":"kctdYk9GBOCmP0icER4","nodes":[{"auditors":[{"name":"admin","id":"11e4-63ff-5d9df2ad-9f19-57d7b83ae7be","userCode":"admin1"}],"stateLabel":"申请","coAuditors":[],"state":0,"nodeId":"1561633008392"}],"flowName":"demoflow","flowId":"gMQk2QAkwpL33z7gUJt"}]
List studentList1 = paneljsonObject.parseArray(nextNodes);
//上一节点id
String nextNode = ((JSONArray) studentList1).getJSONObject(0).getString("id");

//提交流程restful url = /rest/bpm/runtime/back
String urlBack = URL + "/rest/bpm/runtime/back?accessToken=" + accessToken1 + "&applicationId=odNYcX9VQu76lRaaGiM&userCode=admin1&comment=111111&instanceId=" + instance + "&nextNodeIds=" + nextNode + "&flowId=gMQk2QAkwpL33z7gUJt&flowType=81&currNodeId=" + currentNodeId;

//获取回退的返回值
String submissionResult = restTemplate.postForObject(urlBack, formEntity, String.class);

回退成功返回值json

{"errcode":0,"errmsg":"success","data":[{"instanceId":"DYuTIOYnbWheGjQ946P","flowName":"demo","flowId":"sdJnGepjKEirS2ctPQT","nodes":[{"nodeId":"1562684178918","stateLabel":"申请","state":0,"auditors":[{"id":"11e4-63ff-5d9df2ad-9f19-57d7b83ae7be","name":"admin","userCode":"admin1"}],"coAuditors":[]}]}]}

获取流程中所在节点的状态值

场景:可以在申请的页面中,通过接口调用/rest/bpm/query/states,获取流程状态的信息

流程状态:GET /rest/bpm/query/states

调用URL:写死的平台模式id&instanceId=流程实例id

需要的参数有:

参数名 参数类型 备注
accessToken String 认证的标识,参考常用参数获取方法-如何生成accessToken
applicationId String 平台模式软件的id(软件id固定),参考常用参数获取方法-如何获取applicationid
instanceId String 从接口上一步提交流程的接口返回值中获取

接口请求成功后的返回的json如下:

返回的json
{  "errcode": 0,  "errmsg": "success",  "data": [{ "instanceId": "DYuTIOYnbWheGjQ946P", "nodes": [{"auditors": [{"name": "admin", "id": "11e4-63ff-5d9df2ad-9f19-57d7b83ae7be","userCode": "admin1"},{"name": "happy爱我中国信","id": "11e8-46a9-8d876d13-94a7-9b60038597d7","userCode": "happy"}],"stateLabel": "申请","coAuditors": [],"state": 0,"nodeId": "1562684178918"}],"flowName": "demo","flowId": "sdJnGepjKEirS2ctPQT"}]}

获取返回json解析,代码如下

@RequestMapping("/toEdit")
public String toEdit(Model model,String id) {
    Form form = formService.findFormById(id);

    String instanceId = form.getInstance();
     //获取accessToken认证restful接口
    String secret = "11e9-1ae6-a7f51dcc-aff9-e359336bcd13";//这里给的是超级管理员id,为了后面调用其他接口时验证
    String url1 =URL+"rest/accessToken?secret="+secret;
    String result1 = restTemplate.getForObject(url1,String.class);
    JSONObject jsonObject = JSONObject.parseObject(result1);
    String accessToken1 = jsonObject.getJSONObject("data").getString("accessToken");

    String url =URL+"rest/bpm/query/states?accessToken="+accessToken1+"&applicationId=odNYcX9VQu76lRaaGiM&instanceId="+instanceId;//流程状态url
    String result = restTemplate.getForObject(url,String.class);
    JSONObject statesjsonObject = JSONObject.parseObject(result);

    List statesList =  statesjsonObject.parseArray(statesjsonObject.getString("data"));
    String nodes = ((JSONArray) statesList).getJSONObject(0).getString("nodes");
    List nodeslist = (statesjsonObject.getJSONArray("data")).parseArray(nodes);
    String stateLabel = ((JSONArray) nodeslist).getJSONObject(0).getString("stateLabel");//解析json获取当前状态

    model.addAttribute("form", form);
    model.addAttribute("stateLabel",stateLabel);//把获取到的流程状态值放入model中,方便编辑也页面显示
    return "form/formEdit";

效果:

流程提交指定审批人

场景说明:如果下个节点有N个审批人,流程可以设置指定审批人的操作,并提供相应接口

POST /rest/bpm/runtime/submission

指定审批人接口可以参考提交流程的写法,注意:指定审批人的json拼接的格式

需要的参数有:

参数名 参数类型 备注
accessToken String 认证的标识,参考常用参数获取方法-如何生成accessToken
applicationId String 平台模式软件的id(软件id固定),参考常用参数获取方法-如何获取applicationid
instanceId String 从接口上一步提交流程的接口返回值中获取
userCode String 审批的用户账号
postBody String 请求的包体必须按照如下个格式拼接({'id':'可设置自己的表单id','summary':'业务表单摘要描述','items':{‘自己的字段名 ':'值 ','name':'hahaha','age':24}, 'submitTo':[{'nodeid':'下一节点id','isToPerson':true,'userids':'审批人id'}]})
flowtype String 类型不同数字不同,这里使用80提交(1>开始->手工 2>开始->自动 42>开始->子流程 8>终止 80>提交 81>退回 83>运行->自动 85>回撤)
currNodeId String 当前节点id(通过获取流程提交面板获取)
nextNodeids Array[string] 下一节点的节点定义对象的集合(数组)
comment String 审批意见可以为空

具体的请求参数查看 (提交和审批流程)唯一不同的是请求的包体中需要拼接一下部分,此代码仅供参考

submitTo:[{'nodeid': '下一节点id','isToPerson':true,'userids':'指定审批人的用户id'}]

待办接口:GET /rest/bpm/myProcessing

场景说明:可以在本身系统中,提供菜单入口,查询申请人的待办信息,页面需要自己写,接口可以调用/rest/bpm/myProcessing

需要的参数有:

参数名 参数类型 备注
accessToken String 认证的标识
userCode String 用户账号(这里直接使用当前登陆账号即可)
pageNo String 现在的页数
linesPerPage String 每页显示的条数。

代码如下(仅供参考)

String url = URL+"/rest/bpm/myProcessing?userCode=admin1&accessToken="+accessToken1+"&pageNo=1&linesPerPage=5";
String result = restTemplate.getForObject(url,String.class);
JSONObject jsonProcess = JSONObject.parseObject(result);
System.out.println("a------->"+jsonProcess.getJSONObject("datas").toString());

返回的json如下需要自己进行处理解析json

results matching ""

    No results matching ""