# datasource — 数据源同步管理

将外部数据源（当前仅支持 OA 审批）同步到 AI 表格。完整链路：list-sources → (OA) 选择模板 → get-fields → create → sync-status → sync / update / get-config。

## 命令一览

| 命令 | 用途 | 读/写 |
|------|------|-------|
| `+datasource-list-sources` | 列出可用数据源条目，获取 processCode/name/iconUrl/url | 读 |
| `+datasource-get-fields` | 获取可同步字段列表，用于决定 field-ids | 读 |
| `+datasource-create` | 创建数据源表并触发首次全量同步 | 写 |
| `+datasource-update` | 更新已有数据源表的同步配置 | 写 |
| `+datasource-sync` | 手动触发一次同步（最多 5 张表） | 写 |
| `+datasource-sync-status` | 查询同步任务状态（RUNNING/FINISHED/FAILED） | 读 |
| `+datasource-get-config` | 获取数据源表当前同步配置 | 读 |

## 典型工作流

```
Step 0    列出可用来源         +datasource-list-sources --base-id <B> --datasource-type OA
                              → 返回 approvals 数组（通常含多个审批模板）

Step 0.5  (OA 审批) 选择模板  list-sources 返回的 approvals 数组通常含多个审批模板，需确定目标：
                              - 用户已指定名称（如"采购申请"）→ 按 name 精确/模糊匹配
                                · 唯一命中 → 提取该条的 processCode/name/iconUrl/url，继续
                                · 多候选 → 列出匹配项让用户消歧
                                · 零命中 → 停止，提示用户确认名称或从完整列表选择
                              - 用户未指定 → 列出候选模板清单（name + processCode），等用户选择
                              - 禁止：未匹配直接选第一项、或凭记忆猜 processCode
                              注：此步骤针对 OA 审批数据源（多模板场景）；其他数据源类型的
                              list-sources 返回结构可能不同，按实际 result 解析即可，
                              不一定需要选择步骤。

Step 1    (可选) 获取可同步字段  +datasource-get-fields --base-id <B> --datasource-type OA --source-config '<JSON>'
                              → 决定需要同步哪些字段，得到 field-ids

Step 2    创建数据源           +datasource-create --base-id <B> --datasource-type OA --source-config '<JSON>'
                              → sourceConfig 中的 processCode/name/iconUrl/url 来自 Step 0.5 选中的模板
                              → 返回 tableId + taskId

Step 3    查询同步结果         +datasource-sync-status --base-id <B> --table-id <T> --task-ids <TASK_ID>
                              → FINISHED=完成，FAILED=看 errorCode 排查，RUNNING=轮询

Step 4    (后续) 手动触发同步   +datasource-sync --base-id <B> --table-ids <T1>,<T2>
                              → 返回新 taskId，再用 sync-status 查结果

Step 5    (后续) 更新配置       +datasource-update --base-id <B> --table-id <T> --source-config '<JSON>' --auto
                              → 更新后自动触发一次同步

查看当前配置                  +datasource-get-config --base-id <B> --table-id <T>
```

## sourceConfig 字段协议

以下字段协议仅适用于 OA 审批数据源（datasourceType=OA），其他数据源类型待后续开放。

### 须从 list-sources 原样透传（必填）

| 字段 | 类型 | 说明 |
|------|------|------|
| processCode | String | OA 审批流程编码 |
| name | String | 展示名称 |
| iconUrl | String | 图标 URL |
| url | String | 跳转链接 |

### 调用方自行设置

| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| dataType | String | 是 | 数据范围类型：`time_range` / `start_time` / `recent_time` |
| recentDays | String | 条件 | dataType=recent_time 时有效，取值 `7d`/`30d`/`1y`，默认 `30d` |
| startDate | String | 条件 | dataType=time_range 或 start_time 时有效，`yyyy-MM-dd`，默认 30 天前 |
| endDate | String | 条件 | dataType=time_range 时有效，`yyyy-MM-dd`，默认当天 |
| keepRemovedFields | Boolean | 否 | 是否保留已删除字段，默认 false |
| splitParentTableField | Boolean | 否 | 是否拆分父表字段 |

> list-sources 返回的 keepRemovedFields / splitParentTableField / enableDataSyncOaDetailList 不要透传，由调用方按需设置。

### 三种 dataType 最小示例

```json
// recent_time — 最近一段时间
{"processCode":"PROC-xxxx","name":"采购申请","dataType":"recent_time","recentDays":"30d","iconUrl":"...","url":"..."}

// time_range — 指定起止日期
{"processCode":"PROC-xxxx","name":"采购申请","dataType":"time_range","startDate":"2025-01-01","endDate":"2025-12-31","iconUrl":"...","url":"..."}

// start_time — 从某日期至今
{"processCode":"PROC-xxxx","name":"采购申请","dataType":"start_time","startDate":"2025-06-01","iconUrl":"...","url":"..."}
```

## autoSyncSetting 频率配置

仅在 `--auto=true` 时生效。不传时使用下游默认自动同步策略。

| 字段 | 必填 | 说明 |
|------|------|------|
| syncType | 是 | `hourly`（按小时间隔）/ `scheduled`（定时触发） |
| hourlyInterval | hourly 时 | 正整数，小时间隔 |
| scheduleType | scheduled 时 | `daily` / `weekly` / `monthly` |
| timeValue | scheduled 时 | `HH:mm` 触发时间 |
| selectedMonthDays | monthly 时必填 | 每月几号触发，1-31 |
| selectedWeekdays | weekly 时必填 | 每周哪几天触发，1=周一…7=周日 |
| skipNonWorkingDay | 否 | 是否跳过非工作日，默认 false |

示例：`{"syncType":"scheduled","scheduleType":"daily","timeValue":"09:00"}`

## 命令详情

### +datasource-list-sources — 列出可用数据源条目

```bash
dws aitable +datasource-list-sources --base-id BASE_ID --datasource-type OA --format json
```

| flag | 必填 | 说明 |
|------|------|------|
| `--base-id` | 是 | 目标 Base ID |
| `--datasource-type` | 是 | 数据源类型，当前仅支持 `OA` |

返回每条条目包含 `result`（下游原始 JSON 字符串）和 `sourceType`（OA 审批对应 2）。OA 审批场景下 result 为 approvals 数组：

```json
{
  "approvals": [
    {
      "processCode": "PROC-xxxx",
      "name": "采购申请",
      "iconUrl": "https://...",
      "url": "https://...",
      "keepRemovedFields": false,
      "splitParentTableField": false,
      "enableDataSyncOaDetailList": false
    }
  ]
}
```

调用方应自行解析 result，提取目标模板字段后构造 sourceConfig。

### +datasource-get-fields — 获取可同步字段列表

```bash
dws aitable +datasource-get-fields --base-id BASE_ID --datasource-type OA \
  --source-config '{"processCode":"PROC-xxxx","name":"采购申请","dataType":"recent_time","recentDays":"30d","iconUrl":"...","url":"..."}' \
  --format json
```

| flag | 必填 | 说明 |
|------|------|------|
| `--base-id` | 是 | 目标 Base ID |
| `--datasource-type` | 是 | 数据源类型，当前仅支持 `OA` |
| `--source-config` | 是 | 源配置 JSON 字符串，结构同 create 的 --source-config |

返回字段列表（字段 ID、名称、类型等），用于在 create/update 中指定 `--field-ids`。

### +datasource-create — 创建数据源表

```bash
dws aitable +datasource-create --base-id BASE_ID --datasource-type OA \
  --source-config '{"processCode":"PROC-xxxx","name":"采购申请","dataType":"recent_time","recentDays":"30d","iconUrl":"...","url":"..."}' \
  --format json

# 开启自动同步 + 自定义频率
dws aitable +datasource-create --base-id BASE_ID --datasource-type OA \
  --source-config '...' --auto \
  --auto-sync-setting '{"syncType":"scheduled","scheduleType":"daily","timeValue":"09:00"}' \
  --format json
```

| flag | 必填 | 说明 |
|------|------|------|
| `--base-id` | 是 | 目标 Base ID |
| `--datasource-type` | 是 | 数据源类型，当前仅支持 `OA` |
| `--source-config` | 是 | 源配置 JSON 字符串（见上方字段协议） |
| `--auto` | 否 | 是否开启自动同步，默认 false；无论是否传入，CLI 都会把该字段下发给下游 |
| `--auto-sync-setting` | 否 | 自动同步频率配置 JSON 字符串，仅 --auto=true 时生效 |
| `--field-ids` | 否 | 需要同步的字段 ID 列表，不传时同步全部字段 |

返回新建数据源表 tableId 和同步任务 taskId。创建后自动触发一次全量同步，需用 `+datasource-sync-status` 查最终结果。

### +datasource-update — 更新数据源配置

```bash
# 仅开启自动同步
dws aitable +datasource-update --base-id BASE_ID --table-id TABLE_ID --auto --format json

# 更新源配置
dws aitable +datasource-update --base-id BASE_ID --table-id TABLE_ID \
  --source-config '{"processCode":"PROC-yyyy","name":"出差申请","dataType":"recent_time","recentDays":"30d","iconUrl":"...","url":"..."}' \
  --format json
```

| flag | 必填 | 说明 |
|------|------|------|
| `--base-id` | 是 | 目标 Base ID |
| `--table-id` | 是 | 已有数据源表 ID（sync=true） |
| `--source-config` | 否 | 新的源配置 JSON 字符串，不传时保持原配置；传入时整体覆盖 |
| `--auto` | 否 | 是否开启自动同步，不传时保持原设置 |
| `--auto-sync-setting` | 否 | 自动同步频率配置 JSON 字符串，仅 --auto=true 时生效；不传时保持原频率配置 |
| `--field-ids` | 否 | 需要同步的字段 ID 列表，不传时保持现有字段配置 |

更新后自动触发一次全量同步，返回新 taskId。

### +datasource-sync — 手动触发同步

```bash
dws aitable +datasource-sync --base-id BASE_ID --table-ids TBL1,TBL2 --format json
```

| flag | 必填 | 说明 |
|------|------|------|
| `--base-id` | 是 | 目标 Base ID |
| `--table-ids` | 是 | 待同步的数据源表 ID 列表（sync=true），1-5 个 |

返回结果包含文档链接，可打开查看同步进度。每张表独立提交，部分失败不影响其他表。

### +datasource-sync-status — 按任务 ID 查询同步状态

```bash
dws aitable +datasource-sync-status --base-id BASE_ID --table-id TABLE_ID --task-ids TASK1,TASK2 --format json
```

| flag | 必填 | 说明 |
|------|------|------|
| `--base-id` | 是 | 目标 Base ID |
| `--table-id` | 是 | 数据源表 ID（sync=true） |
| `--task-ids` | 是 | 同步任务 ID 列表（由 create/update/sync 返回），1-5 个 |

任务状态：`RUNNING`（进行中）、`FINISHED`（完成）、`FAILED`（失败，含 errorCode + errorMessage）。

### +datasource-get-config — 获取数据源配置

```bash
dws aitable +datasource-get-config --base-id BASE_ID --table-id TABLE_ID --format json
```

| flag | 必填 | 说明 |
|------|------|------|
| `--base-id` | 是 | 目标 Base ID |
| `--table-id` | 是 | 数据源表 ID（sync=true） |

返回当前同步配置详情（sourceConfig、是否自动同步、同步状态等）。仅适用于数据源表，普通表会报错。

## 错误码与排查

| 场景 | 表现 | 排查 |
|------|------|------|
| 同步运行中重复触发 | errorCode=4014，status=FAILED | 幂等冲突，稍后重试即可 |
| 非数据源表触发 sync | 参数错误返回 | 确认 table 的 sync=true，用 `+base-get` / `+table-list` 检查 |
| sourceConfig 缺必填字段 | 创建/更新失败 | 检查 processCode/name/iconUrl/url 是否从 list-sources 原样透传 |
| dataType 与时间字段不匹配 | 创建失败 | recent_time 需 recentDays；time_range 需 startDate+endDate；start_time 需 startDate |

## 能力边界

| 能力 | 状态 |
|------|------|
| OA 审批数据源 | 已支持 |
| 其他数据源类型 | 待后续开放 |
| 全量同步 | 已支持 |
| 增量同步 | 待后续开放 |
| 自动同步 | 已支持（--auto + autoSyncSetting） |
| 删除数据源表 | 走普通表删除，不走 datasource 命令 |

## 注意事项

- sourceConfig 是 **JSON 字符串**（不是 JSON 对象），CLI flag 传入时需要用单引号包裹
- list-sources 返回的 keepRemovedFields / splitParentTableField / enableDataSyncOaDetailList 不要透传，由调用方按需设置
- create/update 后自动触发一次同步，返回 taskId；用 sync-status 查最终结果
- sync 单次最多 5 张表，超出拆分多次调用
- sync-status 单次最多 5 个 taskId，超出拆分多次调用
- get-config 仅适用于数据源表（sync=true），普通表会报错
