# 秦皇岛中医院医技预约系统需求文档 ## 1. 原始需求 ### 1.1 业务背景 秦皇岛中医院作为综合性医疗机构,拥有多个医技检查科室(如CT、MRI、超声、内镜等)。随着医疗业务量增长,传统的手工预约管理模式已无法满足需求,存在以下问题: - 患者排队时间长,检查安排效率低 - 各科室号源管理混乱,无法合理分配 - 住院、门诊、急诊、体检等不同渠道的患者预约需求难以统筹 - HIS系统医嘱信息无法及时同步到检查科室 - 缺乏统一的报到和登记流程 ### 1.2 核心需求(大白话描述) - 医生开医嘱后,患者能通过各种方式(自助机、手机、窗口)预约检查时间 - 各科室能设置每天的号源,按住院、门诊、急诊等不同渠道分配号源比例 - 患者预约后能按时段报到,科室能管理检查进度 - HIS系统开医嘱后自动推送到预约系统,不用人工录入 - 管理后台能统计预约情况,监控科室运营状况 ### 1.3 业务场景 1. **住院患者预约场景**:住院医生在HIS系统开医嘱 → HIS推送医嘱信息 → 护士站工作人员查看待预约列表 → 根据病情和科室号源情况预约合适时段 → 通知患者检查时间 → 患者按时报到检查 2. **门诊患者预约场景**:门诊医生开医嘱 → 患者缴费后 → 通过自助机或手机H5预约 → 选择合适时段 → 按预约时间报到检查 3. **急诊患者预约场景**:急诊医生开医嘱 → 急诊优先通道快速预约 → 优先检查 4. **体检患者预约场景**:体检中心开检查单 → 患者预约体检时段 → 按时段完成检查 --- ## 2. 设计需求(功能需求) ### 2.1 系统角色定义 #### 2.1.1 系统管理员 - 权限:系统全局配置、用户管理、权限分配、科室基础信息管理 - 职责:维护系统正常运行,配置全局参数 #### 2.1.2 科室管理员(医技科室) - 权限:本科室号源管理、预约计划制定、科室设备管理、预约记录查询 - 职责:管理本科室号源,制定预约计划,处理预约业务 #### 2.1.3 护士站工作人员(住院科室) - 权限:查看本病区医嘱、为住院患者预约、取消预约、查看预约记录 - 职责:为本病区住院患者预约医技检查 #### 2.1.4 临床医生 - 权限:查看本人开具医嘱的预约情况、为患者预约 - 职责:开医嘱后可查看或协助患者预约 #### 2.1.5 患者/家属 - 权限:查看本人医嘱、自助预约、取消预约、改约 - 职责:通过自助机或H5完成自助预约 #### 2.1.6 第三方系统 - 权限:通过接口推送医嘱、查询预约状态 - 著作:HIS系统、PACS系统、体检系统等外部系统对接 ### 2.2 功能模块划分 #### 2.2.1 系统管理模块 | 功能编号 | 功能名称 | 功能描述 | 角色 | |---------|---------|---------|------| | SYS-001 | 用户管理 | 添加、修改、删除系统用户,分配用户分组,重置密码 | 系统管理员 | | SYS-002 | 分组管理 | 创建用户分组,分配菜单权限 | 系统管理员 | | SYS-003 | 菜单管理 | 配置系统菜单结构、菜单权限 | 系统管理员 | | SYS-004 | 系统配置 | 配置系统全局参数(如预约超时时间、缴费超时等) | 系统管理员 | | SYS-005 | 密码修改 | 用户修改自身密码 | 所有用户 | #### 2.2.2 基础数据管理模块 | 功能编号 | 功能名称 | 功能描述 | 角色 | |---------|---------|---------|------| | BASE-001 | 科室管理 | 维护医技科室信息(科室名称、编号、位置、状态) | 系统管理员/科室管理员 | | BASE-002 | 科室资源管理 | 维护科室检查室/机房资源(资源名称、位置、状态、冬夏时令配置) | 科室管理员 | | BASE-003 | 设备管理 | 维护检查设备信息(设备名称、状态) | 科室管理员 | | BASE-004 | 检查项目管理 | 维护检查项目(项目名称、代码、分类、检查须知、空腹要求、检查时长、关联服务组) | 科室管理员 | | BASE-005 | 检查项目分类 | 维护检查项目分类信息 | 科室管理员 | | BASE-006 | 项目设备绑定 | 配置检查项目可用的设备/服务组 | 科室管理员 | | BASE-007 | 项目互斥配置 | 配置检查项目之间的互斥关系(如某些检查不能在同一天进行) | 科室管理员 | | BASE-008 | 时间段管理 | 配置预约时间段(时间段名称、开始时间、结束时间、截止预约时间) | 科室管理员 | | BASE-009 | 病区管理 | 维护住院病区信息 | 系统管理员 | | BASE-010 | HIS数据同步 | 从HIS系统同步科室、用户、检查项目等基础数据 | 系统管理员 | #### 2.2.3 预约计划管理模块 | 功能编号 | 功能名称 | 功能描述 | 角色 | |---------|---------|---------|------| | PLAN-001 | 预约计划模板 | 配置每周的号源模板(按星期、时间段、资源、设备配置号源) | 科室管理员 | | PLAN-002 | 渠道比例配置 | 配置各预约渠道(住院/门诊/急诊/体检)的号源占比 | 科室管理员 | | PLAN-003 | 模板占位管理 | 设置模板的占位数量(预留号源) | 科室管理员 | | PLAN-004 | 生成计划明细 | 根据模板批量生成未来日期的号源明细 | 科室管理员 | | PLAN-005 | 计划明细管理 | 查看、修改、删除已生成的号源明细 | 科室管理员 | | PLAN-006 | 明细占位管理 | 调整特定日期号源的占位数量 | 科室管理员 | | PLAN-007 | 节假日配置 | 配置特殊日期的工作日/节假日标识 | 科室管理员 | | PLAN-008 | 体检日历管理 | 为体检机构配置预约日历 | 科室管理员 | #### 2.2.4 预约业务处理模块 | 功能编号 | 功能名称 | 功能描述 | 角色 | |---------|---------|---------|------| | YUYUE-001 | 医嘱查询列表 | 查看待预约、已预约、已报到、已完成的医嘱列表 | 科室管理员/护士/医生 | | YUYUE-002 | 开始预约 | 为患者选择合适的时段完成预约 | 科室管理员/护士/医生/患者 | | YUYUE-003 | 取消预约 | 取消已预约记录,释放号源 | 科室管理员/护士/医生/患者 | | YUYUE-004 | 更改预约 | 修改预约时间,调整到其他时段 | 科室管理员/护士/医生/患者 | | YUYUE-005 | 报到登记 | 患者到院后报到登记 | 科室管理员 | | YUYUE-006 | 取消报到 | 取消报到状态 | 科室管理员 | | YUYUE-007 | 查看日志 | 查看医嘱状态变更日志 | 所有用户 | | YUYUE-008 | 打印申请单 | 打印检查申请单(含条形码) | 科室管理员/护士 | | YUYUE-009 | 自动预约 | 系统根据规则自动为患者分配时段 | 系统 | | YUYUE-010 | 门诊缴费检查 | 检查门诊患者是否缴费,未缴费提示 | 系统 | | YUYUE-011 | 超时取消 | 门诊患者缴费超时自动取消预约 | 系统 | #### 2.2.5 统计查询模块 | 功能编号 | 功能名称 | 功能描述 | 角色 | |---------|---------|---------|------| | STAT-001 | 预约统计 | 统计各科室、各时段的预约情况 | 科室管理员 | | STAT-002 | 渠道统计 | 统计各预约渠道的使用情况 | 科室管理员 | | STAT-003 | 开单统计 | 统计医生开单情况 | 科室管理员 | | STAT-004 | 号源占用查询 | 查看特定时段号源占用明细 | 科室管理员 | #### 2.2.6 HIS集成模块 | 功能编号 | 功能名称 | 功能描述 | 角色 | |---------|---------|---------|------| | HIS-001 | 医嘱消息接收 | 接收HIS推送的医嘱信息(MI0150) | 系统 | | HIS-002 | 医嘱状态变更 | 接收医嘱状态变更消息(MI0164) | 系统 | | HIS-003 | 医嘱更新 | 接收医嘱更新消息(MU0165) | 系统 | | HIS-004 | 检查信息同步 | 接收检查信息消息(CI0047/CI0054/CI0055) | 系统 | | HIS-005 | 检查确认同步 | 接收检查确认消息(CD0050) | 系统 | | HIS-006 | 医嘱订单同步 | 接收医嘱订单消息(OI0083/OD0084) | 系统 | | HIS-007 | 向PACS推送申请单 | 预约后向PACS系统推送检查申请单 | 系统 | | HIS-008 | 从PACS接收报到 | 接收PACS系统的报到/取消报到通知 | 系统 | #### 2.2.7 自助机模块 | 功能编号 | 功能名称 | 功能描述 | 角色 | |---------|---------|---------|------| | ZIZHU-001 | 患者登录 | 通过登记号/就诊卡登录 | 患者 | | ZIZHU-002 | 查看医嘱列表 | 查看本人的医嘱检查项目 | 患者 | | ZIZHU-003 | 自助预约 | 选择时段完成预约 | 患者 | | ZIZHU-004 | 取消/改约 | 取消预约或更改预约时间 | 患者 | #### 2.2.8 H5移动端模块 | 功能编号 | 功能名称 | 功能描述 | 角色 | |---------|---------|---------|------| | H5-001 | 患者登录 | 通过患者ID登录 | 患者 | | H5-002 | 查看医嘱 | 查看本人医嘱检查项目 | 患者 | | H5-003 | 预约操作 | 完成预约、取消预约 | 患者 | | H5-004 | 查看详情 | 查看医嘱详情、预约信息 | 患者 | ### 2.3 核心业务流程 #### 2.3.1 住院患者预约流程 ``` HIS开医嘱 → MQ推送医嘱信息 → 监听服务接收写入s_list(状态0) → 护士站查询待预约列表 → 选择医嘱 → 选择时段 → 预约操作(状态1) → 通知患者 → 患者按时报到(状态2) → 检查完成(状态3) ``` #### 2.3.2 门诊患者预约流程 ``` HIS开医嘱 → MQ推送医嘱信息 → 监听服务接收写入s_list(状态0) → 患者缴费 → 缴费状态更新 → 患者自助机/H5登录 → 查看医嘱 → 选择时段预约 → 检查缴费状态 → 预约成功(状态1) → 患者按时报到(状态2) → 检查完成(状态3) ``` #### 2.3.3 号源生成流程 ``` 科室管理员配置预约计划模板 → 配置各渠道号源比例 → 选择模板 → 设置日期范围 → 批量生成计划明细 → 生成s_source_roster_detail表记录 → 生成s_source_roster_detail_count表记录(含乐观锁version) ``` #### 2.3.4 HIS消息处理流程 ``` HIS系统推送MQ消息 → C#监听服务接收 → 解析XML消息 → 提取医嘱信息 → 写入/更新s_list表 → 记录操作日志 → 返回确认消息 ``` --- ## 3. 设计规格(技术规范) ### 3.1 技术栈选择 #### 3.1.1 后端技术栈 - **框架**: Laravel 8 (PHP 7.4+/8.0+) - **数据库**: MySQL 5.7+ - **认证**: Laravel Sanctum (Token认证) - **PDF生成**: barryvdh/laravel-snappy + wkhtmltopdf - **条形码生成**: picqer/php-barcode-generator - **跨域处理**: fruitcake/laravel-cors #### 3.1.2 前端技术栈 - **管理后台**: Vue 3 + Vite 4 + Element Plus 2.3 + Pinia + Vue Router - **自助机**: Vue 3 + Vite 5 + Element Plus 2.7 + Vue Router - **H5移动端**: uni-app (支持多端发布) - **HTTP客户端**: Axios #### 3.1.3 其他服务 - **WebSocket服务**: Workerman (PHP) - **HIS监听服务**: C# Windows Service + MQ Client ### 3.2 接口规范 #### 3.2.1 API基础规范 - **基础路径**: `/api/v1/` - **认证方式**: Bearer Token (Sanctum) - **请求方式**: POST (业务接口)、GET (查询接口) - **响应格式**: JSON ```json { "status": true/false, "msg": "提示信息", "data": {} } ``` #### 3.2.2 接口分类 1. **系统管理接口** (`/api/v1/admin/*`) - 用户、分组、菜单、配置管理 2. **业务管理接口** (`/api/v1/admin/*`) - 科室、设备、检查项目、预约计划管理 3. **H5端接口** (`/api/v1/H5/*`) - 患者登录、医嘱查询、预约操作 4. **第三方接口** (`/api/v1/T/*`) - HIS推送医嘱、PACS报到通知 #### 3.2.3 中间件 - `checktoken`: 验证用户Token - `check.sign`: 验证第三方接口签名 - `log`: 记录接口访问日志 - `xmllog`: 记录XML格式接口日志 ### 3.3 数据库规范 #### 3.3.1 表命名规范 - 系统表:无前缀 (如 `users`, `group`, `menu`) - 业务表:前缀 `s_` (如 `s_department`, `s_list`) - 字段使用下划线命名法 #### 3.3.2 通用字段规范 - **主键**: `id` (自增INT或BIGINT) - **创建时间**: `created_at` (timestamp, 自动填充) - **更新时间**: `updated_at` (datetime, 自动更新) - **状态字段**: `status` (0-关闭/禁用, 1-开启/正常) - **删除标记**: `is_del` (0-未删除, 1-已删除,软删除) - **操作人**: `adduser` / `create_user` (INT) #### 3.3.3 状态编码规范 - **预约状态** (`list_status`): - 0: 正在申请(医嘱已接收,待预约) - 1: 已预约 - 2: 已登记(已报到) - 3: 已结束(检查完成) - **患者类型** (`patient_type`): - 0: 住院 - 1: 门诊 - 2: 急诊 - 3: 体检 #### 3.3.4 乐观锁机制 - 号源数量表 `s_source_roster_detail_count` 使用 `version` 字段实现乐观锁 - 预约操作时需检查version并递增,防止并发冲突 ### 3.4 代码规范 #### 3.4.1 Laravel代码规范 - 遵循PSR-12编码规范 - 控制器命名: `XxxController.php` - 模型命名: 单数形式,对应表名 - 控制器位于 `App\Http\Controllers\API\Admin\YeWu\` 目录 - 复杂业务逻辑封装在 `app\Lib\` 或Service层 - 使用Eloquent ORM操作数据库 #### 3.4.2 Vue前端规范 - 组件命名: PascalCase (如 `PlanModel.vue`) - 使用Composition API (推荐) 或 Options API - Element Plus组件库统一UI风格 - API调用通过 `src/api/` 模块统一管理 - 使用Pinia进行状态管理 #### 3.4.3 通用规范 - 避免硬编码,使用配置表或环境变量 - 异常统一捕获和记录 - 关键操作记录日志 - 防止SQL注入、XSS攻击 ### 3.5 安全与权限规范 #### 3.5.1 认证机制 - 用户登录: 用户名+密码验证,返回Token - Token有效期: 可配置,支持Token刷新 - Token存储: 客户端存储access_token和refresh_token #### 3.5.2 权限控制 - 基于分组+菜单的权限体系 - 用户属于分组,分组关联菜单 - API层面检查用户分组和菜单权限 - 科室管理员只能操作本科室数据 #### 3.5.3 数据安全 - 密码加密存储 (bcrypt/hash) - 第三方接口签名验证 (app_id + app_secret + timestamp + sign) - HIS医嘱ID唯一性校验 (`entrust_id`字段) - 软删除机制保护数据不物理删除 #### 3.5.4 业务安全 - 门诊患者未缴费不允许预约(可配置) - 预约超时自动取消并释放号源 - 检查项目互斥校验(部分检查不能同一天进行) - 号源数量一致性校验(乐观锁) --- ## 4. 概要设计(整体架构) ### 4.1 系统架构图 ``` ┌─────────────────────────────────────────────────────────────┐ │ HIS系统 │ │ (医嘱开立、缴费、医嘱状态变更、检查信息) │ └─────────────────┬───────────────────────────────────────────┘ │ MQ消息队列 ↓ ┌─────────────────────────────────────────────────────────────┐ │ HIS消息监听服务 (C# Windows Service) │ │ - MI0150Listener (医嘱信息) │ │ - MI0164Listener (医嘱状态变更) │ │ - MU0165Listener (医嘱更新) │ │ - CI0047/CI0054/CI0055Listener (检查信息) │ │ - CD0050Listener (检查确认) │ │ - OI0083/OD0084Listener (医嘱订单) │ └─────────────────┬───────────────────────────────────────────┘ │ 写入数据库 ↓ ┌─────────────────────────────────────────────────────────────┐ │ MySQL数据库 │ │ - 基础数据表 (科室、设备、检查项目) │ │ - 号源表 (计划模板、计划明细、号源数量) │ │ - 业务表 (s_list预约主表、日志表) │ │ - 系统表 (用户、分组、菜单) │ └─────────────────┬───────────────────────────────────────────┘ │ ↓ ┌─────────────────────────────────────────────────────────────┐ │ Laravel后端API服务 │ │ ├─ 系统管理API (用户、权限、配置) │ │ ├─ 基础数据API (科室、设备、项目) │ │ ├─ 预约管理API (计划模板、号源管理) │ │ ├─ 业务处理API (预约、取消、报到) │ │ ├─ H5端API (患者自助预约) │ │ ├─ 第三方API (HIS推送、PACS报到) │ │ └─ WebSocket推送 (实时通知) │ └─────────────────┬───────────────────────────────────────────┘ │ HTTP/WebSocket ↓ ┌──────────────┬──────────────┬──────────────┬────────────────┐ │ 管理后台 │ 自助机 │ H5移动端 │ PACS系统 │ │ (Vue 3) │ (Vue 3) │ (uni-app) │ │ │ │ │ │ │ │ - 科室管理 │ - 患者登录 │ - 患者登录 │ - 接收申请单 │ │ - 号源配置 │ - 查看医嘱 │ - 查看医嘱 │ - 报到通知 │ │ - 预约管理 │ - 自助预约 │ - 自助预约 │ │ │ - 统计查询 │ - 取消改约 │ - 取消改约 │ │ └──────────────┴──────────────┴──────────────┴────────────────┘ ``` ### 4.2 模块划分 #### 4.2.1 后端模块结构 ``` Laravel/ ├── app/ │ ├── Http/Controllers/API/ │ │ ├── Admin/ │ │ │ ├── YeWu/ # 业务控制器 │ │ │ │ ├── DepartmentController.php │ │ │ │ ├── DevicesController.php │ │ │ │ ├── CheckItemController.php │ │ │ │ ├── PlanModelController.php │ │ │ │ ├── PlanListController.php │ │ │ │ ├── WorkMainController.php │ │ │ │ ├── SignInController.php │ │ │ │ └── ... │ │ │ ├── LoginController.php │ │ │ ├── UserController.php │ │ │ ├── GroupController.php │ │ │ ├── MenuController.php │ │ │ └── ... │ │ ├── H5/ # H5端控制器 │ │ ├── His/ # HIS对接控制器 │ │ ├── Third/ # 第三方接口控制器 │ │ └── PdfController.php │ ├── Lib/ # 自定义类库 │ │ ├── Tools.php # 工具类 │ │ ├── Yz.php # 响应格式化类 │ │ └── JWT.php # JWT处理类 │ ├── Models/ # 数据模型 │ ├── Middleware/ # 中间件 │ │ ├── CheckToken.php │ │ ├── Log.php │ │ └── CheckSign.php │ └── Services/ # 服务层(业务逻辑) │ └ Admin/YeWu/ │ │ ├── RosterService.php │ │ ├── PlanListService.php │ └── ... ├── routes/ │ ├── api.php # API路由 │ └── web.php ├── config/ │ ├── app.php │ ├── database.php │ └── ... └── database/ └── migrations/ # 数据库迁移文件 ``` #### 4.2.2 前端模块结构 ``` YiJi-admin/ # 管理后台 ├── src/ │ ├── views/ │ │ ├── YeWu/ # 业务管理页面 │ │ │ ├── DepartmentConfig.vue │ │ │ ├── DevicesConfig.vue │ │ │ ├── CheckItemConfig.vue │ │ │ ├── MainList.vue │ │ │ ├── DoctorYuYue.vue │ │ │ └── ... │ │ ├── AppointmentMngr/ # 预约管理页面 │ │ │ ├── PlanModel.vue │ │ │ ├── PlanList.vue │ │ │ ├── TimePeriodMngr.vue │ │ │ ├── RatioMngr.vue │ │ │ └── ... │ │ ├── SystemMngr/ # 系统管理页面 │ │ │ ├── User/List.vue │ │ │ ├── Group/List.vue │ │ │ ├── Menu/List.vue │ │ │ └── ... │ │ ├── Info/ # 统计查询页面 │ │ └── Login.vue │ ├── components/ # 公共组件 │ ├── router/ # 路由配置 │ ├── store/ # Pinia状态管理 │ ├── api/ # API接口模块 │ └── utils/ # 工具函数 ZiZhuJi/ # 自助机 ├── src/ │ ├── views/ │ │ ├── Login.vue │ │ ├── CheckItemMainList.vue │ │ ├── PlanList.vue │ │ └── ... │ ├── tools/ │ ├── router/ │ └── api/ h5/ # H5移动端 ├── pages/ │ ├── Login.vue │ ├── CheckItemMainList.vue │ ├── PlanList.vue │ └── ... ├── api/ ├── static/ └── uni_modules/ # uni-app组件模块 ``` ### 4.3 数据流程 #### 4.3.1 医嘱接收流程 ``` HIS开医嘱 ↓ MQ推送XML消息 (MI0150) ↓ C#监听服务接收消息 ↓ 解析XML提取医嘱信息: - 患者信息 (姓名、性别、年龄、身份证) - 医嘱信息 (医嘱名称、医嘱代码、医嘱时间) - 科室信息 (申请科室、执行科室) - 患者类型 (住院/门诊/急诊) - 住院信息 (病区、床号) ↓ 写入s_list表 (list_status=0) ↓ 记录s_list_log日志 ↓ 返回确认消息给HIS ``` #### 4.3.2 预约操作流程 ``` 用户选择医嘱 ↓ 查询可预约时段 ↓ GetEnablePlan接口查询: - 根据医嘱查找关联科室/资源/设备 - 查询s_source_roster_detail可用号源 - 检查号源数量 (s_source_roster_detail_count) - 检查项目互斥关系 (s_huchi) - 检查门诊缴费状态 ↓ 返回可用时段列表 ↓ 用户选择时段 ↓ YuYue接口执行预约: - 乐观锁检查version - 更新号源数量 (递增used_count, 递增version) - 更新s_list记录 (list_status=1, 预约时间、资源) - 记录s_list_log日志 - 向PACS推送申请单 ↓ 预约成功 ``` #### 4.3.3 号源生成流程 ``` 科室管理员配置模板 ↓ PlanModelSave接口保存: - 写入s_source_roster表 - 配置时间段、资源、设备 - 配置患者类型 ↓ 配置渠道比例 ↓ SaveAppointmentRatio接口保存: - 写入s_appointment_type_ratio表 - 设置各渠道占比 - 设置合并号源渠道 ↓ 生成计划明细 ↓ Create接口批量生成: - 根据模板和日期范围 - 写入s_source_roster_detail表 (每日号源) - 写入s_source_roster_detail_count表 (各渠道数量) - 初始化version=0 ↓ 号源生成完成 ``` ### 4.4 核心表设计思路 #### 4.4.1 号源管理表设计 ``` 预约计划模板 (s_source_roster) ↑ 模板配置 ↓ 模板渠道数量 (s_source_roster_count) ↑ 各渠道号源配置 ↓ 预约计划明细 (s_source_roster_detail) ↑ 每日具体号源 ↓ 明细渠道数量 (s_source_roster_detail_count) ↑ 各渠道实际数量 + 乐观锁version ↓ 预约记录 (s_list) ↑ 占用号源 ``` #### 4.4.2 预约主表设计 ``` s_list表 (预约主表) ├─ 患者信息字段 │ - user_name, user_sex, user_age, user_brithday │ - user_phone, idCardNumber │ - hospital_number (住院号), prescription_id (患者ID) │ ├─ 医嘱信息字段 │ - entrust (医嘱名称), entrust_code (医嘱代码) │ - entrust_id (HIS医嘱ID, 唯一标识) │ - entrust_date, entrust_time (医嘱时间) │ - app_num (申请单号) │ ├─ 科室信息字段 │ - reservation_department (申请科室) │ - RISRAcceptDeptCode (执行科室代码) │ - department_id (预约科室ID) │ ├─ 预约信息字段 │ - reservation_date (预约日期) │ - reservation_time (时间段ID) │ - reservation_sources (预约资源ID) │ - roster_id (计划明细ID) │ - services_group (服务组) │ - appointment_type_id (占用号源的渠道) │ - qudao_appointment_type_id (预约来源渠道) │ ├─ 住院信息字段 │ - warddesc (病区), wardcode (病区编号) │ - bedname, bedno (床号) │ ├─ 状态字段 │ - list_status (0申请/1预约/2登记/3结束) │ - is_pay (是否缴费) │ - is_del (删除标记) │ - is_nullify (作废标记) │ - his_is_emergency (HIS加急标记) │ - is_emergency (加急预约) │ ├─ 时间字段 │ - canel_time (取消预约时间) │ - reg_date, reg_time (登记时间) │ - addtime (预约时间) │ └─ 其他字段 - reg_num (登记号) - check_num (检查号) - medicalHistory (病史) - diagnosisName (诊断) - check_aply_pdf (申请单PDF地址) ``` --- ## 5. 详细设计(实现细节) ### 5.1 全部接口清单 系统共提供 **91个接口**,分为以下几大类: - 系统管理接口(15个) - 基础数据管理接口(20个) - 预约计划管理接口(15个) - 预约业务处理接口(20个) - HIS集成接口(6个) - H5移动端接口(5个) - 第三方对接接口(10个) --- #### 5.1.1 系统管理接口(15个) ##### 1. 用户登录 - **URL**: `POST /api/admin/login` - **权限**: 无需认证 - **入参**: ```json { "username": "用户名", "pwd": "密码" } ``` - **出参**: ```json { "status": true, "msg": "登录成功", "data": { "token": "access_token", "refresh_token": "refresh_token", "userinfo": { "id": 1, "cn_name": "姓名", "username": "用户名", "group": 1, "department_id": 1 } } } ``` ##### 2. 刷新Token - **URL**: `POST /api/tokenRefresh` - **权限**: 无需认证 - **入参**: ```json { "refresh_token": "refresh_token" } ``` - **出参**: 返回新的access_token和refresh_token ##### 3. 获取服务器时间 - **URL**: `POST /api/GetServiceDateTime` - **权限**: 无需认证 - **入参**: 无 - **出参**: 返回当前服务器时间 ##### 4. 获取用户菜单列表 - **URL**: `POST /api/v1/admin/getBaseMenuList` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回当前用户权限范围内的菜单树 ##### 5. 获取用户基本信息 - **URL**: `POST /api/v1/admin/GetBaseUserInfo` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回用户详细信息 ##### 6. 获取菜单列表 - **URL**: `POST /api/v1/admin/getMenuList` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回所有菜单列表(树形结构) ##### 7. 获取一级菜单 - **URL**: `POST /api/v1/admin/GetFatherMenuList` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回一级菜单列表 ##### 8. 添加菜单 - **URL**: `POST /api/v1/admin/AddMenu` - **权限**: 需要Token - **入参**: ```json { "pid": 0, "name": "菜单名称", "url": "/path", "order": 1, "icon": "icon-name" } ``` - **出参**: 返回添加结果 ##### 9. 修改菜单 - **URL**: `POST /api/v1/admin/EditMenu` - **权限**: 需要Token - **入参**: 菜单完整信息(含id) - **出参**: 返回修改结果 ##### 10. 获取用户列表 - **URL**: `POST /api/v1/admin/getUserList` - **权限**: 需要Token - **入参**: ```json { "page": 1, "pageSize": 20, "searchInfo": {} } ``` - **出参**: 返回用户列表和总数 ##### 11. 获取用户详情 - **URL**: `POST /api/v1/admin/GetSystemUserDetail` - **权限**: 需要Token - **入参**: `{ "id": 1 }` - **出参**: 返回用户详细信息 ##### 12. 保存用户信息 - **URL**: `POST /api/v1/admin/SaveSystemUserInfo` - **权限**: 需要Token - **入参**: 用户完整信息(新增/编辑) - **出参**: 返回保存结果 ##### 13. 重置用户密码 - **URL**: `POST /api/v1/admin/resetPwd` - **权限**: 需要Token - **入参**: `{ "id": 1 }` - **出参**: 返回重置后的默认密码 ##### 14. 修改密码 - **URL**: `POST /api/v1/admin/adminChangePwd` - **权限**: 需要Token - **入参**: ```json { "old_pwd": "旧密码", "new_pwd": "新密码" } ``` - **出参**: 返回修改结果 ##### 15. 修改个人信息 - **URL**: `POST /api/v1/admin/ChangInfo` - **权限**: 需要Token - **入参**: 可修改的个人信息字段 - **出参**: 返回修改结果 ##### 16. 获取分组列表 - **URL**: `POST /api/v1/admin/getGroupList` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回用户分组列表 ##### 17. 保存分组 - **URL**: `POST /api/v1/admin/SaveGroup` - **权限**: 需要Token - **入参**: 分组信息(新增/编辑) - **出参**: 返回保存结果 ##### 18. 获取分组菜单列表 - **URL**: `POST /api/v1/admin/GetGroupMenuList` - **权限**: 需要Token - **入参**: `{ "group_id": 1 }` - **出参**: 返回该分组关联的菜单ID列表 ##### 19. 修改分组菜单 - **URL**: `POST /api/v1/admin/GroupChangeMenu` - **权限**: 需要Token - **入参**: ```json { "group_id": 1, "menu_ids": [1, 2, 3] } ``` - **出参**: 返回修改结果 ##### 20. 检查菜单权限 - **URL**: `POST /api/v1/admin/CheckMenuAuth` - **权限**: 需要Token - **入参**: `{ "menu_id": 1 }` - **出参**: 返回是否有权限 ##### 21. 获取配置信息 - **URL**: `POST /api/v1/admin/GetConfigInfo` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回系统配置参数 ##### 22. 保存配置信息 - **URL**: `POST /api/v1/admin/SaveConfigInfo` - **权限**: 需要Token - **入参**: 配置参数键值对 - **出参**: 返回保存结果 ##### 23. 上传文件 - **URL**: `POST /api/UpFile` - **权限**: 需要Token - **入参**: multipart/form-data文件 - **出参**: 返回文件URL ##### 24. 切换默认科室 - **URL**: `POST /api/v1/admin/ChangeDefaultDept` - **权限**: 需要Token - **入参**: `{ "department_id": 1 }` - **出参**: 返回切换结果 --- #### 5.1.2 基础数据管理接口(20个) ##### 1. 获取科室列表 - **URL**: `POST /api/v1/admin/GetDepartmentList` - **权限**: 需要Token - **入参**: ```json { "page": 1, "pageSize": 20, "searchInfo": {} } ``` - **出参**: 返回科室列表 ##### 2. 获取启用的科室列表 - **URL**: `POST /api/v1/admin/GetEnableDepartmentList` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回启用状态的科室列表 ##### 3. 保存科室信息 - **URL**: `POST /api/v1/admin/SaveDepartment` - **权限**: 需要Token - **入参**: 科室完整信息 - **出参**: 返回保存结果 ##### 4. 删除科室 - **URL**: `POST /api/v1/admin/DelDepartment` - **权限**: 需要Token - **入参**: `{ "ids": [1, 2, 3] }` - **出参**: 返回删除结果 ##### 5. 获取科室资源列表 - **URL**: `POST /api/v1/admin/DepartmentResourceGetList` - **权限**: 需要Token - **入参**: ```json { "page": 1, "pageSize": 20, "searchInfo": { "department_id": 1 } } ``` - **出参**: 返回科室资源列表 ##### 6. 获取可用科室资源 - **URL**: `POST /api/v1/admin/DepartmentResourceGetEnableList` - **权限**: 需要Token - **入参**: `{ "department_id": 1 }` - **出参**: 返回可用资源列表 ##### 7. 保存科室资源 - **URL**: `POST /api/v1/admin/SaveDepartmentResource` - **权限**: 需要Token - **入参**: 资源完整信息 - **出参**: 返回保存结果 ##### 8. 删除科室资源 - **URL**: `POST /api/v1/admin/DepartmentResourceDel` - **权限**: 需要Token - **入参**: `{ "ids": [1, 2, 3] }` - **出参**: 返回删除结果 ##### 9. 绑定科室资源与设备 - **URL**: `POST /api/v1/admin/DepartmentResourceBindDevice` - **权限**: 需要Token - **入参**: ```json { "resource_id": 1, "device_ids": [1, 2, 3] } ``` - **出参**: 返回绑定结果 ##### 10. 获取资源已绑定设备 - **URL**: `POST /api/v1/admin/ResourceGetBindDeviceList` - **权限**: 需要Token - **入参**: `{ "resource_id": 1 }` - **出参**: 返回已绑定的设备列表 ##### 11. 获取设备列表 - **URL**: `POST /api/v1/admin/GetDeviceList` - **权限**: 需要Token - **入参**: ```json { "page": 1, "pageSize": 20, "searchInfo": {} } ``` - **出参**: 返回设备列表 ##### 12. 获取可用设备列表 - **URL**: `POST /api/v1/admin/GetEnableDeviceList` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回启用状态的设备列表 ##### 13. 保存设备 - **URL**: `POST /api/v1/admin/SaveDeviceList` - **权限**: 需要Token - **入参**: 设备完整信息 - **出参**: 返回保存结果 ##### 14. 删除设备 - **URL**: `POST /api/v1/admin/DelDevice` - **权限**: 需要Token - **入参**: `{ "ids": [1, 2, 3] }` - **出参**: 返回删除结果 ##### 15. 获取检查项目分类列表 - **URL**: `POST /api/v1/admin/GetCheckItemClassList` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回检查项目分类列表 ##### 16. 获取检查项目列表 - **URL**: `POST /api/v1/admin/GetCheckItemList` - **权限**: 需要Token - **入参**: ```json { "page": 1, "pageSize": 20, "searchInfo": {} } ``` - **出参**: 返回检查项目列表 ##### 17. 保存检查项目 - **URL**: `POST /api/v1/admin/SaveItemInfo` - **权限**: 需要Token - **入参**: 检查项目完整信息 - **出参**: 返回保存结果 ##### 18. 检查项目绑定设备 - **URL**: `POST /api/v1/admin/ItemBindDevice` - **权限**: 需要Token - **入参**: ```json { "item_id": 1, "device_ids": [1, 2, 3] } ``` - **出参**: 返回绑定结果 ##### 19. 设置项目互斥 - **URL**: `POST /api/v1/admin/SetHuChi` - **权限**: 需要Token - **入参**: ```json { "code1": "检查项目代码1", "code2": "检查项目代码2", "time": 24 } ``` - **出参**: 返回设置结果 ##### 20. 删除项目互斥 - **URL**: `POST /api/v1/admin/DelHuChi` - **权限**: 需要Token - **入参**: `{ "id": 1 }` - **出参**: 返回删除结果 ##### 21. 获取项目互斥列表 - **URL**: `POST /api/v1/admin/GetHuChiList` - **权限**: 需要Token - **入参**: `{ "item_code": "项目代码" }` - **出参**: 返回该项目已设置的互斥列表 ##### 22. 获取时间段列表 - **URL**: `POST /api/v1/admin/TimePeriodGetList` - **权限**: 需要Token - **入参**: ```json { "page": 1, "pageSize": 20, "searchInfo": { "department_id": 1 } } ``` - **出参**: 返回时间段列表 ##### 23. 获取启用的时间段列表 - **URL**: `POST /api/v1/admin/TimePeriodGetEnableList` - **权限**: 需要Token - **入参**: `{ "department_id": 1 }` - **出参**: 返回启用的时间段列表 ##### 24. 获取时间段详情 - **URL**: `POST /api/v1/admin/TimePeriodGetDetail` - **权限**: 需要Token - **入参**: `{ "id": 1 }` - **出参**: 返回时间段详细信息 ##### 25. 保存时间段 - **URL**: `POST /api/v1/admin/TimePeriodSave` - **权限**: 需要Token - **入参**: 时间段完整信息 - **出参**: 返回保存结果 ##### 26. 删除时间段 - **URL**: `POST /api/v1/admin/TimePeriodDel` - **权限**: 需要Token - **入参**: `{ "ids": [1, 2, 3] }` - **出参**: 返回删除结果 ##### 27. 获取病区列表 - **URL**: `POST /api/v1/admin/InpatientWardGetList` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回病区列表 ##### 28. 保存病区 - **URL**: `POST /api/v1/admin/InpatientWardSave` - **权限**: 需要Token - **入参**: 病区信息 - **出参**: 返回保存结果 ##### 29. 删除病区 - **URL**: `POST /api/v1/admin/InpatientWardDel` - **权限**: 需要Token - **入参**: `{ "ids": [1, 2, 3] }` - **出参**: 返回删除结果 ##### 30. 获取预约类型列表 - **URL**: `POST /api/v1/admin/GetYuYueTypes` - **权限**: 需要Token - **入参**: 无 - **出参**: 返回预约类型列表 --- #### 5.1.3 预约计划管理接口(15个) ##### 1. 获取预约计划模板列表 - **URL**: `POST /api/v1/admin/PlanModelGetList` - **入参**: ```json { "searchInfo": { "date_type": 1, // 1工作日/2节假日 "type": 0, // 0默认/1夏令时/2冬令时 "resources_id": 1 // 资源ID } } ``` - **出参**: 返回模板列表,含各渠道号源配置 - **逻辑**: 1. 查询s_source_roster表 2. 关联s_source_roster_count表获取渠道数量 3. 按科室、资源、时间段分组展示 #### 5.1.3 生成预约计划明细 - **URL**: `POST /api/v1/admin/CreatePlanList` - **入参**: ```json { "dateRange": ["2024-01-01", "2024-12-31"], "ids": [1, 2, 3], // 模板ID数组 "date_type": 1, // 1工作日/2节假日 "HolidayEnable": true // 是否生成节假日 } ``` - **出参**: ```json { "status": true, "msg": "执行完成,共计生成计划 X 条", "data": { "count": 365 } } ``` - **逻辑**: 1. 调用RosterService.generatePlans服务 2. 根据模板和日期范围生成明细 3. 写入s_source_roster_detail表 4. 写入s_source_roster_detail_count表 5. 初始化version=0 #### 5.1.4 获取医嘱列表 - **URL**: `POST /api/v1/admin/GetMainList` - **入参**: ```json { "searchInfo": { "dateRange": ["2024-01-01", "2024-12-31"], "list_status": 0, // 状态筛选 "patient_type": 0, // 患者类型 "reg_num": "", // 登记号 "user_name": "", // 患者姓名 "resources": [], // 资源ID数组 "services_group": 1 // 服务组 }, "page": 1, "pageSize": 20 } ``` - **出参**: 返回医嘱列表,含患者信息、预约信息、状态等 - **逻辑**: 1. 根据用户分组过滤数据(科室管理员/护士/医生) 2. 查询s_list表 3. 关联s_period、s_department_resources表 4. 计算患者年龄、匹配设备信息 5. 分页返回 #### 5.1.5 获取可预约时段 - **URL**: `POST /api/v1/admin/GetEnablePlan` - **入参**: ```json { "regnum": "登记号", "entrustid": "医嘱ID", "episodeid": "就诊ID", "appointment_type": 4 // 预约渠道类型 } ``` - **出参**: 返回可用时段列表,含号源剩余数量 - **逻辑**: 1. 查询医嘱对应的检查项目 2. 查找项目关联的科室、资源、设备 3. 查询可用号源 (s_source_roster_detail) 4. 检查号源数量 (used_count < count) 5. 检查项目互斥关系 6. 检查门诊缴费状态 7. 检查医嘱等待时间 (check_begin_time) 8. 返回可用时段 #### 5.1.6 执行预约 - **URL**: `POST /api/v1/admin/PlanYuYue` - **入参**: ```json { "regnum": "登记号", "entrustid": ["医嘱ID1", "医嘱ID2"], "roster_detail_id": 123, // 号源明细ID "appointment_type": 4, // 预约渠道 "do_user": 1, // 操作人ID "do_type": 1 // 1预约/2改约 } ``` - **出参**: 预约成功/失败信息 - **逻辑**: 1. 检查医嘱状态(必须是状态0或可改约状态1) 2. 使用乐观锁更新号源数量: - 查询当前version - UPDATE时WHERE version=当前值 - 递增used_count和version - 如果UPDATE失败(version已变),重试或返回失败 3. 更新s_list表: - list_status = 1 - 预约时间、资源、服务组等 4. 记录s_list_log日志 5. 向PACS推送申请单 6. 返回预约结果 #### 5.1.7 取消预约 - **URL**: `POST /api/v1/admin/CancelYuYue` - **入参**: ```json { "ids": [1, 2, 3], // 医嘱记录ID数组 "cancel_type": "系统取消" // 取消类型 } ``` - **出参**: 取消成功/失败信息 - **逻辑**: 1. 检查医嘱状态(必须是已预约状态1) 2. 释放号源: - 递减used_count - 不递增version(释放不需要锁) 3. 更新s_list表: - list_status恢复原状态或保持0 - 记录canel_time - 记录cancel_type 4. 记录s_list_log日志 5. 向PACS推送取消申请单 6. 返回取消结果 #### 5.1.8 报到接口 - **URL**: `POST /api/v1/admin/SignIn` - **入参**: ```json { "id": 1 // 医嘱记录ID } ``` - **出参**: 报到成功/失败信息 - **逻辑**: 1. 检查医嘱状态(必须是已预约状态1) 2. 检查预约日期是否为当天或已过期 3. 更新s_list表: - list_status = 2 - 记录reg_date, reg_time 4. 记录s_list_log日志 5. 返回报到结果 #### 5.1.9 HIS医嘱推送接口 - **URL**: `POST /api/v1/T/CreateRecordXml` - **入参**: XML格式的医嘱信息(HL7标准) - **出参**: 接收确认消息 - **逻辑**: 1. 解析XML消息 2. 提取医嘱信息 3. 检查entrust_id是否已存在(防止重复) 4. 写入s_list表(list_status=0) 5. 返回确认消息 #### 5.1.10 PACS报到通知接口 - **URL**: `POST /api/PacsSignIn` - **入参**: ```json { "reg_num": "登记号", "entrust_id": "医嘱ID" } ``` - **出参**: 报到确认 - **逻辑**: 1. 查询医嘱记录 2. 更新list_status=2 3. 记录报到时间 4. 记录日志 ### 5.2 数据库表详细设计 #### 5.2.1 预约主表 (s_list) ```sql CREATE TABLE `s_list` ( `id` bigint(10) UNSIGNED NOT NULL AUTO_INCREMENT, `list_status` int(11) DEFAULT NULL COMMENT '0申请中/1预约/2登记/3结束', `reg_num` varchar(255) COMMENT '登记号', `user_name` varchar(255) COMMENT '患者姓名', `user_sex` varchar(255) COMMENT '患者性别', `user_age` varchar(255) COMMENT '患者年龄', `user_brithday` varchar(255) COMMENT '生日', `user_phone` varchar(255) COMMENT '电话', `idCardNumber` varchar(100) COMMENT '身份证号', `entrust` varchar(255) COMMENT '医嘱名称', `entrust_code` varchar(100) COMMENT '医嘱代码', `entrust_id` varchar(255) COMMENT 'HIS医嘱ID(唯一)', `entrust_date` varchar(255) COMMENT '医嘱日期', `entrust_time` varchar(255) COMMENT '医嘱时间', `app_num` varchar(255) COMMENT '申请单号', `reservation_department` varchar(255) COMMENT '申请科室', `reservation_department_code` varchar(255) COMMENT '申请科室代码', `RISRAcceptDeptCode` varchar(255) COMMENT '执行科室代码', `department_id` int(11) COMMENT '预约科室ID', `reservation_date` date COMMENT '预约日期', `reservation_time` varchar(255) COMMENT '预约时间段ID', `reservation_sources` varchar(255) COMMENT '预约资源ID', `roster_id` int(11) COMMENT '预约计划明细ID', `services_group` varchar(100) COMMENT '服务组', `appointment_type_id` int(11) COMMENT '占用号源的渠道ID', `qudao_appointment_type_id` int(11) COMMENT '预约来源渠道ID', `patient_type` varchar(11) COMMENT '0住院/1门诊/2急诊/3体检', `is_pay` varchar(255) COMMENT '是否缴费 1是/0否', `his_is_emergency` tinyint(4) DEFAULT 0 COMMENT 'HIS加急标记', `is_emergency` tinyint(4) DEFAULT 0 COMMENT '加急预约', `warddesc` varchar(255) COMMENT '病区', `wardcode` varchar(50) COMMENT '病区编号', `bedname` varchar(255) COMMENT '床号名称', `bedno` varchar(50) COMMENT '床号', `hospital_number` varchar(255) COMMENT '住院号', `reg_date` date COMMENT '登记日期', `reg_time` time COMMENT '登记时间', `canel_time` datetime COMMENT '取消预约时间', `canel_type` varchar(255) COMMENT '取消类型', `addtime` datetime COMMENT '预约时间', `check_num` varchar(255) COMMENT '检查号', `RISRExamID` varchar(255) COMMENT '检查号', `medicalHistory` varchar(1000) COMMENT '病史摘要', `diagnosisName` varchar(255) COMMENT '临床诊断', `check_aply_pdf` varchar(1000) COMMENT '申请单PDF地址', `is_del` int(4) DEFAULT 0 COMMENT '是否删除', `is_nullify` int(4) DEFAULT 0 COMMENT '是否作废', `entrust_status` varchar(2) COMMENT '医嘱状态', `flag_tag` varchar(255) COMMENT 'HIS同步标记', `flag_str` varchar(2550) COMMENT '取消原因', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `list_status` (`list_status`), INDEX `reg_num` (`reg_num`), INDEX `entrust_id` (`entrust_id`), INDEX `reservation_date` (`reservation_date`) ) ENGINE=InnoDB; ``` #### 5.2.2 预约计划明细渠道数量表 (s_source_roster_detail_count) ```sql CREATE TABLE `s_source_roster_detail_count` ( `id` int(11) NOT NULL AUTO_INCREMENT, `roster_detail_id` int(10) COMMENT '计划明细ID', `appointment_type_id` int(10) COMMENT '预约渠道ID', `count` int(10) DEFAULT 0 COMMENT '可预约数量', `used_count` int(10) DEFAULT 0 COMMENT '已预约数量', `locked_count` int(10) DEFAULT 0 COMMENT '占位数量', `max_total` int(10) DEFAULT 0 COMMENT '单日最大总量', `version` int(11) DEFAULT 0 COMMENT '乐观锁版本号', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='号源数量表(含乐观锁)'; ``` #### 5.2.3 检查项目表 (s_check_item) ```sql CREATE TABLE `s_check_item` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `item_code` varchar(255) COMMENT '检查项目代码', `item_class_id` int(11) COMMENT '项目分类ID', `sheetType` varchar(20) COMMENT 'HIS sheetType', `item_name` varchar(255) COMMENT '检查项目名称', `item_desc` varchar(255) COMMENT '描述', `reservation_method` varchar(100) COMMENT '支持的预约渠道', `limosis` int(11) COMMENT '是否空腹 1是/0否', `check_notice` varchar(8000) COMMENT '检查须知', `check_time` int(11) COMMENT '检查时长(分钟)', `check_begin_time` int(11) COMMENT '医嘱后等待时间(分钟)', `use_seats` int(10) DEFAULT 1 COMMENT '占位数量', `services_group` int(255) COMMENT '关联服务组', `status` int(4) DEFAULT 1 COMMENT '1启用/0停用', `is_del` int(11) DEFAULT 0 COMMENT '是否删除', PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='检查项目表'; ``` #### 5.2.4 检查项目互斥表 (s_huchi) ```sql CREATE TABLE `s_huchi` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code1` varchar(100) COMMENT '检查项目代码1', `code2` varchar(100) COMMENT '检查项目代码2', `time` int(11) COMMENT '互斥时间(小时),0永久互斥', `add_user` int(11) COMMENT '添加人', `is_del` int(4) COMMENT '是否删除', `created_at` timestamp DEFAULT CURRENT_TIMESTAMP, `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='项目互斥表'; ``` ### 5.3 页面结构设计 #### 5.3.1 管理后台页面结构 **预约计划模板页面 (PlanModel.vue)** ``` 页面布局: ┌─────────────────────────────────────────┐ │ 操作按钮区 │ │ [添加] [删除] [生成选中的计划] │ ├─────────────────────────────────────────┤ │ 筛选区 │ │ [工作日/节假日] [夏令时/冬令时] │ ├─────────────────────────────────────────┤ │ 号源模板表格 │ │ ┌─左侧资源列表──┬─右侧时段表格───────┐ │ │ │ 资源1 │ 时段1 时段2 时段3 │ │ │ │ 资源2 │ 周一 周二 周三... │ │ │ │ ... │ [号源配置格子] │ │ │ └─────────────┴────────────────────┘ │ │ │ │ 号源格子结构: │ │ ┌─────────────┐ │ │ │ [勾选框] │ │ │ │ 总:X 住院:X │ │ │ │ 门诊:X 急诊:X│ │ │ │ 体检:X │ │ │ │ [编辑] [占位]│ │ │ └─────────────┘ │ └─────────────────────────────────────────┘ 弹窗: - 添加/编辑模板弹窗 - 占位数量设置弹窗 ``` **医嘱工作列表页面 (MainList.vue)** ``` 页面布局: ┌─────────────────────────────────────────┐ │ 搜索区 │ │ [日期范围] [状态] [患者类型] [资源] │ │ [服务组] [登记号] [姓名] [科室] [医生] │ │ [查询] │ ├─────────────────────────────────────────┤ │ 操作按钮区 │ │ [预约] [取消预约] [更改预约] │ │ [报到] [取消报到] [打印申请单] │ ├─────────────────────────────────────────┤ │ 医嘱列表表格 │ │ ┌────┬────┬────┬────┬────┬────┬────┐ │ │ │勾选│状态│登记号│姓名│性别│年龄│医嘱│ │ │ ├────┼────┼────┼────┼────┼────┼────┤ │ │ │ □ │申请│002.. │张三│男 │45 │CT │ │ │ │ □ │预约│003.. │李四│女 │30 │MRI │ │ │ └───────────────────────────────────┘ │ │ │ │ 表格列: │ │ - 勾选框、状态、登记号、姓名、性别 │ │ - 年龄、医嘱、是否缴费、预约日期 │ │ - 预约时间、预约资源、服务组、申请科室 │ │ - 医嘱时间、申请医生、病人类型、电话 │ │ - 操作(查看日志) │ └─────────────────────────────────────────┘ 弹窗: - 预约弹窗(选择时段) - 日志查看弹窗 - 申请单打印预览 ``` #### 5.3.2 自助机页面结构 **医嘱列表页面 (CheckItemMainList.vue)** ``` 页面布局(大屏触摸屏风格): ┌─────────────────────────────────────────┐ │ 患者信息区 │ │ 姓名:张XX 性别:女 电话:199... │ │ 登记号:002000022 │ ├─────────────────────────────────────────┤ │ 日期选择 │ │ [日期范围选择器] │ ├─────────────────────────────────────────┤ │ 医嘱列表(大卡片) │ │ ┌───────────────────────────────────┐ │ │ │ 检查项目:CT检查 [待预约] │ │ │ │ 医嘱时间:2024-01-01 申请科室:内科 │ │ │ │ [开始预约] │ │ │ └───────────────────────────────────┘ │ │ │ │ ┌───────────────────────────────────┐ │ │ │ 检查项目:MRI检查 [已预约] │ │ │ │ 预约时段:2024-01-05 08:00~09:00 │ │ │ │ [取消] [改约] │ │ │ └───────────────────────────────────┘ │ └─────────────────────────────────────────┘ ``` **预约时段选择页面 (PlanList.vue)** ``` 页面布局: ┌─────────────────────────────────────────┐ │ 顶部 │ │ [返回] 选择预约时间 │ ├─────────────────────────────────────────┤ │ 日期选择 │ │ [2024-01-01] [2024-01-02] [2024-01-03] │ ├─────────────────────────────────────────┤ │ 时段列表(大按钮) │ │ ┌───────┬───────┬───────┬───────┐ │ │ │08:00 │09:00 │10:00 │11:00 │ │ │ │~09:00 │~10:00 │~11:00 │~12:00 │ │ │ │[剩余5]│[剩余3]│[剩余0]│[剩余2]│ │ │ └───────┴───────┴───────┴───────┘ │ │ │ │ 点击时段显示详情: │ │ - 检查项目: XXX │ │ - 预约时段: XXX │ │ - 检查须知: XXX │ │ - [确认预约] [取消] │ └─────────────────────────────────────────┘ ``` #### 5.3.3 H5移动端页面结构 **登录页面 (Login.vue)** ``` 页面布局(移动端适配): ┌─────────────────────────────────────────┐ │ │ │ 患者登录 │ │ │ │ [请输入患者ID] │ │ │ │ [登录按钮] │ │ │ └─────────────────────────────────────────┘ ``` **医嘱列表页面** ``` 页面布局(uni-app移动端): ┌─────────────────────────────────────────┐ │ 标题: 我的检查项目 │ ├─────────────────────────────────────────┤ │ 医嘱卡片列表 │ │ ┌───────────────────────────────────┐ │ │ │ 检查项目:CT检查 │ │ │ │ 状态:待预约 │ │ │ │ 申请时间:2024-01-01 │ │ │ │ [预约] │ │ │ └───────────────────────────────────┘ │ └─────────────────────────────────────────┘ ``` --- ## 6. 部署与运维 ### 6.1 系统部署架构 ``` 生产环境部署建议: ┌─────────────────────────────────────────┐ │ Web服务器 (Nginx/Apache) │ │ ├─ 管理后台域名: admin.xxx.com │ │ ├─ 自助机域名:自助机.xxx.com │ │ └─ H5域名: h5.xxx.com │ └─────────────────────────────────────────┘ ↓ 反向代理 ┌─────────────────────────────────────────┐ │ Laravel后端服务 │ │ - PHP-FPM运行 │ │ - 端口: 9000 │ └─────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────┐ │ MySQL数据库 │ │ - 主从复制建议 │ │ - 定期备份 │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ Workerman WebSocket服务 │ │ - 端口: 2346 │ │ - 实时消息推送 │ └─────────────────────────────────────────┘ ┌─────────────────────────────────────────┐ │ C# HIS监听服务 (Windows服务器) │ │ - 安装为Windows Service │ │ - 监听MQ消息队列 │ │ - 日志记录: log4net │ └─────────────────────────────────────────┘ ``` ### 6.2 配置管理 #### 6.2.1 Laravel配置 (.env) ```env APP_NAME=秦皇岛中医院医技预约系统 APP_ENV=production APP_URL=https://admin.xxx.com DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=yiji_qhdzhongyiyuan DB_USERNAME=root DB_PASSWORD=xxx # HIS对接配置 HIS_MQ_HOST=192.168.1.100 HIS_MQ_PORT=1414 HIS_MQ_CHANNEL=CHAN1 HIS_MQ_QUEUE=QUEUE1 # PACS对接配置 PACS_API_URL=http://192.168.1.101/api PACS_API_KEY=xxx # 系统配置 PAY_TIMEOUT=30 # 门诊缴费超时(分钟) APPOINTMENT_TIMEOUT=60 # 预约超时(分钟) ``` #### 6.2.2 前端配置 ```javascript // YiJi-admin/src/config.js export default { API_BASE_URL: 'https://admin.xxx.com/api/v1', WS_URL: 'ws://192.168.1.10:2346', TOKEN_KEY: 'access_token', REFRESH_TOKEN_KEY: 'refresh_token' } ``` #### 6.2.3 C#监听服务配置 (App.config) ```xml ``` ### 6.3 运维监控 #### 6.3.1 日志管理 - Laravel日志: `storage/logs/laravel.log` - C#监听日志: log4net配置输出到文件 - API访问日志: 中间件`log`记录到数据库 #### 6.3.2 性能监控 - 数据库慢查询监控 - API响应时间监控 - 号源并发冲突监控(version失败率) #### 6.3.3 异常告警 - HIS消息接收异常告警 - 号源生成失败告警 - 预约并发冲突告警 --- ## 7. 附录 ### 7.1 HIS消息类型对照表 | 消息类型 | 消息说明 | 主要字段 | 处理逻辑 | |---------|---------|---------|---------| | MI0150 | 医嘱信息 | 患者信息、医嘱信息、科室信息 | 新增s_list记录 | | MI0164 | 医嘱状态变更 | 医嘱ID、状态 | 更新医嘱状态 | | MU0165 | 医嘱更新 | 医嘱信息 | 更新s_list记录 | | CI0047 | 检查信息 | 检查详情 | 更新检查信息 | | CI0054 | 检查相关 | 检查状态 | 更新检查状态 | | CI0055 | 检查相关 | 检查结果 | 更新检查结果 | | CD0050 | 检查确认 | 确认信息 | 更新确认状态 | | OI0083 | 医嘱订单 | 订单信息 | 处理订单 | | OD0084 | 订单更新 | 订单状态 | 更新订单状态 | | MU0151 | 其他更新 | 各类更新 | 按类型处理 | ### 7.2 预约渠道编码表 | 渠道ID | 渠道名称 | 简称 | 说明 | |-------|---------|-----|------| | 1 | 住院 | 住院 | 住院患者预约通道 | | 2 | 门诊 | 门诊 | 门诊患者预约通道 | | 3 | 急诊 | 急诊 | 急诊患者预约通道 | | 4 | 体检 | 体检 | 体检患者预约通道 | | 5 | 护士站 | 护士 | 护士站预约通道 | | 6 | 医生 | 医生 | 医生端预约通道 | ### 7.3 系统菜单结构示例 ``` 系统管理 ├─ 用户管理 ├─ 分组管理 ├─ 菜单管理 └─ 系统配置 基础数据 ├─ 科室管理 ├─ 科室资源管理 ├─ 设备管理 ├─ 检查项目管理 ├─ 项目分类管理 ├─ 项目互斥配置 ├─ 时间段管理 ├─ 病区管理 └─ HIS数据同步 预约管理 ├─ 预约计划模板 ├─ 渠道比例配置 ├─ 预约计划明细 ├─ 节假日配置 └─ 体检日历管理 业务处理 ├─ 医嘱工作列表 ├─ 医生预约入口 ├─ 预约统计 ├─ 渠道统计 └─ 开单统计 ``` ### 7.4 关键业务规则 #### 7.4.1 预约规则 1. 门诊患者必须缴费后才能预约(可配置开关) 2. 急诊患者优先预约,可使用加急通道 3. 检查项目互斥校验(如增强CT和普通CT不能同一天) 4. 医嘱开立后需等待check_begin_time才能预约 5. 预约必须在end_reservation_time之前完成 #### 7.4.2 号源分配规则 1. 各渠道号源按比例分配(s_appointment_type_ratio) 2. 可合并渠道号源(link字段配置) 3. 占位号源优先预留(locked_count) 4. 号源不足时可跨渠道借号源(需配置) #### 7.4.3 取消预约规则 1. 门诊患者缴费超时自动取消(可配置超时时间) 2. 取消后释放号源(递减used_count) 3. 记录取消原因和时间 4. 向PACS推送取消通知 #### 7.4.4 报到规则 1. 必须在预约日期当天报到 2. 过期预约不可报到,需重新预约 3. 报到后状态变为"已登记" 4. PACS报到同步(接收PacsSignIn接口) --- ## 8. 总结 本需求文档详细描述了秦皇岛中医院医技预约系统的业务需求、技术架构和实现细节。系统核心功能包括: 1. **HIS集成**: 通过MQ消息队列接收医嘱信息,自动同步基础数据 2. **多渠道预约**: 支持管理后台、自助机、H5移动端等多种预约方式 3. **号源管理**: 灵活的号源模板和渠道比例配置,支持乐观锁防止并发冲突 4. **业务流程**: 完整的医嘱接收→预约→报到→检查完成流程 5. **统计分析**: 多维度预约统计和运营监控 系统采用前后端分离架构,后端基于Laravel 8提供RESTful API,前端使用Vue 3和uni-app构建多端应用,通过C#监听服务实现HIS集成,整体架构清晰、扩展性强。 --- **文档版本**: V1.0 **编写日期**: 2026-04-03 **编写人**: Claude AI **审核人**: 待定 **批准人**: 待定