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());