From b4dba77229245e7adf4acfbfb594a15b88b8d32f Mon Sep 17 00:00:00 2001 From: zxr <271055687@qq.com> Date: Tue, 21 Jul 2026 22:15:59 +0800 Subject: [PATCH] fix: preserve alert configuration intent --- src/api/ops/logs.ts | 4 ++ .../pages/alert/suppress/config/formItems.ts | 6 +-- src/views/ops/pages/alert/suppress/index.vue | 2 +- .../ops/pages/alert/suppress/utils/index.ts | 43 +++++++++---------- .../components/TemplateFormDialog.vue | 3 ++ .../ops/pages/alert/template/edit/index.vue | 3 ++ .../ops/pages/log-mgmt/syslog-rules/index.vue | 8 ++++ .../ops/pages/log-mgmt/trap-rules/index.vue | 8 ++++ 8 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/api/ops/logs.ts b/src/api/ops/logs.ts index e25941b..c897abb 100644 --- a/src/api/ops/logs.ts +++ b/src/api/ops/logs.ts @@ -76,6 +76,8 @@ export interface SyslogRule { keyword_regex: string source_match: string message_regex: string + recovery_match_regex: string + lifecycle_key: string alert_name: string severity_code: string severity_mapping_json: string @@ -92,6 +94,8 @@ export interface TrapRule { priority: number oid_prefix: string varbind_match_regex: string + recovery_match_regex: string + lifecycle_key: string alert_name: string severity_code: string policy_id: number diff --git a/src/views/ops/pages/alert/suppress/config/formItems.ts b/src/views/ops/pages/alert/suppress/config/formItems.ts index 32fc00b..0507d7c 100644 --- a/src/views/ops/pages/alert/suppress/config/formItems.ts +++ b/src/views/ops/pages/alert/suppress/config/formItems.ts @@ -1,4 +1,4 @@ -import { computed } from 'vue' +import { computed, type Ref } from 'vue' import type { FormItem } from '@/components/search-form/types' import { SUPPRESSION_TYPE_OPTIONS } from '@/api/ops/suppression' import type { PolicyOption } from '../types' @@ -6,7 +6,7 @@ import type { PolicyOption } from '../types' /** * 获取筛选表单项配置 */ -export const useFormItems = (policyOptions: PolicyOption[]) => { +export const useFormItems = (policyOptions: Ref) => { return computed(() => [ { field: 'keyword', @@ -32,7 +32,7 @@ export const useFormItems = (policyOptions: PolicyOption[]) => { options: [ { value: '', label: '全部' }, { value: '0', label: '仅全局规则' }, - ...policyOptions.map((p) => ({ value: String(p.id), label: p.name })), + ...policyOptions.value.map((p) => ({ value: String(p.id), label: p.name })), ], }, { diff --git a/src/views/ops/pages/alert/suppress/index.vue b/src/views/ops/pages/alert/suppress/index.vue index 13b3dca..c17629e 100644 --- a/src/views/ops/pages/alert/suppress/index.vue +++ b/src/views/ops/pages/alert/suppress/index.vue @@ -136,7 +136,7 @@ const { } = useTable() // 筛选表单项配置 -const formItems = useFormItems(policyOptions.value) +const formItems = useFormItems(policyOptions) // 表格列配置 const tableColumns = computed(() => getTableColumns()) diff --git a/src/views/ops/pages/alert/suppress/utils/index.ts b/src/views/ops/pages/alert/suppress/utils/index.ts index 3200cec..9c562b1 100644 --- a/src/views/ops/pages/alert/suppress/utils/index.ts +++ b/src/views/ops/pages/alert/suppress/utils/index.ts @@ -81,30 +81,29 @@ export const validateJsonFields = (formData: SuppressionRule, fields: string[]): } /** - * 构建更新数据(只传非空字段) + * 构建完整更新数据,显式传递空值以支持清除旧配置 */ export const buildUpdateData = (formData: SuppressionRule): SuppressionUpdateParams => { - const updateData: SuppressionUpdateParams = { id: formData.id! } - - if (formData.name) updateData.name = formData.name - if (formData.type) updateData.type = formData.type - if (formData.description) updateData.description = formData.description - updateData.enabled = formData.enabled - if (formData.priority && formData.priority > 0) updateData.priority = formData.priority - if (formData.policy_id && formData.policy_id > 0) updateData.policy_id = formData.policy_id - if (formData.dedup_window && formData.dedup_window > 0) updateData.dedup_window = formData.dedup_window - if (formData.dedup_keys) updateData.dedup_keys = formData.dedup_keys - if (formData.aggregate_window && formData.aggregate_window > 0) updateData.aggregate_window = formData.aggregate_window - if (formData.group_by) updateData.group_by = formData.group_by - if (formData.aggregate_count && formData.aggregate_count > 0) updateData.aggregate_count = formData.aggregate_count - if (formData.source_matchers) updateData.source_matchers = formData.source_matchers - if (formData.target_matchers) updateData.target_matchers = formData.target_matchers - if (formData.throttle_count && formData.throttle_count > 0) updateData.throttle_count = formData.throttle_count - if (formData.throttle_window && formData.throttle_window > 0) updateData.throttle_window = formData.throttle_window - if (formData.schedule) updateData.schedule = formData.schedule - if (formData.matchers) updateData.matchers = formData.matchers - - return updateData + return { + id: formData.id!, + name: formData.name, + type: formData.type, + description: formData.description ?? '', + enabled: formData.enabled ?? true, + priority: formData.priority ?? 0, + policy_id: formData.policy_id ?? 0, + dedup_window: formData.dedup_window ?? 0, + dedup_keys: formData.dedup_keys ?? '', + aggregate_window: formData.aggregate_window ?? 0, + group_by: formData.group_by ?? '', + aggregate_count: formData.aggregate_count ?? 0, + source_matchers: formData.source_matchers ?? '', + target_matchers: formData.target_matchers ?? '', + throttle_count: formData.throttle_count ?? 0, + throttle_window: formData.throttle_window ?? 0, + schedule: formData.schedule ?? '', + matchers: formData.matchers ?? '', + } } /** diff --git a/src/views/ops/pages/alert/template/components/TemplateFormDialog.vue b/src/views/ops/pages/alert/template/components/TemplateFormDialog.vue index 6a429cc..819b251 100644 --- a/src/views/ops/pages/alert/template/components/TemplateFormDialog.vue +++ b/src/views/ops/pages/alert/template/components/TemplateFormDialog.vue @@ -527,6 +527,9 @@ const handleSubmit = async () => { // 提取规则数据 const submitRules = formData.value.rules.map((r) => { const { _metrics, _metricsLoading, ...rest } = r as any + if (rest.rule_type === 'dynamic' && ['==', '!='].includes(rest.compare_op)) { + rest.compare_op = '>' + } return rest }) diff --git a/src/views/ops/pages/alert/template/edit/index.vue b/src/views/ops/pages/alert/template/edit/index.vue index e65e6e9..46dde70 100644 --- a/src/views/ops/pages/alert/template/edit/index.vue +++ b/src/views/ops/pages/alert/template/edit/index.vue @@ -644,6 +644,9 @@ const handleSubmit = async () => { // 提取规则数据 const submitRules = formData.value.rules.map((r) => { const { _metrics, _metricsLoading, ...rest } = r as any + if (rest.rule_type === 'dynamic' && ['==', '!='].includes(rest.compare_op)) { + rest.compare_op = '>' + } return rest }) diff --git a/src/views/ops/pages/log-mgmt/syslog-rules/index.vue b/src/views/ops/pages/log-mgmt/syslog-rules/index.vue index a83b347..5187bfd 100644 --- a/src/views/ops/pages/log-mgmt/syslog-rules/index.vue +++ b/src/views/ops/pages/log-mgmt/syslog-rules/index.vue @@ -74,6 +74,12 @@ + + + + + + @@ -156,6 +162,8 @@ const emptyForm = (): SyslogRule => ({ source_match: '', keyword_regex: '', message_regex: '', + recovery_match_regex: '', + lifecycle_key: '', alert_name: '', severity_code: '', severity_mapping_json: '', diff --git a/src/views/ops/pages/log-mgmt/trap-rules/index.vue b/src/views/ops/pages/log-mgmt/trap-rules/index.vue index 4504343..bf12a32 100644 --- a/src/views/ops/pages/log-mgmt/trap-rules/index.vue +++ b/src/views/ops/pages/log-mgmt/trap-rules/index.vue @@ -68,6 +68,12 @@ + + + + + + @@ -142,6 +148,8 @@ const emptyForm = (): TrapRule => ({ priority: 0, oid_prefix: '', varbind_match_regex: '', + recovery_match_regex: '', + lifecycle_key: '', alert_name: '', severity_code: '', policy_id: 0,