diff --git a/src/main/java/com/genersoft/iot/vmp/service/IAlarmService.java b/src/main/java/com/genersoft/iot/vmp/service/IAlarmService.java index 2c158360c..6ef95aecb 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/IAlarmService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/IAlarmService.java @@ -17,6 +17,9 @@ public interface IAlarmService { // 删除报警信息 void deleteAlarmInfo(List ids); + // 按筛选条件清空报警信息 + int clearAlarmsByCondition(List alarmType, String beginTime, String endTime); + // 根据ID获取报警快照 String getAlarmSnapById(Long id); diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/AlarmServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/AlarmServiceImpl.java index 80f1dad9f..de601bd0f 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/AlarmServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/AlarmServiceImpl.java @@ -27,6 +27,7 @@ import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.File; import java.util.ArrayList; @@ -165,6 +166,30 @@ public class AlarmServiceImpl implements IAlarmService { } } + @Override + @Transactional + public int clearAlarmsByCondition(List alarmType, String beginTime, String endTime) { + Long beginTimeLong = null; + Long endTimeLong = null; + if (beginTime != null) { + beginTimeLong = DateUtil.yyyy_MM_dd_HH_mm_ssToTimestampMs(beginTime); + } + if (endTime != null) { + endTimeLong = DateUtil.yyyy_MM_dd_HH_mm_ssToTimestampMs(endTime); + } + // 清理前缓存数据,数据库删除后,相关的报警快照文件也需要清理掉 + alarmMapper.getAlarms(alarmType, beginTimeLong, endTimeLong).forEach(alarm -> { + String snapPath = alarm.getSnapPath(); + if (snapPath != null) { + File file = new File(snapPath); + if (file.exists()) { + file.delete(); + } + } + }); + return alarmMapper.deleteAlarmsByCondition(alarmType, beginTimeLong, endTimeLong); + } + @Override public String getAlarmSnapById(Long id) { return alarmMapper.getSnapPathById(id); diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/AlarmMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/AlarmMapper.java index 5efc4152c..9a65cc59c 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/AlarmMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/AlarmMapper.java @@ -51,4 +51,19 @@ public interface AlarmMapper { @Select("SELECT snap_path FROM wvp_alarm WHERE id = #{id}") String getSnapPathById(@Param("id") Long id); + + @Delete("") + int deleteAlarmsByCondition(@Param("alarmType") List alarmType, + @Param("beginTimeLong") Long beginTimeLong, + @Param("endTimeLong") Long endTimeLong); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/alarm/AlarmController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/alarm/AlarmController.java index 038e1645d..5caced0f4 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/alarm/AlarmController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/alarm/AlarmController.java @@ -55,6 +55,18 @@ public class AlarmController { alarmService.deleteAlarmInfo(ids); } + @ResponseBody + @DeleteMapping("/clear") + @Operation(summary = "按筛选条件清空报警信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) + @Parameter(name = "alarmType", description = "报警类型列表,为空则不限类型") + @Parameter(name = "beginTime", description = "开始时间,格式:yyyy-MM-dd HH:mm:ss") + @Parameter(name = "endTime", description = "结束时间,格式:yyyy-MM-dd HH:mm:ss") + public int clear(@RequestParam(required = false) List alarmType, + @RequestParam(required = false) String beginTime, + @RequestParam(required = false) String endTime) { + return alarmService.clearAlarmsByCondition(alarmType, beginTime, endTime); + } + @GetMapping("/snap/{id}") @Operation(summary = "获取报警快照图片") @Parameter(name = "id", description = "报警ID", required = true) diff --git a/web/src/api/alarm.js b/web/src/api/alarm.js index 91f09f824..d3a0147ce 100644 --- a/web/src/api/alarm.js +++ b/web/src/api/alarm.js @@ -23,3 +23,18 @@ export function deleteAlarms(ids) { data: ids }) } + +export function clearAlarms(params) { + const { alarmType, beginTime, endTime } = params || {} + const query = new URLSearchParams() + if (alarmType && alarmType.length > 0) { + alarmType.forEach(t => query.append('alarmType', t)) + } + if (beginTime) query.append('beginTime', beginTime) + if (endTime) query.append('endTime', endTime) + const qs = query.toString() + return request({ + method: 'delete', + url: `/api/alarm/clear${qs ? '?' + qs : ''}` + }) +} diff --git a/web/src/store/modules/alarm.js b/web/src/store/modules/alarm.js index 9c3fb9d94..5dac94f8a 100644 --- a/web/src/store/modules/alarm.js +++ b/web/src/store/modules/alarm.js @@ -1,4 +1,4 @@ -import { getAlarmList, deleteAlarms } from '@/api/alarm' +import { getAlarmList, deleteAlarms, clearAlarms } from '@/api/alarm' const actions = { getAlarmList({ commit }, params) { @@ -20,6 +20,16 @@ const actions = { reject(error) }) }) + }, + clearAlarms({ commit }, params) { + return new Promise((resolve, reject) => { + clearAlarms(params).then(response => { + const { data } = response + resolve(data) + }).catch(error => { + reject(error) + }) + }) } } diff --git a/web/src/views/alarm/index.vue b/web/src/views/alarm/index.vue index fd1c015d6..a58df889f 100644 --- a/web/src/views/alarm/index.vue +++ b/web/src/views/alarm/index.vue @@ -55,6 +55,17 @@ 删除选中 + + + 清空 + + @@ -358,6 +369,40 @@ export default { }) }).catch(() => {}) }, + clearByCondition() { + const hasFilter = this.beginTime || this.endTime || this.selectedAlarmTypes.length > 0 + const filterDesc = hasFilter + ? [ + this.beginTime ? `开始时间:${this.beginTime}` : null, + this.endTime ? `结束时间:${this.endTime}` : null, + this.selectedAlarmTypes.length > 0 ? `报警类型:${this.selectedAlarmTypes.map(v => { + const opt = this.alarmTypeOptions.find(o => o.value === v) + return opt ? opt.label : v + }).join('、')}` : null + ].filter(Boolean).join(';') + : '全部' + this.$confirm( + `将删除符合当前筛选条件的所有报警记录(${filterDesc}),此操作不可恢复,确定继续?`, + '清空报警', + { + confirmButtonText: '确定删除', + cancelButtonText: '取消', + type: 'warning' + } + ).then(() => { + this.$store.dispatch('alarm/clearAlarms', { + alarmType: this.selectedAlarmTypes.length > 0 ? this.selectedAlarmTypes : undefined, + beginTime: this.beginTime || undefined, + endTime: this.endTime || undefined + }).then(count => { + this.$message({ showClose: true, message: `已清空 ${count != null ? count : ''} 条报警记录`, type: 'success' }) + this.currentPage = 1 + this.getAlarmList() + }).catch(error => { + this.$message({ showClose: true, message: error, type: 'error' }) + }) + }).catch(() => {}) + }, getAlarmTypeLabel(value) { const option = ALARM_TYPE_OPTIONS.find(o => o.value === value) return option ? option.label : value