Просмотр исходного кода

fix(s8): polish config lists for scene baseline

YY968XX 1 месяц назад
Родитель
Сommit
9825eef6b9

+ 5 - 1
Web/src/views/aidop/s8/components/config/S8CrudConfigPage.vue

@@ -42,6 +42,8 @@ const props = defineProps<{
 	loadOptions?: () => Promise<Record<string, OptionItem[]>>;
 	/** 基础必填校验通过后执行;返回非空字符串则提示并中止保存 */
 	validateFormExtra?: (form: Record<string, unknown>) => string | null;
+	/** 列表展示前的稳定排序钩子(不影响保存 payload;返回新数组)。 */
+	sortRows?: (rows: readonly Record<string, unknown>[]) => Record<string, unknown>[];
 }>();
 
 const loading = ref(false);
@@ -54,6 +56,8 @@ const form = reactive<Record<string, unknown>>(props.buildDefault());
 
 const idKey = computed(() => props.idKey ?? 'id');
 
+const displayRows = computed(() => (props.sortRows ? props.sortRows(rows.value) : rows.value));
+
 function resetForm() {
 	Object.keys(form).forEach((key) => delete form[key]);
 	Object.assign(form, props.buildDefault());
@@ -157,7 +161,7 @@ onMounted(() => {
 			<slot name="toolbar-extra" :reload="loadData" />
 		</div>
 
-		<el-table :data="rows" v-loading="loading" border stripe>
+		<el-table :data="displayRows" v-loading="loading" border stripe>
 			<el-table-column v-for="column in columns" :key="column.key" :prop="column.key" :label="column.label" :width="column.width" show-overflow-tooltip>
 				<template #default="{ row }">
 					<!-- BUG-27:enabled 等布尔列显示中文 tag,避免裸 true/false -->

+ 20 - 0
Web/src/views/aidop/s8/config/S8ExceptionTypeConfigPage.vue

@@ -85,6 +85,25 @@ async function loadOptions() {
 		roles: roles.map((item: any) => ({ label: item.roleCode, value: item.roleCode })),
 	};
 }
+
+// S8-CONFIG-POLISH-SCENE-RULE-LIST-1:列表按 S1→S7 / sort_no / type_code 稳定排序。
+// 仅展示层排序,不参与保存 payload;未在序列内的 scene 排到最末。
+const SCENE_ORDER = ['S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7'];
+function sceneIdx(code: unknown) {
+	const i = SCENE_ORDER.indexOf(String(code ?? ''));
+	return i >= 0 ? i : SCENE_ORDER.length;
+}
+function sortRows(rows: readonly Record<string, unknown>[]): Record<string, unknown>[] {
+	return [...rows].sort((a, b) => {
+		const sa = sceneIdx(a.sceneCode);
+		const sb = sceneIdx(b.sceneCode);
+		if (sa !== sb) return sa - sb;
+		const na = Number(a.sortNo ?? 0);
+		const nb = Number(b.sortNo ?? 0);
+		if (na !== nb) return na - nb;
+		return String(a.typeCode ?? '').localeCompare(String(b.typeCode ?? ''));
+	});
+}
 </script>
 
 <template>
@@ -96,5 +115,6 @@ async function loadOptions() {
 		:fields="fields"
 		:build-default="buildDefault"
 		:load-options="loadOptions"
+		:sort-rows="sortRows"
 	/>
 </template>

+ 19 - 0
Web/src/views/aidop/s8/config/S8WatchRuleConfigPage.vue

@@ -177,6 +177,22 @@ const formTitle = computed(() => {
 	return `编辑规则参数 — ${editingRow.value.ruleCode}`;
 });
 
+// S8-CONFIG-POLISH-SCENE-RULE-LIST-1:rule_code 展示层中文化(不进 DB / 不写 params_json)。
+// TEMP_SCHED_* 统一标注为"回归测试规则"。未命中映射的回退到 ruleCode 原值。
+const RULE_NAME_MAP: Record<string, string> = {
+	DEMO_ORDER_DELIVERY_TIMEOUT: '交付超时监控',
+	DEMO_ORDER_DIMENSION_OOR: '尺寸偏差监控',
+	DEMO_ORDER_YIELD_OOR: '良率不足监控',
+	DEMO_S2_WORKORDER_TIMEOUT: '工单延期监控模板',
+	DEMO_S3_PURCHASE_ETA_TIMEOUT: '供应商交期监控模板',
+};
+function watchRuleDisplayName(ruleCode: string | null | undefined): string {
+	const code = ruleCode ?? '';
+	if (RULE_NAME_MAP[code]) return RULE_NAME_MAP[code];
+	if (code.startsWith('TEMP_SCHED_')) return '回归测试规则';
+	return code || '—';
+}
+
 // A-01: OUT_OF_RANGE label changed from '数据超差' to '数值超限'
 const ruleTypeLabel = (t?: string | null) => {
 	switch ((t ?? '').toUpperCase()) {
@@ -704,6 +720,9 @@ onDeactivated(() => stopAutoRefresh());
 		<!-- A-02: updated labels; A-03: filteredRows + sceneCode/severity columns -->
 		<el-table v-loading="loading" :data="filteredRows" border stripe size="small">
 			<el-table-column prop="ruleCode" label="规则编码" width="180" />
+			<el-table-column label="规则名称" width="170" show-overflow-tooltip>
+				<template #default="{ row }">{{ watchRuleDisplayName(row.ruleCode) }}</template>
+			</el-table-column>
 			<el-table-column label="规则类型" width="100">
 				<template #default="{ row }">
 					<el-tag :type="row.ruleType ? 'success' : 'info'" size="small">