Browse Source

sqlite根据access数据库定时更新数据

lamphua 1 month ago
parent
commit
d9fa37ce5e
19 changed files with 319 additions and 125 deletions
  1. 11
    73
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/controller/CmcTemperatureController.java
  2. 3
    3
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/domain/CmcChannel.java
  3. 7
    7
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/domain/CmcTemperature.java
  4. 5
    0
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/CmcChannelMapper.java
  5. 4
    0
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/CmcTemperatureMapper.java
  6. 18
    0
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/access/AccessChannelMapper.java
  7. 16
    0
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/access/AccessDataMapper.java
  8. 8
    0
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/IAccessSyncService.java
  9. 119
    0
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/impl/AccessSyncServiceImpl.java
  10. 23
    17
      cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/impl/CmcTemperatureServiceImpl.java
  11. 31
    0
      cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/access/AccessChannelMapper.xml
  12. 24
    0
      cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/access/AccessDataMapper.xml
  13. 12
    0
      cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/temperature/CmcChannelMapper.xml
  14. 19
    7
      cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/temperature/CmcTemperatureMapper.xml
  15. 12
    17
      cmc-temperature-back/ruoyi-admin/src/main/resources/quartz.properties
  16. BIN
      cmc-temperature-back/ruoyi-admin/src/main/resources/static/cmc-temperature.db
  17. 4
    0
      cmc-temperature-back/ruoyi-schedule/pom.xml
  18. 2
    0
      cmc-temperature-back/ruoyi-schedule/src/main/java/com/ruoyi/schedule/mapper/SysJobLogMapper.java
  19. 1
    1
      cmc-temperature-ui/src/views/temperature/temMonitor.vue

+ 11
- 73
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/controller/CmcTemperatureController.java View File

@@ -14,6 +14,7 @@ import com.ruoyi.monitoring.service.ICmcTemperatureService;
14 14
 import com.ruoyi.common.web.controller.BaseController;
15 15
 import org.noear.solon.annotation.*;
16 16
 
17
+import java.text.ParseException;
17 18
 import java.text.SimpleDateFormat;
18 19
 import java.util.*;
19 20
 
@@ -41,68 +42,6 @@ public class CmcTemperatureController extends BaseController {
41 42
         return cmcTemperatureService.list(qw);
42 43
     }
43 44
 
44
-    /**
45
-     * 根据点位查询水温监测列表
46
-     */
47
-    @Get
48
-    @Mapping("listByInfo")
49
-    public PageData<CmcTemperature> listByInfo(Page<CmcTemperature> page, CmcTemperature cmcTemperature, CmcChannel cmcChannel) {
50
-        int channelSize = cmcChannelService.listChannel(cmcChannel).size();
51
-        page.setPageSize(page.getPageSize() * channelSize);
52
-        QueryWrapper qw = getQW(cmcTemperature, cmcChannel);
53
-        List<CmcTemperature> records = cmcTemperatureService.list(qw);
54
-        List<CmcTemperature> temperatureList = new ArrayList<>();
55
-        int total = 0;
56
-        if (records.size() > 0) {
57
-            long diffInMillis;
58
-            // 第30条与第31条数据时间差 毫秒
59
-            if (channelSize > 30) {
60
-                diffInMillis = records.get(30).getDatetime().getTime() - records.get(29).getDatetime().getTime();
61
-                // 时间差超过15分钟,删最后10条数据
62
-                if (diffInMillis / 1000 / 60 > 15)
63
-                    records.subList(records.size() - channelSize + 30, records.size()).clear();
64
-            }
65
-            // 第1条数据与0时时间差 毫秒
66
-            diffInMillis = records.get(0).getDatetime().getTime() - cmcTemperature.getStartTime().getTime();
67
-            if (diffInMillis / 1000 / 60 > 15)
68
-                records.subList(records.size() - channelSize, records.size()).clear();
69
-            CmcTemperature temperature = new CmcTemperature();
70
-            long fifteenMinutesAgoMillis = cmcTemperature.getStartTime().getTime() - (15 * 60 * 1000);
71
-            Date fifteenMinutesAgo = new Date(fifteenMinutesAgoMillis);
72
-            temperature.setStartTime(fifteenMinutesAgo);
73
-            temperature.setEndTime(cmcTemperature.getStartTime());
74
-            QueryWrapper qw1 = getQW(temperature, cmcChannel);
75
-            temperatureList = cmcTemperatureService.list(qw1);
76
-            temperatureList.addAll(records);
77
-            if (channelSize > 30) {
78
-                for (int i = 0; i < temperatureList.size() - channelSize + 1; i = i + channelSize) {
79
-                    Date minTime = temperatureList.get(i).getDatetime();
80
-                    if (temperatureList.get(i + 10).getDatetime().getTime() > minTime.getTime()) {
81
-                        for (int j = i + 10; j < i + channelSize; j++) {
82
-                            temperatureList.get(j).setDatetime(minTime);
83
-                        }
84
-                    } else {
85
-                        if (temperatureList.get(i + 30).getDatetime().getTime() > minTime.getTime()) {
86
-                            for (int j = i + 30; j < i + channelSize; j++) {
87
-                                temperatureList.get(j).setDatetime(minTime);
88
-                            }
89
-                        }
90
-                    }
91
-                }
92
-            }
93
-            total = temperatureList.size() / channelSize;
94
-            if (temperatureList.size() >= page.getPageSize()) {
95
-                if (page.getPageNumber() > 1) {
96
-                    temperatureList.subList((int) (page.getPageSize() * (page.getPageNumber())), temperatureList.size()).clear();
97
-                    temperatureList.subList(0, (int) (page.getPageSize() * (page.getPageNumber() - 1))).clear();
98
-                }
99
-                else
100
-                    temperatureList.subList((int) page.getPageSize(), temperatureList.size()).clear();
101
-            }
102
-        }
103
-        return getPageData(temperatureList).total(total);
104
-    }
105
-
106 45
     /**
107 46
      * 根据点位查询水温监测列表(不分页)
108 47
      */
@@ -138,32 +77,31 @@ public class CmcTemperatureController extends BaseController {
138 77
     }
139 78
 
140 79
     private static List<Map<String, Object>> prepareData(List<CmcChannel> channelList, List<CmcTemperature> temperatureList) {
141
-        Map<String, Map<Long, Float>> timeDataMap = new LinkedHashMap<>();
142
-        List<Long> sensors = new ArrayList<>();
80
+        Map<String, Map<Integer, String>> timeDataMap = new LinkedHashMap<>();
81
+        List<Integer> sensors = new ArrayList<>();
143 82
         channelList.forEach(channel ->  {
144 83
             sensors.add(channel.getSensorNo());
145 84
         });
146 85
         for (CmcTemperature cmcTemperature : temperatureList) {
147
-            Date datetime = cmcTemperature.getDatetime();
148
-            Long sensorNo = cmcTemperature.getSensorNo();
86
+            String datetime = cmcTemperature.getDatetime();
87
+            Integer sensorNo = cmcTemperature.getSensorNo();
149 88
 
150
-            String dateTme = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(datetime);
151
-            if (!timeDataMap.containsKey(dateTme)) {
152
-                timeDataMap.put(dateTme, new HashMap<>());
89
+            if (!timeDataMap.containsKey(datetime)) {
90
+                timeDataMap.put(datetime, new HashMap<>());
153 91
             }
154 92
 
155
-            timeDataMap.get(dateTme).put(sensorNo, cmcTemperature.getData());
93
+            timeDataMap.get(datetime).put(sensorNo, cmcTemperature.getData());
156 94
         }
157 95
 
158 96
         // 转换为导出格式
159 97
         List<Map<String, Object>> exportData = new ArrayList<>();
160 98
 
161
-        for (Map.Entry<String, Map<Long, Float>> entry : timeDataMap.entrySet()) {
99
+        for (Map.Entry<String, Map<Integer, String>> entry : timeDataMap.entrySet()) {
162 100
             Map<String, Object> rowData = new HashMap<>();
163 101
             rowData.put("Datetime", entry.getKey());
164 102
 
165
-            Map<Long, Float> locationData = entry.getValue();
166
-            for (Long sensor : sensors) {
103
+            Map<Integer, String> locationData = entry.getValue();
104
+            for (Integer sensor : sensors) {
167 105
                 rowData.put(String.valueOf(sensor), locationData.get(sensor));
168 106
             }
169 107
 

+ 3
- 3
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/domain/CmcChannel.java View File

@@ -16,12 +16,12 @@ public class CmcChannel {
16 16
     /** 序号 */
17 17
     @Excel(name = "序号")
18 18
     @Id
19
-    private Long Id;
19
+    private Integer Id;
20 20
 
21 21
     /** 传感器编号 */
22 22
     @Excel(name = "传感器编号")
23 23
     @NotNull(message = "传感器编号不能为空")
24
-    private Long SensorNo;
24
+    private Integer SensorNo;
25 25
 
26 26
     /** 传感器位置 */
27 27
     @Excel(name = "传感器位置")
@@ -49,6 +49,6 @@ public class CmcChannel {
49 49
 
50 50
     /** 单位 */
51 51
     @Excel(name = "单位")
52
-    private Date LastDT;
52
+    private String LastDT;
53 53
 
54 54
 }

+ 7
- 7
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/domain/CmcTemperature.java View File

@@ -17,7 +17,7 @@ public class CmcTemperature {
17 17
     /** 序号 */
18 18
     @Excel(name = "序号")
19 19
     @Id
20
-    private Long Id;
20
+    private Integer Id;
21 21
 
22 22
     /** 监测组编号 */
23 23
     @Excel(name = "监测组编号")
@@ -25,31 +25,31 @@ public class CmcTemperature {
25 25
 
26 26
     /** 传感器编号 */
27 27
     @Excel(name = "传感器编号")
28
-    private Long SensorNo;
28
+    private Integer SensorNo;
29 29
 
30 30
     @RelationOneToOne(selfField = "Sensor_No", targetField = "Sensor_No", targetTable = "Channel")
31 31
     private CmcChannel channel;
32 32
 
33 33
     /** 监测时间 */
34 34
     @Excel(name = "监测时间")
35
-    private Date Datetime;
35
+    private String Datetime;
36 36
 
37 37
     /** 水温数值 */
38 38
     @Excel(name = "水温数值")
39
-    private Float Data;
39
+    private String Data;
40 40
 
41 41
     /** Volt */
42 42
     @Excel(name = "Volt")
43
-    private Float Volt;
43
+    private String Volt;
44 44
 
45 45
     /** CSQ */
46 46
     @Excel(name = "CSQ")
47 47
     private Integer CSQ;
48 48
 
49 49
     @Column(ignore = true)
50
-    private Date startTime;
50
+    private String startTime;
51 51
 
52 52
     @Column(ignore = true)
53
-    private Date endTime;
53
+    private String endTime;
54 54
 
55 55
 }

+ 5
- 0
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/CmcChannelMapper.java View File

@@ -3,6 +3,7 @@ package com.ruoyi.monitoring.mapper;
3 3
 import com.ruoyi.monitoring.domain.CmcChannel;
4 4
 import com.mybatisflex.annotation.UseDataSource;
5 5
 import com.mybatisflex.core.BaseMapper;
6
+import org.apache.ibatis.annotations.Param;
6 7
 
7 8
 import java.util.List;
8 9
 
@@ -19,4 +20,8 @@ public interface CmcChannelMapper extends BaseMapper<CmcChannel> {
19 20
      */
20 21
     List<CmcChannel> listChannel(CmcChannel cmcChannel);
21 22
 
23
+    Long selectMaxId();
24
+
25
+    int batchInsert(@Param("list") List<CmcChannel> list);
26
+
22 27
 }

+ 4
- 0
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/CmcTemperatureMapper.java View File

@@ -25,4 +25,8 @@ public interface CmcTemperatureMapper extends BaseMapper<CmcTemperature> {
25 25
                                          @Param("startTime") String startTime,
26 26
                                          @Param("endTime") String endTime);
27 27
 
28
+    Long selectMaxId();
29
+
30
+    int batchInsert(@Param("list") List<CmcTemperature> list);
31
+
28 32
 }

+ 18
- 0
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/access/AccessChannelMapper.java View File

@@ -0,0 +1,18 @@
1
+package com.ruoyi.monitoring.mapper.access;
2
+
3
+import com.mybatisflex.annotation.UseDataSource;
4
+import com.mybatisflex.core.BaseMapper;
5
+import com.ruoyi.monitoring.domain.CmcChannel;
6
+import org.apache.ibatis.annotations.Param;
7
+
8
+import java.util.List;
9
+
10
+@UseDataSource("access")
11
+public interface AccessChannelMapper extends BaseMapper<CmcChannel> {
12
+
13
+    List<CmcChannel> listAll();
14
+
15
+    List<CmcChannel> listByIdRange(@Param("minIdExclusive") Long minIdExclusive);
16
+}
17
+
18
+

+ 16
- 0
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/mapper/access/AccessDataMapper.java View File

@@ -0,0 +1,16 @@
1
+package com.ruoyi.monitoring.mapper.access;
2
+
3
+import com.mybatisflex.annotation.UseDataSource;
4
+import com.mybatisflex.core.BaseMapper;
5
+import com.ruoyi.monitoring.domain.CmcTemperature;
6
+import org.apache.ibatis.annotations.Param;
7
+
8
+import java.util.List;
9
+
10
+@UseDataSource("access")
11
+public interface AccessDataMapper extends BaseMapper<CmcTemperature> {
12
+
13
+    List<CmcTemperature> listByIdRange(@Param("minIdExclusive") Long minIdExclusive);
14
+}
15
+
16
+

+ 8
- 0
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/IAccessSyncService.java View File

@@ -0,0 +1,8 @@
1
+package com.ruoyi.monitoring.service;
2
+
3
+public interface IAccessSyncService {
4
+
5
+    void syncAccessToSqlite();
6
+}
7
+
8
+

+ 119
- 0
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/impl/AccessSyncServiceImpl.java View File

@@ -0,0 +1,119 @@
1
+package com.ruoyi.monitoring.service.impl;
2
+
3
+import com.ruoyi.monitoring.domain.CmcChannel;
4
+import com.ruoyi.monitoring.domain.CmcTemperature;
5
+import com.ruoyi.monitoring.mapper.CmcChannelMapper;
6
+import com.ruoyi.monitoring.mapper.CmcTemperatureMapper;
7
+import com.ruoyi.monitoring.mapper.access.AccessChannelMapper;
8
+import com.ruoyi.monitoring.mapper.access.AccessDataMapper;
9
+import com.ruoyi.monitoring.service.IAccessSyncService;
10
+import org.noear.solon.annotation.Component;
11
+import org.noear.solon.annotation.Inject;
12
+
13
+import java.util.List;
14
+
15
+@Component
16
+public class AccessSyncServiceImpl implements IAccessSyncService {
17
+
18
+    // 每批插入的记录数
19
+    private static final int BATCH_SIZE = 5000;
20
+
21
+    @Inject
22
+    AccessChannelMapper accessChannelMapper;
23
+
24
+    @Inject
25
+    AccessDataMapper accessDataMapper;
26
+
27
+    @Inject
28
+    CmcChannelMapper sqliteChannelMapper;
29
+
30
+    @Inject
31
+    CmcTemperatureMapper sqliteDataMapper;
32
+
33
+    @Override
34
+    public void syncAccessToSqlite() {
35
+        System.out.println("开始同步Access数据到SQLite...");
36
+        
37
+        try {
38
+            // 同步 Channel:增量,按ID递增同步
39
+            System.out.println("开始同步Channel表...");
40
+            Long channelMaxId = sqliteChannelMapper.selectMaxId();
41
+            if (channelMaxId == null) {
42
+                channelMaxId = 0L;
43
+            }
44
+            System.out.println("SQLite Channel表当前最大ID: " + channelMaxId);
45
+            List<CmcChannel> newChannels = accessChannelMapper.listByIdRange(channelMaxId);
46
+            if (newChannels != null && !newChannels.isEmpty()) {
47
+                System.out.println("从Access读取到" + newChannels.size() + "条新Channel记录(ID > " + channelMaxId + ")");
48
+                // 分批插入
49
+                batchInsertChannels(newChannels);
50
+                System.out.println("Channel表同步完成,共同步" + newChannels.size() + "条记录");
51
+            } else {
52
+                System.out.println("没有新的Channel记录需要同步(ID > " + channelMaxId + ")");
53
+            }
54
+
55
+            // 同步 Data:增量,按ID递增同步
56
+            System.out.println("开始同步Data表...");
57
+            Long dataMaxId = sqliteDataMapper.selectMaxId();
58
+            if (dataMaxId == null) {
59
+                dataMaxId = 0L;
60
+            }
61
+            System.out.println("SQLite Data表当前最大ID: " + dataMaxId);
62
+            List<CmcTemperature> newData = accessDataMapper.listByIdRange(dataMaxId);
63
+            for (CmcTemperature cmcTemperature : newData) {
64
+                cmcTemperature.setDatetime(cmcTemperature.getDatetime().replace(".000000", ""));
65
+                cmcTemperature.setData(cmcTemperature.getData().replace("00000", ""));
66
+            }
67
+            if (newData != null && !newData.isEmpty()) {
68
+                System.out.println("从Access读取到" + newData.size() + "条新Data记录(ID > " + dataMaxId + ")");
69
+                // 分批插入
70
+                batchInsertData(newData);
71
+                System.out.println("Data表同步完成,共同步" + newData.size() + "条新记录");
72
+            } else {
73
+                System.out.println("没有新的Data记录需要同步(ID > " + dataMaxId + ")");
74
+            }
75
+            
76
+            System.out.println("Access数据同步到SQLite完成");
77
+        } catch (Exception e) {
78
+            System.out.println("同步Access数据到SQLite失败: " + e.getMessage());
79
+            e.printStackTrace();
80
+            throw e;
81
+        }
82
+    }
83
+
84
+    /**
85
+     * 分批插入Channel记录
86
+     */
87
+    private void batchInsertChannels(List<CmcChannel> channels) {
88
+        int total = channels.size();
89
+        int batchCount = (total + BATCH_SIZE - 1) / BATCH_SIZE;
90
+        
91
+        for (int i = 0; i < batchCount; i++) {
92
+            int fromIndex = i * BATCH_SIZE;
93
+            int toIndex = Math.min((i + 1) * BATCH_SIZE, total);
94
+            List<CmcChannel> batch = channels.subList(fromIndex, toIndex);
95
+            
96
+            sqliteChannelMapper.batchInsert(batch);
97
+            System.out.println("Channel表已插入第 " + (i + 1) + "/" + batchCount + " 批,共 " + batch.size() + " 条记录");
98
+        }
99
+    }
100
+
101
+    /**
102
+     * 分批插入Data记录
103
+     */
104
+    private void batchInsertData(List<CmcTemperature> dataList) {
105
+        int total = dataList.size();
106
+        int batchCount = (total + BATCH_SIZE - 1) / BATCH_SIZE;
107
+        
108
+        for (int i = 0; i < batchCount; i++) {
109
+            int fromIndex = i * BATCH_SIZE;
110
+            int toIndex = Math.min((i + 1) * BATCH_SIZE, total);
111
+            List<CmcTemperature> batch = dataList.subList(fromIndex, toIndex);
112
+            
113
+            sqliteDataMapper.batchInsert(batch);
114
+            System.out.println("Data表已插入第 " + (i + 1) + "/" + batchCount + " 批,共 " + batch.size() + " 条记录");
115
+        }
116
+    }
117
+}
118
+
119
+

+ 23
- 17
cmc-temperature-back/cmc-monitoring/src/main/java/com/ruoyi/monitoring/service/impl/CmcTemperatureServiceImpl.java View File

@@ -6,11 +6,11 @@ import com.ruoyi.monitoring.domain.CmcChannel;
6 6
 import com.ruoyi.monitoring.domain.CmcTemperature;
7 7
 import com.ruoyi.monitoring.mapper.CmcChannelMapper;
8 8
 import com.ruoyi.monitoring.mapper.CmcTemperatureMapper;
9
-import com.ruoyi.monitoring.service.ICmcChannelService;
10 9
 import com.ruoyi.monitoring.service.ICmcTemperatureService;
11 10
 import org.noear.solon.annotation.Component;
12 11
 import org.noear.solon.annotation.Inject;
13 12
 
13
+import java.text.ParseException;
14 14
 import java.text.SimpleDateFormat;
15 15
 import java.util.ArrayList;
16 16
 import java.util.Date;
@@ -42,9 +42,7 @@ public class CmcTemperatureServiceImpl extends ServiceImpl<CmcTemperatureMapper,
42 42
 //        QueryWrapper qw = getQW(cmcTemperature, cmcChannel);
43 43
 //        List<CmcTemperature> records = cmcTemperatureMapper.selectListByQuery(qw);
44 44
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
45
-        String startStr = cmcTemperature.getStartTime() == null ? null : sdf.format(cmcTemperature.getStartTime());
46
-        String endStr = cmcTemperature.getEndTime() == null ? null : sdf.format(cmcTemperature.getEndTime());
47
-        List<CmcTemperature> records = cmcTemperatureMapper.listTemperature(cmcTemperature, cmcChannel, startStr, endStr);
45
+        List<CmcTemperature> records = cmcTemperatureMapper.listTemperature(cmcTemperature, cmcChannel, cmcTemperature.getStartTime(), cmcTemperature.getEndTime());
48 46
         if (records == null || records.isEmpty()) {
49 47
             return new ArrayList<>();
50 48
         }
@@ -56,7 +54,7 @@ public class CmcTemperatureServiceImpl extends ServiceImpl<CmcTemperatureMapper,
56 54
             long diffInMillis;
57 55
             // 第30条与第31条数据时间差 毫秒
58 56
             if (channelSize > 30 && records.size() > 30) {
59
-                diffInMillis = records.get(30).getDatetime().getTime() - records.get(29).getDatetime().getTime();
57
+                diffInMillis = parseStringToDate(records.get(30).getDatetime()).getTime() - parseStringToDate(records.get(29).getDatetime()).getTime();
60 58
                 // 时间差超过15分钟,删最后10条数据
61 59
                 if (diffInMillis / 1000 / 60 > 15) {
62 60
                     // 使用更安全的方式删除数据,避免内存泄漏
@@ -67,7 +65,7 @@ public class CmcTemperatureServiceImpl extends ServiceImpl<CmcTemperatureMapper,
67 65
 
68 66
             // 第1条数据与0时时间差 毫秒
69 67
             if (!records.isEmpty() && cmcTemperature.getStartTime() != null) {
70
-                diffInMillis = records.get(0).getDatetime().getTime() - cmcTemperature.getStartTime().getTime();
68
+                diffInMillis = parseStringToDate(records.get(0).getDatetime()).getTime() - parseStringToDate(cmcTemperature.getStartTime()).getTime();
71 69
                 if (diffInMillis / 1000 / 60 > 15) {
72 70
                     int removeStart = Math.max(0, records.size() - channelSize);
73 71
                     records = new ArrayList<>(records.subList(0, removeStart));
@@ -76,15 +74,14 @@ public class CmcTemperatureServiceImpl extends ServiceImpl<CmcTemperatureMapper,
76 74
 
77 75
             // 查询15分钟前的数据
78 76
             CmcTemperature temperature = new CmcTemperature();
79
-            long fifteenMinutesAgoMillis = cmcTemperature.getStartTime().getTime() - (15 * 60 * 1000);
77
+            long fifteenMinutesAgoMillis = parseStringToDate(cmcTemperature.getStartTime()).getTime() - (15 * 60 * 1000);
80 78
             Date fifteenMinutesAgo = new Date(fifteenMinutesAgoMillis);
81
-            temperature.setStartTime(fifteenMinutesAgo);
79
+            String fifteenMinutesAgoString = sdf.format(fifteenMinutesAgo);
80
+            temperature.setStartTime(fifteenMinutesAgoString);
82 81
             temperature.setEndTime(cmcTemperature.getStartTime());
83 82
 //            QueryWrapper qw1 = getQW(temperature, cmcChannel);
84 83
 //            List<CmcTemperature> previousData = cmcTemperatureMapper.selectListByQuery(qw1);
85
-            String prevStart = temperature.getStartTime() == null ? null : sdf.format(temperature.getStartTime());
86
-            String prevEnd = temperature.getEndTime() == null ? null : sdf.format(temperature.getEndTime());
87
-            List<CmcTemperature> previousData = cmcTemperatureMapper.listTemperature(temperature, cmcChannel, prevStart, prevEnd);
84
+            List<CmcTemperature> previousData = cmcTemperatureMapper.listTemperature(temperature, cmcChannel,  temperature.getStartTime(), temperature.getEndTime());
88 85
 
89 86
             if (previousData != null && !previousData.isEmpty()) {
90 87
                 // 合并数据,避免重复创建列表
@@ -107,27 +104,27 @@ public class CmcTemperatureServiceImpl extends ServiceImpl<CmcTemperatureMapper,
107 104
      * @param temperatureList 温度数据列表
108 105
      * @param channelSize 通道数量
109 106
      */
110
-    private void processTemperatureData(List<CmcTemperature> temperatureList, int channelSize) {
107
+    private void processTemperatureData(List<CmcTemperature> temperatureList, int channelSize){
111 108
         // 使用迭代器模式,避免频繁的索引访问
112 109
         for (int i = 0; i < temperatureList.size() - channelSize + 1; i += channelSize) {
113 110
             if (i + channelSize > temperatureList.size()) {
114 111
                 break;
115 112
             }
116 113
 
117
-            Date minTime = temperatureList.get(i).getDatetime();
114
+            String minTime = temperatureList.get(i).getDatetime();
118 115
 
119 116
             // 优化时间比较逻辑
120 117
             if (i + 10 < temperatureList.size() &&
121
-                    temperatureList.get(i + 10).getDatetime().getTime() > minTime.getTime()) {
118
+                    parseStringToDate(temperatureList.get(i + 10).getDatetime()).getTime() > parseStringToDate(minTime).getTime()) {
122 119
                 // 更新第10-30条数据的时间
123 120
                 for (int j = i + 10; j < Math.min(i + channelSize, temperatureList.size()); j++) {
124
-                    temperatureList.get(j).setDatetime(new Date(minTime.getTime()));
121
+                    temperatureList.get(j).setDatetime(minTime);
125 122
                 }
126 123
             } else if (i + 30 < temperatureList.size() &&
127
-                    temperatureList.get(i + 30).getDatetime().getTime() > minTime.getTime()) {
124
+                    parseStringToDate(temperatureList.get(i + 30).getDatetime()).getTime() > parseStringToDate(minTime).getTime()) {
128 125
                 // 更新第30条之后数据的时间
129 126
                 for (int j = i + 30; j < Math.min(i + channelSize, temperatureList.size()); j++) {
130
-                    temperatureList.get(j).setDatetime(new Date(minTime.getTime()));
127
+                    temperatureList.get(j).setDatetime(minTime);
131 128
                 }
132 129
             }
133 130
         }
@@ -156,4 +153,13 @@ public class CmcTemperatureServiceImpl extends ServiceImpl<CmcTemperatureMapper,
156 153
         return qw;
157 154
     }
158 155
 
156
+    private Date parseStringToDate(String dateTimeStr) {
157
+        try {
158
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
159
+            return format.parse(dateTimeStr);
160
+        } catch (ParseException e) {
161
+            // 处理解析异常,或者返回默认值
162
+            return new Date();
163
+        }
164
+    }
159 165
 }

+ 31
- 0
cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/access/AccessChannelMapper.xml View File

@@ -0,0 +1,31 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
4
+<mapper namespace="com.ruoyi.monitoring.mapper.access.AccessChannelMapper">
5
+
6
+    <resultMap type="com.ruoyi.monitoring.domain.CmcChannel" id="CmcChannelResult">
7
+        <id     property="Id"      column="ID"      />
8
+        <result property="SensorNo"     column="Sensor_No"     />
9
+        <result property="Info"   column="Info"   />
10
+        <result property="Ver"    column="Ver"    />
11
+        <result property="Sn"      column="Sn"      />
12
+        <result property="Ca"    column="Ca"    />
13
+        <result property="Cb"    column="Cb"    />
14
+        <result property="Units"    column="Units"    />
15
+        <result property="LastDT"    column="LastDT"    />
16
+    </resultMap>
17
+
18
+    <select id="listAll" resultMap="CmcChannelResult">
19
+        SELECT c.ID, c.Sensor_No, c.Info, c.Ver, c.Sn, c.Ca, c.Cb, c.Units, c.LastDT
20
+        FROM Channel c
21
+    </select>
22
+
23
+    <select id="listByIdRange" resultMap="CmcChannelResult">
24
+        SELECT c.ID, c.Sensor_No, c.Info, c.Ver, c.Sn, c.Ca, c.Cb, c.Units, c.LastDT
25
+        FROM Channel c
26
+        WHERE c.ID > #{minIdExclusive}
27
+        ORDER BY c.ID ASC
28
+    </select>
29
+
30
+</mapper>
31
+

+ 24
- 0
cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/access/AccessDataMapper.xml View File

@@ -0,0 +1,24 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
3
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
4
+<mapper namespace="com.ruoyi.monitoring.mapper.access.AccessDataMapper">
5
+
6
+    <resultMap type="com.ruoyi.monitoring.domain.CmcTemperature" id="CmcTemperatureResult">
7
+        <id     property="Id"      column="ID"      />
8
+        <result property="GroupNo"    column="Group_No"    />
9
+        <result property="SensorNo"     column="Sensor_No"     />
10
+        <result property="Datetime"   column="DateTime"   />
11
+        <result property="Data"    column="Data"    />
12
+        <result property="Volt"      column="Volt"      />
13
+        <result property="CSQ"    column="CSQ"    />
14
+    </resultMap>
15
+
16
+    <select id="listByIdRange" resultMap="CmcTemperatureResult">
17
+        SELECT d.ID, d.Group_No, d.Sensor_No, d.DateTime, d.Data, d.Volt, d.CSQ
18
+        FROM Data d
19
+        WHERE d.ID &gt; #{minIdExclusive}
20
+        ORDER BY d.ID ASC
21
+    </select>
22
+
23
+</mapper>
24
+

+ 12
- 0
cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/temperature/CmcChannelMapper.xml View File

@@ -35,4 +35,16 @@
35 35
         </where>
36 36
     </select>
37 37
 
38
+    <select id="selectMaxId" resultType="long">
39
+        SELECT IFNULL(MAX(ID), 0) FROM Channel
40
+    </select>
41
+
42
+    <insert id="batchInsert">
43
+        INSERT INTO Channel (ID, Sensor_No, Info, Ver, Sn, Ca, Cb, Units, LastDT)
44
+        VALUES
45
+        <foreach collection="list" item="item" separator=",">
46
+            (#{item.Id}, #{item.SensorNo}, #{item.Info}, #{item.Ver}, #{item.Sn}, #{item.Ca}, #{item.Cb}, #{item.Units}, #{item.LastDT})
47
+        </foreach>
48
+    </insert>
49
+
38 50
 </mapper>

+ 19
- 7
cmc-temperature-back/cmc-monitoring/src/main/resources/mapper/temperature/CmcTemperatureMapper.xml View File

@@ -25,17 +25,29 @@
25 25
     <select id="listTemperature" resultMap="CmcTemperatureResult">
26 26
         <include refid="selectTemperatureVo"/>
27 27
         <where>
28
-            <if test="CmcTemperature != null and CmcTemperature.Id != null">d.ID = #{CmcTemperature.Id}</if>
29
-            <if test="CmcTemperature != null and CmcTemperature.GroupNo != null">AND d.Group_No = #{CmcTemperature.GroupNo}</if>
30
-            <if test="CmcTemperature != null and CmcTemperature.SensorNo != null">AND d.Sensor_No = #{CmcTemperature.SensorNo}</if>
31
-            <if test="CmcTemperature != null and CmcTemperature.Data != null">AND d.Data = #{CmcTemperature.Data}</if>
32
-            <if test="CmcTemperature != null and CmcTemperature.Volt != null">AND d.Volt = #{CmcTemperature.Volt}</if>
33
-            <if test="CmcTemperature != null and CmcTemperature.CSQ != null">AND d.CSQ = #{CmcTemperature.CSQ}</if>
28
+            <if test="cmcTemperature != null and cmcTemperature.Id != null">d.ID = #{cmcTemperature.Id}</if>
29
+            <if test="cmcTemperature != null and cmcTemperature.GroupNo != null">AND d.Group_No = #{cmcTemperature.GroupNo}</if>
30
+            <if test="cmcTemperature != null and cmcTemperature.SensorNo != null">AND d.Sensor_No = #{cmcTemperature.SensorNo}</if>
31
+            <if test="cmcTemperature != null and cmcTemperature.Data != null">AND d.Data = #{cmcTemperature.Data}</if>
32
+            <if test="cmcTemperature != null and cmcTemperature.Volt != null">AND d.Volt = #{cmcTemperature.Volt}</if>
33
+            <if test="cmcTemperature != null and cmcTemperature.CSQ != null">AND d.CSQ = #{cmcTemperature.CSQ}</if>
34 34
             <if test="startTime != null and startTime != ''">AND d.DateTime &gt;= #{startTime}</if>
35 35
             <if test="endTime != null and endTime != ''">AND d.DateTime &lt;= #{endTime}</if>
36
-            <if test="CmcChannel != null and CmcChannel.Info != null and CmcChannel.Info != ''">AND c.Info LIKE '%' || #{CmcChannel.Info} || '%'</if>
36
+            <if test="cmcChannel != null and cmcChannel.Info != null and cmcChannel.Info != ''">AND c.Info LIKE '%' || #{cmcChannel.Info} || '%'</if>
37 37
         </where>
38 38
         ORDER BY d.DateTime ASC, d.Sensor_No ASC
39 39
     </select>
40 40
 
41
+    <select id="selectMaxId" resultType="long">
42
+        SELECT IFNULL(MAX(ID), 0) FROM Data
43
+    </select>
44
+
45
+    <insert id="batchInsert">
46
+        INSERT INTO Data (ID, Group_No, Sensor_No, DateTime, Data, Volt, CSQ)
47
+        VALUES
48
+        <foreach collection="list" item="item" separator=",">
49
+            (#{item.Id}, #{item.GroupNo}, #{item.SensorNo}, #{item.Datetime}, #{item.Data}, #{item.Volt}, #{item.CSQ})
50
+        </foreach>
51
+    </insert>
52
+
41 53
 </mapper>

+ 12
- 17
cmc-temperature-back/ruoyi-admin/src/main/resources/quartz.properties View File

@@ -1,27 +1,22 @@
1
-# 指定持久化方案
2
-org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
3
-org.quartz.jobStore.acquireTriggersWithinLock=true
1
+# 指定持久化方案 - 使用内存模式(避免SQLite BLOB问题)
2
+org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
4 3
 org.quartz.jobStore.misfireThreshold=5000
5 4
 
6
-# 指定表前缀
7
-org.quartz.jobStore.tablePrefix=QRTZ_
8
-
9
-# 指定数据源
10
-org.quartz.jobStore.dataSource=ryDS
11
-
12
-org.quartz.dataSource.ryDS.provider=hikaricp
13
-org.quartz.dataSource.ryDS.driver=org.sqlite.JDBC
14
-org.quartz.dataSource.ryDS.URL=jdbc:sqlite::resource:static/cmc-temperature.db?date_string_format=yyyy-MM-dd HH:mm:ss
15
-org.quartz.dataSource.ryDS.user=
16
-org.quartz.dataSource.ryDS.password=
5
+# 如果需要使用数据库持久化,请取消下面的注释并注释掉上面的RAMJobStore配置
6
+# 注意:SQLite不支持BLOB操作,建议使用MySQL
7
+#org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
8
+#org.quartz.jobStore.acquireTriggersWithinLock=true
9
+#org.quartz.jobStore.misfireThreshold=5000
10
+#org.quartz.jobStore.tablePrefix=QRTZ_
11
+#org.quartz.jobStore.dataSource=ryDS
17 12
 #org.quartz.dataSource.ryDS.provider=hikaricp
18 13
 #org.quartz.dataSource.ryDS.driver=com.mysql.cj.jdbc.Driver
19 14
 #org.quartz.dataSource.ryDS.URL=jdbc:mysql://127.0.0.1:3306/ry-vue?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true
20 15
 #org.quartz.dataSource.ryDS.user=root
21 16
 #org.quartz.dataSource.ryDS.password=
22
-org.quartz.dataSource.ryDS.maxConnections=10
23
-org.quartz.datasource.ryDS.validateOnCheckout=true
24
-org.quartz.datasource.ryDS.validationQuery=select 1
17
+#org.quartz.dataSource.ryDS.maxConnections=10
18
+#org.quartz.datasource.ryDS.validateOnCheckout=true
19
+#org.quartz.datasource.ryDS.validationQuery=select 1
25 20
 
26 21
 # 指定线程池
27 22
 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool

BIN
cmc-temperature-back/ruoyi-admin/src/main/resources/static/cmc-temperature.db View File


+ 4
- 0
cmc-temperature-back/ruoyi-schedule/pom.xml View File

@@ -32,6 +32,10 @@
32 32
             <groupId>com.ruoyi</groupId>
33 33
             <artifactId>ruoyi-system</artifactId>
34 34
         </dependency>
35
+        <dependency>
36
+            <groupId>com.ruoyi</groupId>
37
+            <artifactId>cmc-monitoring</artifactId>
38
+        </dependency>
35 39
     </dependencies>
36 40
     
37 41
 </project>

+ 2
- 0
cmc-temperature-back/ruoyi-schedule/src/main/java/com/ruoyi/schedule/mapper/SysJobLogMapper.java View File

@@ -1,5 +1,6 @@
1 1
 package com.ruoyi.schedule.mapper;
2 2
 
3
+import com.mybatisflex.annotation.UseDataSource;
3 4
 import com.mybatisflex.core.BaseMapper;
4 5
 import com.ruoyi.schedule.domain.SysJobLog;
5 6
 
@@ -7,6 +8,7 @@ import com.ruoyi.schedule.domain.SysJobLog;
7 8
  * 定时任务调度日志 数据层
8 9
  * @author ruoyi
9 10
  */
11
+@UseDataSource("sqlite")
10 12
 public interface SysJobLogMapper extends BaseMapper<SysJobLog> {
11 13
 
12 14
     /**

+ 1
- 1
cmc-temperature-ui/src/views/temperature/temMonitor.vue View File

@@ -78,7 +78,7 @@
78 78
                       :label="sensor.sensorName" width="120" align="center" show-overflow-tooltip>
79 79
                       <template #default="scope">
80 80
                         <span>
81
-                          {{ scope.row[sensor.sensorName] ? scope.row[sensor.sensorName].toFixed(2) : '-' }}
81
+                          {{ scope.row[sensor.sensorName] ? Number(scope.row[sensor.sensorName]).toFixed(2) : '-' }}
82 82
                         </span>
83 83
                       </template>
84 84
                     </el-table-column>

Loading…
Cancel
Save