# 审批实例表单控件参数
> 说明:本文尽量保留上游参数文档的原始结构与示例,用于回答“控件 `value` 长什么样”。
> 当前 `lark-cli` 的推荐取值口径以 [`lark-approval-instance-value-sourcing.md`](./lark-approval-instance-value-sourcing.md) 为准;如果两份文档在“值从哪里拿”上存在差异,以后者为准。
在调用创建审批实例接口时需要使用表单控件参数,你可以通过本文了解审批实例内各表单控件的参数说明。
## 准备工作
审批实例的表单控件参数依据审批定义表单来配置,例如,审批定义的表单设计包括了 **单行文本** 和 **日期区间** 控件,则审批实例的表单控件参数就需要为 **单行文本** 和 **日期区间** 控件进行赋值。因此,在操作审批实例表单的控件参数前,应先通过审批定义详情确认表单控件结构。
## 审批实例 API 不支持的控件
创建审批实例 API 未完全支持所有的审批表单控件,不支持的控件如下表所示。如果你必须使用 API 不支持的控件,则不能仅通过当前 API 完成提单。
**控件/控件组** | **Type** |
| ---------- | --------------------------- |
| 说明 | text |
| 引用多维表格 | mutableGroup |
| 收款账户 | account |
| 流水号 | serialNumber |
| 出差控件组 | tripGroup |
| 录用控件组 | apaascorehrOnboardingGroup |
| 转正控件组 | apaascorehrRegularateGroup |
| 补卡控件组 | remedyGroupV2 |
| 调岗控件组 | apaascorehrJobAdjustGroup |
| 离职控件组 | apaascorehrOffboardingGroup
## 通用参数
审批实例的表单控件均包含的参数如下表所示。
参数 | 类型 | 是否必填 | 描述
---|---|---|---
id | string | 是 | 控件的 ID,需要与审批定义中的控件 ID 保持一致。
type | string | 是 | 控件类型。各控件类型取值参见下文 **不同控件的参数** 章节。
value | 不同控件的类型不同 | 是 | 控件的取值。不同控件 value 数据类型也不同,例如单行文本控件的 value 为字符串、联系人的 value 为数组。详情参见下文 **不同控件的参数** 章节。
## 不同控件的参数
本章节提供不同控件的 type 参数值、JSON 示例以及非通用参数说明。
### 单行文本
控件 type 为 input,JSON 数据示例:
```json
{
"id": "widget1",
"type": "input",
"value": "data" // string 类型
}
```
### 多行文本
控件 type 为 textarea,JSON 数据示例:
```json
{
"id": "widget1",
"type": "textarea",
"value": "data" // string 类型
}
```
### 日期
控件 type 为 date,JSON 数据示例:
```json
{
"id": "widget1",
"type": "date",
"value": "2019-10-01T08:12:01+08:00" // 需满足 RFC3339 格式的 string 类型
}
```
### 日期区间
控件 type 为 dateInterval,JSON 数据示例:
```json
{
"id": "widget1",
"type": "dateInterval",
"value": {
"start":"2019-10-01T08:12:01+08:00",
"end":"2019-10-02T08:12:01+08:00",
"interval": 1.0
}
}
```
value 参数为 object 类型,包含参数说明:
参数 | 类型 | 是否必填 | 描述
---|---|---|---
start | string | 是 | 开始时间,需满足 RFC3339 格式。
end | string | 是 | 结束时间,需满足 RFC3339 格式。
interval | float | 是 | 时长(天)。
### 单选
控件 type 为 radio/radioV2,JSON 数据示例:
```json
{
"id": "widget1",
"type": "radioV2",
"value": "k2b8mkx0-h71x5gl1234-1" // string 类型
}
```
其中, value 表示选项值,取值范围需要参考相应审批定义中 **单选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数,获取单选控件 option 的 value 取值。如果控件关联了外部选项,则 value 需要传入外部选项的 `options.id`。
### 多选
控件 type 为 checkbox/checkboxV2,JSON数据示例:
```json
{
"id":"widget1",
"type":"checkboxV2",
"value": ["k2b8mkx0-h71x5gl4321-1"] // string 类型的数组
}
```
其中, value 表示选项值,取值范围需要参考相应审批定义中 **多选** 控件 option 的 value 参数。你可以通过审批定义详情返回的 `form` 参数,获取多选控件 option 的 value 取值。如果控件关联了外部选项,则 value 需要传入外部选项的 `options.id`。
### 数字
控件 type 为 number,JSON 数据示例:
```json
{
"id": "widget1",
"type": "number",
"value": 1234.5678 // float 类型
}
```
### 金额
控件 type 为 amount,JSON 数据示例:
```json
{
"id": "widget1",
"type": "amount",
"value": 1234.5678, // float 类型
"currency":"USD"
}
```
其中,currency 表示货币种类,取值范围需要参考相应审批定义中 **金额** 控件的 value 参数。你可以通过审批定义详情返回的 `form` 参数,获取金额控件可设置的货币种类。
### 计算公式
控件 type 为 formula,JSON 数据示例:
```json
{
"id": "widget1",
"type": "formula",
"value": 1234.5678 // 该值由审批定义内配置的公式计算出取值,若不匹配则返回报错。
}
```
### 联系人
控件 type 为 contact,JSON 数据示例:
```json
{
"id":"widget1",
"type":"contact",
"value": ["f8ca557e"], // string 类型的数组
"open_ids": ["ou_12345"] // string 类型的数组
}
```
其中,value 包含的是用户 `user_id`;open_ids 包含的是用户 `open_id`。
### 关联审批
控件 type 为 connect,JSON 数据示例:
```json
{
"id":"widget1",
"type":"connect",
"value": ["19EAC829-F1CB-527F-BE2A-1330422E60C0"] // string 类型的数组
}
```
其中,value 包含的是被关联的审批实例 Code,你可以通过审批实例详情能力根据实例 Code 获取实例详情。
### 文档控件
控件 type 为 document,JSON 数据示例:
```json
{
"id": "widget1",
"type": "document",
"value": {
"token":"TLLKdcpDro9ijQxA33ycNMabcef",
"type":"docx",
}
}
```
value 参数为 object 类型,包含参数说明:
参数 | 类型 | 是否必填 | 描述
---|---|---|---
token | string | 是 | 文档的 document_id。
type | string | 是 | 文档类型,支持 `docx`。
### 附件
控件 type 为 attachmentV2,JSON 数据示例:
```json
{
"id":"widget1",
"type":"attachmentV2",
"value": ["D93653C3-2609-4EE0-8041-61DC1D84F0B5"] // string 类型的数组
}
```
其中,value 包含的是上传文件后返回的文件 code。
### 图片
控件 type 为 image/imageV2,JSON 数据示例:
```json
{
"id":"widget1",
"type":"image",
"value": ["D93653C3-2609-4EE0-8041-61DC1D84F0B5"] // string 类型的数组
}
```
其中,value 包含的是上传文件后返回的文件 code。
### 明细/表格
控件 type 为 fieldList,JSON 格式示例:
```json
{
"id": "widget1",
"type": "fieldList",
"value": [
[
{
"id": "widget1",
"type": "checkbox",
"value": ["jxpsebqp-0"]
}
]
]
}
```
其中 value 是二维数组,根据审批定义内 **明细/表格** 控件所包含的控件,依次设置控件 JSON 值。
### 部门
控件 type 为 department,JSON 数据示例:
```json
{
"id":"widget1",
"type":"department",
"value":[
{
"open_id": "od-xxx"
}
]
}
```
其中 value 为对象数组,通过 open_id 设置部门的 open_department_id。
### 电话
控件 type 为 telephone,JSON 数据示例:
```json
{
"id":"widget1",
"type":"telephone",
"value": {
"countryCode":"+86",
"nationalNumber":"13122222222"
}
}
```
value 参数为 object 类型,包含参数说明:
参数 | 类型 | 是否必填 | 描述
---|---|---|---
countryCode | string | 是 | 区号。
nationalNumber | string | 是 | 电话号。
### 地址
控件 type 为 address,JSON 数据示例:
```json
{
"id": "widget1",
"type": "address",
"value": [{
"id": "290557",
"detailAddress": "详细的地址"
}]
}
```
value 参数为 []object 类型,参数说明如下:
参数 | 类型 | 是否必填 | 描述
---|---|---|---
value | []object | 是 | 非出差控件组场景地址控件仅支持单个地址,传入多个时默认只取第一个
└ id | string | 是 | 区域ID, 可通过审批的地理库接口获取
└ detailAddress | string | 否 | 详细的地址,若表单配置中未开启填写详细地址,则会忽略该参数,即使传入也不会生效
### 换班控件组
控件 type 为 shiftGroup,JSON 数据示例:
```json
{
"id": "widget1",
"type": "shiftGroup",
"value": {
"shiftTime": "2019-10-01T08:12:01+08:00",
"returnTime": "2019-10-02T08:12:01+08:00",
"reason": "ask for leave"
}
}
```
value 参数为 object 类型,包含参数说明:
参数 | 类型 | 是否必填 | 描述
---|---|---|---
shiftTime | string | 是 | 换班时间,需满足 RFC3339 格式。
returnTime | string | 是 | 对调日期,需满足 RFC3339 格式。
reason | string | 是 | 换班原因。
### 请假控件组
**请假控件组请求示例**
```json
{
"id": "widgetLeaveGroupV2",
"type": "leaveGroupV2",
"value": [
{
"id": "widgetLeaveGroupType",
"type": "radioV2",
"value": "7488925543484620819"
},
{
"id": "widgetLeaveGroupStartTime",
"type": "date",
"value": "2025-08-25T11:30:00+08:00"
},
{
"id": "widgetLeaveGroupEndTime",
"type": "date",
"value": "2025-08-26T11:35:00+08:00"
},
{
"id": "widgetLeaveGroupReason",
"type": "textarea",
"value": "123123"
},
{
"id": "widgetLeaveCertification",
"type": "image",
"value": [
"B69F8E26-0EAA-4A92-9B80-DA613CD36136"
]
},
{
"id":"widgetLeaveCertification",
"type":"image",
"value": ["D93653C3-2609-4EE0-8041-61DC1D84F0B5"]
},
{
"id": "widgetLeaveGroupFeedingArrivingLate",
"type": "radioV2",
"value": "30"
},
{
"id": "widgetLeaveGroupFeedingOffLeaveEarly",
"type": "radioV2",
"value": "30"
}
]
}
```
**请假控件组包含参数说明:**
id | 类型 | JSON示例 | 描述
---|---|---|---
id | string | 是 | 控件组ID,固定为widgetLeaveGroupV2
type | string | 是 | 控件组类型,固定为leaveGroupV2
value | object[] | 是 | 控件组的值,值为多个子控件值的列表
value中包含的子控件值说明:
id | 类型 | JSON示例 | 描述
---|---|---|---
widgetLeaveGroupType | radioV2 | ```
{
"id": "widgetLeaveGroupType",
"type": "radioV2",
"value": "7488925543484620819"
}
``` | 假期类型,具体格式可参考单选控件,选项由假勤接口获取,提单时必须包含该控件
widgetLeaveGroupStartTime | date | ```
{
"id": "widgetLeaveGroupStartTime",
"type": "date",
"value": "2019-10-01T08:12:01+08:00", // 需满足 RFC3339 格式的 string 类型
}
``` | 请假开始时间,具体格式可参考日期控件,会根据假期类型自动取整,其中半天假小于12点则认为是上午,小时假则以半小时为粒度向前取整, 提单时必须包含该控件
widgetLeaveGroupEndTime | date | ```
{
"id": "widgetLeaveGroupEndTime",
"type": "date",
"value": "2019-10-01T08:12:01+08:00", // 需满足 RFC3339 格式的 string 类型
}
``` | 请假结束时间,具体格式可参考日期控件,会根据假期类型自动取整,其中半天假小于12点则认为是上午,小时假则以半小时为粒度向后取整
widgetLeaveGroupReason | textarea | ```
{
"id": "widgetLeaveGroupReason",
"type": "textarea",
"value": "123123"
}
``` | 请假事由,具体格式可参考多行文本控件,哺乳假无需填写,其他情况则根据控件组配置中该控件是否可见以及必填判断
widgetLeaveCertification | image | ```
{
"id":"widgetLeaveCertification",
"type":"image",
"value": ["D93653C3-2609-4EE0-8041-61DC1D84F0B5"]
}
``` | 请假证明,具体格式可参考图片控件,如果所选假期类型配置要求补充证明则必须传递该值,缺失会报错
widgetLeaveGroupFeedingArrivingLate | radioV2 | ```
{
"id": "widgetLeaveGroupFeedingArrivingLate",
"type": "radioV2",
"value": "30"
}
``` | 上班晚到的分钟数,具体格式可参考单选控件,仅哺乳假需要填写,取值范围是0-120分钟,粒度是15分钟,选项从审批定义中该控件的option中获取
widgetLeaveGroupFeedingOffLeaveEarly | radioV2 | ```
{
"id": "widgetLeaveGroupFeedingOffLeaveEarly",
"type": "radioV2",
"value": "30"
}
``` | 下班早走的分钟数,具体格式可参考单选控件,仅哺乳假需要填写,取值范围是0-120分钟,粒度是15分钟,选项即是分钟对应的字符串
**特殊的参数校验报错信息**
message | 说明 |
| -------------------------------------------------- | ---------------------------- |
| leave type id parse error | 请假类型不是int64 |
| group value is invalid | 当前控件组的值无效,请校验是否为空或者校验类型是否为数组 |
| start time format is not RFC3339 | 开始时间日期格式非*RFC3339格式* |
| end time format is not RFC3339 | 结束时间日期格式非*RFC3339格式* |
| start time is after end time | 开始时间晚于结束时间 |
| user not in gray | 申请用户不在假勤灰度内 |
| leave type not found | 请假类型不存在 |
| reason is required | 请假原因未填写 |
| leave quote should be bigger than 0 | 请假时长需要大于0 |
| leave is conflict | 所选时间内已有请假记录,请选择其他时间 |
| balance is not enough | 当前假期类型下假期余额不足 |
| certification is required | 需要上传请假证明 |
| arriving late is required | 哺乳假需要填写上班晚到时长 |
| arriving late value is not in the optional items | 晚到时间不在可选范围内 |
| leaving early is required | 哺乳假需要填写下班提前时长 |
| leaving early value is not in the optional items | 下班提前时间不在可选范围内 |
| feeding rest daily is 0 | 哺乳假每日休息时长为0,请重新选择 |
| the operation is prohibited by the workforce rules | 当前账户已在假勤侧封账,无法提交
### 加班控件组
**加班控件组请求示例**
```json
{
"id": "widgetWorkGroup",
"type": "workGroup",
"value":[
{
"id":"widgetWorkGroupOvertimeWorkers",
"type":"contact",
"value": ["f8ca557e"],
"open_ids": ["ou_12345"]
},
{
"id": "widgetWorkGroupType",
"type": "radioV2",
"value": "7259635026038505475"
},
{
"id":"widgetWorkGroupTimeRangeFieldList",
"type":"fieldList",
"value":[
[
{
"id":"widgetWorkGroupStartTime",
"type":"date",
"value":"2019-10-01T08:12:01+08:00"
},
{
"id":"widgetWorkGroupEndTime",
"type":"date",
"value":"2019-10-01T08:12:01+08:00"
}
]
]
},
{
"id": "widgetWorkGroupReason",
"type": "textarea",
"value": "111"
}
]
}
```
**加班控件组参数说明:**
参数 | 类型 | 是否必填 | 描述
---|---|---|---
id | string | 是 | 控件组ID,固定为widgetWorkGroup
type | string | 是 | 控件组类型,固定为workGroup
value | object[] | 是 | 控件组的值,值为多个子控件值的列表
value中包含的子控件值说明:
id | 类型 | JSON示例 | 描述
---|---|---|---
widgetWorkGroupOvertimeWorkers | contact | ```
{
"id":"widgetWorkGroupOvertimeWorkers",
"type":"contact",
"value": ["f8ca557e"],
"open_ids": ["ou_12345"]
}
``` | 加班人员列表,具体格式可参考联系人控件,如果定义中配置「允许代多人提交」则该字段必填,如果是提交人给自己提交需填写提交人的ID
widgetWorkGroupType | radioV2 | ```
{
"id": "widgetWorkGroupType",
"type": "radioV2",
"value": "7259635026038505475" // 对应的类型选项ID
}
``` | 加班类型,具体格式可参考单选控件,如果定义中关闭「关联加班规则」则需要填写该字段
widgetWorkGroupTimeRangeFieldList | fieldList | ```
{
"id":"widgetWorkGroupTimeRangeFieldList",
"type":"fieldList",
"value":[
[
{
"id":"widgetWorkGroupStartTime",
"type":"date",
"value":"2019-10-01T08:12:01+08:00"
},
{
"id":"widgetWorkGroupEndTime",
"type":"date",
"value":"2019-10-01T08:12:01+08:00"
}
]
]
}
``` | 加班时段,具体格式可参考明细控件,如果定义中打开「允许提交多个加班时段」则可以传多个,最多支持30个,否则只会取第一个,单次加班时长不可超过两天
widgetWorkGroupReason | textarea | ```
{
"id": "widgetWorkGroupReason",
"type": "textarea",
"value": "111"
}
``` | 加班事由,如果定义中配置了「加班事由」必填,则必须填写该字段
**特殊的参数校验报错信息**
message | 说明 |
| ---------------------------------------------------------------------------------- | ---------------------------- |
| the time range list has more than 30 items | 加班时段数量超过30 |
| group value is invalid | 当前控件组的值无效,请校验是否为空或者校验类型是否为数组 |
| overtime type is required | 未关联加班规则时,加班类型必填 |
| work time range is required | 至少需要一个加班时段 |
| start time is after end time | 开始时间晚于结束时间 |
| start time or end time of range is required | 加班时间段的开始时间和结束时间必填 |
| overtime duration is over 2 days | 单次加班时长不可超过两天 |
| overtime date time zone not support | 加班时段的日期时区信息无法识别 |
| {date} can not apply overtime | 所选时间不可申请加班 |
| {date} already apply overtime | 所选时间已经有加班记录 |
| {date} no need approval | 所选日期加班无需申请 |
| apply reason is required | 定义中设置了加班事由为必填,不可为空 |
| {users} user follow different overtime rules, cannot be submitted in the same form | 所选加班人不在同一个考勤组内,无法同时提交加班 |
| invalid overtime work application | 没有有效的加班申请,请重新选择加班日期 |
| the overtime duration cannot be 0 | 加班时长不能是0 |
| the number of apply workers cannot exceed 50 | 单次申请加班人数量不可大于50 |
| apply worker is required | 必须有加班人,配置置可代多人提交时必须指定加班人 |
| resigned worker can not apply | 离职人员不可申请加班 |
| overtime duration is over limit | 加班时长超过限制
### 外出控件组
**外出控件组请求体示例**
```json
{
"id": "widgetOutGroup",
"type": "outGroup",
"value":[
{
"id": "widgetOutGroupType",
"type": "radioV2",
"value": "me15yqrf-gmjgbml2vhp-0"
},
{
"id": "widgetOutGroupStartTime",
"type": "date",
"value":"2019-10-01T08:12:01+08:00"
},
{
"id": "widgetOutGroupEndTime",
"type": "date",
"value":"2019-10-01T08:12:01+08:00"
},
{
"id": "widgetOutGroupReason",
"type": "textarea",
"value":"123213"
},
{
"id":"widgetOutGroupImage",
"type":"image",
"value": ["D93653C3-2609-4EE0-8041-61DC1D84F0B5"]
}
]
}
```
**外出控件参数说明**
参数 | 类型 | 是否必填 | 描述
---|---|---|---
id | string | 是 | 控件组ID,固定为widgetOutGroup
type | string | 是 | 控件组Type,固定为outGroup
value | object[] | 是 | 控件组的值,值为多个子控件值的列表
value中包含的子控件值说明:
id | 类型 | JSON示例 | 描述
---|---|---|---
widgetOutGroupType | radioV2 | ```
{
"id": "widgetOutGroupType",
"type": "radioV2",
"value": "me15yqrf-gmjgbml2vhp-0"
}
``` | 外出类型,具体格式可参考单选控件,如果配置了「外出类型」则必填,外出时长单位会选取所选外出类型关联的单位,如果没有配置「外出类型」,则该字段无需填写,计算外出时长时会选取「外出时长」配置的单位
widgetOutGroupStartTime | date | ```
{
"id": "widgetOutGroupStartTime",
"type": "date",
"value":"2019-10-01T08:12:01+08:00"
}
``` | 外出开始时间,具体格式可参考日期控件,如果外出时长单位是半天假,则小于12点则认为是上午,否则认为是下午;如果单位是小时,则会按半小时的粒度向前取整
widgetOutGroupEndTime | date | ```
{
"id": "widgetOutGroupEndTime",
"type": "date",
"value":"2019-10-01T08:12:01+08:00"
}
``` | 外出结束时间,具体格式可参考日期控件,如果外出时长单位是半天假,则小于12点则认为是上午,否则认为是下午;如果单位是小时,则会按半小时的粒度向后取整
widgetOutGroupReason | textarea | ```
{
"id": "widgetOutGroupReason",
"type": "textarea",
"value":"123213"
}
``` | 外出事由,具体格式可参考多行文本控件,如果定义中「外出事由」必填,则必须填写该控件,如果定义配置无需填写,则无需填写该控件
widgetOutGroupImage | image | ```
{
"id":"widgetOutGroupImage",
"type":"image",
"value": ["D93653C3-2609-4EE0-8041-61DC1D84F0B5"]
}
``` | 外出证明,具体格式可参考图片控件,如果定义中「外出拍照」必填,则必须填写该控件,如果定义配置无需填写,则无需填写该控件
**特殊的参数校验报错信息**
message | 说明 |
| ----------------------------------------------------- | ---------------------------- |
| group value is invalid | 当前控件组的值无效,请校验是否为空或者校验类型是否为数组 |
| start time format is not RFC3339 | 开始时间日期格式非*RFC3339格式* |
| end time format is not RFC3339 | 结束时间日期格式非*RFC3339格式* |
| start time and end time must be in the same time zone | 开始时间与结束时间必须是同一时区 |
| out type is required | 如果定义中设定了「外出类型」,则外出类型必填 |
| out start time is required | 外出开始时间必填 |
| out end time is required | 外出结束时间必填 |
| out duration must be greater than 0 | 外出间隔不能为0,请检查起止时间并重新选择 |
| out reason is empty | 如果定义中勾选「外出事由」同时设定必填,则该字段必填 |
| photo is required | 如果定义中勾选「外出拍照」同时设定必填,则该字段必填 |
| out time is conflict | 外出时间有冲突,请确认是否已在该时段申请外出