From 881827ae7e1b9a06a77d6cb6ce1177b10a990103 Mon Sep 17 00:00:00 2001 From: zzs Date: Mon, 7 Apr 2025 10:09:37 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9B=BE=E5=86=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E9=9B=B6=E4=BB=B6=E7=BC=96=E5=8F=B7=E6=8C=89=E7=85=A7?= =?UTF-8?q?=E5=8D=87=E5=BA=8F=E6=8E=92=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../em/ass/dynamic/AssepcNewDynamicEdut.java | 76 ++++++++++++------- 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/yem/em/ass/dynamic/AssepcNewDynamicEdut.java b/src/main/java/com/yem/em/ass/dynamic/AssepcNewDynamicEdut.java index 8a679858..b4942c38 100644 --- a/src/main/java/com/yem/em/ass/dynamic/AssepcNewDynamicEdut.java +++ b/src/main/java/com/yem/em/ass/dynamic/AssepcNewDynamicEdut.java @@ -46,6 +46,7 @@ import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; /** * @author zhouc @@ -777,42 +778,61 @@ public class AssepcNewDynamicEdut extends AbstractFormPlugin implements BeforeBi } public static void sortDynamicObjectCollection(DynamicObjectCollection data) { - List list = new ArrayList<>(data); + // 自定义比较器 + Comparator comparator = (obj1, obj2) -> { + String atlasNo1 = obj1.getString("yem_atlasno"); + String atlasNo2 = obj2.getString("yem_atlasno"); - Collections.sort(list, new Comparator() { - @Override - public int compare(DynamicObject o1, DynamicObject o2) { - BigDecimal num1 = parseBigDecimal(o1.getString("yem_atlasno")); - BigDecimal num2 = parseBigDecimal(o2.getString("yem_atlasno")); + List parsed1 = parseAtlasNo(atlasNo1); + List parsed2 = parseAtlasNo(atlasNo2); - // 如果两个都转换成功,按数值比较 - if (num1 != null && num2 != null) { - return num1.compareTo(num2); + // 如果两个都是有效编号,逐级比较 + if (parsed1 != null && parsed2 != null) { + int minLength = Math.min(parsed1.size(), parsed2.size()); + for (int i = 0; i < minLength; i++) { + int compare = Integer.compare(parsed1.get(i), parsed2.get(i)); + if (compare != 0) { + return compare; + } } - - if (num1 != null) { - return -1; - } - if (num2 != null) { - return 1; - } - - // 如果两个都失败,按字符串比较 - return o1.getString("yem_atlasno").compareTo(o2.getString("yem_atlasno")); + // 如果前缀相同,较短的编号排在前面 + return Integer.compare(parsed1.size(), parsed2.size()); } - }); - // 将排序后的结果重新赋值给原集合 - data.clear(); - data.addAll(list); + // 如果一个是有效编号,另一个无效,有效编号排在前面 + if (parsed1 == null && parsed2 != null) { + return 1; // obj1 无效,排在后面 + } + if (parsed1 != null && parsed2 == null) { + return -1; // obj2 无效,排在后面 + } + + // 如果两个都无效,按字符串字典序排序 + return atlasNo1.compareTo(atlasNo2); + }; + + // 对集合进行排序 + data.sort(comparator); } - private static BigDecimal parseBigDecimal(String value) { - try { - return new BigDecimal(value); - } catch (NumberFormatException e) { - return null; // 转换失败返回 null + /** + * 将 yem_atlasno 转换为可比较的 List。 + * 如果格式无效,返回 null。 + */ + private static List parseAtlasNo(String atlasNo) { + if (atlasNo == null || atlasNo.isEmpty()) { + return null; } + + // 检查是否只包含数字和点 + if (!atlasNo.matches("^(\\d+\\.)*\\d+$")) { + return null; + } + + // 拆分并转换为整数列表 + return Arrays.stream(atlasNo.split("\\.")) + .map(Integer::parseInt) + .collect(Collectors.toList()); } /**