From c0ce5324f128a09e2cd42eece8c3120acea20830 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 02 六月 2026 16:51:32 +0800
Subject: [PATCH] feat(alarm): 添加报警分析评估和数据采集优化功能模块

---
 src/main/java/com/ruoyi/alarm/vo/AlarmRemoveApprovalVo.java                  |   26 
 src/main/java/com/ruoyi/alarm/mapper/AlarmPointMapper.java                   |    9 
 src/main/java/com/ruoyi/alarm/vo/AlarmStepVo.java                            |   14 
 src/main/java/com/ruoyi/alarm/service/IAlarmOptimizationService.java         |   36 +
 src/main/java/com/ruoyi/alarm/controller/AlarmOptimizationController.java    |  112 +++
 src/main/java/com/ruoyi/alarm/dto/AlarmRemoveApprovalDto.java                |   23 
 src/main/java/com/ruoyi/alarm/service/IAlarmAnalysisService.java             |   29 
 src/main/java/com/ruoyi/alarm/vo/AlarmAnalysisVo.java                        |   19 
 src/main/java/com/ruoyi/alarm/service/IAlarmCollectionService.java           |   38 +
 src/main/java/com/ruoyi/alarm/mapper/AlarmRemoveApprovalMapper.java          |    9 
 src/main/java/com/ruoyi/alarm/vo/AlarmTrendVo.java                           |   22 
 src/main/java/com/ruoyi/alarm/pojo/AlarmNuisanceStrategy.java                |   57 +
 src/main/java/com/ruoyi/alarm/vo/AlarmHighFreqPointVo.java                   |   17 
 src/main/java/com/ruoyi/alarm/service/impl/AlarmOptimizationServiceImpl.java |  198 ++++++
 src/main/java/com/ruoyi/alarm/controller/AlarmPointLedgerController.java     |   66 ++
 src/main/java/com/ruoyi/alarm/dto/AlarmNuisanceStrategyDto.java              |   33 +
 src/main/java/com/ruoyi/alarm/mapper/AlarmCollectionInterfaceMapper.java     |    9 
 src/main/java/com/ruoyi/alarm/vo/AlarmOptimizationStatisticsVo.java          |   20 
 src/main/java/com/ruoyi/alarm/mapper/AlarmNuisanceStrategyMapper.java        |    9 
 src/main/java/com/ruoyi/alarm/pojo/AlarmCollectionInterface.java             |   54 +
 src/main/java/com/ruoyi/alarm/service/impl/AlarmAnalysisServiceImpl.java     |  171 +++++
 src/main/java/com/ruoyi/alarm/vo/AlarmPointLedgerVo.java                     |   34 +
 src/main/java/com/ruoyi/alarm/dto/AlarmCollectionInterfaceDto.java           |   32 +
 src/main/java/com/ruoyi/alarm/vo/AlarmStatisticsVo.java                      |   20 
 src/main/java/com/ruoyi/alarm/vo/AlarmCompareVo.java                         |   19 
 src/main/java/com/ruoyi/alarm/pojo/AlarmRemoveApproval.java                  |   66 ++
 src/main/java/com/ruoyi/alarm/pojo/AlarmPoint.java                           |   60 ++
 src/main/java/com/ruoyi/alarm/vo/AlarmRealtimeVo.java                        |   35 +
 src/main/java/com/ruoyi/alarm/dto/AlarmPointDto.java                         |   41 +
 src/main/java/com/ruoyi/alarm/controller/AlarmCollectionController.java      |   67 ++
 src/main/java/com/ruoyi/alarm/service/impl/AlarmCollectionServiceImpl.java   |  172 +++++
 src/main/java/com/ruoyi/alarm/vo/AlarmFaultDiagnosisVo.java                  |   23 
 src/main/java/com/ruoyi/alarm/vo/AlarmNuisanceStrategyVo.java                |   26 
 src/main/java/com/ruoyi/alarm/controller/AlarmPointController.java           |   28 
 src/main/java/com/ruoyi/alarm/pojo/AlarmRealtime.java                        |   60 ++
 src/main/java/com/ruoyi/alarm/vo/AlarmCollectionInterfaceVo.java             |   26 
 src/main/java/com/ruoyi/alarm/mapper/AlarmRealtimeMapper.java                |    9 
 src/main/java/com/ruoyi/alarm/controller/AlarmAnalysisController.java        |   76 ++
 src/main/java/com/ruoyi/alarm/vo/AlarmTypeDistributionVo.java                |   14 
 39 files changed, 1,779 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/alarm/controller/AlarmAnalysisController.java b/src/main/java/com/ruoyi/alarm/controller/AlarmAnalysisController.java
new file mode 100644
index 0000000..7b151ef
--- /dev/null
+++ b/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);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/controller/AlarmCollectionController.java b/src/main/java/com/ruoyi/alarm/controller/AlarmCollectionController.java
new file mode 100644
index 0000000..2ac9e0a
--- /dev/null
+++ b/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));
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/controller/AlarmOptimizationController.java b/src/main/java/com/ruoyi/alarm/controller/AlarmOptimizationController.java
new file mode 100644
index 0000000..2394a00
--- /dev/null
+++ b/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));
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/controller/AlarmPointController.java b/src/main/java/com/ruoyi/alarm/controller/AlarmPointController.java
new file mode 100644
index 0000000..5efd18a
--- /dev/null
+++ b/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);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/controller/AlarmPointLedgerController.java b/src/main/java/com/ruoyi/alarm/controller/AlarmPointLedgerController.java
new file mode 100644
index 0000000..312e643
--- /dev/null
+++ b/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("瀵煎嚭鍔熻兘寰呭疄鐜�");
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/dto/AlarmCollectionInterfaceDto.java b/src/main/java/com/ruoyi/alarm/dto/AlarmCollectionInterfaceDto.java
new file mode 100644
index 0000000..c0c59f5
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/dto/AlarmNuisanceStrategyDto.java b/src/main/java/com/ruoyi/alarm/dto/AlarmNuisanceStrategyDto.java
new file mode 100644
index 0000000..a0bc2d8
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/dto/AlarmPointDto.java b/src/main/java/com/ruoyi/alarm/dto/AlarmPointDto.java
new file mode 100644
index 0000000..c6e794f
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/dto/AlarmRemoveApprovalDto.java b/src/main/java/com/ruoyi/alarm/dto/AlarmRemoveApprovalDto.java
new file mode 100644
index 0000000..01a762f
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/mapper/AlarmCollectionInterfaceMapper.java b/src/main/java/com/ruoyi/alarm/mapper/AlarmCollectionInterfaceMapper.java
new file mode 100644
index 0000000..64d021d
--- /dev/null
+++ b/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> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/mapper/AlarmNuisanceStrategyMapper.java b/src/main/java/com/ruoyi/alarm/mapper/AlarmNuisanceStrategyMapper.java
new file mode 100644
index 0000000..a1c7654
--- /dev/null
+++ b/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> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/mapper/AlarmPointMapper.java b/src/main/java/com/ruoyi/alarm/mapper/AlarmPointMapper.java
new file mode 100644
index 0000000..226d174
--- /dev/null
+++ b/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> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/mapper/AlarmRealtimeMapper.java b/src/main/java/com/ruoyi/alarm/mapper/AlarmRealtimeMapper.java
new file mode 100644
index 0000000..36d259d
--- /dev/null
+++ b/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> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/mapper/AlarmRemoveApprovalMapper.java b/src/main/java/com/ruoyi/alarm/mapper/AlarmRemoveApprovalMapper.java
new file mode 100644
index 0000000..2cb03dc
--- /dev/null
+++ b/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> {
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/pojo/AlarmCollectionInterface.java b/src/main/java/com/ruoyi/alarm/pojo/AlarmCollectionInterface.java
new file mode 100644
index 0000000..b4e46c6
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/pojo/AlarmNuisanceStrategy.java b/src/main/java/com/ruoyi/alarm/pojo/AlarmNuisanceStrategy.java
new file mode 100644
index 0000000..8d0ca5c
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/pojo/AlarmPoint.java b/src/main/java/com/ruoyi/alarm/pojo/AlarmPoint.java
new file mode 100644
index 0000000..7717d45
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/pojo/AlarmRealtime.java b/src/main/java/com/ruoyi/alarm/pojo/AlarmRealtime.java
new file mode 100644
index 0000000..12dab9d
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/pojo/AlarmRemoveApproval.java b/src/main/java/com/ruoyi/alarm/pojo/AlarmRemoveApproval.java
new file mode 100644
index 0000000..1117b85
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/service/IAlarmAnalysisService.java b/src/main/java/com/ruoyi/alarm/service/IAlarmAnalysisService.java
new file mode 100644
index 0000000..44c6d5a
--- /dev/null
+++ b/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();
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/service/IAlarmCollectionService.java b/src/main/java/com/ruoyi/alarm/service/IAlarmCollectionService.java
new file mode 100644
index 0000000..9669da7
--- /dev/null
+++ b/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);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/service/IAlarmOptimizationService.java b/src/main/java/com/ruoyi/alarm/service/IAlarmOptimizationService.java
new file mode 100644
index 0000000..f6ebff6
--- /dev/null
+++ b/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);
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/service/impl/AlarmAnalysisServiceImpl.java b/src/main/java/com/ruoyi/alarm/service/impl/AlarmAnalysisServiceImpl.java
new file mode 100644
index 0000000..564650c
--- /dev/null
+++ b/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;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/service/impl/AlarmCollectionServiceImpl.java b/src/main/java/com/ruoyi/alarm/service/impl/AlarmCollectionServiceImpl.java
new file mode 100644
index 0000000..069fdc0
--- /dev/null
+++ b/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);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/service/impl/AlarmOptimizationServiceImpl.java b/src/main/java/com/ruoyi/alarm/service/impl/AlarmOptimizationServiceImpl.java
new file mode 100644
index 0000000..12fd5a7
--- /dev/null
+++ b/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;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmAnalysisVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmAnalysisVo.java
new file mode 100644
index 0000000..ba6fc05
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmCollectionInterfaceVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmCollectionInterfaceVo.java
new file mode 100644
index 0000000..b5a0f45
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmCompareVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmCompareVo.java
new file mode 100644
index 0000000..b2fdde9
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmFaultDiagnosisVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmFaultDiagnosisVo.java
new file mode 100644
index 0000000..8985d95
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmHighFreqPointVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmHighFreqPointVo.java
new file mode 100644
index 0000000..3776e8a
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmNuisanceStrategyVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmNuisanceStrategyVo.java
new file mode 100644
index 0000000..d930abe
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmOptimizationStatisticsVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmOptimizationStatisticsVo.java
new file mode 100644
index 0000000..48f0f09
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmPointLedgerVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmPointLedgerVo.java
new file mode 100644
index 0000000..44f2509
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmRealtimeVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmRealtimeVo.java
new file mode 100644
index 0000000..59ff5b1
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmRemoveApprovalVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmRemoveApprovalVo.java
new file mode 100644
index 0000000..1d9ffd5
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmStatisticsVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmStatisticsVo.java
new file mode 100644
index 0000000..8a9aff0
--- /dev/null
+++ b/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 = "瑙f瀽鎴愬姛鐜�(%)")
+    private Double parseSuccessRate;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmStepVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmStepVo.java
new file mode 100644
index 0000000..cd57e13
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmTrendVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmTrendVo.java
new file mode 100644
index 0000000..b3ac0db
--- /dev/null
+++ b/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;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/alarm/vo/AlarmTypeDistributionVo.java b/src/main/java/com/ruoyi/alarm/vo/AlarmTypeDistributionVo.java
new file mode 100644
index 0000000..a4d560b
--- /dev/null
+++ b/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;
+}
\ No newline at end of file

--
Gitblit v1.9.3