From 4c036f937336085fb5071aabfe433c7f45f84cab Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期二, 10 二月 2026 10:34:02 +0800
Subject: [PATCH] 入库明细查询id冲突修复

---
 rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java |  172 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 157 insertions(+), 15 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java
index b513578..2ed6d84 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java
@@ -8,7 +8,11 @@
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.common.DateUtils;
 import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
+import javax.servlet.http.HttpServletRequest;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.*;
@@ -17,6 +21,7 @@
 /**
  * Created by vincent on 2/13/2024
  */
+@Slf4j
 public class PageParam<T, U extends BaseParam> extends Page<T> {
 
     private static final long serialVersionUID = 1L;
@@ -31,6 +36,11 @@
     private final boolean isToUnderlineCase;
 
     private final Class<T> cls;
+
+    /**
+     * 棰濆鐨勫瓧娈甸獙璇佺被鍒楄〃锛堢敤浜庢敮鎸� DTO銆乂O 绛夌被鐨勫瓧娈甸獙璇侊級
+     */
+    private List<Class<?>> additionalFieldClasses;
 
     public PageParam() {
         this(null);
@@ -68,6 +78,14 @@
         return this.buildWrapper(like, null, "create_time");
     }
 
+    /** 澶氳〃 JOIN 鏃剁粰鍒楀姞琛ㄥ埆鍚嶏紝閬垮厤鍒楀悕姝т箟锛沘lias 涓� null 鎴栫┖鏃朵笌涓嶅姞鍒悕涓�鑷� */
+    private static String col(String tableAlias, String columnName) {
+        if (tableAlias != null && !tableAlias.isEmpty()) {
+            return tableAlias + ".`" + columnName + "`";
+        }
+        return "`" + columnName + "`";
+    }
+
     public QueryWrapper<T> buildWrapper(boolean like, String timeField) {
         return this.buildWrapper(like, null, timeField);
     }
@@ -76,13 +94,16 @@
         return this.buildWrapper(like, null, "create_time", fields);
     }
 
+    /** 鍚� buildWrapper(like, consumer, timeField)锛宼ableAlias 闈炵┖鏃剁粰涓昏〃鍒楀姞鍒悕锛岀敤浜庡琛� JOIN 閬垮厤姝т箟锛涗紶 null 琛屼负涓庡師鏉ヤ竴鑷� */
     @SuppressWarnings("all")
-    public QueryWrapper<T> buildWrapper(boolean like, Consumer<QueryWrapper<T>> consumer, String timeField) {
+    public QueryWrapper<T> buildWrapper(boolean like, Consumer<QueryWrapper<T>> consumer, String timeField, String tableAlias) {
         QueryWrapper<T> queryWrapper = new QueryWrapper<>();
         Map<String, Object> map = where.getMap();
         for (String key : map.keySet()) {
             Object val = map.get(key);
-
+            if (Cools.isEmpty(val)){
+                continue;
+            }
             if (key.contains("Range")) {
                 ArrayList<String> list = null;
                 if (val instanceof ArrayList) {
@@ -93,8 +114,8 @@
                     if (this.isToUnderlineCase) {
                         key = Utils.toSymbolCase(key, '_');
                     }
-                    queryWrapper.ge(key, DateUtils.convert(list.get(0)));
-                    queryWrapper.le(key, DateUtils.convert(list.get(1)));
+                    queryWrapper.ge(col(tableAlias, key), DateUtils.convert(list.get(0)));
+                    queryWrapper.le(col(tableAlias, key), DateUtils.convert(list.get(1)));
                 }
             } else {
                 if (this.isToUnderlineCase) {
@@ -102,11 +123,9 @@
                 }
                 String finalKey = key;
                 if (like && key.contains(timeField)) {
-                    queryWrapper.and(wrapper -> wrapper.like("`" + finalKey + "`", val));
-//                    queryWrapper.like("`" +  key + "`", val);
+                    queryWrapper.and(wrapper -> wrapper.like(col(tableAlias, finalKey), val));
                 } else {
-                    queryWrapper.and(wrapper -> wrapper.eq("`" + finalKey + "`", val));
-//                    queryWrapper.eq("`" +  key + "`", val);
+                    queryWrapper.and(wrapper -> wrapper.eq(col(tableAlias, finalKey), val));
                 }
             }
         }
@@ -117,17 +136,22 @@
 
         if (!Cools.isEmpty(where.getTimeStart())) {
             Date timeStart = DateUtils.convert(String.valueOf(where.getTimeStart()), DateUtils.yyyyMMdd_F);
-            queryWrapper.ge(timeField, timeStart);
+            queryWrapper.ge(col(tableAlias, timeField), timeStart);
 
         }
         if (!Cools.isEmpty(where.getTimeEnd())) {
             Date timeStart = DateUtils.convert(String.valueOf(where.getTimeEnd()), DateUtils.yyyyMMdd_F);
-            queryWrapper.le(timeField, timeStart);
+            queryWrapper.le(col(tableAlias, timeField), timeStart);
         }
 
         if (!Cools.isEmpty(where.getOrderBy())) {
             if (sortIsSQL(where.getOrderBy())) {
-                setOrders(parseOrderSQL(where.getOrderBy()));
+                List<OrderItem> orders = parseOrderSQL(where.getOrderBy());
+                if (orders.isEmpty()) {
+                    queryWrapper.orderByDesc(col(tableAlias, "create_time"));
+                } else {
+                    setOrders(orders);
+                }
             }
         } else {
 //            queryWrapper.orderByDesc("create_time");
@@ -158,9 +182,9 @@
                         String column = columns.get(i);
                         String condition = where.getCondition();
                         if (i == 0) {
-                            wrapper.or().like("`" + column + "`", condition);
+                            wrapper.or().like(col(tableAlias, column), condition);
                         } else {
-                            wrapper.or().like("`" + column + "`", condition);
+                            wrapper.or().like(col(tableAlias, column), condition);
                         }
                     }
                 });
@@ -170,12 +194,19 @@
     }
 
     @SuppressWarnings("all")
+    public QueryWrapper<T> buildWrapper(boolean like, Consumer<QueryWrapper<T>> consumer, String timeField) {
+        return buildWrapper(like, consumer, timeField, (String) null);
+    }
+
+    @SuppressWarnings("all")
     public QueryWrapper<T> buildWrapper(boolean like, Consumer<QueryWrapper<T>> consumer, String timeField, List<String> fields) {
         QueryWrapper<T> queryWrapper = new QueryWrapper<>();
         Map<String, Object> map = where.getMap();
         for (String key : map.keySet()) {
             Object val = map.get(key);
-
+            if (Cools.isEmpty(val)){
+                continue;
+            }
             if (key.contains("Range")) {
                 ArrayList<String> list = null;
                 if (val instanceof ArrayList) {
@@ -217,7 +248,13 @@
 
         if (!Cools.isEmpty(where.getOrderBy())) {
             if (sortIsSQL(where.getOrderBy())) {
-                setOrders(parseOrderSQL(where.getOrderBy()));
+                List<OrderItem> orders = parseOrderSQL(where.getOrderBy());
+                // 濡傛灉鎵�鏈夋帓搴忓瓧娈甸兘鏃犳晥锛屼娇鐢ㄩ粯璁ゆ帓搴�
+                if (orders.isEmpty()) {
+                    queryWrapper.orderByDesc("create_time");
+                } else {
+                    setOrders(orders);
+                }
             }
         } else {
 //            queryWrapper.orderByDesc("create_time");
@@ -278,10 +315,21 @@
     private List<OrderItem> parseOrderSQL(String orderSQL) {
         List<OrderItem> orders = new ArrayList<>();
         if (!Cools.isEmpty(orderSQL)) {
+            // 鑾峰彇瀹炰綋绫荤殑鏈夋晥瀛楁鍒楄〃
+            Set<String> validColumns = getValidColumns();
+            
             for (String item : orderSQL.split(",")) {
                 String[] temp = item.trim().split(" ");
                 if (!temp[0].isEmpty()) {
                     String column = this.isToUnderlineCase ? Utils.toSymbolCase(temp[0], '_') : temp[0];
+                    // 楠岃瘉瀛楁鏄惁瀛樺湪锛屽鏋滀笉瀛樺湪鍒欒烦杩�
+                    if (validColumns != null && !validColumns.isEmpty() && !validColumns.contains(column)) {
+                        // 鑾峰彇褰撳墠璇锋眰淇℃伅
+                        String requestInfo = getRequestInfo();
+//                        log.warn("璺宠繃鏃犳晥鐨勬帓搴忓瓧娈�: '{}' (鍘熷鍊�: '{}')锛屽疄浣撶被: {}锛岃姹傚湴鍧�: {}",
+//                                column, temp[0], cls != null ? cls.getSimpleName() : "null", requestInfo);
+                        continue;
+                    }
                     boolean asc = temp.length == 1 || !temp[temp.length - 1].toLowerCase().equals(ORDER_DESC_VALUE);
                     orders.add(new OrderItem(column, asc));
                 }
@@ -290,6 +338,100 @@
         return orders;
     }
 
+    /**
+     * 鑾峰彇褰撳墠璇锋眰淇℃伅锛堣矾寰勫拰鏂规硶锛�
+     * @return 璇锋眰淇℃伅瀛楃涓诧紝鏍煎紡锛欻TTP鏂规硶 璇锋眰璺緞
+     */
+    private String getRequestInfo() {
+        try {
+            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (attributes != null) {
+                HttpServletRequest request = attributes.getRequest();
+                if (request != null) {
+                    String method = request.getMethod();
+                    String uri = request.getRequestURI();
+                    return String.format("%s %s", method, uri);
+                }
+            }
+        } catch (Exception e) {
+            // 蹇界暐寮傚父锛岄伩鍏嶅奖鍝嶄富娴佺▼
+            log.debug("鑾峰彇璇锋眰淇℃伅澶辫触: {}", e.getMessage());
+        }
+        return "鏈煡";
+    }
+
+    /**
+     * 鑾峰彇瀹炰綋绫荤殑鏈夋晥瀛楁鍒楄〃锛堢敤浜庨獙璇佹帓搴忓瓧娈碉級
+     * 鍖呮嫭锛氬疄浣撶被瀛楁銆佷互鍙婇澶栨寚瀹氱殑DTO/VO绫诲瓧娈�
+     * 娉ㄦ剰锛欱aseParam 鐨勫瓧娈垫槸鏌ヨ鍙傛暟锛屼笉鐢ㄤ簬鏁版嵁搴撳瓧娈甸獙璇�
+     */
+    private Set<String> getValidColumns() {
+        Set<String> columns = new HashSet<>();
+        
+        // 1. 鑾峰彇瀹炰綋绫伙紙cls锛夌殑瀛楁
+        if (cls != null) {
+            addFieldsFromClass(cls, columns);
+        }
+        
+        // 2. 鑾峰彇棰濆鎸囧畾鐨勭被锛圖TO/VO绛夛級鐨勫瓧娈�
+        if (additionalFieldClasses != null && !additionalFieldClasses.isEmpty()) {
+            for (Class<?> clazz : additionalFieldClasses) {
+                addFieldsFromClass(clazz, columns);
+            }
+        }
+        
+        return columns.isEmpty() ? null : columns;
+    }
+
+    /**
+     * 浠庢寚瀹氱被涓彁鍙栧瓧娈靛苟娣诲姞鍒伴泦鍚堜腑
+     * @param clazz 瑕佹彁鍙栧瓧娈电殑绫�
+     * @param columns 瀛楁闆嗗悎
+     */
+    private void addFieldsFromClass(Class<?> clazz, Set<String> columns) {
+        for (Field field : Cools.getAllFields(clazz)) {
+            // 璺宠繃 final銆乻tatic銆乼ransient 瀛楁
+            if (Modifier.isFinal(field.getModifiers())
+                    || Modifier.isStatic(field.getModifiers())
+                    || Modifier.isTransient(field.getModifiers())) {
+                continue;
+            }
+
+            // 璺宠繃鏍囪涓� exist=false 鐨勫瓧娈碉紙杩欎簺瀛楁涓嶅瓨鍦ㄤ簬鏁版嵁搴撲腑锛�
+            if (field.isAnnotationPresent(TableField.class)) {
+                TableField annotation = field.getAnnotation(TableField.class);
+                if (!annotation.exist()) {
+                    continue;
+                }
+            }
+
+            String column = Utils.toSymbolCase(field.getName(), '_');
+            columns.add(column);
+        }
+    }
+
+    /**
+     * 璁剧疆棰濆鐨勫瓧娈甸獙璇佺被鍒楄〃锛堢敤浜庢敮鎸� DTO銆乂O 绛夌被鐨勫瓧娈甸獙璇侊級
+     * @param classes 棰濆鐨勭被鍒楄〃
+     * @return 褰撳墠瀹炰緥锛屾敮鎸侀摼寮忚皟鐢�
+     */
+    public PageParam<T, U> setAdditionalFieldClasses(Class<?>... classes) {
+        if (classes != null && classes.length > 0) {
+            this.additionalFieldClasses = Arrays.asList(classes);
+        }
+        return this;
+    }
+
+    /**
+     * 璁剧疆棰濆鐨勫瓧娈甸獙璇佺被鍒楄〃锛堢敤浜庢敮鎸� DTO銆乂O 绛夌被鐨勫瓧娈甸獙璇侊級
+     * @param classes 棰濆鐨勭被鍒楄〃
+     * @return 褰撳墠瀹炰緥锛屾敮鎸侀摼寮忚皟鐢�
+     */
+    public PageParam<T, U> setAdditionalFieldClasses(List<Class<?>> classes) {
+        this.additionalFieldClasses = classes;
+        return this;
+    }
+
     public Map<String, Object> checkoutMap() {
         Map<String, Object> map = where.getMap();
         if (!Cools.isEmpty(where.getOrderBy())) {

--
Gitblit v1.9.1