From f659ddfcf0f1dad0db4dc1de86c7dde466523d98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 23 Sep 2026 14:02:57 +0800 Subject: [PATCH] =?UTF-8?q?3D=20=E7=94=9F=E6=88=90=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=93=E8=B7=9F=E9=9A=8F=E5=B9=B3=E5=9D=A6?= =?UTF-8?q?=E8=90=BD=E7=82=B9=E5=A5=91=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - buildModel3dSubmissionPlan 不再拼 tagged target,把 projectId 与 canvasCompletion 直接摊进请求体;画布链路仍只落项目资源。 - submitModel3dGenerationRequest 的提交体注释同步落点字段改名。 - 请求体、幂等键与排队用例改为断言扁平落点字段。 - 定向验证:npx vitest run src/components/image-editor/model3d-generation src/components/image-editor/model3d-preview(63 passed)、npm run typecheck 通过。 --- .../Model3dGenerationSubmission.test.ts | 15 ++++++--------- .../Model3dGenerationSubmission.ts | 10 +++++----- .../useModel3dGenerationTask.test.tsx | 2 +- src/services/image-editor/editorProjectClient.ts | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts b/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts index 08c12bb1c..94e1e5b7f 100644 --- a/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts +++ b/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.test.ts @@ -138,11 +138,8 @@ describe('buildModel3dSubmissionPlan', () => { smartLowPoly: false, generateParts: false, }, - target: { - kind: 'projectResource', - projectId: 'project-1', - canvasCompletion: CANVAS_COMPLETION, - }, + projectId: 'project-1', + canvasCompletion: CANVAS_COMPLETION, }); }); @@ -172,7 +169,7 @@ describe('buildModel3dSubmissionPlan', () => { smartLowPoly: false, generateParts: true, }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }); expect(result.plan.body).not.toHaveProperty('prompt'); // 后端显式拒绝 texture=false + textureQuality 的组合,缺位是契约要求。 @@ -322,7 +319,7 @@ describe('Idempotency-Key', () => { endpoint: 'text-to-model', body: { generation: { model: 'v3.1-20260211', prompt: '木椅' }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }, }), ).toMatch(/^[\x21-\x7e]{1,128}$/); @@ -334,7 +331,7 @@ describe('Idempotency-Key', () => { endpoint: 'text-to-model', body: { generation: { texture: true, model: 'v3.1-20260211', prompt: '木椅' }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }, }); const right = resolveModel3dRequestKey({ @@ -342,7 +339,7 @@ describe('Idempotency-Key', () => { endpoint: 'text-to-model', body: { generation: { model: 'v3.1-20260211', texture: true, prompt: '木椅' }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }, }); expect(right).toBe(left); diff --git a/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts b/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts index f5d894301..e218c83e5 100644 --- a/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts +++ b/src/components/image-editor/model3d-generation/Model3dGenerationSubmission.ts @@ -1,7 +1,6 @@ import type { ExternalGenerationJobStatusRecord } from '../../../../packages/shared/src/contracts/externalGeneration'; import type { Model3dGenerationSource, - Model3dGenerationTarget, Model3dImageToModelRequest, Model3dTextToModelRequest, } from '../../../../packages/shared/src/contracts/model3d'; @@ -126,8 +125,9 @@ export function buildModel3dSubmissionPlan({ smartLowPoly: params.smartLowPoly, generateParts: params.generateParts, }; - const target: Model3dGenerationTarget = { - kind: 'projectResource', + // 落点与其它生成接口同形:平坦的可选字段,不再包一层 tagged enum。 + // 服务端按「二选一」校验:这里只给 projectId(画布链路没有落素材库的入口)。 + const placement = { projectId: trimmedProjectId, ...(canvasCompletion ? { canvasCompletion } : {}), }; @@ -153,14 +153,14 @@ export function buildModel3dSubmissionPlan({ if (!source) { return { ok: false, message: MODEL3D_IMAGE_SOURCE_REQUIRED_MESSAGE }; } - return finish({ source, generation, target }); + return finish({ source, generation, ...placement }); } const prompt = dialog.prompt.trim(); if (!prompt) { return { ok: false, message: MODEL3D_TEXT_PROMPT_REQUIRED_MESSAGE }; } - return finish({ generation: { ...generation, prompt }, target }); + return finish({ generation: { ...generation, prompt }, ...placement }); } /** diff --git a/src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx b/src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx index b10b6b038..4e28579f0 100644 --- a/src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx +++ b/src/components/image-editor/model3d-generation/useModel3dGenerationTask.test.tsx @@ -166,7 +166,7 @@ describe('useModel3dGenerationTask', () => { smartLowPoly: false, generateParts: false, }, - target: { kind: 'projectResource', projectId: 'project-1' }, + projectId: 'project-1', }); expect(applyQueuedGeneration).toHaveBeenCalledTimes(1); diff --git a/src/services/image-editor/editorProjectClient.ts b/src/services/image-editor/editorProjectClient.ts index 2e04bd5f6..040880d5f 100644 --- a/src/services/image-editor/editorProjectClient.ts +++ b/src/services/image-editor/editorProjectClient.ts @@ -1746,7 +1746,7 @@ export async function submitModel3dGenerationRequest({ idempotencyKey, }: { endpoint: Model3dPricingEndpoint; - // 提交体直接用端点契约:形状不符(缺 target、generation 结构错)在编译期就会暴露。 + // 提交体直接用端点契约:形状不符(落点缺失、generation 结构错)在编译期就会暴露。 body: Model3dTextToModelRequest | Model3dImageToModelRequest; idempotencyKey: string; }) {