Sfoglia il codice sorgente

质检客户端-节点排序-放弃使用sql排序,通过代码处理字符串字段进行排序

LHB 5 mesi fa
parent
commit
6344a55fa5

+ 16 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/controller/WbsTreeController.java

@@ -18,6 +18,7 @@ import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.manager.vo.PrivateTreeVO2;
 import org.springblade.manager.vo.WbsTreeContractLazyVO;
 import org.springblade.system.user.service.IUserService;
+import org.springblade.system.user.util.ComplexStringComparator;
 import org.springblade.system.user.vo.InformationQueryVO1;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -25,6 +26,8 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 @RestController
@@ -89,6 +92,19 @@ public class WbsTreeController extends BladeController {
         } else {
             vos = iUserService.lazyQueryContractWbsTree(parentId, contractId, contractIdRelation, tableOwner,description);
             if (vos != null && ObjectUtil.isNotEmpty(dataInfoId)) {
+
+                // 修改比较器链,处理空值情况
+                Comparator<WbsTreeContractLazyVO> safeComparator = Comparator
+                        .comparing(WbsTreeContractLazyVO::getSort, Comparator.nullsFirst(Comparator.naturalOrder()))
+                        .thenComparing(new ComplexStringComparator<>(obj ->
+                                obj.getTitle() != null ? obj.getTitle() : ""))
+                        .thenComparing(Comparator.comparing(
+                                WbsTreeContractLazyVO::getCreateTime,
+                                Comparator.nullsLast(Comparator.reverseOrder()))
+                        );
+                //对结果进行排序
+                vos.sort(safeComparator);
+
                 if (("2").equals(classifyType) && ObjectUtil.isNotEmpty(contractIdRelation)) {
                     JSONArray array = JSONArray.parseArray(JSON.toJSONString(vos));
                     redisTemplate.opsForValue().set("blade-manager::contract:wbstree:" + dataInfoId, JSON.toJSON(array).toString());

+ 6 - 6
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserServiceImpl.java

@@ -726,7 +726,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                     String sql = "SELECT is_custom,p_key_id,contract_id," +
                             "(SELECT is_reference_number FROM m_contract_info WHERE id="+contractId+") AS isReferenceNumber,"+
                             "(SELECT id FROM u_contract_tree_drawings WHERE process_id = p_key_id AND is_deleted = 0 limit 1) AS drawingsId," +
-                            "id,parent_id,node_type,type,wbs_type,is_buss_show as isBussShow,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id," +
+                            "id,parent_id,node_type,type,wbs_type,is_buss_show as isBussShow,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id,sort,create_time," +
                             "CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) " +
                             "WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title," +
                             "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
@@ -734,8 +734,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                             "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
                             " AND b.status = 1 AND b.contract_id = " + contractId + " AND b.is_deleted = 0 AND is_custom = 1 ) AS isCustomChild " +
                             "FROM m_wbs_tree_contract a WHERE a.node_type != 111 AND a.type = 1 AND a.status = 1  And  a.is_deleted = 0 " +
-                            "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + contractId + " " +
-                            "ORDER BY a.sort,title,a.create_time";
+                            "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + contractId;
+//                            " ORDER BY a.sort,title,a.create_time";
 
                     List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                     //资料填报 不返回已隐藏的节点
@@ -864,7 +864,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                             String sql = "SELECT is_custom,p_key_id,contract_id," +
                                     "(SELECT is_reference_number FROM m_contract_info WHERE id="+contractId+") AS isReferenceNumber,"+
                                     "(SELECT id FROM u_contract_tree_drawings WHERE process_id = p_key_id AND is_deleted = 0 limit 1) AS drawingsId," +
-                                    "id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id," +
+                                    "id,parent_id,node_type,type,wbs_type,is_concrete,major_data_type,class_name,unit_name,node_class,unit_num,excellent_num,is_classifition,digitize_time,partition_code,old_id,contract_id_relation,is_concealed_works_node,wbs_id,sort,create_time," +
                                     "CASE (SELECT count(1) FROM u_tree_contract_first AS tcf WHERE tcf.is_deleted = 0 AND tcf.wbs_node_id = a.p_key_id) " +
                                     "WHEN 0 THEN 'false' ELSE 'true' END AS isFirst,IFNULL(if(length(trim(full_name))>0,full_name,node_name),node_name) AS title," +
                                     "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
@@ -872,8 +872,8 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
                                     "(SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_wbs_tree_contract b WHERE b.parent_id = a.id AND b.type = 1" +
                                     " AND b.status = 1 AND b.contract_id = " + sgContractId + " AND b.is_deleted = 0 AND is_custom = 1) AS isCustomChild " +
                                     "FROM m_wbs_tree_contract a WHERE a.node_type != 111 AND a.type = 1 AND a.status = 1 AND a.is_deleted = 0 " +
-                                    "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + sgContractId + " " +
-                                    "ORDER BY a.sort,title,a.create_time";
+                                    "AND parent_id = " + (StringUtils.isNotEmpty(id) ? id : 0) + " AND contract_id = " + sgContractId;
+//                                    " ORDER BY a.sort,title,a.create_time";
                             List<WbsTreeContractLazyVO> lazyNodes = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContractLazyVO.class));
                             if (lazyNodes.size() > 0) {
                                 List<WbsTreeContractLazyVO> nodesAll = this.getNodeAll(sgContractId);

+ 78 - 0
blade-service/blade-user/src/main/java/org/springblade/system/user/util/ComplexStringComparator.java

@@ -0,0 +1,78 @@
+package org.springblade.system.user.util;
+
+import org.apache.poi.ss.formula.functions.T;
+import org.springblade.manager.vo.WbsTreeContractLazyVO;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.regex.*;
+
+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;
+    }
+}