From 768698d2e0224a87756bf167aea6239480f447ec Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Thu, 2 Apr 2026 14:47:15 +0800 Subject: [PATCH] TrendLog --- .../dashboard/back/common/Constants.java | 5 +- .../resources/config/language/msg/msg_cn.yml | 2 + .../resources/config/language/msg/msg_en.yml | 2 + .../resources/config/language/msg/msg_jp.yml | 2 + .../DeviceDataBaStatusController.java | 2 +- .../DeviceDataMeasureController.java | 2 +- .../DeviceDataTrendLogController.java | 181 ++++++++++++++++ .../back/dao/ex/DeviceInfoMapperExt.java | 14 +- .../mappers/ex/DeviceInfoMapperExt.xml | 37 ++++ .../dto/data/TrendLogDataSearchParam.java | 12 ++ .../ExportDeviceTrendLogDataDTO.java | 45 ++++ .../back/vo/data/DeviceTrendLogData.java | 20 ++ .../service/DeviceDataTrendLogService.java | 22 ++ .../impl/DeviceDataTrendLogServiceImpl.java | 199 ++++++++++++++++++ 14 files changed, 534 insertions(+), 11 deletions(-) create mode 100644 dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataTrendLogController.java create mode 100644 dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/data/TrendLogDataSearchParam.java create mode 100644 dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceTrendLogDataDTO.java create mode 100644 dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/DeviceTrendLogData.java create mode 100644 dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataTrendLogService.java create mode 100644 dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataTrendLogServiceImpl.java diff --git a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java index a6d422b..0deb07a 100644 --- a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java +++ b/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 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 ids : CATEGORY_MAP.values()) { ALL_CATEGORY_IDS.addAll(ids); diff --git a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml index 22c728b..cfa9e93 100644 --- a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml +++ b/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数据 diff --git a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml index 77aab0c..8d3949e 100644 --- a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml +++ b/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 diff --git a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml index 081a5ba..cb83073 100644 --- a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml +++ b/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 diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java index 9b55b85..2eb9e23 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java +++ b/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; diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java index 429ed4b..d8cc314 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java +++ b/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; diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataTrendLogController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataTrendLogController.java new file mode 100644 index 0000000..1f8f79b --- /dev/null +++ b/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> 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> pageResponse = new PageResponse>(); + 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> 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 pageData = deviceDataTrendLogService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List 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> 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); + } + +} diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java index a3ab5be..f4ab590 100644 --- a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java +++ b/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 getDevice4AlarmDataByGroup(AlarmDataSearchParam pageSearchParam); List selectAlertingDeviceIds(@Param("deviceIds") List deviceIds); + + List getDevice4TrendLogData(TrendLogDataSearchParam pageSearchParam); + + List getDevice4TrendLogDataByGroup(TrendLogDataSearchParam pageSearchParam); } diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml index f3c4fc5..5d15e1f 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceInfoMapperExt.xml @@ -429,6 +429,43 @@ + + + + +