diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportController.java new file mode 100644 index 0000000..e183cbe --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.DayReportvo.*; +import cn.iocoder.yudao.module.alert.dao.domain.DayReport; +import cn.iocoder.yudao.module.alert.dao.service.DayReportService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.List; +import java.util.stream.Collectors; + +@Tag(name = "日报") +@RestController +@RequestMapping("/alarm") +public class DayReportController { + private final DayReportService service; + + public DayReportController(DayReportService service) { + this.service = service; + } + @Operation(summary = "获取日报表数据") + @GetMapping("/daily-report") + public CommonResult> getDailyReport( + @RequestParam(required = false) String unit, + @RequestParam(required = false) String driverType, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date, + @RequestParam(defaultValue = "1") Integer pageNo, + @RequestParam(defaultValue = "10") Integer pageSize) { + + PageResult pageResult = service.getDailyAlarmData(unit, driverType, date, pageNo, pageSize); + List vos = pageResult.getList().stream() + .map(this::convertToVO) + .collect(Collectors.toList()); + return CommonResult.success(new PageResult<>(vos, pageResult.getTotal())); + } + + private AlarmDailyVO convertToVO(DayReport domain) { + AlarmDailyVO vo = new AlarmDailyVO(); + vo.setId(domain.getId()); + vo.setInstanceName(domain.getInstanceName()); + vo.setTotalAlarms(domain.getTotalAlarms()); + vo.setHourCounts(domain.getHourCounts()); + vo.setAlarmDuration(domain.getAlarmDuration()); + vo.setHasDetails(true); // 添加详情标识 + return vo; + } + + @Operation(summary = "获取报警详情") + @GetMapping("/details/{instanceId}") + public CommonResult> getDetails( + @PathVariable String instanceId, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { + + List details = service.getAlarmDetails(instanceId, date).stream() + .map(domain -> { + AlarmDetailVO vo = new AlarmDetailVO(); + vo.setTagname(domain.getTagname()); + vo.setAlarmcount(domain.getAlarmcount()); + vo.setAlarmtime(domain.getAlarmtime()); + return vo; + }) + .collect(Collectors.toList()); + return CommonResult.success(details); + } + + @Operation(summary = "获取光字牌报警详情") + @GetMapping("/gzp-details/{gzpName}") + public CommonResult> getGzpDetails( + @PathVariable String gzpName, + @RequestParam String instanceId, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { + + List details = service.getGzpAlarmDetails(gzpName, instanceId, date).stream() + .map(domain -> { + GzpAlarmDetailVO vo = new GzpAlarmDetailVO(); + vo.setGzpName(domain.getGzpName()); + vo.setStartTime(domain.getStartTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime()); + vo.setEndTime(domain.getEndTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime()); + vo.setDuration(domain.getExceedDuration()); + return vo; + }) + .collect(Collectors.toList()); + return CommonResult.success(details); + } +} \ No newline at end of file diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/AlarmDailyVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/AlarmDailyVO.java new file mode 100644 index 0000000..11437be --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/AlarmDailyVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.DayReportvo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.util.Map; + +@Data +@Schema(description = "报警日报表视图对象") +public class AlarmDailyVO { + @Schema(description = "实例ID", example = "mp_123456") + private String id; + + @Schema(description = "实例名称", example = "锅炉1号压力传感器") + private String instanceName; + + @Schema( description= "总报警次数", example = "42") + private Integer totalAlarms; + + @Schema(description = "各小时报警数量", example = "{\"hour_0\":10,\"hour_1\":20}") + private Map hourCounts; + + @Schema(description = "总报警时长(秒)", example = "8130") + private Long alarmDuration; + @Schema(description = "是否可查看详情", example = "true") + private Boolean hasDetails; + + +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/AlarmDetailVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/AlarmDetailVO.java new file mode 100644 index 0000000..f18dae0 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/AlarmDetailVO.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.DayReportvo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "报警详情视图对象") +public class AlarmDetailVO { + @Schema(description = "光字牌名称", example = "锅炉超压报警") + private String tagname; + + @Schema(description = "报警次数", example = "5") + private Integer alarmcount; + + @Schema(description = "报警时长(秒)", example = "1510") + private Long alarmtime; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/GzpAlarmDetailVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/GzpAlarmDetailVO.java new file mode 100644 index 0000000..03bcd19 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/DayReportvo/GzpAlarmDetailVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.DayReportvo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Schema(description = "光字牌详情视图对象") +public class GzpAlarmDetailVO { + + @Schema(description = "光字牌名称", example = "锅炉压力高报警") + private String gzpName; + + @Schema(description = "开始时间", example = "2023-08-01 10:15:30") + private LocalDateTime startTime; + + @Schema(description = "结束时间", example = "2023-08-01 10:25:45") + private LocalDateTime endTime; + + @Schema(description = "超限时长(秒)", example = "615") + private Long duration; +} \ No newline at end of file diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportController.java new file mode 100644 index 0000000..25b3d22 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportController.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.MonthReportvo.*; +import cn.iocoder.yudao.module.alert.dao.service.MonthReportService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; + +import java.time.YearMonth; +import java.util.List; +import java.util.stream.Collectors; + +@Tag(name = "管理后台 - 月报分析") +@RestController +@RequestMapping("/alarm") +public class MonthReportController { + + private final MonthReportService monthlyReportService; + + public MonthReportController(MonthReportService monthlyReportService) { + this.monthlyReportService = monthlyReportService; + } + + @Operation(summary = "获取月报表数据") + @GetMapping("/monthly-report") + public CommonResult> getMonthlyReport( + @RequestParam(required = false) String unit, + @RequestParam(required = false) String driverType, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM") YearMonth month, + @RequestParam(defaultValue = "1") Integer pageNo, + @RequestParam(defaultValue = "10") Integer pageSize) { + + PageResult result = monthlyReportService.getMonthlyAlarmData(unit, driverType, month, pageNo, pageSize); + return CommonResult.success(result); + } + + @Operation(summary = "获取报警详情") + @GetMapping("/monthly-details/{instanceId}") + public CommonResult> getMonthlyDetails( + @PathVariable String instanceId, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM") YearMonth month) { + + List details = monthlyReportService.getAlarmDetails(instanceId, month); + return CommonResult.success(details); + } + + @Operation(summary = "获取光字牌报警详情") + @GetMapping("/monthly-gzp-details/{gzpName}") + public CommonResult> getGzpMonthlyDetails( + @PathVariable String gzpName, + @RequestParam String instanceId, + @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM") YearMonth month) { + + List details = monthlyReportService.getGzpAlarmDetails(gzpName, instanceId, month); + return CommonResult.success(details); + } +} + + diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/AlarmDetailVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/AlarmDetailVO.java new file mode 100644 index 0000000..6cbafa5 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/AlarmDetailVO.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.MonthReportvo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "报警详情视图对象") +public class AlarmDetailVO { + + @Schema(description = "光字牌名称", example = "锅炉超压报警") + private String tagname; + + @Schema(description = "报警次数", example = "5") + private Integer alarmcount; + + @Schema(description = "报警时长(秒)", example = "1510") + private Long alarmtime; +} \ No newline at end of file diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/AlarmMonthlyVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/AlarmMonthlyVO.java new file mode 100644 index 0000000..6a73c20 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/AlarmMonthlyVO.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.MonthReportvo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.util.Map; + +@Data +@Schema(description = "报警月报表视图对象") +public class AlarmMonthlyVO { + + @Schema(description = "实例ID", example = "mp_123456") + private String id; + + @Schema(description = "实例名称", example = "锅炉1号压力传感器") + private String instanceName; + + @Schema(description = "总报警次数", example = "42") + private Integer totalAlarms; + + @Schema(description = "各天报警数量", example = "{\"day_1\":10,\"day_2\":20}") + private Map dayCounts; + + @Schema(description = "总报警时长(秒)", example = "8130") + private Long alarmDuration; + + @Schema(description = "是否可查看详情", example = "true") + private Boolean hasDetails; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/GzpAlarmDetailVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/GzpAlarmDetailVO.java new file mode 100644 index 0000000..371864d --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/MonthReportvo/GzpAlarmDetailVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.MonthReportvo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.time.LocalDateTime; + +@Data +@Schema(description = "光字牌详情视图对象") +public class GzpAlarmDetailVO { + + @Schema(description = "光字牌名称", example = "锅炉压力高报警") + private String gzpName; + + @Schema(description = "开始时间", example = "2023-08-01 10:15:30") + private LocalDateTime startTime; + + @Schema(description = "结束时间", example = "2023-08-01 10:25:45") + private LocalDateTime endTime; + + @Schema(description = "超限时长(秒)", example = "615") + private Long duration; +} \ No newline at end of file diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportController.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportController.java new file mode 100644 index 0000000..15c4df5 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportController.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.YearReportvo.*; +import cn.iocoder.yudao.module.alert.dao.domain.YearReport; +import cn.iocoder.yudao.module.alert.dao.service.YearReportService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.List; +import java.util.stream.Collectors; + +@Tag(name = "年报") +@RestController +@RequestMapping("/alarm") +public class YearReportController { + private final YearReportService service; + + public YearReportController(YearReportService service) { + this.service = service; + } + + @Operation(summary = "获取年报表数据") + @GetMapping("/yearly-report") + public CommonResult> getYearlyReport( + @RequestParam(required = false) String unit, + @RequestParam(required = false) String driverType, + @RequestParam(required = false) Integer year, + @RequestParam(defaultValue = "1") Integer pageNo, + @RequestParam(defaultValue = "10") Integer pageSize) { + + PageResult pageResult = service.getYearlyAlarmData(unit, driverType, year, pageNo, pageSize); + List vos = pageResult.getList().stream() + .map(this::convertToVO) + .collect(Collectors.toList()); + return CommonResult.success(new PageResult<>(vos, pageResult.getTotal())); + } + + private AlarmYearlyVO convertToVO(YearReport domain) { + AlarmYearlyVO vo = new AlarmYearlyVO(); + vo.setId(domain.getId()); + vo.setInstanceName(domain.getInstanceName()); + vo.setTotalAlarms(domain.getTotalAlarms()); + vo.setMonthCounts(domain.getMonthCounts()); + vo.setAlarmDuration(domain.getAlarmDuration()); + vo.setHasDetails(true); + return vo; + } + + @Operation(summary = "获取报警详情") + @GetMapping("/yearly-details/{instanceId}") + public CommonResult> getYearlyDetails( + @PathVariable String instanceId, + @RequestParam(required = false) Integer year) { + + List details = service.getAlarmDetails(instanceId, year).stream() + .map(domain -> { + AlarmDetailVO vo = new AlarmDetailVO(); + vo.setTagname(domain.getTagname()); + vo.setAlarmcount(domain.getAlarmcount()); + vo.setAlarmtime(domain.getAlarmtime()); + return vo; + }) + .collect(Collectors.toList()); + return CommonResult.success(details); + } + + @Operation(summary = "获取光字牌报警详情") + @GetMapping("/yearly-gzp-details/{gzpName}") + public CommonResult> getGzpYearlyDetails( + @PathVariable String gzpName, + @RequestParam String instanceId, + @RequestParam(required = false) Integer year) { + + List details = service.getGzpAlarmDetails(gzpName, instanceId, year).stream() + .map(domain -> { + GzpAlarmDetailVO vo = new GzpAlarmDetailVO(); + vo.setGzpName(domain.getGzpName()); + vo.setStartTime(domain.getStartTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime()); + vo.setEndTime(domain.getEndTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime()); + vo.setDuration(domain.getExceedDuration()); + return vo; + }) + .collect(Collectors.toList()); + return CommonResult.success(details); + } +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/AlarmDetailVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/AlarmDetailVO.java new file mode 100644 index 0000000..56cac6a --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/AlarmDetailVO.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.YearReportvo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "报警详情视图对象") +public class AlarmDetailVO { + + @Schema(description = "光字牌名称", example = "锅炉超压报警") + private String tagname; + + @Schema(description = "报警次数", example = "5") + private Integer alarmcount; + + @Schema(description = "报警时长(秒)", example = "1510") + private Long alarmtime; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/AlarmYearlyVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/AlarmYearlyVO.java new file mode 100644 index 0000000..3edf8ed --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/AlarmYearlyVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.YearReportvo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.util.Map; + +@Data +@Schema(description = "报警年报表视图对象") +public class AlarmYearlyVO { + @Schema(description = "实例ID", example = "mp_123456") + private String id; + + @Schema(description = "实例名称", example = "锅炉1号压力传感器") + private String instanceName; + + @Schema(description = "总报警次数", example = "42") + private Integer totalAlarms; + + @Schema(description = "各月报警数量", example = "{\"month_1\":10,\"month_2\":20}") + private Map monthCounts; + + @Schema(description = "总报警时长(秒)", example = "8130") + private Long alarmDuration; + + @Schema(description = "是否可查看详情", example = "true") + private Boolean hasDetails; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/GzpAlarmDetailVO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/GzpAlarmDetailVO.java new file mode 100644 index 0000000..beb7ea7 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/controller/admin/alarm/analysis/YearReportvo/GzpAlarmDetailVO.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.YearReportvo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.time.LocalDateTime; + +@Data +@Schema(description = "光字牌详情视图对象") +public class GzpAlarmDetailVO { + + @Schema(description = "光字牌名称", example = "锅炉压力高报警") + private String gzpName; + + @Schema(description = "开始时间", example = "2023-08-01 10:15:30") + private LocalDateTime startTime; + + @Schema(description = "结束时间", example = "2023-08-01 10:25:45") + private LocalDateTime endTime; + + @Schema(description = "超限时长(秒)", example = "615") + private Long duration; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/dayDO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/dayDO.java new file mode 100644 index 0000000..8b20117 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/dayDO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis; +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import java.util.Date; +@Data +public class dayDO { + private Long id; + private String warnId; + private Date startTime; + private Date endTime; + + @TableField("超限时长") + private Long exceedDuration; // 超限时长(秒) + + private String year; + + private Integer month; + private Integer day; + + private Integer hour; + private String timeFlag; + + private String mpId; + private String unitId; + + private String systemTypeName; + private String systemName; + private String systemTypeId; + private String systemId; + private String algorithmId; + private String modelId; + private String mpName; // 实例名称 + private String alarmTypeId; + + @TableField("UNIT") + private String unit; // 机组 + + private String alarmLevelName; + private String alarmModelRuleName; + private String pointId; + private String pointName; + private String modelOrRuleName; + private String warnStatus1; + private String pointOrModel; + private String gzpName; // 光字牌名称 + private Integer alarmCount; + @TableField("Algorithm_ShortName") + private String algorithmShortName; + @TableField("Confirmed") + private Boolean confirmed; + @TableField("SUGGESTION") + private String suggestion; + + private Date confirmTime; + private String modelName; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/monthDO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/monthDO.java new file mode 100644 index 0000000..74de4d6 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/monthDO.java @@ -0,0 +1,67 @@ +package cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import java.util.Date; + +@Data +@TableName("WARN_HISTORY_VIEW") +public class monthDO { + private Long id; + private String warnId; + private Date startTime; + private Date endTime; + + @TableField("超限时长") + private Long exceedDuration; + + private String year; + private Integer month; + private Integer day; + private Integer hour; + private String timeFlag; + + private String mpId; + private String unitId; + + private String systemTypeName; + private String systemName; + private String systemTypeId; + private String systemId; + private String algorithmId; + private String modelId; + + @TableField("mpName") + private String mpName; + + private String alarmTypeId; + + @TableField("UNIT") + private String unit; + + private String alarmLevelName; + private String alarmModelRuleName; + private String pointId; + private String pointName; + private String modelOrRuleName; + private String warnStatus1; + private String pointOrModel; + + @TableField("gzpName") + private String gzpName; + + private Integer alarmCount; + + @TableField("Algorithm_ShortName") + private String algorithmShortName; + + @TableField("Confirmed") + private Boolean confirmed; + + @TableField("SUGGESTION") + private String suggestion; + + private Date confirmTime; + private String modelName; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/yearDO.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/yearDO.java new file mode 100644 index 0000000..24056fc --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dal/dataobject/alarm/analysis/yearDO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.Data; +import java.util.Date; + +@Data +public class yearDO { + private Long id; + private String warnId; + private Date startTime; + private Date endTime; + + @TableField("超限时长") + private Long exceedDuration; // 超限时长(秒) + + private Integer year; + private Integer month; + private Integer day; + private Integer hour; + private String timeFlag; + + private String mpId; + private String unitId; + + private String systemTypeName; + private String systemName; + private String systemTypeId; + private String systemId; + private String algorithmId; + private String modelId; + private String mpName; // 实例名称 + private String alarmTypeId; + + @TableField("UNIT") + private String unit; // 机组 + + private String alarmLevelName; + private String alarmModelRuleName; + private String pointId; + private String pointName; + private String modelOrRuleName; + private String warnStatus1; + private String pointOrModel; + private String gzpName; // 光字牌名称 + private Integer alarmCount; + + @TableField("Algorithm_ShortName") + private String algorithmShortName; + + @TableField("Confirmed") + private Boolean confirmed; + + @TableField("SUGGESTION") + private String suggestion; + + private Date confirmTime; + private String modelName; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/DayReport.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/DayReport.java new file mode 100644 index 0000000..01a20a7 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/DayReport.java @@ -0,0 +1,16 @@ +package cn.iocoder.yudao.module.alert.dao.domain; +import lombok.Data; +import java.util.Map; +@Data +public class DayReport { + private String id; + private String instanceName; + private Integer totalAlarms; + private Long alarmDuration; + private Map hourCounts; + + // 详情用 + private String tagname; + private Integer alarmcount; + private Long alarmtime; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/MonthReport.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/MonthReport.java new file mode 100644 index 0000000..476793d --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/MonthReport.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.alert.dao.domain; + +import lombok.Data; +import java.util.Map; + +@Data +public class MonthReport { + private String id; + private String instanceName; + private Integer totalAlarms; + private Long alarmDuration; + private Map dayCounts; + + // 详情用字段 + private String tagname; + private Integer alarmcount; + private Long alarmtime; + + // 光字牌详情用字段 + private String gzpName; + private java.util.Date startTime; + private java.util.Date endTime; + private Long exceedDuration; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/YearReport.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/YearReport.java new file mode 100644 index 0000000..6e2aa7c --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/domain/YearReport.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.alert.dao.domain; + +import lombok.Data; +import java.util.Map; + +@Data +public class YearReport { + private String id; + private String instanceName; + private Integer totalAlarms; + private Long alarmDuration; + private Map monthCounts; + + // 详情用 + private String tagname; + private Integer alarmcount; + private Long alarmtime; +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/DayReportMapper.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/DayReportMapper.java new file mode 100644 index 0000000..51992b3 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/DayReportMapper.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.alert.dao.mapper; + +import cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis.dayDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface DayReportMapper extends BaseMapper { + + @Select("") + List selectByCondition( + @Param("unit") String unit, + @Param("driverType") String driverType, + @Param("date") String date); + + @Select("") + List selectDetailsByInstanceId( + @Param("instanceId") String instanceId, + @Param("date") String date); + + @Select("") + List selectGzpDetails( + @Param("gzpName") String gzpName, + @Param("instanceId") String instanceId, + @Param("date") String date); +} \ No newline at end of file diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/MonthReportMapper.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/MonthReportMapper.java new file mode 100644 index 0000000..f405d3c --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/MonthReportMapper.java @@ -0,0 +1,53 @@ +package cn.iocoder.yudao.module.alert.dao.mapper; + +import cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis.monthDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface MonthReportMapper extends BaseMapper{ + @Select("") + List selectByCondition( + @Param("unit") String unit, + @Param("driverType") String driverType, + @Param("year") Integer year, + @Param("month") Integer month); + + @Select("") + List selectDetailsByInstanceId( + @Param("instanceId") String instanceId, + @Param("year") Integer year, + @Param("month") Integer month); + + @Select("") + List selectGzpDetails( + @Param("gzpName") String gzpName, + @Param("instanceId") String instanceId, + @Param("year") Integer year, + @Param("month") Integer month); +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/YearReportMapper.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/YearReportMapper.java new file mode 100644 index 0000000..a9f2198 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/mapper/YearReportMapper.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.alert.dao.mapper; + +import cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis.yearDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface YearReportMapper extends BaseMapper { + + @Select("") + List selectByCondition( + @Param("unit") String unit, + @Param("driverType") String driverType, + @Param("year") Integer year); + + @Select("") + List selectDetailsByInstanceId( + @Param("instanceId") String instanceId, + @Param("year") Integer year); + + @Select("") + List selectGzpDetails( + @Param("gzpName") String gzpName, + @Param("instanceId") String instanceId, + @Param("year") Integer year); +} \ No newline at end of file diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/DayReportService.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/DayReportService.java new file mode 100644 index 0000000..d1f0fc0 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/DayReportService.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.alert.dao.service; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis.dayDO; +import cn.iocoder.yudao.module.alert.dao.domain.DayReport; +import java.time.LocalDate; +import java.util.List; + +public interface DayReportService { + /** + * 获取日报表数据(分页版本) + */ + PageResult getDailyAlarmData(String unit, String driverType, LocalDate date, int pageNo, int pageSize); + + /** + * 获取报警详情 + */ + List getAlarmDetails(String instanceId, LocalDate date); + /** + * @deprecated 使用分页版本 {@link #getDailyAlarmData(String, String, LocalDate, int, int)} 代替 + */ + @Deprecated + default List getDailyAlarmData(String unit, String driverType, String date) { + return getDailyAlarmData(unit, driverType, date != null ? LocalDate.parse(date) : null, 1, Integer.MAX_VALUE).getList(); + } + + /** + * 获取光字牌报警详情 + */ + List getGzpAlarmDetails(String gzpName, String instanceId, LocalDate date); +} \ No newline at end of file diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/MonthReportService.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/MonthReportService.java new file mode 100644 index 0000000..0ada841 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/MonthReportService.java @@ -0,0 +1,22 @@ +package cn.iocoder.yudao.module.alert.dao.service; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.MonthReportvo.*; +import java.time.YearMonth; +import java.util.List; +public interface MonthReportService { + /** + * 获取月报表数据 + */ + PageResult getMonthlyAlarmData(String unit, String driverType, YearMonth month, int pageNo, int pageSize); + + /** + * 获取报警详情 + */ + List getAlarmDetails(String instanceId, YearMonth month); + + /** + * 获取光字牌报警详情 + */ + List getGzpAlarmDetails(String gzpName, String instanceId, YearMonth month); +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/YearReportService.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/YearReportService.java new file mode 100644 index 0000000..337ed7b --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/YearReportService.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.alert.dao.service; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis.yearDO; +import cn.iocoder.yudao.module.alert.dao.domain.YearReport; +import java.util.List; + +public interface YearReportService { + /** + * 获取年报表数据(分页版本) + */ + PageResult getYearlyAlarmData(String unit, String driverType, Integer year, int pageNo, int pageSize); + + /** + * 获取报警详情 + */ + List getAlarmDetails(String instanceId, Integer year); + + /** + * 获取光字牌报警详情 + */ + List getGzpAlarmDetails(String gzpName, String instanceId, Integer year); +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/DayReportServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/DayReportServiceImpl.java new file mode 100644 index 0000000..4347855 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/DayReportServiceImpl.java @@ -0,0 +1,156 @@ +package cn.iocoder.yudao.module.alert.dao.service.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis.dayDO; +import cn.iocoder.yudao.module.alert.dao.domain.DayReport; +import cn.iocoder.yudao.module.alert.dao.mapper.DayReportMapper; +import cn.iocoder.yudao.module.alert.dao.service.DayReportService; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class DayReportServiceImpl implements DayReportService { + + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.BASIC_ISO_DATE; + + private final DayReportMapper dayReportMapper; + + public DayReportServiceImpl(DayReportMapper dayReportMapper) { + this.dayReportMapper = dayReportMapper; + } + + + @Override + public PageResult getDailyAlarmData(String unit, String driverType, LocalDate date, int pageNo, int pageSize) { + Page page = new Page<>(pageNo, pageSize); + String formattedDate = (date != null) ? date.format(DATE_FORMATTER) : null; + + List rawData = dayReportMapper.selectByCondition( unit, driverType, formattedDate); + if (CollectionUtils.isEmpty(rawData)) { + return new PageResult<>(Collections.emptyList(), 0L); + } + + // 动态计算 exceedDuration、year、month、day、hour + rawData.forEach(this::calculateDynamicFields); + + Map> groupByInstance = rawData.stream() + .collect(Collectors.groupingBy(dayDO::getMpName)); + + // 4. 获取所有 instanceName 并按分页截取 + List instanceNames = new ArrayList<>(groupByInstance.keySet()); + Long totalInstances = (long) instanceNames.size(); + + // 5. 计算分页范围 + int fromIndex = (pageNo - 1) * pageSize; + if (fromIndex >= totalInstances) { + return new PageResult<>(Collections.emptyList(), (long) totalInstances); + } + int toIndex = (int) Math.min(fromIndex + pageSize, totalInstances); + List pagedInstanceNames = instanceNames.subList(fromIndex, toIndex); + + // 6. 构建分页结果 + List result = pagedInstanceNames.stream() + .map(instanceName -> { + List instanceData = groupByInstance.get(instanceName); + return buildDayReport(instanceName, instanceData); + }) + .collect(Collectors.toList()); + + return new PageResult<>(result, (Long) totalInstances); + } + + @Override + public List getAlarmDetails(String instanceId, LocalDate date) { + // 1. 查询原始数据(按 instanceId + 日期) + List rawData = dayReportMapper.selectDetailsByInstanceId( + instanceId, + date != null ? date.format(DATE_FORMATTER) : null + ); + + if (CollectionUtils.isEmpty(rawData)) { + return Collections.emptyList(); + } + + // 2. 动态计算 exceedDuration + rawData.forEach(this::calculateDynamicFields); + + // 3. 按 GZP_NAME 分组 + Map> groupByGzp = rawData.stream() + .collect(Collectors.groupingBy(dayDO::getGzpName)); + + // 4. 构建返回结果 + List result = new ArrayList<>(groupByGzp.size()); + groupByGzp.forEach((gzpName, gzpData) -> { + DayReport domain = new DayReport(); + domain.setTagname(gzpName); + domain.setAlarmcount(gzpData.size()); + domain.setAlarmtime(gzpData.stream() + .mapToLong(item -> item.getExceedDuration() != null ? item.getExceedDuration() : 0L) + .sum()); + result.add(domain); + }); + + return result; + } + + @Override + public List getGzpAlarmDetails(String gzpName, String instanceId, LocalDate date) { + String formattedDate = (date != null) ? date.format(DATE_FORMATTER) : null; + List rawData = dayReportMapper.selectGzpDetails(gzpName, instanceId, formattedDate); + rawData.forEach(this::calculateDynamicFields); + return rawData; + } + /** + * 动态计算字段:exceedDuration、year、month、day、hour + */ + private void calculateDynamicFields(dayDO item) { + if (item.getStartTime() != null && item.getEndTime() != null) { + // 计算超限时长(秒) + long durationSeconds = Duration.between( + item.getStartTime().toInstant(), + item.getEndTime().toInstant() + ).getSeconds(); + item.setExceedDuration(durationSeconds); + + // 计算年、月、日、小时 + LocalDateTime localStart = item.getStartTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + item.setYear(String.valueOf(localStart.getYear())); + item.setMonth(localStart.getMonthValue()); + item.setDay(localStart.getDayOfMonth()); + item.setHour(localStart.getHour()); + + } + } + + private DayReport buildDayReport(String instanceName, List instanceData) { + DayReport domain = new DayReport(); + domain.setId(instanceData.get(0).getMpId()); + domain.setInstanceName(instanceName); + domain.setTotalAlarms(instanceData.size()); + domain.setAlarmDuration(instanceData.stream() + .mapToLong(item -> item.getExceedDuration() != null ? item.getExceedDuration() : 0) + .sum()); + domain.setHourCounts(calculateHourlyCounts(instanceData)); + return domain; + } + + private Map calculateHourlyCounts(List data) { + Map hourCounts = new HashMap<>(24); + for (int i = 0; i < 24; i++) { + final int hour = i; + hourCounts.put("hour_" + i, (int) data.stream() + .filter(item -> item.getHour() != null && item.getHour() == hour) + .count()); + + } + return hourCounts; + } +} \ No newline at end of file diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/MonthReportServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/MonthReportServiceImpl.java new file mode 100644 index 0000000..666e67c --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/MonthReportServiceImpl.java @@ -0,0 +1,169 @@ +package cn.iocoder.yudao.module.alert.dao.service.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.controller.admin.alarm.analysis.MonthReportvo.*; +import cn.iocoder.yudao.module.alert.dao.service.MonthReportService; +import cn.iocoder.yudao.module.alert.dao.mapper.MonthReportMapper; +import cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis.monthDO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.time.*; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class MonthReportServiceImpl implements MonthReportService { + private final MonthReportMapper monthlyReportMapper; + + public MonthReportServiceImpl(MonthReportMapper monthlyReportMapper) { + this.monthlyReportMapper = monthlyReportMapper; + } + + @Override + public PageResult getMonthlyAlarmData(String unit, String driverType, YearMonth month, int pageNo, int pageSize) { + + Integer year = month != null ? month.getYear() : null; + Integer monthValue = month != null ? month.getMonthValue() : null; + List rawData = monthlyReportMapper.selectByCondition(unit, driverType, year, monthValue); + if (CollectionUtils.isEmpty(rawData)) { + return new PageResult<>(Collections.emptyList(), 0L); + } + // 动态计算字段 + rawData.forEach(this::calculateDynamicFields); + + // 按实例名称分组 + Map> groupByInstance = rawData.stream() + .collect(Collectors.groupingBy(monthDO::getMpName)); + + List instanceNames = new ArrayList<>(groupByInstance.keySet()); + Long totalInstances = (long) instanceNames.size(); + + // 分页处理 + int fromIndex = (pageNo - 1) * pageSize; + if (fromIndex >= totalInstances) { + return new PageResult<>(Collections.emptyList(), totalInstances); + } + int toIndex = (int) Math.min(fromIndex + pageSize, totalInstances); + List pagedInstanceNames = instanceNames.subList(fromIndex, toIndex); + // 构建结果 + List result = pagedInstanceNames.stream() + .map(instanceName -> { + List instanceData = groupByInstance.get(instanceName); + return buildMonthlyVO(instanceName, instanceData, month); + }) + .collect(Collectors.toList()); + + return new PageResult<>(result, totalInstances); + } + + @Override + public List getAlarmDetails(String instanceId, YearMonth month) { + Integer year = month != null ? month.getYear() : null; + Integer monthValue = month != null ? month.getMonthValue() : null; + + List rawData = monthlyReportMapper.selectDetailsByInstanceId(instanceId, year, monthValue); + if (CollectionUtils.isEmpty(rawData)) { + return Collections.emptyList(); + } + + for (monthDO rawDatum : rawData) { + calculateDynamicFields(rawDatum); + } + + // 按光字牌名称分组 + Map> groupByGzp = rawData.stream() + .collect(Collectors.groupingBy(monthDO::getGzpName)); + + List result = new ArrayList<>(); + groupByGzp.forEach((gzpName, gzpData) -> { + AlarmDetailVO vo = new AlarmDetailVO(); + vo.setTagname(gzpName); + vo.setAlarmcount(gzpData.size()); + vo.setAlarmtime(gzpData.stream() + .mapToLong(item -> item.getExceedDuration() != null ? item.getExceedDuration() : 0L) + .sum()); + result.add(vo); + }); + + return result; + } + + @Override + public List getGzpAlarmDetails(String gzpName, String instanceId, YearMonth month) { + Integer year = month != null ? month.getYear() : null; + Integer monthValue = month != null ? month.getMonthValue() : null; + + List rawData = monthlyReportMapper.selectGzpDetails(gzpName, instanceId, year, monthValue); + if (CollectionUtils.isEmpty(rawData)) { + return Collections.emptyList(); + } + + rawData.forEach(this::calculateDynamicFields); + + return rawData.stream() + .map(this::convertToGzpDetailVO) + .collect(Collectors.toList()); + } + + private void calculateDynamicFields(monthDO item) { + if (item.getStartTime() != null && item.getEndTime() != null) { + // 计算超限时长(秒) + long durationSeconds = Duration.between( + item.getStartTime().toInstant(), + item.getEndTime().toInstant() + ).getSeconds(); + item.setExceedDuration(durationSeconds); + + // 计算年、月、日 + LocalDateTime localStart = item.getStartTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + item.setYear(String.valueOf(localStart.getYear())); + item.setMonth(localStart.getMonthValue()); + item.setDay(localStart.getDayOfMonth()); + item.setHour(localStart.getHour()); + } + } + + private AlarmMonthlyVO buildMonthlyVO(String instanceName, List instanceData, YearMonth month) { + AlarmMonthlyVO vo = new AlarmMonthlyVO(); + vo.setId(instanceData.get(0).getMpId()); + vo.setInstanceName(instanceName); + vo.setTotalAlarms(instanceData.size()); + vo.setAlarmDuration(instanceData.stream() + .mapToLong(item -> item.getExceedDuration() != null ? item.getExceedDuration() : 0L) + .sum()); + vo.setDayCounts(calculateDailyCounts(instanceData, month)); + vo.setHasDetails(true); + return vo; + } + + private Map calculateDailyCounts(List data, YearMonth month) { + int daysInMonth = month != null ? month.lengthOfMonth() : YearMonth.now().lengthOfMonth(); + Map dayCounts = new HashMap<>(daysInMonth); + + for (int day = 1; day <= daysInMonth; day++) { + final int targetDay = day; + long count = data.stream() + .filter(item -> item.getDay() != null && item.getDay() == targetDay) + .count(); + dayCounts.put("day_" + day, (int) count); + } + return dayCounts; + } + private GzpAlarmDetailVO convertToGzpDetailVO(monthDO domain) { + GzpAlarmDetailVO vo = new GzpAlarmDetailVO(); + vo.setGzpName(domain.getGzpName()); + vo.setStartTime(domain.getStartTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime()); + vo.setEndTime(domain.getEndTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime()); + vo.setDuration(domain.getExceedDuration()); + return vo; + } +} diff --git a/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/YearReportServiceImpl.java b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/YearReportServiceImpl.java new file mode 100644 index 0000000..963e826 --- /dev/null +++ b/yudao-module-alert/yudao-module-alert-biz/src/main/java/cn/iocoder/yudao/module/alert/dao/service/impl/YearReportServiceImpl.java @@ -0,0 +1,133 @@ +package cn.iocoder.yudao.module.alert.dao.service.impl; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.alert.dao.domain.YearReport; +import cn.iocoder.yudao.module.alert.dao.mapper.YearReportMapper; +import cn.iocoder.yudao.module.alert.dao.service.YearReportService; +import cn.iocoder.yudao.module.alert.dal.dataobject.alarm.analysis.yearDO; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class YearReportServiceImpl implements YearReportService { + + private final YearReportMapper yearReportMapper; + + public YearReportServiceImpl(YearReportMapper yearReportMapper) { + this.yearReportMapper = yearReportMapper; + } + + @Override + public PageResult getYearlyAlarmData(String unit, String driverType, Integer year, int pageNo, int pageSize) { + System.out.printf("查询参数 - unit: %s, driverType: %s, year: %d, pageNo: {}, pageSize: {}", + unit, driverType, year, pageNo, pageSize); + + List rawData = yearReportMapper.selectByCondition(unit, driverType, year); + if (CollectionUtils.isEmpty(rawData)) { + return new PageResult<>(Collections.emptyList(), 0L); + } + + rawData.forEach(this::calculateDynamicFields); + + Map> groupByInstance = rawData.stream() + .collect(Collectors.groupingBy(yearDO::getMpName)); + + List instanceNames = new ArrayList<>(groupByInstance.keySet()); + Long totalInstances = (long) instanceNames.size(); + + int fromIndex = (pageNo - 1) * pageSize; + if (fromIndex >= totalInstances) { + return new PageResult<>(Collections.emptyList(), totalInstances); + } + int toIndex = (int) Math.min(fromIndex + pageSize, totalInstances); + List pagedInstanceNames = instanceNames.subList(fromIndex, toIndex); + + List result = pagedInstanceNames.stream() + .map(instanceName -> { + List instanceData = groupByInstance.get(instanceName); + return buildYearReport(instanceName, instanceData); + }) + .collect(Collectors.toList()); + + return new PageResult<>(result, totalInstances); + } + + private void calculateDynamicFields(yearDO item) { + if (item.getStartTime() != null && item.getEndTime() != null) { + long durationSeconds = Duration.between( + item.getStartTime().toInstant(), + item.getEndTime().toInstant() + ).getSeconds(); + item.setExceedDuration(durationSeconds); + + LocalDateTime localStart = item.getStartTime().toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime(); + item.setYear(localStart.getYear()); + item.setMonth(localStart.getMonthValue()); + } + } + + private YearReport buildYearReport(String instanceName, List instanceData) { + YearReport domain = new YearReport(); + domain.setId(instanceData.get(0).getMpId()); + domain.setInstanceName(instanceName); + domain.setTotalAlarms(instanceData.size()); + domain.setAlarmDuration(instanceData.stream() + .mapToLong(item -> item.getExceedDuration() != null ? item.getExceedDuration() : 0) + .sum()); + domain.setMonthCounts(calculateMonthlyCounts(instanceData)); + return domain; + } + + private Map calculateMonthlyCounts(List data) { + Map monthCounts = new HashMap<>(12); + for (int i = 1; i <= 12; i++) { + final int month = i; + monthCounts.put("month_" + i, (int) data.stream() + .filter(item -> item.getMonth() != null && item.getMonth() == month) + .count()); + } + return monthCounts; + } + + @Override + public List getAlarmDetails(String instanceId, Integer year) { + List rawData = yearReportMapper.selectDetailsByInstanceId(instanceId, year); + + if (CollectionUtils.isEmpty(rawData)) { + return Collections.emptyList(); + } + + rawData.forEach(this::calculateDynamicFields); + + Map> groupByGzp = rawData.stream() + .collect(Collectors.groupingBy(yearDO::getGzpName)); + + List result = new ArrayList<>(groupByGzp.size()); + groupByGzp.forEach((gzpName, gzpData) -> { + YearReport domain = new YearReport(); + domain.setTagname(gzpName); + domain.setAlarmcount(gzpData.size()); + domain.setAlarmtime(gzpData.stream() + .mapToLong(item -> item.getExceedDuration() != null ? item.getExceedDuration() : 0L) + .sum()); + result.add(domain); + }); + + return result; + } + + @Override + public List getGzpAlarmDetails(String gzpName, String instanceId, Integer year) { + List rawData = yearReportMapper.selectGzpDetails(gzpName, instanceId, year); + rawData.forEach(this::calculateDynamicFields); + return rawData; + } +}