|
|
@@ -96,6 +96,14 @@ const selectedWorkflowStatuses = ref<string[]>([]);
|
|
|
const selectedStageKeys = ref<OrderNodeKey[]>([]);
|
|
|
const activeStageKey = ref<OrderNodeKey | null>(null);
|
|
|
|
|
|
+// 订单评审下钻:当前激活的 L2 名称,默认意见评审作为入口默认。
|
|
|
+// reviewSubSteps 切换(订单/筛选变化)时若 activeSubstepName 不在新集合中,watch 守门 fallback。
|
|
|
+const activeSubstepName = ref<string>('意见评审');
|
|
|
+
|
|
|
+function onSubstepSelect(name: string) {
|
|
|
+ activeSubstepName.value = name;
|
|
|
+}
|
|
|
+
|
|
|
const filteredChainOrders = computed<SalesOrderExecution[]>(() => {
|
|
|
const orderNoSet = new Set(selectedOrderNos.value);
|
|
|
const ctSet = new Set(selectedCustomerTypes.value);
|
|
|
@@ -175,7 +183,8 @@ const reviewSubSteps = computed<SubStepDetail[]>(() => {
|
|
|
return aggregateByIndex(ordersSubSteps);
|
|
|
});
|
|
|
|
|
|
-// L3 三态:baseline → PPT 常量;单订单 → 该订单自身意见评审 breakdown;多订单 → filteredChainOrders 逐位 avg。
|
|
|
+// L3 三态:baseline → PPT 常量(默认意见评审快照);单订单 → 该订单当前激活 L2 的 breakdown;
|
|
|
+// 多订单 → filteredChainOrders 对当前激活 L2 逐位 avg。
|
|
|
const opinionBreakdown = computed<SubStepDetail[]>(() => {
|
|
|
if (activeStageKey.value !== 'order_review') return [];
|
|
|
if (isUnfiltered.value) return PPT_OPINION_DRILLDOWN;
|
|
|
@@ -184,7 +193,7 @@ const opinionBreakdown = computed<SubStepDetail[]>(() => {
|
|
|
(o) =>
|
|
|
o.lifecycle
|
|
|
.find((s) => s.key === 'order_review')
|
|
|
- ?.subSteps?.find((ss) => ss.name === '意见评审')?.breakdown,
|
|
|
+ ?.subSteps?.find((ss) => ss.name === activeSubstepName.value)?.breakdown,
|
|
|
)
|
|
|
.filter((x): x is SubStepDetail[] => Array.isArray(x) && x.length > 0);
|
|
|
if (ordersBreakdowns.length === 0) return [];
|
|
|
@@ -192,6 +201,18 @@ const opinionBreakdown = computed<SubStepDetail[]>(() => {
|
|
|
return aggregateByIndex(ordersBreakdowns);
|
|
|
});
|
|
|
|
|
|
+// reviewSubSteps 变化守门:若 activeSubstepName 不在当前可见 L2 集合中,fallback 到第一个 L2 或意见评审。
|
|
|
+watch(
|
|
|
+ () => reviewSubSteps.value,
|
|
|
+ (next) => {
|
|
|
+ if (next.length === 0) return;
|
|
|
+ const names = next.map((s) => s.name);
|
|
|
+ if (!names.includes(activeSubstepName.value)) {
|
|
|
+ activeSubstepName.value = next[0]?.name ?? '意见评审';
|
|
|
+ }
|
|
|
+ },
|
|
|
+);
|
|
|
+
|
|
|
const showReviewSubSteps = computed(
|
|
|
() => activeStageKey.value === 'order_review' && reviewSubSteps.value.length > 0,
|
|
|
);
|
|
|
@@ -378,12 +399,14 @@ watch(
|
|
|
<ReviewSubStepsCard
|
|
|
v-if="showReviewSubSteps"
|
|
|
:sub-steps="reviewSubSteps"
|
|
|
+ :active-name="activeSubstepName"
|
|
|
title="节点详情:评审 / 排产 / 测算"
|
|
|
+ @select="onSubstepSelect"
|
|
|
/>
|
|
|
<ReviewBreakdownCard
|
|
|
v-if="showBreakdown"
|
|
|
:breakdown="opinionBreakdown"
|
|
|
- title="意见评审 — 详细执行明细"
|
|
|
+ :title="`${activeSubstepName} — 涉及部门 / 组`"
|
|
|
/>
|
|
|
<DesignDetailPanel v-if="showDesignDetail" :detail="DESIGN_DETAIL_FIXTURE" />
|
|
|
<ProcurementDetailPanel
|
|
|
@@ -437,12 +460,14 @@ watch(
|
|
|
<ReviewSubStepsCard
|
|
|
v-if="showReviewSubSteps"
|
|
|
:sub-steps="reviewSubSteps"
|
|
|
+ :active-name="activeSubstepName"
|
|
|
title="节点详情:评审 / 排产 / 测算"
|
|
|
+ @select="onSubstepSelect"
|
|
|
/>
|
|
|
<ReviewBreakdownCard
|
|
|
v-if="showBreakdown"
|
|
|
:breakdown="opinionBreakdown"
|
|
|
- title="意见评审 — 详细执行明细"
|
|
|
+ :title="`${activeSubstepName} — 涉及部门 / 组`"
|
|
|
/>
|
|
|
<DesignDetailPanel v-if="showDesignDetail" :detail="DESIGN_DETAIL_FIXTURE" />
|
|
|
<ProcurementDetailPanel
|