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

fix(s7): 审批中心 FQC 待办按节点导向专用业务入口,封死通用审批旁路

Phase 1I:S7_FQC_INSPBILL 待办在审批中心不再暴露 ApprovalFlow 通用 Approve/Reject,
按 nodeId 精确分流到既有专用业务入口(业务动作仍由 FQC 专用 API 执行):
- PendingList.vue:bizType==='S7_FQC_INSPBILL' 精确分支——N1_INSPECT→「去录入」(insp-detail页,
  受jyfzr负责人门保护)、N2_SUP_REVIEW→「去审核」、N3_QE_DISPOSITION→「去处置」(后两者跳
  result-list?openBillId 自动打开现有详情抽屉,由flowState显 supervisor-*/qe-submit-disposition);
  未知FQC节点 fail-closed「请进入FQC业务模块处理」;隐藏通用同意/拒绝。非FQC分支未动
- fqcInspectionResultList.vue:onMounted 读 ?openBillId 自动打开该检验单现有详情抽屉

实测 I1-I8 PASS(N1去录入/N2去审核/N3去处置各自跳转+复用现有抽屉+无通用同意拒绝),
I9非FQC无回归/I10未知节点fail-closed 静态确认。

Known limitation:合法Assignee直连ApprovalFlow通用API仍无引擎级veto(需后续通用加固,非本批)。

chore: bump version Web 2.4.312
YY968XX 2 дней назад
Родитель
Сommit
51c1cb6d0e

+ 1 - 1
Web/package.json

@@ -1,7 +1,7 @@
 {
 	"name": "admin.net",
 	"type": "module",
-	"version": "2.4.311",
+	"version": "2.4.312",
 	"packageManager": "pnpm@10.32.1",
 	"lastBuildTime": "2026.03.15",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",

+ 6 - 1
Web/src/views/aidop/s7/fqc/fqcInspectionResultList.vue

@@ -273,7 +273,12 @@ function resetQuery() {
 	loadList();
 }
 
-onMounted(() => loadList());
+onMounted(async () => {
+	await loadList();
+	// 审批中心 FQC 待办「去审核/去处置」跳入:带 openBillId 时自动打开该检验单详情抽屉(主管审核/QE处置由 flowState 决定)
+	const openId = Number(route.query.openBillId);
+	if (openId > 0) openDetail({ id: openId } as FqcResultRow);
+});
 onActivated(() => loadList());
 </script>
 

+ 16 - 0
Web/src/views/approvalFlow/center/components/PendingList.vue

@@ -31,6 +31,14 @@
 					<template v-if="row.bizType === 'EXCEPTION_REPORT' || row.bizType === 'EXCEPTION_CLOSURE'">
 						<el-text type="info" size="small">请进入异常详情处理</el-text>
 					</template>
+					<template v-else-if="row.bizType === 'S7_FQC_INSPBILL'">
+						<!-- FQC 业务任务节点:按 nodeId 跳专用业务入口,隐藏通用同意/拒绝,杜绝业务动作旁路;未知节点 fail-closed -->
+						<el-button v-if="row.nodeId === 'N1_INSPECT'" size="small" type="primary" text @click="goToFqc('inspect', row.bizId)">去录入</el-button>
+						<el-button v-else-if="row.nodeId === 'N2_SUP_REVIEW'" size="small" type="primary" text @click="goToFqc('review', row.bizId)">去审核</el-button>
+						<el-button v-else-if="row.nodeId === 'N3_QE_DISPOSITION'" size="small" type="primary" text @click="goToFqc('disposition', row.bizId)">去处置</el-button>
+						<el-text v-else type="info" size="small">请进入 FQC 业务模块处理</el-text>
+						<el-button size="small" text @click="emit('timeline', row)">详情</el-button>
+					</template>
 					<template v-else>
 						<el-button v-if="row.bizType === 'ORDER_CHANGE_REVIEW'" size="small" type="primary" text @click="emit('viewBiz', row)">查看变更单</el-button>
 						<el-button size="small" type="success" text @click="emit('approve', row)">同意</el-button>
@@ -81,6 +89,14 @@ async function goToException(bizId: number | string) {
 	router.push(`/aidop/s8/exceptions/${bizId}`);
 }
 
+// FQC(S7_FQC_INSPBILL) 待办按节点跳专用业务入口,不调 ApprovalFlow 通用 Approve/Reject:
+// N1 去录入 → 检验单录入页(受 jyfzr 负责人门保护);N2/N3 去审核/去处置 → 结果列表自动打开详情抽屉,
+// 由 flowState 决定显示 主管通过/退回(supervisor-*) 或 QE处置(qe-submit-disposition)。业务动作全走 FQC 专用 API。
+function goToFqc(action: 'inspect' | 'review' | 'disposition', bizId: number | string) {
+	if (action === 'inspect') router.push(`/aidop/s7/fqc/insp-detail?id=${bizId}`);
+	else router.push(`/aidop/s7/fqc/result-list?openBillId=${bizId}`);
+}
+
 defineProps<{ data: any[]; loading: boolean }>();
 const emit = defineEmits<{
 	(e: 'approve', row: any): void;