From d763f482b1bce312c516f09731fab003129d99a0 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, 23 Jul 2025 16:44: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=20?= =?UTF-8?q?=E6=96=B0=E5=BB=BA=E6=9C=8B=E5=8F=8B=E5=9C=88=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkebao/src/components/StepIndicator/index.tsx | 2 +- nkebao/src/pages/scenarios/plan/new/index.tsx | 24 +- .../plan/new/steps/BasicSettings.tsx | 287 +++++++----------- .../plan/new/steps/FriendRequestSettings.tsx | 255 ++++++++-------- .../plan/new/steps/MessageSettings.tsx | 37 ++- .../scenarios/plan/new/steps/base.module.scss | 149 +++++++++ 6 files changed, 413 insertions(+), 341 deletions(-) create mode 100644 nkebao/src/pages/scenarios/plan/new/steps/base.module.scss diff --git a/nkebao/src/components/StepIndicator/index.tsx b/nkebao/src/components/StepIndicator/index.tsx index 5702c77f..38cb7509 100644 --- a/nkebao/src/components/StepIndicator/index.tsx +++ b/nkebao/src/components/StepIndicator/index.tsx @@ -11,7 +11,7 @@ const StepIndicator: React.FC = ({ steps, }) => { return ( -
+
{steps.map((step, idx) => ( - - router(-1)} - /> -
- } - > - - {isEdit ? "编辑朋友圈同步" : "新建朋友圈同步"} - - -
- -
+ + } > diff --git a/nkebao/src/pages/scenarios/plan/new/steps/BasicSettings.tsx b/nkebao/src/pages/scenarios/plan/new/steps/BasicSettings.tsx index 1f989532..acaa58e5 100644 --- a/nkebao/src/pages/scenarios/plan/new/steps/BasicSettings.tsx +++ b/nkebao/src/pages/scenarios/plan/new/steps/BasicSettings.tsx @@ -1,17 +1,6 @@ import React, { useState, useEffect, useRef } from "react"; -import { - Form, - Input, - Button, - Tag, - Switch, - // Upload, - Modal, - Alert, - Row, - Col, - message, -} from "antd"; +import { Form, Input, Button, Tag, Switch, Modal } from "antd"; +import { Button as ButtonMobile } from "antd-mobile"; import { PlusOutlined, EyeOutlined, @@ -21,6 +10,8 @@ import { CheckOutlined, } from "@ant-design/icons"; import { uploadFile } from "@/api/common"; +import Layout from "@/components/Layout/Layout"; +import styles from "./base.module.scss"; interface BasicSettingsProps { isEdit: boolean; @@ -424,31 +415,31 @@ const BasicSettings: React.FC = ({ formData.scenario !== 1 ? { display: "none" } : { display: "block" }; return ( -
+
{/* 场景选择区块 */} - {sceneLoading ? ( -
加载中...
- ) : ( - - {sceneList.map((scene) => ( - - - - ))} - - )} - + + ); + })} +
+
{/* 计划名称输入区 */} -
计划名称
-
+
计划名称
+
onChange({ ...formData, name: String(e.target.value) }) @@ -456,17 +447,15 @@ const BasicSettings: React.FC = ({ placeholder="请输入计划名称" />
- -
获客标签(可多选)
+
获客标签(可多选)
{/* 标签选择区块 */} {formData.scenario && ( -
+
{(currentScene?.scenarioTags || []).map((tag: string) => ( handleScenarioTagToggle(tag)} - style={{ marginBottom: 4 }} > {tag} @@ -477,7 +466,6 @@ const BasicSettings: React.FC = ({ key={tag.id} color={selectedScenarioTags.includes(tag.id) ? "blue" : "default"} onClick={() => handleScenarioTagToggle(tag.id)} - style={{ marginBottom: 4 }} closable onClose={() => handleRemoveCustomTag(tag.id)} > @@ -487,26 +475,30 @@ const BasicSettings: React.FC = ({
)} {/* 自定义标签输入区 */} -
-
+
+
setCustomTagInput(e.target.value)} placeholder="添加自定义标签" - className="w-full" />
-
+
- {/* 输入获客成功提示 */} -
-
+
+
= ({ onChange({ ...formData, tips: e.target.value }); }} placeholder="请输入获客成功提示" - className="w-full" />
- {/* 选素材 */} -
-
选择海报
-
+
+
选择海报
+
{[...materials, ...customPosters].map((material) => { const isSelected = selectedMaterials.some( (m) => m.id === material.id @@ -538,19 +522,10 @@ const BasicSettings: React.FC = ({ return (
handleMaterialSelect(material)} > {/* 预览按钮:自定义海报在左上,内置海报在右上 */} @@ -607,31 +582,9 @@ const BasicSettings: React.FC = ({ {material.name} -
+
{material.name}
@@ -639,19 +592,7 @@ const BasicSettings: React.FC = ({ })} {/* 添加海报卡片 */}
uploadInputRef.current?.click()} > @@ -705,11 +646,10 @@ const BasicSettings: React.FC = ({
{/* 订单导入区块优化 */} -
-
订单表格上传
-
+
+
订单表格上传
+
-
+
支持 CSV、Excel 格式,上传后将文件保存到服务器
{/* 电话获客设置区块,仅在选择电话获客场景时显示 */} {formData.scenario === 5 && ( -
-
-
- 电话获客设置 +
+
+ 电话获客设置 +
+
+
+ 自动加好友 + + setPhoneSettings((s) => ({ ...s, autoAdd: v })) + } + />
-
-
- 自动加好友 - - setPhoneSettings((s) => ({ ...s, autoAdd: v })) - } - /> -
-
- 语音转文字 - - setPhoneSettings((s) => ({ ...s, speechToText: v })) - } - /> -
-
- 问题提取 - - setPhoneSettings((s) => ({ ...s, questionExtraction: v })) - } - /> -
+
+ 语音转文字 + + setPhoneSettings((s) => ({ ...s, speechToText: v })) + } + /> +
+
+ 问题提取 + + setPhoneSettings((s) => ({ ...s, questionExtraction: v })) + } + />
)} {/* 微信群设置区块,仅在选择微信群场景时显示 */} {formData.scenario === 7 && ( -
+
= ({
)} - -
+
是否启用 onChange({ ...formData, enabled: value })} />
- + +
+ + 下一步 + +
); }; diff --git a/nkebao/src/pages/scenarios/plan/new/steps/FriendRequestSettings.tsx b/nkebao/src/pages/scenarios/plan/new/steps/FriendRequestSettings.tsx index f76e0fb3..16e458d2 100644 --- a/nkebao/src/pages/scenarios/plan/new/steps/FriendRequestSettings.tsx +++ b/nkebao/src/pages/scenarios/plan/new/steps/FriendRequestSettings.tsx @@ -13,6 +13,7 @@ import { } from "antd"; import { QuestionCircleOutlined, MessageOutlined } from "@ant-design/icons"; import DeviceSelection from "@/components/DeviceSelection"; +import Layout from "@/components/Layout/Layout"; interface FriendRequestSettingsProps { formData: any; @@ -97,143 +98,151 @@ const FriendRequestSettings: React.FC = ({ return ( <> -
-
- 选择设备 -
- d.id)} - onSelect={(deviceIds) => { - const newSelectedDevices = deviceIds.map((id) => ({ - id, - name: `设备 ${id}`, - status: "online", - })); - setSelectedDevices(newSelectedDevices); - onChange({ ...formData, device: deviceIds }); - }} - placeholder="选择设备" - /> + +
+ + +
+
+ } + > +
+
+ 选择设备 +
+ d.id)} + onSelect={(deviceIds) => { + const newSelectedDevices = deviceIds.map((id) => ({ + id, + name: `设备 ${id}`, + status: "online", + })); + setSelectedDevices(newSelectedDevices); + onChange({ ...formData, device: deviceIds }); + }} + placeholder="选择设备" + /> +
-
-
-
- 好友备注 - setShowRemarkTip(true)} - onMouseLeave={() => setShowRemarkTip(false)} - onClick={() => setShowRemarkTip((v) => !v)} - > - ? - - {showRemarkTip && ( -
-
设置添加好友时的备注格式
-
备注格式预览:
-
- {formData.remarkType === "phone" && - `138****1234+${getScenarioTitle()}`} - {formData.remarkType === "nickname" && - `小红书用户2851+${getScenarioTitle()}`} - {formData.remarkType === "source" && - `抖音直播+${getScenarioTitle()}`} +
+
+ 好友备注 + setShowRemarkTip(true)} + onMouseLeave={() => setShowRemarkTip(false)} + onClick={() => setShowRemarkTip((v) => !v)} + > + ? + + {showRemarkTip && ( +
+
设置添加好友时的备注格式
+
+ 备注格式预览: +
+
+ {formData.remarkType === "phone" && + `138****1234+${getScenarioTitle()}`} + {formData.remarkType === "nickname" && + `小红书用户2851+${getScenarioTitle()}`} + {formData.remarkType === "source" && + `抖音直播+${getScenarioTitle()}`} +
-
- )} -
- -
- -
-
- 招呼语 -
+
- - onChange({ ...formData, greeting: e.target.value }) - } - placeholder="请输入招呼语" - className="mt-2" - /> -
-
- 添加间隔 -
+
+
+ 招呼语 + +
- onChange({ - ...formData, - addFriendInterval: Number(e.target.value), - }) + onChange({ ...formData, greeting: e.target.value }) } - /> -
分钟
-
-
- -
- 允许加人的时间段 -
- - onChange({ ...formData, addFriendTimeStart: e.target.value }) - } - className="w-32" - /> - - - onChange({ ...formData, addFriendTimeEnd: e.target.value }) - } - className="w-32" + placeholder="请输入招呼语" + className="mt-2" />
-
- {hasWarnings && ( - - )} +
+ 添加间隔 +
+ + onChange({ + ...formData, + addFriendInterval: Number(e.target.value), + }) + } + /> +
分钟
+
+
-
- - +
+ 允许加人的时间段 +
+ + onChange({ ...formData, addFriendTimeStart: e.target.value }) + } + className="w-32" + /> + + + onChange({ ...formData, addFriendTimeEnd: e.target.value }) + } + className="w-32" + /> +
+
+ + {hasWarnings && ( + + )}
-
+ = ({ return ( <> -
-
-

消息设置

- -
+ +
+ + +
+
+ } + > +
+
+

消息设置

+ +
- - -
- - +
-
+ {/* 添加天数计划弹窗 */}