# 我的预约(兽医)— 技术方案 > 依据:`我的预约(兽医)功能需求.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_medical_resource`(兽医 `resource_type=1`,`sys_user_id` 绑定登录用户) | | **移动端** | 预约写入由「预约服务」App 接口完成(可另包实现);本模块为**兽医后台**查询与接单 | **后端分层(兽医模块)** | 层 | 职责 | | --- | --- | | `Controller` | 列表/详情/确认/拒绝;`@PreAuthorize`;`AjaxResult` / `TableDataInfo` | | `Service` | 解析当前兽医 `provider_id`、状态机、越权校验、拒绝理由校验 | | `Mapper` + XML | 统一预约表按 `provider_type=1` + `provider_id` 查询 | | `support` | `VetAppointmentRules`、`VetAppointmentValidation`;可复用公共 `AppointmentStatus` 枚举 | **代码包(建议)**:`com.ruoyi.web.modules.diagnosis`(与畜牧医疗资源同域) **公共预约域(建议)**:`com.ruoyi.web.modules.appointment`(枚举、实体、Mapper,供兽医/机构/专家三端复用) **初始化脚本**:`sql/biz_service_appointment.sql`(统一表);专家评价表见 **§2.2** --- ## 2. 关联方案设计(三端共用) ### 2.1 统一预约主表 `biz_service_appointment` 移动端「预约服务」提交时写入**同一张表**,用 `provider_type` + `provider_id` 区分服务对象;三端后台**仅查询各自范围**,互不交叉。 | `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` 校验状态合法性(机构不得出现 `0/1/2`;兽医不得出现 `5`)。 ### 2.3 三端接口与权限前缀(摘要) | 模块 | Base Path(示例) | 写操作 | | --- | --- | --- | | 兽医(本文档) | `/diseaseTreatment/myAppointment/vet` | 确认、拒绝 | | 机构 | `/diseaseTreatment/myAppointment/org` | 无(仅 list/query) | | 专家 | `/techService/myAppointment/expert` | 确认、拒绝;评价 list(已完成) | ### 2.4 当前登录人解析(兽医) ```text loginUser.userId → biz_medical_resource WHERE sys_user_id = ? AND resource_type = 1 AND account_assigned = 1 AND del_flag = '0' → provider_id = id 列表/操作 WHERE provider_type = 1 AND provider_id = ? ``` 无绑定记录时:列表返回空;确认/拒绝返回「未绑定兽医资源,无法操作」。 ### 2.5 专家评价表(仅专家模块,兽医不涉及) 表 `biz_service_appointment_review`(`appointment_id` FK,`reviewer_name`,`review_time`,`summary`,可选星级字段);兽医本期**无**评价查询接口。详见专家技术方案(待编)。 --- ## 3. 数据库设计 ### 3.1 表 `biz_service_appointment`(服务预约主表) | 字段 | 类型 | 非空 | 默认 | 说明 | | --- | --- | --- | --- | --- | | `id` | `bigint(20)` | Y | 自增 | 主键 | | `provider_type` | `tinyint(4)` | Y | — | 1兽医 2机构 3专家 | | `provider_id` | `bigint(20)` | Y | — | 医疗资源/科技资源主键 | | `appointee_name` | `varchar(64)` | Y | — | 预约人姓名 | | `appoint_date` | `date` | Y | — | 预约日期 | | `time_start` | `varchar(8)` | Y | — | 时段开始 `HH:mm` | | `time_end` | `varchar(8)` | Y | — | 时段结束 `HH:mm` | | `contact_phone` | `varchar(20)` | Y | — | 联系电话 | | `service_address` | `varchar(200)` | Y | — | 服务地址 | | `service_requirement` | `varchar(500)` | N | NULL | 服务需求 | | `status` | `tinyint(4)` | Y | — | 见 **§2.2** | | `reject_reason` | `varchar(200)` | N | NULL | 拒绝理由(已拒绝时) | | `confirm_time` | `datetime` | N | NULL | 确认接诊时间(审计) | | `reject_time` | `datetime` | N | NULL | 拒绝时间(审计) | | `create_by` | `varchar(64)` | N | — | 若依惯例(多为移动端用户标识) | | `create_time` | `datetime` | N | — | 提交时间 | | `update_by` | `varchar(64)` | N | — | 若依惯例 | | `update_time` | `datetime` | N | — | 若依惯例 | | `remark` | `varchar(500)` | N | NULL | 备注 | **索引**:`PRIMARY KEY (id)`;`KEY idx_provider (provider_type, provider_id)`;`KEY idx_appoint_date (appoint_date)`;`KEY idx_status (status)`;`KEY idx_create_time (create_time)`。 **DDL(MySQL 5.7)** ```sql CREATE TABLE `biz_service_appointment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `provider_type` tinyint(4) NOT NULL COMMENT '1兽医2机构3专家', `provider_id` bigint(20) NOT NULL COMMENT '服务方资源ID', `appointee_name` varchar(64) NOT NULL COMMENT '预约人', `appoint_date` date NOT NULL COMMENT '预约日期', `time_start` varchar(8) NOT NULL COMMENT '开始HH:mm', `time_end` varchar(8) NOT NULL COMMENT '结束HH:mm', `contact_phone` varchar(20) NOT NULL COMMENT '联系电话', `service_address` varchar(200) NOT NULL COMMENT '服务地址', `service_requirement` varchar(500) DEFAULT NULL COMMENT '服务需求', `status` tinyint(4) NOT NULL COMMENT '0待确认1已确认2已拒绝3已取消4已完成5已预约', `reject_reason` varchar(200) DEFAULT NULL COMMENT '拒绝理由', `confirm_time` datetime DEFAULT NULL COMMENT '确认时间', `reject_time` datetime DEFAULT NULL COMMENT '拒绝时间', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`), KEY `idx_provider` (`provider_type`,`provider_id`), KEY `idx_appoint_date` (`appoint_date`), KEY `idx_status` (`status`), KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务预约主表'; ``` ### 3.2 列表查询条件(兽医 XML 片段语义) ```sql WHERE provider_type = 1 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 ``` 操作前须 `SELECT ... FOR UPDATE` 或乐观校验:`id` + `provider_type=1` + `provider_id=当前兽医` + `status=0`。 --- ## 4. 接口设计(兽医) 统一响应:RuoYi `AjaxResult` / `TableDataInfo`(`code` / `msg` / `data`)。 **权限标识(示例)**:`diseaseTreatment:vetMyAppointment:list|query|confirm|reject|complete` **Base Path(示例)**:`/diseaseTreatment/myAppointment/vet` | # | 说明 | 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` | 校验归属当前兽医;返回全字段含 `rejectReason`、`status` 展示名 | | 4.3 | 确认接诊 | POST | `/confirm/{id}` | `...:confirm` | 前置 `status=0`;更新 `status=1`,`confirm_time=now()`,`update_by` | | 4.4 | 拒绝接诊 | POST | `/reject/{id}` | `...:reject` | Body:`rejectReason`(必填 1~100 字);前置 `status=0`;更新 `status=2`,写 `reject_reason`、`reject_time` | | 4.5 | 完成接诊 | POST | `/complete/{id}` | `...:complete` | 前置 `status=1`(已确认);更新 `status=4`(已完成);写 `update_by`、`update_time` | ### 4.1 列表响应字段(示例) `id`、`appointeeName`、`appointDate`、`timeStart`、`timeEnd`、`contactPhone`、`serviceAddress`、`serviceRequirement`、`status`、`statusLabel`、`canComplete`、`rejectReason`、`createTime`。 前端展示时段:`timeStart + '~' + timeEnd`。 ### 4.2 业务错误(`msg` 示例) | 场景 | 文案 | | --- | --- | | 无兽医绑定 | 未绑定兽医资源,无法查询预约 | | 越权 | 无权操作该预约记录 | | 非待确认确认/拒绝 | 当前状态不允许确认接诊 / 当前状态不允许拒绝接诊 | | 拒绝理由 | 请填写拒绝理由 / 拒绝理由不能超过 100 字 | | 日期筛选 | 结束日期不能早于开始日期 | ### 4.3 机构 / 专家接口差异(关联实现时对照) | 能力 | 兽医 URI | 机构 URI | 专家 URI | | --- | --- | --- | --- | | 列表 | `.../vet/list` | `.../org/list` | `.../expert/list` | | 详情 | `.../vet/{id}` | `.../org/{id}` | `.../expert/{id}` | | 确认 | `POST .../vet/confirm/{id}` | — | `POST .../expert/confirm/{id}` | | 拒绝 | `POST .../vet/reject/{id}` | — | `POST .../expert/reject/{id}` | | 评价列表 | — | — | `GET .../expert/reviewList/{id}`(仅已完成) | 机构列表列较少(无 `serviceAddress` 等待选列可在 SQL 仍查出,前端按需展示)。 --- ## 5. 实现要点 | 项 | 说明 | | --- | --- | | 越权 | 所有 `id` 操作必须校验 `provider_type=1` 且 `provider_id=当前兽医` | | 事务 | 确认/拒绝单条 `@Transactional`;更新前再次读 `status` | | 并发 | `status!=0` 时返回状态已变更;与移动端取消竞态同理 | | 日志 | `@Log` 记录确认、拒绝 | | 组件路径 | `diseaseTreatment/myAppointment/vet/index` | **可复用类(建议)** - `AppointmentProviderType`、`AppointmentStatus`(枚举) - `BizServiceAppointment`(实体) - `BizServiceAppointmentMapper`(按 provider 查询) - `VetMyAppointmentServiceImpl` 封装兽医 scope + 状态机 --- ## 6. 与上下游衔接 | 系统 | 说明 | | --- | --- | | 移动端预约服务 | `INSERT` 记录:`provider_type=1`,`status=0`,字段来自预约表单 | | 移动端取消 | 更新 `status=3`(允许态由 App 规则控制) | | 已完成 | 兽医后台 **完成接诊**(`status` 1→4)或整体业务闭环置 `status=4` | | 畜牧医疗资源 | 兽医发布且分配账号后才有本菜单数据 | --- ## 7. 交付清单 - [ ] `sql/biz_service_appointment.sql`(三端共用) - [ ] 公共 `appointment` 域实体 / 枚举 / Mapper - [ ] `VetMyAppointmentController` + Service + 校验 - [ ] 菜单权限 SQL(兽医) - [ ] 单元测试 + MockMvc(列表 scope、确认、拒绝、状态拦截) - [ ] 机构/专家 Controller(可同迭代,共用 Mapper) --- ## 8. 修订记录 | 版本 | 说明 | | --- | --- | | 1.0 | 初稿:统一预约表 + 兽医接口;三端关联状态与路径;专家评价表仅关联说明 |