feat: 本次提交更新内容如下

This commit is contained in:
笔记本里的永平
2025-07-16 18:18:13 +08:00
parent 6c1646b23b
commit 3719671d1c
4 changed files with 74 additions and 23 deletions

View File

@@ -1,4 +1,4 @@
import { get, del, post } from './request'; import { get, del, post,put } from './request';
import type { ApiResponse } from '@/types/common'; import type { ApiResponse } from '@/types/common';
// 服务器返回的场景数据类型 // 服务器返回的场景数据类型
@@ -94,8 +94,7 @@ export interface TextUrl {
export interface PlanDetail { export interface PlanDetail {
id: number; id: number;
name: string; name: string;
planName: string; scenario: number;
scenario: string;
scenarioTags: Tag[]; scenarioTags: Tag[];
customTags: Tag[]; customTags: Tag[];
posters: Poster[]; posters: Poster[];
@@ -103,7 +102,6 @@ export interface PlanDetail {
enabled: boolean; enabled: boolean;
addInterval: number; addInterval: number;
remarkFormat: string; remarkFormat: string;
planNameEdited: boolean;
endTime: string; endTime: string;
greeting: string; greeting: string;
startTime: string; startTime: string;
@@ -117,6 +115,7 @@ export interface PlanDetail {
apiKey: string; apiKey: string;
wxMinAppSrc?: any; wxMinAppSrc?: any;
textUrl: TextUrl; textUrl: TextUrl;
[key: string]: any;
} }
/** /**
@@ -304,4 +303,9 @@ export const getPlanScenes = () => get<any>('/v1/plan/scenes');
export async function createScenarioPlan(data: any) { export async function createScenarioPlan(data: any) {
return post('/v1/plan/create', data); return post('/v1/plan/create', data);
}
// 编辑计划
export async function updateScenarioPlan(planId: number | string, data: any) {
return await put(`/v1/plan/update?planId=${planId}`, data);
} }

View File

@@ -13,6 +13,7 @@ import {
createScenarioPlan, createScenarioPlan,
fetchPlanDetail, fetchPlanDetail,
PlanDetail, PlanDetail,
updateScenarioPlan,
} from "@/api/scenarios"; } from "@/api/scenarios";
// 步骤定义 - 只保留三个步骤 // 步骤定义 - 只保留三个步骤
@@ -22,11 +23,28 @@ const steps = [
{ id: 3, title: "步骤三", subtitle: "消息设置" }, { 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() { export default function NewPlan() {
const router = useNavigate(); const router = useNavigate();
const [currentStep, setCurrentStep] = useState(1); const [currentStep, setCurrentStep] = useState(1);
const [formData, setFormData] = useState({ const [formData, setFormData] = useState<FormData>({
planName: "", name: "",
scenario: 1, scenario: 1,
posters: [], posters: [],
device: [], device: [],
@@ -37,7 +55,6 @@ export default function NewPlan() {
endTime: "18:00", endTime: "18:00",
enabled: true, enabled: true,
sceneId: "", sceneId: "",
planNameEdited: false,
remarkFormat: "", remarkFormat: "",
addFriendInterval: 1, addFriendInterval: 1,
}); });
@@ -64,10 +81,23 @@ export default function NewPlan() {
setIsEdit(true); setIsEdit(true);
//获取计划详情 //获取计划详情
const res = await fetchPlanDetail(planId); const res = await fetchPlanDetail(planId);
if (res.code === 200) { if (res.code === 200 && res.data) {
const detail = res.data as PlanDetail;
setFormData((prev) => ({ setFormData((prev) => ({
...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 { } else {
@@ -88,16 +118,30 @@ export default function NewPlan() {
// 处理保存 // 处理保存
const handleSave = async () => { const handleSave = async () => {
try { try {
const result = await createScenarioPlan(formData); let result;
console.log(result); if (isEdit && planId) {
if (result.code === 200) { // 编辑:拼接后端需要的完整参数
Toast({ message: "获客计划已创建", theme: "success" }); const editData = {
router(`/scenarios/list/${scenarioId}/`); ...formData,
id: Number(planId),
planId: Number(planId),
// 兼容后端需要的字段
// 你可以根据实际需要补充其它字段
};
result = await updateScenarioPlan(planId, editData);
} else { } else {
// 新建
result = await createScenarioPlan(formData);
}
if (result.code === 200) {
Toast({ Toast({
message: result.msg, message: isEdit ? "计划已更新" : "获客计划已创建",
theme: "error", 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) { } catch (error) {
Toast({ Toast({
@@ -106,6 +150,8 @@ export default function NewPlan() {
? error.message ? error.message
: typeof error === "string" : typeof error === "string"
? error ? error
: isEdit
? "更新计划失败,请重试"
: "创建计划失败,请重试", : "创建计划失败,请重试",
theme: "error", theme: "error",
}); });

View File

@@ -178,17 +178,18 @@ export function BasicSettings({
onChange({ ...formData, scenario: "haibao" }); onChange({ ...formData, scenario: "haibao" });
} }
if (!formData.planName) {
const today = new Date().toLocaleDateString("zh-CN").replace(/\//g, "");
onChange({ ...formData, planName: `海报${today}` });
}
// 检查是否已经有上传的订单文件 // 检查是否已经有上传的订单文件
if (formData.orderFileUploaded) { if (formData.orderFileUploaded) {
setOrderUploaded(true); setOrderUploaded(true);
} }
}, [formData, onChange]); }, [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) => { const handleScenarioSelect = (sceneId: number) => {
onChange({ ...formData, scenario: sceneId }); onChange({ ...formData, scenario: sceneId });

View File

@@ -66,7 +66,7 @@ export function FriendRequestSettings({
case "gongzhonghao": case "gongzhonghao":
return "公众号"; return "公众号";
default: default:
return formData.planName || "获客计划"; return formData.name || "获客计划";
} }
}; };
@@ -114,7 +114,7 @@ export function FriendRequestSettings({
status: "online", status: "online",
})); }));
setSelectedDevices(newSelectedDevices); setSelectedDevices(newSelectedDevices);
onChange({ ...formData, selectedDevices: newSelectedDevices }); onChange({ ...formData, device: deviceIds });
}} }}
placeholder="选择设备" placeholder="选择设备"
/> />