From 2a9c68fe5130227d88b71e8eb57aced6b10d4d91 Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期三, 17 十二月 2025 15:47:35 +0800
Subject: [PATCH] 【丽水】统计随访数据 增加redis记录结果 提高查询效率

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java |   45 +++++++++--
 ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java              |  168 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 204 insertions(+), 9 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
index 89a1e35..6dd0e49 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/ServiceSubtaskController.java
@@ -17,6 +17,7 @@
 import com.ruoyi.common.utils.DtoConversionUtils;
 import com.ruoyi.common.utils.PageUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.utils.reflect.ReflectUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
 import com.smartor.domain.*;
 import com.smartor.mapper.PatMedInhospMapper;
@@ -106,9 +107,9 @@
         List<Map<String, Object>> list = new ArrayList<>();
         list.add(map);
          **/
-        //todo 浠g爜浼樺寲
-        Map<String, Object> map = serviceSubtaskService.patItemCount(serviceSubtaskVO);
-//        Map<String, Object> map = patItemCount(serviceSubtaskVO);
+        //Map<String, Object> map = serviceSubtaskService.patItemCount(serviceSubtaskVO);
+        //patItemCount 璋冪敤redisCache璁板綍缁熻鏁版嵁
+        Map<String, Object> map = patItemCount(serviceSubtaskVO);
         map.put("serviceSubtaskList", serviceSubtaskList);
         List<Map<String, Object>> list = new ArrayList<>();
         list.add(map);
@@ -145,14 +146,24 @@
         if(ObjectUtils.isNotEmpty(userId)){
             redisMap = redisCache.getCacheObject(userId + "patItemCount");
             //璁板綍鏄惁鏈夊彲鐢ㄧ紦瀛�
-//            Boolean redisFlag = false;
-//            Map oldConditionMap = (Map)redisMap.get("searchCondition");
+            Boolean redisFlag = false;
+            ServiceSubtaskVO oldCondition = null;
             if(MapUtils.isNotEmpty(redisMap)){
-                map = redisMap;
-                redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
-            }else {
+                oldCondition = (ServiceSubtaskVO)redisMap.get(userId + "searchCondition");
+                // 姣旇緝鏌ヨ鏉′欢鏄惁涓�鑷�
+                if(ObjectUtils.isNotEmpty(oldCondition) &&
+                        isSameCondition(oldCondition, serviceSubtaskVO)){
+                    // 鏉′欢涓�鑷达紝浣跨敤缂撳瓨
+                    redisFlag = true;
+                    map = redisMap;
+                    redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
+                }
+            }
+
+            // 濡傛灉娌℃湁缂撳瓨鎴栬�呮潯浠朵笉涓�鑷达紝閲嶆柊鏌ヨ
+            if(!redisFlag){
                 map = serviceSubtaskService.patItemCount(serviceSubtaskVO);
-//                map.put("searchCondition",serviceSubtaskVO);
+                map.put(userId + "searchCondition", serviceSubtaskVO);
                 redisCache.setCacheObject(userId + "patItemCount", map, 120, TimeUnit.MINUTES);
             }
         }
@@ -161,6 +172,22 @@
         return map;
     }
 
+    /**
+     * 姣旇緝涓や釜ServiceSubtaskVO鐨勬煡璇㈡潯浠舵槸鍚︿竴鑷�
+     * 浣跨敤鍙嶅皠姣旇緝鎵�鏈夊瓧娈碉紝鎺掗櫎鍒嗛〉鍙傛暟鍜屾棤鍏冲瓧娈�
+     */
+    private boolean isSameCondition(ServiceSubtaskVO oldCondition, ServiceSubtaskVO newCondition) {
+        // 浣跨敤ReflectUtils鐨勯�氱敤鏂规硶姣旇緝锛屾帓闄ゅ垎椤靛弬鏁扮瓑鏃犲叧瀛楁
+        return ReflectUtils.equalsAllFields(
+                oldCondition,
+                newCondition,
+                // 鎺掗櫎鐨勫瓧娈碉細鍒嗛〉鍙傛暟銆佸簭鍒楀寲ID銆佹椂闂存埑绛�
+                "pageNum", "pageSize", "serialVersionUID",
+                "createBy", "createTime", "updateBy", "updateTime",
+                "searchValue", "params"
+        );
+    }
+
 
     /**
      * 瀵煎嚭鍗曚竴浠诲姟锛堥殢璁垮鏁欙級鍒楄〃
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java
index b19953e..0bb9968 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java
@@ -6,7 +6,13 @@
 import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.Validate;
 import org.apache.poi.ss.usermodel.DateUtil;
@@ -407,4 +413,166 @@
         }
         return new RuntimeException(msg, e);
     }
+
+    /**
+     * 姣旇緝涓や釜鐩稿悓绫诲瀷瀵硅薄鐨勬墍鏈夊瓧娈靛�兼槸鍚︾浉绛�
+     * 浣跨敤鍙嶅皠鑾峰彇鎵�鏈夊瓧娈碉紙鍖呮嫭鐖剁被瀛楁锛夛紝骞堕�愪釜姣旇緝
+     *
+     * @param obj1 绗竴涓璞�
+     * @param obj2 绗簩涓璞�
+     * @return 濡傛灉鎵�鏈夊瓧娈靛�奸兘鐩哥瓑杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+     * *绀轰緥1锛氭瘮杈冩墍鏈夊瓧娈�
+     *      *   boolean result = ReflectUtils.equalsAllFields(user1, user2);
+     */
+    public static boolean equalsAllFields(Object obj1, Object obj2)
+    {
+        return equalsAllFields(obj1, obj2, new String[]{});
+    }
+
+    /**
+     * 姣旇緝涓や釜鐩稿悓绫诲瀷瀵硅薄鐨勬墍鏈夊瓧娈靛�兼槸鍚︾浉绛夛紙鍙帓闄ゆ寚瀹氬瓧娈碉級
+     * 浣跨敤鍙嶅皠鑾峰彇鎵�鏈夊瓧娈碉紙鍖呮嫭鐖剁被瀛楁锛夛紝骞堕�愪釜姣旇緝
+     *
+     * @param obj1 绗竴涓璞�
+     * @param obj2 绗簩涓璞�
+     * @param excludeFields 瑕佹帓闄ょ殑瀛楁鍚嶇О鏁扮粍
+     * @return 濡傛灉鎵�鏈夊瓧娈靛�奸兘鐩哥瓑杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+     * // 绀轰緥2锛氭帓闄ゅ垎椤靛弬鏁�
+     *      *   boolean result = ReflectUtils.equalsAllFields(vo1, vo2, "pageNum", "pageSize");
+     */
+    public static boolean equalsAllFields(Object obj1, Object obj2, String... excludeFields)
+    {
+        // 涓や釜瀵硅薄閮戒负null锛岃涓虹浉绛�
+        if (obj1 == null && obj2 == null) return true;
+
+        // 鍙湁涓�涓负null锛屼笉鐩哥瓑
+        if (obj1 == null || obj2 == null) return false;
+
+        // 濡傛灉鏄悓涓�涓璞″紩鐢紝鐩存帴杩斿洖true
+        if (obj1 == obj2) return true;
+
+        // 绫诲瀷涓嶅悓锛屼笉鐩哥瓑
+        if (!obj1.getClass().equals(obj2.getClass())) return false;
+
+        // 灏嗘帓闄ゅ瓧娈佃浆鎹负Set锛屼究浜庡揩閫熸煡鎵�
+        Set<String> excludeFieldSet = new HashSet<>(Arrays.asList(excludeFields));
+
+        // 鑾峰彇鎵�鏈夊瓧娈碉紙鍖呮嫭鐖剁被瀛楁锛�
+        List<Field> allFields = getAllFields(obj1);
+
+        // 閫愪釜姣旇緝瀛楁鍊�
+        for (Field field : allFields)
+        {
+            // 璺宠繃鎺掗櫎鐨勫瓧娈�
+            if (excludeFieldSet.contains(field.getName())) continue;
+
+            // 璺宠繃static鍜宼ransient瀛楁
+            if (Modifier.isStatic(field.getModifiers()) || Modifier.isTransient(field.getModifiers()))
+            {
+                continue;
+            }
+
+            try{
+                makeAccessible(field);
+                Object value1 = field.get(obj1);
+                Object value2 = field.get(obj2);
+
+                // 浣跨敤Objects.equals杩涜姣旇緝锛屽彲浠ユ纭鐞唍ull鍊�
+                if (!Objects.equals(value1, value2))
+                {
+                    //logger.debug("瀛楁 [{}] 鐨勫�间笉鐩哥瓑: obj1={}, obj2={}", field.getName(), value1, value2);
+                    return false;
+                }
+            }catch (IllegalAccessException e)
+            {
+                //logger.error("璁块棶瀛楁 [{}] 鏃跺彂鐢熼敊璇�: {}", field.getName(), e.getMessage());
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 鑾峰彇瀵硅薄鐨勬墍鏈夊瓧娈碉紙鍖呮嫭鐖剁被瀛楁锛�
+     *
+     * @param obj 鐩爣瀵硅薄
+     * @return 鎵�鏈夊瓧娈电殑鍒楄〃
+     */
+    public static List<Field> getAllFields(Object obj)
+    {
+        List<Field> allFields = new ArrayList<>();
+        Class<?> clazz = obj.getClass();
+
+        // 寰幆鍚戜笂閬嶅巻鐖剁被锛岃幏鍙栨墍鏈夊瓧娈�
+        while (clazz != null && clazz != Object.class)
+        {
+            Field[] fields = clazz.getDeclaredFields();
+            allFields.addAll(Arrays.asList(fields));
+            clazz = clazz.getSuperclass();
+        }
+
+        return allFields;
+    }
+
+    /**
+     * 姣旇緝涓や釜瀵硅薄鎸囧畾瀛楁鐨勫�兼槸鍚︾浉绛�
+     *
+     * @param obj1 绗竴涓璞�
+     * @param obj2 绗簩涓璞�
+     * @param includeFields 瑕佹瘮杈冪殑瀛楁鍚嶇О鏁扮粍
+     * @return 濡傛灉鎸囧畾瀛楁鍊奸兘鐩哥瓑杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+     *
+     *   // 绀轰緥3锛氬彧姣旇緝鍏抽敭瀛楁
+     *   boolean result = ReflectUtils.equalsSpecifiedFields(user1, user2, "userId", "userName", "email");
+     */
+    public static boolean equalsSpecifiedFields(Object obj1, Object obj2, String... includeFields)
+    {
+        // 涓や釜瀵硅薄閮戒负null锛岃涓虹浉绛�
+        if (obj1 == null && obj2 == null) return true;
+
+        // 鍙湁涓�涓负null锛屼笉鐩哥瓑
+        if (obj1 == null || obj2 == null) return false;
+
+        // 濡傛灉鏄悓涓�涓璞″紩鐢紝鐩存帴杩斿洖true
+        if (obj1 == obj2) return true;
+
+        // 绫诲瀷涓嶅悓锛屼笉鐩哥瓑
+        if (!obj1.getClass().equals(obj2.getClass())) return false;
+
+        // 濡傛灉娌℃湁鎸囧畾瀛楁锛岃繑鍥瀟rue
+        if (includeFields == null || includeFields.length == 0) return true;
+
+        // 閫愪釜姣旇緝鎸囧畾瀛楁鐨勫��
+        for (String fieldName : includeFields)
+        {
+            Field field = getAccessibleField(obj1, fieldName);
+            if (field == null)
+            {
+                //logger.warn("鍦� [{}] 涓湭鎵惧埌瀛楁 [{}]", obj1.getClass().getName(), fieldName);
+                continue;
+            }
+
+            try
+            {
+                makeAccessible(field);
+                Object value1 = field.get(obj1);
+                Object value2 = field.get(obj2);
+
+                // 浣跨敤Objects.equals杩涜姣旇緝锛屽彲浠ユ纭鐞唍ull鍊�
+                if (!Objects.equals(value1, value2))
+                {
+                    //logger.debug("瀛楁 [{}] 鐨勫�间笉鐩哥瓑: obj1={}, obj2={}", fieldName, value1, value2);
+                    return false;
+                }
+            }
+            catch (IllegalAccessException e)
+            {
+                //logger.error("璁块棶瀛楁 [{}] 鏃跺彂鐢熼敊璇�: {}", fieldName, e.getMessage());
+                return false;
+            }
+        }
+
+        return true;
+    }
 }

--
Gitblit v1.9.3