From 8ff912a4a7ffe9b7243e2b4b6a4f57f9e992b6ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E7=BA=A7=E8=80=81=E7=99=BD=E5=85=94?= Date: Fri, 26 Sep 2025 17:33:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=BE=85=E8=A8=AD?= =?UTF-8?q?=E7=BD=AE=E5=8A=9F=E8=83=BD=EF=BC=9A=E4=BF=AE=E6=94=B9API?= =?UTF-8?q?=E8=AB=8B=E6=B1=82=E8=B7=AF=E5=BE=91=E4=BB=A5=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E6=B5=81=E9=87=8F=E6=B1=A0=E8=A8=AD=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E6=89=B9=E9=87=8F=E8=A8=AD=E7=BD=AE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=B8=A6=E5=84=AA=E5=8C=96=E7=94=A8=E6=88=B6?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=A9=BA=E7=8B=80?= =?UTF-8?q?=E6=85=8B=E6=8F=90=E7=A4=BA=E4=BB=A5=E6=8F=90=E5=8D=87=E7=94=A8?= =?UTF-8?q?=E6=88=B6=E9=AB=94=E9=A9=97=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ReceptionSettings/api.ts | 10 +- .../ReceptionSettings/index.module.scss | 20 ++ .../components/ReceptionSettings/index.tsx | 182 +++++++++++++----- 3 files changed, 162 insertions(+), 50 deletions(-) diff --git a/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/api.ts b/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/api.ts index 82ed6ff9..aabbc041 100644 --- a/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/api.ts +++ b/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/api.ts @@ -1,9 +1,13 @@ import request from "@/api/request"; export const getAiSettings = () => { - return request("/v1/kefu/ai/settings/get", "GET"); + return request("/v1/kefu/ai/friend/get", "GET"); }; -export const setAiSettings = (data: any) => { - return request("/v1/kefu/ai/settings/set", "POST", data); +export const setAiSettings = (params: { + isUpdata: string; + packageId: string[]; + type: number; +}) => { + return request("/v1/kefu/ai/friend/setAll", params, "POST"); }; diff --git a/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/index.module.scss b/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/index.module.scss index eff73214..bdf212f2 100644 --- a/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/index.module.scss +++ b/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/index.module.scss @@ -62,6 +62,26 @@ color: #586069; } } + + .emptyState { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 200px; + text-align: center; + + .emptyText { + font-size: 16px; + color: #999; + margin-bottom: 8px; + } + + .emptyDesc { + font-size: 14px; + color: #ccc; + } + } } // 响应式设计 diff --git a/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/index.tsx b/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/index.tsx index 8faa9da1..c0f419e2 100644 --- a/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/index.tsx +++ b/Touchkebao/src/pages/pc/ckbox/commonConfig/components/ReceptionSettings/index.tsx @@ -1,21 +1,110 @@ import React, { useState } from "react"; -import { Card, Select, Button, Space, Tag, List } from "antd"; -import { DatabaseOutlined } from "@ant-design/icons"; +import { Card, Select, Button, Space, Tag, List, message, Modal } from "antd"; +import { DatabaseOutlined, ExclamationCircleOutlined } from "@ant-design/icons"; +import PoolSelection from "@/components/PoolSelection"; +import { PoolSelectionItem } from "@/components/PoolSelection/data"; +import { setAiSettings } from "./api"; import styles from "./index.module.scss"; const { Option } = Select; const ReceptionSettings: React.FC = () => { - const [pool, setPool] = useState(); - const [mode, setMode] = useState("人工接待"); + const [selectedPools, setSelectedPools] = useState([]); + const [mode, setMode] = useState(0); + const [loading, setLoading] = useState(false); - const pools = ["官网咨询", "朋友推荐", "展会获客"]; const typeOptions = [ { value: 0, label: "人工接待" }, { value: 1, label: "AI辅助" }, { value: 2, label: "AI接管" }, ]; - const [currentConfig, setCurrentConfig] = useState(null); + + // 处理流量池选择 + const handlePoolSelect = (pools: PoolSelectionItem[]) => { + setSelectedPools(pools); + }; + + // 处理接待模式选择 + const handleModeChange = (value: number) => { + setMode(value); + }; + + // 处理批量设置 + const handleBatchSet = async () => { + if (selectedPools.length === 0) { + message.warning("请先选择流量池"); + return; + } + + const selectedModeLabel = + typeOptions.find(opt => opt.value === mode)?.label || "人工接待"; + const poolNames = selectedPools + .map(pool => pool.name || pool.nickname) + .join("、"); + + Modal.confirm({ + title: "确认批量设置", + icon: , + content: ( +
+

您即将对以下流量池进行批量设置:

+
+ 流量池: + {poolNames} +
+
+ 接待模式: + {selectedModeLabel} +
+

+ 此操作将影响 {selectedPools.length}{" "} + 个流量池的接待设置,确定要继续吗? +

+
+ ), + okText: "确认设置", + cancelText: "取消", + okType: "primary", + onOk: async () => { + setLoading(true); + try { + const packageIds = selectedPools.map(pool => pool.id); + const params = { + isUpdata: "1", // 1表示更新,0表示新增 + packageId: packageIds, + type: mode, + }; + + const response = await setAiSettings(params); + if (response) { + message.success( + `成功为 ${selectedPools.length} 个流量池设置接待模式为"${selectedModeLabel}"`, + ); + // 可以在这里刷新流量池状态列表 + } + } catch (error) { + console.error("批量设置失败:", error); + message.error("批量设置失败,请重试"); + } finally { + setLoading(false); + } + }, + }); + }; return (
@@ -34,25 +123,20 @@ const ReceptionSettings: React.FC = () => {
选择流量池
- + showSelectedList={true} + selectedListMaxHeight={200} + />
接待模式
- {JSON.stringify(currentConfig)} - @@ -78,33 +168,31 @@ const ReceptionSettings: React.FC = () => { } > - ( - - - - {index % 3 === 0 - ? "AI辅助" - : index % 3 === 1 - ? "人工接待" - : "AI接管"} - - - )} - /> + {selectedPools.length > 0 ? ( + ( + + + + {typeOptions.find(opt => opt.value === mode)?.label || + "人工接待"} + + + )} + /> + ) : ( +
+
请先选择流量池
+
+ 选择流量池后将显示其状态信息 +
+
+ )}