历史温度暂时提交

master
lld 2026-03-19 14:00:41 +08:00
parent 7012d4c67c
commit 34808ab31f
8 changed files with 212 additions and 14 deletions

View File

@ -1,17 +1,13 @@
package com.agri.system.controller; package com.agri.system.controller;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.agri.common.annotation.Log; import com.agri.common.annotation.Log;
import com.agri.common.core.controller.BaseController; import com.agri.common.core.controller.BaseController;
import com.agri.common.core.domain.AjaxResult; import com.agri.common.core.domain.AjaxResult;
@ -112,4 +108,14 @@ public class SysDtuDataController extends BaseController
{ {
return toAjax(sysDtuDataService.deleteSysDtuDataByIds(ids)); return toAjax(sysDtuDataService.deleteSysDtuDataByIds(ids));
} }
@PreAuthorize("@ss.hasPermi('system:data:query')")
@GetMapping(value = "/getHistoryData")
public AjaxResult getHistoryData(@RequestParam("imei") String imei,
@RequestParam(value = "startTime",required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime startTime,
@RequestParam(value = "endTime",required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime)
{
return success(sysDtuDataService.getHistoryData(imei,startTime,endTime));
}
} }

View File

@ -0,0 +1,30 @@
package com.agri.system.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class LiveDataView {
private List<String> timeList;
private List<BigDecimal> temp1List;
private List<BigDecimal> temp2List;
private List<BigDecimal> temp3List;
private List<BigDecimal> temp4List;
private List<BigDecimal> humi1List;
private List<BigDecimal> humi2List;
private List<BigDecimal> humi3List;
private List<BigDecimal> humi4List;
}

View File

@ -0,0 +1,40 @@
package com.agri.system.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class UChartsDataView {
// X轴分类时间
private List<String> categories;
// 系列数据(温度/湿度)
private List<UChartsSeries> series;
@Data
// 内部类:单条系列数据
public static class UChartsSeries {
private String name; // 系列名称(如"温度1"
private BigDecimal index;
private List<BigDecimal> data; // 系列数值
public UChartsSeries() {
}
public UChartsSeries(String name, BigDecimal index, List<BigDecimal> data) {
this.name = name;
this.index = index;
this.data = data;
}
}
public UChartsDataView() {
}
public UChartsDataView(List<String> categories, List<UChartsSeries> series) {
this.categories = categories;
this.series = series;
}
}

View File

@ -1,5 +1,6 @@
package com.agri.system.mapper; package com.agri.system.mapper;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -67,4 +68,12 @@ public interface SysDtuDataMapper extends BaseMapper<SysDtuData>
public int deleteSysDtuDataByIds(Long[] ids); public int deleteSysDtuDataByIds(Long[] ids);
List<Map<String, Object>> getLastDtuDataByImeiList(@Param("imeiList") List<String> imeiList); List<Map<String, Object>> getLastDtuDataByImeiList(@Param("imeiList") List<String> imeiList);
List<SysDtuData> getHistoryData(
@Param("imei") String imei,
@Param("startTime") LocalDateTime startTime,
@Param("endTime") LocalDateTime endTime
);
} }

View File

@ -1,8 +1,11 @@
package com.agri.system.service; package com.agri.system.service;
import com.agri.system.domain.SysDtuData; import com.agri.system.domain.SysDtuData;
import com.agri.system.domain.vo.LiveDataView;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -71,4 +74,7 @@ public interface ISysDtuDataService extends IService<SysDtuData>
List<Map<String, Object>> getLastDtuDataByImeiList(List<String> imeiList); List<Map<String, Object>> getLastDtuDataByImeiList(List<String> imeiList);
LiveDataView getHistoryData(String imei, LocalDateTime startTime, LocalDateTime endTime);
} }

View File

@ -2,18 +2,25 @@ package com.agri.system.service.impl;
import com.agri.common.utils.DateUtils; import com.agri.common.utils.DateUtils;
import com.agri.system.domain.SysDtuData; import com.agri.system.domain.SysDtuData;
import com.agri.system.domain.vo.LiveDataView;
import com.agri.system.domain.vo.UChartsDataView;
import com.agri.system.mapper.SysDtuDataMapper; import com.agri.system.mapper.SysDtuDataMapper;
import com.agri.system.service.ISysDtuDataService; import com.agri.system.service.ISysDtuDataService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Collections; import java.time.LocalTime;
import java.util.List; import java.time.format.DateTimeFormatter;
import java.util.Map; import java.util.*;
import java.util.function.Function;
/** /**
* DTU湿Service * DTU湿Service
@ -126,4 +133,73 @@ public class SysDtuDataServiceImpl extends ServiceImpl<SysDtuDataMapper, SysDtuD
return baseMapper.getLastDtuDataByImeiList(imeiList); return baseMapper.getLastDtuDataByImeiList(imeiList);
} }
@Override
public LiveDataView getHistoryData(String imei, LocalDateTime startTime, LocalDateTime endTime) {
// 非空校验
Assert.hasText(imei, "设备IMEI不能为空");
// 时间参数兜底
LocalDateTime finalStartTime = ObjectUtils.isEmpty(startTime)
? LocalDateTime.of(LocalDate.now(), LocalTime.MIN)
: startTime;
LocalDateTime finalEndTime = ObjectUtils.isEmpty(endTime)
? LocalDateTime.now()
: endTime;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
List<SysDtuData> historyData = baseMapper.getHistoryData(imei, finalStartTime, finalEndTime);
LiveDataView liveDataView = new LiveDataView();
List<String> categories = new ArrayList<>();
List<BigDecimal> temp1List = new ArrayList<>();
List<BigDecimal> temp2List = new ArrayList<>();
List<BigDecimal> temp3List = new ArrayList<>();
List<BigDecimal> temp4List = new ArrayList<>();
List<BigDecimal> humi1List = new ArrayList<>();
List<BigDecimal> humi2List = new ArrayList<>();
List<BigDecimal> humi3List = new ArrayList<>();
List<BigDecimal> humi4List = new ArrayList<>();
// 工具方法null转0
Function<BigDecimal, BigDecimal> nullToZero = bd -> bd == null ? BigDecimal.ZERO : bd;
// 一次遍历收集所有数据(性能最优)
if (CollectionUtils.isNotEmpty(historyData)) {
historyData.forEach(dtuData -> {
categories.add(dtuData.getTime().format(formatter));
temp1List.add(nullToZero.apply(dtuData.getTemp1()));
temp2List.add(nullToZero.apply(dtuData.getTemp2()));
temp3List.add(nullToZero.apply(dtuData.getTemp3()));
temp4List.add(nullToZero.apply(dtuData.getTemp4()));
humi1List.add(nullToZero.apply(dtuData.getHumi1()));
humi2List.add(nullToZero.apply(dtuData.getHumi2()));
humi3List.add(nullToZero.apply(dtuData.getHumi3()));
humi4List.add(nullToZero.apply(dtuData.getHumi4()));
});
}
// 设置返回数据
liveDataView.setTimeList(categories);
liveDataView.setTemp1List(temp1List);
liveDataView.setTemp2List(temp2List);
liveDataView.setTemp3List(temp3List);
liveDataView.setTemp4List(temp4List);
liveDataView.setHumi1List(humi1List);
liveDataView.setHumi2List(humi2List);
liveDataView.setHumi3List(humi3List);
liveDataView.setHumi4List(humi4List);
// UChartsDataView uChartsData = new UChartsDataView();
// uChartsData.setCategories(categories);
// uChartsData.setSeries(Arrays.asList(
// new UChartsDataView.UChartsSeries("温度1", BigDecimal.ZERO, temp1List),
// new UChartsDataView.UChartsSeries("温度2", BigDecimal.ZERO, temp2List),
// new UChartsDataView.UChartsSeries("温度3", BigDecimal.ZERO, temp3List),
// new UChartsDataView.UChartsSeries("温度4", BigDecimal.ZERO, temp4List),
// new UChartsDataView.UChartsSeries("湿度1", BigDecimal.ONE, humi1List),
// new UChartsDataView.UChartsSeries("湿度2", BigDecimal.ONE, humi2List),
// new UChartsDataView.UChartsSeries("湿度3", BigDecimal.ONE, humi3List),
// new UChartsDataView.UChartsSeries("湿度4", BigDecimal.ONE, humi4List)
// ));
return liveDataView;
}
} }

View File

@ -120,5 +120,5 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sysdate() sysdate()
) )
</insert> </insert>
</mapper> </mapper>

View File

@ -152,4 +152,35 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
GROUP BY imei GROUP BY imei
) )
</select> </select>
<select id="getHistoryData" resultType="com.agri.system.domain.SysDtuData">
SELECT
t.*
FROM (
SELECT
`imei`,
`time`,
temp1,
humi1,
temp2,
humi2,
temp3,
humi3,
temp4,
humi4,
ROW_NUMBER() OVER (
PARTITION BY DATE_FORMAT(`time`, '%Y-%m-%d %H:%i:00') - INTERVAL (MINUTE(`time`) % 5) MINUTE
ORDER BY `time` DESC
) AS rn
FROM
sys_dtu_data
WHERE
imei = #{imei}
AND
`time` &gt;= #{startTime}
AND
`time` &lt;= #{endTime}
) t
WHERE t.rn = 1
ORDER BY t.time ASC
</select>
</mapper> </mapper>