Files
yuyueguahao/docs/api/v1/lead.md
T
2026-07-05 14:43:34 +08:00

114 lines
3.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Lead · 意向客户(Phase 3
> 自主问卷用户信息采集的统一入口,落到 `leads` 表,供管理后台跟进。
## 接口表
| Method | Path | 鉴权 | 说明 |
|---|---|---|---|
| POST | `/api/v1/leads` | - | 提交(小程序自测问卷、首页落地等) |
| GET | `/api/v1/leads/stats` | ✅ | 统计:总数 / 24h / 按 source 分组 |
| GET | `/api/v1/admin/leads` | ✅ | 列表,支持 phone / source / keyword / 时间过滤 |
| GET | `/api/v1/admin/leads/:id` | ✅ | 详情 |
| PUT | `/api/v1/admin/leads/:id/remark` | ✅ | 修改备注 |
| DELETE | `/api/v1/admin/leads/:id` | ✅ | 删除 |
## POST /api/v1/leads
**请求体**
```json
{
"name": "张三",
"phone": "13800138000",
"symptom": "便血近 1 周,伴有肛门坠胀",
"questionnaire": {
"total": 5,
"answers": { "0": "sometimes", "1": "no" },
"createdAt": "2026-06-14T08:30:00.000Z"
},
"source": "self-test",
"score": 5
}
```
**校验规则**
- `name` 必填,1-20 字符
- `phone` 必填,匹配 `^1[3-9]\d{9}$`
- `symptom` 可选,≤ 500 字
- `questionnaire` 必填,任意 JSON 对象
- `source` 可选,枚举 `self-test` / `home` / `appointment` / `other`,默认 `self-test`
- `score` 可选,0-100
**响应**
```json
{ "code": 0, "message": "提交成功", "data": { "id": "lead-1781398800000", "createdAt": "2026-06-14 16:30:00" } }
```
**错误码**
| HTTP | code | message |
|---|---|---|
| 400 | 1 | 姓名必填 / 姓名长度需在 1-20 字符 |
| 400 | 1 | 手机号必填 / 手机号格式不正确 |
| 400 | 1 | 症状描述不超过 500 字 |
| 400 | 1 | 问卷答案 questionnaire 必填且为对象 |
| 400 | 1 | source 仅支持:self-test / home / appointment / other |
| 400 | 1 | 该手机号在同渠道已提交过,请勿重复 |
| 500 | 500 | 服务器内部错误 |
## GET /api/v1/admin/leads
**Query**
- `phone` 手机号精确匹配
- `source` 渠道
- `keyword` 姓名模糊匹配
- `startDate` / `endDate` 时间范围(`YYYY-MM-DD`
- `limit` 默认 50,最大 200
- `offset` 默认 0
**响应**
```json
{
"code": 0,
"message": "ok",
"data": {
"list": [
{
"id": "lead-1781398800000",
"name": "张三",
"phone": "13800138000",
"symptom": "便血近 1 周",
"questionnaire": { "total": 5, "answers": {} },
"source": "self-test",
"score": 5,
"remark": "",
"createdAt": "2026-06-14 16:30:00",
"updatedAt": "2026-06-14 16:30:00"
}
],
"total": 1,
"limit": 50,
"offset": 0
}
}
```
## 数据表
```sql
CREATE TABLE leads (
id VARCHAR(32) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
phone VARCHAR(20) NOT NULL,
symptom TEXT,
questionnaire JSON NOT NULL,
source VARCHAR(20) NOT NULL DEFAULT 'self-test',
score INT DEFAULT 0,
remark VARCHAR(500),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uniq_phone_source (phone, source)
);
```
唯一约束 `(phone, source)`:同手机号在同一渠道只保留一条。