#调用接口 平台模式使用的流程接口都是使用的restful接口完成的动作,所以accessToken是用来认证的是否可以使用接口的权限。 **注:如果是发起流程,首先调用启动流程接口,再调用提交流程接口,如果是审批流程,则只需要调用提交流程接口。** ![](imgs/Callinginterface/Callinginterface01.png) ##启动流程 案例中把接口调用写在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 formEntity = new HttpEntity(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 formEntity = new HttpEntity(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 | 审批的用户账号 | 返回值结果 ![](imgs/Callinginterface/Callinginterface02.png) 流程驳回: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"; ~~~ 效果: ![](imgs/Callinginterface/Callinginterface03.png) ##流程提交指定审批人 场景说明:如果下个节点有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](http://office.teemlink.com:8083/obpm2/swagger-ui.html#!/%E6%B5%81%E7%A8%8B%E5%8E%86%E5%8F%B2%E6%A8%A1%E5%9D%97/queryPendingByUserUsingGET_1) [/rest/bpm/myProcessing](http://office.teemlink.com:8083/obpm2/swagger-ui.html#!/%E6%B5%81%E7%A8%8B%E5%8E%86%E5%8F%B2%E6%A8%A1%E5%9D%97/queryPendingByUserUsingGET_1) 场景说明:可以在本身系统中,提供菜单入口,查询申请人的待办信息,页面需要自己写,接口可以调用[/rest/bpm/myProcessing](http://office.teemlink.com:8083/obpm2/swagger-ui.html#!/%E6%B5%81%E7%A8%8B%E5%8E%86%E5%8F%B2%E6%A8%A1%E5%9D%97/queryPendingByUserUsingGET_1) 需要的参数有: | 参数名 | 参数类型 | 备注 | |--------------|----------|------------------------------------------| | 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