# 我的预约(专家)— 技术方案 > 依据:`我的预约(专家)功能需求.md`(同目录);关联 `我的预约(兽医)技术方案.md`、`我的预约(机构)技术方案.md` --- ## 1. 技术架构 | 项 | 说明 | | --- | --- | | **整体** | RuoYi **v3.9.2**(**springboot2** 分支)单体后端 + 若依 **Vue2** 管理端 | | **运行时** | JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid | | **数据库** | MySQL **5.7.39**,InnoDB,`utf8mb4` | | **专家资源** | `biz_tech_resource`(专家 `resource_type=004005`,`sys_user_id` 绑定登录用户,角色 **`exp`**) | | **预约数据** | 与兽医/机构共用 **`biz_service_appointment`**;评价 **`biz_service_appointment_review`**(专家独有) | | **移动端** | 预约 `INSERT`、取消、写评价由「预约服务」完成;本模块为**专家后台查询、接单、查评价** | **后端分层(专家模块)** | 层 | 职责 | | --- | --- | | `Controller` | 列表/详情/确认/拒绝/评价列表;`@PreAuthorize`;`AjaxResult` / `TableDataInfo` | | `Service` | 解析当前专家 `provider_id`、状态机、越权、拒绝理由校验、评价只读查询 | | `Mapper` + XML | 预约表 `provider_type=3`;评价表按 `appointment_id` | | `support` | `ExpertProviderResolver`、`ExpertAppointmentValidation`、`ExpertAppointmentStatusResolver`;复用 `ServiceAppointmentRules`(`diagnosis` 包) | **代码包(建议)**:`com.ruoyi.web.modules.farming`(与畜牧科技资源同域) **共用(兽医已建,跨包引用)**:`BizServiceAppointment`、`BizServiceAppointmentMapper`、`ServiceAppointmentRules`(`com.ruoyi.web.modules.diagnosis`) **初始化脚本**:`sql/biz_service_appointment.sql`(须已执行);`sql/biz_service_appointment_review.sql`(本期新增) --- ## 2. 关联方案设计(三端共用) ### 2.1 统一预约主表 `biz_service_appointment` | `provider_type` | 服务对象 | `provider_id` 指向 | 后台模块 | 移动端提交后 `status` | | --- | --- | --- | --- | --- | | `1` | 兽医 | `biz_medical_resource.id`(`resource_type=1`) | 我的预约(兽医) | `0` 待确认 | | `2` | 诊疗机构 | `biz_medical_resource.id`(`resource_type=3`) | 我的预约(机构) | `5` 已预约 | | **`3`** | **科技专家** | **`biz_tech_resource.id`(`resource_type=1`)** | **我的预约(专家)** | **`0` 待确认** | 专家与兽医**接单制、五态**一致;与机构**登记制、三态**隔离。 ### 2.2 状态枚举(库表 `status`) | 值 | 常量 | 专家/兽医展示 | 专家列表可筛 | 机构 | | --- | --- | --- | --- | --- | | `0` | `PENDING` | 待确认 | ✓ | — | | `1` | `CONFIRMED` | 已确认 | ✓ | — | | `2` | `REJECTED` | 已拒绝 | ✓ | — | | `3` | `CANCELLED` | 已取消 | ✓ | ✓ | | `4` | `COMPLETED` | 已完成 | ✓ | ✓ | | `5` | `BOOKED` | — | — | ✓(已预约) | 应用层:`provider_type=3` 时,`status` 仅允许 **`0~4`**;筛选 `5` 视为非法;列表**不得出现** `5`。 ### 2.3 三端接口对照 | 模块 | Base Path | 写操作 | 评价 | | --- | --- | --- | --- | | 兽医 | `/diseaseTreatment/myAppointment/vet` | 确认、拒绝 | 无 | | 机构 | `/diseaseTreatment/myAppointment/org` | 无 | 无 | | **专家(本文档)** | **`/techService/myAppointment/expert`** | **确认、拒绝** | **`GET .../reviewList/{id}`** | ### 2.4 当前登录人解析(专家) ```text loginUser.userId → biz_tech_resource WHERE sys_user_id = ? AND resource_type = 1 AND account_assigned = 1 AND del_flag = '0' → provider_id = id 列表/操作 WHERE provider_type = 3 AND provider_id = ? ``` 无绑定:列表返回空;写操作/详情越权返回「未绑定专家资源,无法查询预约」/「无法操作」。 **Mapper 扩展(与兽医 `selectVetResourceBySysUserId` 对称)** ```sql SELECT ... FROM biz_tech_resource WHERE sys_user_id = #{sysUserId} AND resource_type = 1 AND account_assigned = 1 AND del_flag = '0' LIMIT 1 ``` ### 2.5 专家与兽医/机构差异(实现约束) | 项 | 专家 | 兽医 | 机构 | | --- | --- | --- | --- | | 资源表 | `biz_tech_resource` | `biz_medical_resource` | `biz_medical_resource` | | 包路径 | `farming` | `diagnosis` | `diagnosis` | | 列表列 | 完整(含拒绝理由) | 完整 | 精简 | | 确认/拒绝 | ✓(`status=0`) | ✓ | — | | 评价子表 | ✓ | — | — | | 详情已完成 | 联查评价星级+综合评价 | 无评价区 | 无评价区 | 处置逻辑(确认/拒绝/状态机)**复用兽医实现模式**;评价为专家增量。 --- ## 3. 数据库设计 ### 3.1 复用表 `biz_service_appointment` 专家模块**不重复建预约主表**;字段与兽医方案一致。专家侧关心字段: | 字段 | 专家用途 | | --- | --- | | `provider_type` | 固定 `3` | | `provider_id` | `biz_tech_resource.id` | | `appointee_name`~`service_requirement` | 列表 + 详情 | | `status` | `0~4` | | `reject_reason` / `confirm_time` / `reject_time` | 拒绝/确认流程 | **DDL**:见 `sql/biz_service_appointment.sql`(已存在则无需重复执行)。 ### 3.2 新增表 `biz_service_appointment_review`(专家评价) | 字段 | 类型 | 非空 | 说明 | | --- | --- | --- | --- | | `id` | `bigint(20)` | Y | 主键 | | `appointment_id` | `bigint(20)` | Y | 关联 `biz_service_appointment.id` | | `reviewer_name` | `varchar(64)` | Y | 评价人姓名 | | `review_time` | `datetime` | Y | 评价时间 | | `punctuality_score` | `tinyint(4)` | Y | 到场准时(1~5 星) | | `attitude_score` | `tinyint(4)` | Y | 服务态度(1~5 星) | | `guidance_score` | `tinyint(4)` | Y | 指导效果(1~5 星) | | `summary` | `varchar(200)` | N | 综合评价(移动端 ≤100 字) | | `create_time` | `datetime` | N | 创建时间 | **索引**:`PRIMARY KEY (id)`;`KEY idx_appointment_id (appointment_id)`。 **DDL(MySQL 5.7)** ```sql CREATE TABLE IF NOT EXISTS `biz_service_appointment_review` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `appointment_id` bigint(20) NOT NULL COMMENT '预约ID', `reviewer_name` varchar(64) NOT NULL COMMENT '评价人姓名', `review_time` datetime NOT NULL COMMENT '评价时间', `punctuality_score` tinyint(4) NOT NULL COMMENT '到场准时1-5', `attitude_score` tinyint(4) NOT NULL COMMENT '服务态度1-5', `guidance_score` tinyint(4) NOT NULL COMMENT '指导效果1-5', `summary` varchar(200) DEFAULT NULL COMMENT '综合评价', `create_time` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_appointment_id` (`appointment_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务预约评价(专家)'; ``` **约定**:评价由移动端写入;后台**只读**;通常一条预约对应一条评价,表结构支持多条以便扩展。 ### 3.3 专家列表查询(Mapper XML 语义) ```sql WHERE provider_type = 3 AND provider_id = #{providerId} AND appointee_name LIKE concat('%', #{appointeeName}, '%') AND appoint_date >= #{startDate} AND appoint_date <= #{endDate} AND status = #{status} ORDER BY appoint_date DESC, create_time DESC, id DESC ``` **详情/越权**:`id` + `provider_type=3` + `provider_id=当前专家`。 **确认/拒绝更新**(与兽医对称,`provider_type=3`): ```sql -- 确认:status 0 → 1,写 confirm_time -- 拒绝:status 0 → 2,写 reject_reason、reject_time WHERE id = #{id} AND provider_type = 3 AND provider_id = #{providerId} AND status = 0 ``` **评价列表**: ```sql SELECT reviewer_name, review_time, summary, punctuality_score, attitude_score, guidance_score FROM biz_service_appointment_review WHERE appointment_id = #{appointmentId} ORDER BY review_time DESC, id DESC ``` 详情接口在 `status=4` 时可联查**最新一条**评价填充星级与 `summary`(或 Service 二次查询)。 --- ## 4. 接口设计(专家) 统一响应:RuoYi `AjaxResult` / `TableDataInfo`(`code`、`msg`、`data` / `rows`、`total`)。 **权限标识(示例)**:`techService:expertMyAppointment:list|query|confirm|reject|complete|reviewList` **Base Path(示例)**:`/techService/myAppointment/expert` | # | 说明 | Method | URI | 权限 | 要点 | | --- | --- | --- | --- | --- | --- | | 4.1 | 分页列表 | GET | `/list` | `...:list` | Query:`pageNum`(默认 1)、`pageSize`(默认 **20**)、`appointeeName`、`startDate`、`endDate`(`yyyy-MM-dd`)、`status`(**`0~4`**);**禁止**传 `providerId` | | 4.2 | 详情 | GET | `/{id}` | `...:query` | 校验归属;返回预约全字段 + `statusLabel`;**已完成**且存在评价时附带 `punctualityScore`、`attitudeScore`、`guidanceScore`、`summary`(及展示用星标文案可选) | | 4.3 | 确认接诊 | POST | `/confirm/{id}` | `...:confirm` | 前置 `status=0`;更新 `status=1`,`confirm_time` | | 4.4 | 拒绝接诊 | POST | `/reject/{id}` | `...:reject` | Body:`rejectReason`(必填 1~100 字);前置 `status=0`;更新 `status=2` | | 4.5 | 完成接诊 | POST | `/complete/{id}` | `...:complete` | 前置 `status=1`;更新 `status=4` | | 4.6 | 评价列表 | GET | `/reviewList/{id}` | `...:reviewList` | 前置预约 `status=4` 且归属当前专家;返回评价行列表 | ### 4.1 列表响应字段(建议) `id`、`appointeeName`、`appointDate`、`timeStart`、`timeEnd`、`contactPhone`、`serviceAddress`、`serviceRequirement`、`status`、`statusLabel`、`rejectReason`、`createTime`。 ### 4.2 详情 `data` 补充(已完成 + 有评价) | 字段 | 说明 | | --- | --- | | `punctualityScore` | 到场准时 1~5 | | `attitudeScore` | 服务态度 1~5 | | `guidanceScore` | 指导效果 1~5 | | `summary` | 综合评价全文 | 无评价:上述字段为空或不返回;前端展示「暂无评价」。 ### 4.3 评价列表 `rows[]` 字段 | 字段 | 说明 | | --- | --- | | `reviewerName` | 评价人姓名 | | `reviewTime` | 评价时间 | | `summary` | 综合评价 | | `punctualityScore` / `attitudeScore` / `guidanceScore` | 可选下发,供列表扩展列 | ### 4.4 拒绝 Body ```json { "rejectReason": "时段冲突无法接诊" } ``` 校验规则与兽医一致:trim 后 1~100 字。 ### 4.5 业务错误(`msg` 示例) | 场景 | 文案 | | --- | --- | | 日期筛选 | 结束日期不能早于开始日期 | | 状态筛选非法 | 状态筛选无效 | | 无专家绑定 | 未绑定专家资源,无法查询预约 / 无法操作 | | 越权 | 无权操作该预约记录 / 无权查看该预约记录 | | 非待确认 | 当前状态不允许确认接诊 / 当前状态不允许拒绝接诊 | | 已取消 | 该预约已取消,无法操作 | | 拒绝理由 | 请填写拒绝理由 / 拒绝理由不能超过 100 字 | | 评价 | 仅已完成预约可查看评价;暂无评价 | ### 4.6 三端接口差异(实现对照) | 能力 | 专家 | 兽医 | 机构 | | --- | --- | --- | --- | | 列表 | `GET .../expert/list` | `GET .../vet/list` | `GET .../org/list` | | 详情 | `GET .../expert/{id}` | `GET .../vet/{id}` | `GET .../org/{id}` | | 确认 | `POST .../expert/confirm/{id}` | `POST .../vet/confirm/{id}` | — | | 拒绝 | `POST .../expert/reject/{id}` | `POST .../vet/reject/{id}` | — | | 评价 | `GET .../expert/reviewList/{id}` | — | — | --- ## 5. 实现要点 | 项 | 说明 | | --- | --- | | 越权 | 所有 `id` 操作校验 `provider_type=3` 且 `provider_id=当前专家` | | 状态机 | 确认/拒绝仅 `status=0`;与兽医相同并发策略 | | 评价只读 | 无 POST/PUT 评价接口;`reviewList` 前校验预约已完成且归属 | | 串单防护 | `provider_type=3` 且 `status=5` 记日志并过滤或报错 | | 复用 | `ServiceAppointmentRules`、`VetAppointmentRejectBody` 可迁至公共包或 farming 内复制 `ExpertAppointmentRejectBody` | | 日志 | `@Log` 记录确认、拒绝;查看评价按平台惯例 | | 组件路径 | `techService/myAppointment/expert/index`(「牧业养殖科技服务」目录下) | **建议新增类(专家)** | 类 | 职责 | | --- | --- | | `BizTechResourceMapper.selectExpertResourceBySysUserId` | 解析 `provider_id` | | `BizServiceAppointmentMapper` 扩展 | `selectExpertAppointmentList`、`selectExpertAppointmentByIdAndProvider`、`updateConfirmExpertAppointment`、`updateRejectExpertAppointment` | | `BizServiceAppointmentReview` + Mapper | 评价实体与查询 | | `ExpertMyAppointmentServiceImpl` + `BizExpertMyAppointmentController` | 业务与 HTTP | | `ExpertAppointmentValidation` / `ExpertAppointmentStatusResolver` | 校验与标签(五态,同兽医) | --- ## 6. 与上下游衔接 | 系统 | 说明 | | --- | --- | | 移动端预约服务 | `INSERT`:`provider_type=3`,`status=0` | | 移动端取消 | `status=3` | | 移动端写评价 | `INSERT` `biz_service_appointment_review`(预约须 `status=4`) | | 已完成 | 业务闭环置 `status=4` 后用户方可评价 | | 畜牧科技资源管理 | 专家已发布且分配账号(`role_key=exp`) | | 我的预约(兽医/机构) | 同表不同 `provider_type`;列表互不可见 | --- ## 7. 菜单与权限(示例) | 类型 | 名称 | 权限标识 | | --- | --- | --- | | 菜单 | 我的预约(专家) | `techService:expertMyAppointment:list` | | 按钮 | 查询 | `techService:expertMyAppointment:query` | | 按钮 | 确认接诊 | `techService:expertMyAppointment:confirm` | | 按钮 | 拒绝接诊 | `techService:expertMyAppointment:reject` | | 按钮 | 完成接诊 | `techService:expertMyAppointment:complete` | | 按钮 | 查看评价 | `techService:expertMyAppointment:reviewList` | --- ## 8. 交付清单 - [ ] `sql/biz_service_appointment_review.sql` - [ ] `BizTechResourceMapper.selectExpertResourceBySysUserId` - [ ] `BizServiceAppointmentMapper` 专家查询/更新 + XML(`provider_type=3`) - [ ] `BizServiceAppointmentReview` + Mapper + XML - [ ] `ExpertMyAppointmentController` + Service + 校验/状态解析 - [ ] 菜单权限 SQL(专家) - [ ] 单元测试 + MockMvc(列表 scope、确认、拒绝、评价、越权) --- ## 9. 修订记录 | 版本 | 说明 | | --- | --- | | 1.0 | 初稿:共用预约主表;新增评价表;专家接口与兽医对齐并扩展 reviewList;三端关联与 farming 包定位 |