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

场景计划构建完成
This commit is contained in:
笔记本里的永平
2025-07-23 19:40:19 +08:00
parent 2081e6fa6b
commit e23b37f0d7
3 changed files with 69 additions and 15 deletions

View File

@@ -6,7 +6,7 @@ export function getScenarioTypes() {
// 创建计划
export function createPlan(data: any) {
return request("/v1/scenarios/plans", data, "POST");
return request("/v1/plan/create", data, "POST");
}
// 更新计划

View File

@@ -135,7 +135,7 @@ export default function NewPlan() {
}
message.success(isEdit ? "计划已更新" : "获客计划已创建");
const sceneItem = sceneList.find((v) => formData.scenario === v.id);
router(`/scenarios/list/${formData.sceneId}/${sceneItem.name}`);
router(`/scenarios/list/${formData.scenario}/${sceneItem.name}`);
} catch (error) {
message.error(
error instanceof Error

View File

@@ -1,4 +1,4 @@
import React, { useState } from "react";
import React, { useState, useRef } from "react";
import { Input, Button, Tabs, Modal, Alert, message } from "antd";
import {
PlusOutlined,
@@ -14,6 +14,7 @@ import {
TeamOutlined,
} from "@ant-design/icons";
import styles from "./messages.module.scss";
import { uploadFile } from "@/api/common";
interface MessageContent {
id: string;
@@ -87,6 +88,13 @@ const MessageSettings: React.FC<MessageSettingsProps> = ({
const [isAddDayPlanOpen, setIsAddDayPlanOpen] = useState(false);
const [isGroupSelectOpen, setIsGroupSelectOpen] = useState(false);
const [selectedGroupId, setSelectedGroupId] = useState("");
const fileInputRef = useRef<HTMLInputElement | null>(null);
const [uploadingIndex, setUploadingIndex] = useState<string | null>(null);
const [uploadingType, setUploadingType] = useState<
"miniprogram" | "link" | null
>(null);
const [uploadingDay, setUploadingDay] = useState<number | null>(null);
const [uploadingMsgIdx, setUploadingMsgIdx] = useState<number | null>(null);
// 添加新消息
const handleAddMessage = (dayIndex: number, type = "text") => {
@@ -177,17 +185,50 @@ const MessageSettings: React.FC<MessageSettingsProps> = ({
);
};
// 处理文件上传
const handleFileUpload = (
dayIndex: number,
messageIndex: number,
type: "image" | "video" | "file"
// 触发文件选择
const triggerUpload = (
dayIdx: number,
msgIdx: number,
type: "miniprogram" | "link"
) => {
message.success(
`${
type === "image" ? "图片" : type === "video" ? "视频" : "文件"
}上传成功`
);
setUploadingDay(dayIdx);
setUploadingMsgIdx(msgIdx);
setUploadingType(type);
setTimeout(() => {
fileInputRef.current?.click();
}, 0);
};
// 处理文件上传
const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (
!file ||
uploadingDay === null ||
uploadingMsgIdx === null ||
!uploadingType
)
return;
setUploadingIndex(`${uploadingDay}-${uploadingMsgIdx}`);
try {
const url = await uploadFile(file);
// 更新对应消息的coverImage
setDayPlans((prev) => {
const newPlans = [...prev];
const msg = newPlans[uploadingDay].messages[uploadingMsgIdx];
msg.coverImage = url;
return newPlans;
});
message.success("上传成功");
} catch (err) {
message.error("上传失败");
} finally {
setUploadingIndex(null);
setUploadingType(null);
setUploadingDay(null);
setUploadingMsgIdx(null);
if (fileInputRef.current) fileInputRef.current.value = "";
}
};
const items = dayPlans.map((plan, dayIndex) => ({
@@ -390,8 +431,11 @@ const MessageSettings: React.FC<MessageSettingsProps> = ({
) : (
<Button
icon={<UploadOutlined />}
loading={
uploadingIndex === `${dayIndex}-${messageIndex}`
}
onClick={() =>
handleFileUpload(dayIndex, messageIndex, "image")
triggerUpload(dayIndex, messageIndex, "miniprogram")
}
>
@@ -461,8 +505,11 @@ const MessageSettings: React.FC<MessageSettingsProps> = ({
) : (
<Button
icon={<UploadOutlined />}
loading={
uploadingIndex === `${dayIndex}-${messageIndex}`
}
onClick={() =>
handleFileUpload(dayIndex, messageIndex, "image")
triggerUpload(dayIndex, messageIndex, "link")
}
>
@@ -584,6 +631,13 @@ const MessageSettings: React.FC<MessageSettingsProps> = ({
))}
</div>
</Modal>
<input
ref={fileInputRef}
type="file"
accept="image/*"
style={{ display: "none" }}
onChange={handleFileChange}
/>
</div>
);
};