实现按筛选条件清空报警信息功能

This commit is contained in:
lin 2026-04-07 09:43:59 +08:00
parent 280ed4aee3
commit f5f86c40a0
7 changed files with 126 additions and 1 deletions

View File

@ -17,6 +17,9 @@ public interface IAlarmService {
// 删除报警信息
void deleteAlarmInfo(List<Long> ids);
// 按筛选条件清空报警信息
int clearAlarmsByCondition(List<AlarmType> alarmType, String beginTime, String endTime);
// 根据ID获取报警快照
String getAlarmSnapById(Long id);

View File

@ -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> 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);

View File

@ -51,4 +51,19 @@ public interface AlarmMapper {
@Select("SELECT snap_path FROM wvp_alarm WHERE id = #{id}")
String getSnapPathById(@Param("id") Long id);
@Delete("<script>" +
"DELETE FROM wvp_alarm WHERE 1=1" +
"<if test='alarmType != null and alarmType.size() > 0'>" +
" AND alarm_type IN " +
"<foreach collection='alarmType' item='item' open='(' separator=',' close=')'>" +
"#{item}" +
"</foreach>" +
"</if>" +
"<if test='beginTimeLong != null'> AND alarm_time &gt;= #{beginTimeLong}</if>" +
"<if test='endTimeLong != null'> AND alarm_time &lt;= #{endTimeLong}</if>" +
"</script>")
int deleteAlarmsByCondition(@Param("alarmType") List<AlarmType> alarmType,
@Param("beginTimeLong") Long beginTimeLong,
@Param("endTimeLong") Long endTimeLong);
}

View File

@ -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> 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)

View File

@ -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 : ''}`
})
}

View File

@ -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)
})
})
}
}

View File

@ -55,6 +55,17 @@
删除选中
</el-button>
</el-form-item>
<el-form-item>
<el-button
size="mini"
type="danger"
plain
icon="el-icon-delete-solid"
@click="clearByCondition"
>
清空
</el-button>
</el-form-item>
<el-form-item style="float: right;">
<el-button icon="el-icon-refresh-right" circle size="mini" @click="getAlarmList()" />
</el-form-item>
@ -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