一、注册应用
根据目标环境,登录到专有钉钉开放平台:
- 孤岛环境:https://zwopenplatform-portal.10e.alibaba-inc.com
- SAAS云预发:https://openplatform-portal.gov.alibaba-inc.com
- SAAS云生产:https://openplatform-portal.dg-work.cn
- 浙政钉预发:https://openplatform-portal-zzd.alibaba-inc.com
- 浙政钉生产:https://openplatform-portal-pro.ding.zj.gov.cn
- 浙大生产:https://openplatform-portal.zju.edu.cn
- 郑政钉生产:https://openplatform-portal-dingding.zhengzhou.gov.cn
1.1 创建应用
每个使用者需要自己注册一个新的应用来获取ak和sk信息,按照下图的步骤进行操作即可。
首先,通过左侧边栏切换到【应用管理】Tab页,点击快捷链接【开发者后台】,前往开发者中心创建应用。
点击【创建应用】按钮,即可开始创建应用。
备注:后面的【创建零代码应用】按钮是前往宜搭平台创建宜搭应用的,这里注意不要点。
下面是一组新建应用的填写示例,注意这里的应用标识需要唯一且保持良好的可读性。
1.2 订阅接口
新创建出来的应用,默认会置于列表的顶部,点击应用操作中的【详情】,将跳转到到应用详情页
在默认的【凭证与基础信息】面板,可以查看 AppKey 和 AppSecret :
切换左侧边栏到【应用权限】面板,在【服务端】-【高级权限】下找到宜搭相关的接口文件夹,包括:宜搭表单、宜搭流程、宜搭任务中心、宜搭其他,将其勾选上,然后点击右上角的授权按钮执行批量授权操作。
如果切换到应用发布状态下,发现高级权限列表中的栏目无法勾选,则是因为当前应用处于上架状态,无法在上架状态下执行应用的修改操作。
此时,需要将应用切换到【应用发布】面板,先将应用【下架】,之后再回到【应用权限】面板执行订阅操作,但是不要忘记执行完订阅操作之后回到【应用发布】面板,再次执行一下上架操作,免得工作台上的应用被移除后没有及时恢复。
特别说明:
- 一方应用之间的接口使用可以无需授权。
- 三方应用使用一方应用的接口,需要获得对应的接口的使用授权,否则会发生如下的报错:
{
"_RequestId": "643e01f015907487376843282d0014",
"Message": "User not authorized to operate on the specified resource.",
"success": false,
"errorCode": "100",
"HostId": "openplatform-pro.ding.zj.gov.cn",
"Code": "Forbidden",
"errorMsg": "User not authorized to operate on the specified resource.",
"errorLevel": "error"
}
二、获取参数
参数一:domainName参数根据环境的不同需要填写不同的值,各环境的配置值如下:
- 孤岛环境:zwopenplatform.10e.alibaba-inc.com
- SAAS云预发:openplatform.gov.alibaba-inc.com
- SAAS云生产:openplatform.dg-work.cn
- 浙政钉预发:openplatform-zzd.alibaba-inc.com
- 浙政钉生产:openplatform-pro.ding.zj.gov.cn
- 浙大生产:openplatform.zju.edu.cn
- 郑政钉生产:openplatform-dingding.zhengzhou.gov.cn
参数二:accessKey对应新建应用的AppKey
参数三:secretKey对应新建应用的AppSecret
三、使用接口
下面以Java使用的方式介绍如何使用网关接口:
- 【下载示例代码】下载示例工程代码:call-yidaapi-demo.zip,解压缩之后使用Inteilj IDEA打开该工程的示例代码。
- 【依赖包替换】非阿里的同学可能无法下载到
xxpt.gateway.shared.client
这个依赖包,可以使用xxpt.gateway.shared.client.zip下面的压缩包里面的文件。 - 【修改配置文件】修改gateway.properties文件,具体的参考数据参考本文档的第二小结。
xxpt.gateway.protocal=https
xxpt.gateway.domainName=指定环境的domainName
xxpt.gateway.accessKey=自己的accessKey
xxpt.gateway.secretKey=自己的secretKey
- 打开YidaController.java文件,该文件中已经提供了发起流程和查询表单数据两个接口调用的Demo,可以启动该功能,使用postman等Http测试工具触发接口调用请求,并使用断点跟踪测试。
- 根据实际的业务场景根据本文档中的提示,调用相关的开放接口,实现自己的业务场景需求。
四、网关接口文档
4.1 说明
4.1.1 特别关注
特别关注1:网关有两个服务域名,需要加以区分,其中有portal后缀的是注册应用订阅接口的地址,没有porta后缀的是写在domainName参数里面的。
特别关注2:请求参数中的api参数务必填写相对地址,无需手动拼接请求域名+相对地址形式的绝对地址。下面是一个典型的错误示例:
4.1.2 重要参数获取
下面以截图的方式,展示调动宜搭开放接口过程中频繁使用到的一些核心参数的获取位置。
首先,打开待操作的应用的后台编辑页面,找到顶部的【应用设置】按钮,点开后切换到【应用数据】的Tab页,如下图所示:
关于应用编码(应用ID):appType
关于应用秘钥:systemToken
关于表单ID:formUuid
关于用户id:userid:
会根据userid判断是否有访问接口的权限,当userId传yida_pub_account时,则不进行权限校验,默认通过
4.2 流程实例
1. 发起流程
- 接口:/yida/process/startInstance.json
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的员工工号 | 是 | 会校验userId是否有流程发起权限 | |
language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US |
processCode | 流程code | 是 | TPROC—EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ4 | 请看附录6 |
formUuid | 表单ID | 是 | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | 请看附录6 |
formDataJson | 表单数据 | 是 | 参考:附录1保存/更新 表单数据格式说明 | |
deptId | 发起人所在部门号 | 否 | 18295 | 不填,默认发起人主职部门 |
- 返回字段说明:
- result : 新创建的流程实例ID
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回值结果示例:
常见错误:{
"result": "f30233fb-72e1-4af4-8cb8-c7e0ea9ee530",
"success": true
}
排查过程:success为false,说明流程发起失败,但是无明确报错提示,通过宜搭数据管理页发现流程确实没有发起。建议仔细排查填写的参数对应关系,本案为填写了另外一个目标应用到appType和systemToken导致的流程发起失败。
2. 根据条件搜索流程实例ID
- 接口:/yida/process/getInstanceIds.json
- 说明:只有应用管理员才能使用这个接口
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 该接口只有应用管理员能使用。会校验userId是否应用管理员 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formUuid | 表单ID | 是 | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | 请看附录6 |
searchFieldJson | 根据表单内组件值查询 | 否 | 格式见附录2:根据组件值进行条件搜索,组件值格式说明 | |
taskId | 任务ID | 否 | 2199132092 | 一般用不到。 |
instanceStatus | 实例状态 | 否 | RUNNING | 可选值为:RUNNING,TERMINATED,COMPLETED,ERROR。 分别代表:运行中,已终止,已完成,异常。 |
approvedResult | 流程审批结果 | 否 | agree | 可选值为:agree, disagree。 分别表示:同意, 拒绝。 |
currentPage | 当前页 | 否 | 1 | 必须大于0 默认1 |
pageSize | 每页记录数 | 否 | 10 | 必须大于0 默认10 |
originatorId | 根据流程发起人工号查询 | 否 | ||
createFrom | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表 | 否 | 2020-01-01 00:00:00 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
createTo | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表。 | 否 | 2020-01-01 23:59:59 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 和createFrom一起,相当于查询在 2018-01-01到2018-01-31之间(包含01和31号)创建的数据。 |
modifiedFrom | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表 | 否 | 2018-01-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
modifiedTo | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表。 | 否 | 2018-02-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
和modifiedFrom一起,相当于查询在
2018-01-01到2018-01-31之间(包含01和31号)被修改的数据。 |
- 返回字段说明:
- result : 符合搜索条件的实例ID列表
- data:实例ID列表数组
- totalCount:符合条件的实例总数
- currentPage:当前页
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result : 符合搜索条件的实例ID列表
- 返回值结果示例:
{
"result": {
"data": [
"f30233fb-72e1-4af4-8cb8-c7e0ea9ee530",
"bc0950a3-fe1b-459c-b6ba-282be38523ab",
"f540cbd7-43eb-40de-b915-6716578a2802"
],
"totalCount": 3,
"currentPage": 1
},
"success": true
}
3. 根据搜索条件获取实例详情列表
- 接口:/yida/process/getInstances.json
- 说明:只有应用管理员才能使用这个接口
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 该接口只有应用管理员能使用。会校验userId是否应用管理员。 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formUuid | 表单ID | 是 | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | 请看附录6 |
searchFieldJson | 根据表单内组件值查询 | 否 | 格式见附录2:根据组件值进行条件搜索,组件值格式说明 | |
targetFieldJson | 想获取的表单组件值 | 否 | [“textField_jf9a8cqs”,”employeeField_jf9a78un”] | [“fieldId”…] |
taskId | 任务ID | 否 | 2199132092 | 一般用不到。 |
instanceStatus | 实例状态 | 否 | RUNNING | 可选值为:RUNNING,TERMINATED,COMPLETED,ERROR。 分别代表:运行中,已终止,已完成,异常。 |
approvedResult | 流程审批结果 | 否 | agree | 可选值为:agree, disagree。 分别表示:同意, 拒绝。 |
currentPage | 当前页 | 否 | 1 | 必须大于0 默认1 |
pageSize | 每页记录数 | 否 | 10 | 必须大于0 默认10 |
originatorId | 根据流程发起人工号查询 | 否 | ||
createFrom | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表 | 否 | 2018-01-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
createTo | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表。 | 否 | 2018-02-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 和createFrom一起,相当于查询在 2018-01-01到2018-01-31之间(包含01和31号)创建的数据。 |
modifiedFrom | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表 | 否 | 2018-01-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
modifiedTo | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表。 | 否 | 2018-02-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
和modifiedFrom一起,相当于查询在
2018-01-01到2018-01-31之间(包含01和31号)被修改的数据。 |
- 返回字段说明:
- result :
- currentPage : 当前页
- totalCount : 符合条件的实例总数
- data : 实例详情列表数组,单个实例详情格式参见:附录3-流程实例详情对象格式说明
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result :
- 返回结果示例:
{
"result": {
"data": [
{
"actioners": [
{
"name": {
"pureEn_US": "xxx",
"en_US": "xxx",
"zh_CN": "xxx",
"type": "i18n"
},
"userId": "xxx"
}
],
"processInstanceId": "f30233fb-72e1-4af4-8cb8-c7e0ea9ee530",
"formUuid": "FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3",
"data": {
"numberField_jcr0069o": 1,
"multiSelectField_jcr0069s": [
"选项三",
"选项二"
],
"textareaField_jcr0069n": "duohang",
"employeeField_jcr0069x": [
"119384"
],
"departmentField_jcr0069z": "信息平台事业部",
"cascadeDate_jcr0069u": [
"1514736000000",
"1517328000000"
],
"cascadeSelectField_jcr006a0": [
"part",
"part_b"
],
"tableField_jcr006a1": [
{
"departmentField_jcr006ad": "信息平台事业部",
"cascadeDate_jcr006aa": [
"1514736000000",
"1517328000000"
],
"selectField_jcr006a6": "选项三",
"citySelectField_jcr006ac": [
"天津",
"天津市",
"河东区"
],
"radioField_jcr006a5": "选项二",
"employeeField_jcr006ab": [
"079349",
"086172"
],
"dateField_jcr006a9": 1517328000000,
"textField_jcr006a2": "明细下单行",
"textareaField_jcr006a3": "明细下多行",
"cascadeSelectField_jcr006ae": [
"product",
"product_a"
],
"numberField_jcr006a4": 2,
"checkboxField_jcr006a7": [
"选项一",
"选项三",
"选项二"
],
"multiSelectField_jcr006a8": [
"选项一",
"选项三",
"选项二"
]
}
],
"selectField_jcr0069q": "选项一",
"citySelectField_jcr0069y": [
"北京",
"北京市",
"东城区"
],
"checkboxField_jcr0069r": [
"选项三",
"选项二"
],
"textField_jcr0069m": "danhang",
"radioField_jcr0069p": "选项一",
"dateField_jcr0069t": 1516636800000
},
"processCode": "TPROC--EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ4",
"originator": {
"name": {
"pureEn_US": "xxx",
"en_US": "xxxx",
"zh_CN": "xxx",
"type": "i18n"
},
"userId": "xxxx"
},
"title": "xxx发起的流程",
"instanceStatus": "RUNNING"
}
],
"totalCount": 1,
"currentPage": 1
},
"success": true
}
4. 根据实例ID获取流程实例详情
- 接口:/yida/process/getInstanceById.json
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 会校验userId是否有访问实例的权限 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
processInstanceId | 流程实例ID | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 |
- 返回字段说明:
- result : 实例详情列表,实例详情格式参见:附录3-流程实例详情对象格式说明
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"result": {
"actioners": [
{
"name": {
"pureEn_US": "xxx",
"en_US": "xxx",
"zh_CN": "xxx",
"type": "i18n"
},
"userId": "xxx"
}
],
"processInstanceId": "f30233fb-72e1-4af4-8cb8-c7e0ea9ee530",
"formUuid": "FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3",
"data": {
"numberField_jcr0069o": 1,
"multiSelectField_jcr0069s": [
"选项三",
"选项二"
],
"textareaField_jcr0069n": "duohang",
"employeeField_jcr0069x": [
"119384"
],
"departmentField_jcr0069z": "信息平台事业部",
"cascadeDate_jcr0069u": [
"1514736000000",
"1517328000000"
],
"cascadeSelectField_jcr006a0": [
"part",
"part_b"
],
"tableField_jcr006a1": [
{
"departmentField_jcr006ad": "信息平台事业部",
"cascadeDate_jcr006aa": [
"1514736000000",
"1517328000000"
],
"selectField_jcr006a6": "选项三",
"citySelectField_jcr006ac": [
"天津",
"天津市",
"河东区"
],
"radioField_jcr006a5": "选项二",
"employeeField_jcr006ab": [
"079349",
"086172"
],
"dateField_jcr006a9": 1517328000000,
"textField_jcr006a2": "明细下单行",
"textareaField_jcr006a3": "明细下多行",
"cascadeSelectField_jcr006ae": [
"product",
"product_a"
],
"numberField_jcr006a4": 2,
"checkboxField_jcr006a7": [
"选项一",
"选项三",
"选项二"
],
"multiSelectField_jcr006a8": [
"选项一",
"选项三",
"选项二"
]
}
],
"selectField_jcr0069q": "选项一",
"citySelectField_jcr0069y": [
"北京",
"北京市",
"东城区"
],
"checkboxField_jcr0069r": [
"选项三",
"选项二"
],
"textField_jcr0069m": "danhang",
"radioField_jcr0069p": "选项一",
"dateField_jcr0069t": 1516636800000
},
"currentActivityInstances": [
{
"activityId": "sid-6470221a-82ec-4bdd-a873-245ee47a5605",
"activityName": "主管审批",
"activityNameEn": "managerApproval",
"id": 31644983
}
],
"processCode": "TPROC--EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ4",
"originator": {
"name": {
"pureEn_US": "xxx",
"en_US": "xxxx",
"zh_CN": "xxx",
"type": "i18n"
},
"userId": "xxxx"
},
"title": "xxx发起的流程",
"gmtCreate": "2021-01-07 17:07:31",
"gmtModified": "2021-01-07 17:07:30",
"instanceStatus": "RUNNING"
},
"success": true
}
5. 删除流程实例
- 接口:/yida/process/deleteInstance.json
- 说明:只有应用管理员才能使用这个接口
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 校验userId是否有删除权限 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
processInstanceId | 流程实例ID | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 |
- 返回字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"success": true
}
6. 终止流程实例
- 接口:/yida/process/terminateInstance.json
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 会校验userId是否应用管理员,不是报错 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
processInstanceId | 流程实例ID | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 |
- 返回字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"success": true
}
7. 执行审批任务
- 接口:/yida/task/executeTask.json
- 参数
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
| systemToken | 应用秘钥 | 是 | hexxyy | |
| userId | 登录人的工号 | 是 | | 校验userId是否任务的执行人 |
| language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | taskId | 任务ID | 是 | 12002575 | | | procInstId | 实例ID | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 | | | outResult | 审批结果 | 是 | AGREE | AGREE(同意)、DISAGREE(不同意) | | remark | 审批意见 | 是 | 确认同意 | | | formDataJson | 更新的表单值 | 否 | | 参考:附录1保存/更新 表单数据格式说明。
参数有的组件更新,没有的组件保持不变。
明细的值只能统一更新,无法只更新明细下某个组件的值 |
- 返回值字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"success": true
}
8. 执行转交任务
- 接口: /yida/task/redirectTask.json
- 参数
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
| systemToken | 应用秘钥 | 是 | | 在应用数据中获取。 |
| byManager | 是否应用管理员进行转交 | 是 | y |
- 可选项 : y/n
- y,则userId必须传应用管理员工号,或者yida_pub_account
- n, userId必须传任务的当前执行人
| | userId | 登录人的工号 | 是 | | | | language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US | | processInstanceId | 流程实例ID | 是 | 54a99bc7-3d63-4885-88de-27a9bdbcb3ab | | | taskId | 任务ID | 是 | 9859968 | | | nowActionerId | 转交后新的任务处理人的工号 | 是 | 47072888 | | | remark | 转交备注 | 是 | 帮忙处理下,谢谢 | |
- 返回字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"success":true
}
下面给出两组测试程序:
测试1:转交人为【宜搭平台】
当前审批流到达第一个审批人修俊(userid: 47072721),我们希望将当前审批经由宜搭平台转交给另外一个审批人砚心(userid: 47072888)。
编写如下的代码,重点关注参数byManager为y,userId参数为公共账号yida_pub_account。
@Test
public void redirectTaskTest() {
String api = "/yida/task/redirectTask.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_XO5***IW5ITX5J4OPS5Y");
postClient.addParameter("systemToken", "I10DRPF***RINFOHEKWR4OZ0Y053Q3320H2SX9K0");
postClient.addParameter("byManager", "y");
postClient.addParameter("userId", "yida_pub_account");
postClient.addParameter("processInstanceId", "54a99bc7-3d63-4885-88de-27a9bdbcb3ab");
postClient.addParameter("nowActionerId", "47072888");
postClient.addParameter("taskId", "9859968");
postClient.addParameter("remark", "帮忙处理下,谢谢");
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
再去页面查看一下,最新的流程页面,显示当前流程经由公共账号宜搭平台(userid: yida_pub_account)转交给了砚心(userid: 47072888)进行审批。
测试2:转交人为当前审批人
当前审批流到达第一个审批人修俊(userid: 47072721),我们希望将当前审批经由当前审批人转交给另外一个审批人砚心(userid: 47072888)。
编写如下的代码,重点关注参数byManager为n,userId参数为当前审批人修俊(userid: 47072721)。
@Test
public void redirectTaskTest() {
String api = "/yida/task/redirectTask.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_XO5CFLIW5ITX5J4OPS5Y");
postClient.addParameter("systemToken", "I10DRPF692RINFOHEKWR4OZ0Y053Q3320H2SX9K0");
postClient.addParameter("byManager", "n");
postClient.addParameter("userId", "47072721");
postClient.addParameter("processInstanceId", "e778917a-3743-41e2-8341-6bab7da10837");
postClient.addParameter("nowActionerId", "47072888");
postClient.addParameter("taskId", "9903391");
postClient.addParameter("remark", "帮忙处理下,谢谢");
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
再去页面查看一下,最新的流程页面,显示当前流程经由原审批人修俊(userid: 47072721)转交给了砚心(userid: 47072888)进行审批。
9. 获取审批记录
- 接口:/yida/process/getOperationRecords.json
- 参数
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
| systemToken | 应用秘钥 | 是 | hexxyy | |
| userId | 登录人的工号 | 是 | | 校验userId是否有访问实例的权限 |
| language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | processInstanceId | 流程实例ID | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 | |
- 返回字段说明:
- result:审批记录列表
- id:主键Id
- processInstanceId:对应流程实例Id
- taskId:对应任务Id
- showName:节点名称
- activityId:节点定义ID
- operator:操作人
- operatorNick:操作人花名
- operatorName:操作人真名
- operatorDisplayName:操作人国际化显示名
- operatorStatus:操作人状态
- operateTime:操作时间
- action:执行动作
- remark:备注
- taskType:任务类型: 普通的任务类型 COMMON 中间插入的任务类型 MIDDLE_IN
- taskExecuteType:任务执行类型
- files:附件保存的文件
- operatorAgentIds:代理人
- operateType:操作类型
- activeTime:任务激活时间
- taskHoldTime:任务滞留时间
- operatorPhotoUrl:人员头像
- size:固定值1
- type:固定值HISTORY
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result:审批记录列表
- 返回结果示例:
{
"success": true,
"result": [
{
"operateTime": "2018-06-22 14:35:40",
"remark": "",
"taskHoldTime": 0,
"type": "HISTORY",
"operatorName": "王许川",
"operator": "WB260752",
"activityId": "sid-restartevent",
"action": "提交申请",
"actionExt": "submit",
"id": 2846866118,
"operatorPhotoUrl": "//work.alibaba-inc.com/photo/WB260752.128x128.jpg",
"processInstanceId": "8c124808-82e7-473b-9a7a-43c29b310837",
"showName": "提交申请",
"operateType": "NEW_PROCESS",
"domains": [],
"operatorStatus": "A",
"operatorAgentIds": [],
"size": 1,
"operatorDisplayName": "王许川",
"taskId": "null"
},
{
"taskHoldTime": 531398377,
"type": "TODO",
"operatorName": "王许川",
"operator": "WB260752",
"activityId": "sidJIOB2P2J1JW3RPMDOS28",
"taskType": "COMMON_ALL_AT_ONCE",
"actionExt": "doing",
"operatorPhotoUrl": "//work.alibaba-inc.com/photo/WB260752.128x128.jpg",
"processInstanceId": "8c124808-82e7-473b-9a7a-43c29b310837",
"showName": "执行人",
"activeTime": "2018-06-22 14:35:41",
"domains": [],
"operatorStatus": "A",
"operatorAgentIds": [],
"size": 1,
"operatorDisplayName": "王许川",
"taskId": "2846866145"
}
]
}
10. 执行虚拟节点审批任务
- 接口: /yida/process/executePlatformTask.json
参数 | 参数名 | 描述 | 是否必填 | 示例 | 备注 | | —- | —- | —- | —- | —- | | appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | | | systemToken | 应用秘钥 | 是 | hexxyyddd | | | userId | 登录人的工号 | 是 | yida_pub_account | 写死 yida_pub_account | | language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | procInstId | 流程实例ID | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 | | | outResult | 审批结果 | 是 |
- agree
- disagree
| | | formDataJson | 更新的表单数据 | 否 | | 参考:附录1保存/更新 表单数据格式说明。
参数有的组件更新,没有的组件保持不变。
明细的值只能统一更新,无法只更新明细下某个组件的值 | | remark | 审批意见 | 是 | 确认同意 | | | noExecuteExpressions | 是否不执行校验&关联操作 | 否 | y | 本任务节点有绑定校验规则或者关联操作时,
y -> 不执行校验规则&关联操作
n -> 执行校验规则&关联操作
不传默认为n,即会执行校验规则&关联操作 |返回字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"success": true
}
11. 流程实例更新
- 接口:/yida/process/updateInstance.json
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的员工工号 | 是 | 会校验userId是否有流程发起权限 | |
language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US |
processInstanceId | 实例ID | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 | |
updateFormDataJson | 更新的表单数据 | 是 | 参考:附录1保存/更新 表单数据格式说明 |
- 返回字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"success": true
}
12. 获取指定流程节点上可操作功能点列表
- 接口: /yida/process/getActivityButtonVOs.json
- 参数
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的员工工号 | 是 | 会校验userId是否有流程发起权限 | |
language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US |
processCode | 流程编码 | 是 | TPROC—X1G*42ZMGA31OYELIWJ1 | 可以在数据管理页的流程变量中获取。 |
activityId | 节点ID | 是 | sidKDYN9BIP*4K06T8G7 | 可以通过/yida/process/getOperationRecords.json 接口返值中的activityId字段获取 |
- 返回值字段说明:
- result:按钮显示的中英文描述
- aliasEn:按钮显示英文
- alias:按钮显示中文
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result:按钮显示的中英文描述
- 返回值结果示例:
{
"result": [
{
"aliasEn": "Forward",
"alias": "转交",
},
{
"aliasEn": "Append",
"alias": "加签",
},
{
"aliasEn": "Return",
"alias": "退回",
}
],
"success": true
}
补充说明:
这个接口的主要功能用于查询指定流程节点(使用activityId标识)所支持的处理功能列表,通常的可选值包括:同意、拒绝、转交、撤销、退回、加签等。如下图所示,展示的是流程中的第一个审批节点所对应的处理功能列表的页面展示。
假如我们希望通过上述接口查询这个列表应该怎么操作呢?下面给出一个完整的示例:
@Test
public void getActivityButton() {
String api = "/yida/process/getActivityButtonVOs.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_GESFHE***1BWRJC4F0JU");
postClient.addParameter("systemToken", "VSHCV32U***MF4ZMX1DBWK4UYXRJS30DP7GW9K0");
postClient.addParameter("userId", "118***32");
postClient.addParameter("processCode","TPROC--VSHCV***23KKHNAXC3YKFH8SHTCMI27SWLYMCK4");
postClient.addParameter("activityId","sidKDYN9B***2O4K06T8G7");
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
13. 退回/重新发起实例
- 接口: /yida/task/restartInstance.json
参数 | 参数名 | 描述 | 是否必填 | 示例 | 备注 | | —- | —- | —- | —- | —- | | appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | | | systemToken | 应用秘钥 | 是 | hello1234 | | | userId | 登录人的员工工号 | 是 | | 会校验userId是否有流程发起权限 | | language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US | | processInstanceId | 流程实例id | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 | | | taskId | 任务id | 是 | 9905037 | | | currentActivityId | 当前流程节点的id | 是 | sidKF6MA2JNF20DD4CC4 | | | targetActivityId | 目标流程节点的id | 否 | sidKF6MA2JNF20DD4CC4 | 如果为空则退回到提交人节点 | | remark | 评论 | 否 | | | | files | 附件文件地址列表,JSON数组格式 | 否 | | | | formUuid | 表单编码formuuid | 否 | FORM-NJYJZELV8YZRDEI2N5IQ7L6VEDMR1VE9GMPCJB | 通常不填 |
返回值字段说明:
- result:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回值结果示例:
下面以一个实际的案例介绍该接口的具体使用:{
"success": true
}
假设当前的审批处理已经到达指定的审批人了,审批人提交的内容不合规,想要将流程退回给流程的发起人:
接口中所需的参数activityId和taskId可以通过 /yida/process/getOperationRecords.json 接口获取。
假如我们希望通过上述接口查询这个列表应该怎么操作呢?下面给出一个完整的示例:
@Test
public void restartInstanceTest() {
String api = "/yida/task/restartInstance.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_XO5CFL***ITX5J4OPS5Y");
postClient.addParameter("systemToken", "I10DRPF692RINFOH***R4OZ0Y053Q3320H2SX9K0");
postClient.addParameter("userId", "47072721");
postClient.addParameter("taskId", "9905037");
postClient.addParameter("currentActivityId", "sidKF6M6U6A2JNF20DD4CC4");
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
程序的执行结果如下:
页面显示如下,可以看到审批流程已经退回到发起人
14. 执行加签操作
- 接口: /yida/task/appendTask.json
- 参数 | 参数名 | 描述 | 是否必填 | 示例 | 备注 | | —- | —- | —- | —- | —- | | appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | | | systemToken | 应用秘钥 | 是 | hello1234 | | | userId | 登录人的员工工号 | 是 | | 会校验userId是否有流程发起权限 | | language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US | | taskId | 任务id | 是 | 9905037 | | | procInsId | 流程实例id | 是 | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 | | | actioners | 加签操作人列表 | 是 | [“1234”,”2345”] | | | isBefore | 是否为前加签 | 是 | true | | | remark | 评论 | 否 | 不符合要求,建议修改后重新发起 | |
- 返回值字段说明:
- result:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
示例程序:
@Test
public void appendTaskTest() {
String api = "/yida/task/appendTask.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_XO5CFL***ITX5J4OPS5Y");
postClient.addParameter("systemToken", "I10DRPF692RINFOH***R4OZ0Y053Q3320H2SX9K0");
postClient.addParameter("userId", "47***721");
postClient.addParameter("taskId", "9905037");
postClient.addParameter("procInsId", "64f3e8bc-a28a-4ec0-9b09-5383df8f00b2");
postClient.addParameter("actioners", "[\"47072721\"]");
postClient.addParameter("isBefore", "true");
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
- 返回值结果示例:
{
"success": true
}
4.3 单据实例
1. 新增单据实例
- 接口:/yida/form/saveFormData.json
- 参数:
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 校验userId是否有单据提交权限 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formUuid | 表单ID | 是 | FORM-NJYJZELV8YZRDEI2N5IQ7L6VEDMR1VE9GMPCJB | 请看附录6 |
formDataJson | 表单数据 | 是 | {“textField_jcpm6agt”: “单行”,”employeeField_jcos0sar”: [“workno”]} | 参考:附录1保存/更新 表单数据格式说明 |
- 返回字段说明:
- result:新创建的表单示例ID
- success: 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"result": "FINST-EF6Y93URN2UZ1SBPLIP9NAV6HR2GEO1Z4ZCHSCJ0",
"success": true
}
完整Demo:
新建一个应用,创建一个表单页面,为了演示方便,只包含一个简单的单行文本框的控件,将该应用上线。
特别说明:未上线的应用是无法提交数据的。
在设计器页面,获取控件的唯一标识备用:textField_kmmsati6
获取应用相关的授权参数备用,包括appType、systemToken、formUuid。
参数名 | 参数值 |
---|---|
appType | APP_ERF2P6JMM5LJ8S3CYS1G |
systemToken | YZ14852L21UCNOCY*76O8EZ0634VDSNKMK0 |
formUUid | FORM-YZ14852L2106OOQY5Q2HYJQ50A3U592UTOASMMK1 |
前往开放平台,确保已经完成该接口“/yida/form/saveFormData.json”的订阅。
此处忽略截图。
接下来,编写如下的测试代码:
@Test
public void saveFormDataTest(){
String api = "/yida/form/saveFormData.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_ERF2P6JMM5LJ8S3CYS1G");
postClient.addParameter("systemToken", "YZ14852L21UCNOCY*****76O8EZ0634VDSNKMK0");
postClient.addParameter("userId", "yida_pub_account");
postClient.addParameter("formUuid", "FORM-YZ14852L2106OOQY5Q2HYJQ50A3U592UTOASMMK1");
Map<String,String> dataMap = new HashMap<>();
dataMap.put("textField_kmmsati6","mytest");
postClient.addParameter("formDataJson", JSON.toJSONString(dataMap));
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
前往数据管理页,可以看到已经有一条新提交的数据了,且提交人、提交的数据跟代码中的参数一致,验证通过。
2. 更新单据中指定组件值
- 接口:/yida/form/updateFormData.json
- 参数:
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 校验userId是否有更新权限 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formInstId | 要更新的表单数据ID | 是 | FINST-NJYJZELVVYZRVGJHR7M6FJW3ESJN1P1TCNPCJ9 | |
updateFormDataJson | 要更新的表单组件值,必填 | 是 | {“employeeField_jcpm5gy2”: [“workno”]} | 参考:附录1保存/更新 表单数据格式说明。 参数有的组件更新,没有的组件保持不变。 明细的值只能统一更新,无法只更新明细下某个组件的值 |
- 返回字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"success": true
}
3. 删除单据实例
- 接口:/yida/form/deleteFormData.json
- 参数:
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 校验userId是否有删除权限 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formInstId | 要删除的表单数据ID | 是 | FINST-NJYJZELVVYZRVGJHR7M6FJW3ESJN1P1TCNPCJ9 |
- 返回字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"success": true
}
4. 根据单据实例ID查询单据实例详情
- 接口:/yida/form/getFormDataById.json
- 参数:
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 校验userId是否有数据查看权限 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formInstId | 要查询的实例的实例ID | 是 | FINST-NJYJZELVVYZRVGJHR7M6FJW3ESJN1P1TCNPCJ9 |
- 返回字段说明:
- result:单据实例详情。详细的字段描述参见:附录5. 单据实例详情对象格式说明
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"gmtModified":"2018-01-24 11:22:01",
"formUuid":"FORM-EF6Y93URN24F1SCX15VA2P918LPEIJ2H3UFORCJ1",
"formInstId":"FINST-EF6Y93URN2F02S745LTMW2D2G4WVDS16O17ISCJ0",
"formData":{
"numberField_jcr0069o":1,
"multiSelectField_jcr0069s":[
"选项三",
"选项二"
],
"textareaField_jcr0069n":"duohang",
"employeeField_jcr0069x":[
"119384"
],
"departmentField_jcr0069z":"xxxx",
"cascadeDate_jcr0069u":[
"1514736000000",
"1517328000000"
],
"cascadeSelectField_jcr006a0":[
"part",
"part_b"
],
"tableField_jcr006a1":[
{
"departmentField_jcr006ad":"xxxx",
"cascadeDate_jcr006aa":[
"1514736000000",
"1517328000000"
],
"selectField_jcr006a6":"选项三",
"citySelectField_jcr006ac":[
"天津",
"天津市",
"河东区"
],
"radioField_jcr006a5":"选项二",
"employeeField_jcr006ab":[
"079349",
"086172"
],
"dateField_jcr006a9":1517328000000,
"textField_jcr006a2":"明细下单行",
"textareaField_jcr006a3":"明细下多行",
"cascadeSelectField_jcr006ae":[
"product",
"product_a"
],
"numberField_jcr006a4":2,
"checkboxField_jcr006a7":[
"选项一",
"选项三",
"选项二"
],
"multiSelectField_jcr006a8":[
"选项一",
"选项三",
"选项二"
]
}
],
"selectField_jcr0069q":"选项一",
"citySelectField_jcr0069y":[
"北京",
"北京市",
"东城区"
],
"checkboxField_jcr0069r":[
"选项三",
"选项二"
],
"textField_jcr0069m":"danhang",
"radioField_jcr0069p":"选项一",
"dateField_jcr0069t":1516636800000
},
"originator":{
"name":{
"pureEn_US":"userEnglishName",
"en_US":"userEnglishName",
"zh_CN":"userName",
"type":"i18n"
},
"userId":"xxxx"
}
}
5. 根据条件搜索单据实例ID列表
- 接口:/yida/form/searchFormDataIds.json
- 只有应用管理员才能使用这个接口
- 参数:
参数名 | 描述 | 是否必填 | 示例 | 备注 |
---|---|---|---|---|
appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
systemToken | 应用秘钥 | 是 | hello1234 | |
userId | 登录人的工号 | 是 | 校验userId是否应用管理员,不是报错 | |
language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US 默认:zh_CN |
formUuid | 表单ID | 是 | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | 请看附录6 |
searchFieldJson | 根据表单内组件值查询 | 否 | 格式见附录2:根据组件值进行条件搜索,组件值格式说明 | |
currentPage | 当前页 | 否 | 1 | 必须大于0 默认1 |
pageSize | 每页记录数 | 否 | 10 | 必须大于0 默认10 |
originatorId | 根据数据提交人工号查询 | 否 | ||
createFrom | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表 | 否 | 2018-01-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
createTo | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表。 | 否 | 2018-02-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 和createFrom一起,相当于查询在 2018-01-01到2018-01-31之间(包含01和31号)创建的数据。 |
modifiedFrom | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表 | 否 | 2018-01-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
modifiedTo | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表。 | 否 | 2018-02-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 |
和modifiedFrom一起,相当于查询在
2018-01-01到2018-01-31之间(包含01和31号)被修改的数据。 |
- 返回值字段说明:
- result:
- data : 实例ID列表
- totalCount : 符合条件的实例总数
- currentPage : 当前页
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result:
- 返回结果示例:
{
"result": {
"data": [
"FINST-EF6Y93URN2F02S745LTMW2D2G4WVDS16O17ISCJ0"
],
"totalCount": 1,
"currentPage": 1
},
"success": true,
"errorMsg": null,
"errorCode": null
}
6. 根据条件搜索单据实例详情列表
- 接口:/yida/form/searchFormDatas.json
- 说明:只有应用管理员才能使用这个接口
参数 | 参数名 | 描述 | 是否必填 | 示例 | 备注 | | —- | —- | —- | —- | —- | | appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | | | systemToken | 应用秘钥 | 是 | hello1234 | | | userId | 登录人的工号 | 是 | | 校验userId是否应用管理员,不是报错 | | language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | formUuid | 表单ID | 是 | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | 请看附录6 | | searchFieldJson | 根据表单内组件值查询 | 否 | | 格式见附录2:根据组件值进行条件搜索,组件值格式说明 | | targetFieldJson | 想获取的组件值 | 否 | [“employeeField_jf9a78un”,”textField_jf9a8cqs”] | [“fieldId”..] | | currentPage | 当前页 | 否 | 1 | 必须大于0,默认1 | | pageSize | 每页记录数 | 否 | 10 | 必须大于0
默认10 | | originatorId | 根据数据提交人工号查询 | 否 | | | | createFrom | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表 | 否 | 2018-01-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。 | | createTo | createFrom和createTo两个时间构造一个时间段。查询在该时间段创建的数据列表。 | 否 | 2018-02-01 | 字符串格式,目前支持yyyy-MM-dd和yyyy-MM-dd HH:mm:ss 两种日期格式。
和createFrom一起,相当于查询在
2018-01-01到2018-01-31之间(包含01和31号)创建的数据。 | | modifiedFrom | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表 | 否 | 2018-01-01 | 字符串格式,且为yyyy-MM-DD格式 | | modifiedTo | modifiedFrom和modifiedTo构成一个时间段,查询在该时间段有修改的数据列表。 | 否 | 2018-02-01 | 字符串格式,且为yyyy-MM-DD格式。
和modifiedFrom一起,相当于查询在
2018-01-01到2018-01-31之间(包含01和31号)被修改的数据。 |返回值字段说明:
- result :
- data : 实例详情列表数组。单个实例详情格式参见:附录5:单据实例详情对象格式说明
- currentPage : 当前页
- totalCount : 符合条件的实例总数
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result :
- 返回结果示例:
案例:{
"result":{
"data":[
{
"gmtModified":"2020-06-08 17:14:29",
"formUuid":"FORM-LWCG19P4L2IO5GVBTQXIKWZ3NEJ3QV1NVB3A6BKA",
"originator":{
"name":{
"pureEn_US":"良枼",
"en_US":"良枼",
"zh_CN":"良枼",
"type":"i18n"
},
"userId":"160340"
},
"title":"良枼发起的简单表单",
"gmtCreate":"2020-06-08 17:14:29",
"formInstId":"FINST-00FOFWHSB2Z25GQ8QBYGHGZ2ZF1UCV2J914A6BK7",
"formData":{
"textField_kb6a3g6q":"34"
}
},
{
"gmtModified":"2020-06-08 17:14:35",
"formUuid":"FORM-LWCG19P4L2IO5GVBTQXIKWZ3NEJ3QV1NVB3A6BKA",
"originator":{
"name":{
"pureEn_US":"良枼",
"en_US":"良枼",
"zh_CN":"良枼",
"type":"i18n"
},
"userId":"160340"
},
"title":"良枼发起的简单表单",
"gmtCreate":"2020-06-08 17:14:35",
"formInstId":"FINST-00FOFWHSB2445GVDSJZQFCL2E734FO3JY54A6BKG",
"formData":{
"textField_kb6a3g6q":"56"
}
},
{
"gmtModified":"2020-06-13 11:04:41",
"formUuid":"FORM-LWCG19P4L2IO5GVBTQXIKWZ3NEJ3QV1NVB3A6BKA",
"originator":{
"name":{
"pureEn_US":"良枼",
"en_US":"良枼",
"zh_CN":"良枼",
"type":"i18n"
},
"userId":"160340"
},
"title":"良枼发起的简单表单",
"gmtCreate":"2020-06-13 11:04:41",
"formInstId":"FINST-T1DE78JEE1Y0OGYV9150Q4M68YJIFD3QUP32DBK0",
"formData":{
"textField_kb6a3g6q":"1"
}
}
],
"totalCount":3,
"currentPage":1
},
"success":true
}
单行文本框 | 数字输入框 | 人员搜索框 | |
---|---|---|---|
唯一标识 | textField_kn8ay5aq | numberField_kn8ay5ar | employeeField_kne1mutg |
测试数据1 | pp | 2 | 炎光(47072722) |
测试数据2 | test | 3 | 修俊(47072721),砚心(47072888) |
测试数据3 | test | 1 | 砚心(47072888) |
测试数据4 | test | 2 | 修俊(47072721) |
示例代码1:根据单行文本框字段值进行数据过滤
@Test
public void searchFormDataTest() {
String api = "/yida/form/searchFormDatas.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_LD3XO46Y8SBMWN94DWWJ");
postClient.addParameter("systemToken", "CE1WPNFFEKL3PB7RK****4LSS6R8P10HL3H7NK0");
postClient.addParameter("userId", "yida_pub_account");
postClient.addParameter("formUuid", "FORM-CE1WPNFFELL3PVXIM2WES6DBR05LV3NLP5H7NK0");
Map<String, Object> dataMap = new HashMap<>();
// 文本框测试验证通过
dataMap.put("textField_kn8ay5aq", "pp");
postClient.addParameter("searchFieldJson", JSON.toJSONString(dataMap));
String apiResult = postClient.post();
JSONObject obj = JSON.parseObject(apiResult);
Assert.notNull(obj);
}
可以看到,筛选出来符合条件的数据只有1条,且当行文本框(textField_kn8ay5aq)的值为pp,符合预期。
示例代码2:根据人员搜索框字段值进行过滤
@Test
public void searchFormDataTest() {
String api = "/yida/form/searchFormDatas.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_LD3XO46Y8SBMWN94DWWJ");
postClient.addParameter("systemToken", "CE1WPNFFEKL3PB7RK****LSS6R8P10HL3H7NK0");
postClient.addParameter("userId", "yida_pub_account");
postClient.addParameter("formUuid", "FORM-CE1WPNFFELL3PVXIM2WES6DBR05LV3NLP5H7NK0");
Map<String, Object> dataMap = new HashMap<>();
// 人员搜索框
dataMap.put("employeeField_kne1mutg", Arrays.asList("47072888"));
postClient.addParameter("searchFieldJson", JSON.toJSONString(dataMap));
String apiResult = postClient.post();
JSONObject obj = JSON.parseObject(apiResult);
Assert.notNull(obj);
}
可以看到,查询到符合条件的结果值有2条,对应测试数据2和测试数据3,这两条数据的人员搜索框字段均包含有砚心(47072888),数据查询的结果符合预期。
更多其他控件过滤字段的格式请参考本文的附录2,这里不再展开赘述。
7. 获取表单定义
- 接口:/yida/formDesign/getFormComponentDefinationList.json
- 参数:
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
| systemToken | 应用秘钥 | 是 | hexxxx | |
| userId | 登录人的工号 | 是 | | |
| language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | formUuid | 表单ID | 是 | FORM-NJYJZELV8YZRDEI2N5IQ7L6VEDMR1VE9GMPCJB | |
- 返回字段说明:
- result:表单中的控件描述信息列表
- label:控件的中英文标签信息
- key:控件的唯一标识
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result:表单中的控件描述信息列表
- 返回结果示例:
{
"result":[
{
"label":"{"en_US":"CheckBox Field","zh_CN":"多选","type":"i18n"}",
"key":"checkboxField_jiwvhkdi"
},
{
"label":"{"en_US":"Textarea Field","zh_CN":"多行输入框","type":"i18n"}",
"key":"textareaField_jiwvhkdh"
},
{
"label":"{"en_US":"Select Field","zh_CN":"下拉单选","type":"i18n"}",
"key":"selectField_jiwvhkdg"
}
],
"success":true
}
4.4 任务中心
1. 查询已提交任务
- 接口: /yida/process/getMySubmmitInCorp.json
- 参数
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| corpId | 企业ID | 是 | | |
| page | 当前页 | 是 | 1 | 必须大于0 默认1 |
| limit | 每页记录数 | 是 | 10 | 必须大于0 默认10 最大值:100 |
| language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US |
| keyword | 关键词 | 否 | | |
| appTypes | 应用标识列表 | 否 | [“APP_xxx”,”APP_xxx”] | |
| processCodes | 流程code列表 | 否 | [“xx”,”xxx”] | |
| createFrom | 创建开始时间 | 否 | | 13位以毫秒为单位的时间戳 |
| createTo | 创建结束时间 | 否 | | 13位以毫秒为单位的时间戳 |
| userId | 登录人的工号 | 是 | | |
| instanceCreateFrom | 实例创建开始时间 | 否 | | 13位以毫秒为单位的时间戳 |
| instanceCreateTo | 实例创建结束时间 | 否 | | 13位以毫秒为单位的时间戳 |
| taskFinishFrom | 任务开始时间 | 否 | | |
| instanceCreateTo | 任务结束时间 | 否 | | |
| token | 验权token | 是 | | md5(corpId + userId + code),每个企业有自己的唯一code
md5取32位大写值
特别说明:用于企业级别验权的code参数平台暂未透出,后面优化后会透出,当前阶段可以提供租户编码从宜搭值班同学侧获取。 |
- 返回字段说明:
- result : 返回内容
- data
- formInstanceId:表单示例id
- title:标题
- instValue:表单中的控件描述信息
- processId:流程实例id
- appType:应用编码
- dataMap:数据映射表,key为控件唯一id,value为控件值
- originatorId:发起人的id
- formUuid:表单id
- dataType:类型,其中finst表示流程。
- originatorAvatar:头像
- version:版本号
- createTime:创建时间
- modifiedTime:修改时间
- totalCount:符合条件的实例总数
- currentPage:当前页
- data
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result : 返回内容
- 返回结果示例:
1、成功结果返回示例:
{
"result": {
"data": [{
"formInstanceId": "FINST-AJ1L4CJVXL0UIAIPR06ZA52U9HKUXXXXXX",
"title": "单据",
"instValue": [{"componentId":"node_jfwgghbo","componentName":"TextField","fieldId":"textField_jfwggg8e","label":"姓名","validation":[],"fieldData":{"complexType":"custom","dataType":"CHANGED","pass":true,"value":"jack"},"errorMsg":null,"hasError":false}],
"processId": 0,
"appType": "APP_R8MYLKYXXXXXX",
"dataMap": {
"textField_jfXXXXXX": "XXXXXX"
},
"originatorId": "XXXXXX",
"formUuid": "FORM-0G7KPV3WZL0U3AHTOA9BFVXXXXXX",
"dataType": "finst",
"originatorAvatar": "http://static.dingtalk.com/media/lADPBbCc1R7VwSHNXXXXXX.jpg",
"version": 0,
"createTime": "2018-04-12 19:44:14",
"modifiedTime": "2018-04-12 19:44:14"
}],
"totalCount": 1,
"currentPage": 1
},
"success": true
}
备注:instValue返回的是字符串,内容格式是json数组
2、失败结果返回示例:
{
"errorCode": "TIANSHU_000006",
"success": false,
"errorMsg": "没有权限"
}
示例请求代码:
@Test
public void getMySubmmitInCorpTest() {
String api = "/yida/process/getMySubmmitInCorp.json";
String corpId = "ding5d17e3add038d44535c2f4657eb63711";
String userId = "141940523222800011";
String corpCode = "AJ1L4CJVOL0UUQPTQWX8YOTCCS7O1T4CSNJF11";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("page", "1");
postClient.addParameter("limit", "10");
postClient.addParameter("corpId", corpId);
// postClient.addParameter("appTypes", "[\"APP_I3D2FD2ZQB75KLLKL48Y\"]");
postClient.addParameter("userId", userId);
String token = DigestUtils.md5DigestAsHex(String.format("%s%s%s", corpId, userId, corpCode).getBytes()).toUpperCase();
postClient.addParameter("token", token);
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
2. 查询待办任务
- 接口: /yida/process/getTodoTasksInCorp.json
- 参数
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| corpId | 企业ID | 是 | | |
| userId | 登录人的工号 | 是 | | |
| limit | 每页记录数 | 是 | 10 | 必须大于0 默认10 最大值:100 |
| language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US |
| page | 当前页 | 是 | 1 | 必须大于0 默认1 |
| keyword | 关键词 | 否 | | |
| appTypes | 应用标识列表 | 否 | [“APP_xxx”,”APP_xxx”] | |
| processCodes | 流程code列表 | 否 | [“xx”,”xxx”] | |
| createTo | 创建结束时间 | 否 | | 13位以毫秒为单位的时间戳 |
| createFrom | 创建开始时间 | 否 | | 13位以毫秒为单位的时间戳 |
| token | 验权token | 是 | | md5(corpId + userId + code),每个企业有自己的唯一code
md5取32位大写值
特别说明:用于企业级别验权的code参数平台暂未透出,后面优化后会透出,当前阶段可以提供租户编码从宜搭值班同学侧获取。 |
- 返回字段说明:
- result : 返回内容
- data:我提交的流程实例列表
- processInstanceId:流程实例id
- originatorName:发起人的中文名
- title:流程实例的中文标题
- originatorPhoto:发起人的头像
- titleEn:流程实例的英文标题
- createTime:流程实例的发起时间
- appType:应用编码
- originatorNameEn:发起人的英文名
- originatorId:发起人的userid
- taskId:任务id
- status:任务状态,其中NEW表示新发起的流程
- totalCount:符合条件的实例总数
- currentPage:当前页
- data:我提交的流程实例列表
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result : 返回内容
- 返回结果示例:
1、成功结果返回示例:
{
"result": {
"data": [{
"processInstanceId": "XXXXXX",
"originatorName": "XXX",
"title": "XXX发起的流程",
"originatorPhoto": "http://static.dingtalk.com/media/lADPdfafafsAXXXXXX.jpg",
"titleEn": "XXX发起的流程",
"createTime": "2018-04-13 13:35:58",
"appType": "APP_R8MdfadfXXXXXX",
"originatorNameEn": "XXXXXX",
"originatorId": "XXXXXX",
"taskId": "XXXXXX",
"status": "NEW"
}],
"totalCount": 1,
"currentPage": 1
},
"success": true
}
2、失败结果返回示例:
{
"success": false,
"errorCode": "TIANSHU_000006",
"errorMsg": "没有权限"
}
示例请求代码:
@Test
public void getTodoTasksInCorpTest() {
String api = "/yida/process/getTodoTasksInCorp.json";
String corpId = "ding5d17e3add038d44535c2f4657eb63711";
String userId = "141940523222800011";
String corpCode = "AJ1L4CJVOL0UUQPTQWX8YOTCCS7O1T4CSNJF11";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("page", "1");
postClient.addParameter("limit", "10");
postClient.addParameter("corpId", corpId);
// postClient.addParameter("appTypes", "[\"APP_I3D2FD2ZQB75KLLKL48Y\"]");
postClient.addParameter("userId", userId);
String token = DigestUtils.md5DigestAsHex(String.format("%s%s%s", corpId, userId, corpCode).getBytes()).toUpperCase();
postClient.addParameter("token", token);
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
3. 查询已完成任务
- 接口: /yida/process/getDoneTasksInCorp.json
- 参数
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| corpId | 企业ID | 是 | | |
| limit | 每页记录数 | 是 | 10 | 必须大于0 默认10 最大值:100 |
| language | 语言环境 | 否 | zh_CN | 可选值:zh_CN/en_US |
| page | 当前页 | 是 | 1 | 必须大于0 默认1 |
| keyword | 关键词 | 否 | | |
| appTypes | 应用标识列表 | 否 | [“APP_xxx”,”APP_xxx”] | |
| processCodes | 流程code列表 | 否 | [“xx”,”xxx”] | |
| createFrom | 创建开始时间 | 否 | | 13位以毫秒为单位的时间戳 |
| createTo | 创建结束时间 | 否 | | 13位以毫秒为单位的时间戳 |
| userId | 登录人的工号 | 是 | | |
| token | 验权token | 是 | | md5(corpId + userId + code),每个企业有自己的唯一code
md5取32位大写值
特别说明:用于企业级别验权的code参数平台暂未透出,后面优化后会透出,当前阶段可以提供租户编码从宜搭值班同学侧获取。 |
- 返回字段说明:
- content : 返回内容
- data:已完成的流程列表
- processInstanceId:流程实例id
- finishTime:流程的完成时间
- originatorName:发起人的中文名
- title:流程实例的中文标题
- originatorPhoto:发起人的头像
- titleEn:流程实例的英文标题
- createTime:流程实例发起的时间
- appType:应用编码
- originatorNameEn:发起人的英文名
- originatorId:发起人的useerid
- taskId:任务id
- status:任务状态,其中COMPLETED表示已完成。
- totalCount:符合条件的实例总数
- currentPage:当前页
- data:已完成的流程列表
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- content : 返回内容
- 返回结果示例:
1、成功结果返回示例:
{
"result": {
"data": [{
"processInstanceId": "abc434rfds23XXXXXX",
"finishTime": "2018-03-28 17:46:14",
"originatorName": "",
"title": "XXX发起的流程页面",
"originatorPhoto": "//img.alicdn.com/tfs/TB1msdfsXXXXXX.jpg",
"titleEn": "XXX发起的流程页面",
"createTime": "2018-03-28 17:45:43",
"appType": "XXXXXX",
"originatorNameEn": "XXXXXX",
"originatorId": "XXXXXX",
"taskId": "XXXXXX",
"status": "COMPLETED"
}],
"totalCount": 1,
"currentPage": 1
},
"success": true
}
2、失败结果返回示例:
{
"errorCode":"TIANSHU_000006",
"success":false,
"errorMsg":"没有权限"
}
示例请求代码:
@Test
public void getDoneTasksInCorpTest() {
String api = "/yida/process/getDoneTasksInCorp.json";
String corpId = "ding5d17e3add038d44535c2f4657eb63711";
String userId = "141940523222800011";
String corpCode = "AJ1L4CJVOL0UUQPTQWX8YOTCCS7O1T4CSNJF11";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("page", "1");
postClient.addParameter("limit", "10");
postClient.addParameter("corpId", corpId);
// postClient.addParameter("appTypes", "[\"APP_I3D2FD2ZQB75KLLKL48Y\"]");
postClient.addParameter("userId", userId);
String token = DigestUtils.md5DigestAsHex(String.format("%s%s%s", corpId, userId, corpCode).getBytes()).toUpperCase();
postClient.addParameter("token", token);
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
4.5 其他
1. 宜搭附件地址转临时免登地址
- 接口:/yida/file/getOpenUrl.json
- 参数:
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
| systemToken | 应用秘钥 | 是 | hexxxx | 日常统一为hello1234。 线上在应用数据中获取。 |
| userId | 登录人的工号 | 是 | | |
| language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | fileUrl | 宜搭附件地址 | 是 | https://yida.alibaba-inc.com/fileHandle?appType=APP_VN7I6HVKUTXES7XX4OI8&fileName=2a4103a6-44d5-4114-990d-4147a2d53811.xlsx&instId=&type=download | | | timeout | 临时地址多久失效,单位毫秒 | 是 | 60000 | 60000表示一分钟后临时地址失效 |
- 返回字段说明:
- result: 免登的附件地址
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"result": "免登的附件地址",
"success": true
}
2. 发表评论/反馈
- 接口:/yida/remark/save.json
- 参数:
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
| systemToken | 应用秘钥 | 是 | hello123 | |
| userId | 评论人工号 | 是 | | |
| language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | formUuid | 表单Id | 否 | FORM-XXX | | | formInstId | 实例ID | 是 | FINST-XXX | | | replyId | 指定回复评论的id | 否 | 12 | 对评论进行回复 | | atUserId | 将评论内容通过钉钉发给指定用户 | 否 | “123”,”234” | 多个工号之间用英文逗号分隔 | | content | 评论的文本内容 | 是 | 测试评论文本内容 | | | images | 图片 | 否 | [{“extName”:”png”,”fileName”:”宜搭 头像.png”,”width”:””,”height”:””,”imageUrl”:”https://yida.alibaba-inc.com/fileHandle?appType=APP_VA86G5ZSXWO62NO2JH9D&fileName=2328bf5c-c35f-40a9-9560-351259119dfc.png&instId=&type=open","thumbnail":"https://yida.alibaba-inc.com/fileHandle?appType=APP_VA86G5ZSXWO62NO2JH9D&fileName=2328bf5c-c35f-40a9-9560-351259119dfc.png&instId=&type=open","id":null,"type":"IMG","ownedObjType":""}] | 关键参数imageUrl | | files | 附件 | 否 | [{“extName”:”png”,”fileName”:”宜搭 头像.png”,”downloadUrl”:”https://yida.alibaba-inc.com/fileHandle?appType=APP_VA86G5ZSXWO62NO2JH9D&fileName=ce606b82-a8af-417a-bc34-61aca810caed.png&instId=&type=download","previewUrl":"https://yida.alibaba-inc.com/fileHandle?appType=APP_VA86G5ZSXWO62NO2JH9D&fileName=ce606b82-a8af-417a-bc34-61aca810caed.png&instId=&type=open","type":"OTHER"}] | 关键参数downloadUrl |
- 返回字段说明:
- result:新增评论的ID
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- 返回结果示例:
{
"result":14,
"success":true
}
示例代码:
@Test
public void saveRemark() {
String api = "/yida/remark/save.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_ZDQQR345LVU8LI8JTZ41");
postClient.addParameter("systemToken", "3PQBMA2R510D6N1C1******2S9OR9Y2ZQZ9YLKKJ");
postClient.addParameter("userId", "47072721");
postClient.addParameter("formInstId", "FINST-1KFBK518FKL3OSZD7ZGSBC024ZOUQ2V4DDQVLK4");
// 添加纯文本的评论内容
postClient.addParameter("content", "测试评论文本内容");
// 添加自定义的图片
FileObject fileObject = new FileObject();
fileObject.setExtName("pdf");
fileObject.setFileName("发起的普通流程1_1616509077397.pdf");
fileObject.setType("OTHER");
fileObject.setDownloadUrl("https://yida.gov.alibaba-inc.com/fileHandle?appType=APP_ZDQQR345LVU8LI8JTZ41&fileName=8ba6c5d4-5719-42d4-b57b-03136fe0a3b9.pdf&instId=&type=download");
fileObject.setPreviewUrl("https://yida.gov.alibaba-inc.com/buc/web/APP_ZDQQR345LVU8LI8JTZ41/inst/preview?appType=APP_ZDQQR345LVU8LI8JTZ41&fileName=%E4%BF%AE%E4%BF%8A%E5%8F%91%E8%B5%B7%E7%9A%84%E6%99%AE%E9%80%9A%E6%B5%81%E7%A8%8B1_1616509077397.pdf&fileSize=1662814&downloadUrl=8ba6c5d4-5719-42d4-b57b-03136fe0a3b9.pdf");
List<FileObject> fileList = Arrays.asList(fileObject);
ImageObject imageObject = new ImageObject();
imageObject.setExtName("png");
imageObject.setFileName("宜搭 头像(二期).png");
imageObject.setType("IMG");
imageObject.setImageUrl("https://img.alicdn.com/imgextra/i1/O1CN01IG50k41fDDpgzCaDb_!!6000000003972-73-tps-64-64.ico");
imageObject.setThumbnail("https://img.alicdn.com/imgextra/i1/O1CN01IG50k41fDDpgzCaDb_!!6000000003972-73-tps-64-64.ico");
List<ImageObject> imageList = Arrays.asList(imageObject);
postClient.addParameter("files", JSON.toJSONString(fileList));
postClient.addParameter("images", JSON.toJSONString(imageList));
String apiResult = postClient.post();
JSONObject result = JSON.parseObject(apiResult);
}
特别说明:
查询实例下的评论列表,可以看到一条新增的评论,内容包含有文本、图片和附件。
3. 查询评论列表
- 接口:/yida/remark/list.json
参数: | 参数名 | 描述 | 是否必填 | 示例 | 备注 | | —- | —- | —- | —- | —- | | appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | | | systemToken | 应用秘钥 | 是 | hexxxx | | | userId | 员工工号 | 是 | | 可以传公共账号yida_pub_account或者拥有页面数据访问权限的人员的userid | | language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | formInstId | 要查询的表单实例ID | 是 | FINST-NJYJZELVVYZRVGJHR7M6FJW3ESJN1P1TCNPCJ9 | |返回字段说明:
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- content:评论列表
- creator:创建人
- images:图片
- formInstId:表单实例ID
- files:附件
- id:实体id,主键
- gmtCreate:创建时间
- atUserId:被AT的用户ID
- content:评论内容
返回结果示例:
{
"success": true,
"content": [{
"creator": "47072721",
"images": "[]",
"formInstId": "FINST-Y7OESFAM711IYI5JMS5QPGT4NGV6V12FY4OWKEK0",
"files": "[]",
"id": 100073,
"gmtCreate": "2020-09-15 09:07:09",
"atUserId": "",
"content": "评论1"
}, {
"creator": "47072721",
"images": "[]",
"formInstId": "FINST-Y7OESF***11IYI5JMS5QPGT4NGV6V12FY4OWKEK0",
"files": "[]",
"id": 100074,
"gmtCreate": "2020-09-15 09:07:14",
"atUserId": "",
"content": "评论2"
}, {
"creator": "47072721",
"images": "",
"replyUserId": "47072721",
"formInstId": "FINST-Y7OESF***11IYI5JMS5QPGT4NGV6V12FY4OWKEK0",
"replyId": 100074,
"files": "",
"id": 100075,
"gmtCreate": "2020-09-15 09:07:20",
"atUserId": "",
"content": "评论3"
}, {
"creator": "47072721",
"images": "",
"replyUserId": "47072721",
"formInstId": "FINST-Y7OESF***11IYI5JMS5QPGT4NGV6V12FY4OWKEK0",
"replyId": 100073,
"files": "",
"id": 100076,
"gmtCreate": "2020-09-15 09:07:27",
"atUserId": "",
"content": "评论4"
}, {
"creator": "47072721",
"images": "",
"replyUserId": "47072721",
"formInstId": "FINST-Y7OESF***11IYI5JMS5QPGT4NGV6V12FY4OWKEK0",
"replyId": 100076,
"files": "",
"id": 100077,
"gmtCreate": "2020-09-15 09:07:37",
"atUserId": "",
"content": "评论5"
}]
}
页面查询结果示例:
接口使用示例代码:
@Test
public void getRemarkList() {
String api = "/yida/remark/list.json";
PostClient postClient = ExecutableClient.getInstance().newPostClient(api);
postClient.addParameter("appType", "APP_XO5***IW5ITX5J4OPS5Y");
postClient.addParameter("systemToken", "I10***F692RINFOHEKWR4OZ0Y053Q3320H2SX9K0");
postClient.addParameter("userId", "yida_pub_account");
postClient.addParameter("formInstId","FINST-Y7OESF***11IYI5JMS5QPGT4NGV6V12FY4OWKEK0");
String apiResult = postClient.post();
Assert.notNull(apiResult);
}
4. 获取应用下所有表单页面的列表
- 接口:/yida/app/listNavigationByFormType.json
- 参数:
| 参数名 | 描述 | 是否必填 | 示例 | 备注 |
| —- | —- | —- | —- | —- |
| appType | 应用ID | 是 | APP_PBKT0MFBEBTDO8T7SLVP | |
| systemToken | 应用秘钥 | 是 | hexxxx | |
| userId | 评论人工号 | 是 | | |
| language | 语言 | 否 | zh_CN | 可选值:zh_CN/en_US
默认:zh_CN | | formType | 页面类型 | 是 | | receipt,单据页面process,流程页面
report,报表页面 |
- 返回字段说明:
- result: 表单页面列表
- formUuid:表单id
- title:中英文标题信息
- processCode:流程编码,只有当formType选择process流程页面时返回结果才有该字段
- success : 请求是否成功。可选值:true:请求成功;false:请求失败
- errorCode : 错误码。仅发生错误时显示。
- errorMsg : 错误信息。仅发生错误时显示。
- result: 表单页面列表
- 返回结果示例:
1、 查询单据页面:
{
"result":[
{
"formUuid":"FORM-LWCG19P4L2IO5GVBTQXIKWZ3NEJ3QV1NVB3A6BKA",
"title":{
"pureEn_US":"简单表单",
"en_US":"简单表单",
"zh_CN":"简单表单",
"type":"i18n"
}
}
],
"success":true
}
2、查询流程页面:
{
"result":[
{
"formUuid":"FORM-LWCG19P4L2Z25GSDGB4YECR5ULKAIC3MC5M4CBKF1",
"processCode":"TPROC--LWCG19P4L2Z25GSDGB4YECR5ULKAIC3TC5M4CBKG1",
"title":{
"pureEn_US":"test流程",
"en_US":"test流程",
"zh_CN":"test流程",
"type":"i18n"
}
},
{
"formUuid":"FORM-00FOFWHSB2V25GL9AB57E9B84YW56M3TDI89CBKB1",
"processCode":"TPROC--00FOFWHSB2V25GL9AB57E9B84YW56M30EI89CBKC1",
"title":{
"pureEn_US":"测试流程",
"en_US":"测试流程",
"zh_CN":"测试流程",
"type":"i18n"
}
}
],
"success":true
}
3、 查询报表页面:
{
"result":[
{
"formUuid":"REPORT-00FOFWHSB2V25GL9AB57E9B84YW56M3P0E4A6BKA",
"title":{
"pureEn_US":"简单报表",
"en_US":"简单报表",
"zh_CN":"简单报表",
"type":"i18n"
}
}
],
"success":true
}
4.3 附录
1. 保存/更新 表单数据格式说明
- 表单中每个组件都有唯一ID,每个组件中填写的数据都有自己的固定格式。目前支持的表单组件有:单行,多行,数字,单选,下拉单选,多选,下拉多选,日期,日期区间,人员搜索框,地区选择,部门选择,级联选择,明细组件。
保存/更新 表单数据时,用Map
的jsonString格式来作为参数传递表单中的数据。key为组件ID,Object为组件的值。每个组件的值格式如下: | 组件类型 | 数据格式 | demo | 备注 | | —- | —- | —- | —- | | 单行输入框 | 字符串 | “danhang” | | | 多行输入框 | 字符串 | “duohang” | | | 数字输入框 | 数字 | 1 | | | 单选 | 字符串 | “选项一” | | | 下拉单选 | 字符串 | “选项一” | | | 多选 | 字符串数组 | [“选项一”,”选项二”] | | | 下拉多选 | 字符串数组 | [“选项一”,”选项二”] | | | 日期组件 | 时间戳 | 1516204800000 | | | 级联日期 | 字符串数组 | [“1514736000000”,”1517328000000”]。
假如只有结束时间,[“”,”1517328000000”] | 第一个为开始时间的时间戳字符串,第二给结束时间的时间戳字符串 | | 人员搜索框 | 字符串数组 | [“086172”,”WB344856”] | | | 城市选择 | 字符串数组 | [“110000”,”110100”,”110101”] | 第一个必须为省份ID,第二个为城市ID,第三个为区ID。 | | 部门选择 | 数字 | 18257 | | | 级联选择 | 字符串数据 | [“part”,”part_b”] | 必须按照级联顺序,依次放到数组中 | | 附件上传控件/图片上传控件 | 字符串数组 | [
{
“downloadUrl”: “文件下载地址”,
“name”: “文件名”,
“previewUrl”: “文件预览地址”,
“url”: “文件下载地址”,
“ext”: “docx”
}
] | 文件附件的ext通常为doc/docx/xls/xlsx/ppt/pptx等
图片附件的ext通常为jpg/png/jpeg/jif等 | | 超链接组件 | 字符串数组 | [
{
“link”: “https://yida.alibaba-inc.com“,
“text”: “宜搭”
}
] | | | 明细 | JSONARRAY | [{“textField_jcr0069m”: “danhang1”},{“textField_jcr0069m”: “danhang2”}]
(textField_jcr0069m为明细下单行的组件ID) | 由于明细下有多条记录,所以用JSONARRAY。由于每条记录都是很多组件的值,因此用JSONObject来存每个组件对应的值 |完整的表单数据格式如下:
{
"textField_jcr0069m": "danhang",
"textareaField_jcr0069n": "duohang",
"numberField_jcr0069o": 1,
"radioField_jcr0069p": "选项一",
"selectField_jcr0069q": "选项一",
"checkboxField_jcr0069r": [
"选项二",
"选项三"
],
"multiSelectField_jcr0069s": [
"选项二",
"选项三"
],
"dateField_jcr0069t": 1516636800000,
"cascadeDate_jcr0069u": [
"1514736000000",
"1517328000000"
],
"employeeField_jcr0069x": [
"119384"
],
"citySelectField_jcr0069y": [
"110000",
"110100",
"110101"
],
"departmentField_jcr0069z": 18257,
"cascadeSelectField_jcr006a0": [
"part",
"part_b"
],
"tableField_jcr006a1": [
{
"cascadeDate_jcr006aa": [
"1514736000000",
"1517328000000"
],
"cascadeSelectField_jcr006ae": [
"product",
"product_a"
],
"checkboxField_jcr006a7": [
"选项一",
"选项二",
"选项三"
],
"citySelectField_jcr006ac": [
"120000",
"120100",
"120102"
],
"dateField_jcr006a9": 1517328000000,
"departmentField_jcr006ad": 18257,
"employeeField_jcr006ab": [
"079349",
"086172"
],
"multiSelectField_jcr006a8": [
"选项一",
"选项二",
"选项三"
],
"hyperlinkField_jy707nfx": [
{
"link": "https://yida.alibaba-inc.com",
"text": "宜搭"
}
],
"numberField_jcr006a4": 2,
"radioField_jcr006a5": "选项二",
"selectField_jcr006a6": "选项三",
"textField_jcr006a2": "明细下单行",
"textareaField_jcr006a3": "明细下多行"
}
]
}
2. 根据组件值进行条件搜索,组件值格式说明
- 表单中每个组件都有唯一ID,每个组件的搜索格式不一样。目前支持搜索的表单组件有:单行,多行,数字,单选,下拉单选,多选,下拉多选,日期,日期区间,人员搜索框,地区选择,部门选择,级联选择,明细组件。
- 搜索时,用Map
格式来表示每个组件的搜索条件。key为组件ID,Object为组件的搜索值。各个组件的搜索类型和值格式如下
组件类型 | 数据格式 | demo | 备注 |
---|---|---|---|
单行输入框 | 字符串 | “danhang” | 模糊搜索 |
多行输入框 | 字符串 | “duohang” | 模糊搜索 |
数字输入框 | 字符串数组 | [“1”,”10”] | 范围搜索。第一个为最小值,第二个为最大值 |
单选 | 字符串 | “选项二” | 精确搜索 |
下拉单选 | 字符串 | “选项二” | 精确搜索 |
多选 | 字符串数组 | [“选项二”] | 数组搜索。 搜索值必须是多选值的子集 |
下拉多选 | 字符串数组 | [“选项二”] | 数组搜索。 搜索值必须是多选值的子集 |
日期组件 | 字符串数组 | [“1514736000000”,”1517414399000”] | 范围搜索。第一个为日期开始的时间戳,第二个为日期结束的时间戳。 |
日期区间 | 数组 | [[“1514736000000”,”1517414399000”],[“1514736000000”,”1517414399000”]] | 范围搜索。第一个数组是日期区间开始的搜索范围。第二个数组是日期区间结束的搜索范围。 |
人员搜索框 | 字符串数组 | [“086172”,”WB344856”] | 精确匹配。值必须完全匹配,工号顺序也需要一致。 |
城市选择 | 字符串数组 | [“110000”,”110100”,”110101”] | 数组搜索。 搜索值必须是城市值的子集。 另外,有市ID,就必须有省ID。有区ID,就必须有省ID和市ID。 |
部门选择 | 数字 | 18257 | 精确匹配 |
级联选择 | 字符串数组 | [“part”,”part_b”] | 数组搜索。和城市选择限制条件一致。 |
明细组件 | 字符串 | danhang | 模糊搜索。 明细下的值为一个大text,搜索用模糊搜索。 |
- 完整例子
{
"textField_jcr0069m": "danhang",
"textareaField_jcr0069n": "duohang",
"numberField_jcr0069o": [
"1",
"10"
],
"radioField_jcr0069p": "选项一",
"selectField_jcr0069q": "选项一",
"checkboxField_jcr0069r": [
"选项二"
],
"multiSelectField_jcr0069s": [
"选项二",
"选项三"
],
"dateField_jcr0069t": [
1514736000000,
1517414399000
],
"cascadeDate_jcr0069u":[
[
1514736000000,
1517414399000
],
[
1514736000000,
1517414399000
]
],
"employeeField_jcr0069x": [
"119384"
],
"citySelectField_jcr0069y": [
"110000",
"110100",
"110101"
],
"departmentField_jcr0069z": 18257,
"cascadeSelectField_jcr006a0": [
"part",
"part_b"
],
"tableField_jcr006a1": "明细数据"
}
3. 流程实例详情对象格式说明
字段 | 描述 | 示例 | 备注 |
---|---|---|---|
actioners | 流程实例当前任务执行人 | [ { “name”: { “en_US”: “user_en_name”, “zh_CN”: “user_zh_name”, “type”: “i18n” }, “userId”: “workno” } ] |
如果流程已完成,没有执行人时,该字段为空 |
processInstanceId | 实例ID | f30233fb-72e1-4af4-8cb8-c7e0ea9ee530 | 唯一 |
formUuid | 流程表单ID | FORM-EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ3 | 请看附录6 |
processCode | 流程Code | TPROC—EF6Y4G8WO2FN0SUB43TDQ3CGC3FMFQ1G9400RCJ4 | 请看附录6 |
title | 实例标题 | xxxx 发起的流程 | 根据你的语言环境,返回对应的标题 |
instanceStatus | 实例状态 | RUNNING | |
approvedResult | 审批结果 | agree | agree -> 同意 disagree -> 拒绝 |
originator | 发起人信息 | [ { “name”: { “en_US”: “user_en_name”, “zh_CN”: “user_zh_name”, “type”: “i18n” }, “userId”: “workno” } ] |
|
data | 表单数据 | 参加附录4- 作为返回值的表单数据的格式说明 |
4. 作为返回值的表单数据的格式说明
作为返回值的表单数据格式和 “附录1-保存/更新 表单数据格式说明”基本一致。区别在于:
- 录入时,地区组件值为[“省份ID”, “市ID”, “区ID”]。作为返回值时,是[“省名称”,”城市名称”,”地区名称”]。
- 单选,下拉单选,多选,下拉多选是有国际化的。返回值时,会根据传的language参数,返回对应的数据值。
5. 单据实例详情对象格式说明
字段 | 描述 | 示例 | 备注 |
---|---|---|---|
gmtModified | 最后修改时间 | 2018-01-24 11:22:01 | |
formUuid | 表单ID | FORM-EF6Y93URN24F1SCX15VA2P918LPEIJ2H3UFORCJ1 | |
formInstId | 实例ID | FINST-EF6Y93URN2F02S745LTMW2D2G4WVDS16O17ISCJ0 | |
originator | 发起人详情 | [ { “name”: { “en_US”: “user_en_name”, “zh_CN”: “user_zh_name”, “type”: “i18n” }, “userId”: “workno” } ] |
|
formData | 表单数据详情 | 参加附录4- 作为返回值的表单数据的格式说明 |
5. 图片对象定义ImageObject
public class ImageObject {
/**
* extName : png
* fileName : 宜搭 头像(二期).png
* width :
* height :
* imageUrl : https://yida.gov.alibaba-inc.com/fileHandle?appType=APP_ZDQQR345LVU8LI8JTZ41&fileName=17430601-c8d2-4c6f-8385-6f84421d28aa.png&instId=&type=open
* thumbnail : https://yida.gov.alibaba-inc.com/fileHandle?appType=APP_ZDQQR345LVU8LI8JTZ41&fileName=17430601-c8d2-4c6f-8385-6f84421d28aa.png&instId=&type=open
* id : null
* type : IMG
* ownedObjType :
*/
private String extName;
private String fileName;
private String width;
private String height;
private String imageUrl;
private String thumbnail;
private Object id;
private String type;
private String ownedObjType;
public String getExtName() {
return extName;
}
public void setExtName(String extName) {
this.extName = extName;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getWidth() {
return width;
}
public void setWidth(String width) {
this.width = width;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getThumbnail() {
return thumbnail;
}
public void setThumbnail(String thumbnail) {
this.thumbnail = thumbnail;
}
public Object getId() {
return id;
}
public void setId(Object id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getOwnedObjType() {
return ownedObjType;
}
public void setOwnedObjType(String ownedObjType) {
this.ownedObjType = ownedObjType;
}
}
6. 文件对象定义FileObject
public class FileObject {
/**
* extName : pdf
* fileName : XX的普通流程1_1616509077397.pdf
* downloadUrl : https://yida.gov.alibaba-inc.com/fileHandle?appType=APP_ZDQQR345LVU8LI8JTZ41&fileName=8ba6c5d4-5719-42d4-b57b-03136fe0a3b9.pdf&instId=&type=download
* previewUrl : https://yida.gov.alibaba-inc.com/buc/web/APP_ZDQQR345LVU8LI8JTZ41/inst/preview?appType=APP_ZDQQR345LVU8LI8JTZ41&fileName=%E4%BF%AE%E4%BF%8A%E5%8F%91%E8%B5%B7%E7%9A%84%E6%99%AE%E9%80%9A%E6%B5%81%E7%A8%8B1_1616509077397.pdf&fileSize=1662814&downloadUrl=8ba6c5d4-5719-42d4-b57b-03136fe0a3b9.pdf
* type : OTHER
*/
private String extName;
private String fileName;
private String downloadUrl;
private String previewUrl;
private String type;
public String getExtName() {
return extName;
}
public void setExtName(String extName) {
this.extName = extName;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getDownloadUrl() {
return downloadUrl;
}
public void setDownloadUrl(String downloadUrl) {
this.downloadUrl = downloadUrl;
}
public String getPreviewUrl() {
return previewUrl;
}
public void setPreviewUrl(String previewUrl) {
this.previewUrl = previewUrl;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
五、常见问题
- 本文提供的是java语言使用的Demo,其他语言go/php等语言可以参考网关团队提供的官方文档。
- 依赖包下载不到、专有云没有账号等问题请联系宜搭值班同学 钉钉搜索“宜搭答疑”,钉钉手机号15267012946。
- 接口调用产生如下的报错
【原因分析】sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
网关服务的https证书配置存在问题。
【解决方案】
一方面可以将 xxpt.gateway.protocal=https 修改为xxpt.gateway.protocal=http 临时解决这个问题,
另一方面,向官方值班人员报错,建议官方尽快修复这个https证书的问题。