feat: 新增用车需求服务及线索管理全功能

- 新增后台用车服务配置模块,支持维护服务简介、优势与使用流程
- 新增需求线索管理页面,支持筛选、查看与更新用车线索状态
- 新增小程序用车需求页面,优化登录路径与回跳逻辑
- 优化车型卡片跳转与用车需求提交功能
- 新增服务端API与数据处理逻辑,完善权限校验
- 更新全站配置与API文档,新增相关测试用例
This commit is contained in:
duanshuwen
2026-08-22 21:48:08 +08:00
parent b7a81964c9
commit d42f69bd47
36 changed files with 1290 additions and 33 deletions

View File

@@ -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 前台开发:

View File

@@ -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`。状态变更写入审计日志并返回更新后的线索对象。
## 登录与工作台
### 登录

View File

@@ -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` 表结构,也不建立商品、订单或预订关联。联调顺序如下:

View File

@@ -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` 使用字符串数组。
- 站点模块只负责站点配置;首页内容、玩法、详情、管家和客片案例使用各自领域文档。

View File

@@ -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`