| | |
| | | package cn.lihu.jh.module.ecg; |
| | | |
| | | import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO; |
| | | |
| | | import java.time.LocalTime; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.List; |
| | | import java.util.Objects; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | |
| | | |
| | | return localTimeList; |
| | | } |
| | | |
| | | /** |
| | | * 把「亲和项」插回到它的「主项」后面,使两者在界面上紧挨着显示。 |
| | | * |
| | | * <p>亲和项 = 同一患者的另一个检查项目:主项进候诊时它一起进,主项做完时它一起做完 |
| | | * (见 {@code QueueServiceTxFunctions#procAffinityWhenPreempt})。 |
| | | * |
| | | * <p>之所以抽成一个方法:这段逻辑在工作台列表、诊间屏、大屏共 <b>5 处</b>重复, |
| | | * 而原实现有两个坑(随「排队号统一」改造一并修正): |
| | | * <ol> |
| | | * <li>只用 {@code seqNum} 相等来定位主项。排队号改为「按检查类型各自编号」后号会跨检查类型重复, |
| | | * 可能把亲和项插到<b>别的检查类型</b>的患者后面;故同时要求 {@code patId} 相同。</li> |
| | | * <li>用 {@code ==} 比较 {@code Integer}:号大于 127 时是引用比较、永远不相等, |
| | | * 亲和项被 {@code remove} 之后插不回去 —— 表现为<b>亲和项在列表里消失</b> |
| | | * (时段号规则下号很容易超过 127)。改为按值比较,并加"找不到主项就追加到末尾"的兜底。</li> |
| | | * </ol> |
| | | * |
| | | * @param list 已排好序的列表(调用方需先把亲和项从中移除) |
| | | * @param affinityItems 被移除出来的亲和项 |
| | | */ |
| | | public static void insertAffinityItemsAfterMain(List<QueueDO> list, List<QueueDO> affinityItems) { |
| | | if (list == null || affinityItems == null || affinityItems.isEmpty()) { |
| | | return; |
| | | } |
| | | for (QueueDO affinityItem : affinityItems) { |
| | | boolean inserted = false; |
| | | for (int i = list.size() - 1; i >= 0; i--) { |
| | | QueueDO mainItem = list.get(i); |
| | | if (isSameSeqNum(affinityItem.getSeqNum(), mainItem.getSeqNum()) |
| | | && Objects.equals(affinityItem.getPatId(), mainItem.getPatId())) { |
| | | list.add(i + 1, affinityItem); |
| | | inserted = true; |
| | | break; |
| | | } |
| | | } |
| | | if (!inserted) { |
| | | // 主项不在本列表(例如已就诊完成被状态过滤掉):兜底追加到末尾, |
| | | // 宁可位置不完美,也不能让候诊中的患者从列表里"消失"。 |
| | | list.add(affinityItem); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** 排队号按值比较({@code Integer} 用 {@code ==} 在大于 127 时是引用比较,会误判为不等) */ |
| | | private static boolean isSameSeqNum(Integer a, Integer b) { |
| | | return a != null && b != null && a.intValue() == b.intValue(); |
| | | } |
| | | } |
| | | |