Files
zyt/DIAGNOSIS_LIST_SORTING.md
T
2026-04-11 18:06:02 +08:00

2.6 KiB

诊单列表排序规则修改

修改内容

修改了诊单列表的排序逻辑,按照新的业务规则对数据进行排序。

排序规则

优先级顺序

  1. 已过号 (status=4) - 最优先显示
  2. 已预约 (status=1) - 第二优先
  3. 已完成 (status=3) - 第三优先
  4. 其他状态 - 最后显示

同状态内排序

在同一状态内,按以下规则升序排列:

  • 挂号日期 (appointment_date)
  • 挂号时间 (appointment_time)
  • 诊单ID (id) 降序

技术实现

排序SQL逻辑

// 获取最早的挂号状态(用于排序优先级)
$minAptStatusExpr = '(SELECT apt.status FROM ' . $aptTbl . ' apt 
    WHERE apt.patient_id = ' . $diagTbl . '.id 
    AND apt.status IN (1,3,4)' . $minAptDateCond . ' 
    ORDER BY CASE apt.status 
        WHEN 4 THEN 1 
        WHEN 1 THEN 2 
        WHEN 3 THEN 3 
        ELSE 4 
    END, 
    apt.appointment_date ASC, 
    apt.appointment_time ASC 
    LIMIT 1)';

// 获取最早的挂号时间(用于同状态内排序)
$minAptExpr = '(SELECT MIN(CONCAT(apt.appointment_date, \' \', 
    IFNULL(NULLIF(TRIM(apt.appointment_time), \'\'), \'00:00:00\'))) 
    FROM ' . $aptTbl . ' apt 
    WHERE apt.patient_id = ' . $diagTbl . '.id 
    AND apt.status IN (1,3,4)' . $minAptDateCond . ')';

// 最终排序
->orderRaw('CASE IFNULL(' . $minAptStatusExpr . ', 999) 
    WHEN 4 THEN 1 
    WHEN 1 THEN 2 
    WHEN 3 THEN 3 
    ELSE 4 
END ASC, 
IFNULL(' . $minAptExpr . ", '9999-12-31 23:59:59') ASC, 
{$diagTbl}.id DESC")

关键点

  1. 子查询获取状态: 使用子查询获取每个诊单最早的挂号状态
  2. CASE表达式: 将状态映射为排序优先级数字 (1-4)
  3. IFNULL处理: 对于没有挂号的诊单,使用默认值 999 和 '9999-12-31 23:59:59'
  4. 日期筛选支持: 如果传入 appointment_date 参数,只按该日期的挂号排序

修改文件

  • server/app/adminapi/lists/tcm/DiagnosisLists.php

验证步骤

  1. 清除缓存: php think clear
  2. 访问诊单列表页面
  3. 验证排序顺序:
    • 已过号的诊单显示在最前面
    • 然后是已预约的诊单
    • 最后是已完成的诊单
  4. 验证同状态内按挂号时间升序排列

业务场景

此排序规则适用于以下场景:

  • 医生/医助需要优先处理已过号的患者(可能需要重新安排)
  • 然后关注即将到来的预约
  • 最后查看已完成的历史记录

注意事项

  • 排序只考虑状态为 1(已预约)、3(已完成)、4(已过号) 的挂号记录
  • 没有挂号记录的诊单会排在最后
  • 如果一个诊单有多条挂号记录,取最早的一条进行排序