Browse Source

TrendLog

zhc
review512jwy@163.com 2 weeks ago
parent
commit
768698d2e0
  1. 5
      dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java
  2. 2
      dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml
  3. 2
      dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml
  4. 2
      dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml
  5. 2
      dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java
  6. 2
      dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java
  7. 181
      dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataTrendLogController.java
  8. 14
      dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java
  9. 37
      dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml
  10. 12
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/data/TrendLogDataSearchParam.java
  11. 45
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceTrendLogDataDTO.java
  12. 20
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/DeviceTrendLogData.java
  13. 22
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataTrendLogService.java
  14. 199
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataTrendLogServiceImpl.java

5
dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java

@ -40,6 +40,7 @@ public class Constants {
public static final int CATEGORY_ACCUMULATE = 2;//累积
public static final int CATEGORY_MEASURE = 3;//计测
public static final int CATEGORY_STATUS= 4;//状态
public static final int CATEGORY_TRENDLOG= 5;//TrendLog
// // 所有设备类型ID的总集合
// public static final List<Integer> ALL_DEVICE_TYPE_IDS = new ArrayList<>();
@ -79,10 +80,12 @@ public class Constants {
CATEGORY_MAP.put(CATEGORY_MEASURE, new ArrayList<>(List.of(1003L)));
CATEGORY_MAP.put(CATEGORY_ACCUMULATE, new ArrayList<>(List.of(1002L,1006L)));
CATEGORY_MAP.put(CATEGORY_ACCUMULATE, new ArrayList<>(List.of(1002L)));
CATEGORY_MAP.put(CATEGORY_STATUS, new ArrayList<>(List.of(1004L)));
CATEGORY_MAP.put(CATEGORY_TRENDLOG, new ArrayList<>(List.of(1006L)));
// 收集所有的设备类型ID
for (List<Long> ids : CATEGORY_MAP.values()) {
ALL_CATEGORY_IDS.addAll(ids);

2
dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml

@ -146,5 +146,7 @@ msgcn:
editNotification: 编辑通知
delNotification: 删除通知
editDeviceField: 编辑设备属性
getTrendLogDataList: 获取TrendLog数据列表
exportTrendLogData: 导出TrendLog数据

2
dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml

@ -146,6 +146,8 @@ msgen:
editNotification: Edit notification
delNotification: Delete notification
editDeviceField: Edit device attributes
getTrendLogDataList: Get TrendLog data list
exportTrendLogData: Export TrendLog data

2
dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml

@ -146,6 +146,8 @@ msgjp:
editNotification: お知らせ管理
delNotification: お知らせ管理
editDeviceField: デバイス属性を編集
getTrendLogDataList: TrendLog
exportTrendLogData: TrendLog

2
dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java

@ -52,7 +52,7 @@ import java.util.List;
@SuppressWarnings("unchecked")
public class DeviceDataBaStatusController {
private static final Logger logger = LoggerFactory.getLogger(DeviceDataAccumulateController.class);
private static final Logger logger = LoggerFactory.getLogger(DeviceDataBaStatusController.class);
@Value("${export.page.size}")
private Integer EXPORT_PAGE_SIZE;

2
dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java

@ -52,7 +52,7 @@ import java.util.List;
@SuppressWarnings("unchecked")
public class DeviceDataMeasureController {
private static final Logger logger = LoggerFactory.getLogger(DeviceDataAccumulateController.class);
private static final Logger logger = LoggerFactory.getLogger(DeviceDataMeasureController.class);
@Value("${export.page.size}")
private Integer EXPORT_PAGE_SIZE;

181
dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataTrendLogController.java

@ -0,0 +1,181 @@
package com.dongjian.dashboard.back.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.dongjian.dashboard.back.common.exception.BusinessException;
import com.dongjian.dashboard.back.common.response.PageInfo;
import com.dongjian.dashboard.back.common.response.PageResponse;
import com.dongjian.dashboard.back.common.response.ResponseCode;
import com.dongjian.dashboard.back.common.response.SimpleDataResponse;
import com.dongjian.dashboard.back.configurator.aspect.OperationLog;
import com.dongjian.dashboard.back.configurator.interceptor.AccessRequired;
import com.dongjian.dashboard.back.dto.data.TrendLogDataSearchParam;
import com.dongjian.dashboard.back.dto.device.LineDataSearchParams;
import com.dongjian.dashboard.back.easyexcel.ExportDeviceTrendLogDataDTO;
import com.dongjian.dashboard.back.easyexcel.LanguageDynamicHeaderAdapter;
import com.dongjian.dashboard.back.service.DeviceDataTrendLogService;
import com.dongjian.dashboard.back.service.common.CommonOpt;
import com.dongjian.dashboard.back.util.CommonUtil;
import com.dongjian.dashboard.back.vo.data.DeviceTrendLogData;
import com.dongjian.dashboard.back.vo.device.LineData;
import com.github.pagehelper.PageHelper;
import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
*
* @author jwy-style
*
*/
@RestController//代表返回的是json格式的数据,这个注解是Spring4之后新加的注解
@AccessRequired //注解标识是否需要验证token
@RequestMapping("/deviceTrendLog") //http请求路径映射
@Tag(name = "TrendLog设备的相关接口",description = "TrendLog设备的相关接口")
@SuppressWarnings("unchecked")
public class DeviceDataTrendLogController {
private static final Logger logger = LoggerFactory.getLogger(DeviceDataTrendLogController.class);
@Value("${export.page.size}")
private Integer EXPORT_PAGE_SIZE;
@Autowired
private DeviceDataTrendLogService deviceDataTrendLogService;
@Autowired
private CommonOpt commonOpt;
@OperationLog(operation = "getTrendLogDataList", remark = "")
@Operation(summary = "获取TrendLog数据列表")
@RequestMapping(value = "/getDataList",method = RequestMethod.GET)
public PageResponse<PageInfo<DeviceTrendLogData>> getListPage(
@Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
@Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken,
@Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
@Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) Long CompanyId,
@Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType,
TrendLogDataSearchParam pageSearchParam
) throws BusinessException {
pageSearchParam.setUserId(UserId);
// pageSearchParam.setCompanyId(CompanyId);
PageResponse<PageInfo<DeviceTrendLogData>> pageResponse = new PageResponse<PageInfo<DeviceTrendLogData>>();
try{
pageResponse.setData(deviceDataTrendLogService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType));
pageResponse.setCode(ResponseCode.SUCCESS);
pageResponse.setMsg("success");
}catch (Exception e){
logger.error("查询列表报错",e);
pageResponse.setCode(ResponseCode.SERVER_ERROR);
pageResponse.setMsg("service error");
}
return pageResponse;
}
@OperationLog(operation = "exportTrendLogData", remark = "")
@Operation(summary = "导出TrendLog数据列表")
@GetMapping("/exportData")
public void exportDeviceTrendLog(HttpServletResponse response,
@Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
@Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken,
@Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
@Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) Long CompanyId,
@Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType,
TrendLogDataSearchParam pageSearchParam
) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("TrendLog"+CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// ===== 固定导出分页大小=====
pageSearchParam.setPageSize(EXPORT_PAGE_SIZE);
// ===== 构建 Excel =====
List<List<String>> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceTrendLogDataDTO.class, LanguageType);
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build();
WriteSheet sheet = EasyExcel.writerSheet("sheet1").build();
// ===== 循环分页查询并写 Excel =====
int pageNum = 1;
try {
while (true) {
pageSearchParam.setPageNum(pageNum);
PageInfo<DeviceTrendLogData> pageData = deviceDataTrendLogService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType);
List<DeviceTrendLogData> list = pageData.getList();
if (CollectionUtils.isEmpty(list)) {
break; // 没数据了,结束
}
for (DeviceTrendLogData item : list) {
ExportDeviceTrendLogDataDTO dto = new ExportDeviceTrendLogDataDTO();
BeanUtils.copyProperties(item, dto);
// dto.setLastYearRatio(CommonUtil.ratio(item.getCumulativeValue(), item.getLastYearValue()));
// dto.setYesterdayRatio(CommonUtil.ratio(item.getCumulativeValue(), item.getYesterdayValue()));
dto.setStatus111(commonOpt.status111Mapping(item.getStatus111()));
excelWriter.write(List.of(dto), sheet);
// 手动置空,提醒 GC 回收
dto = null;
item = null;
}
// 手动清理分页数据和缓存
list.clear();
PageHelper.clearPage();
// 最后一页判断(加这个更安全)
if (pageNum >= pageData.getPages()) {
break;
}
pageNum++;
}
} catch (Exception e) {
logger.error("export error", e);
throw e;
} finally {
excelWriter.finish();
PageHelper.clearPage();
}
}
@Hidden
@OperationLog(operation = "getLineData", remark = "")
@Operation(summary = "获取7日趋势数据")
@RequestMapping(value = "/getLineData",method = RequestMethod.POST)
public SimpleDataResponse<List<LineData>> getLineData(
@Parameter(name = "searchType", description = "1-按小时,2-全部数据", required = true) Integer searchType,
@Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
@Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken,
@Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
@Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) Long CompanyId,
@Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType,
@RequestBody LineDataSearchParams lineDataSearchParams
) throws BusinessException {
return deviceDataTrendLogService.getLineData(searchType, lineDataSearchParams, CompanyId, UserId, LanguageType);
}
}

14
dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java

@ -2,15 +2,9 @@ package com.dongjian.dashboard.back.dao.ex;
import com.dongjian.dashboard.back.dao.auto.DeviceInfoMapper;
import com.dongjian.dashboard.back.dto.data.AccumulateDataSearchParam;
import com.dongjian.dashboard.back.dto.data.AlarmDataSearchParam;
import com.dongjian.dashboard.back.dto.data.BaStatusDataSearchParam;
import com.dongjian.dashboard.back.dto.data.MeasureDataSearchParam;
import com.dongjian.dashboard.back.dto.data.*;
import com.dongjian.dashboard.back.dto.device.DeviceSearchParams;
import com.dongjian.dashboard.back.vo.data.DeviceAccumulateData;
import com.dongjian.dashboard.back.vo.data.DeviceAlarmData;
import com.dongjian.dashboard.back.vo.data.DeviceBaStatusData;
import com.dongjian.dashboard.back.vo.data.DeviceMeasureData;
import com.dongjian.dashboard.back.vo.data.*;
import com.dongjian.dashboard.back.vo.device.DeviceVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -41,4 +35,8 @@ public interface DeviceInfoMapperExt extends DeviceInfoMapper {
List<DeviceAlarmData> getDevice4AlarmDataByGroup(AlarmDataSearchParam pageSearchParam);
List<String> selectAlertingDeviceIds(@Param("deviceIds") List<String> deviceIds);
List<DeviceTrendLogData> getDevice4TrendLogData(TrendLogDataSearchParam pageSearchParam);
List<DeviceTrendLogData> getDevice4TrendLogDataByGroup(TrendLogDataSearchParam pageSearchParam);
}

37
dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml

@ -429,6 +429,43 @@
<include refid="alertHistoryOrder"/>
</select>
<select id="getDevice4TrendLogData" resultType="com.dongjian.dashboard.back.vo.data.DeviceTrendLogData">
select
<include refid="deviceDataSelect"/>
,drr.raw_data,
drr.receive_ts uploadTimestamp,
5 as classId
<include refid="deviceDataFromAndJoin"/>
left join device_rawdata_realtime drr on drr.device_id = device_info.device_id
<where>
<if test="buildingId != null">
and basic_building.building_id = #{buildingId}
</if>
<include refid="deviceDataCommonWhere"/>
</where>
<include refid="drrOrder"/>
</select>
<select id="getDevice4TrendLogDataByGroup" resultType="com.dongjian.dashboard.back.vo.data.DeviceTrendLogData">
select
<include refid="deviceDataSelect"/>
,drr.raw_data,
drr.receive_ts uploadTimestamp,
5 as classId
<include refid="deviceDataFromAndJoin"/>
left join device_rawdata_realtime drr on drr.device_id = device_info.device_id
left join dashboard_device_group_relation ddgr on ddgr.device_info_id = device_info.id
<where>
<if test="buildingId != null">
and basic_building.building_id = #{buildingId}
</if>
and ddgr.device_group_id = #{deviceGroupId}
<include refid="deviceDataCommonWhere"/>
</where>
<include refid="drrOrder"/>
</select>
<select id="selectAlertingDeviceIds" resultType="java.lang.String">
SELECT DISTINCT LOWER(device_id) AS device_id
FROM alert_history

12
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/data/TrendLogDataSearchParam.java

@ -0,0 +1,12 @@
package com.dongjian.dashboard.back.dto.data;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class TrendLogDataSearchParam extends DataSearchParam {
}

45
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceTrendLogDataDTO.java

@ -0,0 +1,45 @@
package com.dongjian.dashboard.back.easyexcel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class ExportDeviceTrendLogDataDTO {
@ExcelProperty(value = {"上传时间", "Upload Time", "計測日時"}, converter = TimestampConverter.class)
private Long uploadTimestamp;
@ExcelProperty({"设施名", "Facility Name", "施設名"})
private String buildingName;
@ExcelProperty({"监视点名称", "Monitoring Point Name", "監視点名称"})
private String monitoringPointName;
@ExcelProperty({"楼层名称", "Floor", "フロア"})
private String floorName;
@ExcelProperty({"监控点分类名称", "Category", "分類"})
private String monitoringPointCategoryName;
// @ExcelProperty({"网关信息名称", "Gateway Info Name", "接続先情報"})
// private String gatewayInfoName;
// @ExcelProperty({"数据提供方名称", "Data Provider Name", "データソース"})
// private String dataProviderName;
@ExcelProperty({"设备状态", "Device Status", "ステータスフラグ"})
private String status111;
@ExcelProperty({"积算值", "Accumulated Value", "積算値"})
private String cumulativeValue;
// @ExcelProperty({"前日比(%)", "Previous Day Ratio(%)", "前日比(%)"})
// private String yesterdayRatio;
//
// @ExcelProperty({"前年比(%)", "Previous Year Ratio(%)", "前年比(%)"})
// private String lastYearRatio;
@ExcelProperty({"单位", "Unit", "単位"})
private String unit;
}

20
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/DeviceTrendLogData.java

@ -0,0 +1,20 @@
package com.dongjian.dashboard.back.vo.data;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class DeviceTrendLogData extends BaseData{
@Schema(description = "cumulative value", example = "12.557")
private String cumulativeValue;
@Schema(description = "raw data", example = "", hidden = true)
private String rawData;
@Schema(description = "device status", example = "障害")
private String status111;
}

22
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataTrendLogService.java

@ -0,0 +1,22 @@
package com.dongjian.dashboard.back.service;
import com.dongjian.dashboard.back.common.response.PageInfo;
import com.dongjian.dashboard.back.common.response.SimpleDataResponse;
import com.dongjian.dashboard.back.dto.data.TrendLogDataSearchParam;
import com.dongjian.dashboard.back.dto.device.LineDataSearchParams;
import com.dongjian.dashboard.back.vo.data.DeviceTrendLogData;
import com.dongjian.dashboard.back.vo.device.LineData;
import java.util.List;
/**
* Service.
*/
public interface DeviceDataTrendLogService {
PageInfo<DeviceTrendLogData> getDataList(TrendLogDataSearchParam pageSearchParam, Long companyId, Long userId, Integer languageType);
List<DeviceTrendLogData> handleDeviceAccumulateData(TrendLogDataSearchParam pageSearchParam);
SimpleDataResponse<List<LineData>> getLineData(Integer searchType, LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType);
}

199
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataTrendLogServiceImpl.java

@ -0,0 +1,199 @@
package com.dongjian.dashboard.back.service.impl;
import com.dongjian.dashboard.back.common.Constants;
import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange;
import com.dongjian.dashboard.back.common.response.PageInfo;
import com.dongjian.dashboard.back.common.response.SimpleDataResponse;
import com.dongjian.dashboard.back.dao.aurora.DashboardRecordAccumulateMapperExt;
import com.dongjian.dashboard.back.dao.ex.DeviceInfoMapperExt;
import com.dongjian.dashboard.back.dao.ex.DeviceRawdataRealtimeMapperExt;
import com.dongjian.dashboard.back.dao.ex.FavoritedDeviceMapperExt;
import com.dongjian.dashboard.back.dto.data.TrendLogDataSearchParam;
import com.dongjian.dashboard.back.dto.device.LineDataSearchParams;
import com.dongjian.dashboard.back.model.DeviceRawdataRealtime;
import com.dongjian.dashboard.back.service.DeviceDataTrendLogService;
import com.dongjian.dashboard.back.service.common.CommonOpt;
import com.dongjian.dashboard.back.util.CommonUtil;
import com.dongjian.dashboard.back.util.DateUtil;
import com.dongjian.dashboard.back.vo.data.DeviceTrendLogData;
import com.dongjian.dashboard.back.vo.device.DeviceIncrement;
import com.dongjian.dashboard.back.vo.device.LineData;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.pagehelper.PageHelper;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
public class DeviceDataTrendLogServiceImpl implements DeviceDataTrendLogService {
private static final Logger logger = LoggerFactory.getLogger(DeviceDataTrendLogServiceImpl.class);
private static final ObjectMapper objectMapper = new ObjectMapper();
@Autowired
private DeviceInfoMapperExt deviceInfoMapperExt;
@Autowired
private FavoritedDeviceMapperExt favoritedDeviceMapperExt;
@Autowired
private DashboardRecordAccumulateMapperExt dashboardRecordAccumulateMapperExt;
@Autowired
private DeviceRawdataRealtimeMapperExt deviceRawdataRealtimeMapperExt;
@Autowired
private MsgLanguageChange msgLanguageChange;
@Autowired
private CommonOpt commonOpt;
@Override
public PageInfo<DeviceTrendLogData> getDataList(TrendLogDataSearchParam pageSearchParam, Long companyId, Long userId, Integer languageType) {
// if (null == pageSearchParam.getBuildingId()) {
// return new PageInfo<>(new ArrayList<>());
// }
//list防${}注入
if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) {
pageSearchParam.setCompanyIdList(List.of(companyId));
} else {
pageSearchParam.setCompanyIdList(commonOpt.filterCompanyIds(companyId, pageSearchParam.getCompanyIds()));
}
PageHelper.startPage(pageSearchParam.getPageNum() == null ? 1 : pageSearchParam.getPageNum(), pageSearchParam.getPageSize() == null ? 20 : pageSearchParam.getPageSize());
return new PageInfo<>(handleDeviceAccumulateData(pageSearchParam));
}
public List<DeviceTrendLogData> handleDeviceAccumulateData(TrendLogDataSearchParam pageSearchParam) {
List<DeviceTrendLogData> resultList;
if (StringUtils.isNotBlank(pageSearchParam.getKeyword())) {
try {
pageSearchParam.setKeyword(URLDecoder.decode(pageSearchParam.getKeyword(), StandardCharsets.UTF_8));
} catch (Exception e) {
logger.error("URLDecoder.decode error", e);
}
}
pageSearchParam.setCategoryIdList(Constants.CATEGORY_MAP.get(Constants.CATEGORY_TRENDLOG));
if (null != pageSearchParam.getDeviceGroupId()){
resultList = deviceInfoMapperExt.getDevice4TrendLogDataByGroup(pageSearchParam);
} else {
resultList = deviceInfoMapperExt.getDevice4TrendLogData(pageSearchParam);
}
if (CollectionUtils.isNotEmpty(resultList)) {
// 查询 favorited_device 表中所有设备的 device_id,转为 Set 提高 contains 性能
Set<String> favoritedDeviceIds = new HashSet<>(favoritedDeviceMapperExt.getFavoritedDeviceIds());
List<String> deviceIds = resultList.stream()
.map(DeviceTrendLogData::getDeviceId)
.toList();
// 查询 111状态 数据
Map<String, String> deviceId85To111Map = commonOpt.buildDeviceId85To111Map(deviceIds);
List<String> deviceIdList_111 = deviceId85To111Map.values()
.stream()
.toList();
Map<String, DeviceRawdataRealtime> realtime111Map = commonOpt.queryRealtimeMap(deviceIdList_111);
// Map<String, DeviceInfo> deviceInfo111Map = commonOpt.queryDeviceInfoMap(deviceIdList_111);
// 查询S备用设备的数据,因为先看备用S设备,有S的话优先用这个
Map<String, String> deviceId85ToSMap = commonOpt.buildDeviceId85ToSMap(deviceIds);
List<String> deviceIdList_S = deviceId85ToSMap.values()
.stream()
.toList();
Map<String, DeviceRawdataRealtime> realtimeSMap = commonOpt.queryRealtimeMap(deviceIdList_S);
// 筛选出S后缀里数据更新的设备,用于查今天的积算值
List<String> todayDeviceIds = new ArrayList<>(deviceIds);
for (DeviceTrendLogData data : resultList) {
String rawDeviceId = data.getDeviceId();
String sDeviceId = deviceId85ToSMap.get(rawDeviceId.toLowerCase());
DeviceRawdataRealtime sRealtime = realtimeSMap.get(sDeviceId);
if (sRealtime == null || sRealtime.getReceiveTs() == null) {
continue;
}
//sRealtime存在且有receive_ts时
Long uploadTs = data.getUploadTimestamp();
if (uploadTs == null || sRealtime.getReceiveTs() > uploadTs) {
todayDeviceIds.remove(rawDeviceId);
todayDeviceIds.add(sDeviceId);
}
}
LocalDateTime now = LocalDateTime.now(Constants.ZONE_TOKYO);
LocalDate today = now.toLocalDate();
LocalDate yesterday = today.minusDays(1);
LocalDate lastYear = DateUtil.getLastYearSameIsoWeekDay(today);
int targetSeconds = now.toLocalTime().toSecondOfDay();
// 批量查询增量数据并构建 Map
Map<String, DeviceIncrement> todayMap = dashboardRecordAccumulateMapperExt.selectTodayIncrement(todayDeviceIds, today.getYear(), today.getMonthValue(), today.getDayOfMonth())
.stream().collect(Collectors.toMap(di -> di.getDeviceId().toLowerCase(), Function.identity()));
// List<RecordAccumulateDto> yesterdayRecords = dashboardRecordAccumulateMapperExt.selectByDay(deviceIds, yesterday.getYear(), yesterday.getMonthValue(), yesterday.getDayOfMonth());
// Map<String, DeviceIncrement> yesterdayMap = commonOpt.toDeviceIncrementMap(yesterdayRecords, targetSeconds, "yesterday");
//
// List<RecordAccumulateDto> lastYearRecords = dashboardRecordAccumulateMapperExt.selectByDay(deviceIds, lastYear.getYear(), lastYear.getMonthValue(), lastYear.getDayOfMonth());
// Map<String, DeviceIncrement> lastYearMap = commonOpt.toDeviceIncrementMap(lastYearRecords, targetSeconds, "lastYear");
resultList.forEach(data -> {
String deviceId = data.getDeviceId().toLowerCase();
String sDeviceId = deviceId85ToSMap.get(deviceId);
//*** 填充今天/昨天/去年值 **//
// 今天值,要先看备用S设备,有S的话优先用这个
data.setCumulativeValue(CommonUtil.formatDecimal(
getIncrement(todayDeviceIds.contains(sDeviceId) ? todayMap.get(sDeviceId) : todayMap.get(deviceId), DeviceIncrement::getTodayIncrement),
data.getDashboardDecimalPlaces())
);
// data.setYesterdayValue(CommonUtil.formatDecimal(getIncrement(yesterdayMap.get(deviceId), DeviceIncrement::getYesterdayIncrement), data.getDashboardDecimalPlaces()));
// data.setLastYearValue(CommonUtil.formatDecimal(getIncrement(lastYearMap.get(deviceId), DeviceIncrement::getLastYearIncrement), data.getDashboardDecimalPlaces()));
//处理111状态映射
// data.setStatus111(commonOpt.buildStatus111(deviceId, deviceId85To111Map, deviceInfo111Map, realtime111Map, objectMapper));
data.setStatus111(commonOpt.buildRawFirstValue(deviceId, deviceId85To111Map, realtime111Map, objectMapper));
// favorited 判断
data.setCollected(favoritedDeviceIds.contains(deviceId) ? 1 : 0);
});
}
return resultList;
}
//统一处理 null 判断和转字符串
private String getIncrement(DeviceIncrement inc, Function<DeviceIncrement, Number> getter) {
if (inc == null || getter.apply(inc) == null) return null;
return getter.apply(inc).toString();
}
@Override
public SimpleDataResponse<List<LineData>> getLineData(Integer searchType, LineDataSearchParams lineDataSearchParams,
Long companyId, Long userId, Integer languageType) {
if (null == searchType) {
searchType = 2;//默认全部数据
}
List<LineData> lineDataList = commonOpt.getAccumulateLineData(companyId, searchType, lineDataSearchParams);
return SimpleDataResponse.success(lineDataList);
}
}
Loading…
Cancel
Save