From c80c06d2f745bfa84879c666268712973bc2327d Mon Sep 17 00:00:00 2001 From: WuYongJie Date: Mon, 17 Aug 2026 23:22:50 +0800 Subject: [PATCH] fix(bom-costing): preserve estimates after structure review --- .../BomCostingWorkbenchClient.test.tsx | 9 +- .../bom-costing/BomCostingWorkbenchClient.tsx | 32 ++++--- .../bom-costing-processing.service.test.ts | 90 +++++++++++++++++++ .../bom-costing-processing.service.ts | 30 +++++-- .../bom-costing-result-quality.test.ts | 46 +++++++--- .../bom-costing/bom-costing-result-quality.ts | 38 ++++---- 6 files changed, 192 insertions(+), 53 deletions(-) diff --git a/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.test.tsx b/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.test.tsx index 0c3010b7..4f25402b 100644 --- a/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.test.tsx +++ b/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.test.tsx @@ -1371,6 +1371,7 @@ describe('BomCostingWorkbenchClient', () => { costedSkuCount: 1, pendingSkuCount: 1, failedSkuCount: 1, + qualityWarningCount: 1, succeededSkuIds: ['sku-recalculate', 'sku-pending'], costedSkuIds: ['sku-recalculate'], pendingSkuIds: ['sku-pending'], @@ -1579,10 +1580,10 @@ describe('BomCostingWorkbenchClient', () => { '1/3 个 SKU 的预估已完成', ) expect(dynamicCostNotice).toHaveTextContent( - '其余 SKU 可按现有事实重新核算', + '失败规格 · 当前资料不足,暂无法预估', ) expect(dynamicCostNotice).toHaveTextContent( - '失败规格 · 当前资料不足,可补充结构或尺寸后重新核算', + '结构拆解差异已标记待复核,当前整件预估已保留', ) expect(screen.getByRole('alert', { name: '本轮批次部分完成,部分 SKU 暂无法预估', @@ -1592,14 +1593,14 @@ describe('BomCostingWorkbenchClient', () => { fireEvent.click(failedSkuButton) expect(screen.getAllByText('资料不足,暂无法预估').length).toBeGreaterThan(0) expect(screen.getByText( - '本轮未形成可用整件预估。已保留结构事实,可补充结构或尺寸后重新核算。', + '该规格暂未形成预估;当前结构与资料已保留。', )).toBeInTheDocument() expect(screen.queryByText('SKU 结构已就绪')).not.toBeInTheDocument() expect(screen.queryByText('约 ¥999.00')).not.toBeInTheDocument() fireEvent.click(screen.getByRole('button', { name: /待补价格规格/ })) expect(screen.getAllByText('待补成本').length).toBeGreaterThan(0) expect(screen.getByText( - '本轮该 SKU 的结构事实已保存;待补信息完善后可继续形成完整预估。', + '该规格仍在整理预估依据;当前结构与资料已保留。', )).toBeInTheDocument() expect(screen.queryByText('SKU 结构已就绪')).not.toBeInTheDocument() expect(screen.queryByText('约 ¥888.00')).not.toBeInTheDocument() diff --git a/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.tsx b/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.tsx index c01e418f..f8a6a5c8 100644 --- a/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.tsx +++ b/furniture-3d-system/src/app/bom-costing/BomCostingWorkbenchClient.tsx @@ -440,6 +440,7 @@ interface DynamicCostingCompletionNotice { pendingSkuCount: number failedSkuCount: number reviewSkuCount: number + qualityWarningCount: number succeededSkuIds: string[] costedSkuIds: string[] pendingSkuIds: string[] @@ -549,6 +550,7 @@ function parseDynamicCostingCompletionNotice( pendingSkuCount, failedSkuCount, reviewSkuCount: readPayloadNumber(payload.reviewSkuCount) ?? 0, + qualityWarningCount: readPayloadNumber(payload.qualityWarningCount) ?? 0, succeededSkuIds: readPayloadTextArray(payload.succeededSkuIds), costedSkuIds: readPayloadTextArray(payload.costedSkuIds), pendingSkuIds: readPayloadTextArray(payload.pendingSkuIds), @@ -1716,20 +1718,27 @@ function ResultCanvas({ {dynamicCompletionNotice && ( dynamicCompletionNotice.pendingSkuCount > 0 || dynamicCompletionNotice.failedSkuCount > 0 || - dynamicCompletionNotice.reviewSkuCount > 0 + dynamicCompletionNotice.reviewSkuCount > 0 || + dynamicCompletionNotice.qualityWarningCount > 0 ) ? (
0 ? 'alert' : 'status'} aria-label={dynamicCompletionNotice.failedSkuCount > 0 ? '本轮批次部分完成,部分 SKU 暂无法预估' - : '本轮批次部分完成'} + : dynamicCompletionNotice.qualityWarningCount > 0 + ? '本轮预估已完成,结构拆解待复核' + : '本轮批次部分完成'} data-testid="bom-dynamic-cost-partial-notice" >