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

fix(s8): localize config ui labels for demo

S8-CONFIG-UI-LABEL-CLEANUP-1:演示路径英文枚举/状态值中文化(仅展示层)。

WatchRule 配置页:
- 新增 lastStatusLabel(status),列表 last_status 列展示由原 SUCCESS/FAILED/SKIPPED → 成功/失败/跳过

异常列表 / 详情:
- 规则类型筛选下拉 label OUT_OF_RANGE/TIMEOUT/SHORTAGE → 阈值越界/超时/短缺(value 仍为枚举)
- 列表与详情的规则类型 tag 改走 ruleTypeLabel(),统一中文展示

零后端 / DB / Entity / API 字段名改动。
保存逻辑零接触:只改调度仍只调 /schedule,只改 params 仍只调 /params,无变化仍 0 请求,params_json 字节级不变。

验证:
- Chrome MCP 三页全部中文化通过;Console 0 error/warn;Network 0 5xx
- SQL 守恒:baseline=3;rule 10/11/12 enabled=1,rule_type/expression/params_json 不变
- vue-tsc 改动文件 0 error;pnpm run build ✓ built in 46.60s

journal:lwb/journals/2026-04-28-S8-config-ui-label-cleanup.md(外层 lwb)
YY968XX 2 месяцев назад
Родитель
Сommit
138cbda08f

+ 10 - 1
Web/src/views/aidop/s8/config/S8WatchRuleConfigPage.vue

@@ -446,6 +446,15 @@ function lastStatusTagType(status: string | null | undefined): 'success' | 'dang
 		default: return '';
 	}
 }
+// S8-CONFIG-UI-LABEL-CLEANUP-1:状态枚举中文化(仅展示层;DB 字段值不变)。
+function lastStatusLabel(status: string | null | undefined): string {
+	switch ((status ?? '').toUpperCase()) {
+		case 'SUCCESS': return '成功';
+		case 'FAILED': return '失败';
+		case 'SKIPPED': return '跳过';
+		default: return status ?? '—';
+	}
+}
 function nextRunDisplay(row: S8WatchRuleConfigRow) {
 	if (isPaused(row)) return '已暂停';
 	if (isRunning(row)) return '执行中';
@@ -528,7 +537,7 @@ onDeactivated(() => stopAutoRefresh());
 			</el-table-column>
 			<el-table-column label="上次状态" width="100">
 				<template #default="{ row }">
-					<el-tag v-if="row.lastStatus" :type="lastStatusTagType(row.lastStatus)" size="small">{{ row.lastStatus }}</el-tag>
+					<el-tag v-if="row.lastStatus" :type="lastStatusTagType(row.lastStatus)" size="small">{{ lastStatusLabel(row.lastStatus) }}</el-tag>
 					<span v-else>—</span>
 				</template>
 			</el-table-column>

+ 13 - 4
Web/src/views/aidop/s8/exceptions/S8ExceptionListPage.vue

@@ -26,9 +26,9 @@
 			</el-form-item>
 			<el-form-item label="规则类型">
 				<el-select v-model="query.ruleType" clearable placeholder="全部" style="width: 150px">
-					<el-option label="OUT_OF_RANGE" value="OUT_OF_RANGE" />
-					<el-option label="TIMEOUT" value="TIMEOUT" />
-					<el-option label="SHORTAGE" value="SHORTAGE" />
+					<el-option label="阈值越界" value="OUT_OF_RANGE" />
+					<el-option label="超时" value="TIMEOUT" />
+					<el-option label="短缺" value="SHORTAGE" />
 				</el-select>
 			</el-form-item>
 			<el-form-item label="恢复状态">
@@ -78,7 +78,7 @@
 			</el-table-column>
 			<el-table-column label="规则类型" width="130" align="center">
 				<template #default="{ row }">
-					<el-tag v-if="row.ruleType" :type="ruleTypeTagType(row.ruleType)" size="small">{{ row.ruleType }}</el-tag>
+					<el-tag v-if="row.ruleType" :type="ruleTypeTagType(row.ruleType)" size="small">{{ ruleTypeLabel(row.ruleType) }}</el-tag>
 					<el-tag v-else-if="!row.exceptionTypeCode" type="info" size="small">未分类</el-tag>
 					<span v-else>-</span>
 				</template>
@@ -170,6 +170,15 @@ function ruleTypeTagType(t: string | null | undefined) {
 			return 'info';
 	}
 }
+// S8-CONFIG-UI-LABEL-CLEANUP-1:规则类型枚举中文化(仅展示层)。
+function ruleTypeLabel(t: string | null | undefined) {
+	switch ((t ?? '').toUpperCase()) {
+		case 'OUT_OF_RANGE': return '阈值越界';
+		case 'TIMEOUT': return '超时';
+		case 'SHORTAGE': return '短缺';
+		default: return t ?? '—';
+	}
+}
 
 async function loadFilters() {
 	const fo = (await s8ExceptionApi.filterOptions()) as {

+ 10 - 1
Web/src/views/aidop/s8/exceptions/S8TaskDetailPage.vue

@@ -177,6 +177,15 @@ function ruleTypeTagType(t: string | null | undefined) {
 			return 'info';
 	}
 }
+// S8-CONFIG-UI-LABEL-CLEANUP-1:规则类型枚举中文化(仅展示层)。
+function ruleTypeLabel(t: string | null | undefined) {
+	switch ((t ?? '').toUpperCase()) {
+		case 'OUT_OF_RANGE': return '阈值越界';
+		case 'TIMEOUT': return '超时';
+		case 'SHORTAGE': return '短缺';
+		default: return t ?? '—';
+	}
+}
 
 onMounted(async () => {
 	await loadDetail();
@@ -243,7 +252,7 @@ onMounted(async () => {
 						<template #header>规则检测信息</template>
 						<el-descriptions :column="3" border>
 							<el-descriptions-item label="规则类型">
-								<el-tag v-if="detail.ruleType" :type="ruleTypeTagType(detail.ruleType)" size="small">{{ detail.ruleType }}</el-tag>
+								<el-tag v-if="detail.ruleType" :type="ruleTypeTagType(detail.ruleType)" size="small">{{ ruleTypeLabel(detail.ruleType) }}</el-tag>
 								<span v-else>—</span>
 							</el-descriptions-item>
 							<el-descriptions-item label="规则编码">{{ detail.sourceRuleCode || '—' }}</el-descriptions-item>