# 字段类型 config 规范（field create / table create / field update）

> 适用命令：`dws aitable field create`、`dws aitable table create --fields`、`dws aitable field update --config`
>
> 本文件是 DWS AI 表格字段 config 的 **source of truth**。创建/更新字段时，必须严格按此规范构造 JSON。

## 1. 顶层规则

- `table create --fields` 和 `field create --fields` 中每个字段对象：`{"fieldName":"xxx", "type":"xxx", "config":{...}}`
- `field create --name --type --config` 中 config 单独传 JSON 字符串
- `field update --config` 只传 config 部分
- 不需要 config 的类型（如 text、checkbox、attachment）可省略 config 字段

## 2. 字段类型速查

| type | 需要 config | config 核心字段 | 说明 |
|------|-------------|----------------|------|
| `text` | ❌ | — | 纯文本 |
| `number` | 可选 | `formatter` | 数字格式 |
| `singleSelect` | ✅ | `options` | 单选 |
| `multipleSelect` | ✅ | `options` | 多选 |
| `date` | 可选 | `formatter` | 日期格式 |
| `currency` | 可选 | `currencyType`, `formatter` | 货币 |
| `progress` | 可选 | `formatter`, `min`, `max`, `customizeRange` | 进度条 |
| `rating` | 可选 | `min`, `max`, `icon` | 评分 |
| `checkbox` | ❌ | — | 勾选框 |
| `user` | 可选 | `multiple` | 人员 |
| `department` | 可选 | `multiple` | 部门 |
| `group` | 可选 | `multiple` | 群组 |
| `url` | ❌ | — | 链接 |
| `richText` | ❌ | — | 富文本 |
| `telephone` | ❌ | — | 电话 |
| `email` | ❌ | — | 邮箱 |
| `attachment` | ❌ | — | 附件 |
| `geolocation` | ❌ | — | 地理位置 |
| `formula` | ✅ | `formula` | 公式（只读字段） |
| `unidirectionalLink` | ✅ | `linkedTableId`, `multiple` | 单向关联 |
| `bidirectionalLink` | ✅ | `linkedTableId`, `multiple` | 双向关联 |
| `creator` | ❌ | — | 系统字段：创建人（只读） |
| `lastModifier` | ❌ | — | 系统字段：最后编辑人（只读） |
| `createdTime` | ❌ | — | 系统字段：创建时间（只读） |
| `lastModifiedTime` | ❌ | — | 系统字段：最后编辑时间（只读） |

## 3. 各类型 config 详解

### 3.1 number（数字）

config 字段：`formatter`

可选值：
- `INT` — 整数
- `FLOAT_1` — 1 位小数
- `FLOAT_2` — 2 位小数（默认）
- `FLOAT_3` — 3 位小数
- `FLOAT_4` — 4 位小数
- `THOUSAND` — 千分位整数
- `THOUSAND_FLOAT` — 千分位 + 小数
- `PERCENT` — 百分比（整数）
- `PERCENT_FLOAT` — 百分比（小数）

```json
{"fieldName": "工时", "type": "number", "config": {"formatter": "FLOAT_2"}}
```

```json
{"fieldName": "完成率", "type": "number", "config": {"formatter": "PERCENT"}}
```

### 3.2 singleSelect / multipleSelect（单选 / 多选）

config 字段：`options`（必填）

options 结构：
- `options` 是数组，每项至少包含 `name`
- 创建时只传 `name`，`id` 由系统生成
- **更新时**：已有选项必须回传原 `id`（从 `field get` 获取），新增选项不传 id

```json
{
  "fieldName": "优先级",
  "type": "singleSelect",
  "config": {
    "options": [
      {"name": "紧急"},
      {"name": "高"},
      {"name": "中"},
      {"name": "低"}
    ]
  }
}
```

更新已有字段时（保留原选项 + 新增）：
```json
{
  "options": [
    {"id": "opt_existing_1", "name": "紧急"},
    {"id": "opt_existing_2", "name": "高"},
    {"id": "opt_existing_3", "name": "中"},
    {"name": "极低"}
  ]
}
```

> 更新 options 是**全量覆盖**，不是追加！不传的旧选项会被删除，关联的单元格数据丢失。

### 3.3 date（日期）

config 字段：`formatter`

可选值：
- `YYYY-MM-DD`（默认）
- `YYYY-MM-DD HH:mm`
- `YYYY-MM-DD HH:mm:ss`
- `YYYY/MM/DD`
- `YYYY/MM/DD HH:mm`

```json
{"fieldName": "截止日期", "type": "date", "config": {"formatter": "YYYY-MM-DD"}}
```

```json
{"fieldName": "创建时间", "type": "date", "config": {"formatter": "YYYY-MM-DD HH:mm"}}
```

### 3.4 currency（货币）

config 字段：`currencyType`（必填）、`formatter`（可选）

currencyType 可选值：
`CNY` | `HKD` | `USD` | `EUR` | `GBP` | `MOP` | `VND` | `JPY` | `KRW` | `AED` | `AUD` | `BRL` | `CAD` | `CHF` | `INR` | `IDR` | `MXN` | `MYR` | `PHP` | `PLN` | `RUB` | `SGD` | `THB` | `TRY` | `TWD`

formatter 可选值（控制小数位）：`INT` | `FLOAT_1` | `FLOAT_2`（默认）| `FLOAT_3` | `FLOAT_4`

```json
{"fieldName": "预算", "type": "currency", "config": {"currencyType": "CNY", "formatter": "FLOAT_2"}}
```

### 3.5 progress（进度）

config 字段：`formatter`（固定为 `PERCENT`）、`customizeRange`、`min`、`max`

- 默认范围：0~1（即 0%~100%）
- 自定义范围时 `customizeRange` 必须为 `true`

```json
{"fieldName": "完成度", "type": "progress", "config": {"formatter": "PERCENT"}}
```

自定义范围：
```json
{"fieldName": "进度", "type": "progress", "config": {"formatter": "PERCENT", "customizeRange": true, "min": 0, "max": 1}}
```

### 3.6 rating（评分）

config 字段：`min`、`max`、`icon`

- `min`：固定为 `1`
- `max`：1~10，默认 `5`
- `icon`：默认 `star`

```json
{"fieldName": "满意度", "type": "rating", "config": {"min": 1, "max": 5, "icon": "star"}}
```

### 3.7 user / department / group（人员 / 部门 / 群组）

config 字段：`multiple`

- `multiple`：`true`（多选，默认）| `false`（单选）

```json
{"fieldName": "负责人", "type": "user", "config": {"multiple": false}}
```

```json
{"fieldName": "协作部门", "type": "department", "config": {"multiple": true}}
```

### 3.8 formula（公式）

config 字段：`formula`（必填）

- 公式中引用字段使用**方括号 + 字段名**：`[字段名]`
- 支持的函数：参考钉钉 AI 表格公式文档

```json
{"fieldName": "合计", "type": "formula", "config": {"formula": "[单价] * [数量]"}}
```

```json
{"fieldName": "是否逾期", "type": "formula", "config": {"formula": "IF([截止日期] < NOW(), \"是\", \"否\")"}}
```

> ⚠️ formula 字段创建后为**只读**，不能通过 record create/update 写入值。

### 3.9 unidirectionalLink（单向关联）

config 字段：`linkedTableId`（必填）、`multiple`

- `linkedTableId`：目标表的 tableId
- `multiple`：`true`（多选，默认）| `false`（单选）

```json
{"fieldName": "关联项目", "type": "unidirectionalLink", "config": {"linkedTableId": "tblXXXXXX", "multiple": true}}
```

### 3.10 bidirectionalLink（双向关联）

config 字段：`linkedTableId`（必填）、`multiple`

- 与单向关联参数相同
- 创建后系统会**自动**在被关联表创建反向字段

```json
{"fieldName": "关联任务", "type": "bidirectionalLink", "config": {"linkedTableId": "tblYYYYYY", "multiple": true}}
```

## 4. AI 字段（ai-config）

AI 字段不使用 config，而使用独立的 `--ai-config` 参数。详见 [aitable-field.md](./aitable-field.md) 中的 AI 字段创建示例。

核心规则：
- `outputType` 必须与 `--type` 对应：text→text, select→singleSelect, multiSelect→multipleSelect, number→number, currency→currency, image/video→attachment
- `prompt` 中必须至少包含一个 `fieldRef` 引用
- 纯文本 prompt 会被后端拒绝

## 5. 常见错误

| 错误 | 说明 |
|------|------|
| options 更新时不传已有选项的 id | 会被视为新选项，旧选项被删除，关联数据丢失 |
| options 更新时只传新增项 | 全量覆盖，旧选项全部丢失 |
| formula 字段尝试写入值 | 只读字段，record create/update 会报错 |
| linkedTableId 传表名而非 ID | 必须传 tableId（如 `tblXXX`），不接受表名 |
| progress 值写入 50 表示 50% | 实际应写入 0.5（range 0~1） |
| rating 值超出 max | 写入会报错 |
