diff --git a/.idea/misc.xml b/.idea/misc.xml index 9533805..90fdf05 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,5 +8,5 @@ - + \ No newline at end of file diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMonitorController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMonitorController.java index 98ab612..578397e 100644 --- a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMonitorController.java +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsSiteMonitorController.java @@ -3,6 +3,7 @@ package com.xzzn.web.controller.ems; import com.xzzn.common.core.controller.BaseController; import com.xzzn.common.core.domain.AjaxResult; import com.xzzn.common.core.page.TableDataInfo; +import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.vo.BMSBatteryDataList; import com.xzzn.ems.domain.vo.BatteryDataStatsListVo; import com.xzzn.ems.domain.vo.DateSearchRequest; @@ -184,4 +185,19 @@ public class EmsSiteMonitorController extends BaseController{ { return success(iSingleSiteService.getAmmeterDataList(siteId)); } + + /** + * 单站监控-首页-点位展示 + * 储能功率、电网功率、负荷功率、光伏功率 + * SOC、SOH、电池平均温度 + */ + @GetMapping("/getPointData") + public AjaxResult getPointData(DateSearchRequest requestVo) + { + if (!StringUtils.isEmpty(requestVo.getSiteId())) { + return success(iSingleSiteService.getPointData(requestVo)); + } else { + return error("缺少必传项"); + } + } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataResponse.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataResponse.java new file mode 100644 index 0000000..d8ca59d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataResponse.java @@ -0,0 +1,103 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 单站监控-首页-点位重点数据展示 + */ +public class PointDataResponse{ + /** 数据日期 */ + private String statisDate; + /** 电网功率-total_active_power(LOAD) */ + private BigDecimal gridPower; + /** 负载功率 */ + private BigDecimal loadPower; + /** 储能功率-secondary_total_active_power(METE) */ + private BigDecimal storagePower; + /** 光伏功率-total_active_power(METEGT) */ + private BigDecimal pvPower; + /** SOC */ + private BigDecimal avgSoc; + /** SOH */ + private BigDecimal avgSoh; + /** 电池平均温度 */ + private BigDecimal avgTemp; + + public PointDataResponse(String statisDate, + BigDecimal pvPower, BigDecimal storagePower, BigDecimal loadPower, BigDecimal gridPower, + BigDecimal avgSoh, BigDecimal avgSoc,BigDecimal avgTemp + ) { + this.avgTemp = avgTemp; + this.avgSoh = avgSoh; + this.avgSoc = avgSoc; + this.pvPower = pvPower; + this.storagePower = storagePower; + this.loadPower = loadPower; + this.gridPower = gridPower; + this.statisDate = statisDate; + } + + public BigDecimal getAvgTemp() { + return avgTemp; + } + + public void setAvgTemp(BigDecimal avgTemp) { + this.avgTemp = avgTemp; + } + + public BigDecimal getAvgSoc() { + return avgSoc; + } + + public void setAvgSoc(BigDecimal avgSoc) { + this.avgSoc = avgSoc; + } + + public BigDecimal getAvgSoh() { + return avgSoh; + } + + public void setAvgSoh(BigDecimal avgSoh) { + this.avgSoh = avgSoh; + } + + public String getStatisDate() { + return statisDate; + } + + public void setStatisDate(String statisDate) { + this.statisDate = statisDate; + } + + public BigDecimal getGridPower() { + return gridPower; + } + + public void setGridPower(BigDecimal gridPower) { + this.gridPower = gridPower; + } + + public BigDecimal getLoadPower() { + return loadPower; + } + + public void setLoadPower(BigDecimal loadPower) { + this.loadPower = loadPower; + } + + public BigDecimal getStoragePower() { + return storagePower; + } + + public void setStoragePower(BigDecimal storagePower) { + this.storagePower = storagePower; + } + + public BigDecimal getPvPower() { + return pvPower; + } + + public void setPvPower(BigDecimal pvPower) { + this.pvPower = pvPower; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackPointVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackPointVo.java new file mode 100644 index 0000000..d0aa382 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackPointVo.java @@ -0,0 +1,50 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 单站监控-首页-电池堆点位数据 + */ +public class StackPointVo{ + private String statisDate; + /** SOC */ + private BigDecimal avgSoc; + + /** SOH */ + private BigDecimal avgSoh; + + /** 电池平均温度 */ + private BigDecimal avgTemp; + + public String getStatisDate() { + return statisDate; + } + + public void setStatisDate(String statisDate) { + this.statisDate = statisDate; + } + + public BigDecimal getAvgTemp() { + return avgTemp; + } + + public void setAvgTemp(BigDecimal avgTemp) { + this.avgTemp = avgTemp; + } + + public BigDecimal getAvgSoc() { + return avgSoc; + } + + public void setAvgSoc(BigDecimal avgSoc) { + this.avgSoc = avgSoc; + } + + public BigDecimal getAvgSoh() { + return avgSoh; + } + + public void setAvgSoh(BigDecimal avgSoh) { + this.avgSoh = avgSoh; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackStatisListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackStatisListVo.java index 0c9c6d9..58fe490 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackStatisListVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/StackStatisListVo.java @@ -12,12 +12,12 @@ public class StackStatisListVo { private String statisDate; /** - * 有功 + * 温度 */ private BigDecimal temp; /** - * 无功 + * 电压 */ private BigDecimal voltage; diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java index fe0e99a..8cf29f2 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java @@ -1,7 +1,10 @@ package com.xzzn.ems.mapper; +import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Map; + import com.xzzn.ems.domain.EmsBatteryCluster; import com.xzzn.ems.domain.vo.*; import org.apache.ibatis.annotations.Param; @@ -83,4 +86,9 @@ public interface EmsBatteryClusterMapper /** 堆电池温度数据-获取当天每小时簇 */ public List getClusterDataByHour(StatisClusterDateRequest requestVo); + + // 奉贤-电池平均温度 + public List> getAvgTempByHour(DateSearchRequest requestVo); + public List> getAvgTempByDay(DateSearchRequest requestVo); + public List> getAvgTempByMonth(DateSearchRequest requestVo); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryStackMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryStackMapper.java index ea78caf..dad1e38 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryStackMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryStackMapper.java @@ -5,6 +5,7 @@ import java.util.List; import com.xzzn.ems.domain.EmsBatteryStack; import com.xzzn.ems.domain.vo.DateSearchRequest; import com.xzzn.ems.domain.vo.StackAveTempVo; +import com.xzzn.ems.domain.vo.StackPointVo; import com.xzzn.ems.domain.vo.StackStatisListVo; import org.apache.ibatis.annotations.Param; @@ -85,4 +86,9 @@ public interface EmsBatteryStackMapper public List getStackDataByMonth(DateSearchRequest requestVo); public EmsBatteryStack getSiteSumStackInfo(String siteId); + + // 点位数据 - soc/soh/temp + public List getStackPointByHour(DateSearchRequest requestVo); + public List getStackPointByDay(DateSearchRequest requestVo); + public List getStackPointByMonth(DateSearchRequest requestVo); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/ISingleSiteService.java b/ems-system/src/main/java/com/xzzn/ems/service/ISingleSiteService.java index 9c9d5a3..88358e1 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/ISingleSiteService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/ISingleSiteService.java @@ -39,4 +39,6 @@ public interface ISingleSiteService public SiteMonitorRuningInfoVo getRunningGraphBatteryTemp(String siteId); public List getClusterBatteryList(String siteId, String stackDeviceId, String clusterDeviceId); + + public List getPointData(DateSearchRequest requestVo); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java index 94335b4..f9c2897 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java @@ -40,10 +40,6 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService @Autowired private EmsDevicesSettingMapper emsDevicesSettingMapper; @Autowired - private EmsBatteryDataMapper emsBatteryDataMapper; - @Autowired - private EmsBatteryDailyLatestMapper emsBatteryDailyLatestMapper; - @Autowired private EmsBatteryDataDayMapper emsBatteryDataDayMapper; @Autowired private EmsDailyChargeDataMapper emsDailyChargeDataMapper; @@ -353,8 +349,6 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService } private void dealDataPower(String siteId, List dataList) { - DecimalFormat df = new DecimalFormat("0.####"); - if (dataList == null || dataList.size() == 0){ return; } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java index 550a488..01f7427 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java @@ -7,7 +7,6 @@ import com.alibaba.fastjson2.TypeReference; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.xzzn.common.constant.Constants; import com.xzzn.common.constant.RedisKeyConstants; import com.xzzn.common.core.redis.RedisCache; import com.xzzn.common.enums.*; @@ -23,12 +22,10 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; -import java.util.concurrent.TimeUnit; @Service public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IFXXDataProcessService { diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java index 583b73d..e31a9dc 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java @@ -4,6 +4,7 @@ import com.xzzn.common.constant.RedisKeyConstants; import com.xzzn.common.core.redis.RedisCache; import com.xzzn.common.enums.AmmeterCategory; import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.enums.SiteEnum; import com.xzzn.common.utils.DateUtils; import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.*; @@ -38,19 +39,26 @@ public class SingleSiteServiceImpl implements ISingleSiteService { private static final String AMMETER_DEVICE_METE = "METE"; + private static Map storageFactor = new HashMap<>(); + static { + storageFactor.put("021_DDS_01", new BigDecimal("0.1")); + storageFactor.put("default", BigDecimal.ONE); // 默认1 + } + + private static Map pvFactor = new HashMap<>(); + static { + pvFactor.put("021_DDS_01", new BigDecimal("-0.001")); + pvFactor.put("default", BigDecimal.ONE); // Convert to Basic Latin + } @Autowired private EmsPcsDataMapper emsPcsDataMapper; @Autowired private EmsAlarmRecordsMapper emsAlarmRecordsMapper; @Autowired - private EmsBatteryDataMapper emsBatteryDataMapper; - @Autowired private EmsBatteryStackMapper emsBatteryStackMapper; @Autowired private EmsBatteryClusterMapper emsBatteryClusterMapper; @Autowired - private EmsPcsBranchDataMapper emsPcsBranchDataMapper; - @Autowired private EmsCoolingDataMapper emsCoolingDataMapper; @Autowired private EmsAmmeterDataMapper emsAmmeterDataMapper; @@ -537,4 +545,160 @@ public class SingleSiteServiceImpl implements ISingleSiteService { } + /** + * 单站监控-首页-获取重点数据 + * @param requestVo + * @return + */ + @Override + public List getPointData(DateSearchRequest requestVo) { + List responseList = new ArrayList<>(); + List powerList = new ArrayList<>();//功率数据 + List stackList = new ArrayList<>();//电池堆数据 + List> fxAvgTempList = new ArrayList<>(); + + // 默认时间-7天 + dealRequestTime(requestVo); + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + List timeList = new ArrayList<>(); + + // 开始日期和结束日期同一天,展示 0-24 小时数据 + if (DateUtils.isSameDay(startDate, endDate)){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + powerList = emsAmmeterDataMapper.getPowerDataByHour(requestVo);//功率数据 + stackList = emsBatteryStackMapper.getStackPointByHour(requestVo);//电池堆数据 + if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){ + fxAvgTempList = emsBatteryClusterMapper.getAvgTempByHour(requestVo); + } + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 1 + && DateUtils.differentDaysByMillisecond(endDate, startDate) < 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 天,小于30 天,按天展示数据 + powerList = emsAmmeterDataMapper.getPowerDataByDay(requestVo);//功率数据 + stackList = emsBatteryStackMapper.getStackPointByDay(requestVo);//电池堆数据 + if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){ + fxAvgTempList = emsBatteryClusterMapper.getAvgTempByDay(requestVo); + } + } else if (DateUtils.differentDaysByMillisecond(endDate, startDate) >= 30){ + endDate = DateUtils.addDays(endDate, 1); + requestVo.setEndDate(endDate); + // 开始日期-结束日期大于 1 个月,按月展示数据 + powerList = emsAmmeterDataMapper.getPowerDataByMonth(requestVo);//功率数据 + stackList = emsBatteryStackMapper.getStackPointByMonth(requestVo);//电池堆数据 + if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){ + fxAvgTempList = emsBatteryClusterMapper.getAvgTempByMonth(requestVo); + } + } + + // 如果奉贤数据:电池平均温度单独取值。将其塞入stackList里面 + if (SiteEnum.FX.getCode().equals(requestVo.getSiteId())){ + processFXXTempData(stackList,fxAvgTempList); + } + + // 数据转换为Map + Map powerMap = powerList.stream() + .collect(Collectors.toMap(PowerStatisListVo::getStatisDate, stat -> stat)); + Map stackMap = stackList.stream() + .collect(Collectors.toMap(StackPointVo::getStatisDate, stat -> stat)); + // 收集所有日期 + Set allDates = new HashSet<>(); + allDates.addAll(powerMap.keySet()); + allDates.addAll(stackMap.keySet()); + + // 按日期合并数据 + responseList = allDates.stream() + .map(date -> { + PowerStatisListVo powerStat = powerMap.get(date); + StackPointVo stackStat = stackMap.get(date); + + // null时取0 + BigDecimal pvPower = powerStat != null ? powerStat.getPvPower() : BigDecimal.ZERO; + BigDecimal storagePower = powerStat != null ? powerStat.getStoragePower() : BigDecimal.ZERO; + BigDecimal gridPower = powerStat != null ? powerStat.getGridPower() : BigDecimal.ZERO; + BigDecimal avgSoh = stackStat != null ? stackStat.getAvgSoh() : BigDecimal.ZERO; + BigDecimal avgSoc = stackStat != null ? stackStat.getAvgSoc() : BigDecimal.ZERO; + BigDecimal avgTemp = stackStat != null ? stackStat.getAvgTemp() : BigDecimal.ZERO; + + // 假设完整构造参数(补充原代码中缺失的部分) + return new PointDataResponse(date, pvPower, storagePower, BigDecimal.ZERO, gridPower, avgSoh, avgSoc, avgTemp); + }) + // 按日期排序 + .sorted(Comparator.comparing(PointDataResponse::getStatisDate)) + .collect(Collectors.toList()); + + // 处理数据系数 &负荷功率 + dealDataPower(requestVo.getSiteId(),responseList); + + return responseList; + } + + private void dealDataPower(String siteId, List dataList) { + if (dataList == null || dataList.size() == 0){ + return; + } + + for (PointDataResponse pointDataResponse : dataList) { + BigDecimal gridPower = pointDataResponse.getGridPower() == null ? BigDecimal.ZERO : pointDataResponse.getGridPower(); + BigDecimal storagePower = pointDataResponse.getStoragePower() == null ? BigDecimal.ZERO : pointDataResponse.getStoragePower(); + BigDecimal pvPower = pointDataResponse.getPvPower() == null ? BigDecimal.ZERO : pointDataResponse.getPvPower(); + BigDecimal loadPower = new BigDecimal(0); + + // 电动所:储能功率=储能功率乘0.1;光伏功率=光伏功率*乘-0.001;负荷功率=电网功率+光伏功率-储能功率 + // 奉贤:负荷功率=电网功率-储能功率; + // 电动所:储能功率=储能功率乘0.1;光伏功率=光伏功率*乘-0.001;负荷功率=电网功率+光伏功率-储能功率 + if (SiteEnum.DDS.getCode().equals(siteId)){ + pointDataResponse.setStoragePower(storagePower.multiply(storageFactor.get(siteId)).stripTrailingZeros()); + pointDataResponse.setPvPower(pvPower.multiply(pvFactor.get(siteId)).stripTrailingZeros()); + loadPower = gridPower.add(pointDataResponse.getPvPower()).subtract(pointDataResponse.getStoragePower()); + pointDataResponse.setLoadPower(loadPower); + } else if (SiteEnum.FX.getCode().equals(siteId)){ + // 奉贤:负荷功率=电网功率-储能功率; + loadPower = gridPower.subtract(storagePower); + pointDataResponse.setLoadPower(loadPower); + } + } + } + + private void processFXXTempData(List stackList, List> fxAvgTempList) { + if (stackList == null || fxAvgTempList == null) { + return; + } + + Map fxAvgTempMap = fxAvgTempList.stream() + .filter(subMap -> subMap != null && !subMap.isEmpty()) + .filter(subMap -> subMap.containsKey("statisDate") && subMap.containsKey("avgTemp")) + .collect(Collectors.toMap( + subMap -> String.valueOf(subMap.get("statisDate")), + subMap -> (BigDecimal)subMap.get("avgTemp"), + (existingValue, newValue) -> newValue, + HashMap::new + )); + + for (StackPointVo stackPointVo : stackList) { + // 从map中获取temp + BigDecimal mapTemp = (fxAvgTempMap != null) ? fxAvgTempMap.get(stackPointVo.getStatisDate()) : null; + if (mapTemp != null) { + stackPointVo.setAvgTemp(mapTemp); + } + } + + } + + // 统计入参时间处理 + public void dealRequestTime(DateSearchRequest requestVo){ + Date startDate = requestVo.getStartDate(); + Date endDate = requestVo.getEndDate(); + if (startDate == null && endDate == null) { + // 如果没有传时间,默认从今天往前7天 + LocalDate sevenDaysAgo = LocalDate.now().minusDays(6); + startDate = DateUtils.toDate(sevenDaysAgo); + endDate = new Date(); + requestVo.setStartDate(startDate); + requestVo.setEndDate(endDate); + } + } + } diff --git a/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml index 3b1308a..1c69618 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsAmmeterDataMapper.xml @@ -984,7 +984,7 @@ + + + WHERE p.site_id = #{siteId} + + AND p.update_time >= #{startDate} + + + AND p.update_time < #{endDate} + + + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsBatteryStackMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsBatteryStackMapper.xml index 11a905c..2467e79 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsBatteryStackMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsBatteryStackMapper.xml @@ -391,7 +391,7 @@ select latest.dateHour as statisDate, t.device_id as deviceId, - from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.update_time, '%H')+1 AS dateHour,MAX(p.update_time) as max_update_time + from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.update_time, '%H:00') AS dateHour,MAX(p.update_time) as max_update_time FROM ems_battery_stack p GROUP BY p.site_id,p.device_id,dateHour @@ -443,4 +443,52 @@ and t.create_time = latest.max_time where t.site_id = #{siteId} + + + + + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml index 7b08a6c..90014fe 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml @@ -456,7 +456,7 @@ select latest.dateHour as ammeterDate, sum(t.daily_ac_charge_energy) as chargedCap, sum(t.daily_ac_discharge_energy) as disChargedCap - from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H')+1 AS dateHour,MAX(p.data_update_time) as max_update_time + from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H:00') AS dateHour,MAX(p.data_update_time) as max_update_time FROM ems_pcs_data p GROUP BY p.site_id,p.device_id,dateHour @@ -530,7 +530,7 @@ select latest.dateHour as statisDate, t.device_id as deviceId, - from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H')+1 AS dateHour,MAX(p.data_update_time) as max_update_time + from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H:00') AS dateHour,MAX(p.data_update_time) as max_update_time FROM ems_pcs_data p GROUP BY p.site_id,p.device_id,dateHour