diff --git a/app/api/product-planning/analyze-image/route.ts b/app/api/product-planning/analyze-image/route.ts index b1fcbc14f..370708af4 100644 --- a/app/api/product-planning/analyze-image/route.ts +++ b/app/api/product-planning/analyze-image/route.ts @@ -2,6 +2,10 @@ import { generateText } from "ai"; import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { inlineVisionImages } from "@/lib/ai/vision-inline"; +import { + PRODUCT_PLANNING_ADVANCED_DISABLED, + PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE, +} from "@/lib/product-planning/advanced-disabled"; import { resolveProductPlanningVisionModel } from "@/lib/product-planning/model-runtime"; import { isProductPlanningEnabled, @@ -50,6 +54,10 @@ function buildImageAnalyzePrompt(params: { itemId: string; title?: string }) { } export async function POST(request: NextRequest) { + if (PRODUCT_PLANNING_ADVANCED_DISABLED) { + return jsonError(503, PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE); + } + const token = await getProductPlanningToken(request); if (!token?.sub) { return jsonError(401, "未登录"); diff --git a/app/api/product-planning/analyze-sku/route.ts b/app/api/product-planning/analyze-sku/route.ts index d2cbed9aa..7ef4fe50d 100644 --- a/app/api/product-planning/analyze-sku/route.ts +++ b/app/api/product-planning/analyze-sku/route.ts @@ -2,6 +2,10 @@ import { generateText } from "ai"; import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { buildProductPlanningSkuAnalyzePrompt } from "@/lib/product-planning/analyze"; +import { + PRODUCT_PLANNING_ADVANCED_DISABLED, + PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE, +} from "@/lib/product-planning/advanced-disabled"; import { resolveProductPlanningTextModel } from "@/lib/product-planning/model-runtime"; import { isProductPlanningEnabled, @@ -39,6 +43,10 @@ function jsonError(status: number, error: string) { } export async function POST(request: NextRequest) { + if (PRODUCT_PLANNING_ADVANCED_DISABLED) { + return jsonError(503, PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE); + } + const token = await getProductPlanningToken(request); if (!token?.sub) { return jsonError(401, "未登录"); diff --git a/app/api/product-planning/jd/item/route.ts b/app/api/product-planning/jd/item/route.ts index 2d5a5d7de..b6e80be48 100644 --- a/app/api/product-planning/jd/item/route.ts +++ b/app/api/product-planning/jd/item/route.ts @@ -1,4 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; +import { + PRODUCT_PLANNING_ADVANCED_DISABLED, + PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE, +} from "@/lib/product-planning/advanced-disabled"; import { getResolvedProductPlanningApiConfig } from "@/lib/product-planning/server-config"; import { isProductPlanningEnabled, @@ -19,6 +23,10 @@ function jsonError(status: number, error: string) { } export async function GET(request: NextRequest) { + if (PRODUCT_PLANNING_ADVANCED_DISABLED) { + return jsonError(503, PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE); + } + const token = await getProductPlanningToken(request); if (!token?.sub) { return jsonError(401, "未登录"); diff --git a/app/api/product-planning/keyword-insight/route.ts b/app/api/product-planning/keyword-insight/route.ts index 2195bde2b..54fcd1ccb 100644 --- a/app/api/product-planning/keyword-insight/route.ts +++ b/app/api/product-planning/keyword-insight/route.ts @@ -1,4 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; +import { + PRODUCT_PLANNING_ADVANCED_DISABLED, + PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE, +} from "@/lib/product-planning/advanced-disabled"; import { getResolvedProductPlanningApiConfig } from "@/lib/product-planning/server-config"; import { isProductPlanningEnabled, @@ -80,6 +84,10 @@ function normalizeGroups(items: unknown) { } export async function GET(request: NextRequest) { + if (PRODUCT_PLANNING_ADVANCED_DISABLED) { + return jsonError(503, "", PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE); + } + const token = await getProductPlanningToken(request); if (!token?.sub) { return jsonError(401, "", "未登录"); diff --git a/app/api/product-planning/taobao/item/route.ts b/app/api/product-planning/taobao/item/route.ts index e1c8b939a..e17faa2d8 100644 --- a/app/api/product-planning/taobao/item/route.ts +++ b/app/api/product-planning/taobao/item/route.ts @@ -1,4 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; +import { + PRODUCT_PLANNING_ADVANCED_DISABLED, + PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE, +} from "@/lib/product-planning/advanced-disabled"; import { getResolvedProductPlanningApiConfig } from "@/lib/product-planning/server-config"; import { isProductPlanningEnabled, @@ -19,6 +23,10 @@ function jsonError(status: number, error: string) { } export async function GET(request: NextRequest) { + if (PRODUCT_PLANNING_ADVANCED_DISABLED) { + return jsonError(503, PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE); + } + const token = await getProductPlanningToken(request); if (!token?.sub) { return jsonError(401, "未登录"); diff --git a/app/api/product-planning/taobao/month-sale/route.ts b/app/api/product-planning/taobao/month-sale/route.ts index 22b7e4b4d..c16648d9e 100644 --- a/app/api/product-planning/taobao/month-sale/route.ts +++ b/app/api/product-planning/taobao/month-sale/route.ts @@ -1,4 +1,8 @@ import { NextRequest, NextResponse } from "next/server"; +import { + PRODUCT_PLANNING_ADVANCED_DISABLED, + PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE, +} from "@/lib/product-planning/advanced-disabled"; import { getResolvedProductPlanningApiConfig } from "@/lib/product-planning/server-config"; import { isProductPlanningEnabled, @@ -21,6 +25,10 @@ function jsonError(status: number, itemId: string, error: string) { } export async function GET(request: NextRequest) { + if (PRODUCT_PLANNING_ADVANCED_DISABLED) { + return jsonError(503, "", PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE); + } + const token = await getProductPlanningToken(request); if (!token?.sub) { return jsonError(401, "", "未登录"); diff --git a/components/product-planning/product-planning-page.tsx b/components/product-planning/product-planning-page.tsx index 11cb406ce..80bf0a920 100644 --- a/components/product-planning/product-planning-page.tsx +++ b/components/product-planning/product-planning-page.tsx @@ -32,6 +32,10 @@ import { downloadMarkdownFile, downloadSalesWorkbook, } from "@/lib/product-planning/export"; +import { + PRODUCT_PLANNING_ADVANCED_DISABLED, + PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE, +} from "@/lib/product-planning/advanced-disabled"; import { parseKeywordInputFile, parseManualSegmentationFile, @@ -1076,6 +1080,13 @@ export function ProductPlanningPage({ void loadTemplates(); }, []); + useEffect(() => { + if (PRODUCT_PLANNING_ADVANCED_DISABLED && mainTab === "advanced") { + setMainTab("keywords"); + toast.info(PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE); + } + }, [mainTab]); + useEffect(() => { try { const raw = sessionStorage.getItem(PRODUCT_PLANNING_SESSION_KEY); @@ -1092,7 +1103,13 @@ export function ProductPlanningPage({ return; } - if (typeof parsed.mainTab === "string") setMainTab(parsed.mainTab); + if (typeof parsed.mainTab === "string") { + setMainTab( + PRODUCT_PLANNING_ADVANCED_DISABLED && parsed.mainTab === "advanced" + ? "keywords" + : parsed.mainTab + ); + } if (typeof parsed.manualSegmentationMode === "boolean") { setManualSegmentationMode(parsed.manualSegmentationMode); } @@ -2325,7 +2342,17 @@ export function ProductPlanningPage({ - + { + if (PRODUCT_PLANNING_ADVANCED_DISABLED && value === "advanced") { + toast.info(PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE); + setMainTab("keywords"); + return; + } + setMainTab(value); + }} + value={mainTab} + > 评价 / 问大家分析 - - 拓展分析 - + {PRODUCT_PLANNING_ADVANCED_DISABLED ? null : ( + + 拓展分析 + + )} diff --git a/lib/product-planning/advanced-disabled.ts b/lib/product-planning/advanced-disabled.ts new file mode 100644 index 000000000..338da8fd3 --- /dev/null +++ b/lib/product-planning/advanced-disabled.ts @@ -0,0 +1,4 @@ +export const PRODUCT_PLANNING_ADVANCED_DISABLED = true; + +export const PRODUCT_PLANNING_ADVANCED_DISABLED_MESSAGE = + "商品策划工具「拓展分析」功能临时维护中,请稍后再试。";