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;
|
|
public class Utils {
|
public static LocalTime parseTime(String strTime) {
|
String regex = "(\\d+)[::](\\d+)";
|
Pattern pattern = Pattern.compile(regex);
|
Matcher matcher = pattern.matcher(strTime);
|
|
if (!matcher.find())
|
return null;
|
|
// 获取整个匹配的字符串
|
String fullMatch = matcher.group();
|
|
// 获取第一个捕获组(小时)
|
String strOpenHour = matcher.group(1);
|
|
// 获取第二个捕获组(分钟)
|
String strOpenMinute = matcher.group(2);
|
|
LocalTime localTime = LocalTime.of(Integer.valueOf(strOpenHour), Integer.valueOf(strOpenMinute));
|
return localTime;
|
}
|
|
public static List<LocalTime> parseOpeningTime(String strOpeningTime) {
|
String regex = "(\\d+)[::](\\d+)~(\\d+)[::](\\d+)";
|
Pattern pattern = Pattern.compile(regex);
|
Matcher matcher = pattern.matcher(strOpeningTime);
|
|
if (!matcher.find())
|
return null;
|
|
// 获取整个匹配的字符串
|
String fullMatch = matcher.group();
|
|
// 获取第一个捕获组(小时)
|
String strOpenHour = matcher.group(1);
|
|
// 获取第二个捕获组(分钟)
|
String strOpenMinute = matcher.group(2);
|
|
// 获取第一个捕获组(小时)
|
String strCloseHour = matcher.group(3);
|
|
// 获取第二个捕获组(分钟)
|
String strCloseMinute = matcher.group(4);
|
|
LocalTime localOpenTime = LocalTime.of(Integer.valueOf(strOpenHour), Integer.valueOf(strOpenMinute));
|
LocalTime localCloseTime = LocalTime.of(Integer.valueOf(strCloseHour), Integer.valueOf(strCloseMinute));
|
List openCloseTime = new ArrayList<LocalTime>();
|
openCloseTime.add(localOpenTime);
|
openCloseTime.add(localCloseTime);
|
return openCloseTime;
|
}
|
|
public static String formatRoomBed(Long roomId, String bedNo) {
|
return String.format("%09d%s", roomId, bedNo);
|
}
|
|
public static List<LocalTime> parseTimeSlotList(String strTimeSlotList, Integer timeslotLength) {
|
List<LocalTime> localTimeList = new ArrayList<>();
|
|
// 7:30,8:30,9:30,10:30,11:30,12:30,13:30,14:30,15:30
|
String[] arrTimeSlotItemStr = strTimeSlotList.split(",|,");
|
Arrays.stream(arrTimeSlotItemStr).forEach( strTimeSlot -> {
|
String regex = "(\\d+)[::](\\d+)";
|
Pattern pattern = Pattern.compile(regex);
|
Matcher matcher = pattern.matcher(strTimeSlot);
|
if (!matcher.find())
|
return;
|
|
// 获取整个匹配的字符串
|
String fullMatch = matcher.group();
|
|
// 获取第一个捕获组(小时)
|
String strHour = matcher.group(1);
|
|
// 获取第二个捕获组(分钟)
|
String strMinute = matcher.group(2);
|
|
LocalTime localTimeSlot = LocalTime.of(Integer.valueOf(strHour), Integer.valueOf(strMinute));
|
localTimeList.add( localTimeSlot );
|
} );
|
|
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();
|
}
|
}
|