From 36f72e1948931fef552cead58a8615ca5d83b15f 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: Thu, 17 Jul 2025 15:57:20 +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?=E4=BF=9D=E5=AD=98=E4=B8=80=E4=B8=8B=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cunkebao/src/api/scenarios.ts | 19 +- Cunkebao/src/pages/scenarios/ScenarioList.tsx | 193 ++++++++++++------ 2 files changed, 151 insertions(+), 61 deletions(-) diff --git a/Cunkebao/src/api/scenarios.ts b/Cunkebao/src/api/scenarios.ts index 88e10dc1..74202095 100644 --- a/Cunkebao/src/api/scenarios.ts +++ b/Cunkebao/src/api/scenarios.ts @@ -308,4 +308,21 @@ export async function createScenarioPlan(data: any) { // 编辑计划 export async function updateScenarioPlan(planId: number | string, data: any) { return await put(`/v1/plan/update?planId=${planId}`, data); -} \ No newline at end of file +} + +/** + * 获取计划小程序二维码 + * @param taskid 任务ID + * @returns base64二维码 + */ +export const getWxMinAppCode = async (taskId: string): Promise<{ code: number; base64?: string; msg?: string }> => { + try { + return await get<{ code: number; base64?: string; msg?: string }>( + `/v1/plan/getWxMinAppCode?taskId=${ taskId }`, + + ); + } catch (error) { + console.error('获取小程序二维码失败:', error); + return { code: 500, msg: '获取小程序二维码失败' }; + } +}; \ No newline at end of file diff --git a/Cunkebao/src/pages/scenarios/ScenarioList.tsx b/Cunkebao/src/pages/scenarios/ScenarioList.tsx index 6c110961..aae47189 100644 --- a/Cunkebao/src/pages/scenarios/ScenarioList.tsx +++ b/Cunkebao/src/pages/scenarios/ScenarioList.tsx @@ -15,6 +15,7 @@ import { Code, Search, RefreshCw, + QrCode, } from "lucide-react"; import { fetchPlanList, @@ -22,6 +23,7 @@ import { copyPlan, deletePlan, type Task, + getWxMinAppCode, } from "@/api/scenarios"; import { useToast } from "@/components/ui/toast"; import "@/components/Layout.css"; @@ -65,6 +67,11 @@ export default function ScenarioDetail() { }); const [searchTerm, setSearchTerm] = useState(""); const [loadingTasks, setLoadingTasks] = useState(false); + // 二维码弹窗相关 + const [showQrDialog, setShowQrDialog] = useState(false); + const [qrLoading, setQrLoading] = useState(false); + const [qrImg, setQrImg] = useState(""); + const [qrTaskId, setQrTaskId] = useState(""); // 获取渠道中文名称 const getChannelName = (channel: string) => { @@ -310,6 +317,33 @@ export default function ScenarioDetail() { navigate(`/scenarios/new/${scenarioId}`); }; + const handleShowQrCode = async (taskId: string) => { + setQrTaskId(taskId); + setShowQrDialog(true); + setQrLoading(true); + setQrImg(""); + try { + const data = await getWxMinAppCode(taskId); + if (data && data.base64) { + setQrImg(`data:image/png;base64,${data.base64}`); + } else { + toast({ + title: "获取二维码失败", + description: data?.msg || "未知错误", + variant: "destructive", + }); + } + } catch (e) { + toast({ + title: "获取二维码失败", + description: "网络错误", + variant: "destructive", + }); + } finally { + setQrLoading(false); + } + }; + const getStatusColor = (status: number) => { switch (status) { case 1: @@ -463,70 +497,75 @@ export default function ScenarioDetail() { ) : ( -
+
{filteredTasks.map((task) => ( -
-
-
-
-

- {task.name} -

- - {getStatusText(task.status)} - -
-
- - 最后更新: {task.lastUpdated} -
-
- - 设备: {task.stats?.devices || 0} | 获客:{" "} - {task.stats?.acquired || 0} | 添加:{" "} - {task.stats?.added || 0} - -
+
+ {/* 头部:标题和状态 */} +
+

+ {task.name} +

+ + {getStatusText(task.status)} + +
+ {/* 中部:更新时间和统计 */} +
+
+ + 最后更新: {task.lastUpdated}
- -
- - - - - - - +
+ 设备: {task.stats?.devices || 0} | 获客:{" "} + {task.stats?.acquired || 0} | 添加:{" "} + {task.stats?.added || 0}
+ {/* 底部:操作按钮 */} +
+ + + + + +
))}
@@ -658,6 +697,40 @@ export default function ScenarioDetail() {
)} + {/* 二维码弹窗 */} + {showQrDialog && ( +
+
+ +
+ +
小程序二维码
+
+ 可扫码进入对应计划 +
+
+ {qrLoading ? ( +
+ +
二维码加载中...
+
+ ) : qrImg ? ( + 二维码 + ) : ( +
二维码加载失败
+ )} +
+
+ )} ); }