yxh
6 天以前 68ff33beff11310e830b0615b5a81f83fad0f683
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/Utils.java
@@ -1,9 +1,12 @@
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;
@@ -91,5 +94,52 @@
        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();
    }
}