feat: 新增用车需求服务及线索管理全功能
- 新增后台用车服务配置模块,支持维护服务简介、优势与使用流程 - 新增需求线索管理页面,支持筛选、查看与更新用车线索状态 - 新增小程序用车需求页面,优化登录路径与回跳逻辑 - 优化车型卡片跳转与用车需求提交功能 - 新增服务端API与数据处理逻辑,完善权限校验 - 更新全站配置与API文档,新增相关测试用例
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
6. `concierge-api.md`
|
||||
7. `detail-api.md`
|
||||
8. `team-building-api.md`
|
||||
9. `module-config-api.md`
|
||||
9. `module-config-api.md`(用车服务配置与需求线索)
|
||||
|
||||
MiniAPP 前台开发:
|
||||
|
||||
|
||||
@@ -52,7 +52,8 @@ type SiteModule =
|
||||
| "demandHero"
|
||||
| "demandFeatureCards"
|
||||
| "demandForm"
|
||||
| "vehicleOptions";
|
||||
| "vehicleOptions"
|
||||
| "vehicleService";
|
||||
```
|
||||
|
||||
模块职责:
|
||||
@@ -65,9 +66,18 @@ type SiteModule =
|
||||
| `demandFeatureCards` | `title`、`description`、`isActive`、`sortOrder` | 可新增、编辑、删除、排序 |
|
||||
| `demandForm` | 表单标签、占位文案、`chips`、`isActive` | 单例,不支持排序 |
|
||||
| `vehicleOptions` | `title`、`description`、`image`、`isActive`、`sortOrder` | 可新增、编辑、删除、排序 |
|
||||
| `vehicleService` | `introTitle`、`intro`、`serviceSections`、`advantages`、`processSteps`、`isActive` | 单例,维护用车需求页说明 |
|
||||
|
||||
`GET /api/admin/site-config` 返回以上全部模块,包含停用内容,空模块返回 `[]`。
|
||||
|
||||
`vehicleService` 为单例配置,`serviceSections` 和 `processSteps` 的每项为 `{ title, description }`,`advantages` 为字符串数组。Admin UI 以每行一项编辑并在保存前去除空行。
|
||||
|
||||
## 用车需求线索
|
||||
|
||||
`GET /api/admin/leads?leadType=vehicle` 只返回用车线索,可叠加 `status`、`keyword` 和 `take` 筛选。用车线索的 `vehicleDemand` 保留服务类型、日期、地点、人数、行李和车型快照,运营端只负责查看和跟进,不提供车辆库存、排班、计价或订单操作。
|
||||
|
||||
`PATCH /api/admin/leads/{id}/status` 使用现有状态:`new`、`assigned`、`contacted`、`planning`、`won`、`invalid`。状态变更写入审计日志并返回更新后的线索对象。
|
||||
|
||||
## 登录与工作台
|
||||
|
||||
### 登录
|
||||
|
||||
@@ -89,6 +89,14 @@ MiniAPP 联调重点:
|
||||
- 线索提交调用 `POST /api/public/leads`,失败时显示可理解错误。
|
||||
- 首页、玩法、路线详情、管家、团队共创和客片案例请求都由公共 API 层解包 `data`,页面不重复解包。
|
||||
|
||||
## 用车需求三端联调
|
||||
|
||||
1. 在 Admin UI 首页模块的“用车服务”中维护板块简介、服务说明、优势和使用流程;在“万趣用车”中维护可选车型。
|
||||
2. 启动 MiniAPP 后点击车型卡片,确认进入 `/pages/vehicle-demand?vehicleOptionId={id}`;未登录时走现有微信登录并回跳原页面。
|
||||
3. 登录后提交用车需求,确认 `POST /api/public/leads` 携带 `leadType=vehicle`、`vehicleDemand` 和客户 JWT;后端从 JWT 写入 `customerId`,并归一化目的地、日期和人数摘要。
|
||||
4. Admin UI 进入“需求线索”,默认筛选 `leadType=vehicle`,确认联系人、日期、地点、人数、行李、车型快照和备注可查看,并可更新既有线索状态。
|
||||
5. 停止 Public API 时确认 MiniAPP 仍显示本地用车服务文案,并保留表单错误和重试提示;不展示实时库存、价格、支付或订单状态。
|
||||
|
||||
## 路线详情三端联调
|
||||
|
||||
路线详情使用独立 `DetailRecord`,不修改 `WanfaRoute` 表结构,也不建立商品、订单或预订关联。联调顺序如下:
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
| `DELETE` | `/api/admin/site-config/{module}/{id}` | 删除模块项 |
|
||||
| `PATCH` | `/api/admin/site-config/{module}/reorder` | 按完整 ID 列表排序 |
|
||||
|
||||
允许的 `module`:`heroSlides`、`destinationHero`、`demandHero`、`demandFeatureCards`、`demandForm`、`vehicleOptions`。
|
||||
允许的 `module`:`heroSlides`、`destinationHero`、`demandHero`、`demandFeatureCards`、`demandForm`、`vehicleOptions`、`vehicleService`。
|
||||
|
||||
## 响应约定
|
||||
|
||||
@@ -30,7 +30,8 @@
|
||||
"demandHero": [],
|
||||
"demandFeatureCards": [],
|
||||
"demandForm": [],
|
||||
"vehicleOptions": []
|
||||
"vehicleOptions": [],
|
||||
"vehicleService": []
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -55,4 +56,5 @@
|
||||
- `sortOrder` 为从 `0` 开始的非负整数,后端负责重新规范化。
|
||||
- 图片字段保存最终 HTTP(S) URL,不接受 base64。
|
||||
- `demandForm` 为单例模块,不执行无意义的排序。
|
||||
- `vehicleService` 为单例用车服务配置,不支持排序;`serviceSections`、`processSteps` 使用 `{title, description}` 数组,`advantages` 使用字符串数组。
|
||||
- 站点模块只负责站点配置;首页内容、玩法、详情、管家和客片案例使用各自领域文档。
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
## 站点配置
|
||||
|
||||
`GET /api/public/site-config` 返回以下稳定数组字段:
|
||||
`GET /api/public/site-config` 返回以下稳定字段:
|
||||
|
||||
```ts
|
||||
type SiteConfig = {
|
||||
@@ -40,11 +40,51 @@ type SiteConfig = {
|
||||
demandHero: DemandHero[];
|
||||
demandFeatureCards: DemandFeatureCard[];
|
||||
demandForm: DemandForm[];
|
||||
vehicleService: VehicleService | null;
|
||||
};
|
||||
|
||||
type VehicleService = {
|
||||
id: string;
|
||||
introTitle: string;
|
||||
intro: string;
|
||||
serviceSections: Array<{ title: string; description: string }>;
|
||||
advantages: string[];
|
||||
processSteps: Array<{ title: string; description: string }>;
|
||||
};
|
||||
```
|
||||
|
||||
Public 响应只返回启用内容,其余模块按 `isActive` 过滤。
|
||||
|
||||
`vehicleService` 是用车需求页的启用单例配置;未配置或停用时返回 `null`,MiniAPP 使用本地安全文案兜底,不代表实时库存、价格或订单承诺。
|
||||
|
||||
### 用车需求提交
|
||||
|
||||
`POST /api/public/leads` 的通用线索仍允许游客提交;`leadType=vehicle` 必须携带客户 JWT。服务端从 JWT 写入 `customerId`,客户端不得传入该字段。
|
||||
|
||||
```json
|
||||
{
|
||||
"leadType": "vehicle",
|
||||
"contactName": "联系人",
|
||||
"phone": "13800000000",
|
||||
"sourcePage": "home-vehicle",
|
||||
"vehicleDemand": {
|
||||
"serviceType": "charter",
|
||||
"charterDuration": "fullDay",
|
||||
"travelDate": "2026-08-25",
|
||||
"pickupTime": "09:00",
|
||||
"pickupLocation": "贵阳北站",
|
||||
"dropoffLocation": "黄果树景区",
|
||||
"peopleCount": 5,
|
||||
"luggageCount": 3,
|
||||
"vehicleOptionId": "vehicle-option-uuid",
|
||||
"vehicleOptionTitle": "多人商务车",
|
||||
"specialRequirements": "需要儿童座椅"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
服务端从 `vehicleDemand` 归一化 `destination`、`travelDate` 和 `peopleCount` 摘要字段。未登录、参数不完整或服务异常分别返回 `401`、`422`、`500`,失败时 `data` 为 `null`。
|
||||
|
||||
## 玩法展示
|
||||
|
||||
### `GET /api/public/wanfa/categories`
|
||||
|
||||
Reference in New Issue
Block a user