> **前置条件** — 执行以下任何命令前，请先确认已完成认证。如未认证，参见 [`../../shb-shared/SKILL.md`](../../shb-shared/SKILL.md)。

# shb-cli task review

工单**回访 / 满意度**数据查询。回访列表走的是独立的回访端点，比通用 `task search` 多出回访状态、满意度、客户评价、满意度问卷答案等数据。

> **只读**：CLI 只提供回访数据的查询能力。**不支持**提交回访、暂存回访、发送回访短信（涉及审批链路与客户触达，未纳入 CLI）。用户提出这类需求时，请说明需到 PC 端操作。

## 两套回访模型

| `--review-type` | 名称 | 含义 | 生效的状态过滤 |
|---|---|---|---|
| `1`（默认） | 人工回访 | 客服/回访人员逐单电话回访并登记结果 | `--is-review` |
| `2` | 自动回访（客户评价） | 系统发出评价邀请，由客户自行评价 | `--is-evaluate` |

**两者互斥**：`--review-type 1` 时只发送 `isReview`，`--review-type 2` 时只发送 `isEvaluate`；默认列也随之切换成两套不同的列。

## 子命令

### 1. `review init` —— 租户回访开关 + 回访列表可选的工单类型

```bash
shb-cli task review init --format-data
shb-cli task review init --format-data -o table
```

返回两部分：

- **租户级开关** `reviewOn` / `autoReviewOn`：表示**是否存在任一**工单类型启用了人工回访 / 自动回访。这是租户维度的，**不是**某个工单类型的开关。为 `false` 时对应的回访列表在 PC 上整个不可用。
- **`taskTypeList`**：回访列表的工单类型筛选项。后端返回的是**一份共用的扁平列表**，人工回访和客户评价两个 tab 用的是同一份，且**不带逐类型的回访开关**。

> ⚠️ 因此 `review init` **无法**回答「某个工单类型走的是人工回访还是客户评价」。想知道某个工单实际走了哪种，看 `review search` 结果里的「回访状态」（人工）/「评价状态」（客户评价）列；想知道某类型是否有人工回访数据，用 `review search --template-id <id> --review-type 1 --is-review 2` 看是否有数据（注意：**没有数据不等于没开回访**，只是该类型下暂无符合条件的工单）。逐类型的回访开关只存在于工单类型的流程配置 `flowSetting.review.state` / `flowSetting.autoReview.state`，当前 CLI 没有可用的只读端点覆盖它。
>
> 若后端将来在 `taskTypeList` 里带上 `flowSetting`，本命令会自动多出「人工回访 / 自动回访」两列。

> 不加 `--format-data` 会输出完整原始配置（很大），仅在需要看星级项/服务标签等细节时使用。

### 2. `review search` —— 查回访工单

```bash
# 人工回访：未回访的工单
shb-cli task review search --review-type 1 --is-review 0 --format-data -o table

# 人工回访：指派给我的
shb-cli task review search --review-type 1 --is-review 5 --format-data

# 客户评价：已评价 + 不满意
shb-cli task review search --review-type 2 --is-evaluate 1 --degree 不满意 --format-data

# 指定工单类型（问卷答案要以中文题目呈现时必须带上）
shb-cli task review search --template-id <templateId> --format-data -o json

# 时间范围 + 全量
shb-cli task review search --review-type 1 --review-time-start 2026-01-01 --review-time-end 2026-01-31 --all --format-data
```

### 3. `review fields --template-id <id>` —— 满意度问卷字段定义

```bash
shb-cli task review fields --template-id <templateId> --format-data -o table
```

返回该工单类型的满意度问卷题目定义（字段名/字段文案/字段类型/是否必填/排序）。与 `task field list` 一样，这是**少数可以正当展示 `fieldName` 的地方**（用于排查问卷题目对不上时）。返回为空 ⇒ 该租户未使用满意度问卷，走旧的星级+满意度模型。

### 4. `review dynamic --task-id <id>` —— 单工单回访动态

```bash
shb-cli task review dynamic --task-id <taskId> --format-data -o table
```

输出「时间 / 操作人 / 动作 / 回访项 / 原值 / 新值」。动作为「暂存」表示回访未完成、只是暂存了一次填写。

## 参数枚举

| flag | 值 | 含义 |
|---|---|---|
| `--review-type` | `1` / `2` | 人工回访 / 自动回访（客户评价），默认 `1` |
| `--is-review` | `0` / `1` / `2` / `3` / `5` | 未回访 / 已回访 / 全部（默认） / 跟进中 / **指派给我**；**仅 `--review-type 1` 生效** |
| `--is-evaluate` | `0` / `1` / `2` | 未评价 / 已评价 / 全部（默认）；**仅 `--review-type 2` 生效** |
| `--degree` | `非常满意` `满意` `一般` `不满意` `非常不满意` | 满意度，中文字面量，传其它值会直接报错 |
| `--survey-mode` | `auto`（默认） / `on` / `off` | 满意度问卷模式判定；`auto` 按「问卷字段接口返回非空」自动判断，误判时可强制 |

其它：`--keyword`、`--template-id`、`--state`、`--page`（从 1 开始）、`--page-size`、`--review-user`、`--balance-user`、`--review-time-start/end`、`--evaluation-time-start/end`、`--all`、`--data`/`--file`、`--format-data`/`--fields`/`--include-raw`。

- **`--review-user` / `--balance-user` 传的是 userId，不是姓名**。拿不到 userId 就不要猜，先与用户确认或改用其它过滤条件。
- 时间参数支持 `2026-01-01`、`2026-01-01 09:30:00` 或毫秒时间戳；`--*-end` 传日期时自动补到当日 23:59:59。

## 典型链路

```bash
# 1. 先确认租户开没开回访，并拿到回访列表可选的工单类型
shb-cli task review init --format-data

# 2. 从结果中取目标类型的 id（= templateId，内部用，不展示给用户）

# 3. 按类型查回访数据（带 templateId 才能拿到该类型的问卷题目中文列）
shb-cli task review search --template-id <id> --review-type 1 --is-review 0 --format-data -o table
```

## 输出字段速查

### 人工回访（`--review-type 1`）默认列

| 字段 | 说明 |
|------|------|
| `taskNo` / `templateName` / `state` | 工单编号 / 工单类型 / 工单状态（中文） |
| `customer` / `tlmName` / `tlmPhone` / `taddress` | 客户 / 联系人 / 电话 / 客户地址 |
| `product` / `executorName` / `description` | 产品 / 负责人 / 描述 |
| `completeTime` | 工单完成时间 |
| `reviewState` | 回访状态：`已回访` / `未回访` / `跟进中`（三态，不是布尔） |
| `reviewUser` | 回访人姓名 |
| `degree` | 满意度，值本身即中文 |
| `reviewTime` | 回访时间 |
| `suggestion` | 回访备注 |
| `tagEvaluates` | 服务标签，多个以顿号分隔 |

### 自动回访 / 客户评价（`--review-type 2`）默认列

| 字段 | 说明 |
|------|------|
| （前段同上：编号/类型/状态/客户/联系人/产品/负责人/完成时间/描述） | |
| `evaluationTime` | 客户评价时间 |
| `evaState` | 评价状态：`已评价` / `未评价` |
| `evaDegree` | 满意度（与人工回访的 `degree` 同源） |
| `evaContent` | 客户评价文本 |
| `tagEvaluates` | 服务标签 |

### 满意度扩展列

- **问卷租户**：`degree` / `evaDegree` / `tagEvaluates` 三列被隐藏，取而代之的是该工单类型的**问卷题目中文列**（如「服务是否及时」）。
- **旧星级租户**：追加 `starEvaluate1..N` 列，列名即星级项名称（如「服务态度」），值为星数。

## 注意事项

- **问卷模式判定是启发式的**：CLI 无法读取 PC 端的灰度开关，只能按「问卷字段接口是否返回内容」推断。若发现满意度/服务标签列被错误隐藏，加 `--survey-mode off`；若问卷题目没出来，加 `--survey-mode on` 并确认带了 `--template-id`。
- **问卷题目没有中文名**（只出现 `field_xxx`）通常说明该租户走的是旧星级模型，或没传 `--template-id`。**绝不要把 `field_xxx` 这类字段名抛给用户**。
- **「满意度不高」不是一个查询条件**：`--degree` 一次只接受一个值，需分别查 `不满意` 与 `非常不满意` 两次再合并汇总。
- `suggestion`（回访备注）可能包含 PC 端会剥离的 `@某人` 原始标记，CLI 原样输出，复述给用户时按普通文本处理即可。
- 列表为空时先用 `review init` 确认该租户/类型是否真的启用了回访，再排查过滤条件。
- 部分列（服务类型/服务内容/紧急程度等）受租户字段设置控制，未启用时为空值属正常现象。
