|
|
@@ -19,11 +19,14 @@ import InlineCreateExceptionTypeDialog from './InlineCreateExceptionTypeDialog.v
|
|
|
import S8FieldTooltip from '../../components/S8FieldTooltip.vue';
|
|
|
import { resolveAidopFactoryId, resolveAidopTenantId } from '../../../api/aidopTenant';
|
|
|
|
|
|
-interface DataSourceLike {
|
|
|
- id: number;
|
|
|
- enabled?: boolean;
|
|
|
- dataSourceCode?: string;
|
|
|
- type?: string;
|
|
|
+// S8-STANDARD-DATASET-HARD-CUTOVER-1:物理数据源已不存在,向导改为选择治理数据集。
|
|
|
+// 列表由 /api/aidop/s8/config/datasets 提供,只含「Catalog 已定义 + Provider 已注册」的项。
|
|
|
+interface DatasetOption {
|
|
|
+ datasetCode: string;
|
|
|
+ displayName?: string;
|
|
|
+ supportsTimeout?: boolean;
|
|
|
+ supportsShortage?: boolean;
|
|
|
+ supportsOutOfRange?: boolean;
|
|
|
}
|
|
|
|
|
|
const props = defineProps<{
|
|
|
@@ -31,7 +34,7 @@ const props = defineProps<{
|
|
|
stageNodes: S8DimensionNode[];
|
|
|
orderFlowNodes: S8DimensionNode[];
|
|
|
exceptionTypes: S8ExceptionTypeConfigRow[];
|
|
|
- dataSources: DataSourceLike[];
|
|
|
+ datasets: DatasetOption[];
|
|
|
// CONFIG-MONITOR-DICT-READONLY-SEED-1:监控对象/指标后端字典,空数组时回退 FALLBACK_MONITOR_OPTIONS
|
|
|
monitorObjects?: S8MonitorObjectOption[];
|
|
|
tenantId?: number;
|
|
|
@@ -155,6 +158,7 @@ const form = reactive({
|
|
|
metricCode: '',
|
|
|
exceptionTypeCode: '',
|
|
|
severity: 'FOLLOW',
|
|
|
+ datasetCode: '',
|
|
|
graceMinutes: 0,
|
|
|
completedStates: 'CLOSED,COMPLETED,DONE',
|
|
|
lowerBound: null as number | null,
|
|
|
@@ -169,6 +173,17 @@ const form = reactive({
|
|
|
recoverCountRequired: 1,
|
|
|
});
|
|
|
|
|
|
+// 按当前报警机制过滤可选数据集:能力不匹配的组合在这里就该看不见,
|
|
|
+// 而不是等提交后被 Enable Gate 以 dataset_capability_mismatch 拒绝。
|
|
|
+// 机制 → rule_type 的对应与后端 RuleTypeOf 一致:DATE→TIMEOUT / VALUE_RANGE→OUT_OF_RANGE。
|
|
|
+const datasetOptions = computed<DatasetOption[]>(() => {
|
|
|
+ const all = props.datasets ?? [];
|
|
|
+ if (form.mechanism === 'DATE') return all.filter((d) => d.supportsTimeout !== false);
|
|
|
+ if (form.mechanism === 'VALUE_RANGE') return all.filter((d) => d.supportsOutOfRange !== false);
|
|
|
+ // RATIO 当前不可选(上游已拦),MANUAL_REPORT 不生成规则;两者都不需要数据集过滤。
|
|
|
+ return all;
|
|
|
+});
|
|
|
+
|
|
|
// CONFIG-WIZARD-DRAFT-FRONTEND-1:草稿身份 + 用户可改的草稿名。
|
|
|
const currentDraftId = ref<number | string | null>(null);
|
|
|
const currentDraftCode = ref<string>('');
|
|
|
@@ -253,6 +268,7 @@ function resetForm() {
|
|
|
form.toleranceRatioPct = 0;
|
|
|
form.targetRatio = 95;
|
|
|
form.ruleCode = '';
|
|
|
+ form.datasetCode = '';
|
|
|
form.pollIntervalSeconds = 300;
|
|
|
form.triggerCountRequired = 1;
|
|
|
form.recoverCountRequired = 1;
|
|
|
@@ -490,6 +506,7 @@ function serializeWizardState(): string {
|
|
|
orderFlowCode: form.orderFlowCode,
|
|
|
exceptionTypeCode: form.exceptionTypeCode,
|
|
|
severity: form.severity,
|
|
|
+ datasetCode: form.datasetCode,
|
|
|
objectType: obj?.objectType ?? '',
|
|
|
objectLabel: obj?.objectLabel ?? '',
|
|
|
metricCode: form.metricCode,
|
|
|
@@ -555,6 +572,7 @@ function hydrateFromDraft(draft: S8WizardDraftDetail) {
|
|
|
if (f.orderFlowCode) form.orderFlowCode = f.orderFlowCode;
|
|
|
if (f.exceptionTypeCode) form.exceptionTypeCode = f.exceptionTypeCode;
|
|
|
if (f.severity) form.severity = f.severity;
|
|
|
+ if (typeof f.datasetCode === 'string') form.datasetCode = f.datasetCode;
|
|
|
|
|
|
// 2) 反查 activeMonitorOptions(后端字典优先):按 (objectType, objectLabel) 在当前机制下定位 objectIndex
|
|
|
const candidates = activeMonitorOptions.value.filter((o) => o.mechanisms.includes(form.mechanism as any));
|
|
|
@@ -746,6 +764,11 @@ function validateGenerate(): boolean {
|
|
|
if (isOrderFlowStage.value && !form.orderFlowCode) { ElMessage.warning('订单链路阶段规则必须选择订单流程节点'); return false; }
|
|
|
if (!form.exceptionTypeCode) { ElMessage.warning('异常类型未选择'); return false; }
|
|
|
if (!form.ruleCode.trim()) { ElMessage.warning('规则编码不能为空'); return false; }
|
|
|
+ if (!form.datasetCode) {
|
|
|
+ // 没有治理数据集就不存在可运行规则 —— 绝不退回"先建着、以后再说"。
|
|
|
+ ElMessage.warning(datasetOptions.value.length === 0 ? '当前无可用治理数据集' : '请选择取数数据集');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
if (form.pollIntervalSeconds <= 0) { ElMessage.warning('轮询间隔必须大于 0'); return false; }
|
|
|
if (form.mechanism === 'DATE') {
|
|
|
const states = form.completedStates.split(/[,\s]+/).map((s) => s.trim()).filter(Boolean);
|
|
|
@@ -761,20 +784,10 @@ function validateGenerate(): boolean {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-// S8-LEGACY-RUNTIME-RETIREMENT-1:向导生成的是 LEGACY_SQL 规则,已无运行资格。
|
|
|
-// 按钮已 disabled,这里再加一道前端守卫 —— 按钮的 disabled 只是 UI 状态,
|
|
|
-// 而后端 S8RuleCreationPolicy.EnsureCreationAllowed 才是真正的门(会返回 legacy_sql_retired)。
|
|
|
-// 保留函数本体不删:数据集治理完成后本向导要迁到 STANDARD_DATASET,届时这里是改造起点。
|
|
|
-const RULE_GENERATION_RETIRED_HINT =
|
|
|
- '向导不再生成 Legacy SQL 规则。S8 仅运行 STANDARD_DATASET 规则,请先在数据中台完成该监控对象的数据集治理与 Provider 上线。';
|
|
|
-// 显式标注 boolean(而非让 TS 推成字面量 true),否则后续代码会被判定为不可达。
|
|
|
-const RULE_GENERATION_RETIRED: boolean = true;
|
|
|
-
|
|
|
+// S8-STANDARD-DATASET-HARD-CUTOVER-1:向导重新可用,但只能生成 STANDARD_DATASET 规则。
|
|
|
+// 上一版这里有一道「向导已停用」的硬守卫,因为当时它生成的是 Legacy SQL;
|
|
|
+// 现在 SQL 生成机构已从 S8ConfigDraftService 整体删除,向导只组装 dataset_code + params_json。
|
|
|
async function generateRuleFromDraft() {
|
|
|
- if (RULE_GENERATION_RETIRED) {
|
|
|
- ElMessage.warning(RULE_GENERATION_RETIRED_HINT);
|
|
|
- return;
|
|
|
- }
|
|
|
if (!validateGenerate()) return;
|
|
|
saving.value = true;
|
|
|
try {
|
|
|
@@ -827,17 +840,17 @@ function handleInlineExceptionTypeCreated(payload: { typeCode: string; typeName:
|
|
|
</el-steps>
|
|
|
|
|
|
<!--
|
|
|
- S8-LEGACY-RUNTIME-RETIREMENT-1:把「本向导已不能生成可运行规则」放在最前面,
|
|
|
+ S8-STANDARD-DATASET-HARD-CUTOVER-1:把「有没有可用数据集」放在最前面,
|
|
|
而不是让用户填完五步再在提交时被拒。草稿仍可保存,供数据集治理完成后复用。
|
|
|
-->
|
|
|
<el-alert
|
|
|
- v-if="!isManualReport"
|
|
|
- type="info"
|
|
|
+ v-if="!isManualReport && datasetOptions.length === 0"
|
|
|
+ type="warning"
|
|
|
show-icon
|
|
|
:closable="false"
|
|
|
style="margin-bottom: 12px"
|
|
|
- title="自动规则生成已停用"
|
|
|
- description="S8 仅运行 STANDARD_DATASET 规则(数据取自数据中台治理数据集)。本向导生成的是 Legacy SQL 规则,已不具备运行资格。可继续保存草稿,待该监控对象完成数据集治理与 Provider 上线后再建规则。"
|
|
|
+ title="当前无可用治理数据集"
|
|
|
+ description="S8 只能基于数据中台的治理数据集创建规则。当前没有任何「已定义且已上线 Provider」的数据集,因此无法生成可运行规则。可先保存草稿,待数据集治理完成后继续。"
|
|
|
/>
|
|
|
|
|
|
<el-alert
|
|
|
@@ -1116,6 +1129,24 @@ function handleInlineExceptionTypeCreated(payload: { typeCode: string; typeName:
|
|
|
<el-input v-model="draftName" placeholder="留空则自动生成" maxlength="128" show-word-limit />
|
|
|
<span class="wizard-hint">草稿名仅用于草稿配置列表展示,可随时修改</span>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="取数数据集" required>
|
|
|
+ <el-select
|
|
|
+ v-model="form.datasetCode"
|
|
|
+ placeholder="选择治理数据集"
|
|
|
+ style="width: 100%"
|
|
|
+ :no-data-text="datasets.length === 0 ? '当前无可用治理数据集' : '当前规则类型没有匹配的数据集'"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="d in datasetOptions"
|
|
|
+ :key="d.datasetCode"
|
|
|
+ :label="d.displayName ? `${d.displayName}(${d.datasetCode})` : d.datasetCode"
|
|
|
+ :value="d.datasetCode"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ <span class="wizard-hint">
|
|
|
+ 只列出已上线 Provider、且支持当前报警机制的数据集。S8 不再连接物理数据源,取数一律经数据中台。
|
|
|
+ </span>
|
|
|
+ </el-form-item>
|
|
|
<el-form-item required>
|
|
|
<template #label>
|
|
|
<S8FieldTooltip field-key="rule_code" fallback-label="规则编码" />
|
|
|
@@ -1149,23 +1180,13 @@ function handleInlineExceptionTypeCreated(payload: { typeCode: string; typeName:
|
|
|
<el-button @click="visible = false">取消</el-button>
|
|
|
<el-button :loading="savingDraft" @click="saveDraft">保存草稿</el-button>
|
|
|
<el-button v-if="step < 4" type="primary" @click="nextStep">下一步</el-button>
|
|
|
- <!--
|
|
|
- S8-LEGACY-RUNTIME-RETIREMENT-1:向导的自动规则生成能力已停用。
|
|
|
- 该路径生成的是 LEGACY_SQL 规则(服务端按字典拼 SQL + 绑定 ado_s8_data_source),
|
|
|
- 而 STANDARD_DATASET 已成为唯一允许运行的取数模式,生成出来的规则永远无法启用。
|
|
|
- 后端 S8RuleCreationPolicy 已硬拒(这才是真正的门),此处只是把结论提前告诉用户,
|
|
|
- 避免走完五步表单才在最后一步吃报错。
|
|
|
- 草稿保存与 MANUAL_REPORT 模板路径均不受影响,故只禁用本按钮、不下线整个向导。
|
|
|
- -->
|
|
|
- <el-tooltip
|
|
|
+ <el-button
|
|
|
v-else
|
|
|
- content="向导不再生成 Legacy SQL 规则。S8 仅运行 STANDARD_DATASET 规则,需先在数据中台完成该监控对象的数据集治理与 Provider 上线。"
|
|
|
- placement="top"
|
|
|
- >
|
|
|
- <span>
|
|
|
- <el-button type="primary" disabled @click="generateRuleFromDraft">生成正式规则(已停用)</el-button>
|
|
|
- </span>
|
|
|
- </el-tooltip>
|
|
|
+ type="primary"
|
|
|
+ :loading="saving"
|
|
|
+ :disabled="dictionaryMissing || datasetOptions.length === 0"
|
|
|
+ @click="generateRuleFromDraft"
|
|
|
+ >生成正式规则</el-button>
|
|
|
</template>
|
|
|
</template>
|
|
|
</el-dialog>
|