diff --git a/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/index.tsx b/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/index.tsx index a985f182..54e8de40 100644 --- a/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/index.tsx +++ b/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/index.tsx @@ -692,13 +692,13 @@ const WechatAccountDetail: React.FC = () => {
{overviewData?.healthScoreAssessment?.statusTag || "已添加加人"} - 最后添加时间: {overviewData?.healthScoreAssessment?.lastAddTime || "18:44:14"} + 最后添加时间: {overviewData?.healthScoreAssessment?.lastAddTime || "-"}
- {overviewData?.healthScoreAssessment?.score || 67} + {overviewData?.healthScoreAssessment?.score || 0}
SCORE
@@ -810,7 +810,7 @@ const WechatAccountDetail: React.FC = () => {
- {overviewData?.healthScoreAssessment?.score || 67} + {overviewData?.healthScoreAssessment?.score || 0}
SCORE
@@ -869,7 +869,7 @@ const WechatAccountDetail: React.FC = () => {
- {record.title || record.description || "记录"} + {record.name || record.description || "记录"} {record.statusTag && ( {record.statusTag} diff --git a/Cunkebao/src/pages/mobile/scenarios/plan/list/api.ts b/Cunkebao/src/pages/mobile/scenarios/plan/list/api.ts index 26377d6c..3943a92a 100644 --- a/Cunkebao/src/pages/mobile/scenarios/plan/list/api.ts +++ b/Cunkebao/src/pages/mobile/scenarios/plan/list/api.ts @@ -36,6 +36,13 @@ export function getUserList(planId: string, type: number) { } //获客列表 -export function getFriendRequestTaskStats(taskId: string) { - return request(`/v1/dashboard/friendRequestTaskStats`, { taskId }, "GET"); +export function getFriendRequestTaskStats( + taskId: string, + params?: { startTime?: string; endTime?: string }, +) { + return request( + `/v1/dashboard/friendRequestTaskStats`, + { taskId, ...params }, + "GET", + ); } diff --git a/Cunkebao/src/pages/mobile/scenarios/plan/list/components/PoolListModal.tsx b/Cunkebao/src/pages/mobile/scenarios/plan/list/components/PoolListModal.tsx index a084dc3c..4871d2ba 100644 --- a/Cunkebao/src/pages/mobile/scenarios/plan/list/components/PoolListModal.tsx +++ b/Cunkebao/src/pages/mobile/scenarios/plan/list/components/PoolListModal.tsx @@ -1,7 +1,7 @@ -import React, { useEffect, useState } from "react"; -import { Popup, SpinLoading } from "antd-mobile"; -import { Button, message } from "antd"; -import { CloseOutlined } from "@ant-design/icons"; +import React, { useEffect, useState, useCallback } from "react"; +import { Popup, SpinLoading, DatePicker } from "antd-mobile"; +import { Button, message, Input } from "antd"; +import { CloseOutlined, CalendarOutlined } from "@ant-design/icons"; import style from "./Popups.module.scss"; import { getFriendRequestTaskStats } from "../api"; import LineChart2 from "@/components/LineChart2"; @@ -39,31 +39,73 @@ const PoolListModal: React.FC = ({ const [xData, setXData] = useState([]); const [yData, setYData] = useState([]); const [loading, setLoading] = useState(false); + const [startTime, setStartTime] = useState(null); + const [endTime, setEndTime] = useState(null); + const [showStartTimePicker, setShowStartTimePicker] = useState(false); + const [showEndTimePicker, setShowEndTimePicker] = useState(false); - // 当弹窗打开且有ruleId时,获取数据 + // 格式化日期为 YYYY-MM-DD + const formatDate = useCallback((date: Date | null): string => { + if (!date) return ""; + const y = date.getFullYear(); + const m = String(date.getMonth() + 1).padStart(2, "0"); + const d = String(date.getDate()).padStart(2, "0"); + return `${y}-${m}-${d}`; + }, []); + + // 初始化默认时间(近7天) useEffect(() => { - if (visible && ruleId) { - setLoading(true); - getFriendRequestTaskStats(ruleId.toString()) - .then(res => { - console.log(res); - setXData(res.dateArray); - setYData([ - res.allNumArray, - res.errorNumArray, - res.passNumArray, - res.passRateArray, - res.successNumArray, - res.successRateArray, - ]); - setStatistics(res.totalStats); - setLoading(false); - }) - .finally(() => { - setLoading(false); - }); + if (visible) { + // 如果时间未设置,设置默认值为近7天 + if (!startTime || !endTime) { + const today = new Date(); + const sevenDaysAgo = new Date(); + sevenDaysAgo.setDate(today.getDate() - 7); + setStartTime(sevenDaysAgo); + setEndTime(today); + } + } else { + // 弹窗关闭时重置时间,下次打开时重新初始化 + setStartTime(null); + setEndTime(null); } - }, [visible, ruleId]); + }, [visible]); + + // 当弹窗打开或有ruleId或时间筛选变化时,获取数据 + useEffect(() => { + if (!visible || !ruleId) return; + + setLoading(true); + const params: { startTime?: string; endTime?: string } = {}; + if (startTime) { + params.startTime = formatDate(startTime); + } + if (endTime) { + params.endTime = formatDate(endTime); + } + + getFriendRequestTaskStats(ruleId.toString(), params) + .then(res => { + console.log(res); + setXData(res.dateArray); + setYData([ + res.allNumArray, + res.errorNumArray, + res.passNumArray, + res.passRateArray, + res.successNumArray, + res.successRateArray, + ]); + setStatistics(res.totalStats); + }) + .catch(error => { + console.error("获取统计数据失败:", error); + message.error("获取统计数据失败"); + }) + .finally(() => { + setLoading(false); + }); + }, [visible, ruleId, startTime, endTime, formatDate]); const title = ruleName ? `${ruleName} - 累计统计数据` : "累计统计数据"; return ( @@ -89,6 +131,55 @@ const PoolListModal: React.FC = ({ />
+ {/* 时间筛选 */} +
+
+ + setShowStartTimePicker(true)} + prefix={} + className={style.dateFilterInput} + /> + setShowStartTimePicker(false)} + onConfirm={val => { + setStartTime(val); + setShowStartTimePicker(false); + }} + /> +
+
+ + setShowEndTimePicker(true)} + prefix={} + className={style.dateFilterInput} + /> + setShowEndTimePicker(false)} + onConfirm={val => { + setEndTime(val); + setShowEndTimePicker(false); + }} + /> +
+
+ {/* 统计数据表格 */}
{loading ? ( diff --git a/Cunkebao/src/pages/mobile/scenarios/plan/list/components/Popups.module.scss b/Cunkebao/src/pages/mobile/scenarios/plan/list/components/Popups.module.scss index cbfce7c1..dd77f7b7 100644 --- a/Cunkebao/src/pages/mobile/scenarios/plan/list/components/Popups.module.scss +++ b/Cunkebao/src/pages/mobile/scenarios/plan/list/components/Popups.module.scss @@ -663,6 +663,32 @@ color: #666; } +// 日期筛选样式 +.dateFilter { + display: flex; + gap: 12px; + padding: 16px 20px; + border-bottom: 1px solid #f0f0f0; + background: #fff; +} + +.dateFilterItem { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; +} + +.dateFilterLabel { + font-size: 14px; + color: #666; + font-weight: 500; +} + +.dateFilterInput { + width: 100%; +} + // 统计数据弹窗样式 .statisticsContent { flex: 1; diff --git a/Cunkebao/src/pages/mobile/scenarios/plan/new/index.tsx b/Cunkebao/src/pages/mobile/scenarios/plan/new/index.tsx index ac63a6b6..c09cfbf2 100644 --- a/Cunkebao/src/pages/mobile/scenarios/plan/new/index.tsx +++ b/Cunkebao/src/pages/mobile/scenarios/plan/new/index.tsx @@ -90,7 +90,7 @@ export default function NewPlan() { setFormData(prev => ({ ...prev, name: detail.name ?? "", - scenario: Number(detail.scenario) || 1, + scenario: Number(detail.sceneId || detail.scenario) || 1, scenarioTags: detail.scenarioTags ?? [], customTags: detail.customTags ?? [], customTagsOptions: detail.customTags ?? [], @@ -102,7 +102,7 @@ export default function NewPlan() { startTime: detail.startTime ?? "09:00", endTime: detail.endTime ?? "18:00", enabled: detail.enabled ?? true, - sceneId: Number(detail.scenario) || 1, + sceneId: Number(detail.sceneId || detail.scenario) || 1, remarkFormat: detail.remarkFormat ?? "", addFriendInterval: detail.addFriendInterval ?? 1, tips: detail.tips ?? "", diff --git a/Cunkebao/src/pages/mobile/scenarios/plan/new/steps/BasicSettings.tsx b/Cunkebao/src/pages/mobile/scenarios/plan/new/steps/BasicSettings.tsx index f8136303..aa3630c2 100644 --- a/Cunkebao/src/pages/mobile/scenarios/plan/new/steps/BasicSettings.tsx +++ b/Cunkebao/src/pages/mobile/scenarios/plan/new/steps/BasicSettings.tsx @@ -40,6 +40,7 @@ const generatePosterMaterials = (): Material[] => { }; const BasicSettings: React.FC = ({ + isEdit, formData, onChange, sceneList, @@ -249,16 +250,27 @@ const BasicSettings: React.FC = ({ ) : (
{sceneList - .filter(scene => scene.id !== 10) + .filter(scene => { + // 编辑模式下,如果当前选中的场景 id 是 10,则显示它 + if (isEdit && formData.scenario === 10 && scene.id === 10) { + return true; + } + // 其他情况过滤掉 id 为 10 的场景 + return scene.id !== 10; + }) .map(scene => { const selected = formData.scenario === scene.id; + // 编辑模式下,如果当前场景 id 是 10,则禁用所有场景选择 + const isDisabled = isEdit && formData.scenario === 10; return (