diff --git "a/\350\241\250\345\215\225\346\220\255\345\273\272/16-\345\205\263\350\201\224\346\216\245\345\217\243\346\226\207\346\241\243.md" "b/\350\241\250\345\215\225\346\220\255\345\273\272/16-\345\205\263\350\201\224\346\216\245\345\217\243\346\226\207\346\241\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..1470cbc0ae998e019753c2a714949f389f2eb4e5 --- /dev/null +++ "b/\350\241\250\345\215\225\346\220\255\345\273\272/16-\345\205\263\350\201\224\346\216\245\345\217\243\346\226\207\346\241\243.md" @@ -0,0 +1,1667 @@ +# E10 e-Builder表单 - 数据关联接口文档 + +> 数据关联功能允许在表单中配置关联关系,将多个表单的数据进行关联展示和操作,支持关联分组管理、高级设置、权限控制等。 + +--- + +## 接口目录 + +| 序号 | 接口名称 | 请求方式 | 接口路径 | 功能说明 | +|------|----------|----------|----------|----------| +| 1 | 获取表单数据关联列表 | GET | /getListByObjId | 获取表单上设置的所有数据关联配置 | +| 2 | 卡片详情页面获取关联 | GET | /getListByPageId | 卡片详情界面调用,返回关联选项卡数据结构 | +| 3 | 初始化关联页面 | GET | /initAssociationPage | 初始化关联页面,返回页面ID | +| 4 | 同步关联页面 | GET | /syncAssociationPage | 同步关联页面配置 | +| 5 | 获取高级设置 | GET | /getAdvancedSet | 获取关联的高级设置信息 | +| 6 | 更新高级设置 | POST | /updateAdvancedSet | 更新关联的高级设置 | +| 7 | 通过ID获取关联信息 | GET | /getDataAssociationById/{id} | 通过关联ID获取单个关联详细信息 | +| 8 | 保存或更新关联 | POST | /saveOrUpdate | 新建或更新数据关联配置 | +| 9 | 开启/关闭关联 | POST | /updateIsOpenById | 通过关联ID开启或关闭关联 | +| 10 | 更新排序 | GET | /updateOrder | 更新关联的显示排序 | +| 11 | 更新排序V2 | POST | /updateOrderV2 | 批量更新关联排序(支持dataId) | +| 12 | 删除关联 | POST | /deleteById | 通过关联ID删除指定关联 | +| 13 | 获取表单字段 | GET | /getObjFieldEntities/{objId} | 通过eb表单id获取表单字段列表 | +| 14 | 通过ListId获取表单字段 | GET | /getObjFieldByListId/{ListId} | 通过列表ID获取表单字段 | +| 15 | 校验是否存在关联 | GET | /verifyExistAssociation/{objId} | 校验表单是否存在默认开启的关联 | +| 16 | 获取关联分组列表 | GET | /getAssociationGroupList/{objId} | 获取表单的关联分组列表 | +| 17 | 保存分组 | POST | /save | 综合接口:新增/更新/删除关联分组 | +| 18 | 保存或更新基本配置 | POST | /saveOrUpdateBaseConfig | 保存或更新关联的基本配置 | +| 19 | 获取基本配置 | GET | /getBaseConfig | 获取关联的基本配置 | +| 20 | 获取前台关联权限 | GET | /getFrontAssPermission | 获取前台关联权限设置 | +| 21 | 保存前台关联权限 | POST | /saveFrontAssPermission | 保存前台关联权限设置 | +| 22 | 检查前台权限 | GET | /checkFrontPermission | 检查前台关联权限 | + +--- + +## 通用信息 + +| 项目 | 值 | +|------|-----| +| **基础路径** | `/api/bs/ebuilder/form/association` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **Content-Type** | `application/json` | + +--- + +## 请求头 + +``` +Cookie: ETEAMSID=<登录凭证> +``` + +--- + +## 接口详情 + +### 1. 获取表单数据关联列表 + +> 获取指定表单上设置的所有数据关联配置,包含关联列表、虚拟表单信息、基本配置、冲突配置检查等。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getListByObjId` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | +| pageName | String | 否 | 关联名称,用于筛选特定的关联 | +| apid | String | 否 | 应用ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "datas": [ + { + "id": "123", + "objId": "456", + "pageName": "关联名称", + "open": true, + "selected": false, + "showLayout": "0,2", + "order": 1, + "defaultAss": false, + "confirm": 0, + "associationPermissions": [], + "customTips": {"tipsSql": ""} + } + ], + "vformInfo": {}, + "total": 1, + "associationBaseConfig": { + "id": "789", + "objId": "456", + "showAssociationSetting": 1, + "associationSettingStyle": {}, + "associationPageId": "101", + "advancedSetting": 0 + }, + "existConflictConfig": 0 + } +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data.datas | Array | 当前页面的关联配置列表 | +| data.datas[].id | String | 关联ID | +| data.datas[].objId | String | eb表单id | +| data.datas[].pageName | String | 关联名称 | +| data.datas[].open | Boolean | 是否开启 | +| data.datas[].selected | Boolean | 是否默认选中 | +| data.datas[].showLayout | String | 显示布局,如"0,2" | +| data.datas[].order | Integer | 排序 | +| data.datas[].associationPermissions | Array | 关联权限列表 | +| data.vformInfo | Object | 虚拟表单信息 | +| data.total | Integer | 关联总数 | +| data.associationBaseConfig | Object | 关联基本配置 | +| data.existConflictConfig | Integer | 是否存在冲突配置,`0`否/`1`是 | + +#### 请求示例 + +``` +GET /api/bs/ebuilder/form/association/getListByObjId?objId=456&pageName=&apid=111 +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/getListByObjId" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": form_id, "pageName": "", "apid": app_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + data = result["data"] + for item in data["datas"]: + print(f"关联ID: {item['id']}, 名称: {item['pageName']}, 开启: {item['open']}") +``` + +--- + +### 2. 卡片详情页面获取关联 + +> 卡片详情界面调用,将关联信息转成选项卡的数据结构进行返回。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getListByPageId` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| pageId | Long | 是 | 详情页面的ID | +| content | String | 否 | 内容参数 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "pageId": "101", + "tabs": [] + } +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/getListByPageId" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"pageId": page_id, "content": ""} + +response = requests.get(url, headers=headers, params=params) +result = response.json() +``` + +--- + +### 3. 初始化关联页面 + +> 初始化关联页面,返回页面ID。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/initAssociationPage` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": "page_123" +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | String | 页面ID | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/initAssociationPage" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": obj_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + page_id = result["data"] + print(f"关联页面ID: {page_id}") +``` + +--- + +### 4. 同步关联页面 + +> 同步关联页面配置。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/syncAssociationPage` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": "success" +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/syncAssociationPage" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": obj_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() +``` + +--- + +### 5. 获取高级设置 + +> 获取指定表单的关联高级设置信息。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getAdvancedSet` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "associationLayoutComponent": {}, + "pageId": "101" + } +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data.associationLayoutComponent | Object | 关联布局组件配置 | +| data.pageId | String | 页面ID | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/getAdvancedSet" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": obj_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() +``` + +--- + +### 6. 更新高级设置 + +> 更新关联的高级设置信息。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/updateAdvancedSet` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - AssociationAdvancedSet 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| pageId | Long | 否 | 页面ID | +| associationLayoutComponent | Object | 否 | 关联布局组件配置 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "pageId": "101", + "associationLayoutComponent": {} + } +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/updateAdvancedSet" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} +payload = { + "pageId": 101, + "associationLayoutComponent": {} +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() +``` + +--- + +### 7. 通过ID获取关联信息 + +> 通过关联ID获取单个数据关联的详细信息。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getDataAssociationById/{id}` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Path 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 是 | 关联ID | + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| apid | String | 否 | 应用ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "id": "123", + "objId": "456", + "pageName": "关联名称", + "open": true, + "selected": false, + "showLayout": "0,2", + "order": 1, + "defaultAss": false, + "confirm": 0, + "dataSource": {}, + "associationPermissions": [], + "customTips": {"tipsSql": ""} + } +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data.id | String | 关联ID | +| data.objId | String | eb表单id | +| data.pageName | String | 关联名称 | +| data.open | Boolean | 是否开启 | +| data.selected | Boolean | 是否默认选中 | +| data.showLayout | String | 显示布局 | +| data.order | Integer | 排序 | +| data.dataSource | Object | 数据源配置 | +| data.associationPermissions | Array | 关联权限列表 | +| data.customTips | Object | 自定义提示 | + +#### 请求示例 + +``` +GET /api/bs/ebuilder/form/association/getDataAssociationById/123?apid=111 +``` + +#### 代码调用参考 + +```python +import requests + +url = f"https://{host}/api/bs/ebuilder/form/association/getDataAssociationById/{association_id}" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"apid": app_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + data = result["data"] + print(f"关联名称: {data['pageName']}, 开启: {data['open']}") +``` + +--- + +### 8. 保存或更新关联 + +> 新建或更新数据关联配置。不传 `id` 时为新建,传 `id` 时为更新。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/saveOrUpdate` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| apid | String | 否 | 应用ID | +| tpaid | String | 否 | 透传应用ID | + +##### Body 参数 (JSON) - DataAssociationRequestMul 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | String | 否 | 关联ID(更新时传入,新增时不传) | +| objId | String | 是 | eb表单id | +| pageName | String | 是 | 关联名称 | +| open | Boolean | 否 | 是否开启,默认 `true` | +| selected | Boolean | 否 | 是否默认选中,默认 `false` | +| defaultAss | Boolean | 否 | 是否默认关联,默认 `false` | +| confirm | Integer | 否 | Dialog确定参数,`0`否/`1`是 | +| order | Integer | 否 | 排序 | +| showLayout | String | 否 | 显示布局,如"0,2" | +| dataSource | Object | 否 | 数据源配置,包含page、params等 | +| associationPermissions | Array | 否 | 关联权限配置列表 | +| customTips | Object | 否 | 自定义提示,包含 `tipsSql` 字段 | +| group | Object | 否 | 分组信息 | +| thirdPartyFlag | Integer | 否 | 第三方应用标识 | +| iconPath | String | 否 | 图标路径 | +| condition | Object | 否 | 条件配置 | +| associationActions | Array | 否 | 关联动作参数 | + +##### associationPermissions 数组元素结构 + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| dataid | String | 数据ID,默认"0" | +| name | String | 名称 | +| selectedType | String | 选择类型,`all`(全部)等 | +| relation | String | 关系,默认"0" | +| containExtra | String | 包含额外,默认"0" | +| levelScope | Object | 级别范围,包含 `minShowlevel`、`maxShowlevel` | +| jobLevel | String | 职级,默认"0" | +| jobLevelText | String | 职级文本 | +| jobLevelTextSpan | String | 职级文本范围 | +| id | String | 权限ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "id": "123", + "objId": "456", + "pageName": "关联名称", + "open": true + } +} +``` + +#### 请求示例 + +**场景一:新建关联** + +```json +{ + "objId": "456", + "pageName": "关联客户信息", + "open": true, + "dataSource": { + "page": { + "pageId": "" + }, + "params": [] + }, + "selected": false, + "showLayout": "0,2", + "confirm": 0, + "associationPermissions": [ + { + "dataid": "0", + "selectedType": "all", + "levelScope": { + "minShowlevel": "", + "maxShowlevel": "" + }, + "id": "" + } + ], + "customTips": {"tipsSql": ""} +} +``` + +**场景二:更新关联** + +```json +{ + "objId": "456", + "pageName": "关联客户信息", + "open": true, + "dataSource": { + "name": "", + "page": { + "pageType": "", + "appid": "", + "pageId": "", + "pageName": "" + }, + "params": [] + }, + "selected": false, + "showLayout": "0,2", + "id": "123", + "defaultAss": false, + "confirm": 0, + "order": 2, + "associationPermissions": [ + { + "dataid": "0", + "name": "", + "selectedType": "all", + "relation": "0", + "containExtra": "0", + "levelScope": { + "minShowlevel": "", + "maxShowlevel": "" + }, + "jobLevel": "0", + "jobLevelText": "", + "jobLevelTextSpan": "", + "id": "" + } + ], + "customTips": {"tipsSql": ""} +} +``` + +#### 代码调用参考 + +```python +import requests +import json + +url = "https://{host}/api/bs/ebuilder/form/association/saveOrUpdate?apid={app_id}&tpaid={objId}" +headers = { + "Content-Type": "application/json", + "Cookie": "ETEAMSID=" + ETEAMSID +} + +# 新建关联 +payload = { + "objId": objId, + "pageName": "关联客户信息", + "open": True, + "dataSource": { + "page": {"pageId": ""}, + "params": [] + }, + "selected": False, + "showLayout": "0,2", + "confirm": 0, + "associationPermissions": [ + { + "dataid": "0", + "selectedType": "all", + "levelScope": {"minShowlevel": "", "maxShowlevel": ""}, + "id": "" + } + ], + "customTips": {"tipsSql": ""} +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() + +if result["code"] == 200: + association_id = result["data"]["id"] + print(f"关联创建成功,关联ID: {association_id}") +else: + print(f"操作失败: {result['msg']}") +``` + +--- + +### 9. 开启/关闭关联 + +> 通过关联ID开启或关闭关联的启用状态。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/updateIsOpenById` | +| **请求方式** | `POST` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Query/Body 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 是 | 关联ID | +| open | Boolean | 否 | 是否开启,默认 `false`(关闭) | +| apid | String | 否 | 应用ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": true +} +``` + +#### 请求示例 + +``` +POST /api/bs/ebuilder/form/association/updateIsOpenById?id=123&open=true&apid=111 +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/updateIsOpenById" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"apid": app_id, "id": association_id, "open": "false"} + +response = requests.post(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + print("关联状态更新成功") +``` + +--- + +### 10. 更新排序 + +> 更新数据关联的显示排序,通过源ID和目标ID进行排序交换。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/updateOrder` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| sourceId | Long | 是 | 源关联ID | +| targetId | Long | 是 | 目标关联ID | +| apid | String | 否 | 应用ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "保存排序成功!", + "data": null +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/updateOrder" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"apid": app_id, "sourceId": source_id, "targetId": target_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + print("排序更新成功") +``` + +--- + +### 11. 更新排序V2 + +> 批量更新数据关联的排序,支持传入dataId和有序的ID列表。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/updateOrderV2` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - AssociationUpdateOrderDTO 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| sourceId | Long | 否 | 源关联ID | +| targetId | Long | 否 | 目标关联ID | +| dataId | Long | 否 | 数据ID | +| orderIds | Array(Long) | 否 | 有序的关联ID列表 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "保存排序成功!", + "data": null +} +``` + +#### 请求示例 + +```json +{ + "dataId": 789, + "orderIds": [123, 124, 125] +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/updateOrderV2" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} +payload = { + "dataId": data_id, + "orderIds": [123, 124, 125] +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() +``` + +--- + +### 12. 删除关联 + +> 通过关联ID删除指定的数据关联。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/deleteById` | +| **请求方式** | `POST` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.DELETE`(删除权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 是 | 关联ID | +| apid | String | 否 | 应用ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": true +} +``` + +#### 请求示例 + +``` +POST /api/bs/ebuilder/form/association/deleteById?apid=111&id=123 +``` + +#### 代码调用参考 + +```python +import requests + +url = f"https://{host}/api/bs/ebuilder/form/association/deleteById?apid={app_id}&id={association_id}" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} + +response = requests.post(url, headers=headers, data={}) +result = response.json() + +if result["code"] == 200: + print("关联删除成功") +``` + +--- + +### 13. 获取表单字段 + +> 通过eb表单id获取表单字段列表,用于关联配置时选择字段。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getObjFieldEntities/{objId}` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Path 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "fieldId": "field_1", + "fieldName": "单行文本", + "fieldType": "String", + "componentKey": "Text" + } + ] +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | Array | 表单字段列表 | +| data[].fieldId | String | 字段ID | +| data[].fieldName | String | 字段名称 | +| data[].fieldType | String | 字段类型 | +| data[].componentKey | String | 组件Key | + +#### 代码调用参考 + +```python +import requests + +url = f"https://{host}/api/bs/ebuilder/form/association/getObjFieldEntities/{obj_id}" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} + +response = requests.get(url, headers=headers) +result = response.json() + +if result["code"] == 200: + for field in result["data"]: + print(f"字段: {field['fieldName']}, 类型: {field['fieldType']}") +``` + +--- + +### 14. 通过ListId获取表单字段 + +> 通过列表ID(ListId)获取表单字段信息。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getObjFieldByListId/{ListId}` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Path 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| ListId | Long | 是 | 列表ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "fieldId": "field_1", + "fieldName": "单行文本", + "fieldType": "String", + "componentKey": "Text" + } + ] +} +``` + +#### 代码调用参考 + +```python +import requests + +url = f"https://{host}/api/bs/ebuilder/form/association/getObjFieldByListId/{list_id}" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} + +response = requests.get(url, headers=headers) +result = response.json() + +if result["code"] == 200: + for field in result["data"]: + print(f"字段: {field['fieldName']}") +``` + +--- + +### 15. 校验是否存在关联 + +> 校验当前表单是否存在默认开启的关联,返回已开启的关联列表。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/verifyExistAssociation/{objId}` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Path 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "id": "123", + "pageName": "关联名称", + "open": true + } + ] +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | Array | 已开启的关联列表,为空表示无开启的关联 | +| data[].id | String | 关联ID | +| data[].pageName | String | 关联名称 | +| data[].open | Boolean | 是否开启 | + +#### 代码调用参考 + +```python +import requests + +url = f"https://{host}/api/bs/ebuilder/form/association/verifyExistAssociation/{obj_id}" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} + +response = requests.get(url, headers=headers) +result = response.json() + +if result["code"] == 200: + associations = result["data"] + if associations: + print(f"存在 {len(associations)} 个开启的关联") + else: + print("无开启的关联") +``` + +--- + +### 16. 获取关联分组列表 + +> 获取表单的关联信息分组的组别列表。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getAssociationGroupList/{objId}` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Path 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| apid | String | 否 | 应用ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "id": "group_1", + "objId": "456", + "groupName": "分组1", + "showOrder": 1, + "thirdPartyFlag": 0, + "existConflictConfig": 0 + } + ] +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | Array | 分组列表 | +| data[].id | String | 分组ID | +| data[].objId | Long | eb表单id | +| data[].groupName | Object | 组名称(支持多语言) | +| data[].showOrder | Integer | 显示顺序 | +| data[].thirdPartyFlag | Integer | 第三方应用标识 | +| data[].existConflictConfig | Integer | 是否存在冲突配置 | + +#### 代码调用参考 + +```python +import requests +from pandas import DataFrame + +url = f"https://{host}/api/bs/ebuilder/form/association/getAssociationGroupList/{form_id}" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"apid": app_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + df = DataFrame(result["data"]) + print(df[["id", "groupName", "showOrder"]]) +``` + +--- + +### 17. 保存分组 + +> 综合接口:新增/更新/删除关联分组。根据传入的groups列表与库中已有分组对比,自动判断新增、更新或删除。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/save` | +| **请求方式** | `POST` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | +| groups | String | 是 | 分组信息JSON字符串 | +| appid | String | 否 | 应用ID | +| tpaid | String | 否 | 透传应用ID | + +##### groups 参数结构(JSON字符串) + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | String | 否 | 分组ID(更新/删除时传入,新增时为空) | +| groupName | String | 是 | 组名称 | +| showOrder | Integer | 否 | 显示顺序 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "id": "group_1", + "objId": "456", + "groupName": "分组1", + "showOrder": 1 + } + ] +} +``` + +#### 请求示例 + +**场景一:新增分组** + +``` +POST /api/bs/ebuilder/form/association/save?objId=456&appid=111 +groups=[{"id":"","groupName":"新分组","showOrder":1}] +``` + +**场景二:删除分组(传入空列表)** + +``` +POST /api/bs/ebuilder/form/association/save?objId=456&appid=111 +groups=[] +``` + +#### 代码调用参考 + +```python +import requests +import json + +url = "https://{host}/api/bs/ebuilder/form/association/save" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = { + "appid": app_id, + "objId": form_id, + "tpaid": form_id +} +data = { + "objId": form_id, + "groups": json.dumps([{"id": "", "groupName": "新分组", "showOrder": 1}]) +} + +response = requests.post(url, headers=headers, params=params, data=data) +result = response.json() + +if result["code"] == 200: + print("分组保存成功") +``` + +--- + +### 18. 保存或更新基本配置 + +> 保存或更新关联的基本配置信息。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/saveOrUpdateBaseConfig` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - AssociationBaseConfigDTO 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 否 | 配置ID(更新时传入) | +| objId | Long | 否 | eb表单id | +| dataId | Long | 否 | 数据ID | +| showAssociationSetting | Integer | 否 | 是否显示关联设置 | +| associationSettingStyle | Object | 否 | 关联设置样式 | +| associationPageId | Long | 否 | 关联页面ID | +| advancedSetting | Integer | 否 | 高级设置 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "id": "789", + "objId": "456", + "showAssociationSetting": 1, + "associationSettingStyle": {}, + "associationPageId": "101", + "advancedSetting": 0 + } +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/saveOrUpdateBaseConfig" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} +payload = { + "objId": 456, + "showAssociationSetting": 1, + "associationSettingStyle": {}, + "advancedSetting": 0 +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() +``` + +--- + +### 19. 获取基本配置 + +> 获取指定表单的关联基本配置信息。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getBaseConfig` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "id": "789", + "objId": "456", + "showAssociationSetting": 1, + "associationSettingStyle": {}, + "associationPageId": "101", + "advancedSetting": 0 + } +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data.id | String | 配置ID | +| data.objId | String | eb表单id | +| data.showAssociationSetting | Integer | 是否显示关联设置 | +| data.associationSettingStyle | Object | 关联设置样式 | +| data.associationPageId | String | 关联页面ID | +| data.advancedSetting | Integer | 高级设置 | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/getBaseConfig" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": obj_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + config = result["data"] + print(f"关联设置: {config['showAssociationSetting']}") +``` + +--- + +### 20. 获取前台关联权限 + +> 获取前台关联权限设置列表。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/getFrontAssPermission` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [] +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/getFrontAssPermission" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": obj_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() +``` + +--- + +### 21. 保存前台关联权限 + +> 保存前台关联权限设置。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/saveFrontAssPermission` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - FrontAssPermissionRequest 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | +| permissions | Array | 是 | 关联权限列表(AssociationPermissionRequest数组) | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": true +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/saveFrontAssPermission" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} +payload = { + "objId": 456, + "permissions": [ + { + "selectedType": "all", + "levelScope": {"minShowlevel": "", "maxShowlevel": ""} + } + ] +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() +``` + +--- + +### 22. 检查前台权限 + +> 检查前台关联权限,验证用户对指定数据的关联访问权限。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/association/checkFrontPermission` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | eb表单id | +| dataId | Long | 是 | 数据ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": true +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | Boolean | 是否有权限,`true`有权限/`false`无权限 | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/association/checkFrontPermission" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": obj_id, "dataId": data_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + has_permission = result["data"] + print(f"有权限: {has_permission}") +``` + +--- + +## 错误码说明 + +| 错误码 | 说明 | 解决方案 | +|--------|------|----------| +| 200 | 成功 | - | +| 400 | 请求参数错误 | 检查请求参数格式和必填项,特别是 `objId`、`id` 等必填参数 | +| 401 | 未授权 | 检查Cookie中的ETEAMSID是否有效 | +| 403 | 权限不足 | 检查用户是否具备对应的编辑/删除/查看权限 | +| 404 | 资源不存在 | 检查接口URL和资源ID(如关联ID、eb表单id) | +| 500 | 服务器内部错误 | 联系技术支持,可能为groups参数JSON解析失败等 | + +--- + +## 注意事项 + +1. **认证要求**:所有接口都需要在请求头中携带有效的 `ETEAMSID` Cookie,否则将返回401未授权。 +2. **ID类型**:Java后端使用 `Long` 类型的ID,但JSON序列化时使用 `ToStringSerializer` 转为字符串,因此响应中的ID字段为字符串类型。 +3. **权限控制**:不同接口需要不同权限级别(VIEW/EDIT/DELETE),确保调用者具备相应权限。 +4. **saveOrUpdate 接口**:新建关联时不传 `id` 字段,更新关联时必须传入 `id` 字段。请求体使用 `DataAssociationRequestMul`(支持多语言的关联请求实体)。 +5. **save 分组接口**:`groups` 参数是JSON字符串而非JSON对象,需要将数组序列化为字符串后传递。该接口是综合接口,自动判断新增、更新、删除: + - 传入的分组无 `id` → 新增 + - 传入的分组有 `id` 且在库中 → 更新(如名称或顺序变化) + - 库中有但传入列表中无的分组 → 删除 +6. **associationPermissions**:关联权限配置中的 `selectedType` 常用值为 `all`(全部),还支持其他类型如指定人员等。 +7. **showLayout**:显示布局字段,如 "0,2" 表示同时展示布局0和布局2。 +8. **关联流程**:完整使用流程为:新建表单 → 获取表单字段 → 保存关联配置 → 开启关联 → 管理关联分组 → 配置高级设置/基本配置 → 前台权限控制。 +9. **路径参数**:`getDataAssociationById/{id}`、`getObjFieldEntities/{objId}`、`getObjFieldByListId/{ListId}`、`verifyExistAssociation/{objId}`、`getAssociationGroupList/{objId}` 使用路径参数传递ID。 +10. **多语言支持**:`AssociationGroupVO` 中的 `groupName` 字段类型为 `Object`,支持多语言配置。 + +--- + +## 业务验收标准 + +- 获取关联列表接口能够正确返回表单的所有关联配置、基本配置和冲突配置信息 +- 保存或更新关联接口能够成功新建关联(不传id)和更新关联(传id),返回有效的关联ID +- 开启/关闭关联接口能够正确切换关联的启用状态,查询验证状态已更新 +- 删除关联接口能够成功删除指定关联,删除后不再出现在关联列表中 +- 排序接口(updateOrder/updateOrderV2)能够正确更新关联的显示顺序 +- 分组管理接口能够完成分组的新增、更新、删除综合操作 +- 基本配置接口能够正确保存和获取关联的基本配置 +- 前台权限接口能够正确获取、保存和检查关联权限 +- 校验接口能够正确检测表单是否存在默认开启的关联 +- 所有接口在缺少ETEAMSID时返回401未授权 + +--- + +*最后更新:2026-07-13* diff --git "a/\350\241\250\345\215\225\346\220\255\345\273\272/17-\345\244\226\351\203\250\345\210\206\345\217\221\346\216\245\345\217\243\346\226\207\346\241\243.md" "b/\350\241\250\345\215\225\346\220\255\345\273\272/17-\345\244\226\351\203\250\345\210\206\345\217\221\346\216\245\345\217\243\346\226\207\346\241\243.md" new file mode 100644 index 0000000000000000000000000000000000000000..d80eb9181bc594d73465cfa9986ca12e18fcb4af --- /dev/null +++ "b/\350\241\250\345\215\225\346\220\255\345\273\272/17-\345\244\226\351\203\250\345\210\206\345\217\221\346\216\245\345\217\243\346\226\207\346\241\243.md" @@ -0,0 +1,1417 @@ +# E10 e-Builder表单 - 外部分发接口文档 + +> 外部分发功能允许将表单数据通过外部链接分发给非系统用户进行填写和收集,支持填写权限控制、来源管理、消息推送等配置。 + +--- + +## 接口目录 + +| 序号 | 接口名称 | 请求方式 | 接口路径 | 功能说明 | +|------|----------|----------|----------|----------| +| 1 | 添加分发 | POST | /addDistribute | 新增一个外部分发配置 | +| 2 | 获取分发列表 | GET | /getDistributes | 获取表单的所有外部分发列表 | +| 3 | 获取ebridge配置 | GET | /getEbridgeConfig | 获取ebridge第三方配置 | +| 4 | 删除分发 | GET | /delete | 删除指定的外部分发 | +| 5 | 更新分发 | POST | /updateDistribute | 更新外部分发配置及开启状态 | +| 6 | 创建分发消息规则 | POST | /createDistributeMsgRule | 创建外部分发的消息推送规则 | +| 7 | 更新二级配置 | GET | /updateDistributeSecondConfig | 更新分发的二级配置(IP地址字段) | +| 8 | 保存填写范围 | POST | /saveWriteScope | 保存外部分发的填写权限范围 | +| 9 | 获取填写范围 | GET | /getWriteScope | 获取外部分发的填写权限范围 | +| 10 | 启用统一身份认证 | GET | /enableUnifiedIdentity | 启用或关闭统一身份认证 | +| 11 | 保存Base64图片 | POST | /saveBase64Img | 保存Base64编码的外部分发头像图片 | +| 12 | 获取邮件公共账户列表 | GET | /getMailPublicAccountList | 获取可用于邮件验证的公共邮箱列表 | +| 13 | 获取来源列表 | GET | /getSourceList | 获取外部分发的显示链接来源列表 | +| 14 | 添加或更新来源 | POST | /addOrUpdateSource | 新增或更新一个外部分发来源 | +| 15 | 批量添加或更新来源 | POST | /batchAddOrUpdateSource | 批量新增或更新外部分发来源 | +| 16 | 删除来源 | GET | /deleteSource | 删除指定的外部分发来源 | +| 17 | 获取默认来源 | GET | /getDefaultSource | 获取当前租户的默认来源 | +| 18 | 获取图形验证码 | GET | /getImgCode | 获取外部分发的图形验证码(自动化用) | + +--- + +## 通用信息 + +| 项目 | 值 | +|------|-----| +| **基础路径** | `/api/bs/ebuilder/form/distribute` | +| **备用路径** | `/api/ebuilder/form/distribute`、`/api/ebuilder{appId}/form/distribute` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **Content-Type** | `application/json` | + +--- + +## 请求头 + +``` +Cookie: ETEAMSID=<登录凭证> +``` + +--- + +## 接口详情 + +### 1. 添加分发 + +> 新增一个外部分发配置,用于将表单数据通过外部链接分发出去。新增后默认 `isDefault` 为 `0`(非默认)。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/addDistribute` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - Distribute 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | 表单ID(form_id) | +| writeScope | String | 否 | 填写范围,可选值:`anyone`(任何人)、`ex_contact`(指定外部联系人)、`wechat_auth`(微信授权登录填写),默认 `anyone` | +| layoutId | Long | 否 | PC端布局ID | +| mobileLayoutId | Long | 否 | 移动端布局ID | +| layoutValidType | String | 否 | 外部分发布局类型 | +| shareName | String | 否 | 共享名称 | +| collectStatus | String | 否 | 收集状态,`open`(开启)/`close`(关闭) | +| dueDate | Timestamp | 否 | 到期日期,格式 `yyyy-MM-dd HH:mm:ss` | +| collectUpperLimit | String | 否 | 收集上限 | +| showLoginButton | Integer | 否 | 是否显示登入按钮,`0`/`1` | +| dataCanEdit | Integer | 否 | 数据填写后是否可以编辑,`0`/`1` | +| dataEditLimit | Integer | 否 | 数据可编辑的限制次数 | +| enableVerifyCode | Integer | 否 | 是否启用验证码,`0`/`1` | +| needPwd | String | 否 | 是否需要密码 | +| pwd | String | 否 | 访问密码 | +| showSource | String | 否 | 是否显示来源 | +| sourceType | String | 否 | 来源类型 | +| sourceTitle | String | 否 | 来源标题 | +| sourceUrl | String | 否 | 来源URL | +| wechatTitle | String | 否 | 微信分享标题 | +| wechatDesc | String | 否 | 微信分享描述 | +| wechatImg | String | 否 | 微信分享图片 | +| mobileValidate | String | 否 | 是否启用手机验证 | +| emailValidate | String | 否 | 是否启用邮件验证 | +| emailPubAccount | String | 否 | 邮件公共账户 | +| enableCustomTitle | Integer | 否 | 是否启用自定义标题,`0`/`1` | +| customTitle | String | 否 | 自定义标题 | +| feedbackType | String | 否 | 反馈类型 | +| feedbackContent | String | 否 | 反馈内容 | +| feedbackLink | String | 否 | 反馈链接 | +| confirmBeforeClose | Integer | 否 | 关闭填写界面时是否弹出提示,`0`/`1` | +| successTip | String | 否 | 提交数据时的成功提示 | +| enableSuccessPage | Integer | 否 | 是否启用成功页面,`0`/`1` | +| successPageId | Long | 否 | 成功页面的ID | +| successPageName | String | 否 | 成功页面的名称 | +| pageSize | String | 否 | 页面宽度 | +| autoPushMessage | Integer | 否 | 是否自动推送消息给填写人,`0`/`1` | +| canEditAfterWrite | Integer | 否 | 填写后可修改,`0`/`1` | +| customShortUrl | String | 否 | 自定义分享的网址 | +| thirdPartyFlag | Integer | 否 | 是否专项合集 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "id": "123456789", + "tenantKey": "tenant_key_value", + "objId": "987654321", + "writeScope": "anyone", + "collectStatus": "close", + "shortUrl": "https://xxx/abc123", + "isDefault": "0" + } +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data.id | String | 分发ID,后续更新、删除等操作使用 | +| data.tenantKey | String | 租户标识 | +| data.objId | String | 表单ID | +| data.writeScope | String | 填写范围 | +| data.collectStatus | String | 收集状态 | +| data.shortUrl | String | 外部分发短链接 | +| data.isDefault | String | 是否默认,`0`否 | + +#### 请求示例(完整) + +```json +{ + "objId": 987654321, + "writeScope": "anyone" +} +``` + +#### 响应示例 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "id": "123456789", + "tenantKey": "abc123", + "objId": "987654321", + "writeScope": "anyone", + "collectStatus": "close", + "shortUrl": "https://weapp.teamsyun.com/d/abc123", + "isDefault": "0" + } +} +``` + +#### 业务流程说明 + +1. **新建表单**:首先需要一个已存在的EB表单,获取其 `form_id`(即 `objId`) +2. **添加分发**:调用此接口传入 `objId` 和 `writeScope` 创建外部分发 +3. **更新分发**:使用返回的 `id` 调用 `updateDistribute` 开启分发(设置 `collectStatus` 为 `open`) +4. **获取链接**:分发开启后,通过 `getDistributes` 获取短链接分发给外部用户 + +#### 代码调用参考 + +```python +import requests + +# 接口地址 +url = "https://{host}/api/bs/ebuilder/form/distribute/addDistribute" + +# 请求头 +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} + +# 请求体 +payload = { + "objId": 987654321, + "writeScope": "anyone" +} + +# 发送请求 +response = requests.post(url, headers=headers, json=payload) +result = response.json() + +# 处理响应 +if result["code"] == 200: + data = result["data"] + distribute_id = data["id"] + print(f"添加分发成功,分发ID: {distribute_id}") +else: + print(f"操作失败: {result['msg']}") +``` + +--- + +### 2. 获取分发列表 + +> 获取指定表单的所有外部分发配置列表。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/getDistributes` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | 表单ID(form_id) | +| apid | String | 否 | 应用ID | +| tpaid | String | 否 | 透传应用ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "id": "123456789", + "objId": "987654321", + "shareName": "外部分发名称", + "collectStatus": "open", + "writeScope": "anyone", + "shortUrl": "https://xxx/d/abc123", + "isDefault": "0", + "collectCount": 0 + } + ] +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | Array | 外部分发列表 | +| data[].id | String | 分发ID | +| data[].objId | String | 表单ID | +| data[].shareName | String | 共享名称 | +| data[].collectStatus | String | 收集状态,`open`/`close` | +| data[].writeScope | String | 填写范围 | +| data[].shortUrl | String | 短链接URL | +| data[].collectCount | Integer | 已收集的数据数量 | + +#### 请求示例 + +``` +GET /api/bs/ebuilder/form/distribute/getDistributes?objId=987654321&apid=111&tpaid=987654321 +``` + +#### 响应示例 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "id": "123456789", + "objId": "987654321", + "shareName": "客户信息收集", + "collectStatus": "open", + "writeScope": "anyone", + "shortUrl": "https://weapp.teamsyun.com/d/abc123", + "isDefault": "0", + "collectCount": 5 + } + ] +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/getDistributes" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": 987654321, "apid": app_id, "tpaid": objId} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + for item in result["data"]: + print(f"分发ID: {item['id']}, 状态: {item['collectStatus']}, 链接: {item['shortUrl']}") +``` + +--- + +### 3. 获取ebridge配置 + +> 获取ebridge第三方集成配置信息。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/getEbridgeConfig` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | 公共权限(无需特殊权限) | + +#### 请求参数 + +无请求参数。 + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "ebridgeConfig": "配置信息" + } +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/getEbridgeConfig" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} + +response = requests.get(url, headers=headers) +result = response.json() +``` + +--- + +### 4. 删除分发 + +> 删除指定的外部分发配置。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/delete` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.DELETE`(删除权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 是 | 分发ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "删除成功!", + "data": null +} +``` + +#### 请求示例 + +``` +GET /api/bs/ebuilder/form/distribute/delete?id=123456789 +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/delete" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"id": distribute_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + print("删除成功") +``` + +--- + +### 5. 更新分发 + +> 更新外部分发的配置信息或开启/关闭收集状态。请求体使用 `DistributeMul`(支持多语言)。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/updateDistribute` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - DistributeMul 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 是 | 分发ID | +| collectStatus | String | 否 | 收集状态,`open`(开启)/`close`(关闭) | +| objId | Long | 否 | 表单ID | +| layoutId | Long | 否 | PC端布局ID | +| mobileLayoutId | Long | 否 | 移动端布局ID | +| shareName | String | 否 | 共享名称 | +| dueDate | Timestamp | 否 | 到期日期,格式 `yyyy-MM-dd HH:mm:ss` | +| collectUpperLimit | String | 否 | 收集上限 | +| showLoginButton | Integer | 否 | 是否显示登入按钮 | +| dataCanEdit | Integer | 否 | 数据填写后可编辑 | +| dataEditLimit | Integer | 否 | 数据可编辑限制次数 | +| enableVerifyCode | Integer | 否 | 启用验证码 | +| needPwd | String | 否 | 是否需要密码 | +| pwd | String | 否 | 访问密码 | +| showSource | String | 否 | 是否显示来源 | +| sourceType | String | 否 | 来源类型 | +| sourceTitle | Object | 否 | 来源标题(支持多语言) | +| sourceUrl | String | 否 | 来源URL | +| wechatTitle | Object | 否 | 微信标题(支持多语言) | +| wechatDesc | Object | 否 | 微信描述(支持多语言) | +| wechatImg | String | 否 | 微信图片 | +| writeScope | String | 否 | 填写范围 | +| customShortUrl | String | 否 | 自定义短网址 | +| urlSuffix | String | 否 | URL后缀 | +| mobileValidate | String | 否 | 手机验证 | +| emailValidate | String | 否 | 邮件验证 | +| emailPubAccount | String | 否 | 邮件公共账户 | +| autoPushMessage | Integer | 否 | 自动推送消息 | +| pushRuleId | Long | 否 | 推送规则ID | +| pushRuleContent | String | 否 | 推送规则内容 | +| pushValidType | String | 否 | 推送生效方式:`immediate`(立即)/`timing`(定时) | +| startTime | Timestamp | 否 | 定时生效开始时间 | +| canEditAfterWrite | Integer | 否 | 填写后可修改 | +| enableCustomTitle | Integer | 否 | 启用自定义标题 | +| customTitle | Object | 否 | 自定义标题(支持多语言) | +| feedbackType | String | 否 | 反馈类型 | +| feedbackContent | Object | 否 | 反馈内容(支持多语言) | +| feedbackLink | String | 否 | 反馈链接 | +| confirmBeforeClose | Integer | 否 | 关闭时弹出提示 | +| successTip | String | 否 | 成功提示 | +| enableSuccessPage | Integer | 否 | 启用成功页面 | +| successPageId | Long | 否 | 成功页面ID | +| successPageName | String | 否 | 成功页面名称 | +| pageSize | String | 否 | 页面宽度 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "更新成功!", + "data": null +} +``` + +#### 请求示例 + +**场景一:开启分发收集** + +```json +{ + "id": 123456789, + "collectStatus": "open" +} +``` + +**场景二:更新外部分发完整配置** + +```json +{ + "id": 123456789, + "objId": 987654321, + "shareName": "客户信息收集表", + "collectStatus": "open", + "writeScope": "anyone", + "enableVerifyCode": 1, + "dueDate": "2026-12-31 23:59:59", + "collectUpperLimit": "100", + "wechatTitle": "请填写客户信息", + "wechatDesc": "感谢您的配合", + "enableSuccessPage": 1, + "successTip": "提交成功,感谢您的参与!" +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/updateDistribute" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} + +# 开启分发 +payload = { + "id": distribute_id, + "collectStatus": "open" +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() + +if result["code"] == 200: + print("更新成功") +``` + +--- + +### 6. 创建分发消息规则 + +> 创建外部分发的消息推送规则。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/createDistributeMsgRule` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.ADD`(新增权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - Distribute 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | 表单ID | +| autoPushMessage | Integer | 否 | 是否自动推送消息,`0`/`1` | +| pushRuleContent | String | 否 | 推送规则内容 | +| pushValidType | String | 否 | 推送生效方式:`immediate`(立即)/`timing`(定时) | +| startTime | Timestamp | 否 | 定时生效开始时间,格式 `yyyy-MM-dd HH:mm:ss` | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": 123456789 +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | Long | 规则ID | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/createDistributeMsgRule" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} +payload = { + "objId": 987654321, + "autoPushMessage": 1, + "pushRuleContent": "推送规则内容", + "pushValidType": "immediate" +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() + +if result["code"] == 200: + rule_id = result["data"] + print(f"规则创建成功,规则ID: {rule_id}") +``` + +--- + +### 7. 更新二级配置 + +> 更新外部分发的二级配置,主要用于设置IP地址更新字段ID。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/updateDistributeSecondConfig` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 是 | 分发ID | +| ipAddressUpdateFieldId | String | 否 | IP地址更新字段ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "更新成功!", + "data": null +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/updateDistributeSecondConfig" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"id": distribute_id, "ipAddressUpdateFieldId": "field_123"} + +response = requests.get(url, headers=headers, params=params) +result = response.json() +``` + +--- + +### 8. 保存填写范围 + +> 保存外部分发的填写权限范围配置,支持指定外部联系人、微信授权等模式。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/saveWriteScope` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - WriteScopeVo 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| distributeId | Long | 是 | 分发ID | +| writeScope | String | 是 | 填写范围,`anyone`(任何人)/`ex_contact`(指定外部联系人)/`wechat_auth`(微信授权登录填写) | +| enableUnifiedIdentity | Integer | 否 | 是否启用统一身份认证,`0`/`1` | +| autoPushMessage | Integer | 否 | 是否自动推送消息,`0`/`1` | +| pushRuleId | Long | 否 | 推送规则ID | +| pushRuleContent | String | 否 | 推送规则内容 | +| pushValidType | String | 否 | 推送生效方式:`immediate`/`timing` | +| startTime | Timestamp | 否 | 定时生效开始时间,格式 `yyyy-MM-dd HH:mm:ss` | +| dueDate | Timestamp | 否 | 到期日期,格式 `yyyy-MM-dd HH:mm:ss` | +| externalEmployees | Array | 否 | 外部联系人列表(当 writeScope 为 `ex_contact` 时使用) | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "distributeId": "123456789", + "writeScope": "anyone" + } +} +``` + +#### 请求示例 + +**场景一:任何人可填写** + +```json +{ + "distributeId": 123456789, + "writeScope": "anyone" +} +``` + +**场景二:微信授权登录填写** + +```json +{ + "distributeId": 123456789, + "writeScope": "wechat_auth" +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/saveWriteScope" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} +payload = { + "distributeId": distribute_id, + "writeScope": "anyone" +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() + +if result["code"] == 200: + print("填写范围保存成功") +``` + +--- + +### 9. 获取填写范围 + +> 获取外部分发的填写权限范围配置。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/getWriteScope` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| distributeId | Long | 是 | 分发ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "distributeId": "123456789", + "writeScope": "anyone", + "enableUnifiedIdentity": 0, + "autoPushMessage": 0, + "externalEmployees": [] + } +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data.distributeId | String | 分发ID | +| data.writeScope | String | 填写范围 | +| data.enableUnifiedIdentity | Integer | 是否启用统一身份认证 | +| data.autoPushMessage | Integer | 是否自动推送消息 | +| data.externalEmployees | Array | 外部联系人列表 | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/getWriteScope" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"distributeId": distribute_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + data = result["data"] + print(f"填写范围: {data['writeScope']}") +``` + +--- + +### 10. 启用统一身份认证 + +> 启用或关闭外部分发的统一身份认证功能。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/enableUnifiedIdentity` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| objId | Long | 是 | 表单ID | +| enableUnifiedIdentity | Integer | 是 | 是否启用统一身份认证,`0`(关闭)/`1`(启用) | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": "success" +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/enableUnifiedIdentity" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"objId": obj_id, "enableUnifiedIdentity": 1} + +response = requests.get(url, headers=headers, params=params) +result = response.json() +``` + +--- + +### 11. 保存Base64图片 + +> 保存Base64编码的外部分发头像图片,返回上传后的文件信息。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/saveBase64Img` | +| **请求方式** | `POST`/`GET`(`@RequestMapping`) | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - ImageBase 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| imgStr | String | 是 | Base64编码的图片字符串 | +| name | String | 否 | 文件名,为空时默认"外部分发头像.jpg" | +| type | String | 否 | 文件MIME类型,为空时默认"image/jpeg" | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "fileid": "123456", + "fileName": "外部分发头像.jpg", + "fileSize": 1024 + } +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data.fileid | String | 文件ID,用于后续引用 | + +#### 代码调用参考 + +```python +import requests +import base64 + +url = "https://{host}/api/bs/ebuilder/form/distribute/saveBase64Img" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} + +# 读取图片并转Base64 +with open("avatar.jpg", "rb") as f: + img_base64 = base64.b64encode(f.read()).decode() + +payload = { + "imgStr": img_base64, + "name": "外部分发头像.jpg", + "type": "image/jpeg" +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() + +if result["code"] == 200: + file_id = result["data"]["fileid"] + print(f"图片保存成功,文件ID: {file_id}") +``` + +--- + +### 12. 获取邮件公共账户列表 + +> 获取可用于外部分发邮件验证的公共邮箱账户列表,默认在列表最前添加"默认"账户(ID为1000)。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/getMailPublicAccountList` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +无请求参数。 + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "id": "1000", + "name": "默认" + }, + { + "id": "1001", + "name": "公共邮箱1" + } + ] +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | Array | 公共邮箱列表 | +| data[].id | String | 账户ID,`1000`为默认账户 | +| data[].name | String | 账户名称 | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/getMailPublicAccountList" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} + +response = requests.get(url, headers=headers) +result = response.json() + +if result["code"] == 200: + for account in result["data"]: + print(f"账户ID: {account['id']}, 名称: {account['name']}") +``` + +--- + +### 13. 获取来源列表 + +> 获取外部分发的显示链接来源列表,支持按来源标题搜索。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/getSourceList` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| sourceTitle | String | 否 | 来源标题(搜索关键词),为空时返回全部 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": [ + { + "id": "123", + "sourceTitle": "微信公众号", + "sourceUrl": "https://wx.qq.com", + "isDefault": "0" + } + ] +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | Array | 来源列表 | +| data[].id | String | 来源ID | +| data[].sourceTitle | String | 来源标题 | +| data[].sourceUrl | String | 来源URL | +| data[].isDefault | String | 是否默认 | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/getSourceList" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"sourceTitle": ""} + +response = requests.get(url, headers=headers, params=params) +result = response.json() + +if result["code"] == 200: + for source in result["data"]: + print(f"来源: {source['sourceTitle']}, URL: {source['sourceUrl']}") +``` + +--- + +### 14. 添加或更新来源 + +> 新增或更新一个外部分发的显示链接来源。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/addOrUpdateSource` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - DistributeSourceMul 对象 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 否 | 来源ID(更新时传入,新增时不传) | +| isDefault | String | 否 | 是否默认,`0`/`1` | +| sourceTitle | Object | 是 | 来源标题(支持多语言) | +| sourceUrl | String | 是 | 来源URL | +| thirdPartyFlag | Integer | 否 | 是否专项合集 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "id": "123", + "sourceTitle": "微信公众号", + "sourceUrl": "https://wx.qq.com" + } +} +``` + +#### 请求示例 + +```json +{ + "sourceTitle": "微信公众号", + "sourceUrl": "https://wx.qq.com", + "isDefault": "0" +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/addOrUpdateSource" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} +payload = { + "sourceTitle": "微信公众号", + "sourceUrl": "https://wx.qq.com", + "isDefault": "0" +} + +response = requests.post(url, headers=headers, json=payload) +result = response.json() +``` + +--- + +### 15. 批量添加或更新来源 + +> 批量新增或更新外部分发的显示链接来源。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/batchAddOrUpdateSource` | +| **请求方式** | `POST` | +| **Content-Type** | `application/json` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.EDIT`(编辑权限) | + +#### 请求参数 + +##### Body 参数 (JSON) - DistributeSourceMul 数组 + +| 字段名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| [array].sourceTitle | Object | 是 | 来源标题(支持多语言) | +| [array].sourceUrl | String | 是 | 来源URL | +| [array].isDefault | String | 否 | 是否默认 | +| [array].thirdPartyFlag | Integer | 否 | 是否专项合集 | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "处理完成!", + "data": null +} +``` + +#### 请求示例 + +```json +[ + { + "sourceTitle": "微信公众号", + "sourceUrl": "https://wx.qq.com" + }, + { + "sourceTitle": "企业官网", + "sourceUrl": "https://www.example.com" + } +] +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/batchAddOrUpdateSource" +headers = { + "Cookie": "ETEAMSID=" + ETEAMSID, + "Content-Type": "application/json" +} +payload = [ + {"sourceTitle": "微信公众号", "sourceUrl": "https://wx.qq.com"}, + {"sourceTitle": "企业官网", "sourceUrl": "https://www.example.com"} +] + +response = requests.post(url, headers=headers, json=payload) +result = response.json() +``` + +--- + +### 16. 删除来源 + +> 删除指定的外部分发来源。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/deleteSource` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.DELETE`(删除权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| id | Long | 是 | 来源ID | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "刪除完成!", + "data": null +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/deleteSource" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"id": source_id} + +response = requests.get(url, headers=headers, params=params) +result = response.json() +``` + +--- + +### 17. 获取默认来源 + +> 获取当前租户的默认外部分发来源。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/getDefaultSource` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +无请求参数。 + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": { + "id": "1", + "sourceTitle": "默认来源", + "sourceUrl": "", + "isDefault": "1" + } +} +``` + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/getDefaultSource" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} + +response = requests.get(url, headers=headers) +result = response.json() + +if result["code"] == 200: + default_source = result["data"] + print(f"默认来源: {default_source['sourceTitle']}") +``` + +--- + +### 18. 获取图形验证码 + +> 提供给自动化测试获取图形验证码的接口,根据动态Key和验证码获取对应的图片Key。 + +#### 接口信息 + +| 项目 | 值 | +|------|-----| +| **接口URL** | `/api/bs/ebuilder/form/distribute/getImgCode` | +| **请求方式** | `GET` | +| **认证方式** | Cookie (`ETEAMSID`) | +| **权限** | `EbPermissionType.VIEW`(查看权限) | + +#### 请求参数 + +##### Query 参数 + +| 参数名 | 类型 | 必填 | 说明 | +|--------|------|------|------| +| imgCode | String | 是 | 图形验证码 | +| dynamicKey | String | 是 | 动态Key | + +#### 响应数据结构 + +```json +{ + "code": 200, + "status": true, + "msg": "接口返回成功", + "data": "img_key_value" +} +``` + +#### 关键返回字段说明 + +| 字段 | 类型 | 说明 | +|------|------|------| +| data | String | 验证码对应的图片Key | + +#### 代码调用参考 + +```python +import requests + +url = "https://{host}/api/bs/ebuilder/form/distribute/getImgCode" +headers = {"Cookie": "ETEAMSID=" + ETEAMSID} +params = {"imgCode": "abcd", "dynamicKey": "key123"} + +response = requests.get(url, headers=headers, params=params) +result = response.json() +``` + +--- + +## 错误码说明 + +| 错误码 | 说明 | 解决方案 | +|--------|------|----------| +| 200 | 成功 | - | +| 400 | 请求参数错误 | 检查请求参数格式和必填项 | +| 401 | 未授权 | 检查Cookie中的ETEAMSID是否有效 | +| 403 | 权限不足 | 检查用户是否具备对应的编辑/删除权限 | +| 404 | 资源不存在 | 检查接口URL和资源ID(如分发ID、来源ID) | +| 500 | 服务器内部错误 | 联系技术支持 | + +--- + +## 注意事项 + +1. **认证要求**:所有接口都需要在请求头中携带有效的 `ETEAMSID` Cookie,否则将返回401未授权。 +2. **ID类型**:Java后端使用 `Long` 类型的ID,但JSON序列化时使用 `ToStringSerializer` 转为字符串,因此响应中的ID字段为字符串类型。 +3. **权限控制**:不同接口需要不同权限级别(VIEW/EDIT/ADD/DELETE),确保调用者具备相应权限。 +4. **writeScope 取值**:填写范围字段必须为 `anyone`、`ex_contact`、`wechat_auth` 三者之一,传入其他值可能导致异常。 +5. **多语言支持**:`DistributeMul` 中的 `sourceTitle`、`wechatTitle`、`wechatDesc`、`customTitle`、`feedbackContent` 字段支持多语言,类型为 `Object`。 +6. **日期格式**:`dueDate`、`startTime` 字段格式为 `yyyy-MM-dd HH:mm:ss`。 +7. **外部分发流程**:完整使用流程为:新建表单 → 添加分发 → 更新分发开启收集 → 获取短链接 → 外部用户填写 → 查询收集数据。 +8. **删除操作**:删除分发和删除来源是独立操作,删除分发不会自动删除关联的来源。 + +--- + +## 业务验收标准 + +- 添加分发接口能够成功创建外部分发,并返回有效的分发ID和短链接 +- 更新分发接口能够正确开启/关闭收集状态,修改配置后查询验证配置已更新 +- 填写范围接口能够正确保存和获取填写权限(anyone/ex_contact/wechat_auth) +- 来源管理接口能够完成来源的增删改查和批量操作 +- 删除分发后,该分发不再出现在分发列表中 +- Base64图片上传后返回有效的文件ID +- 所有接口在缺少ETEAMSID时返回401未授权 + +--- + +*最后更新:2026-07-13*