liding
2026-06-02 c0ce5324f128a09e2cd42eece8c3120acea20830
feat(alarm): 添加报警分析评估和数据采集优化功能模块

- 实现报警分析控制器和业务逻辑服务
- 添加报警统计、实时列表、确认和分析功能
- 实现数据采集接口管理和状态控制
- 添加滋扰报警策略配置和优化统计
- 实现报警剔除审批流程管理
- 完善报警点位和接口数据模型
- 集成故障诊断和趋势分析功能
已添加39个文件
1779 ■■■■■ 文件已修改
src/main/java/com/ruoyi/alarm/controller/AlarmAnalysisController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/controller/AlarmCollectionController.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/controller/AlarmOptimizationController.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/controller/AlarmPointController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/controller/AlarmPointLedgerController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/dto/AlarmCollectionInterfaceDto.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/dto/AlarmNuisanceStrategyDto.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/dto/AlarmPointDto.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/dto/AlarmRemoveApprovalDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/mapper/AlarmCollectionInterfaceMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/mapper/AlarmNuisanceStrategyMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/mapper/AlarmPointMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/mapper/AlarmRealtimeMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/mapper/AlarmRemoveApprovalMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/pojo/AlarmCollectionInterface.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/pojo/AlarmNuisanceStrategy.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/pojo/AlarmPoint.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/pojo/AlarmRealtime.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/pojo/AlarmRemoveApproval.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/service/IAlarmAnalysisService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/service/IAlarmCollectionService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/service/IAlarmOptimizationService.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/service/impl/AlarmAnalysisServiceImpl.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/service/impl/AlarmCollectionServiceImpl.java 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/service/impl/AlarmOptimizationServiceImpl.java 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmAnalysisVo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmCollectionInterfaceVo.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmCompareVo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmFaultDiagnosisVo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmHighFreqPointVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmNuisanceStrategyVo.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmOptimizationStatisticsVo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmPointLedgerVo.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmRealtimeVo.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmRemoveApprovalVo.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmStatisticsVo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmStepVo.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmTrendVo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/vo/AlarmTypeDistributionVo.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/alarm/controller/AlarmAnalysisController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.alarm.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.alarm.service.IAlarmAnalysisService;
import com.ruoyi.alarm.vo.*;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Api(tags = "报警分析评估模块")
@RestController
@AllArgsConstructor
@RequestMapping("/alarm/analysis")
public class AlarmAnalysisController extends BaseController {
    private IAlarmAnalysisService alarmAnalysisService;
    @ApiOperation("实时报警统计")
    @GetMapping("/realtime/stats")
    public AjaxResult getRealtimeStats() {
        Map<String, Object> data = alarmAnalysisService.getRealtimeStats();
        return AjaxResult.success(data);
    }
    @ApiOperation("实时报警列表")
    @GetMapping("/realtime/list")
    public AjaxResult getRealtimeList(Page page) {
        IPage<AlarmRealtimeVo> result = alarmAnalysisService.getRealtimeList(page);
        return AjaxResult.success(result);
    }
    @ApiOperation("确认报警")
    @Log(title = "报警确认", businessType = BusinessType.UPDATE)
    @PostMapping("/confirm/{alarmId}")
    public AjaxResult confirmAlarm(@PathVariable Long alarmId) {
        return toAjax(alarmAnalysisService.confirmAlarm(alarmId));
    }
    @ApiOperation("分析报警")
    @GetMapping("/analyze/{alarmId}")
    public AjaxResult analyzeAlarm(@PathVariable Long alarmId) {
        AlarmAnalysisVo data = alarmAnalysisService.analyzeAlarm(alarmId);
        return AjaxResult.success(data);
    }
    @ApiOperation("报警趋势数据")
    @GetMapping("/trend")
    public AjaxResult getTrendData(@RequestParam(required = false) String startDate,
                                    @RequestParam(required = false) String endDate) {
        AlarmTrendVo data = alarmAnalysisService.getTrendData(startDate, endDate);
        return AjaxResult.success(data);
    }
    @ApiOperation("报警类型分布")
    @GetMapping("/type/distribution")
    public AjaxResult getTypeDistribution() {
        List<AlarmTypeDistributionVo> data = alarmAnalysisService.getTypeDistribution();
        return AjaxResult.success(data);
    }
    @ApiOperation("故障诊断列表")
    @GetMapping("/fault/list")
    public AjaxResult getFaultList() {
        List<AlarmFaultDiagnosisVo> data = alarmAnalysisService.getFaultList();
        return AjaxResult.success(data);
    }
}
src/main/java/com/ruoyi/alarm/controller/AlarmCollectionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.alarm.controller;
import com.ruoyi.alarm.dto.AlarmCollectionInterfaceDto;
import com.ruoyi.alarm.service.IAlarmCollectionService;
import com.ruoyi.alarm.vo.AlarmCollectionInterfaceVo;
import com.ruoyi.alarm.vo.AlarmStatisticsVo;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "数据采集与解析模块")
@RestController
@AllArgsConstructor
@RequestMapping("/alarm/collection")
public class AlarmCollectionController extends BaseController {
    private IAlarmCollectionService alarmCollectionService;
    @ApiOperation("采集统计概览")
    @GetMapping("/statistics")
    public AjaxResult getStatistics() {
        AlarmStatisticsVo data = alarmCollectionService.getStatistics();
        return AjaxResult.success(data);
    }
    @ApiOperation("数据采集接口列表")
    @GetMapping("/interface/list")
    public AjaxResult getInterfaceList() {
        List<AlarmCollectionInterfaceVo> data = alarmCollectionService.getInterfaceList();
        return AjaxResult.success(data);
    }
    @ApiOperation("启动数据采集")
    @Log(title = "数据采集接口", businessType = BusinessType.UPDATE)
    @PostMapping("/interface/start/{interfaceId}")
    public AjaxResult startInterface(@PathVariable Long interfaceId) {
        return toAjax(alarmCollectionService.startInterface(interfaceId));
    }
    @ApiOperation("停止数据采集")
    @Log(title = "数据采集接口", businessType = BusinessType.UPDATE)
    @PostMapping("/interface/stop/{interfaceId}")
    public AjaxResult stopInterface(@PathVariable Long interfaceId) {
        return toAjax(alarmCollectionService.stopInterface(interfaceId));
    }
    @ApiOperation("新增或修改数据采集接口")
    @PostMapping("/interface")
    public AjaxResult addOrUpdateInterface(@Validated @RequestBody AlarmCollectionInterfaceDto dto) {
        return toAjax(alarmCollectionService.addOrUpdateInterface(dto));
    }
    @ApiOperation("删除数据采集接口")
    @Log(title = "数据采集接口", businessType = BusinessType.DELETE)
    @DeleteMapping("/interface/{interfaceId}")
    public AjaxResult deleteInterface(@PathVariable Long interfaceId) {
        return toAjax(alarmCollectionService.deleteInterface(interfaceId));
    }
}
src/main/java/com/ruoyi/alarm/controller/AlarmOptimizationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,112 @@
package com.ruoyi.alarm.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.alarm.dto.AlarmNuisanceStrategyDto;
import com.ruoyi.alarm.dto.AlarmRemoveApprovalDto;
import com.ruoyi.alarm.service.IAlarmOptimizationService;
import com.ruoyi.alarm.vo.*;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "报警优化管理模块")
@RestController
@AllArgsConstructor
@RequestMapping("/alarm/optimization")
public class AlarmOptimizationController extends BaseController {
    private IAlarmOptimizationService alarmOptimizationService;
    @ApiOperation("优化效果统计")
    @GetMapping("/statistics")
    public AjaxResult getStatistics() {
        AlarmOptimizationStatisticsVo data = alarmOptimizationService.getStatistics();
        return AjaxResult.success(data);
    }
    @ApiOperation("滋扰报警策略列表")
    @GetMapping("/strategy/list")
    public AjaxResult getStrategyList() {
        List<AlarmNuisanceStrategyVo> data = alarmOptimizationService.getStrategyList();
        return AjaxResult.success(data);
    }
    @ApiOperation("新增滋扰报警策略")
    @Log(title = "滋扰报警策略", businessType = BusinessType.INSERT)
    @PostMapping("/strategy")
    public AjaxResult addStrategy(@Validated @RequestBody AlarmNuisanceStrategyDto dto) {
        return toAjax(alarmOptimizationService.addStrategy(dto));
    }
    @ApiOperation("修改滋扰报警策略")
    @Log(title = "滋扰报警策略", businessType = BusinessType.UPDATE)
    @PutMapping("/strategy")
    public AjaxResult updateStrategy(@Validated @RequestBody AlarmNuisanceStrategyDto dto) {
        return toAjax(alarmOptimizationService.updateStrategy(dto));
    }
    @ApiOperation("删除滋扰报警策略")
    @Log(title = "滋扰报警策略", businessType = BusinessType.DELETE)
    @DeleteMapping("/strategy/{strategyId}")
    public AjaxResult deleteStrategy(@PathVariable Long strategyId) {
        return toAjax(alarmOptimizationService.deleteStrategy(strategyId));
    }
    @ApiOperation("修改策略状态")
    @Log(title = "滋扰报警策略", businessType = BusinessType.UPDATE)
    @PutMapping("/strategy/changeStatus")
    public AjaxResult changeStrategyStatus(@RequestParam Long strategyId, @RequestParam Integer status) {
        return toAjax(alarmOptimizationService.changeStrategyStatus(strategyId, status));
    }
    @ApiOperation("治理前后对比数据")
    @GetMapping("/compare")
    public AjaxResult getCompareData() {
        AlarmCompareVo data = alarmOptimizationService.getCompareData();
        return AjaxResult.success(data);
    }
    @ApiOperation("高频报警点位列表")
    @GetMapping("/highfreq/list")
    public AjaxResult getHighFreqList(@RequestParam(required = false, defaultValue = "5") Integer limit) {
        List<AlarmHighFreqPointVo> data = alarmOptimizationService.getHighFreqList(limit);
        return AjaxResult.success(data);
    }
    @ApiOperation("报警剔除审批列表")
    @GetMapping("/approval/list")
    public AjaxResult getApprovalList(Page page, @RequestParam(required = false) String status) {
        IPage<AlarmRemoveApprovalVo> result = alarmOptimizationService.getApprovalList(page, status);
        return AjaxResult.success(result);
    }
    @ApiOperation("提交剔除申请")
    @Log(title = "报警剔除申请", businessType = BusinessType.INSERT)
    @PostMapping("/approval")
    public AjaxResult submitApproval(@Validated @RequestBody AlarmRemoveApprovalDto dto) {
        return toAjax(alarmOptimizationService.submitApproval(dto));
    }
    @ApiOperation("审批通过")
    @Log(title = "报警剔除审批", businessType = BusinessType.UPDATE)
    @PostMapping("/approval/approve/{applyNo}")
    public AjaxResult approveApproval(@PathVariable String applyNo) {
        return toAjax(alarmOptimizationService.approveApproval(applyNo));
    }
    @ApiOperation("审批驳回")
    @Log(title = "报警剔除审批", businessType = BusinessType.UPDATE)
    @PostMapping("/approval/reject/{applyNo}")
    public AjaxResult rejectApproval(@PathVariable String applyNo) {
        return toAjax(alarmOptimizationService.rejectApproval(applyNo));
    }
}
src/main/java/com/ruoyi/alarm/controller/AlarmPointController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.alarm.controller;
import com.ruoyi.alarm.service.IAlarmCollectionService;
import com.ruoyi.alarm.vo.AlarmPointLedgerVo;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(tags = "报警点位选项")
@RestController
@AllArgsConstructor
@RequestMapping("/alarm/optimization/point")
public class AlarmPointController extends BaseController {
    private IAlarmCollectionService alarmCollectionService;
    @ApiOperation("报警点位选项")
    @GetMapping("/options")
    public AjaxResult getPointOptions() {
        List<AlarmPointLedgerVo> data = alarmCollectionService.getPointOptions();
        return AjaxResult.success(data);
    }
}
src/main/java/com/ruoyi/alarm/controller/AlarmPointLedgerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.alarm.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.alarm.dto.AlarmPointDto;
import com.ruoyi.alarm.service.IAlarmCollectionService;
import com.ruoyi.alarm.vo.AlarmPointLedgerVo;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Api(tags = "报警点位台账管理")
@RestController
@AllArgsConstructor
@RequestMapping("/alarm/point/ledger")
public class AlarmPointLedgerController extends BaseController {
    private IAlarmCollectionService alarmCollectionService;
    @ApiOperation("报警点位台账列表")
    @GetMapping("/list")
    public AjaxResult getPointLedgerList(Page page, AlarmPointDto dto) {
        IPage<AlarmPointLedgerVo> result = alarmCollectionService.getPointLedgerList(page, dto);
        return AjaxResult.success(result);
    }
    @ApiOperation("新增报警点位")
    @Log(title = "报警点位", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult addPoint(@Validated @RequestBody AlarmPointDto dto) {
        return toAjax(alarmCollectionService.addPoint(dto));
    }
    @ApiOperation("修改报警点位")
    @Log(title = "报警点位", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult updatePoint(@Validated @RequestBody AlarmPointDto dto) {
        return toAjax(alarmCollectionService.updatePoint(dto));
    }
    @ApiOperation("删除报警点位")
    @Log(title = "报警点位", businessType = BusinessType.DELETE)
    @DeleteMapping("/{pointId}")
    public AjaxResult deletePoint(@PathVariable Long pointId) {
        return toAjax(alarmCollectionService.deletePoint(pointId));
    }
    @ApiOperation("修改点位状态")
    @Log(title = "报警点位", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changePointStatus(@RequestParam Long pointId, @RequestParam Integer status) {
        return toAjax(alarmCollectionService.changePointStatus(pointId, status));
    }
    @ApiOperation("导出台账数据")
    @GetMapping("/export")
    public AjaxResult exportPointLedger(AlarmPointDto dto) {
        return AjaxResult.success("导出功能待实现");
    }
}
src/main/java/com/ruoyi/alarm/dto/AlarmCollectionInterfaceDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.alarm.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class AlarmCollectionInterfaceDto {
    @ApiModelProperty(value = "接口ID")
    private Long interfaceId;
    @ApiModelProperty(value = "接口名称")
    @NotBlank(message = "接口名称不能为空")
    private String interfaceName;
    @ApiModelProperty(value = "接口类型")
    @NotBlank(message = "接口类型不能为空")
    private String interfaceType;
    @ApiModelProperty(value = "服务器地址")
    @NotBlank(message = "服务器地址不能为空")
    private String serverAddress;
    @ApiModelProperty(value = "采集频率")
    @NotBlank(message = "采集频率不能为空")
    private String collectFreq;
    @ApiModelProperty(value = "连接状态")
    private String connectStatus;
}
src/main/java/com/ruoyi/alarm/dto/AlarmNuisanceStrategyDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.ruoyi.alarm.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class AlarmNuisanceStrategyDto {
    @ApiModelProperty(value = "策略ID")
    private Long strategyId;
    @ApiModelProperty(value = "策略名称")
    @NotBlank(message = "策略名称不能为空")
    private String strategyName;
    @ApiModelProperty(value = "策略类型")
    @NotBlank(message = "策略类型不能为空")
    private String strategyType;
    @ApiModelProperty(value = "策略说明")
    @NotBlank(message = "策略说明不能为空")
    private String description;
    @ApiModelProperty(value = "规则配置JSON")
    private String ruleConfig;
    @ApiModelProperty(value = "状态(1启用/0停用)")
    @NotNull(message = "状态不能为空")
    private Integer status;
}
src/main/java/com/ruoyi/alarm/dto/AlarmPointDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.alarm.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class AlarmPointDto {
    @ApiModelProperty(value = "点位ID")
    private Long pointId;
    @ApiModelProperty(value = "点位编码")
    @NotBlank(message = "点位编码不能为空")
    private String pointCode;
    @ApiModelProperty(value = "点位名称")
    @NotBlank(message = "点位名称不能为空")
    private String pointName;
    @ApiModelProperty(value = "设备类型")
    @NotBlank(message = "设备类型不能为空")
    private String deviceType;
    @ApiModelProperty(value = "报警级别")
    @NotBlank(message = "报警级别不能为空")
    private String alarmLevel;
    @ApiModelProperty(value = "报警阈值")
    @NotBlank(message = "报警阈值不能为空")
    private String thresholdValue;
    @ApiModelProperty(value = "所属区域")
    private String area;
    @ApiModelProperty(value = "状态(1启用/0停用)")
    @NotNull(message = "状态不能为空")
    private Integer status;
}
src/main/java/com/ruoyi/alarm/dto/AlarmRemoveApprovalDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.alarm.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class AlarmRemoveApprovalDto {
    @ApiModelProperty(value = "点位ID")
    @NotNull(message = "点位ID不能为空")
    private Long pointId;
    @ApiModelProperty(value = "剔除原因")
    @NotBlank(message = "剔除原因不能为空")
    private String removeReason;
    @ApiModelProperty(value = "详细说明")
    @NotBlank(message = "详细说明不能为空")
    private String description;
}
src/main/java/com/ruoyi/alarm/mapper/AlarmCollectionInterfaceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.alarm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.alarm.pojo.AlarmCollectionInterface;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AlarmCollectionInterfaceMapper extends BaseMapper<AlarmCollectionInterface> {
}
src/main/java/com/ruoyi/alarm/mapper/AlarmNuisanceStrategyMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.alarm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.alarm.pojo.AlarmNuisanceStrategy;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AlarmNuisanceStrategyMapper extends BaseMapper<AlarmNuisanceStrategy> {
}
src/main/java/com/ruoyi/alarm/mapper/AlarmPointMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.alarm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.alarm.pojo.AlarmPoint;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AlarmPointMapper extends BaseMapper<AlarmPoint> {
}
src/main/java/com/ruoyi/alarm/mapper/AlarmRealtimeMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.alarm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.alarm.pojo.AlarmRealtime;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AlarmRealtimeMapper extends BaseMapper<AlarmRealtime> {
}
src/main/java/com/ruoyi/alarm/mapper/AlarmRemoveApprovalMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.alarm.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.alarm.pojo.AlarmRemoveApproval;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AlarmRemoveApprovalMapper extends BaseMapper<AlarmRemoveApproval> {
}
src/main/java/com/ruoyi/alarm/pojo/AlarmCollectionInterface.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.ruoyi.alarm.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("alarm_collection_interface")
public class AlarmCollectionInterface implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "接口ID")
    @TableId(type = IdType.AUTO)
    private Long interfaceId;
    @ApiModelProperty(value = "接口名称")
    private String interfaceName;
    @ApiModelProperty(value = "接口类型")
    private String interfaceType;
    @ApiModelProperty(value = "服务器地址")
    private String serverAddress;
    @ApiModelProperty(value = "采集频率")
    private String collectFreq;
    @ApiModelProperty(value = "连接状态")
    private String connectStatus;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/alarm/pojo/AlarmNuisanceStrategy.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.alarm.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("alarm_nuisance_strategy")
public class AlarmNuisanceStrategy implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "策略ID")
    @TableId(type = IdType.AUTO)
    private Long strategyId;
    @ApiModelProperty(value = "策略名称")
    private String strategyName;
    @ApiModelProperty(value = "策略类型")
    private String strategyType;
    @ApiModelProperty(value = "策略说明")
    private String description;
    @ApiModelProperty(value = "规则配置JSON")
    private String ruleConfig;
    @ApiModelProperty(value = "已过滤数")
    private Integer filteredCount;
    @ApiModelProperty(value = "状态")
    private Integer status;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/alarm/pojo/AlarmPoint.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.alarm.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("alarm_point")
public class AlarmPoint implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "点位ID")
    @TableId(type = IdType.AUTO)
    private Long pointId;
    @ApiModelProperty(value = "点位编码")
    private String pointCode;
    @ApiModelProperty(value = "点位名称")
    private String pointName;
    @ApiModelProperty(value = "设备类型")
    private String deviceType;
    @ApiModelProperty(value = "报警级别")
    private String alarmLevel;
    @ApiModelProperty(value = "报警阈值")
    private String thresholdValue;
    @ApiModelProperty(value = "所属区域")
    private String area;
    @ApiModelProperty(value = "状态(1启用/0停用)")
    private Integer status;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/alarm/pojo/AlarmRealtime.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.ruoyi.alarm.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("alarm_realtime")
public class AlarmRealtime implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "报警ID")
    @TableId(type = IdType.AUTO)
    private Long alarmId;
    @ApiModelProperty(value = "点位ID")
    private Long pointId;
    @ApiModelProperty(value = "报警时间")
    private LocalDateTime alarmTime;
    @ApiModelProperty(value = "报警级别")
    private String alarmLevel;
    @ApiModelProperty(value = "报警类型")
    private String alarmType;
    @ApiModelProperty(value = "报警值")
    private String alarmValue;
    @ApiModelProperty(value = "阈值")
    private String thresholdValue;
    @ApiModelProperty(value = "状态")
    private String status;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/alarm/pojo/AlarmRemoveApproval.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.ruoyi.alarm.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("alarm_remove_approval")
public class AlarmRemoveApproval implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(type = IdType.AUTO)
    private Long approvalId;
    @ApiModelProperty(value = "申请编号")
    private String applyNo;
    @ApiModelProperty(value = "点位ID")
    private Long pointId;
    @ApiModelProperty(value = "剔除原因")
    private String removeReason;
    @ApiModelProperty(value = "详细说明")
    private String description;
    @ApiModelProperty(value = "申请人")
    private String applicant;
    @ApiModelProperty(value = "申请时间")
    private LocalDateTime applyTime;
    @ApiModelProperty(value = "审批状态")
    private String status;
    @ApiModelProperty(value = "审批人")
    private String approver;
    @ApiModelProperty(value = "审批时间")
    private LocalDateTime approveTime;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/alarm/service/IAlarmAnalysisService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.alarm.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.alarm.vo.AlarmAnalysisVo;
import com.ruoyi.alarm.vo.AlarmFaultDiagnosisVo;
import com.ruoyi.alarm.vo.AlarmRealtimeVo;
import com.ruoyi.alarm.vo.AlarmTrendVo;
import com.ruoyi.alarm.vo.AlarmTypeDistributionVo;
import java.util.List;
import java.util.Map;
public interface IAlarmAnalysisService {
    Map<String, Object> getRealtimeStats();
    IPage<AlarmRealtimeVo> getRealtimeList(Page page);
    int confirmAlarm(Long alarmId);
    AlarmAnalysisVo analyzeAlarm(Long alarmId);
    AlarmTrendVo getTrendData(String startDate, String endDate);
    List<AlarmTypeDistributionVo> getTypeDistribution();
    List<AlarmFaultDiagnosisVo> getFaultList();
}
src/main/java/com/ruoyi/alarm/service/IAlarmCollectionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.alarm.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.alarm.dto.AlarmCollectionInterfaceDto;
import com.ruoyi.alarm.dto.AlarmPointDto;
import com.ruoyi.alarm.vo.AlarmCollectionInterfaceVo;
import com.ruoyi.alarm.vo.AlarmPointLedgerVo;
import com.ruoyi.alarm.vo.AlarmStatisticsVo;
import java.util.List;
public interface IAlarmCollectionService {
    AlarmStatisticsVo getStatistics();
    IPage<AlarmPointLedgerVo> getPointLedgerList(Page page, AlarmPointDto dto);
    int addPoint(AlarmPointDto dto);
    int updatePoint(AlarmPointDto dto);
    int deletePoint(Long pointId);
    int changePointStatus(Long pointId, Integer status);
    List<AlarmPointLedgerVo> getPointOptions();
    List<AlarmCollectionInterfaceVo> getInterfaceList();
    int addOrUpdateInterface(AlarmCollectionInterfaceDto dto);
    int deleteInterface(Long interfaceId);
    int startInterface(Long interfaceId);
    int stopInterface(Long interfaceId);
}
src/main/java/com/ruoyi/alarm/service/IAlarmOptimizationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.ruoyi.alarm.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.alarm.dto.AlarmNuisanceStrategyDto;
import com.ruoyi.alarm.dto.AlarmRemoveApprovalDto;
import com.ruoyi.alarm.vo.*;
import java.util.List;
public interface IAlarmOptimizationService {
    AlarmOptimizationStatisticsVo getStatistics();
    List<AlarmNuisanceStrategyVo> getStrategyList();
    int addStrategy(AlarmNuisanceStrategyDto dto);
    int updateStrategy(AlarmNuisanceStrategyDto dto);
    int deleteStrategy(Long strategyId);
    int changeStrategyStatus(Long strategyId, Integer status);
    AlarmCompareVo getCompareData();
    List<AlarmHighFreqPointVo> getHighFreqList(Integer limit);
    IPage<AlarmRemoveApprovalVo> getApprovalList(Page page, String status);
    int submitApproval(AlarmRemoveApprovalDto dto);
    int approveApproval(String applyNo);
    int rejectApproval(String applyNo);
}
src/main/java/com/ruoyi/alarm/service/impl/AlarmAnalysisServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
package com.ruoyi.alarm.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.alarm.mapper.AlarmPointMapper;
import com.ruoyi.alarm.mapper.AlarmRealtimeMapper;
import com.ruoyi.alarm.pojo.AlarmPoint;
import com.ruoyi.alarm.pojo.AlarmRealtime;
import com.ruoyi.alarm.service.IAlarmAnalysisService;
import com.ruoyi.alarm.vo.*;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.format.DateTimeFormatter;
import java.util.*;
@Service
@AllArgsConstructor
public class AlarmAnalysisServiceImpl extends ServiceImpl<AlarmRealtimeMapper, AlarmRealtime> implements IAlarmAnalysisService {
    private AlarmRealtimeMapper alarmRealtimeMapper;
    private AlarmPointMapper alarmPointMapper;
    @Override
    public Map<String, Object> getRealtimeStats() {
        Map<String, Object> result = new HashMap<>();
        LambdaQueryWrapper<AlarmRealtime> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AlarmRealtime::getStatus, "未确认");
        List<AlarmRealtime> alarms = alarmRealtimeMapper.selectList(wrapper);
        int urgent = 0, important = 0, normal = 0;
        for (AlarmRealtime alarm : alarms) {
            if ("紧急".equals(alarm.getAlarmLevel())) {
                urgent++;
            } else if ("重要".equals(alarm.getAlarmLevel())) {
                important++;
            } else {
                normal++;
            }
        }
        result.put("urgent", urgent);
        result.put("important", important);
        result.put("normal", normal);
        result.put("total", alarms.size());
        return result;
    }
    @Override
    public IPage<AlarmRealtimeVo> getRealtimeList(Page page) {
        LambdaQueryWrapper<AlarmRealtime> wrapper = new LambdaQueryWrapper<>();
        wrapper.orderByDesc(AlarmRealtime::getAlarmTime);
        IPage<AlarmRealtime> alarmPage = alarmRealtimeMapper.selectPage(page, wrapper);
        return alarmPage.convert(alarm -> {
            AlarmRealtimeVo vo = new AlarmRealtimeVo();
            vo.setAlarmId(alarm.getAlarmId());
            vo.setAlarmTime(alarm.getAlarmTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            vo.setAlarmLevel(alarm.getAlarmLevel());
            vo.setAlarmType(alarm.getAlarmType());
            vo.setAlarmValue(alarm.getAlarmValue());
            vo.setThresholdValue(alarm.getThresholdValue());
            vo.setStatus(alarm.getStatus());
            AlarmPoint point = alarmPointMapper.selectById(alarm.getPointId());
            if (point != null) {
                vo.setPointName(point.getPointName());
                vo.setArea(point.getArea());
            }
            return vo;
        });
    }
    @Override
    public int confirmAlarm(Long alarmId) {
        AlarmRealtime alarm = new AlarmRealtime();
        alarm.setAlarmId(alarmId);
        alarm.setStatus("已确认");
        return alarmRealtimeMapper.updateById(alarm);
    }
    @Override
    public AlarmAnalysisVo analyzeAlarm(Long alarmId) {
        AlarmRealtime alarm = alarmRealtimeMapper.selectById(alarmId);
        AlarmAnalysisVo vo = new AlarmAnalysisVo();
        vo.setFaultType("设备运行异常");
        vo.setFaultReason("根据历史数据分析,该点位频繁触发报警,可能存在传感器故障或工艺参数设置不合理");
        List<AlarmStepVo> steps = new ArrayList<>();
        AlarmStepVo step1 = new AlarmStepVo();
        step1.setTitle("现场检查");
        step1.setDesc("派遣操作人员到现场检查设备运行状态");
        steps.add(step1);
        AlarmStepVo step2 = new AlarmStepVo();
        step2.setTitle("参数调整");
        step2.setDesc("根据工艺要求调整报警阈值设置");
        steps.add(step2);
        AlarmStepVo step3 = new AlarmStepVo();
        step3.setTitle("设备维护");
        step3.setDesc("如确认设备故障,安排维修或更换");
        steps.add(step3);
        AlarmStepVo step4 = new AlarmStepVo();
        step4.setTitle("效果验证");
        step4.setDesc("调整后持续监测,验证报警是否消除");
        steps.add(step4);
        vo.setSteps(steps);
        return vo;
    }
    @Override
    public AlarmTrendVo getTrendData(String startDate, String endDate) {
        AlarmTrendVo vo = new AlarmTrendVo();
        vo.setDates(Arrays.asList("周一", "周二", "周三", "周四", "周五", "周六", "周日"));
        vo.setUrgent(Arrays.asList(3, 5, 2, 4, 6, 2, 3));
        vo.setImportant(Arrays.asList(8, 12, 10, 15, 18, 9, 11));
        vo.setNormal(Arrays.asList(15, 20, 18, 25, 30, 16, 19));
        return vo;
    }
    @Override
    public List<AlarmTypeDistributionVo> getTypeDistribution() {
        List<AlarmTypeDistributionVo> list = new ArrayList<>();
        AlarmTypeDistributionVo vo1 = new AlarmTypeDistributionVo();
        vo1.setValue(35);
        vo1.setName("温度超限");
        list.add(vo1);
        AlarmTypeDistributionVo vo2 = new AlarmTypeDistributionVo();
        vo2.setValue(28);
        vo2.setName("压力异常");
        list.add(vo2);
        AlarmTypeDistributionVo vo3 = new AlarmTypeDistributionVo();
        vo3.setValue(20);
        vo3.setName("流量异常");
        list.add(vo3);
        AlarmTypeDistributionVo vo4 = new AlarmTypeDistributionVo();
        vo4.setValue(15);
        vo4.setName("液位超限");
        list.add(vo4);
        AlarmTypeDistributionVo vo5 = new AlarmTypeDistributionVo();
        vo5.setValue(12);
        vo5.setName("设备故障");
        list.add(vo5);
        return list;
    }
    @Override
    public List<AlarmFaultDiagnosisVo> getFaultList() {
        List<AlarmFaultDiagnosisVo> list = new ArrayList<>();
        AlarmFaultDiagnosisVo vo = new AlarmFaultDiagnosisVo();
        vo.setFaultType("传感器故障");
        vo.setAlarmPoint("反应釜温度监测点");
        vo.setOccurrenceCount(12);
        vo.setFaultReason("传感器老化,测量值漂移");
        vo.setSolution("更换温度传感器,重新校准");
        list.add(vo);
        return list;
    }
}
src/main/java/com/ruoyi/alarm/service/impl/AlarmCollectionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
package com.ruoyi.alarm.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.alarm.dto.AlarmCollectionInterfaceDto;
import com.ruoyi.alarm.dto.AlarmPointDto;
import com.ruoyi.alarm.mapper.AlarmCollectionInterfaceMapper;
import com.ruoyi.alarm.mapper.AlarmPointMapper;
import com.ruoyi.alarm.pojo.AlarmCollectionInterface;
import com.ruoyi.alarm.pojo.AlarmPoint;
import com.ruoyi.alarm.service.IAlarmCollectionService;
import com.ruoyi.alarm.vo.AlarmCollectionInterfaceVo;
import com.ruoyi.alarm.vo.AlarmPointLedgerVo;
import com.ruoyi.alarm.vo.AlarmStatisticsVo;
import com.ruoyi.common.utils.bean.BeanUtils;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Service
@AllArgsConstructor
public class AlarmCollectionServiceImpl extends ServiceImpl<AlarmPointMapper, AlarmPoint> implements IAlarmCollectionService {
    private AlarmPointMapper alarmPointMapper;
    private AlarmCollectionInterfaceMapper alarmCollectionInterfaceMapper;
    @Override
    public AlarmStatisticsVo getStatistics() {
        AlarmStatisticsVo vo = new AlarmStatisticsVo();
        LambdaQueryWrapper<AlarmPoint> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AlarmPoint::getStatus, 1);
        Long totalPoints = alarmPointMapper.selectCount(wrapper);
        vo.setTotalPoints(totalPoints.intValue());
        vo.setConnectedDevices((int) (totalPoints * 0.7));
        vo.setTodayDataVolume(245.6);
        vo.setParseSuccessRate(99.8);
        return vo;
    }
    @Override
    public IPage<AlarmPointLedgerVo> getPointLedgerList(Page page, AlarmPointDto dto) {
        LambdaQueryWrapper<AlarmPoint> wrapper = new LambdaQueryWrapper<>();
        if (dto.getPointName() != null && !dto.getPointName().isEmpty()) {
            wrapper.like(AlarmPoint::getPointName, dto.getPointName());
        }
        if (dto.getDeviceType() != null && !dto.getDeviceType().isEmpty()) {
            wrapper.eq(AlarmPoint::getDeviceType, dto.getDeviceType());
        }
        wrapper.orderByDesc(AlarmPoint::getCreateTime);
        IPage<AlarmPoint> pointPage = alarmPointMapper.selectPage(page, wrapper);
        return pointPage.convert(point -> {
            AlarmPointLedgerVo vo = new AlarmPointLedgerVo();
            BeanUtils.copyProperties(point, vo);
            return vo;
        });
    }
    @Override
    public int addPoint(AlarmPointDto dto) {
        AlarmPoint point = new AlarmPoint();
        BeanUtils.copyProperties(dto, point);
        point.setCreateTime(LocalDateTime.now());
        point.setUpdateTime(LocalDateTime.now());
        return alarmPointMapper.insert(point);
    }
    @Override
    public int updatePoint(AlarmPointDto dto) {
        AlarmPoint point = new AlarmPoint();
        BeanUtils.copyProperties(dto, point);
        point.setUpdateTime(LocalDateTime.now());
        return alarmPointMapper.updateById(point);
    }
    @Override
    public int deletePoint(Long pointId) {
        return alarmPointMapper.deleteById(pointId);
    }
    @Override
    public int changePointStatus(Long pointId, Integer status) {
        AlarmPoint point = new AlarmPoint();
        point.setPointId(pointId);
        point.setStatus(status);
        point.setUpdateTime(LocalDateTime.now());
        return alarmPointMapper.updateById(point);
    }
    @Override
    public List<AlarmPointLedgerVo> getPointOptions() {
        LambdaQueryWrapper<AlarmPoint> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AlarmPoint::getStatus, 1);
        wrapper.select(AlarmPoint::getPointId, AlarmPoint::getPointName);
        List<AlarmPoint> points = alarmPointMapper.selectList(wrapper);
        return points.stream().map(point -> {
            AlarmPointLedgerVo vo = new AlarmPointLedgerVo();
            vo.setPointId(point.getPointId());
            vo.setPointName(point.getPointName());
            return vo;
        }).collect(java.util.stream.Collectors.toList());
    }
    @Override
    public List<AlarmCollectionInterfaceVo> getInterfaceList() {
        LambdaQueryWrapper<AlarmCollectionInterface> wrapper = new LambdaQueryWrapper<>();
        wrapper.orderByDesc(AlarmCollectionInterface::getCreateTime);
        List<AlarmCollectionInterface> interfaces = alarmCollectionInterfaceMapper.selectList(wrapper);
        if (interfaces.isEmpty()) {
            List<AlarmCollectionInterfaceVo> mockData = new ArrayList<>();
            AlarmCollectionInterfaceVo vo = new AlarmCollectionInterfaceVo();
            vo.setInterfaceId(1L);
            vo.setInterfaceName("OPC UA数据采集");
            vo.setInterfaceType("OPC UA");
            vo.setServerAddress("opc.tcp://192.168.1.100:4840");
            vo.setCollectFreq("1秒");
            vo.setConnectStatus("connected");
            mockData.add(vo);
            return mockData;
        }
        return interfaces.stream().map(iface -> {
            AlarmCollectionInterfaceVo vo = new AlarmCollectionInterfaceVo();
            BeanUtils.copyProperties(iface, vo);
            return vo;
        }).collect(java.util.stream.Collectors.toList());
    }
    @Override
    public int startInterface(Long interfaceId) {
        AlarmCollectionInterface iface = new AlarmCollectionInterface();
        iface.setInterfaceId(interfaceId);
        iface.setConnectStatus("connected");
        iface.setUpdateTime(LocalDateTime.now());
        return alarmCollectionInterfaceMapper.updateById(iface);
    }
    @Override
    public int stopInterface(Long interfaceId) {
        AlarmCollectionInterface iface = new AlarmCollectionInterface();
        iface.setInterfaceId(interfaceId);
        iface.setConnectStatus("disconnected");
        iface.setUpdateTime(LocalDateTime.now());
        return alarmCollectionInterfaceMapper.updateById(iface);
    }
    @Override
    public int addOrUpdateInterface(AlarmCollectionInterfaceDto dto) {
        AlarmCollectionInterface iface = new AlarmCollectionInterface();
        BeanUtils.copyProperties(dto, iface);
        iface.setUpdateTime(LocalDateTime.now());
        if (dto.getInterfaceId() == null) {
            // æ–°å¢ž
            iface.setCreateTime(LocalDateTime.now());
            return alarmCollectionInterfaceMapper.insert(iface);
        } else {
            // æ›´æ–°
            return alarmCollectionInterfaceMapper.updateById(iface);
        }
    }
    @Override
    public int deleteInterface(Long interfaceId) {
        return alarmCollectionInterfaceMapper.deleteById(interfaceId);
    }
}
src/main/java/com/ruoyi/alarm/service/impl/AlarmOptimizationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,198 @@
package com.ruoyi.alarm.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.alarm.dto.AlarmNuisanceStrategyDto;
import com.ruoyi.alarm.dto.AlarmRemoveApprovalDto;
import com.ruoyi.alarm.mapper.AlarmNuisanceStrategyMapper;
import com.ruoyi.alarm.mapper.AlarmPointMapper;
import com.ruoyi.alarm.mapper.AlarmRemoveApprovalMapper;
import com.ruoyi.alarm.pojo.AlarmNuisanceStrategy;
import com.ruoyi.alarm.pojo.AlarmPoint;
import com.ruoyi.alarm.pojo.AlarmRemoveApproval;
import com.ruoyi.alarm.service.IAlarmOptimizationService;
import com.ruoyi.alarm.vo.*;
import com.ruoyi.common.utils.bean.BeanUtils;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
@Service
@AllArgsConstructor
public class AlarmOptimizationServiceImpl extends ServiceImpl<AlarmNuisanceStrategyMapper, AlarmNuisanceStrategy> implements IAlarmOptimizationService {
    private AlarmNuisanceStrategyMapper alarmNuisanceStrategyMapper;
    private AlarmRemoveApprovalMapper alarmRemoveApprovalMapper;
    private AlarmPointMapper alarmPointMapper;
    @Override
    public AlarmOptimizationStatisticsVo getStatistics() {
        AlarmOptimizationStatisticsVo vo = new AlarmOptimizationStatisticsVo();
        vo.setFilteredCount(1568);
        vo.setValidRate(85.6);
        vo.setResponseTime(12);
        vo.setScore(92);
        return vo;
    }
    @Override
    public List<AlarmNuisanceStrategyVo> getStrategyList() {
        LambdaQueryWrapper<AlarmNuisanceStrategy> wrapper = new LambdaQueryWrapper<>();
        wrapper.orderByDesc(AlarmNuisanceStrategy::getCreateTime);
        List<AlarmNuisanceStrategy> strategies = alarmNuisanceStrategyMapper.selectList(wrapper);
        return strategies.stream().map(strategy -> {
            AlarmNuisanceStrategyVo vo = new AlarmNuisanceStrategyVo();
            vo.setStrategyId(strategy.getStrategyId());
            vo.setStrategyName(strategy.getStrategyName());
            vo.setStrategyType(strategy.getStrategyType());
            vo.setDescription(strategy.getDescription());
            vo.setFilteredCount(strategy.getFilteredCount());
            vo.setStatus(strategy.getStatus());
            return vo;
        }).collect(java.util.stream.Collectors.toList());
    }
    @Override
    public int addStrategy(AlarmNuisanceStrategyDto dto) {
        AlarmNuisanceStrategy strategy = new AlarmNuisanceStrategy();
        BeanUtils.copyProperties(dto, strategy);
        strategy.setFilteredCount(0);
        strategy.setCreateTime(LocalDateTime.now());
        strategy.setUpdateTime(LocalDateTime.now());
        return alarmNuisanceStrategyMapper.insert(strategy);
    }
    @Override
    public int updateStrategy(AlarmNuisanceStrategyDto dto) {
        AlarmNuisanceStrategy strategy = new AlarmNuisanceStrategy();
        BeanUtils.copyProperties(dto, strategy);
        strategy.setUpdateTime(LocalDateTime.now());
        return alarmNuisanceStrategyMapper.updateById(strategy);
    }
    @Override
    public int deleteStrategy(Long strategyId) {
        return alarmNuisanceStrategyMapper.deleteById(strategyId);
    }
    @Override
    public int changeStrategyStatus(Long strategyId, Integer status) {
        AlarmNuisanceStrategy strategy = new AlarmNuisanceStrategy();
        strategy.setStrategyId(strategyId);
        strategy.setStatus(status);
        strategy.setUpdateTime(LocalDateTime.now());
        return alarmNuisanceStrategyMapper.updateById(strategy);
    }
    @Override
    public AlarmCompareVo getCompareData() {
        AlarmCompareVo vo = new AlarmCompareVo();
        vo.setCategories(Arrays.asList("周一", "周二", "周三", "周四", "周五", "周六", "周日"));
        vo.setBefore(Arrays.asList(120, 132, 101, 134, 90, 230, 210));
        vo.setAfter(Arrays.asList(45, 52, 38, 48, 35, 78, 65));
        return vo;
    }
    @Override
    public List<AlarmHighFreqPointVo> getHighFreqList(Integer limit) {
        List<AlarmHighFreqPointVo> list = new ArrayList<>();
        AlarmHighFreqPointVo vo = new AlarmHighFreqPointVo();
        vo.setPointName("反应釜温度监测点");
        vo.setAlarmCount(156);
        vo.setTrend("下降");
        list.add(vo);
        return list;
    }
    @Override
    public IPage<AlarmRemoveApprovalVo> getApprovalList(Page page, String status) {
        LambdaQueryWrapper<AlarmRemoveApproval> wrapper = new LambdaQueryWrapper<>();
        if (status != null && !status.isEmpty()) {
            wrapper.eq(AlarmRemoveApproval::getStatus, status);
        }
        wrapper.orderByDesc(AlarmRemoveApproval::getApplyTime);
        IPage<AlarmRemoveApproval> approvalPage = alarmRemoveApprovalMapper.selectPage(page, wrapper);
        return approvalPage.convert(approval -> {
            AlarmRemoveApprovalVo vo = new AlarmRemoveApprovalVo();
            vo.setApplyNo(approval.getApplyNo());
            vo.setRemoveReason(approval.getRemoveReason());
            vo.setApplicant(approval.getApplicant());
            vo.setApplyTime(approval.getApplyTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            vo.setStatus(approval.getStatus());
            AlarmPoint point = alarmPointMapper.selectById(approval.getPointId());
            if (point != null) {
                vo.setPointName(point.getPointName());
            }
            return vo;
        });
    }
    @Override
    public int submitApproval(AlarmRemoveApprovalDto dto) {
        AlarmRemoveApproval approval = new AlarmRemoveApproval();
        BeanUtils.copyProperties(dto, approval);
        approval.setApplyNo("AP" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + String.format("%03d", new Random().nextInt(1000)));
        approval.setApplicant("当前用户");
        approval.setApplyTime(LocalDateTime.now());
        approval.setStatus("pending");
        approval.setCreateTime(LocalDateTime.now());
        approval.setUpdateTime(LocalDateTime.now());
        return alarmRemoveApprovalMapper.insert(approval);
    }
    @Override
    public int approveApproval(String applyNo) {
        AlarmRemoveApproval approval = new AlarmRemoveApproval();
        LambdaQueryWrapper<AlarmRemoveApproval> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AlarmRemoveApproval::getApplyNo, applyNo);
        AlarmRemoveApproval existing = alarmRemoveApprovalMapper.selectOne(wrapper);
        if (existing != null) {
            approval.setApprovalId(existing.getApprovalId());
            approval.setStatus("approved");
            approval.setApprover("审批人");
            approval.setApproveTime(LocalDateTime.now());
            approval.setUpdateTime(LocalDateTime.now());
            int result = alarmRemoveApprovalMapper.updateById(approval);
            // å®¡æ‰¹é€šè¿‡åŽï¼Œå°†å¯¹åº”点位的状态改为停用
            AlarmPoint point = new AlarmPoint();
            point.setPointId(existing.getPointId());
            point.setStatus(0); // 0表示停用
            point.setUpdateTime(LocalDateTime.now());
            alarmPointMapper.updateById(point);
            return result;
        }
        return 0;
    }
    @Override
    public int rejectApproval(String applyNo) {
        AlarmRemoveApproval approval = new AlarmRemoveApproval();
        LambdaQueryWrapper<AlarmRemoveApproval> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AlarmRemoveApproval::getApplyNo, applyNo);
        AlarmRemoveApproval existing = alarmRemoveApprovalMapper.selectOne(wrapper);
        if (existing != null) {
            approval.setApprovalId(existing.getApprovalId());
            approval.setStatus("rejected");
            approval.setApprover("审批人");
            approval.setApproveTime(LocalDateTime.now());
            approval.setUpdateTime(LocalDateTime.now());
            return alarmRemoveApprovalMapper.updateById(approval);
        }
        return 0;
    }
}
src/main/java/com/ruoyi/alarm/vo/AlarmAnalysisVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class AlarmAnalysisVo {
    @ApiModelProperty(value = "故障类型")
    private String faultType;
    @ApiModelProperty(value = "故障原因")
    private String faultReason;
    @ApiModelProperty(value = "处理步骤")
    private List<AlarmStepVo> steps;
}
src/main/java/com/ruoyi/alarm/vo/AlarmCollectionInterfaceVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmCollectionInterfaceVo {
    @ApiModelProperty(value = "接口ID")
    private Long interfaceId;
    @ApiModelProperty(value = "接口名称")
    private String interfaceName;
    @ApiModelProperty(value = "接口类型")
    private String interfaceType;
    @ApiModelProperty(value = "服务器地址")
    private String serverAddress;
    @ApiModelProperty(value = "采集频率")
    private String collectFreq;
    @ApiModelProperty(value = "连接状态")
    private String connectStatus;
}
src/main/java/com/ruoyi/alarm/vo/AlarmCompareVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class AlarmCompareVo {
    @ApiModelProperty(value = "日期列表")
    private List<String> categories;
    @ApiModelProperty(value = "治理前数据")
    private List<Integer> before;
    @ApiModelProperty(value = "治理后数据")
    private List<Integer> after;
}
src/main/java/com/ruoyi/alarm/vo/AlarmFaultDiagnosisVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmFaultDiagnosisVo {
    @ApiModelProperty(value = "故障类型")
    private String faultType;
    @ApiModelProperty(value = "关联报警点位")
    private String alarmPoint;
    @ApiModelProperty(value = "发生次数")
    private Integer occurrenceCount;
    @ApiModelProperty(value = "可能原因")
    private String faultReason;
    @ApiModelProperty(value = "处置建议")
    private String solution;
}
src/main/java/com/ruoyi/alarm/vo/AlarmHighFreqPointVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmHighFreqPointVo {
    @ApiModelProperty(value = "点位名称")
    private String pointName;
    @ApiModelProperty(value = "报警次数")
    private Integer alarmCount;
    @ApiModelProperty(value = "趋势")
    private String trend;
}
src/main/java/com/ruoyi/alarm/vo/AlarmNuisanceStrategyVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmNuisanceStrategyVo {
    @ApiModelProperty(value = "策略ID")
    private Long strategyId;
    @ApiModelProperty(value = "策略名称")
    private String strategyName;
    @ApiModelProperty(value = "策略类型")
    private String strategyType;
    @ApiModelProperty(value = "策略说明")
    private String description;
    @ApiModelProperty(value = "已过滤报警数")
    private Integer filteredCount;
    @ApiModelProperty(value = "状态(1启用/0停用)")
    private Integer status;
}
src/main/java/com/ruoyi/alarm/vo/AlarmOptimizationStatisticsVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmOptimizationStatisticsVo {
    @ApiModelProperty(value = "已过滤无效报警数")
    private Integer filteredCount;
    @ApiModelProperty(value = "有效报警率(%)")
    private Double validRate;
    @ApiModelProperty(value = "平均响应时间(秒)")
    private Integer responseTime;
    @ApiModelProperty(value = "治理评分")
    private Integer score;
}
src/main/java/com/ruoyi/alarm/vo/AlarmPointLedgerVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class AlarmPointLedgerVo {
    @ApiModelProperty(value = "点位ID")
    private Long pointId;
    @ApiModelProperty(value = "点位编码")
    private String pointCode;
    @ApiModelProperty(value = "点位名称")
    private String pointName;
    @ApiModelProperty(value = "设备类型")
    private String deviceType;
    @ApiModelProperty(value = "报警级别")
    private String alarmLevel;
    @ApiModelProperty(value = "报警阈值")
    private String thresholdValue;
    @ApiModelProperty(value = "所属区域")
    private String area;
    @ApiModelProperty(value = "状态(1启用/0停用)")
    private Integer status;
}
src/main/java/com/ruoyi/alarm/vo/AlarmRealtimeVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmRealtimeVo {
    @ApiModelProperty(value = "报警ID")
    private Long alarmId;
    @ApiModelProperty(value = "报警时间")
    private String alarmTime;
    @ApiModelProperty(value = "报警级别")
    private String alarmLevel;
    @ApiModelProperty(value = "报警点位名称")
    private String pointName;
    @ApiModelProperty(value = "报警类型")
    private String alarmType;
    @ApiModelProperty(value = "报警值")
    private String alarmValue;
    @ApiModelProperty(value = "报警阈值")
    private String thresholdValue;
    @ApiModelProperty(value = "所属区域")
    private String area;
    @ApiModelProperty(value = "状态")
    private String status;
}
src/main/java/com/ruoyi/alarm/vo/AlarmRemoveApprovalVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmRemoveApprovalVo {
    @ApiModelProperty(value = "申请编号")
    private String applyNo;
    @ApiModelProperty(value = "报警点位")
    private String pointName;
    @ApiModelProperty(value = "剔除原因")
    private String removeReason;
    @ApiModelProperty(value = "申请人")
    private String applicant;
    @ApiModelProperty(value = "申请时间")
    private String applyTime;
    @ApiModelProperty(value = "审批状态")
    private String status;
}
src/main/java/com/ruoyi/alarm/vo/AlarmStatisticsVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmStatisticsVo {
    @ApiModelProperty(value = "报警点位总数")
    private Integer totalPoints;
    @ApiModelProperty(value = "已连接设备数")
    private Integer connectedDevices;
    @ApiModelProperty(value = "今日数据量(万条)")
    private Double todayDataVolume;
    @ApiModelProperty(value = "解析成功率(%)")
    private Double parseSuccessRate;
}
src/main/java/com/ruoyi/alarm/vo/AlarmStepVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmStepVo {
    @ApiModelProperty(value = "步骤标题")
    private String title;
    @ApiModelProperty(value = "步骤描述")
    private String desc;
}
src/main/java/com/ruoyi/alarm/vo/AlarmTrendVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class AlarmTrendVo {
    @ApiModelProperty(value = "日期列表")
    private List<String> dates;
    @ApiModelProperty(value = "紧急报警数")
    private List<Integer> urgent;
    @ApiModelProperty(value = "重要报警数")
    private List<Integer> important;
    @ApiModelProperty(value = "一般报警数")
    private List<Integer> normal;
}
src/main/java/com/ruoyi/alarm/vo/AlarmTypeDistributionVo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.alarm.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AlarmTypeDistributionVo {
    @ApiModelProperty(value = "数量")
    private Integer value;
    @ApiModelProperty(value = "类型名称")
    private String name;
}