dongjh 1 rok temu
rodzic
commit
b7702ac87e

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/message/websocket/WebSocket.java

@@ -93,7 +93,7 @@ public class WebSocket {
                     log.error(e.getMessage(), e);
                 }
             }
-//            log.info("【系统 WebSocket】群发消息:" + message);
+            log.info("【系统 WebSocket】群发消息:" + message);
         } catch (Exception e) {
             log.error(e.getMessage(), e);
         }

+ 27 - 10
jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml

@@ -48,31 +48,48 @@ spring:
             required: true
   ## quartz定时任务,采用数据库方式
   quartz:
+    # 指定Quartz调度器的数据存储方式:RAM:任务数据存储在内存中,适用于单节点环境,JDBC:任务数据存储在关系型数据库中,适用于多节点环境。
+#    job-store-type: memory
     job-store-type: jdbc
+    # 指定Quartz调度器在启动时是否需要初始化数据存储库
+    # (embedded:表示Quartz调度器会在启动时使用嵌入式模式初始化数据存储库,即创建必要的表和索引,并将数据存储在内存中)
+    # 如果需要快速、简单地部署Quartz调度器,并且不需要持久化存储数据,则可以选择embedded模式。
     initialize-schema: embedded
     #定时任务启动开关,true-开  false-关
     auto-startup: true
-    #延迟1秒启动定时任务(改成10秒,为binlog缓存数据留出足够的时间)
-    startup-delay: 10s
-    #启动时更新己存在的Job
+    #延迟1秒启动定时任务(改成30秒,为binlog缓存数据留出足够的时间)
+    startup-delay: 30s
+    #用于指定Quartz调度器在添加任务时是否覆盖已经存在的同名任务,此处启动时更新己存在的Job
     overwrite-existing-jobs: true
     properties:
       org:
         quartz:
           scheduler:
+            # 指定Quartz调度器的实例名称
             instanceName: MyScheduler
+            # Quartz调度器会自动为每个实例分配一个唯一的instanceId
             instanceId: AUTO
           jobStore:
+            # 使用内存存储任务数据,适用于轻量级应用。
+#            class: org.quartz.simpl.RAMJobStore
+            # 使用Spring提供的LocalDataSourceJobStore作为任务存储方式,支持事务管理和集群部署
             class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
             driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+            # 指定Quartz调度器的任务存储方式所使用的数据库表前缀
             tablePrefix: QRTZ_
+            # 指定Quartz调度器是否为集群模式
             isClustered: true
+            # misfireThreshold属性的值表示任务触发器允许的misfire时间,单位为毫秒
             misfireThreshold: 12000
+            # 指定Quartz调度器在集群模式下向数据库更新自身状态的时间间隔
             clusterCheckinInterval: 15000
           threadPool:
             class: org.quartz.simpl.SimpleThreadPool
+            # 线程池大小,表示Quartz调度器最多可以同时执行的任务数
             threadCount: 20
+            # 线程优先级,表示Quartz调度器线程的优先级。
             threadPriority: 5
+            # 是否继承初始化线程的上下文类加载器。
             threadsInheritContextClassLoaderOfInitializingThread: true
   #json 时间戳统一转换
   jackson:
@@ -155,18 +172,18 @@ spring:
           #driver-class-name: com.mysql.cj.jdbc.Driver
   #redis 配置
   redis:
+    # 数据库索引
+    database: 0
+    # 打包时修改该配置
+
     # 地址
     host: 119.3.168.55
     # 端口,默认为6379
     port: 6380
-    # 数据库索引
-    database: 0
-#    # 密码
-#    password: 123qx
-#    database: 0
-##    # 打包时修改该配置
+    # 密码
+    password: 123qx
+
 #    host: 127.0.0.1
-##    host: 152.136.206.27
 #    port: 6379
 #    password: ''
 #mybatis plus 设置

+ 30 - 10
module-guan/src/main/java/org/jeecg/modules/MysqlBinLogClient.java

@@ -138,12 +138,12 @@ public class MysqlBinLogClient implements ApplicationRunner {
                 }
             }
 
-
             // 增加数据(监控:报警信息、设备状态、实时值)
             if (data instanceof WriteRowsEventData) {
                 long currTableId = ((WriteRowsEventData) data).getTableId();
 
-                // 1、报警信息
+                //region 1 报警信息
+
                 if (guanralarmid == currTableId) {
                     System.out.println("guan_ralarm Insert:" + data.toString());
                     Object[] obj = Arrays.stream(((WriteRowsEventData) data).getRows().get(0)).toArray();
@@ -174,7 +174,10 @@ public class MysqlBinLogClient implements ApplicationRunner {
                     webSocket.pushMessage(jsonObject.toString());
                 }
 
-                // 2、设备状态
+                //endregion 1 报警信息
+
+                //region 2 设备状态
+
                 if (guananachglogid == currTableId) {
                     System.out.println("guan_anachglog Insert:" + data.toString());
                     Object[] obj = Arrays.stream(((WriteRowsEventData) data).getRows().get(0)).toArray();
@@ -188,7 +191,7 @@ public class MysqlBinLogClient implements ApplicationRunner {
                     anachglog.setLogvalue((Double) obj[6]);
                     anachglog.setAlarm((Integer) obj[7]);
 
-                    // 缓存设备状态
+                    // 2.1 缓存设备状态
                     if (redisUtil.hasKey(GuanCommonConstant.GUAN_EQUIPMENT_STATUS)) {
                         redisUtil.del(GuanCommonConstant.GUAN_EQUIPMENT_STATUS);
                     }
@@ -196,7 +199,7 @@ public class MysqlBinLogClient implements ApplicationRunner {
 
                     // 如果设备状态的LogValue=1,代表设备开始运行,则更新曲线信息
                     if (anachglog.getLogvalue() == 1) {
-                        // 更新预制曲线
+                        // 2.2 更新预制曲线
                         List<String> duans = new ArrayList<>();
                         List<CirculateDTO> yzqxList = webAccessService.getYzcx(duans);
 
@@ -211,8 +214,8 @@ public class MysqlBinLogClient implements ApplicationRunner {
                         }
                         redisUtil.set(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION, duans);
 
-                        // 更新全程曲线
-                        List<CurveDTO> wholeCrveList = webAccessService.getWholeCurve(null);
+                        // 2.3 更新全程曲线
+                        List<CurveDTO> wholeCrveList = webAccessService.getWholeCurve(new Date());
 
                         // 缓存中,存在则删除,并重新设置
                         if (redisUtil.hasKey(GuanCommonConstant.GUAN_WHOLE_CURE)) {
@@ -220,8 +223,8 @@ public class MysqlBinLogClient implements ApplicationRunner {
                         }
                         redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCrveList);
 
-                        // 更新实时曲线
-                        List<CurveDTO> realtimeCrveList = webAccessService.getRealtimeCurve(null);
+                        // 2.4 更新实时曲线
+                        List<CurveDTO> realtimeCrveList = webAccessService.getRealtimeCurve(new Date());
 
                         // 缓存中,存在则删除,并重新设置
                         if (redisUtil.hasKey(GuanCommonConstant.GUAN_REALTIME_CURVE)) {
@@ -229,7 +232,7 @@ public class MysqlBinLogClient implements ApplicationRunner {
                         }
                         redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCrveList);
 
-                        // websocket推送
+                        // 2.5 websocket推送
                         JSONObject jsonObject = new JSONObject();
 
                         jsonObject.put("全程曲线", wholeCrveList);
@@ -241,6 +244,23 @@ public class MysqlBinLogClient implements ApplicationRunner {
                         webSocket.pushMessage(jsonObject.toString());
                     }
                 }
+
+                //endregion  2 设备状态
+
+                //region 3 实时数据
+
+                if (bwanalogtableid == currTableId) {
+                    System.out.println("bwanalogtable Insert:" + data.toString());
+                    Object[] obj = Arrays.stream(((WriteRowsEventData) data).getRows().get(0)).toArray();
+
+                    String tagname = obj[0].toString();
+                    String avgvalue = obj[5].toString();
+
+                    // 实时数据存入redis中
+                    redisUtil.set(GuanCommonConstant.GUAN_TAGVALUE_PREFIX + tagname, avgvalue);
+                }
+
+                //endregion 3 实时数据
             }
             // 修改数据
             else if (data instanceof UpdateRowsEventData) {

+ 3 - 0
module-guan/src/main/java/org/jeecg/modules/common/GuanCommonConstant.java

@@ -7,6 +7,9 @@ package org.jeecg.modules.common;
 public interface GuanCommonConstant {
 
 
+    /**实时值前缀*/
+    String GUAN_TAGVALUE_PREFIX = "guan_tagvalue_prefix_";
+
     /**报警信息(24小时内)*/
     String GUAN_ALARMS_24H = "guan_alarms_24h";
 

+ 1 - 1
module-guan/src/main/java/org/jeecg/modules/webaccess/job/WACacheJob.java

@@ -8,7 +8,7 @@ import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
- * 刷新缓存信息
+ * 从缓存获取信息
  */
 @Slf4j
 public class WACacheJob implements Job {

+ 3 - 1
module-guan/src/main/java/org/jeecg/modules/webaccess/job/WAMsgJob.java

@@ -8,7 +8,9 @@ import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
 
-
+/**
+ * 从接口获取信息
+ */
 @Slf4j
 public class WAMsgJob implements Job {
 

+ 242 - 85
module-guan/src/main/java/org/jeecg/modules/webaccess/service/WebAccessService.java

@@ -431,7 +431,7 @@ public class WebAccessService {
     }
     //endregion
 
-    //region <<根据大屏参数设置,获取实时点位值>>
+    //region <<根据大屏参数设置,获取实时点位值(通过webaccess接口)>>
     /**
      * 获取实时点位值
      *
@@ -615,7 +615,42 @@ public class WebAccessService {
     }
     //endregion
 
-    //region <<根据大屏参数设置,获取实时曲线、全程曲线>>
+    //region <<根据大屏参数设置,获取实时点位值(通过redis)>>
+    /**
+     * 获取实时点位值
+     *
+     * @return
+     */
+    public JSONArray getDashboardCache() {
+        // 获取大屏参数设置
+        GuanDashboardParam paramat = new GuanDashboardParam();
+        paramat.setStatus("1"); // 状态为启用
+        paramat.setIflog("N"); // 不需要获取历史记录
+        List<GuanDashboardParam> dashboardParamList = dashboardParamMapper.selectAllDashboardParam(paramat);
+
+        // 组合参数信息
+        JSONArray resJsonArray = new JSONArray();
+        if (dashboardParamList != null && dashboardParamList.size() > 0) {
+            for (GuanDashboardParam param : dashboardParamList) {
+                if (param.getTagName() != null && !"".equals(param.getTagName())) {
+                    JSONObject js = new JSONObject();
+                    js.put("Name", param.getTagName());
+                    js.put("Value", redisUtil.get(GuanCommonConstant.GUAN_TAGVALUE_PREFIX + param.getTagName()));
+                    js.put("Quality", 1);
+
+                    resJsonArray.add(js);
+                }
+            }
+        }
+        else {
+            return null;
+        }
+
+        return addDashboardTagNameValues(resJsonArray);
+    }
+    //endregion
+
+    //region <<根据大屏参数设置,获取实时曲线、全程曲线(全部)(通过webaccess接口)>>
 
     /**
      * 获取实时曲线
@@ -720,7 +755,7 @@ public class WebAccessService {
             curveList.add(curve);
         }
         // 设置实时曲线时间分布
-        genTime(realityTime, now, ssIntervals, "HH:mm", curveList, "实时");
+        genTime(realityTime, now, ssIntervals, "HH:mm:ss", curveList, "实时");
 
         return curveList;
     }
@@ -823,13 +858,51 @@ public class WebAccessService {
             curveList.add(curve);
         }
         // 设置全程曲线时间分布
-        genTime(startTime, now, qcIntervals, "MM-dd HH:mm", curveList, "全程");
+        genTime(startTime, now, qcIntervals, "MM-dd HH:mm:ss", curveList, "全程");
 
         return curveList;
     }
 
     /**
-     * 获取实时曲线-当前
+     * 生成曲线的时间
+     *
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @param intervals 间隔频率(分钟)
+     * @param dateformat 时间格式
+     * @param curveList 曲线信息
+     * @param type 曲线类型
+     * @return
+     */
+    private void genTime(Date startTime, Date endTime, Integer intervals,
+                         String dateformat, List<CurveDTO> curveList, String type) {
+        List<String> times = new ArrayList<>();
+        // 循环获取时间
+        Calendar calendar = Calendar.getInstance();
+
+        if (curveList != null && curveList.size() > 0) {
+            for (int i = 0; i < curveList.size(); i++) {
+                if (!type.equals(curveList.get(i).getType())) {
+                    continue;
+                }
+                Date beginTime = (Date) startTime.clone();
+
+                for (int j = 0; j < curveList.get(i).getSubList().size(); j++) {
+                    curveList.get(i).getSubList().get(j).setLogtime(beginTime);
+                    curveList.get(i).getSubList().get(j).setTranstime(new SimpleDateFormat(dateformat).format(beginTime));
+                    // 设置当前的时间戳
+                    calendar.setTime(beginTime);
+                    calendar.add(Calendar.MINUTE, intervals);
+                    beginTime = calendar.getTime();
+                }
+            }
+        }
+    }
+    //endregion
+
+    //region <<根据大屏参数设置,获取实时曲线、全程曲线(增量)(通过webaccess接口)>>
+    /**
+     * 获取实时曲线
      * @return
      */
     public List<CurveDTO> getIncrementRealtimeCurve() {
@@ -873,7 +946,7 @@ public class WebAccessService {
                 CurveSubDTO sub = new CurveSubDTO();
                 sub.setLogtime(new Date());
 
-                sub.setTranstime(new SimpleDateFormat("HH:mm").format(new Date()));
+                sub.setTranstime(new SimpleDateFormat("HH:mm:ss").format(new Date()));
                 sub.setTagvalue(res.get("Value").toString());
                 subList.add(sub);
 
@@ -886,7 +959,7 @@ public class WebAccessService {
     }
 
     /**
-     * 获取全程曲线-当前
+     * 获取全程曲线
      * @return
      */
     public List<CurveDTO> getIncrementWholeCurve() {
@@ -923,14 +996,14 @@ public class WebAccessService {
             for (Integer i = 0; i < resArray.size(); i++) {
                 JSONObject res = resArray.getJSONObject(i);
                 CurveDTO curve = new CurveDTO();
-                curve.setType("实时");
+                curve.setType("全程");
                 curve.setName(res.get("Name").toString());
 
                 List<CurveSubDTO> subList = new ArrayList<>();
                 CurveSubDTO sub = new CurveSubDTO();
                 sub.setLogtime(new Date());
 
-                sub.setTranstime(new SimpleDateFormat("HH:mm").format(new Date()));
+                sub.setTranstime(new SimpleDateFormat("MM-dd HH:mm:ss").format(new Date()));
                 sub.setTagvalue(res.get("Value").toString());
                 subList.add(sub);
 
@@ -941,41 +1014,98 @@ public class WebAccessService {
 
         return curveList;
     }
+    //endregion
 
+    //region <<根据大屏参数设置,获取实时曲线、全程曲线(增量)(通过redis缓存)>>
     /**
-     * 生成曲线的时间
-     *
-     * @param startTime 开始时间
-     * @param endTime 结束时间
-     * @param intervals 间隔频率(分钟)
-     * @param dateformat 时间格式
-     * @param curveList 曲线信息
-     * @param type 曲线类型
+     * 获取实时曲线
      * @return
      */
-    private void genTime(Date startTime, Date endTime, Integer intervals,
-                                 String dateformat, List<CurveDTO> curveList, String type) {
-        List<String> times = new ArrayList<>();
-        // 循环获取时间
-        Calendar calendar = Calendar.getInstance();
+    public List<CurveDTO> getIncrementRealtimeCurveCache() {
+        // 获取大屏参数设置
+        GuanDashboardParam paramat = new GuanDashboardParam();
+        paramat.setStatus("1"); // 状态为启用
+        paramat.setIflog("Y"); // 需要获取历史记录
+        List<GuanDashboardParam> dashboardParamList = dashboardParamMapper.selectAllDashboardParam(paramat);
+        if (dashboardParamList == null || dashboardParamList.size() < 1) {
+            return null;
+        }
 
-        if (curveList != null && curveList.size() > 0) {
-            for (int i = 0; i < curveList.size(); i++) {
-                if (!type.equals(curveList.get(i).getType())) {
-                    continue;
-                }
-                Date beginTime = (Date) startTime.clone();
+        // 获取信息
+        List<CurveDTO> curveList = new ArrayList<>();
+        for (GuanDashboardParam param : dashboardParamList) {
+            // 没有点位名
+            if (param.getTagName() == null || "".equals(param.getTagName())) {
+                continue;
+            }
+            // 不是实时曲线设置
+            if (!param.getParamName().equals("辐射强度值-实时") && !param.getParamName().equals("湿度实值-实时") &&
+                    !param.getParamName().equals("温度实值-实时")) {
+                continue;
+            }
 
-                for (int j = 0; j < curveList.get(i).getSubList().size(); j++) {
-                    curveList.get(i).getSubList().get(j).setLogtime(beginTime);
-                    curveList.get(i).getSubList().get(j).setTranstime(new SimpleDateFormat(dateformat).format(beginTime));
-                    // 设置当前的时间戳
-                    calendar.setTime(beginTime);
-                    calendar.add(Calendar.MINUTE, intervals);
-                    beginTime = calendar.getTime();
-                }
+            CurveDTO curve = new CurveDTO();
+            curve.setType("实时");
+            curve.setName(param.getTagName());
+
+            List<CurveSubDTO> subList = new ArrayList<>();
+            CurveSubDTO sub = new CurveSubDTO();
+            sub.setLogtime(new Date());
+
+            sub.setTranstime(new SimpleDateFormat("HH:mm:ss").format(new Date()));
+            sub.setTagvalue(redisUtil.get(GuanCommonConstant.GUAN_TAGVALUE_PREFIX + param.getTagName()).toString());
+            subList.add(sub);
+
+            curve.setSubList(subList);
+            curveList.add(curve);
+        }
+
+        return curveList;
+    }
+
+    /**
+     * 获取全程曲线(通过redis缓存)
+     * @return
+     */
+    public List<CurveDTO> getIncrementWholeCurveCache() {
+        // 获取大屏参数设置
+        GuanDashboardParam paramat = new GuanDashboardParam();
+        paramat.setStatus("1"); // 状态为启用
+        paramat.setIflog("Y"); // 需要获取历史记录
+        List<GuanDashboardParam> dashboardParamList = dashboardParamMapper.selectAllDashboardParam(paramat);
+        if (dashboardParamList == null || dashboardParamList.size() < 1) {
+            return null;
+        }
+
+        // 获取信息
+        List<CurveDTO> curveList = new ArrayList<>();
+        for (GuanDashboardParam param : dashboardParamList) {
+            // 没有点位名
+            if (param.getTagName() == null || "".equals(param.getTagName())) {
+                continue;
             }
+            // 不是实时曲线设置
+            if (!param.getParamName().equals("辐射强度值-全程") && !param.getParamName().equals("湿度实值-全程") &&
+                    !param.getParamName().equals("温度实值-全程")) {
+                continue;
+            }
+            CurveDTO curve = new CurveDTO();
+            curve.setType("全程");
+            curve.setName(param.getTagName());
+
+            List<CurveSubDTO> subList = new ArrayList<>();
+            CurveSubDTO sub = new CurveSubDTO();
+            sub.setLogtime(new Date());
+
+            sub.setTranstime(new SimpleDateFormat("MM-dd HH:mm:ss").format(new Date()));
+            sub.setTagvalue(redisUtil.get(GuanCommonConstant.GUAN_TAGVALUE_PREFIX + param.getTagName()).toString());
+            subList.add(sub);
+
+            curve.setSubList(subList);
+            curveList.add(curve);
         }
+
+        return curveList;
     }
     //endregion
 
@@ -1407,62 +1537,66 @@ public class WebAccessService {
 
         // 实时曲线在缓存中不存在,则获取实时曲线并存入缓存中,否则做增量添加
         if (!redisUtil.hasKey(GuanCommonConstant.GUAN_REALTIME_CURVE)) {
-            List<CurveDTO> realtimeCrveList = getRealtimeCurve(null);
-            jsonObject.put("实时曲线", realtimeCrveList.toString());
-            redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCrveList);
+            List<CurveDTO> realtimeCurveList = getRealtimeCurve(null);
+            jsonObject.put("实时曲线", realtimeCurveList.toString());
+            redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCurveList);
         }
         // 增量添加
         else {
             List<CurveDTO> incrementRealtimeCurveList = getIncrementRealtimeCurve();
-            List<CurveDTO> realtimeCrveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_REALTIME_CURVE);
+            List<CurveDTO> realtimeCurveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_REALTIME_CURVE);
             // 将获取的增加数据增加到实时曲线的列表中
-            if (realtimeCrveList != null && realtimeCrveList.size() > 0) {
-                for (int i = 0; i < realtimeCrveList.size(); i++) {
-                    String name = realtimeCrveList.get(i).getName();
+            if (realtimeCurveList != null && realtimeCurveList.size() > 0) {
+                for (int i = 0; i < realtimeCurveList.size(); i++) {
+                    String name = realtimeCurveList.get(i).getName();
                     List<CurveDTO> subCurveList = incrementRealtimeCurveList.stream()
                             .filter(p -> p.getName().equals(name)).collect(Collectors.toList());
                     if (subCurveList != null && subCurveList.size() > 0 &&
                             subCurveList.get(0).getSubList() != null && subCurveList.get(0).getSubList().size() > 0) {
-                        realtimeCrveList.get(i).getSubList().add(subCurveList.get(0).getSubList().get(0));
+                        realtimeCurveList.get(i).getSubList().add(subCurveList.get(0).getSubList().get(0));
                     }
                 }
+                // 排序
+                curveSort(realtimeCurveList);
             }
             else {
-                Collections.copy(incrementRealtimeCurveList, realtimeCrveList);
+                Collections.copy(incrementRealtimeCurveList, realtimeCurveList);
             }
-            jsonObject.put("实时曲线", realtimeCrveList.toString());
+            jsonObject.put("实时曲线", realtimeCurveList.toString());
             // 重新缓存实时曲线
-            redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCrveList);
+            redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCurveList);
         }
 
         // 全程曲线在缓存中不存在,则获取全程曲线并存入缓存中,否则做增量添加
         if (!redisUtil.hasKey(GuanCommonConstant.GUAN_WHOLE_CURE)) {
-            List<CurveDTO> wholeCrveList = getWholeCurve(null);
-            jsonObject.put("全程曲线", wholeCrveList.toString());
-            redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCrveList);
+            List<CurveDTO> wholeCurveList = getWholeCurve(null);
+            jsonObject.put("全程曲线", wholeCurveList.toString());
+            redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCurveList);
         }
         // 增量添加
         else {
             List<CurveDTO> incrementWholeCurveList = getIncrementWholeCurve();
-            List<CurveDTO> wholeCrveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_WHOLE_CURE);
+            List<CurveDTO> wholeCurveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_WHOLE_CURE);
             // 将获取的增加数据增加到全程曲线的列表中
-            if (wholeCrveList != null && wholeCrveList.size() > 0) {
-                for (int i = 0; i < wholeCrveList.size(); i++) {
-                    String name = wholeCrveList.get(i).getName();
+            if (wholeCurveList != null && wholeCurveList.size() > 0) {
+                for (int i = 0; i < wholeCurveList.size(); i++) {
+                    String name = wholeCurveList.get(i).getName();
                     List<CurveDTO> subCurveList = incrementWholeCurveList.stream()
                             .filter(p -> p.getName().equals(name)).collect(Collectors.toList());
                     if (subCurveList != null && subCurveList.size() > 0 &&
                             subCurveList.get(0).getSubList() != null && subCurveList.get(0).getSubList().size() > 0) {
-                        wholeCrveList.get(i).getSubList().add(subCurveList.get(0).getSubList().get(0));
+                        wholeCurveList.get(i).getSubList().add(subCurveList.get(0).getSubList().get(0));
                     }
                 }
+                // 排序
+                curveSort(wholeCurveList);
             }
             else {
-                Collections.copy(incrementWholeCurveList, wholeCrveList);
+                Collections.copy(incrementWholeCurveList, wholeCurveList);
             }
-            jsonObject.put("全程曲线", wholeCrveList.toString());
+            jsonObject.put("全程曲线", wholeCurveList.toString());
             // 重新缓存全程曲线
-            redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCrveList);
+            redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCurveList);
         }
 
         // 预制曲线在缓存中不存在,则获取预制曲线并存入缓存中,否则不做处理
@@ -1499,54 +1633,58 @@ public class WebAccessService {
 
         // 实时曲线
         List<CurveDTO> incrementRealtimeCurveList = getIncrementRealtimeCurve();
-        List<CurveDTO> realtimeCrveList = null;
+        List<CurveDTO> realtimeCurveList = null;
         if (redisUtil.hasKey(GuanCommonConstant.GUAN_REALTIME_CURVE)) {
-            realtimeCrveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_REALTIME_CURVE);
+            realtimeCurveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_REALTIME_CURVE);
         }
         // 将获取的增加数据增加到实时曲线的列表中
-        if (realtimeCrveList != null && realtimeCrveList.size() > 0) {
-            for (int i = 0; i < realtimeCrveList.size(); i++) {
-                String name = realtimeCrveList.get(i).getName();
+        if (realtimeCurveList != null && realtimeCurveList.size() > 0) {
+            for (int i = 0; i < realtimeCurveList.size(); i++) {
+                String name = realtimeCurveList.get(i).getName();
                 List<CurveDTO> subCurveList = incrementRealtimeCurveList.stream()
                         .filter(p -> p.getName().equals(name)).collect(Collectors.toList());
                 if (subCurveList != null && subCurveList.size() > 0 &&
                         subCurveList.get(0).getSubList() != null && subCurveList.get(0).getSubList().size() > 0) {
-                    realtimeCrveList.get(i).getSubList().add(subCurveList.get(0).getSubList().get(0));
+                    realtimeCurveList.get(i).getSubList().add(subCurveList.get(0).getSubList().get(0));
                 }
             }
+            // 排序
+            curveSort(realtimeCurveList);
         }
         else {
-            Collections.copy(incrementRealtimeCurveList, realtimeCrveList);
+            Collections.copy(incrementRealtimeCurveList, realtimeCurveList);
         }
         // 重新缓存实时曲线
-        redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCrveList);
+        redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCurveList);
         // 返回增量信息
         jsonObject.put("实时曲线", incrementRealtimeCurveList.toString());
 
         // 全程曲线
         List<CurveDTO> incrementWholeCurveList = getIncrementWholeCurve();
-        List<CurveDTO> wholeCrveList = null;
+        List<CurveDTO> wholeCurveList = null;
         if (redisUtil.hasKey(GuanCommonConstant.GUAN_WHOLE_CURE)) {
-            wholeCrveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_WHOLE_CURE);
+            wholeCurveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_WHOLE_CURE);
         }
         // 将获取的增加数据增加到全程曲线的列表中
-        if (wholeCrveList != null && wholeCrveList.size() > 0) {
-            for (int i = 0; i < wholeCrveList.size(); i++) {
-                String name = wholeCrveList.get(i).getName();
+        if (wholeCurveList != null && wholeCurveList.size() > 0) {
+            for (int i = 0; i < wholeCurveList.size(); i++) {
+                String name = wholeCurveList.get(i).getName();
                 List<CurveDTO> subCurveList = incrementWholeCurveList.stream()
                         .filter(p -> p.getName().equals(name)).collect(Collectors.toList());
                 if (subCurveList != null && subCurveList.size() > 0 &&
                         subCurveList.get(0).getSubList() != null && subCurveList.get(0).getSubList().size() > 0) {
-                    wholeCrveList.get(i).getSubList().add(subCurveList.get(0).getSubList().get(0));
+                    wholeCurveList.get(i).getSubList().add(subCurveList.get(0).getSubList().get(0));
                 }
             }
+            // 排序
+            curveSort(wholeCurveList);
         }
         else {
-            Collections.copy(incrementWholeCurveList, wholeCrveList);
+            Collections.copy(incrementWholeCurveList, wholeCurveList);
         }
         // 返回增量信息
-        redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCrveList);
-        jsonObject.put("全程曲线", wholeCrveList.toString());
+        redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCurveList);
+        jsonObject.put("全程曲线", incrementWholeCurveList.toString());
 
         log.info(String.format(" 获取设备曲线信息(增量)! 结束时间 ↑↑↑↑↑↑↑↑↑↑:" + DateUtils.getTimestamp()));
 
@@ -1578,14 +1716,14 @@ public class WebAccessService {
 
         // 重新获取实时曲线
         if (!redisUtil.hasKey(GuanCommonConstant.GUAN_REALTIME_CURVE) || isRefresh) {
-            List<CurveDTO> realtimeCrveList = getRealtimeCurve(null);
-            redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCrveList);
+            List<CurveDTO> realtimeCurveList = getRealtimeCurve(null);
+            redisUtil.set(GuanCommonConstant.GUAN_REALTIME_CURVE, realtimeCurveList);
         }
 
         // 重新获取全程曲线
         if (!redisUtil.hasKey(GuanCommonConstant.GUAN_WHOLE_CURE) || isRefresh) {
-            List<CurveDTO> wholeCrveList = getWholeCurve(null);
-            redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCrveList);
+            List<CurveDTO> wholeCurveList = getWholeCurve(null);
+            redisUtil.set(GuanCommonConstant.GUAN_WHOLE_CURE, wholeCurveList);
         }
 
         // 重新获取当前时间之前24小时的报警信息
@@ -1611,20 +1749,20 @@ public class WebAccessService {
 
         // 实时曲线 从redis中获取
         if (redisUtil.hasKey(GuanCommonConstant.GUAN_REALTIME_CURVE)) {
-            List<CurveDTO> realtimeCrveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_REALTIME_CURVE);
-            jsonObject.put("实时曲线", realtimeCrveList.toString());
+            List<CurveDTO> realtimeCurveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_REALTIME_CURVE);
+            jsonObject.put("实时曲线", realtimeCurveList.toString());
         }
 
         // 全程曲线 从redis中获取
         if (redisUtil.hasKey(GuanCommonConstant.GUAN_WHOLE_CURE)) {
-            List<CurveDTO> wholeCrveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_WHOLE_CURE);
-            jsonObject.put("全程曲线", wholeCrveList.toString());
+            List<CurveDTO> wholeCurveList = (List<CurveDTO>) redisUtil.get(GuanCommonConstant.GUAN_WHOLE_CURE);
+            jsonObject.put("全程曲线", wholeCurveList.toString());
         }
 
         // 预制曲线 从redis中获取
         if (redisUtil.hasKey(GuanCommonConstant.GUAN_PREPARE_CURVE)) {
-            List<String> duans = (List<String>) redisUtil.get(GuanCommonConstant.GUAN_PREPARE_CURVE);
-            List<CirculateDTO> yzqxList = (List<CirculateDTO>) redisUtil.get(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION);
+            List<CirculateDTO> yzqxList = (List<CirculateDTO>) redisUtil.get(GuanCommonConstant.GUAN_PREPARE_CURVE);
+            List<String> duans = (List<String>) redisUtil.get(GuanCommonConstant.GUAN_PREPARE_CURVE_SECTION);
             jsonObject.put("预制曲线", yzqxList);
             jsonObject.put("预制曲线线段", duans);
         }
@@ -1664,4 +1802,23 @@ public class WebAccessService {
         return url;
     }
     // endregion
+
+    //region <<曲线排序>>
+    /**
+     * 曲线排序
+     * @param curveList
+     */
+    public void curveSort(List<CurveDTO> curveList) {
+        if (curveList == null || curveList.size() < 1) {
+            return;
+        }
+        for (int i = 0; i < curveList.size(); i++) {
+            if (curveList.get(i).getSubList() == null || curveList.get(i).getSubList().size() < 1) {
+                continue;
+            }
+
+            curveList.get(i).getSubList().sort((t1, t2) -> t1.getLogtime().compareTo(t2.getLogtime()));
+        }
+    }
+    //endregion
 }