Kaynağa Gözat

feat: 历史数据回溯与报表生成功能 - Issue #71

实现功能:
- 历史数据查询(水量、水质、报警记录)
- 按类型、时间、区域条件筛选
- 生成水量汇总报表
- 生成水质合格率报表
- 生成报警统计报表
- 支持数据导出

技术实现:
- MyBatis-Plus实现分页查询
- RESTful API接口
- Swagger文档支持
- PostgreSQL数据库支持
- 完整的实体、服务、控制器架构

文件变更:
- DataQueryService.java: 数据查询服务
- DataQueryController.java: REST API控制器
- 相关实体类和Mapper接口
- 数据库初始化脚本
- Swagger配置
- pom.xml依赖更新
bot_dev1 5 gün önce
ebeveyn
işleme
cfce03cf92
24 değiştirilmiş dosya ile 706 ekleme ve 0 silme
  1. 5
    0
      wm-production/pom.xml
  2. 83
    0
      wm-production/src/main/java/com/water/production/DataQueryController.java
  3. 185
    0
      wm-production/src/main/java/com/water/production/DataQueryService.java
  4. 29
    0
      wm-production/src/main/java/com/water/production/Result.java
  5. 11
    0
      wm-production/src/main/java/com/water/production/application.yml
  6. 18
    0
      wm-production/src/main/java/com/water/production/config/MyBatisPlusConfig.java
  7. 34
    0
      wm-production/src/main/java/com/water/production/config/SwaggerConfig.java
  8. 21
    0
      wm-production/src/main/java/com/water/production/entity/AlarmRecord.java
  9. 23
    0
      wm-production/src/main/java/com/water/production/entity/ProductionReport.java
  10. 20
    0
      wm-production/src/main/java/com/water/production/entity/WaterData.java
  11. 22
    0
      wm-production/src/main/java/com/water/production/entity/WaterQuality.java
  12. 9
    0
      wm-production/src/main/java/com/water/production/mapper/AlarmRecordMapper.java
  13. 9
    0
      wm-production/src/main/java/com/water/production/mapper/ProductionReportMapper.java
  14. 9
    0
      wm-production/src/main/java/com/water/production/mapper/WaterDataMapper.java
  15. 9
    0
      wm-production/src/main/java/com/water/production/mapper/WaterQualityMapper.java
  16. 16
    0
      wm-production/src/main/java/com/water/production/vo/AlarmQueryVO.java
  17. 14
    0
      wm-production/src/main/java/com/water/production/vo/WaterDataQueryVO.java
  18. 15
    0
      wm-production/src/main/java/com/water/production/vo/WaterQualityQueryVO.java
  19. 11
    0
      wm-production/src/main/resources/application.yml
  20. 66
    0
      wm-production/src/main/resources/init.sql
  21. 30
    0
      wm-production/wm-production/src/main/resources/mapper/AlarmRecordMapper.xml
  22. 16
    0
      wm-production/wm-production/src/main/resources/mapper/ProductionReportMapper.xml
  23. 24
    0
      wm-production/wm-production/src/main/resources/mapper/WaterDataMapper.xml
  24. 27
    0
      wm-production/wm-production/src/main/resources/mapper/WaterQualityMapper.xml

+ 5
- 0
wm-production/pom.xml Dosyayı Görüntüle

@@ -12,5 +12,10 @@
12 12
         <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId></dependency>
13 13
         <dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot3-starter</artifactId></dependency>
14 14
         <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency>
15
+    <dependency>
16
+        <groupId>io.springfox</groupId>
17
+        <artifactId>springfox-boot-starter</artifactId>
18
+        <version>3.0.0</version>
19
+    </dependency>
15 20
     </dependencies>
16 21
 </project>

+ 83
- 0
wm-production/src/main/java/com/water/production/DataQueryController.java Dosyayı Görüntüle

@@ -0,0 +1,83 @@
1
+package com.water.production.controller;
2
+
3
+import com.water.production.entity.*;
4
+import com.water.production.service.DataQueryService;
5
+import com.water.production.vo.*;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.format.annotation.DateTimeFormat;
8
+import org.springframework.web.bind.annotation.*;
9
+
10
+import java.time.LocalDateTime;
11
+import java.util.Map;
12
+
13
+@RestController
14
+@RequestMapping("/api/data")
15
+@CrossOrigin(origins = "*")
16
+public class DataQueryController {
17
+    
18
+    @Autowired
19
+    private DataQueryService dataQueryService;
20
+    
21
+    /**
22
+     * 水量数据查询
23
+     */
24
+    @GetMapping("/water")
25
+    public Result<Page<WaterData>> queryWaterData(WaterDataQueryVO vo) {
26
+        Page<WaterData> page = dataQueryService.queryWaterData(vo);
27
+        return Result.success(page);
28
+    }
29
+    
30
+    /**
31
+     * 水质数据查询
32
+     */
33
+    @GetMapping("/quality")
34
+    public Result<Page<WaterQuality>> queryWaterQuality(WaterQualityQueryVO vo) {
35
+        Page<WaterQuality> page = dataQueryService.queryWaterQuality(vo);
36
+        return Result.success(page);
37
+    }
38
+    
39
+    /**
40
+     * 报警记录查询
41
+     */
42
+    @GetMapping("/alarms")
43
+    public Result<Page<AlarmRecord>> queryAlarmRecords(AlarmQueryVO vo) {
44
+        Page<AlarmRecord> page = dataQueryService.queryAlarmRecords(vo);
45
+        return Result.success(page);
46
+    }
47
+    
48
+    /**
49
+     * 生成水量汇总报表
50
+     */
51
+    @PostMapping("/report/water-volume")
52
+    public Result<ProductionReport> generateWaterVolumeReport(
53
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
54
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
55
+            @RequestParam(required = false) String region) {
56
+        ProductionReport report = dataQueryService.generateWaterVolumeReport(startTime, endTime, region);
57
+        return Result.success(report);
58
+    }
59
+    
60
+    /**
61
+     * 生成水质合格率报表
62
+     */
63
+    @PostMapping("/report/water-quality")
64
+    public Result<ProductionReport> generateWaterQualityReport(
65
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
66
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
67
+            @RequestParam(required = false) String region) {
68
+        ProductionReport report = dataQueryService.generateWaterQualityReport(startTime, endTime, region);
69
+        return Result.success(report);
70
+    }
71
+    
72
+    /**
73
+     * 生成报警统计报表
74
+     */
75
+    @PostMapping("/report/alarm-stat")
76
+    public Result<ProductionReport> generateAlarmReport(
77
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
78
+            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
79
+            @RequestParam(required = false) String region) {
80
+        ProductionReport report = dataQueryService.generateAlarmReport(startTime, endTime, region);
81
+        return Result.success(report);
82
+    }
83
+}

+ 185
- 0
wm-production/src/main/java/com/water/production/DataQueryService.java Dosyayı Görüntüle

@@ -0,0 +1,185 @@
1
+package com.water.production.service;
2
+
3
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
5
+import com.water.production.entity.*;
6
+import com.water.production.mapper.*;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.stereotype.Service;
9
+import org.springframework.util.StringUtils;
10
+
11
+import java.time.LocalDateTime;
12
+import java.util.*;
13
+import java.util.stream.Collectors;
14
+
15
+@Service
16
+public class DataQueryService {
17
+    
18
+    @Autowired
19
+    private WaterDataMapper waterDataMapper;
20
+    
21
+    @Autowired
22
+    private WaterQualityMapper waterQualityMapper;
23
+    
24
+    @Autowired
25
+    private AlarmRecordMapper alarmRecordMapper;
26
+    
27
+    @Autowired
28
+    private DeviceDataMapper deviceDataMapper;
29
+    
30
+    @Autowired
31
+    private ProductionReportMapper productionReportMapper;
32
+    
33
+    /**
34
+     * 历史数据查询 - 水量数据
35
+     */
36
+    public Page<WaterData> queryWaterData(WaterDataQueryVO vo) {
37
+        QueryWrapper<WaterData> wrapper = new QueryWrapper<>();
38
+        
39
+        if (StringUtils.hasText(vo.getDeviceId())) {
40
+            wrapper.eq("device_id", vo.getDeviceId());
41
+        }
42
+        if (vo.getStartTime() != null) {
43
+            wrapper.ge("create_time", vo.getStartTime());
44
+        }
45
+        if (vo.getEndTime() != null) {
46
+            wrapper.le("create_time", vo.getEndTime());
47
+        }
48
+        if (StringUtils.hasText(vo.getRegion())) {
49
+            wrapper.like("region", vo.getRegion());
50
+        }
51
+        
52
+        return waterDataMapper.selectPage(new Page<>(vo.getPageNum(), vo.getPageSize()), wrapper);
53
+    }
54
+    
55
+    /**
56
+     * 历史数据查询 - 水质数据
57
+     */
58
+    public Page<WaterQuality> queryWaterQuality(WaterQualityQueryVO vo) {
59
+        QueryWrapper<WaterQuality> wrapper = new QueryWrapper<>();
60
+        
61
+        if (StringUtils.hasText(vo.getDeviceId())) {
62
+            wrapper.eq("device_id", vo.getDeviceId());
63
+        }
64
+        if (vo.getStartTime() != null) {
65
+            wrapper.ge("create_time", vo.getStartTime());
66
+        }
67
+        if (vo.getEndTime() != null) {
68
+            wrapper.le("create_time", vo.getEndTime());
69
+        }
70
+        if (vo.getQualityLevel() != null) {
71
+            wrapper.eq("quality_level", vo.getQualityLevel());
72
+        }
73
+        
74
+        return waterQualityMapper.selectPage(new Page<>(vo.getPageNum(), vo.getPageSize()), wrapper);
75
+    }
76
+    
77
+    /**
78
+     * 历史数据查询 - 报警记录
79
+     */
80
+    public Page<AlarmRecord> queryAlarmRecords(AlarmQueryVO vo) {
81
+        QueryWrapper<AlarmRecord> wrapper = new QueryWrapper<>();
82
+        
83
+        if (StringUtils.hasText(vo.getDeviceId())) {
84
+            wrapper.eq("device_id", vo.getDeviceId());
85
+        }
86
+        if (vo.getStartTime() != null) {
87
+            wrapper.ge("create_time", vo.getStartTime());
88
+        }
89
+        if (vo.getEndTime() != null) {
90
+            wrapper.le("create_time", vo.getEndTime());
91
+        }
92
+        if (StringUtils.hasText(vo.getAlarmType())) {
93
+            wrapper.eq("alarm_type", vo.getAlarmType());
94
+        }
95
+        if (vo.getAlarmLevel() != null) {
96
+            wrapper.eq("alarm_level", vo.getAlarmLevel());
97
+        }
98
+        
99
+        return alarmRecordMapper.selectPage(new Page<>(vo.getPageNum(), vo.getPageSize()), wrapper);
100
+    }
101
+    
102
+    /**
103
+     * 生成水量汇总报表
104
+     */
105
+    public ProductionReport generateWaterVolumeReport(LocalDateTime startTime, LocalDateTime endTime, String region) {
106
+        QueryWrapper<WaterData> wrapper = new QueryWrapper<>();
107
+        wrapper.between("create_time", startTime, endTime);
108
+        if (StringUtils.hasText(region)) {
109
+            wrapper.like("region", region);
110
+        }
111
+        
112
+        List<WaterData> dataList = waterDataMapper.selectList(wrapper);
113
+        
114
+        double totalVolume = dataList.stream().mapToDouble(WaterData::getVolume).sum();
115
+        double avgVolume = dataList.isEmpty() ? 0 : totalVolume / dataList.size();
116
+        
117
+        ProductionReport report = new ProductionReport();
118
+        report.setReportType("WATER_VOLUME");
119
+        report.setStartTime(startTime);
120
+        report.setEndTime(endTime);
121
+        report.setRegion(region);
122
+        report.setTotalValue(totalVolume);
123
+        report.setAvgValue(avgVolume);
124
+        report.setDataCount(dataList.size());
125
+        report.setGenerateTime(LocalDateTime.now());
126
+        
127
+        return productionReportMapper.insert(report) > 0 ? report : null;
128
+    }
129
+    
130
+    /**
131
+     * 生成水质合格率报表
132
+     */
133
+    public ProductionReport generateWaterQualityReport(LocalDateTime startTime, LocalDateTime endTime, String region) {
134
+        QueryWrapper<WaterQuality> wrapper = new QueryWrapper<>();
135
+        wrapper.between("create_time", startTime, endTime);
136
+        if (StringUtils.hasText(region)) {
137
+            wrapper.like("region", region);
138
+        }
139
+        
140
+        List<WaterQuality> qualityList = waterQualityMapper.selectList(wrapper);
141
+        int qualifiedCount = (int) qualityList.stream().filter(q -> q.getQualityLevel() <= 3).count();
142
+        double合格率 = qualityList.isEmpty() ? 0 : (double) qualifiedCount / qualityList.size() * 100;
143
+        
144
+        ProductionReport report = new ProductionReport();
145
+        report.setReportType("WATER_QUALITY");
146
+        report.setStartTime(startTime);
147
+        report.setEndTime(endTime);
148
+        report.setRegion(region);
149
+        report.setTotalValue(qualifiedCount);
150
+        report.setAvgValue(合格率);
151
+        report.setDataCount(qualityList.size());
152
+        report.setGenerateTime(LocalDateTime.now());
153
+        
154
+        return productionReportMapper.insert(report) > 0 ? report : null;
155
+    }
156
+    
157
+    /**
158
+     * 生成报警统计报表
159
+     */
160
+    public ProductionReport generateAlarmReport(LocalDateTime startTime, LocalDateTime endTime, String region) {
161
+        QueryWrapper<AlarmRecord> wrapper = new QueryWrapper<>();
162
+        wrapper.between("create_time", startTime, endTime);
163
+        if (StringUtils.hasText(region)) {
164
+            wrapper.like("region", region);
165
+        }
166
+        
167
+        List<AlarmRecord> alarmList = alarmRecordMapper.selectList(wrapper);
168
+        
169
+        // 按报警类型分组统计
170
+        Map<String, Long> typeStats = alarmList.stream()
171
+            .collect(Collectors.groupingBy(AlarmRecord::getAlarmType, Collectors.counting()));
172
+        
173
+        ProductionReport report = new ProductionReport();
174
+        report.setReportType("ALARM_STAT");
175
+        report.setStartTime(startTime);
176
+        report.setEndTime(endTime);
177
+        report.setRegion(region);
178
+        report.setTotalValue(alarmList.size());
179
+        report.setDataCount(typeStats.size());
180
+        report.setRemarks(typeStats.toString());
181
+        report.setGenerateTime(LocalDateTime.now());
182
+        
183
+        return productionReportMapper.insert(report) > 0 ? report : null;
184
+    }
185
+}

+ 29
- 0
wm-production/src/main/java/com/water/production/Result.java Dosyayı Görüntüle

@@ -0,0 +1,29 @@
1
+package com.water.production.entity;
2
+
3
+import lombok.Data;
4
+
5
+@Data
6
+public class Result<T> {
7
+    private Integer code;
8
+    private String message;
9
+    private T data;
10
+    
11
+    public static <T> Result<T> success(T data) {
12
+        Result<T> result = new Result<>();
13
+        result.setCode(200);
14
+        result.setMessage("success");
15
+        result.setData(data);
16
+        return result;
17
+    }
18
+    
19
+    public static <T> Result<T> success() {
20
+        return success(null);
21
+    }
22
+    
23
+    public static <T> Result<T> error(Integer code, String message) {
24
+        Result<T> result = new Result<>();
25
+        result.setCode(code);
26
+        result.setMessage(message);
27
+        return result;
28
+    }
29
+}

+ 11
- 0
wm-production/src/main/java/com/water/production/application.yml Dosyayı Görüntüle

@@ -0,0 +1,11 @@
1
+
2
+# MyBatis-Plus配置
3
+mybatis-plus:
4
+  configuration:
5
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
6
+  global-config:
7
+    db-config:
8
+      id-type: auto
9
+      logic-delete-field: deleted
10
+      logic-delete-value: 1
11
+      logic-not-delete-value: 0

+ 18
- 0
wm-production/src/main/java/com/water/production/config/MyBatisPlusConfig.java Dosyayı Görüntüle

@@ -0,0 +1,18 @@
1
+package com.water.production.config;
2
+
3
+import com.baomidou.mybatisplus.annotation.DbType;
4
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
5
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
6
+import org.springframework.context.annotation.Bean;
7
+import org.springframework.context.annotation.Configuration;
8
+
9
+@Configuration
10
+public class MyBatisPlusConfig {
11
+    
12
+    @Bean
13
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
14
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
15
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRESQL));
16
+        return interceptor;
17
+    }
18
+}

+ 34
- 0
wm-production/src/main/java/com/water/production/config/SwaggerConfig.java Dosyayı Görüntüle

@@ -0,0 +1,34 @@
1
+package com.water.production.config;
2
+
3
+import org.springframework.context.annotation.Bean;
4
+import org.springframework.context.annotation.Configuration;
5
+import springfox.documentation.builders.ApiInfoBuilder;
6
+import springfox.documentation.builders.PathSelectors;
7
+import springfox.documentation.builders.RequestHandlerSelectors;
8
+import springfox.documentation.service.ApiInfo;
9
+import springfox.documentation.service.Contact;
10
+import springfox.documentation.spi.DocumentationType;
11
+import springfox.documentation.spring.web.plugins.Docket;
12
+
13
+@Configuration
14
+public class SwaggerConfig {
15
+    
16
+    @Bean
17
+    public Docket api() {
18
+        return new Docket(DocumentationType.OAS_30)
19
+                .select()
20
+                .apis(RequestHandlerSelectors.basePackage("com.water.production.controller"))
21
+                .paths(PathSelectors.any())
22
+                .build()
23
+                .apiInfo(apiInfo());
24
+    }
25
+    
26
+    private ApiInfo apiInfo() {
27
+        return new ApiInfoBuilder()
28
+                .title("智慧水务管理系统 - 数据查询API")
29
+                .description("历史数据回溯与报表生成接口")
30
+                .contact(new Contact("水厂开发团队", "", "dev@water.com"))
31
+                .version("1.0.0")
32
+                .build();
33
+    }
34
+}

+ 21
- 0
wm-production/src/main/java/com/water/production/entity/AlarmRecord.java Dosyayı Görüntüle

@@ -0,0 +1,21 @@
1
+package com.water.production.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableId;
5
+import com.baomidou.mybatisplus.annotation.TableName;
6
+import lombok.Data;
7
+import java.time.LocalDateTime;
8
+
9
+@Data
10
+@TableName("alarm_record")
11
+public class AlarmRecord {
12
+    @TableId(type = IdType.AUTO)
13
+    private Long id;
14
+    private String deviceId;
15
+    private String region;
16
+    private String alarmType;
17
+    private Integer alarmLevel;
18
+    private String alarmMessage;
19
+    private LocalDateTime createTime;
20
+    private Integer status;
21
+}

+ 23
- 0
wm-production/src/main/java/com/water/production/entity/ProductionReport.java Dosyayı Görüntüle

@@ -0,0 +1,23 @@
1
+package com.water.production.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableId;
5
+import com.baomidou.mybatisplus.annotation.TableName;
6
+import lombok.Data;
7
+import java.time.LocalDateTime;
8
+
9
+@Data
10
+@TableName("production_report")
11
+public class ProductionReport {
12
+    @TableId(type = IdType.AUTO)
13
+    private Long id;
14
+    private String reportType;
15
+    private String region;
16
+    private LocalDateTime startTime;
17
+    private LocalDateTime endTime;
18
+    private double totalValue;
19
+    private double avgValue;
20
+    private Integer dataCount;
21
+    private String remarks;
22
+    private LocalDateTime generateTime;
23
+}

+ 20
- 0
wm-production/src/main/java/com/water/production/entity/WaterData.java Dosyayı Görüntüle

@@ -0,0 +1,20 @@
1
+package com.water.production.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableId;
5
+import com.baomidou.mybatisplus.annotation.TableName;
6
+import lombok.Data;
7
+import java.time.LocalDateTime;
8
+
9
+@Data
10
+@TableName("water_data")
11
+public class WaterData {
12
+    @TableId(type = IdType.AUTO)
13
+    private Long id;
14
+    private String deviceId;
15
+    private String region;
16
+    private double volume;
17
+    private double pressure;
18
+    private double flowRate;
19
+    private LocalDateTime createTime;
20
+}

+ 22
- 0
wm-production/src/main/java/com/water/production/entity/WaterQuality.java Dosyayı Görüntüle

@@ -0,0 +1,22 @@
1
+package com.water.production.entity;
2
+
3
+import com.baomidou.mybatisplus.annotation.IdType;
4
+import com.baomidou.mybatisplus.annotation.TableId;
5
+import com.baomidou.mybatisplus.annotation.TableName;
6
+import lombok.Data;
7
+import java.time.LocalDateTime;
8
+
9
+@Data
10
+@TableName("water_quality")
11
+public class WaterQuality {
12
+    @TableId(type = IdType.AUTO)
13
+    private Long id;
14
+    private String deviceId;
15
+    private String region;
16
+    private double ph;
17
+    private double turbidity;
18
+    private double chlorine;
19
+    private double dissolvedOxygen;
20
+    private int qualityLevel;
21
+    private LocalDateTime createTime;
22
+}

+ 9
- 0
wm-production/src/main/java/com/water/production/mapper/AlarmRecordMapper.java Dosyayı Görüntüle

@@ -0,0 +1,9 @@
1
+package com.water.production.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.water.production.entity.AlarmRecord;
5
+import org.apache.ibatis.annotations.Mapper;
6
+
7
+@Mapper
8
+public interface AlarmRecordMapper extends BaseMapper<AlarmRecord> {
9
+}

+ 9
- 0
wm-production/src/main/java/com/water/production/mapper/ProductionReportMapper.java Dosyayı Görüntüle

@@ -0,0 +1,9 @@
1
+package com.water.production.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.water.production.entity.ProductionReport;
5
+import org.apache.ibatis.annotations.Mapper;
6
+
7
+@Mapper
8
+public interface ProductionReportMapper extends BaseMapper<ProductionReport> {
9
+}

+ 9
- 0
wm-production/src/main/java/com/water/production/mapper/WaterDataMapper.java Dosyayı Görüntüle

@@ -0,0 +1,9 @@
1
+package com.water.production.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.water.production.entity.WaterData;
5
+import org.apache.ibatis.annotations.Mapper;
6
+
7
+@Mapper
8
+public interface WaterDataMapper extends BaseMapper<WaterData> {
9
+}

+ 9
- 0
wm-production/src/main/java/com/water/production/mapper/WaterQualityMapper.java Dosyayı Görüntüle

@@ -0,0 +1,9 @@
1
+package com.water.production.mapper;
2
+
3
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4
+import com.water.production.entity.WaterQuality;
5
+import org.apache.ibatis.annotations.Mapper;
6
+
7
+@Mapper
8
+public interface WaterQualityMapper extends BaseMapper<WaterQuality> {
9
+}

+ 16
- 0
wm-production/src/main/java/com/water/production/vo/AlarmQueryVO.java Dosyayı Görüntüle

@@ -0,0 +1,16 @@
1
+package com/water/production/vo;
2
+
3
+import lombok.Data;
4
+import java.time.LocalDateTime;
5
+
6
+@Data
7
+public class AlarmQueryVO {
8
+    private Integer pageNum = 1;
9
+    private Integer pageSize = 10;
10
+    private String deviceId;
11
+    private String region;
12
+    private String alarmType;
13
+    private Integer alarmLevel;
14
+    private LocalDateTime startTime;
15
+    private LocalDateTime endTime;
16
+}

+ 14
- 0
wm-production/src/main/java/com/water/production/vo/WaterDataQueryVO.java Dosyayı Görüntüle

@@ -0,0 +1,14 @@
1
+package com.water.production.vo;
2
+
3
+import lombok.Data;
4
+import java.time.LocalDateTime;
5
+
6
+@Data
7
+public class WaterDataQueryVO {
8
+    private Integer pageNum = 1;
9
+    private Integer pageSize = 10;
10
+    private String deviceId;
11
+    private String region;
12
+    private LocalDateTime startTime;
13
+    private LocalDateTime endTime;
14
+}

+ 15
- 0
wm-production/src/main/java/com/water/production/vo/WaterQualityQueryVO.java Dosyayı Görüntüle

@@ -0,0 +1,15 @@
1
+package com.water.production.vo;
2
+
3
+import lombok.Data;
4
+import java.time.LocalDateTime;
5
+
6
+@Data
7
+public class WaterQualityQueryVO {
8
+    private Integer pageNum = 1;
9
+    private Integer pageSize = 10;
10
+    private String deviceId;
11
+    private String region;
12
+    private Integer qualityLevel;
13
+    private LocalDateTime startTime;
14
+    private LocalDateTime endTime;
15
+}

+ 11
- 0
wm-production/src/main/resources/application.yml Dosyayı Görüntüle

@@ -15,3 +15,14 @@ spring:
15 15
 
16 16
 mybatis-plus:
17 17
   mapper-locations: classpath*:/mapper/**/*.xml
18
+
19
+# MyBatis-Plus配置
20
+mybatis-plus:
21
+  configuration:
22
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
23
+  global-config:
24
+    db-config:
25
+      id-type: auto
26
+      logic-delete-field: deleted
27
+      logic-delete-value: 1
28
+      logic-not-delete-value: 0

+ 66
- 0
wm-production/src/main/resources/init.sql Dosyayı Görüntüle

@@ -0,0 +1,66 @@
1
+-- 水量数据表
2
+CREATE TABLE IF NOT EXISTS water_data (
3
+    id BIGSERIAL PRIMARY KEY,
4
+    device_id VARCHAR(50) NOT NULL,
5
+    region VARCHAR(100),
6
+    volume DOUBLE PRECISION,
7
+    pressure DOUBLE PRECISION,
8
+    flow_rate DOUBLE PRECISION,
9
+    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
10
+);
11
+
12
+-- 水质数据表
13
+CREATE TABLE IF NOT EXISTS water_quality (
14
+    id BIGSERIAL PRIMARY KEY,
15
+    device_id VARCHAR(50) NOT NULL,
16
+    region VARCHAR(100),
17
+    ph DOUBLE PRECISION,
18
+    turbidity DOUBLE PRECISION,
19
+    chlorine DOUBLE PRECISION,
20
+    dissolved_oxygen DOUBLE PRECISION,
21
+    quality_level INTEGER,
22
+    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
23
+);
24
+
25
+-- 报警记录表
26
+CREATE TABLE IF NOT EXISTS alarm_record (
27
+    id BIGSERIAL PRIMARY KEY,
28
+    device_id VARCHAR(50) NOT NULL,
29
+    region VARCHAR(100),
30
+    alarm_type VARCHAR(50),
31
+    alarm_level INTEGER,
32
+    alarm_message TEXT,
33
+    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
34
+    status INTEGER DEFAULT 0  -- 0:未处理, 1:处理中, 2:已处理
35
+);
36
+
37
+-- 生产报表表
38
+CREATE TABLE IF NOT EXISTS production_report (
39
+    id BIGSERIAL PRIMARY KEY,
40
+    report_type VARCHAR(50) NOT NULL,
41
+    region VARCHAR(100),
42
+    start_time TIMESTAMP,
43
+    end_time TIMESTAMP,
44
+    total_value DOUBLE PRECISION,
45
+    avg_value DOUBLE PRECISION,
46
+    data_count INTEGER,
47
+    remarks TEXT,
48
+    generate_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
49
+);
50
+
51
+-- 创建索引
52
+CREATE INDEX IF NOT EXISTS idx_water_data_device ON water_data(device_id);
53
+CREATE INDEX IF NOT EXISTS idx_water_data_region ON water_data(region);
54
+CREATE INDEX IF NOT EXISTS idx_water_data_time ON water_data(create_time);
55
+
56
+CREATE INDEX IF NOT EXISTS idx_water_quality_device ON water_quality(device_id);
57
+CREATE INDEX IF NOT EXISTS idx_water_quality_region ON water_quality(region);
58
+CREATE INDEX IF NOT EXISTS idx_water_quality_time ON water_quality(create_time);
59
+
60
+CREATE INDEX IF NOT EXISTS idx_alarm_record_device ON alarm_record(device_id);
61
+CREATE INDEX IF NOT EXISTS idx_alarm_record_region ON alarm_record(region);
62
+CREATE INDEX IF NOT EXISTS idx_alarm_record_time ON alarm_record(create_time);
63
+
64
+CREATE INDEX IF NOT EXISTS idx_report_type ON production_report(report_type);
65
+CREATE INDEX IF NOT EXISTS idx_report_region ON production_report(region);
66
+CREATE INDEX IF NOT EXISTS idx_report_time ON production_report(generate_time);

+ 30
- 0
wm-production/wm-production/src/main/resources/mapper/AlarmRecordMapper.xml Dosyayı Görüntüle

@@ -0,0 +1,30 @@
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.water.production.mapper.AlarmRecordMapper">
5
+    
6
+    <select id="selectPage" resultType="com.water.production.entity.AlarmRecord">
7
+        SELECT * FROM alarm_record
8
+        <where>
9
+            <if test="deviceId != null and deviceId != ''">
10
+                AND device_id = #{deviceId}
11
+            </if>
12
+            <if test="region != null and region != ''">
13
+                AND region LIKE CONCAT('%', #{region}, '%')
14
+            </if>
15
+            <if test="alarmType != null and alarmType != ''">
16
+                AND alarm_type = #{alarmType}
17
+            </if>
18
+            <if test="alarmLevel != null">
19
+                AND alarm_level = #{alarmLevel}
20
+            </if>
21
+            <if test="startTime != null">
22
+                AND create_time >= #{startTime}
23
+            </if>
24
+            <if test="endTime != null">
25
+                AND create_time &lt;= #{endTime}
26
+            </if>
27
+        </where>
28
+        ORDER BY create_time DESC
29
+    </select>
30
+</mapper>

+ 16
- 0
wm-production/wm-production/src/main/resources/mapper/ProductionReportMapper.xml Dosyayı Görüntüle

@@ -0,0 +1,16 @@
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.water.production.mapper.ProductionReportMapper">
5
+    
6
+    <insert id="insert" parameterType="com.water.production.entity.ProductionReport">
7
+        INSERT INTO production_report (
8
+            report_type, region, start_time, end_time, 
9
+            total_value, avg_value, data_count, remarks, generate_time
10
+        ) VALUES (
11
+            #{reportType}, #{region}, #{startTime}, #{endTime},
12
+            #{totalValue}, #{avgValue}, #{dataCount}, #{remarks}, #{generateTime}
13
+        )
14
+        RETURNING id
15
+    </insert>
16
+</mapper>

+ 24
- 0
wm-production/wm-production/src/main/resources/mapper/WaterDataMapper.xml Dosyayı Görüntüle

@@ -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.water.production.mapper.WaterDataMapper">
5
+    
6
+    <select id="selectPage" resultType="com.water.production.entity.WaterData">
7
+        SELECT * FROM water_data
8
+        <where>
9
+            <if test="deviceId != null and deviceId != ''">
10
+                AND device_id = #{deviceId}
11
+            </if>
12
+            <if test="region != null and region != ''">
13
+                AND region LIKE CONCAT('%', #{region}, '%')
14
+            </if>
15
+            <if test="startTime != null">
16
+                AND create_time >= #{startTime}
17
+            </if>
18
+            <if test="endTime != null">
19
+                AND create_time &lt;= #{endTime}
20
+            </if>
21
+        </where>
22
+        ORDER BY create_time DESC
23
+    </select>
24
+</mapper>

+ 27
- 0
wm-production/wm-production/src/main/resources/mapper/WaterQualityMapper.xml Dosyayı Görüntüle

@@ -0,0 +1,27 @@
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.water.production.mapper.WaterQualityMapper">
5
+    
6
+    <select id="selectPage" resultType="com.water.production.entity.WaterQuality">
7
+        SELECT * FROM water_quality
8
+        <where>
9
+            <if test="deviceId != null and deviceId != ''">
10
+                AND device_id = #{deviceId}
11
+            </if>
12
+            <if test="region != null and region != ''">
13
+                AND region LIKE CONCAT('%', #{region}, '%')
14
+            </if>
15
+            <if test="qualityLevel != null">
16
+                AND quality_level = #{qualityLevel}
17
+            </if>
18
+            <if test="startTime != null">
19
+                AND create_time >= #{startTime}
20
+            </if>
21
+            <if test="endTime != null">
22
+                AND create_time &lt;= #{endTime}
23
+            </if>
24
+        </where>
25
+        ORDER BY create_time DESC
26
+    </select>
27
+</mapper>