# 预约服务（移动端）

## 1. 概述

| 项 | 说明 |
| --- | --- |
| Base Path | `/app/bookingService` |
| 资源视图 | `v_appointment_resource`（DDL：`sql/biz_v_appointment_resource.sql`） |
| 视图依赖 | `biz_tech_resource.expert_rating`（见 `sql/biz_tech_resource_alter_expert_rating.sql`） |
| 预约主表 | `biz_service_appointment` |
| 专家评价 | `biz_service_appointment_review` |
| 鉴权 | 需登录 |

**Tab 与资源类型**（列表 `resourceType` 必传）：

| Tab | `resourceType` |
| --- | --- |
| 兽医（默认） | `004001` |
| 专家 | `004005` |
| 诊疗机构 | `004003` |

**资料页**：列表项已返回详情字段，**无单独详情接口**。

### 1.1 视图 `v_appointment_resource` 列说明

| 视图列 | 兽医 `004001` | 机构 `004003` | 专家 `004005` |
| --- | --- | --- | --- |
| `photo_file_url` | `biz_medical_resource.photo_file_url` | 同左 | `biz_tech_resource.photo_file_url` |
| `max_daily_appointments` | 有值（机构）/ 兽医多为 NULL | 有值 | NULL |
| `expert_rating` | NULL | NULL | `biz_tech_resource.expert_rating` |

其余列三端同源字段名一致（名称、介绍、地址、服务时段等）。

**提交后状态**：

| 类型 | 初始 `status` |
| --- | --- |
| 兽医、专家 | `0` 待确认 |
| 诊疗机构 | `5` 已预约 |

---

## 2. 近 7 日日期条

`GET /app/bookingService/dates`

自**当天**起连续 7 天（含当天）。

**响应 `data[]`**

| 字段 | 说明 |
| --- | --- |
| `weekdayName` | 周几（如「周一」） |
| `weekday` | 数字：周一=1 … 周日=7 |
| `dateMmDd` | 日期 `MM-dd` |
| `appointDate` | 日期 `yyyy-MM-dd`（提交预约用） |

---

## 3. 可预约资源列表

`GET /app/bookingService/resource/list`

| 参数 | 必填 | 说明 |
| --- | --- | --- |
| `resourceType` | **是** | `004001` / `004005` / `004003` |
| `resourceName` | 否 | 名称模糊 |
| `weekday` | 否 | 周几 1～7；传入时仅返回 `service_weekdays` 含该值的资源 |
| `pageNum` | 否 | 默认 1 |
| `pageSize` | 否 | 默认 10，最大 50 |

**响应**：`TableDataInfo`，`rows[]` 字段（与视图列一一对应，驼峰）：

| 字段 | 说明 |
| --- | --- |
| `id` | 资源主键 |
| `resourceType` | `004001` / `004003` / `004005` |
| `resourceName` | 名称 |
| `photoFileUrl` | 主图/头像 URL |
| `affiliatedUnit` | 隶属单位 |
| `contactPhone` | 联系电话 |
| `introduction` | 介绍 |
| `detailAddress` | 详细地址 |
| `serviceStartTime` / `serviceEndTime` | 服务时段 `HH:mm` |
| `serviceArea` | 服务区域 |
| `feeStandard` | 收费标准 |
| `serviceWeekdays` | 服务周日 `1`～`7`，逗号分隔 |
| `maxDailyAppointments` | 单日最大预约数（机构常见有值） |
| `expertRating` | 专家评分（仅专家） |
| `sysUserId` / `assignedLoginName` | 已分配账号信息 |
| `publishTime` | 发布时间 |

排序：`publish_time` 降序。

---

## 4. 专家历史评价

`GET /app/bookingService/expert/{expertResourceId}/reviews`

| 参数 | 必填 | 说明 |
| --- | --- | --- |
| `expertResourceId` | 是 | 路径：专家资源 `id`（`004005`） |
| `pageNum` | 否 | 页码，默认 1 |
| `pageSize` | 否 | 每页条数，默认 10，最大 50 |

**响应 `rows[]`**

| 字段 | 说明 |
| --- | --- |
| `reviewerName` | 评价人 |
| `reviewTime` | 评价时间 |
| `punctualityScore` | 到场准时（1～5） |
| `attitudeScore` | 服务态度（1～5） |
| `guidanceScore` | 指导效果（1～5） |
| `summary` | 综合评价 |

按 `reviewTime` 倒序。

---

## 5. 所选日期是否已预约

`GET /app/bookingService/appointment/booked`

用于资料页选择预约日期后，判断**当前登录用户**在该服务方、该日是否已有有效预约。

| 参数 | 必填 | 说明 |
| --- | --- | --- |
| `providerType` | **是** | `1` 兽医 / `2` 机构 / `3` 专家 |
| `providerId` | **是** | 服务方资源 `id`（与列表 `id` 一致） |
| `appointDate` | **是** | `yyyy-MM-dd` |

**响应 `data`**

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `booked` | boolean | `true` 表示当日已有有效预约 |

**有效预约**：`create_by` 为当前用户，且 `status` 不为 `2`（已拒绝）、`3`（已取消）。

---

## 6. 提交预约

`POST /app/bookingService/appointment`

**Body（JSON）**

| 字段 | 必填 | 说明 |
| --- | --- | --- |
| `resourceType` | 是 | `004001` / `004005` / `004003` |
| `resourceId` | 是 | 资源 `id` |
| `appointDate` | 是 | `yyyy-MM-dd` |
| `appointeeName` | 是 | 预约人 |
| `contactPhone` | 是 | 手机号 |
| `timeSlot` | 二选一 | 如 `08:00~10:00` |
| `timeStart` / `timeEnd` | 二选一 | `HH:mm` |
| `serviceAddress` | 是 | 服务地址 |
| `serviceRequirement` | 否 | 服务需求 |

**响应 `data`**：新建预约主键 `id`。

**校验**：

- 资源须在视图中存在且已发布；
- 预约日须在 `serviceWeekdays` 内（有配置时）；
- 机构且配置了 `maxDailyAppointments` 时，当日有效预约数（非已拒绝/已取消）未满。

**失败示例**：「预约对象不存在或未发布」「所选日期不在服务日内」「该机构当日预约已满」。

---

## 7. 界面参考

`doc/app/预约服务/Snipaste_2026-05-24_10-52-44.jpg`  
`doc/app/预约服务/Snipaste_2026-05-24_13-55-00.jpg`  
`doc/app/预约服务/Snipaste_2026-05-24_13-56-00.jpg`

（专家评价样式可参考 `doc/app/在线问诊/` 下星级展示图。）
