fix: 图册查询,零件编号按照升序排列

This commit is contained in:
zzs 2025-04-07 10:09:37 +08:00
parent 7a9e6f79d3
commit 881827ae7e

View File

@ -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<DynamicObject> list = new ArrayList<>(data);
// 自定义比较器
Comparator<DynamicObject> comparator = (obj1, obj2) -> {
String atlasNo1 = obj1.getString("yem_atlasno");
String atlasNo2 = obj2.getString("yem_atlasno");
Collections.sort(list, new Comparator<DynamicObject>() {
@Override
public int compare(DynamicObject o1, DynamicObject o2) {
BigDecimal num1 = parseBigDecimal(o1.getString("yem_atlasno"));
BigDecimal num2 = parseBigDecimal(o2.getString("yem_atlasno"));
List<Integer> parsed1 = parseAtlasNo(atlasNo1);
List<Integer> 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<Integer>
* 如果格式无效返回 null
*/
private static List<Integer> 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());
}
/**