From e08a805e88e852efa5c3d58192bf3b4a19aebb5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=B3=E6=B8=85=E7=88=BD?= Date: Tue, 13 May 2025 14:00:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=81=E5=9F=9F=E6=93=8D=E7=9B=98=E6=89=8B?= =?UTF-8?q?=20-=20=E6=B5=81=E9=87=8F=E6=B1=A0=E6=BD=9C=E5=9C=A8=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E7=8A=B6=E6=80=81=E7=B1=BB=E5=9E=8B=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cunkebao/app/traffic-pool/page.tsx | 51 ++++++++++++++-- Server/application/cunkebao/config/route.php | 1 + .../GetDissociateTypeListV1Controller.php | 60 ++++++++----------- 3 files changed, 71 insertions(+), 41 deletions(-) diff --git a/Cunkebao/app/traffic-pool/page.tsx b/Cunkebao/app/traffic-pool/page.tsx index 38b71742..e5f2736a 100644 --- a/Cunkebao/app/traffic-pool/page.tsx +++ b/Cunkebao/app/traffic-pool/page.tsx @@ -21,6 +21,7 @@ import { useDebounce } from "@/hooks/use-debounce" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Badge } from "@/components/ui/badge" +import { api } from "@/lib/api" interface UserTag { id: string @@ -44,6 +45,17 @@ interface TrafficUser { tags: UserTag[] } +interface StatusType { + id: number + name: string +} + +interface ApiResponse { + code: number + msg: string + data: T +} + export default function TrafficPoolPage() { const router = useRouter() const searchParams = useSearchParams() @@ -51,7 +63,8 @@ export default function TrafficPoolPage() { const [loading, setLoading] = useState(true) // Start with loading state const [activeCategory, setActiveCategory] = useState("potential") // Changed default from "all" to "potential" const [sourceFilter, setSourceFilter] = useState("all") - const [statusFilter, setStatusFilter] = useState("all") + const [statusTypes, setStatusTypes] = useState([]) + const [statusFilter, setStatusFilter] = useState("all") const [searchQuery, setSearchQuery] = useState("") const [currentPage, setCurrentPage] = useState(1) const [totalPages, setTotalPages] = useState(1) @@ -81,7 +94,7 @@ export default function TrafficPoolPage() { search: debouncedSearchQuery, category: activeCategory, source: sourceFilter, - status: statusFilter, + status: statusFilter === "all" ? "" : statusFilter, }) // 检查是否有来源参数 @@ -147,14 +160,38 @@ export default function TrafficPoolPage() { } }, [currentPage, debouncedSearchQuery, activeCategory, sourceFilter, statusFilter, toast, searchParams]) + const fetchStatusTypes = useCallback(async () => { + try { + const response = await api.get>('/v1/traffic/pool/types') + + if (response.code === 200) { + setStatusTypes(response.data) + } else { + toast({ + title: "获取状态列表失败", + description: response.msg || "请稍后重试", + variant: "destructive", + }) + } + } catch (error) { + console.error("获取状态列表失败:", error) + toast({ + title: "获取状态列表失败", + description: "请检查网络连接或稍后重试", + variant: "destructive", + }) + } + }, []) + useEffect(() => { fetchUsers() + fetchStatusTypes() return () => { if (abortControllerRef.current) { abortControllerRef.current.abort() } } - }, [fetchUsers]) + }, [fetchUsers, fetchStatusTypes]) const handleUserClick = (user: TrafficUser) => { setSelectedUser(user) @@ -259,9 +296,11 @@ export default function TrafficPoolPage() { 全部状态 - 待处理 - 已添加 - 已失败 + {statusTypes.map((status) => ( + + {status.name} + + ))} diff --git a/Server/application/cunkebao/config/route.php b/Server/application/cunkebao/config/route.php index 66827207..73175ea5 100644 --- a/Server/application/cunkebao/config/route.php +++ b/Server/application/cunkebao/config/route.php @@ -42,6 +42,7 @@ Route::group('v1/', function () { // 流量池相关 Route::group('traffic/pool', function () { Route::get('', 'app\cunkebao\controller\traffic\GetDissociateListWithInCompanyV1Controller@index'); + Route::get('types', 'app\cunkebao\controller\traffic\GetDissociateTypeListV1Controller@index'); }); // 工作台相关 diff --git a/Server/application/cunkebao/controller/traffic/GetDissociateTypeListV1Controller.php b/Server/application/cunkebao/controller/traffic/GetDissociateTypeListV1Controller.php index bfe89b72..c48bab9a 100644 --- a/Server/application/cunkebao/controller/traffic/GetDissociateTypeListV1Controller.php +++ b/Server/application/cunkebao/controller/traffic/GetDissociateTypeListV1Controller.php @@ -12,52 +12,42 @@ use library\ResponseHelper; */ class GetDissociateTypeListV1Controller extends BaseController { - - /** - * 获取流量池列表 - * - * @param array $where - * @return \think\Paginator - */ - protected function getPoolListByCompanyId(array $where): \think\Paginator + protected function getTypeList(): array { - $query = TrafficPoolModel::alias('t') - ->field( - [ - 't.identifier', 't.mobile', 't.wechatId', - 's.id', 's.fromd', 's.status', 's.createTime' - ] - ) - ->join('traffic_source s', 't.identifier=s.identifier') - ->order('s.id desc'); - - foreach ($where as $key => $value) { - if (is_numeric($key) && is_array($value) && isset($value[0]) && $value[0] === 'exp') { - $query->whereExp('', $value[1]); - continue; - } - - $query->where($key, $value); - } - - return $query->paginate($this->request->param('limit/d', 10), false, ['page' => $this->request->param('page/d', 1)]); + return [ + [ + 'id' => 1, + 'name' => '待处理' + ], + [ + 'id' => 2, + 'name' => '处理中' + ], + [ + 'id' => 4, + 'name' => '已拒绝' + ], + [ + 'id' => 5, + 'name' => '已过期' + ], + [ + 'id' => 6, + 'name' => '已取消' + ] + ]; } /** - * 获取流量池列表 + * 潜在客户的全部状态 * * @return \think\response\Json */ public function index() { try { - $result = $this->getPoolListByCompanyId( $this->makeWhere() ); - return ResponseHelper::success( - [ - 'list' => $result->items(), - 'total' => $result->total(), - ] + $this->getTypeList() ); } catch (\Exception $e) { return ResponseHelper::error($e->getMessage(), $e->getCode());