Parcourir la source

Merge remote-tracking branch 'origin/dev' into dev

cr il y a 1 mois
Parent
commit
f30db9b714

+ 8 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/CurrentNode.java

@@ -1,7 +1,9 @@
 package org.springblade.manager.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import org.springblade.manager.entity.WbsTreePrivate;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -39,6 +41,12 @@ public class CurrentNode {
     private Integer nodeType;
     /**节点排序*/
     private Integer sort;
+    /**节点名称*/
+    private String title;
+    /**创建时间*/
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime  createTime;
     /**treeCode*/
     private List<String> treeCode =new ArrayList<>();
     /**

+ 35 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -465,13 +465,32 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                 List<CurrentNode> nodeType46 = getNodeType46(tec);
                                 List<Long> ids = nodeType46.stream().map(CurrentNode::getPkId).collect(Collectors.toList());
 
-                                Map<Long, Integer> sortMap = nodeType46.stream().collect(Collectors.toMap(CurrentNode::getPkId, CurrentNode::getSort));
-                                itemBlockList.sort((obj1, obj2) -> {
-                                    int sort1 = sortMap.getOrDefault(obj1.getPkeyId(), Integer.MAX_VALUE);
-                                    int sort2 = sortMap.getOrDefault(obj2.getPkeyId(), Integer.MAX_VALUE);
-                                    // 比较排序值
-                                    return Integer.compare(sort1, sort2);
-                                });
+                                Map<Long, CurrentNode> sortInfoMap  = nodeType46.stream().collect(Collectors.toMap(CurrentNode::getPkId, info -> info,
+                                        (oldInfo, newInfo) -> newInfo));
+                                //排序规则
+                                Comparator<ItemBlock> itemBlockComparator = Comparator
+                                        // 第一级:按sort排序(升序),缺失的排最后
+                                        .comparingInt((ItemBlock obj) ->
+                                                sortInfoMap.containsKey(obj.getPkeyId()) ?
+                                                        sortInfoMap.get(obj.getPkeyId()).getSort() :
+                                                        Integer.MAX_VALUE)
+
+                                        // 第二级:按title排序(自然顺序),缺失的排最后
+                                        .thenComparing(obj ->
+                                                        sortInfoMap.containsKey(obj.getPkeyId()) ?
+                                                                sortInfoMap.get(obj.getPkeyId()).getTitle() :
+                                                                null,
+                                                Comparator.nullsLast(Comparator.naturalOrder()))
+
+                                        // 第三级:按create_time排序(时间升序),缺失的排最后
+                                        .thenComparing(obj ->
+                                                        sortInfoMap.containsKey(obj.getPkeyId()) ?
+                                                                sortInfoMap.get(obj.getPkeyId()).getCreateTime() :
+                                                                null,
+                                                Comparator.nullsLast(Comparator.naturalOrder()));
+
+                                // 2. 对对象集合进行多级排序
+                                itemBlockList.sort(itemBlockComparator);
 
 
                                 /*清除那些已经不存在的工序*/
@@ -642,7 +661,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
     public void descendantType46(Object id, List<Map<String, Object>> listMaps) {
-        String sql = "select p_Key_id pkId,id,node_type nodeType,table_type tableType,sort  from m_wbs_tree_contract where parent_id =? and is_deleted=0";
+        String sql = "select " +
+                        "p_Key_id pkId," +
+                        "id," +
+                        "node_type nodeType," +
+                        "table_type tableType," +
+                        "sort," +
+                        "IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title," +
+                        "create_time createTime " +
+                        "from m_wbs_tree_contract where parent_id =? and is_deleted=0";
         List<Map<String, Object>> tmp = this.jdbcTemplate.queryForList(sql, id);
         if (tmp.size() > 0) {
             for (Map<String, Object> map : tmp) {

+ 76 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/ComplexStringComparator.java

@@ -0,0 +1,76 @@
+package org.springblade.manager.utils;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.function.Function;
+
+public class ComplexStringComparator<T> implements Comparator<T> {
+    private final Function<T, String> fieldExtractor;
+
+    public ComplexStringComparator(Function<T, String> fieldExtractor) {
+        this.fieldExtractor = fieldExtractor;
+    }
+
+    @Override
+    public int compare(T o1, T o2) {
+        String s1 = fieldExtractor.apply(o1);
+        String s2 = fieldExtractor.apply(o2);
+        return compareComplexStrings(s1, s2);
+    }
+
+    // 复杂字符串比较核心算法
+    private int compareComplexStrings(String s1, String s2) {
+        List<Object> parts1 = splitString(s1);
+        List<Object> parts2 = splitString(s2);
+
+        int minLength = Math.min(parts1.size(), parts2.size());
+        for (int i = 0; i < minLength; i++) {
+            Object p1 = parts1.get(i);
+            Object p2 = parts2.get(i);
+
+            if (p1 instanceof Integer && p2 instanceof Integer) {
+                int cmp = ((Integer) p1).compareTo((Integer) p2);
+                if (cmp != 0) return cmp;
+            } else {
+                int cmp = p1.toString().compareTo(p2.toString());
+                if (cmp != 0) return cmp;
+            }
+        }
+        return Integer.compare(parts1.size(), parts2.size());
+    }
+
+    // 字符串拆分工具方法(字母与数字分离)
+    private List<Object> splitString(String s) {
+        List<Object> parts = new ArrayList<>();
+        StringBuilder buffer = new StringBuilder();
+        int numFlag = -1; // 0:字母 1:数字
+
+        for (char c : s.toCharArray()) {
+            if (Character.isDigit(c)) {
+                if (numFlag == 0) {
+                    parts.add(buffer.toString());
+                    buffer.setLength(0);
+                }
+                numFlag = 1;
+                buffer.append(c);
+            } else {
+                if (numFlag == 1) {
+                    parts.add(Integer.parseInt(buffer.toString()));
+                    buffer.setLength(0);
+                }
+                numFlag = 0;
+                buffer.append(c);
+            }
+        }
+
+        if (buffer.length() > 0) {
+            if (numFlag == 1) {
+                parts.add(Integer.parseInt(buffer.toString()));
+            } else {
+                parts.add(buffer.toString());
+            }
+        }
+        return parts;
+    }
+}