feat(alarm-page): ignore camera

This commit is contained in:
yangsy
2025-11-25 19:05:55 +08:00
parent 0e1fb75d2c
commit 226d8855fd
5 changed files with 201 additions and 20 deletions

View File

@@ -1,4 +1,5 @@
export * from './ndm-camera'; export * from './ndm-camera';
export * from './ndm-camera-ignore';
export * from './ndm-decoder'; export * from './ndm-decoder';
export * from './ndm-keyboard'; export * from './ndm-keyboard';
export * from './ndm-media-server'; export * from './ndm-media-server';

View File

@@ -0,0 +1,14 @@
import type { BaseModel, ReduceForPageQuery, ReduceForSaveVO, ReduceForUpdateVO } from '@/apis';
export interface NdmCameraIgnore extends BaseModel {
deviceId: string;
ignoreType: string;
}
export type NdmCameraIgnoreResultVO = Partial<NdmCameraIgnore>;
export type NdmCameraIgnoreSaveVO = Partial<Omit<NdmCameraIgnore, ReduceForSaveVO>>;
export type NdmCameraIgnoreUpdateVO = Partial<Omit<NdmCameraIgnore, ReduceForUpdateVO>>;
export type NdmCameraIgnorePageQuery = Partial<Omit<NdmCameraIgnore, ReduceForPageQuery>>;

View File

@@ -1,4 +1,5 @@
export * from './ndm-camera'; export * from './ndm-camera';
export * from './ndm-camera-ignore';
export * from './ndm-decoder'; export * from './ndm-decoder';
export * from './ndm-keyboard'; export * from './ndm-keyboard';
export * from './ndm-media-server'; export * from './ndm-media-server';

View File

@@ -0,0 +1,66 @@
import { ndmClient, userClient, type NdmCameraIgnorePageQuery, type NdmCameraIgnoreResultVO, type NdmCameraIgnoreSaveVO, type NdmCameraIgnoreUpdateVO, type PageParams, type PageResult } from '@/apis';
export const pageCameraIgnoreApi = async (pageQuery: PageParams<NdmCameraIgnorePageQuery>, options?: { stationCode?: string; signal?: AbortSignal }) => {
const { stationCode, signal } = options ?? {};
const client = stationCode ? ndmClient : userClient;
const prefix = stationCode ? `/${stationCode}` : '';
const endpoint = `${prefix}/api/ndm/ndmCameraIgnore/page`;
const resp = await client.post<PageResult<NdmCameraIgnoreResultVO>>(endpoint, pageQuery, { signal });
const [err, data] = resp;
if (err || !data) {
throw err;
}
return data;
};
export const detailCameraIgnoreApi = async (id: string, options?: { stationCode?: string; signal?: AbortSignal }) => {
const { stationCode, signal } = options ?? {};
const client = stationCode ? ndmClient : userClient;
const prefix = stationCode ? `/${stationCode}` : '';
const endpoint = `${prefix}/api/ndm/ndmCameraIgnore/detail`;
const resp = await client.get<NdmCameraIgnoreResultVO>(endpoint, { params: { id }, signal });
const [err, data] = resp;
if (err || !data) {
throw err;
}
return data;
};
export const saveCameraIgnoreApi = async (saveVO: NdmCameraIgnoreSaveVO, options?: { stationCode?: string; signal?: AbortSignal }) => {
const { stationCode, signal } = options ?? {};
const client = stationCode ? ndmClient : userClient;
const prefix = stationCode ? `/${stationCode}` : '';
const endpoint = `${prefix}/api/ndm/ndmCameraIgnore`;
const resp = await client.post<NdmCameraIgnoreResultVO>(endpoint, saveVO, { signal });
const [err, data] = resp;
if (err || !data) {
throw err;
}
return data;
};
export const updateCameraIgnoreApi = async (updateVO: NdmCameraIgnoreUpdateVO, options?: { stationCode?: string; signal?: AbortSignal }) => {
const { stationCode, signal } = options ?? {};
const client = stationCode ? ndmClient : userClient;
const prefix = stationCode ? `/${stationCode}` : '';
const endpoint = `${prefix}/api/ndm/ndmCameraIgnore`;
const resp = await client.put<NdmCameraIgnoreResultVO>(endpoint, updateVO, { signal });
const [err, data] = resp;
if (err || !data) {
throw err;
}
return data;
};
export const removeCameraIgnoreApi = async (ids: string[], options?: { stationCode?: string; signal?: AbortSignal }) => {
const { stationCode, signal } = options ?? {};
const client = stationCode ? ndmClient : userClient;
const prefix = stationCode ? `/${stationCode}` : '';
const endpoint = `${prefix}/api/ndm/ndmCameraIgnore`;
const resp = await client.delete<boolean>(endpoint, ids, { signal });
const [err, data] = resp;
if (err || !data) {
throw err;
}
return data;
};

View File

@@ -1,13 +1,22 @@
<script setup lang="ts"> <script setup lang="ts">
import { getCameraSnapApi, exportDeviceAlarmLogApi, pageDeviceAlarmLogApi, updateDeviceAlarmLogApi, type NdmDeviceAlarmLogResultVO } from '@/apis'; import {
getCameraSnapApi,
exportDeviceAlarmLogApi,
pageDeviceAlarmLogApi,
updateDeviceAlarmLogApi,
pageCameraIgnoreApi,
saveCameraIgnoreApi,
removeCameraIgnoreApi,
type NdmDeviceAlarmLogResultVO,
} from '@/apis';
import { renderAlarmDateCell, renderAlarmTypeCell, renderDeviceTypeCell, renderFaultLevelCell } from '@/components'; import { renderAlarmDateCell, renderAlarmTypeCell, renderDeviceTypeCell, renderFaultLevelCell } from '@/components';
import { AlarmType, DeviceType, DeviceTypeCode, DeviceTypeName, FaultLevel, tryGetDeviceTypeVal, type DeviceTypeVal } from '@/enums'; import { AlarmType, DeviceType, DeviceTypeCode, DeviceTypeName, FaultLevel, tryGetDeviceTypeVal, type DeviceTypeVal } from '@/enums';
import { useAlarmStore, useStationStore } from '@/stores'; import { useAlarmStore, useStationStore } from '@/stores';
import { downloadByData } from '@/utils'; import { downloadByData } from '@/utils';
import { useMutation } from '@tanstack/vue-query'; import { useMutation } from '@tanstack/vue-query';
import { CheckOutlined, EyeInvisibleOutlined, EyeOutlined } from '@vicons/antd';
import { watchDebounced } from '@vueuse/core'; import { watchDebounced } from '@vueuse/core';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import { debounce } from 'es-toolkit';
import { import {
NForm, NForm,
NInput, NInput,
@@ -19,7 +28,6 @@ import {
NSelect, NSelect,
NGridItem, NGridItem,
NDatePicker, NDatePicker,
NTag,
NPopconfirm, NPopconfirm,
NModal, NModal,
NImage, NImage,
@@ -137,6 +145,9 @@ const snapPreviewShow = ref(false);
const snapPreviewUrl = ref(''); const snapPreviewUrl = ref('');
const tableColumns: DataTableColumns<NdmDeviceAlarmLogResultVO & { snapUrl: string }> = [ const tableColumns: DataTableColumns<NdmDeviceAlarmLogResultVO & { snapUrl: string }> = [
// { title: '设备ID', key: 'deviceId' },
// { title: '故障编码', key: 'faultCode', align: 'center' },
// { title: '故障位置', key: 'faultLocation' },
{ title: '告警流水号', key: 'alarmNo' }, { title: '告警流水号', key: 'alarmNo' },
{ {
title: '告警时间', title: '告警时间',
@@ -169,8 +180,6 @@ const tableColumns: DataTableColumns<NdmDeviceAlarmLogResultVO & { snapUrl: stri
align: 'center', align: 'center',
render: renderFaultLevelCell, render: renderFaultLevelCell,
}, },
// { title: '故障编码', key: 'faultCode', align: 'center' },
// { title: '故障位置', key: 'faultLocation' },
{ title: '故障描述', key: 'faultDescription' }, { title: '故障描述', key: 'faultDescription' },
{ title: '修复建议', key: 'alarmRepairSuggestion' }, { title: '修复建议', key: 'alarmRepairSuggestion' },
{ {
@@ -219,30 +228,59 @@ const tableColumns: DataTableColumns<NdmDeviceAlarmLogResultVO & { snapUrl: stri
}, },
}, },
{ {
title: '告警确认', title: '操作',
key: 'alarmConfirm', key: 'action',
align: 'center', align: 'center',
render: (rowData) => { render: (rowData) => {
if (rowData.alarmConfirm === '1') {
return h(NTag, { type: 'default' }, { default: () => '已确认' });
}
const { id } = rowData; const { id } = rowData;
return h( return h(
NPopconfirm, NFlex,
{ {
onPositiveClick: () => { size: 'small',
rowData.alarmConfirm = '1'; justify: 'center',
confirmAlarm({ id }); align: 'center',
},
}, },
{ {
trigger: () => h(NButton, { type: 'info', size: 'small' }, { default: () => '确认' }), default: () => [
default: () => '确认告警?', rowData.alarmConfirm === '1'
? h(NButton, { disabled: true, text: true, type: 'info', size: 'small' }, { icon: () => h(CheckOutlined) })
: h(
NPopconfirm,
{
onPositiveClick: () => confirmAlarm({ id }),
},
{
trigger: () => h(NButton, { text: true, type: 'info', size: 'small' }, { icon: () => h(CheckOutlined) }),
default: () => '确认告警?',
},
),
tryGetDeviceTypeVal(rowData.deviceType) === DeviceType.Camera && [
h(
NPopconfirm,
{
onPositiveClick: () => ignoreCamera({ id }),
},
{
trigger: () => h(NButton, { text: true, type: 'info', size: 'small' }, { icon: () => h(EyeInvisibleOutlined) }),
default: () => '忽略设备?',
},
),
h(
NPopconfirm,
{
onPositiveClick: () => noticeCamera({ id }),
},
{
trigger: () => h(NButton, { text: true, type: 'info', size: 'small' }, { icon: () => h(EyeOutlined) }),
default: () => '取消忽略设备?',
},
),
],
],
}, },
); );
}, },
}, },
// { title: '设备ID', key: 'deviceId' },
]; ];
const tableData = ref<DataTableRowData[]>([]); const tableData = ref<DataTableRowData[]>([]);
@@ -298,7 +336,6 @@ const onClickReset = () => {
tablePagination.itemCount = 0; tablePagination.itemCount = 0;
getTableData(); getTableData();
}; };
const onClickResetDebounced = debounce(onClickReset, 500);
const onClickQuery = () => { const onClickQuery = () => {
if (searchFieldsChanged.value) { if (searchFieldsChanged.value) {
tablePagination.page = 1; tablePagination.page = 1;
@@ -324,8 +361,15 @@ const { mutateAsync: getSnapByDeviceId } = useMutation({
const { mutate: confirmAlarm } = useMutation({ const { mutate: confirmAlarm } = useMutation({
mutationFn: async (params: { id?: string }) => { mutationFn: async (params: { id?: string }) => {
const { id } = params;
if (id) {
const alarmLog = tableData.value.find((item) => item.id === id);
if (alarmLog) {
alarmLog['alarmConfirm'] = '1';
}
}
await updateDeviceAlarmLogApi({ await updateDeviceAlarmLogApi({
id: params.id, id,
alarmConfirm: '1', alarmConfirm: '1',
}); });
}, },
@@ -342,6 +386,61 @@ const { mutate: confirmAlarm } = useMutation({
}, },
}); });
const { mutate: ignoreCamera } = useMutation({
mutationFn: async (params: { id?: string }) => {
const { id } = params;
if (!id) return;
const alarmLog = tableData.value.find((item) => item.id === id);
if (!alarmLog) return;
const { records } = await pageCameraIgnoreApi({
model: { deviceId: alarmLog.deviceId },
extra: {},
current: 1,
size: 10,
sort: 'id',
order: 'descending',
});
const ignoredCamera = records.at(0);
if (ignoredCamera) {
window.$message.info('设备已被忽略');
return;
}
await saveCameraIgnoreApi({ deviceId: alarmLog.deviceId });
window.$message.success('忽略设备成功');
},
onError: (error) => {
console.error(error);
window.$message.error(error.message);
},
});
const { mutate: noticeCamera } = useMutation({
mutationFn: async (params: { id?: string }) => {
const { id } = params;
if (!id) return;
const alarmLog = tableData.value.find((item) => item.id === id);
if (!alarmLog) return;
const { records } = await pageCameraIgnoreApi({
model: { deviceId: alarmLog.deviceId },
extra: {},
current: 1,
size: 10,
sort: 'id',
order: 'descending',
});
if (records.length === 0) {
window.$message.info('设备未被忽略');
return;
}
await removeCameraIgnoreApi([...records.map((record) => record.id ?? '')]);
window.$message.success('取消忽略设备成功');
},
onError: (error) => {
console.error(error);
window.$message.error(error.message);
},
});
const { mutate: exportTableData, isPending: exporting } = useMutation({ const { mutate: exportTableData, isPending: exporting } = useMutation({
mutationFn: async () => { mutationFn: async () => {
const data = await exportDeviceAlarmLogApi({ const data = await exportDeviceAlarmLogApi({