fix: restrict dynamic rule operators

This commit is contained in:
zxr
2026-07-21 21:21:47 +08:00
parent 8c1772c784
commit 7e61f330dc
2 changed files with 14 additions and 4 deletions

View File

@@ -64,8 +64,8 @@
<a-option value="<"><</a-option>
<a-option value=">=">&ge;</a-option>
<a-option value="<=">&le;</a-option>
<a-option value="==">=</a-option>
<a-option value="!=">&ne;</a-option>
<a-option v-if="formData.rule_type !== 'dynamic'" value="==">=</a-option>
<a-option v-if="formData.rule_type !== 'dynamic'" value="!=">&ne;</a-option>
</a-select>
</a-form-item>
</a-col>
@@ -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') {

View File

@@ -85,7 +85,7 @@
<a-col :xs="24" :sm="12" :md="6">
<a-form-item label="比较运算符" :field="`rules[${index}].compare_op`" :rules="getRuleFieldRules('compare_op')">
<a-select v-model="rule.compare_op" placeholder="请选择" @change="syncUpdate(index)">
<a-option v-for="item in COMPARE_OPERATORS" :key="item.value" :value="item.value">
<a-option v-for="item in availableCompareOperators(rule.rule_type)" :key="item.value" :value="item.value">
{{ item.label }}
</a-option>
</a-select>
@@ -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)