fix(intake): 确认节点先保存再打勾,SKU未入库提示修正

This commit is contained in:
WuYongJie 2026-07-12 09:35:48 +08:00
parent bfcc1bdc39
commit 975ecee94a
3 changed files with 57 additions and 23 deletions

View File

@ -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(

View File

@ -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;
}

View File

@ -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<void> {
// 先检查 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,