私域操盘手 - 流量池潜在用户的状态类型筛选功能

This commit is contained in:
柳清爽
2025-05-13 14:00:56 +08:00
parent 869ce043fc
commit e08a805e88
3 changed files with 71 additions and 41 deletions

View File

@@ -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<T> {
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<StatusType[]>([])
const [statusFilter, setStatusFilter] = useState<string>("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<ApiResponse<StatusType[]>>('/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() {
</SelectTrigger>
<SelectContent>
<SelectItem value="all"></SelectItem>
<SelectItem value="pending"></SelectItem>
<SelectItem value="added"></SelectItem>
<SelectItem value="failed"></SelectItem>
{statusTypes.map((status) => (
<SelectItem key={status.id} value={status.id.toString()}>
{status.name}
</SelectItem>
))}
</SelectContent>
</Select>
</div>

View File

@@ -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');
});
// 工作台相关

View File

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