From 5f6b1a134af296178979e51c40b6d1391aa0e3d8 Mon Sep 17 00:00:00 2001 From: lion <120344285@qq.com> Date: Thu, 8 Oct 2026 11:50:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=91=84=E5=83=8F=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/cameraMonitoring.ts | 10 +++- src/views/venues/CameraAlerts.vue | 93 ++++++++++++++++++++++++++++--- 2 files changed, 94 insertions(+), 9 deletions(-) diff --git a/src/api/cameraMonitoring.ts b/src/api/cameraMonitoring.ts index 461ec36..39632fb 100644 --- a/src/api/cameraMonitoring.ts +++ b/src/api/cameraMonitoring.ts @@ -4,8 +4,8 @@ export type CameraDevice = { id: number; venue_id?: number | null; venue_name?: string | null; name: string; ip: string; sdk_port: number; http_port?: number; channel: number; device_slot?: number | null; group_id?: string | null; monitor_enabled: boolean; notification_enabled: boolean; include_in_venue_stats: boolean; maintenance_until?: string | null; push_timeout_seconds: number; health?: CameraHealth | null; venue?: { id: number; name: string } | null } export type CameraHealth = { status: string; sdk_status?: string; alarm_status?: string; tcp_reachable?: boolean | null; last_pdc_at?: string | null; last_pdc_at_source?: string | null; push_age_seconds?: number | null; last_tcp_error?: string | null; reconnect_attempts?: number; observed_at?: string | null } -export type CameraAlert = { id: number; alert_type: string; status: string; severity: string; title: string; reason?: string; first_occurred_at?: string; last_occurred_at?: string; recovered_at?: string | null; camera?: Pick; venue?: { id: number; name: string } } -export type CameraSettings = { timezone: string; notification_start_time: string; notification_end_time: string; default_push_interval_seconds: number; default_push_timeout_seconds: number; probe_interval_seconds: number; probe_failure_threshold: number; auto_reconnect_max_attempts: number; send_manual_action_email: boolean; send_recovery_email: boolean; recipient_emails: string[] } +export type CameraAlert = { id: number; alert_type: string; status: string; severity: string; title: string; reason?: string; first_occurred_at?: string; last_occurred_at?: string; recovered_at?: string | null; acknowledged_at?: string | null; camera?: Pick; venue?: { id: number; name: string } } +export type CameraSettings = { repeat_notification_enabled: boolean; repeat_notification_interval_hours: number; timezone: string; notification_start_time: string; notification_end_time: string; default_push_interval_seconds: number; default_push_timeout_seconds: number; probe_interval_seconds: number; probe_failure_threshold: number; auto_reconnect_max_attempts: number; send_manual_action_email: boolean; send_recovery_email: boolean; recipient_emails: string[] } export async function fetchCameraDevices(params?: Record) { const { data } = await http.get('/camera-devices', { params }); return data } export async function createCameraDevice(payload: Record) { const { data } = await http.post('/camera-devices', payload); return data } export async function updateCameraDevice(id: number, payload: Record) { const { data } = await http.put(`/camera-devices/${id}`, payload); return data } @@ -16,3 +16,9 @@ export async function fetchCameraAlerts(params?: Record) { cons export async function acknowledgeCameraAlert(id: number) { const { data } = await http.post(`/camera-alerts/${id}/acknowledge`); return data } export async function fetchCameraSettings() { const { data } = await http.get('/camera-monitor-settings'); return data } export async function updateCameraSettings(payload: CameraSettings) { const { data } = await http.put('/camera-monitor-settings', payload); return data } + +export type CameraEmailRecord = { id: number; receiver: string; send_status: string; sent_at?: string | null; created_at: string; error_message?: string | null; alert?: { title: string; camera?: { name: string; ip: string; channel: number; venue_name?: string | null }; venue?: { name: string } } } +export async function fetchCameraEmailRecords(params: { page: number; page_size: number; send_status?: string }) { + const { data } = await http.get<{ data: CameraEmailRecord[]; total: number }>('/camera-email-records', { params }) + return data +} diff --git a/src/views/venues/CameraAlerts.vue b/src/views/venues/CameraAlerts.vue index 7a2a94a..a1a6dfa 100644 --- a/src/views/venues/CameraAlerts.vue +++ b/src/views/venues/CameraAlerts.vue @@ -1,10 +1,49 @@