From 7e61f330dca771dcf486b1bf8904ea52f1adad3d Mon Sep 17 00:00:00 2001
From: zxr <271055687@qq.com>
Date: Tue, 21 Jul 2026 21:21:47 +0800
Subject: [PATCH] fix: restrict dynamic rule operators
---
.../pages/alert/setting/components/RuleFormDialog.vue | 9 ++++++---
.../ops/pages/alert/template/components/RuleEditor.vue | 9 ++++++++-
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/views/ops/pages/alert/setting/components/RuleFormDialog.vue b/src/views/ops/pages/alert/setting/components/RuleFormDialog.vue
index 7ac0416..e46b491 100644
--- a/src/views/ops/pages/alert/setting/components/RuleFormDialog.vue
+++ b/src/views/ops/pages/alert/setting/components/RuleFormDialog.vue
@@ -64,8 +64,8 @@
<
≥
≤
- =
- ≠
+ =
+ ≠
@@ -307,7 +307,10 @@ const loadRuleDetail = async () => {
formData.metric_name = rule.metric_name || ''
formData.data_source = rule.data_source || 'dc-control'
formData.threshold = rule.threshold
- formData.compare_op = rule.compare_op || '>'
+ formData.compare_op = rule.compare_op || '>'
+ if (formData.rule_type === 'dynamic' && ['==', '!='].includes(formData.compare_op)) {
+ formData.compare_op = '>'
+ }
formData.duration = rule.duration ?? 60
formData.eval_interval = rule.eval_interval ?? 60
if (rule.rule_type === 'dynamic') {
diff --git a/src/views/ops/pages/alert/template/components/RuleEditor.vue b/src/views/ops/pages/alert/template/components/RuleEditor.vue
index ff5a2db..f3160ee 100644
--- a/src/views/ops/pages/alert/template/components/RuleEditor.vue
+++ b/src/views/ops/pages/alert/template/components/RuleEditor.vue
@@ -85,7 +85,7 @@
-
+
{{ item.label }}
@@ -254,6 +254,7 @@ watch(
const copied: RuleItem[] = JSON.parse(JSON.stringify(val))
localRules.value = copied.map((rule) => ({
...rule,
+ compare_op: rule.rule_type === 'dynamic' && ['==', '!='].includes(rule.compare_op) ? '>' : rule.compare_op,
_baseline: parseBaselineConfig(rule.baseline_config),
}))
},
@@ -336,6 +337,9 @@ const getRuleFieldRules = (field: string) => {
return [{ required: true, message: messages[field] || '该字段为必填项' }]
}
+const availableCompareOperators = (ruleType: string) =>
+ ruleType === 'dynamic' ? COMPARE_OPERATORS.filter((item) => item.value !== '==' && item.value !== '!=') : COMPARE_OPERATORS
+
// 暴露验证方法给父组件
const validate = async () => {
return ruleFormRef.value?.validate()
@@ -349,6 +353,9 @@ defineExpose({
const syncUpdate = (index: number) => {
const newRules = [...props.rules]
const { _metrics, _metricsLoading, _baseline, ...rest } = localRules.value[index]
+ if (rest.rule_type === 'dynamic' && ['==', '!='].includes(rest.compare_op)) {
+ rest.compare_op = '>'
+ }
const baseline_config = rest.rule_type === 'dynamic' ? JSON.stringify(_baseline || defaultBaselineConfig()) : '{}'
newRules[index] = { ...rest, baseline_config, _metrics, _metricsLoading } as RuleItem
emit('update:rules', newRules)