# registration-flow Specification ## Purpose 定义 `PRI-MP-REG-001` 预约挂号基础流程,包括挂号入口、须知确认、就诊人依赖、科室/医生/号源选择、实际费用查询、提交校验、锁号和支付确认衔接。写操作严格遵循旧版顺序,由用户点击提交或确认后执行;页面生命周期不得自动触发。 ## Requirements ### Requirement: REQ-REG-001-01 挂号页路由与入口 系统 MUST 提供预约挂号主页面,并通过统一入口可发现。 - MUST:挂号页路由为 `pages/index/pages/register/register`,在 `app.json` 的 `pages` 数组中注册。 - MUST:`utils/homeRoute.js` 白名单包含 `pages/index/pages/register/register`(type: navigateTo)。 - MUST:`utils/homeMenu.js` 的 `DEFAULT-REG` 条目 `routePath` 为 `/pages/index/pages/register/register`。 - MUST:首页"预约挂号"入口点击后进入真实挂号页,不再跳转导诊 tab。 - MUST:医院简介"预约挂号"入口(如 `hospitalIntro.onGoRegister` 存在)指向真实挂号页。 #### Scenario: 预约挂号入口 - Given 用户位于首页或医院简介页 - When 用户点击"预约挂号"入口 - Then 系统 MUST 导航至 `/pages/index/pages/register/register`,不得跳转至导诊 tab 或其他临时页。 ### Requirement: REQ-REG-001-02 挂号须知 系统 MUST 在挂号前向用户展示挂号须知,用户完成阅读确认后方可进入选择流程。 - MUST:保留 `02010011` 的医院须知配置读取,并支持旧源码 `03100136`(`openID`、`hospCode`、`type: O`)返回的 `NoticeContent` 富文本作为优先内容或回退内容。 - MUST:当医院富文本缺失或读取失败时,完整展示旧版结构化须知(就诊凭证、按时就诊、退号/取消预约、候诊安排、医生停诊处理及结束语),并在存在时展示院区配置文案;不得退化为单段笼统提示。 - MUST:须知加载完成后开始 5 秒阅读倒计时;倒计时未结束时确认 CTA 不可操作,即使用户已勾选确认。 - MUST:对 `H10` 展示旧流程中“取消预约”和“爽约处理”的院区差异规则;其他院区展示通用退号规则。 - MUST:须知失败时提供可见的重新加载入口,不得出现不可操作空白页。 #### Scenario: 阅读倒计时与确认 - Given 用户进入挂号须知页且内容已加载 - When 用户勾选须知但 5 秒倒计时尚未结束 - Then 系统 MUST 保持 CTA 禁用并显示剩余阅读秒数。 - When 倒计时结束且用户已勾选须知 - Then 系统 MUST 允许进入科室选择流程。 #### Scenario: 医院未配置富文本 - Given 当前医院未返回 `NoticeContent` - When 用户进入挂号须知页 - Then 系统 MUST 展示可滚动的完整结构化须知,且不以单段通用提示替代。 ### Requirement: REQ-REG-001-03 患者选择 系统 MUST 复用 `PRI-MP-USER-001` 契约展示当前就诊人,支持切换。 - MUST:使用 `pri-patient-card` 展示当前就诊人(姓名、脱敏手机、脱敏证件、默认标识)。 - MUST:使用 `pri-patient-sheet` 提供就诊人切换入口(`visible`、`pick`、`close` 事件)。 - MUST:无就诊人时展示"请添加就诊人"提示,不实现新增就诊人功能。 - MUST:通过 `patientSelector.loadPatientList()` 加载就诊人列表。 - MUST:通过 `patientSelector.onPatientChange(listener)` 监听患者切换事件。 - MUST NOT:不调用就诊人新增/编辑/删除/绑卡/实名/OCR/人脸识别接口。 #### Scenario: 患者选择 - Given 挂号页已加载 - When 用户未选择就诊人 - Then 系统 MUST 展示空态提示;用户点击切换后展示 `pri-patient-sheet`,选中后更新患者卡。 ### Requirement: REQ-REG-001-04 科室列表 系统 MUST 按旧源码 `03100037` 的 `allLoc` 树形结构完成科室选择,避免将一级展示节点误作可预约科室。 - MUST:一级科室只作为分组入口;点击一级科室后展示其二级科室,不得直接以一级节点查询医生。 - MUST:只有二级科室或搜索结果中的可预约叶子节点可以写入 `selectedDept` 并进入医生列表。 - MUST:搜索命中二级科室时展示其所属一级科室,帮助用户确认科室归属。 - MUST:当一级科室未配置二级科室时,提供明确提示,不得出现无响应点击。 #### Scenario: 选择二级科室进入医生列表 - Given `03100037` 返回包含一级科室和 `children` 二级科室的 `allLoc` - When 用户点击一级科室 - Then 系统 MUST 留在科室选择页并展示该一级科室下的二级科室。 - When 用户点击其中一个二级科室 - Then 系统 MUST 使用该二级科室的 `locID` 查询医生列表。 ### Requirement: REQ-REG-001-05 医生列表 系统 MUST 提供医生列表查询和选择能力,并准确限制不可预约医生。 - MUST:`03100038` 与 `03100221` 任一查询成功时,展示可用查询结果;仅当两者均失败时展示整体错误态。 - MUST:`03100221` 请求体 SHALL 对齐旧版 `chooseDoctor`,仅传 `hospCode` 与 `docDesc`;科室范围如有需要 SHALL 在真实返回后按 `locID` 前端筛选,不得发送旧版不存在的 `locID`、`pageIndex` 或 `pageSize`。 - MUST:根据后端归一后的 `bookDisabled`/可预约状态展示“暂不可预约”,且不可继续进入日期选择。 - MUST:医生选择态只在当前条目身份字段匹配时高亮,不得将整个列表误渲染为已选。 #### Scenario: 一个医生来源失败 - Given 用户已选择科室 - When `03100038` 或 `03100221` 中一个接口失败、另一个接口返回医生 - Then 系统 MUST 展示成功返回的医生列表,并给出非阻塞刷新提示,不得显示整页失败。 ### Requirement: REQ-REG-001-06 日期与号源选择 系统 MUST 基于真实可预约状态提供日期、排班和号源时段选择。 - MUST:优先使用 `03100039` 返回的医生可预约日期;`99070002` 只可作为日期展示/查询回退,不能把未知日期误标记为可预约。 - MUST:解析 `03100040` 返回的余号、满号和禁用状态;已满或禁用号源应可见但不可选择。 - MUST:当 `03100040.resDetail[]` 返回 `price` 时,号源卡片 SHALL 将其格式化为费用展示;不得只识别 `resFee` 等替代字段而把已返回价格错误显示为“费用待确认”。 - MUST:用户选择具体号源后 SHALL 按旧版调用 `03100105`,并以 `locResDetailID`、`patID`、`hisPatNo` 查询实际挂号费用。`03100040` 未返回费用时不得默认展示 `0`;`03100105` 失败或无有效金额时,系统 MUST 显示费用待确认/重试状态并阻止提交。 - MUST:日期和号源选择态只在唯一身份字段匹配时高亮。 - MUST:号源卡片以 `resTimeID` 作为时段选择主键,并使用稳定的派生键防止异常重复 ID 导致多卡同时高亮;提交前校验须按旧流程分别传递选中 `resDetailID` 和 `resTimeID`。 - MUST:日期加载成功后默认选择最早的可预约日期(医生详情直达时优先选择传入且可预约的日期),并在固定底部确认栏明确提示用户继续选择时段或确认。 - MUST:当用户已在医生详情页选择可预约日期和时段后进入预约挂号,系统 MUST 跳过须知页并直达时间选择步骤;挂号页重新读取号源后,只有该时段仍可预约时才恢复其选中态。 - MUST:挂号流程中的就诊人卡片和其“切换”按钮都 MUST 打开同一就诊人选择面板。 - MUST:确认挂号步骤的提交 CTA MUST 固定在底部安全区,且内容区须预留足够空间以避免挂号信息被遮挡。 - MUST:医生详情直达预约在时间选择步骤返回时 MUST 回到医生详情页;不得进入未加载科室/医生列表的上一步页面。 #### Scenario: 已满号源 - Given 用户已选择日期且接口返回余号为零或禁用的号源 - When 用户查看号源列表 - Then 系统 MUST 显示已满状态且阻止继续确认该号源。 #### Scenario: 实际费用查询失败 - Given 用户已选中可预约号源 - When `03100105` 未返回可解析金额 - Then 系统 MUST 不进入提交步骤,显示重新获取费用入口,且不得以 `0` 代替服务端费用。 ### Requirement: REQ-REG-001-07 确认前汇总 系统 MUST 在提交前向用户展示完整的挂号信息汇总。 - MUST:通过 `03040041` 获取确认前基础信息归一(参数 `hospID`、`hospCode`、`locID`、`doctorID`、患者字段)。 - MUST:展示患者姓名、医生姓名、科室、日期、时段、费用等汇总信息。 - MUST:无独立设计时按新版表单/订单确认类标准外推(参考 `01-项目文档_docs/02-UI标准`)。 - MUST:状态矩阵覆盖加载中、接口失败。 #### Scenario: 确认前汇总展示 - Given 用户已完成科室/医生/日期/时段选择 - When 用户进入确认前汇总页 - Then 系统 MUST 展示完整挂号信息供用户核对。 ### Requirement: REQ-REG-001-08 提交前校验 系统 MUST 恢复旧版挂号的校验、锁号和支付上下文承接,并确保无有效订单时不进入可支付状态。 - MUST:用户选定具体号源后,系统 SHALL 按旧版在提交前调用 `03100105` 查询患者和号源对应的实际挂号费用。请求参数 MUST 为 `locResDetailID`(选中 `resDetailID`)、`patID`、`hisPatNo`,并使用服务端 `result` 作为唯一实际金额来源。 - MUST:`03100040` 仅用于日期/号源可约状态及其明确返回的展示信息;当其未返回费用时,页面 SHALL 显示“费用待确认”,不得以本地 `0` 代替。`03100105` 未返回有效金额时 MUST 阻止提交或支付,并允许用户重新查询。 - MUST:先通过 `03100090` 做重复预约与号源有效性校验;校验失败时 SHALL 引导用户重新选择,不得锁号或支付。 - MUST:校验通过后使用患者、医院、日期明细和时段 ID 调用 `03050234` 锁号;只有服务端成功返回的锁号订单才能进入预结算。 - MUST:将锁号订单号、排班 ID、费用、患者和医院字段传入 PAY-001 的挂号支付适配器;支付模块 SHALL 生成并保存服务端返回的 `payTradeNum`。 - MUST:锁号、预结算或支付失败时保留选项并展示可恢复状态;不得以本地模拟订单、静态费用或空交易号跳转支付确认页。 - MUST NOT:在用户未提交、校验失败、订单无效或必要业务字段缺失时主动锁号、创建支付订单或调用微信支付。 #### Scenario: 挂号提交进入支付 - **GIVEN** 用户已完成就诊人、科室、医生、日期和号源选择 - **WHEN** 用户提交挂号且 `03100090` 校验通过 - **THEN** 系统 SHALL 按旧版顺序锁号并生成支付交易上下文,再进入支付确认页;若任一步返回失败,系统 SHALL 停留在当前步骤并提供明确错误反馈 #### Scenario: 号源费用未返回 - **GIVEN** 用户已选择可预约号源 - **WHEN** `03100105` 请求失败或没有返回可解析的金额 - **THEN** 系统 SHALL 显示费用获取失败和重新查询入口,且不得将金额写为 `0` 或继续进入提交/支付流程 ### Requirement: REQ-REG-001-09 AI 导诊入口 系统 MUST 在挂号页提供 AI 导诊入口,供用户跳转或了解。 - MUST:AI 导诊入口可见,位于页面适当位置(参考 `page-register` 布局)。 - MUST:点击后跳转 `PRI-MP-GUIDE-001` 页面路由(如 `PRI-MP-GUIDE-001` 已开发)。 - MUST:如 `PRI-MP-GUIDE-001` 尚未开发,显示"建设中"兜底提示。 - MUST NOT:不实现真实 AI 推荐逻辑。 #### Scenario: AI 导诊入口 - Given 用户位于挂号页 - When 用户点击 AI 导诊入口 - Then 系统 MUST 跳转至 AI 导诊页或显示"建设中"兜底。 ### Requirement: REQ-REG-001-10 状态矩阵 系统 MUST 覆盖以下异常和边界状态: | 场景 | 触发条件 | 页面表现 | 操作入口 | |------|----------|----------|----------| | 加载中 | 任一查询接口请求中 | 骨架屏/加载态 | 无 | | 空数据 | 无科室/医生/号源 | 空态和说明 | 换日期/换科室/返回 | | 接口失败 | 查询接口失败 | 错误提示 | 重试 | | 未登录 | 无登录态 | 登录提示 | 触发基础登录 | | 未绑定就诊人 | 无当前患者 | 患者选择提示 | 切换/去添加占位 | | 无权限 | 后端返回权限错误 | 暂无预约权限 | 返回首页 | | 号源失效 | 选择后后端返回无号 | 号源已变化 | 重新选择 | | 首页入口未接通 | 点击首页预约挂号仍进入导诊 tab | 视为入口衔接失败 | 修正路由白名单 | | 越界医生详情 | 点击医生条进入完整医生中心 | 视为模块越界 | 改为挂号链路入口 | #### Scenario: 异常状态处理 - Given 任一接口返回异常状态 - When 系统渲染挂号页 - Then 系统 MUST 显示对应状态文案和允许的入口,不得进入不可操作空白页。 ### Requirement: REQ-REG-001-11 UI 还原标准 - MUST:遵循 `01-项目文档_docs/02-UI标准`:主色 `#1677FF`、渐变、圆角 36rpx/44rpx、阴影、字号 token 与 `app.wxss` 保持一致。 - MUST:`page-register` 布局、颜色、卡片、圆角、间距、CTA 和入口优先级高度还原。 - MUST:医生条只展示挂号链路必要信息(姓名、科室、可预约状态),不展示完整医生详情。 - MUST:确认前汇总按新版表单/订单确认类标准外推。 #### Scenario: page-register UI 还原 - Given 用户进入预约挂号页 - When 页面完成渲染 - Then 系统 MUST 按新版 `page-register` 的布局展示挂号须知、患者选择、AI 导诊入口、科室列表、医生条和确认前汇总,并保持项目 UI token 一致。 ### Requirement: REQ-REG-001-12 写操作边界 系统 MUST 严格控制以下接口或能力的触发边界: - `03100105`:号源选定后按旧版字段查询最终挂号费用,属于只读查询。 - `03050234`:仅在用户点击提交且 `03100090` 校验通过时按旧版字段锁号。 - `01050002`/`wx.requestPayment`:仅由 PAY-001 支付确认页在用户二次确认后执行。 - `01050005`/`01050010`/`01050011`:仅由 PAY-002 医保页在用户明确确认后执行。 - 就诊人新增/编辑/删除/绑卡/实名/OCR/人脸识别接口由 USER 模块承接,不得由挂号页越界调用。 #### Scenario: 挂号提交受控衔接 - Given 用户完成确认前汇总并点击提交 - When 系统执行提交前校验 - Then 系统 MUST 仅按旧版顺序执行 `03100090 → 03050234 → PAY-001`;不得在挂号页调用微信支付、医保或就诊人写入类接口。