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

fix(web): friendly ModelState error handling for B3

YY968XX 5 месяцев назад
Родитель
Сommit
afb06e864e

+ 5 - 1
Web/src/utils/axios-utils.ts

@@ -56,7 +56,11 @@ function extractResponseMessage(payload: unknown): string | undefined {
 		stringifyErrors(data.message) ||
 		stringifyErrors(data.title) ||
 		stringifyErrors(data.error) ||
-		stringifyErrors(data.detail)
+		stringifyErrors(data.detail) ||
+		// B3 修复:ASP.NET Core [ApiController] 默认 400 返回顶层 ModelState
+		// 字典格式(如 {"CompanyRefId":["公司不能为空"]}),上述 5 个业务字段
+		// 均未命中时,直接把整个 payload 作为 ModelState 展开。
+		stringifyErrors(data)
 	);
 }
 

+ 6 - 1
Web/src/utils/request.ts

@@ -52,7 +52,12 @@ function extractResponseMessage(payload: unknown): string | undefined {
 		stringifyErrors(data.message) ||
 		stringifyErrors(data.title) ||
 		stringifyErrors(data.error) ||
-		stringifyErrors(data.detail)
+		stringifyErrors(data.detail) ||
+		// B3 修复:ASP.NET Core [ApiController] 默认 400 返回顶层 ModelState
+		// 字典格式(如 {"CompanyRefId":["公司不能为空"]}),上述 5 个业务字段
+		// 均未命中时,直接把整个 payload 作为 ModelState 展开为"字段: 消息"文本,
+		// 避免降级到 axios 的 "Request failed with status code 400" 技术文案。
+		stringifyErrors(data)
 	);
 }
 

+ 6 - 1
Web/src/views/aidop/s0/manufacturing/RoutingList.vue

@@ -386,9 +386,10 @@ function buildPayload(): S0MfgRoutingOpDetailUpsert {
 }
 
 async function submitForm() {
-	await formRef.value?.validate();
 	saving.value = true;
 	try {
+		const valid = await formRef.value?.validate().catch(() => false);
+		if (!valid) return;
 		const payload = buildPayload();
 		if (editingId.value) {
 			await s0MfgRoutingOpDetailsApi.update(editingId.value, payload);
@@ -399,6 +400,10 @@ async function submitForm() {
 		}
 		dialogVisible.value = false;
 		await loadList();
+	} catch {
+		// B3-UI: 失败 toast 由全局 request interceptor 负责(extractResponseMessage + ElMessage.error),
+		// 此处仅吞掉 rejected promise,避免 Vue "Unhandled error during execution of component event handler"
+		// 与浏览器 "Uncaught (in promise)" 噪音。不在页面层重复造错误解析逻辑。
 	} finally {
 		saving.value = false;
 	}