From 975ecee94acf878cd97823508391e4185f7a68ed Mon Sep 17 00:00:00 2001 From: WuYongJie Date: Sun, 12 Jul 2026 09:35:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(intake):=20=E7=A1=AE=E8=AE=A4=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=85=88=E4=BF=9D=E5=AD=98=E5=86=8D=E6=89=93=E5=8B=BE?= =?UTF-8?q?=EF=BC=8CSKU=E6=9C=AA=E5=85=A5=E5=BA=93=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tegratedWorkflowConfirmActionController.ts | 29 ++++++++++--------- .../useProductFactoryRowController.ts | 24 ++++++++------- .../intake-non-integrated-scope.service.ts | 27 +++++++++++++++++ 3 files changed, 57 insertions(+), 23 deletions(-) diff --git a/furniture-3d-system/src/app/intake/non-integrated/useNonIntegratedWorkflowConfirmActionController.ts b/furniture-3d-system/src/app/intake/non-integrated/useNonIntegratedWorkflowConfirmActionController.ts index b2f15bc5..c000c34e 100644 --- a/furniture-3d-system/src/app/intake/non-integrated/useNonIntegratedWorkflowConfirmActionController.ts +++ b/furniture-3d-system/src/app/intake/non-integrated/useNonIntegratedWorkflowConfirmActionController.ts @@ -189,6 +189,22 @@ export function useNonIntegratedWorkflowConfirmActionController({ } } + const saved = await persistEditedProduct({ + successMessage: `${getDocumentWorkspaceCategoryLabel(category)}已确认`, + errorFallbackMessage: `${getDocumentWorkspaceCategoryLabel(category)}确认保存失败,请稍后再试`, + overrides: { + documentWorkspaceConfirmations: nextConfirmations, + documentWorkspaceApprovedAt: nextApprovedAt, + ...(nextReviewRounds ? { reviewRounds: nextReviewRounds } : {}), + ...(nextFinishedSampleShipmentRows + ? { finishedSampleShipmentRows: nextFinishedSampleShipmentRows } + : {}), + }, + }); + if (!saved) { + return; + } + // 保存成功后才更新页面状态(先保存再打勾,避免失败时页面显示已确认) setDocumentWorkspaceConfirmations(nextConfirmations); setDocumentWorkspaceApprovedAt(nextApprovedAt); if (nextReviewRounds) { @@ -216,19 +232,6 @@ export function useNonIntegratedWorkflowConfirmActionController({ }; } } - - await persistEditedProduct({ - successMessage: `${getDocumentWorkspaceCategoryLabel(category)}已确认`, - errorFallbackMessage: `${getDocumentWorkspaceCategoryLabel(category)}确认保存失败,请稍后再试`, - overrides: { - documentWorkspaceConfirmations: nextConfirmations, - documentWorkspaceApprovedAt: nextApprovedAt, - ...(nextReviewRounds ? { reviewRounds: nextReviewRounds } : {}), - ...(nextFinishedSampleShipmentRows - ? { finishedSampleShipmentRows: nextFinishedSampleShipmentRows } - : {}), - }, - }); } async function handleConfirmDocumentWorkspaceCategory( diff --git a/furniture-3d-system/src/app/intake/non-integrated/workspaces/product-factory/useProductFactoryRowController.ts b/furniture-3d-system/src/app/intake/non-integrated/workspaces/product-factory/useProductFactoryRowController.ts index 9fb0222a..6f41a711 100644 --- a/furniture-3d-system/src/app/intake/non-integrated/workspaces/product-factory/useProductFactoryRowController.ts +++ b/furniture-3d-system/src/app/intake/non-integrated/workspaces/product-factory/useProductFactoryRowController.ts @@ -292,16 +292,7 @@ export function useProductFactoryRowController({ delete nextApprovedAt[PRODUCT_FACTORY_WORKSPACE_CATEGORY]; } - setFactoryRows(nextRows); - setDocumentWorkspaceConfirmations(nextConfirmations); - setDocumentWorkspaceApprovedAt(nextApprovedAt); - if (documentWorkspaceRevisionSignatureRef.current) { - documentWorkspaceRevisionSignatureRef.current = { - ...documentWorkspaceRevisionSignatureRef.current, - [PRODUCT_FACTORY_WORKSPACE_CATEGORY]: JSON.stringify(nextRows), - }; - } - await persistEditedProduct({ + const saved = await persistEditedProduct({ successMessage: allRowsConfirmed ? "产品定厂已确认" : "当前批次产品定厂已确认", @@ -314,6 +305,19 @@ export function useProductFactoryRowController({ targetSkuIds: Array.from(targetSkuIds), }, }); + if (!saved) { + return; + } + // 保存成功后才更新页面状态(先保存再打勾,避免失败时页面显示已确认) + setFactoryRows(nextRows); + setDocumentWorkspaceConfirmations(nextConfirmations); + setDocumentWorkspaceApprovedAt(nextApprovedAt); + if (documentWorkspaceRevisionSignatureRef.current) { + documentWorkspaceRevisionSignatureRef.current = { + ...documentWorkspaceRevisionSignatureRef.current, + [PRODUCT_FACTORY_WORKSPACE_CATEGORY]: JSON.stringify(nextRows), + }; + } return; } diff --git a/furniture-3d-system/src/server/services/intake-non-integrated-scope.service.ts b/furniture-3d-system/src/server/services/intake-non-integrated-scope.service.ts index 2c6c0964..cc099f39 100644 --- a/furniture-3d-system/src/server/services/intake-non-integrated-scope.service.ts +++ b/furniture-3d-system/src/server/services/intake-non-integrated-scope.service.ts @@ -56,6 +56,21 @@ function readText(value: unknown) { return typeof value === 'string' ? value.trim() : '' } +function findMissingTargetSkuItemIds( + record: IntakeNonIntegratedPermissionTarget, + targetSkuItemIds?: readonly string[], +) { + const targetIds = Array.from( + new Set((targetSkuItemIds ?? []).map(readText).filter(Boolean)), + ) + if (targetIds.length === 0) return [] + + const savedSkuItemIds = new Set( + (record.skuItems ?? []).map((item) => readText(item.skuItemId)).filter(Boolean), + ) + return targetIds.filter((skuItemId) => !savedSkuItemIds.has(skuItemId)) +} + function readPayloadField(payload: unknown, key: string) { return isRecord(payload) ? readText(payload[key]) : '' } @@ -476,6 +491,18 @@ class IntakeNonIntegratedScopeService { category?: string | null, targetSkuItemIds?: readonly string[], ): Promise { + // 先检查 SKU 是否已入库,不存在直接提示"SKU 尚未保存",不要报"没有权限" + const missingTargetSkuItemIds = + category === PRODUCT_FACTORY_WORKSPACE_CATEGORY + ? findMissingTargetSkuItemIds(record, targetSkuItemIds) + : [] + if (missingTargetSkuItemIds.length > 0) { + throw new AppError( + ErrorCode.VALIDATION_FAILED, + 'SKU 尚未保存,请先保存基础信息后再确认产品定厂', + ) + } + if ( await this.canWriteWorkspaceRecordWithSettings( record,