From 3719671d1ca7e36a8b7c5ad70e059813179393d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AC=94=E8=AE=B0=E6=9C=AC=E9=87=8C=E7=9A=84=E6=B0=B8?= =?UTF-8?q?=E5=B9=B3?= Date: Wed, 16 Jul 2025 18:18:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=AC=E6=AC=A1=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=85=E5=AE=B9=E5=A6=82=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkebao/src/api/scenarios.ts | 12 ++-- nkebao/src/pages/scenarios/new/page.tsx | 70 +++++++++++++++---- .../scenarios/new/steps/BasicSettings.tsx | 11 +-- .../new/steps/FriendRequestSettings.tsx | 4 +- 4 files changed, 74 insertions(+), 23 deletions(-) diff --git a/nkebao/src/api/scenarios.ts b/nkebao/src/api/scenarios.ts index 7e5d3a5ff..88e10dc13 100644 --- a/nkebao/src/api/scenarios.ts +++ b/nkebao/src/api/scenarios.ts @@ -1,4 +1,4 @@ -import { get, del, post } from './request'; +import { get, del, post,put } from './request'; import type { ApiResponse } from '@/types/common'; // 服务器返回的场景数据类型 @@ -94,8 +94,7 @@ export interface TextUrl { export interface PlanDetail { id: number; name: string; - planName: string; - scenario: string; + scenario: number; scenarioTags: Tag[]; customTags: Tag[]; posters: Poster[]; @@ -103,7 +102,6 @@ export interface PlanDetail { enabled: boolean; addInterval: number; remarkFormat: string; - planNameEdited: boolean; endTime: string; greeting: string; startTime: string; @@ -117,6 +115,7 @@ export interface PlanDetail { apiKey: string; wxMinAppSrc?: any; textUrl: TextUrl; + [key: string]: any; } /** @@ -304,4 +303,9 @@ export const getPlanScenes = () => get('/v1/plan/scenes'); export async function createScenarioPlan(data: any) { return post('/v1/plan/create', data); +} + +// 编辑计划 +export async function updateScenarioPlan(planId: number | string, data: any) { + return await put(`/v1/plan/update?planId=${planId}`, data); } \ No newline at end of file diff --git a/nkebao/src/pages/scenarios/new/page.tsx b/nkebao/src/pages/scenarios/new/page.tsx index df2325af6..0bc6bb476 100644 --- a/nkebao/src/pages/scenarios/new/page.tsx +++ b/nkebao/src/pages/scenarios/new/page.tsx @@ -13,6 +13,7 @@ import { createScenarioPlan, fetchPlanDetail, PlanDetail, + updateScenarioPlan, } from "@/api/scenarios"; // 步骤定义 - 只保留三个步骤 @@ -22,11 +23,28 @@ const steps = [ { id: 3, title: "步骤三", subtitle: "消息设置" }, ]; +// 类型定义 +interface FormData { + name: string; + scenario: number; + posters: any[]; // 后续可替换为具体Poster类型 + device: string[]; + remarkType: string; + greeting: string; + addInterval: number; + startTime: string; + endTime: string; + enabled: boolean; + sceneId: string | number; + remarkFormat: string; + addFriendInterval: number; +} + export default function NewPlan() { const router = useNavigate(); const [currentStep, setCurrentStep] = useState(1); - const [formData, setFormData] = useState({ - planName: "", + const [formData, setFormData] = useState({ + name: "", scenario: 1, posters: [], device: [], @@ -37,7 +55,6 @@ export default function NewPlan() { endTime: "18:00", enabled: true, sceneId: "", - planNameEdited: false, remarkFormat: "", addFriendInterval: 1, }); @@ -64,10 +81,23 @@ export default function NewPlan() { setIsEdit(true); //获取计划详情 const res = await fetchPlanDetail(planId); - if (res.code === 200) { + if (res.code === 200 && res.data) { + const detail = res.data as PlanDetail; setFormData((prev) => ({ ...prev, - ...{ scenario: Number(res?.data?.scenario) }, + name: detail.name ?? "", + scenario: Number(detail.scenario) || 1, + posters: detail.posters ?? [], + device: detail.device ?? [], + remarkType: detail.remarkType ?? "phone", + greeting: detail.greeting ?? "", + addInterval: detail.addInterval ?? 1, + startTime: detail.startTime ?? "09:00", + endTime: detail.endTime ?? "18:00", + enabled: detail.enabled ?? true, + sceneId: Number(detail.scenario) || 1, + remarkFormat: detail.remarkFormat ?? "", + addFriendInterval: detail.addFriendInterval ?? 1, })); } } else { @@ -88,16 +118,30 @@ export default function NewPlan() { // 处理保存 const handleSave = async () => { try { - const result = await createScenarioPlan(formData); - console.log(result); - if (result.code === 200) { - Toast({ message: "获客计划已创建", theme: "success" }); - router(`/scenarios/list/${scenarioId}/`); + let result; + if (isEdit && planId) { + // 编辑:拼接后端需要的完整参数 + const editData = { + ...formData, + id: Number(planId), + planId: Number(planId), + // 兼容后端需要的字段 + // 你可以根据实际需要补充其它字段 + }; + result = await updateScenarioPlan(planId, editData); } else { + // 新建 + result = await createScenarioPlan(formData); + } + if (result.code === 200) { Toast({ - message: result.msg, - theme: "error", + message: isEdit ? "计划已更新" : "获客计划已创建", + theme: "success", }); + const sceneItem = sceneList.find((v) => formData.scenario === v.id); + router(`/scenarios/list/${formData.sceneId}/${sceneItem.name}`); + } else { + Toast({ message: result.msg, theme: "error" }); } } catch (error) { Toast({ @@ -106,6 +150,8 @@ export default function NewPlan() { ? error.message : typeof error === "string" ? error + : isEdit + ? "更新计划失败,请重试" : "创建计划失败,请重试", theme: "error", }); diff --git a/nkebao/src/pages/scenarios/new/steps/BasicSettings.tsx b/nkebao/src/pages/scenarios/new/steps/BasicSettings.tsx index 13324125d..7b215865e 100644 --- a/nkebao/src/pages/scenarios/new/steps/BasicSettings.tsx +++ b/nkebao/src/pages/scenarios/new/steps/BasicSettings.tsx @@ -178,17 +178,18 @@ export function BasicSettings({ onChange({ ...formData, scenario: "haibao" }); } - if (!formData.planName) { - const today = new Date().toLocaleDateString("zh-CN").replace(/\//g, ""); - onChange({ ...formData, planName: `海报${today}` }); - } - // 检查是否已经有上传的订单文件 if (formData.orderFileUploaded) { setOrderUploaded(true); } }, [formData, onChange]); + useEffect(() => { + const today = new Date().toLocaleDateString("zh-CN").replace(/\//g, ""); + const sceneItem = sceneList.find((v) => formData.scenario === v.id); + onChange({ ...formData, name: `${sceneItem?.name || "海报"}${today}` }); + }, [sceneList]); + // 选中场景 const handleScenarioSelect = (sceneId: number) => { onChange({ ...formData, scenario: sceneId }); diff --git a/nkebao/src/pages/scenarios/new/steps/FriendRequestSettings.tsx b/nkebao/src/pages/scenarios/new/steps/FriendRequestSettings.tsx index 6895c13be..b49fc0307 100644 --- a/nkebao/src/pages/scenarios/new/steps/FriendRequestSettings.tsx +++ b/nkebao/src/pages/scenarios/new/steps/FriendRequestSettings.tsx @@ -66,7 +66,7 @@ export function FriendRequestSettings({ case "gongzhonghao": return "公众号"; default: - return formData.planName || "获客计划"; + return formData.name || "获客计划"; } }; @@ -114,7 +114,7 @@ export function FriendRequestSettings({ status: "online", })); setSelectedDevices(newSelectedDevices); - onChange({ ...formData, selectedDevices: newSelectedDevices }); + onChange({ ...formData, device: deviceIds }); }} placeholder="选择设备" />