diff --git a/app/(admin)/settings/agent-workflow/agent-workflow-settings-client.tsx b/app/(admin)/settings/agent-workflow/agent-workflow-settings-client.tsx index dc53dd505..2e198b6ff 100644 --- a/app/(admin)/settings/agent-workflow/agent-workflow-settings-client.tsx +++ b/app/(admin)/settings/agent-workflow/agent-workflow-settings-client.tsx @@ -58,8 +58,10 @@ import { getAgentWorkflowSpecialModuleRootOptions, getEnabledAgentWorkflowOptionTree, getAgentWorkflowCategoryLabels, + getAgentWorkflowBusinessModeSettings, getAgentWorkflowConstraintSettings, getAgentWorkflowPageFeatureSettings, + normalizeAgentWorkflowBusinessModeSettings, normalizeAgentWorkflowOptionOrdering, flattenAgentWorkflowSteps, normalizeAgentWorkflowStepOrdering, @@ -129,6 +131,8 @@ import type { AgentPresetLibraryConfig, AgentPsdTextColorBrandConfig, AgentPresetLibrarySection, + AgentWorkflowBusinessModeConfig, + AgentWorkflowBusinessModeKey, AgentWorkflowBrandModelConfig, AgentWorkflowBrandStoreEntry, AgentWorkflowCategoryLabels, @@ -2046,6 +2050,10 @@ export function AgentWorkflowSettingsClient({ () => getAgentWorkflowPageFeatureSettings(config), [config] ); + const workflowBusinessModeSettings = useMemo( + () => getAgentWorkflowBusinessModeSettings(config), + [config] + ); const firstCategoryLabel = categoryLabels.firstCategory; const secondCategoryLabel = categoryLabels.secondCategory; const thirdCategoryLabel = categoryLabels.thirdCategory; @@ -3535,6 +3543,61 @@ export function AgentWorkflowSettingsClient({ } }; + const updateBusinessMode = ( + modeKey: AgentWorkflowBusinessModeKey, + updater: (current: AgentWorkflowBusinessModeConfig) => AgentWorkflowBusinessModeConfig + ) => { + setConfig((prev) => { + const currentSettings = normalizeAgentWorkflowBusinessModeSettings( + prev.businessModeSettings + ); + return { + ...prev, + businessModeSettings: { + modes: currentSettings.modes.map((mode) => + mode.key === modeKey ? updater(mode) : mode + ), + }, + }; + }); + }; + + const handleUploadBusinessModeSvg = async ( + modeKey: AgentWorkflowBusinessModeKey, + file: File + ) => { + const isSvg = + file.type === "image/svg+xml" || file.name.toLowerCase().endsWith(".svg"); + if (!isSvg) { + toast.error("请上传 SVG 图标"); + return; + } + + const refKey = `business-mode:${modeKey}`; + try { + setUploadingKey(refKey); + const formData = new FormData(); + formData.append("file", file); + + const response = await fetchUploadWithRetry(formData); + const result = await response.json(); + + if (!response.ok || !result?.url) { + throw new Error(result?.error || "上传失败"); + } + + updateBusinessMode(modeKey, (mode) => ({ + ...mode, + customSvgUrl: result.url, + })); + toast.success("SVG 图标上传成功"); + } catch (error) { + toast.error(error instanceof Error ? error.message : "SVG 图标上传失败"); + } finally { + setUploadingKey(null); + } + }; + const updateSelectedBrandPsdTextColorConfig = ( updater: (current: AgentPsdTextColorBrandConfig | AgentPsdTextColorConfig) => { enabled: boolean; @@ -5654,7 +5717,7 @@ export function AgentWorkflowSettingsClient({ onChange={(e) => setShowcaseConfig((prev) => ({ ...prev, subtitle: e.target.value })) } - placeholder="选择生图模式、查询商品图、完成风格配置并实时查看结果" + placeholder="选择品牌、配置风格化提示词、选择生图模式并查看结果" /> @@ -5866,7 +5929,7 @@ export function AgentWorkflowSettingsClient({
前台流程功能开关 - 控制风格化页面是否展示选择生图模式、选择 SPU / SKU 和套 PSD 模板入口 + 控制风格化页面是否展示固定生图模式、素材选择和套 PSD 模板入口
@@ -5874,9 +5937,9 @@ export function AgentWorkflowSettingsClient({
-
开启第一步:选择生图模式
+
开启固定生图模式
- 关闭后前台不再要求选择生图模式,直接进入后续配置并选择模型生图。 + 关闭后前台不展示主图/SKU图、详情和买家秀模式入口,直接进入后续配置并选择模型生图。
-
开启第二步:选择 SPU / SKU
+
开启素材选择
关闭后前台跳过商品素材搜索,不再强制补齐 SPU / SKU 输入图槽位。
@@ -5963,6 +6026,177 @@ export function AgentWorkflowSettingsClient({ + + + +
+
+ +
+
+ 风格化固定模式配置 + + 前台固定展示主图/SKU图、详情和买家秀三个业务模式;图标优先使用管理员上传的 SVG。 + +
+
+
+ + {workflowBusinessModeSettings.modes.map((mode) => { + const refKey = `business-mode:${mode.key}`; + const isUploading = uploadingKey === refKey; + const Icon = + mode.key === "detail" + ? Layers + : mode.key === "buyer_show" + ? UserCircle + : Package; + + return ( +
+
+
+
+ {mode.customSvgUrl ? ( + {mode.title} + ) : ( + + )} +
+
+
{mode.title}
+
+ {mode.key === "buyer_show" ? "预留模块" : "已接入前台入口"} +
+
+
+ + updateBusinessMode(mode.key, (current) => ({ + ...current, + enabled: checked, + })) + } + /> +
+ +
+ + + updateBusinessMode(mode.key, (current) => ({ + ...current, + title: event.target.value, + })) + } + /> +
+ +
+ +