🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **发起表单(Html正文)流程** [文档链接](http://open.seeyon.com/book/ctp/restjie-kou/biao-dan-liu-cheng-ji-cheng.html). 可发起指定模板的Html正文流程或表单流程。 ### **推荐使用接口(Since:V80sp1)** **接口请求说明:** ``` http请求方式:POST http://ip:port/seeyon/rest/bpm/process/start ``` **示例:** ```java Map<String, Object> map = new HashMap<String, Object>(); map.put("appName", "collaboration"); Map<String, Object> data1 = new HashMap<String, Object>(); data1.put("templateCode", "asss_001"); data1.put("draft", "0"); data1.put("attachments", new ArrayList<Long>() {{add(3128081619541315193l); add(-1686961755437117824l);}}); data1.put("relateDoc", "col|-2871660587841141706,-1609894079662438907"); data1.put("subject", "aaa1"); Map<String, Object> data2 = new HashMap<String, Object>(); data2.put("formmain_0018", new HashMap<String, Object>(){{put("申请人", "saa"); put("车牌号", "ddd");}}); data1.put("data", data2); map.put("data", data1); Map result = client.post("bpm/process/start" ,map); ``` **传入参数说明:** | 参数 | 是否必须 | 说明 | | --------------- | ---- | ---------------------------------------- | | appName | 是 | 应用类型 | | data | 是 | data参数 | **data参数** | 参数 | 是否必须 | 说明 | | ------------ | -------- | ------------------------------------------------------------ | | templateCode | 是 | 模板编号,参见[表单正文流程模板编号](#表单正文流程模板编号) | | draft | 是 | 是否为待发:0:新建-发送;1:新建-保存待发 | | attachments | 否 | 协同标题区附件,Long型List,值为附件的Id。Id是附件接口响应结果中fileUrl字段的值。 | | relateDoc | 否 | 协同公文的id | | subject | 否 | 未设置取模板设置的标题 | | data | 否 | 表单data参数 | | useNewDataStructure | 否 | 是否使用新的表单数据格式 | | doTrigger | 否 | 是否执行触发 | **表单data参数** | 参数 | 是否必须 | 说明 | | ---------------- | -------- | ------------------------------------------------------------ | | formmainxxx | 是 | 表单字段数据,json格式:key字段显示名称,value字段值(如果是cap4的附件控件,则value为附件的相关信息) | | formsonxx1 | 是 | 数组结构,参考主表 | | thirdAttachments | 否 | CAP4附件参数 | | changedFields | 否 | 参与计算的字段 | **thirdAttachments参数说明** | 参数 | 是否必须 | 说明 | | ------------ | -------- | ----------------------- | | subReference | 是 | 对应的附件字段的value值 | | fileUrl | 是 | 上传的附件ID | | sort | 是 | 附件排序 | **请求参数示例:** ``` { "appName": "collaboration", "data": { "data": { "formmain_0177": { "文本1": "测试文本1-111", "上传附件1": "3091996204880318295", "图片下拉1": "-2767075386175501632" }, "formson_0185": [ { "图片下拉2": "-2767075386175501632", "上传附件2": "-6092561120937621142" } ], "thirdAttachments": [ { "subReference": "3091996204880318295", "fileUrl": "432641077895385013", "sort": 1 }, { "subReference": "-6092561120937621142", "fileUrl": "355134930180197101", "sort": 1 } ], "changedFields":{ "formmain_0177":["选人1","文本1"], "formson_0185":["选人2"] } }, "templateCode": "ABC1111", "draft": "0", "attachments": [ 123456, 123457 ], "relateDoc": "col|123,456;doc|321,654", "subject": "", "useNewDataStructure": false, "doTrigger": true } } ``` ### **请求表单参数说明(@Since v8.0sp2)** **masterTable的结构** | 参数 | 类型 | 是否必填 | 说明 | | ------------- | --------- | -------- | ------------ | | name | String | 是 | 数据库表名称 | | record | Object | 是 | 记录的数据 | | changedFields | String[] | 否 | 需要计算的字段 | **masterTable—record的结构** | 参数 | 类型 | 是否必填 | 说明 | | ------ | -------- | -------- | -------- | | id | long | 是 | 数据id | | fields | Object[] | 是 | 包含字段 | **masterTable—record—fields的结构** | 参数 | 类型 | 是否必填 | 说明 | | --------- | ------ | -------- | -------------- | | name | String | 是 | 数据域名称 | | value | String | 是 | 数据值(优先) | | showValue | String | 是 | 显示值 | **subTables的结构** | 参数 | 类型 | 是否必填 | 说明 | | ------- | -------- | -------- | -------------- | | name | String | 是 | 数据库表名称 | | records | Object[] | 是 | 包含的所有数据 | | changedFields | String[] | 否 | 需要计算的字段 | **subTables—records的结构** | 参数 | 类型 | 是否必填 | 说明 | | ----------- | -------- | -------- | -------- | | id | long | 是 | 数据id | | fields | Object[] | 是 | 包含字段 | **subTables—records—fields的结构** | 参数 | 类型 | 是否必填 | 说明 | | --------- | ------ | -------- | -------------- | | name | String | 是 | 数据域名称 | | value | String | 是 | 数据值(优先) | | showValue | String | 是 | 显示值 | **请求参数示例(@Since v8.0sp2):** ``` { "appName": "collaboration", "data": { "data": { "masterTable":{ "name":"formmain_0019", "record":{ "id":123456789101, "fields":[ { "name":"field0001", "value":"", "showValue":"create" }, { "name":"field0002", "value":"", "showValue":"one" } ] }, "changedFields": ["field0001","field0002"] }, "subTables": [ { "name":"formson_0021", "records": [ { "id": 123456789101, "fields": [ { "name":"field0005", "value":"", "showValue":"cap" } ] } ], "changedFields": ["field0005"] } ] }, "templateCode": "SOAP01", "draft": "0", "subject": "又试1下", "useNewDataStructure": true, "doTrigger": true } } ``` **返回数据:** ``` java { "code" : 0, "data" : { "workitems" : [ { "nodeName" : "节点姓名", "userLoginName" : "loginName", "id" : "6063271658185834554", "userName" : "用户姓名", "nodeId" : "15940211100644", "userId" : "5647565013925644425" } ], "app_bussiness_data" : "{\"affairId\":\"-7826004588359563757\",\"summaryId\":\"2076716881761815485\"}", "processId" : "5724125432261003059", "subject" : "aaa1", "errorMsg" : "" }, "message" : "" } ``` **返回参数说明:** | 参数 | 说明 | | --------------- |---------------------------------------- | | code | 返回码 | | nodeName | 节点名称 | | userLoginName | 登录名 | | id | wf_workitem_run.id | | userName | 用户名 | | nodeId | 节点ID(ctp_affair.activity_id) | | userId | 人员ID | | affairId | 事项ID | | summaryId | 协同ID | | processId | 流程ID(ctp_affair.process_id) | | subject | 标题 | ### **过时接口(V61update)** 注意V6.1此接口支持直接传入JSON数据格式。 **接口请求说明:** ``` http请求方式:POST http://ip:port/seeyon/rest/flow/{templateCode} 例如: http://127.0.0.1/seeyon/rest/flow/A0001 ``` **参数说明:** 发起表单流程所需要参数,可以参考文档【**BPM集成**】中的【public ServiceResponse launchFormCollaboration(String token, String senderLoginName, String templateCode, String subject, String data, Long[] attachments, String param) throws ServiceException;】; | 参数 | 是否必须 | 说明 | | --------------- | ---- | ---------------------------------------- | | templateCode | 是 | 模板编号,参见[表单正文流程模板编号](#表单正文流程模板编号) | | token | 是 | 为登录验证后获取的身份令牌 | | senderLoginName | 是 | 发起者的登录名(登录协同的登录名) | | subject | 是 | 协同的标题 | | data | 是 | HTML正文流程为html内容;[取得流程正文数据](#取得流程正文数据)支持传入json格式数据 | | attachments | 否 | 附件,Long型List,值为附件的Id。Id是附件接口响应结果中fileUrl字段的值。 | | param | 否 | 为控制是否流程发送。0:缺省值,发送,进入下一节点的待办(如果需要选人则保存到待发)1:不发送,保存到待发。 | | transfertype | 否 | (V6.1增加)data格式,xml:表示data为XML格式;json:表示data为json格式 | | formContentAtt | 否 | (V6.1增加) 表单附件 组件传入ID参数 | | accountCode | 否 | (V6.1增加)发起人单位编码(用于发起人兼职多单位情况,用不同单位角色发起流程) | **参数获取说明:** 发起表单是多参数,建议组装为MAP传参。 token身份令牌:token在CTPRestClient中已经封装好的,如果要单独获取可如下方式: ```java private CTPRestClient client = null; CTPServiceClientManager clientManager = CTPServiceClientManager.getInstance("http://127.0.0.1"); client = clientManager.getRestClient(); ... String token = client.get("token/" + userName + "/" + password, String.class,"text/plain"); ``` senderLoginName发起者的登录名:发起者登录OA的登录名,如下: ```java String senderLoginName ="lsm"; ``` templateCode模板编号:对应创建模板时填写的模板编号(即ctp_template表TEMPLETE_NUMBER字段) ```java String templateCode ="100"; ``` subject协同的标题:发出表单模板对应的标题,如下: ```java String subject ="申请流程标题"; ``` data表单数据:表单数据信息,REST接口提供了获取已经发送的表单流程XML新方法,请参考[取得流程正文数据](#取得流程正文数据) 注意在获取表单数据XML 需要转换成String 提供已发表单转String示例: ```java private CTPRestClient client = null; ... String data = client.get("flow/data/-6074085048046957774", String.class);//-6074085048046957774为已发流程ID ``` **V6.1表单流程正文数据支持JSON格式,示例如下:** ```java string data ="{"field1":"主表数据1","field2":"主表数据2",sub:[{"field3":"从表数据3","field4":"从表数据4","field5":"从表数据5"},{"field6":"从表数据6"},{"field10":"从表数据10","field11":"从表数据11"}]}"; ``` 注意:这里sub代表从表数据,而field1等字段信息是对应【流程表单制作】-【基础设置】中控件的【名称】字段 **表单流水号场景:** 现在发起流程接口只支持【计算流水号】 1.新建流水号:创建流水号:表单应用-流水号管理; 2.模板设置流水号:表单应用-流程表单设置-流程表单制作-选择控件-计算公式设置-系统数据域中选择流水号 **表单附件组件场景:** 1.获取附件ID:通过上传接口获得【注意:如果2个表单附件控件都是同一个附件,也需要上传2次,获取不同的ID,而不能2个表单附件控件共用一个附件ID】 2.发起接口XML/json数据中设置附件ID; 3.需要formContentAtt重设置附件ID; ```java List<Long> formcontentatt=new ArrayList();//表单正文组件ID,这里需要注意,就算三个正文组件上传的同一个文件,这个文件也需要通过上传接口上传三次,而给予表单控件三个不同的附件ID,不能一个ID给多个表单组件 res.put("formContentAtt",formcontentatt);//表单附件组件 ``` > **CAP4表单附件组件场景更正(Since V8.0,仅支持CAP4表单)** > > 更正说明:由于原有结构不支持控件多个附件或者附件无法添加到表单中的场景,因此接口请求增加*formContentAtt*参数,参数为数组格式,说明如下: > > | 参数名 | 说明 | > | ------------ | ----------------------------------------- | > | subReference | 表单内字段value值,如“上传附件1”的value值 | > | fileUrl | 调用附件上传接口获取的附件ID | > | sort | 附件排序 | > > > **CAP4表单附件组件更正调用示例** > > ``` > { > "data": { > "文本1": "示例", > "上传附件1": "8451540374587001174" > }, > "subject": "示例", > "senderLoginName": "seeyon", > "transfertype": "json", > "formContentAtt":[ > { > "subReference":8451540374587001174, > "fileUrl":-7390855572027915259, > "sort":1 > }, > { > "subReference":8451540374587001174, > "fileUrl":-7390855572027915268, > "sort":2 > } > ] > } > > ``` > param为控制流程发送. ```java String param="0"; ``` 表单流程通过REST POST创建示例: ```java private CTPRestClient client = null; MAP info =new HashMap();//存放上述参数 String checkUrl ="flow/"+模板ID; ... client.post(url, info, String.class); ``` 发起HTML正文流程示例1: ```java Map data = new HashMap() { { put("senderLoginName", "s1"); put("subject", "这个是用Map方式发的"); put("data", "正文内容"); put("attachments",new Long[] {-1l,-5199818657160149985l}); put("formContentAtt",formcontentatt);//表单附件控件 } }; Long flowId1 = client.post("flow/H0001" ,data, Long.class); ``` 发起HTML正文流程示例2: ```java Long flowId2 = client .post("flow/H0001", "{"senderLoginName":"s1","subject":"这是用JSON发的","data":"HTML正文","attachments":[-1,1]}", Long.class); ``` **返回说明** 正常情况下,返回创建成功以后对应的流程Id。 返回异常说明: | 异常编码 | 异常说明 | | ----- | -------------------- | | 12005 | 无效的token,请再次验证 | | 21011 | 单位名称不能为空或不存在 | | 25001 | 职务级别不存在 | | 25002 | 职务级别名称为空 | | 25003 | 职务级别已存在 | | 23023 | 部门名称为空 | | 23024 | 父部门名称为空 | | 23025 | 部门已存在 | | 24001 | 岗位不存在 | | 24002 | 岗位名称为空 | | 24003 | 岗位已存在 | | 22129 | 设置人员的所属部门出错 | | 22011 | 人员登录名为空 | | 50126 | 按登录名查找发起人出错 | | 50121 | 表单不存在 | | 50122 | 无表单权限 | | 50123 | 无流程表单导入出错 | | 50124 | XML解析失败 | | 50125 | 模板不存在 | | 50126 | 无模板访问权限 | | 50127 | 非表单正文内容 | | 50128 | 不是无流程表单,请检查模板编号是否正确 | | 50129 | 模板为非流程模板,请检查模板编号是否正确 | | 31013 | 指定流程不存在 | | 50130 | 此表单已经停用 | | 50131 | 无输入字段 | | 50132 | 日期格式错误 | | 50133 | 没有主表记录错误 |