Files
zyt/admin/APPOINTMENT_UI_UPDATE.md
T
2026-03-04 15:32:30 +08:00

8.3 KiB
Raw Blame History

预约问诊界面更新说明

更新内容

根据UI设计图更新了预约问诊组件,使其更符合实际业务需求。

新增功能

1. 预约方式选择

  • 选择时段预约有专医生:先选时间段,系统推荐有空的医生
  • 选择医生预约有专时段:先选医生,显示该医生的可用时间段

2. 预约类型

  • 视频问诊(可扩展:图文问诊、电话问诊等)

3. 患者信息

  • 显示当前患者姓名
  • 显示上次就诊记录

4. 医生选择优化

  • 单选按钮形式选择医生
  • 每个医生名称后显示可用号源数量标签
    • 有号源:绿色标签显示数字
    • 无号源:灰色标签显示"无"

5. 日期选择优化

  • 横向按钮式布局
  • 显示未来7天
  • 格式:02月26日 (四)
  • 选中状态:蓝色按钮

6. 时间段显示优化

  • 4列网格布局
  • 每个时间段包含:
    • 时间(如:09:00-09:30
    • 可用号源数量标签
  • 状态样式:
    • 可预约:白色背景 + 蓝色数字标签
    • 不可预约:灰色背景 + 灰色"无"标签
    • 已选择:蓝色背景 + 白色文字

界面布局

┌─────────────────────────────────────────────────────────┐
│ 预约问诊                                          [X]    │
├─────────────────────────────────────────────────────────┤
│ 上次就诊: 无就诊记录                                     │
│                                                          │
│ 预约方式: ○ 选择时段预约有专医生                         │
│          ● 选择医生预约有专时段                          │
│                                                          │
│ 预约类型: ● 视频问诊                                     │
│                                                          │
│ 选择患者: ● 刘炳希                                       │
│                                                          │
│ 预约医生: ● 樊平 [7]  ○ 樊雪芹 [7]  ○ 刘文英 [7]       │
│          ○ 王西诗 [7] ○ 吉红梅 [7]  ○ 李世伟           │
│          ○ 李新星 [7] ○ 喻小勇                          │
│                                                          │
│ 预约时间:                                                │
│  [02月26日(四)] [02月27日(五)] [02月28日(六)]           │
│                                                          │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐  │
│  │09:00-09:30│ │09:30-10:00│ │10:00-10:30│ │10:30-11:00│  │
│  │    无     │ │    无     │ │    无     │ │    无     │  │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘  │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐  │
│  │13:00-13:30│ │13:30-14:00│ │14:00-14:30│ │14:30-15:00│  │
│  │    无     │ │    无     │ │    无     │ │    无     │  │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘  │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐  │
│  │15:00-15:30│ │15:30-16:00│ │16:00-16:30│ │16:30-17:00│  │
│  │    无     │ │    无     │ │    无     │ │    无     │  │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘  │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐              │
│  │17:00-17:30│ │17:30-18:00│ │18:00-18:30│              │
│  │    无     │ │    无     │ │    无     │              │
│  └──────────┘ └──────────┘ └──────────┘              │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐              │
│  │19:00-19:30│ │19:30-20:00│ │20:00-20:30│              │
│  │    无     │ │    无     │ │    6      │ ← 选中      │
│  └──────────┘ └──────────┘ └──────────┘              │
│                                                          │
│ 备注: _______________________________________________    │
│                                                          │
├─────────────────────────────────────────────────────────┤
│                                      [取消]  [确定]      │
└─────────────────────────────────────────────────────────┘

技术实现要点

1. 时间段生成

// 生成30分钟间隔的时间段
const generateTimeSlots = () => {
  const slots = []
  // 上午: 09:00-12:00
  for (let hour = 9; hour < 12; hour++) {
    for (let minute = 0; minute < 60; minute += 30) {
      slots.push({
        time: `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`,
        period: 'morning'
      })
    }
  }
  // 下午: 13:00-20:30
  for (let hour = 13; hour <= 20; hour++) {
    for (let minute = 0; minute < 60; minute += 30) {
      if (hour === 20 && minute > 30) break
      slots.push({
        time: `${hour.toString().padStart(2, '0')}:${minute.toString().padStart(2, '0')}`,
        period: 'afternoon'
      })
    }
  }
  return slots
}

2. 医生可用号源统计

// 获取医生在指定日期的可用号源总数
const getDoctorAvailability = async (doctorId: number, date: string) => {
  const morningSlots = await getAvailableSlots({
    doctor_id: doctorId,
    date: date,
    period: 'morning'
  })
  
  const afternoonSlots = await getAvailableSlots({
    doctor_id: doctorId,
    date: date,
    period: 'afternoon'
  })
  
  const totalAvailable = [
    ...(morningSlots?.slots || []),
    ...(afternoonSlots?.slots || [])
  ].filter(slot => slot.available && slot.quota > 0).length
  
  return totalAvailable
}

3. 响应式布局

.time-slots-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  max-height: 400px;
  overflow-y: auto;
}

@media (max-width: 768px) {
  .time-slots-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

后端API需要返回的数据

1. 可用时间段接口增强

{
  "slots": [
    {
      "time": "09:00",
      "available": true,
      "quota": 5,  // 剩余号源数
      "total": 10  // 总号源数
    }
  ]
}

2. 医生可用号源统计接口(新增)

GET /doctor.appointment/doctorAvailability
参数:
{
  "doctor_id": 1,
  "date": "2024-02-26"
}

返回:
{
  "available_count": 7,  // 可用号源总数
  "total_count": 20      // 总号源数
}

用户体验优化

  1. 加载状态:在获取数据时显示加载动画
  2. 空状态提示:当没有可用时间段时显示友好提示
  3. 实时更新:选择医生或日期后立即加载时间段
  4. 视觉反馈
    • 可点击元素有hover效果
    • 选中状态明显区分
    • 不可用状态灰色显示
  5. 错误处理:网络错误时显示错误提示

扩展建议

  1. 智能推荐:根据患者历史就诊记录推荐医生
  2. 快速预约:一键预约最近可用时间
  3. 批量查看:同时查看多个医生的可用时间
  4. 日历视图:提供月历视图方便选择日期
  5. 收藏医生:支持收藏常用医生快速预约