123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- import { useState, useEffect } from 'react';
- import { Tabs, Table, Button, message } from "antd";
- import type { TableProps } from 'antd';
- import { DownloadOutlined } from '@ant-design/icons';
- import http from '@src/http';
- import { qwDataList, qwDataExport } from '@src/http/api.ts';
- interface QwDataItem {
- dateStr: string;
- fansIncreaseCount: number;
- firstLevel: number;
- name: string;
- openRate: number;
- score: number;
- }
- interface QwDataResponse {
- curPageFirstRecNum: number;
- curPageLastRecNum: number;
- currentPage: number;
- nextPage: number;
- obj: QwDataItem;
- objs: QwDataItem[];
- offset: number;
- pageSize: number;
- prePage: number;
- totalPage: number;
- totalSize: number;
- }
- const Qw: React.FC = () => {
- const [dataSource, setDataSource] = useState<QwDataItem[]>([]);
- const [loading, setLoading] = useState<boolean>(false);
- const [downloadLoading, setDownloadLoading] = useState<boolean>(false);
- const [pagination, setPagination] = useState({
- current: 1,
- pageSize: 10,
- total: 0
- });
- const [activeKey, setActiveKey] = useState("0");
- const columns:TableProps['columns'] = [
- {
- title: '日期',
- dataIndex: 'dateStr',
- key: 'dateStr',
- },
- {
- title: '小程序访问人数',
- dataIndex: 'firstLevel',
- key: 'firstLevel',
- },
- {
- title: '传播得分',
- dataIndex: 'score',
- key: 'score',
- },
- ];
-
- const totalColumns:TableProps['columns'] = [
- {
- title: '日期',
- dataIndex: 'dateStr',
- key: 'dateStr',
- },
- {
- title: '小程序访问人数',
- dataIndex: 'firstLevel',
- key: 'firstLevel',
- },
- {
- title: '本渠道裂变率',
- dataIndex: 'score',
- key: 'score',
- },
- ];
- const specialColumns:TableProps['columns'] = [
- {
- title: '日期',
- dataIndex: 'dateStr',
- key: 'dateStr',
- },
- {
- title: '视频标题',
- dataIndex: 'title',
- key: 'title',
- },
- {
- title: '视频ID',
- dataIndex: 'videoId',
- key: 'videoId',
- },
- {
- title: '传播得分',
- dataIndex: 'score',
- key: 'score',
- },
- ];
-
- const subChannelColumns:TableProps['columns'] = [
- {
- title: '日期',
- dataIndex: 'dateStr',
- key: 'dateStr',
- },
- {
- title: '子渠道',
- dataIndex: 'subChannel',
- key: 'subChannel',
- },
- {
- title: '小程序访问人数',
- dataIndex: 'firstLevel',
- key: 'firstLevel',
- },
- {
- title: '传播得分',
- dataIndex: 'score',
- key: 'score',
- },
- ];
- const fetchQwData = async (page = 1, pageSize = 10, type = 0) => {
- try {
- setLoading(true);
- const res = await http.post<QwDataResponse>(qwDataList, {
- pageNum: page,
- pageSize: pageSize,
- type: type
- });
- if (res.success && res.data) {
- setDataSource(res.data.objs || []);
- setPagination({
- current: res.data.currentPage,
- pageSize: res.data.pageSize,
- total: res.data.totalSize
- });
- }
- } catch (error) {
- console.error('获取企微数据失败:', error);
- } finally {
- setLoading(false);
- }
- };
- useEffect(() => {
- fetchQwData(1, 10, 0);
- }, []);
- const onChange = (key: string) => {
- console.log(key);
- // 先清空数据源,避免显示上一个tab的数据
- setDataSource([]);
- fetchQwData(1, 10, Number(key));
- };
- const handleTableChange = (pagination: any) => {
- const { current, pageSize } = pagination;
- // 先清空数据源
- setDataSource([]);
- fetchQwData(current, pageSize, Number(activeKey));
- };
- const handleDownload = async () => {
- try {
- setDownloadLoading(true);
- // 根据当前选中的标签页设置type参数
- const type = Number(activeKey);
- // 使用当前分页信息
- const response = await http.post(qwDataExport, {
- pageNum: pagination.current,
- pageSize: pagination.pageSize,
- type: type
- });
- if (response.success && response.data) {
- window.open(response.data as string);
- } else {
- message.error('下载失败');
- }
- } catch {
- message.error('下载失败');
- } finally {
- setDownloadLoading(false);
- }
- };
- return (
- <>
- <div className={"flex mb-[10px]"}>
- <div className={"flex-1 leading-[32px]"}>企微数据统计</div>
- </div>
- <Tabs
- defaultActiveKey="0"
- type="card"
- tabBarExtraContent={{
- right: <Button
- type="link"
- icon={<DownloadOutlined />}
- loading={downloadLoading}
- onClick={handleDownload}
- >
- 下载数据
- </Button>
- }}
- onChange={(key) => {
- setActiveKey(key);
- onChange(key);
- }}
- items={[
- {
- key: "0",
- label: "总体",
- children: (
- <Table
- dataSource={dataSource}
- columns={totalColumns}
- rowKey="dateStr"
- loading={loading}
- pagination={{
- current: pagination.current,
- pageSize: pagination.pageSize,
- total: pagination.total,
- showSizeChanger: true,
- showTotal: (total) => `共 ${total} 条`,
- }}
- onChange={handleTableChange}
- />
- ),
- },
- {
- key: "3",
- label: "自动回复",
- children: (
- <Table
- dataSource={dataSource}
- columns={columns}
- rowKey="dateStr"
- loading={loading}
- pagination={{
- current: pagination.current,
- pageSize: pagination.pageSize,
- total: pagination.total,
- showSizeChanger: true,
- showTotal: (total) => `共 ${total} 条`,
- }}
- onChange={handleTableChange}
- />
- ),
- },
- {
- key: "4",
- label: "分链接",
- children: (
- <Table
- dataSource={dataSource}
- columns={specialColumns}
- rowKey="dateStr"
- loading={loading}
- pagination={{
- current: pagination.current,
- pageSize: pagination.pageSize,
- total: pagination.total,
- showSizeChanger: true,
- showTotal: (total) => `共 ${total} 条`,
- }}
- onChange={handleTableChange}
- />
- ),
- },
- {
- key: "5",
- label: "分子渠道",
- children: (
- <Table
- dataSource={dataSource}
- columns={subChannelColumns}
- rowKey="dateStr"
- loading={loading}
- pagination={{
- current: pagination.current,
- pageSize: pagination.pageSize,
- total: pagination.total,
- showSizeChanger: true,
- showTotal: (total) => `共 ${total} 条`,
- }}
- onChange={handleTableChange}
- />
- ),
- },
- ]}
- />
- </>
- )
- }
- export default Qw
|