import { useAjax } from '@/Hook/useAjax'; import React, { useEffect, useState } from 'react'; import { getCorpExternalUserRepeatListApi, getExternalUserRepeatByCorpListApi, getExternalUserRepeatCorpApi, getExternalUserRepeatCorpUserApi } from '../../API/home'; import { Avatar, Card, Col, Flex, Input, Row, Spin, Statistic, Table, Tabs, Typography } from 'antd'; import { BarChartOutlined, GlobalOutlined, RetweetOutlined, UserOutlined } from '@ant-design/icons'; import useEcharts from '@/Hook/useEcharts'; const { Title } = Typography; import style from './index.less' const Home: React.FC = () => { /*******************************************/ const { Bar, Pie } = useEcharts() const [queryParmas, setQueryParmas] = useState<{ pageNum: number, pageSize: number, corpName?: string }>({ pageNum: 1, pageSize: 20 }) const [queryParmasZt, setQueryParmasZt] = useState<{ pageNum: number, pageSize: number, corpName?: string }>({ pageNum: 1, pageSize: 20 }) const [corpRepeat, setCorpRepeat] = useState<{ [x: string]: any }>({}) const [corpUserRepeat, setCorpUserRepeat] = useState<{ [x: string]: any }>({}) const [barCorpData, setBarCorpData] = useState<{ name: string, value: number }[]>([]) const [barCorpUserData, setBarCorpUserData] = useState<{ name: string, value: number }[]>([]) const [activeKey, setActiveKey] = useState('1') const [pieData, setPieData] = useState<{ name: string, value: number }[]>([]) const [overflowData, setOverflowData] = useState<{ avgCorpRepeatUserRate: number, repeatUserRate: number, userCount: number }>({ avgCorpRepeatUserRate: 0, repeatUserRate: 0, userCount: 0 }) const getExternalUserRepeatCorp = useAjax(() => getExternalUserRepeatCorpApi()) const getExternalUserRepeatCorpUser = useAjax(() => getExternalUserRepeatCorpUserApi()) const getExternalUserRepeatByCorpList = useAjax((params) => getExternalUserRepeatByCorpListApi(params)) const getCorpExternalUserRepeatList = useAjax((params) => getCorpExternalUserRepeatListApi(params)) /*******************************************/ useEffect(() => { getExternalUserRepeatByCorpList.run(queryParmas).then(res => { if (res?.data?.records?.length) { setPieData(res?.data?.records?.map(item => { return { name: item.corpName, value: item.externalUserRepeatCount } })) } else { setPieData([]) } }) }, [queryParmas]) useEffect(() => { getCorpExternalUserRepeatList.run(queryParmasZt) }, [queryParmasZt]) useEffect(() => { getExternalUserRepeatCorp.run().then(res => { if (res?.data) { const cr = res.data setCorpRepeat(cr) setBarCorpData([ { name: '非重复添加', value: cr?.oneRepeatCount }, { name: '重复添加2名', value: cr?.twoRepeatCount }, { name: '重复添加3名', value: cr?.threeRepeatCount }, { name: '重复添加4名', value: cr?.fourRepeatCount }, { name: '重复添加5名', value: cr?.fiveRepeatCount }, { name: '重复添加5名以上', value: cr?.gtFiveRepeatCount } ]) } else { setCorpRepeat({}) setBarCorpData([]) } }) getExternalUserRepeatCorpUser.run().then(res => { if (res?.data) { const cur = res.data setCorpUserRepeat(cur) setOverflowData({ avgCorpRepeatUserRate: cur?.avgCorpRepeatUserRate || 0, repeatUserRate: cur?.repeatUserRate || 0, userCount: cur?.userCount || 0 }) setBarCorpUserData([ { name: '非重复添加', value: cur?.oneRepeatCount }, { name: '重复添加2名', value: cur?.twoRepeatCount }, { name: '重复添加3名', value: cur?.threeRepeatCount }, { name: '重复添加4名', value: cur?.fourRepeatCount }, { name: '重复添加5名', value: cur?.fiveRepeatCount }, { name: '重复添加5名以上', value: cur?.gtFiveRepeatCount } ]) } else { setCorpUserRepeat({}) setOverflowData({ avgCorpRepeatUserRate: 0, repeatUserRate: 0, userCount: 0 }) setBarCorpUserData([]) } }) }, []) return
集团总粉丝数} value={overflowData.userCount} /> 平均主体重粉率} value={overflowData.avgCorpRepeatUserRate ? overflowData.avgCorpRepeatUserRate * 100 : 0} precision={4} suffix="%" /> 集团重粉率} value={overflowData.repeatUserRate ? overflowData.repeatUserRate * 100 : 0} precision={4} suffix="%" /> <RetweetOutlined style={{ color: '#1890ff' }} /> 主体重粉次数统计 { setQueryParmas({ ...queryParmas, corpName: e, pageNum: 1 }); }} style={{ width: 200 }} allowClear /> }, { title: '集团内重粉数', dataIndex: 'externalUserRepeatCount', key: 'externalUserRepeatCount', align: 'center', render: (text: any) => }, { title: '集团内重粉率', dataIndex: 'externalUserRepeatRate', key: 'externalUserRepeatRate', align: 'center', render: (text: any) => 0.2 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, { title: '主体粉丝总数', dataIndex: 'corpExternalUserCount', key: 'corpExternalUserCount', align: 'center', render: (text: any) => }, { title: '主体粉丝在集团占比', dataIndex: 'corpExternalUserRate', key: 'corpExternalUserRate', align: 'center', render: (text: any) => 0.2 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, { title: '主体客服号数量', dataIndex: 'corpUserCount', key: 'corpUserCount', align: 'center', render: (text: any) => }, { title: '主体内重粉数', dataIndex: 'corpExternalUserRepeatCount', key: 'corpExternalUserRepeatCount', align: 'center', render: (text: any) => }, { title: '主体内重粉率', dataIndex: 'corpExternalUserRepeatRate', key: 'corpExternalUserRepeatRate', align: 'center', render: (text: any) => 0.2 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, ]} scroll={{ y: 300, x: 900 }} bordered dataSource={getExternalUserRepeatByCorpList.data?.data?.records} loading={getExternalUserRepeatByCorpList.loading} rowKey="corpId" pagination={{ total: getExternalUserRepeatByCorpList.data?.data?.total, current: getExternalUserRepeatByCorpList?.data?.data?.current || 1, pageSize: getExternalUserRepeatByCorpList?.data?.data?.size || 20, onChange: (page: number, pageSize: number) => { setQueryParmas({ ...queryParmas, pageNum: page, pageSize }) } }} /> <BarChartOutlined style={{ color: '#22c55e' }} /> 用户重粉次数统计 { setQueryParmasZt({ ...queryParmasZt, corpName: e, pageNum: 1 }); }} style={{ width: 200 }} allowClear />} items={[ { key: '1', label: '主体维度', children:
}, { title: '非重复添加人数', dataIndex: 'oneRepeatCount', key: 'oneRepeatCount', align: 'center', render: (text: any) => }, { title: '非重复添加人数比例', dataIndex: 'oneRepeatCountRate', key: 'oneRepeatCountRate', align: 'center', render: (text: any) => 0.5 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, { title: '重复添加2名人数', dataIndex: 'twoRepeatCount', key: 'twoRepeatCount', align: 'center', render: (text: any) => }, { title: '重复添加2名人数比例', dataIndex: 'twoRepeatCountRate', key: 'twoRepeatCountRate', align: 'center', render: (text: any) => 0.1 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, { title: '重复添加3名人数', dataIndex: 'threeRepeatCount', key: 'threeRepeatCount', align: 'center', render: (text: any) => }, { title: '重复添加3名人数比例', dataIndex: 'threeRepeatCountRate', key: 'threeRepeatCountRate', align: 'center', render: (text: any) => 0.09 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, { title: '重复添加4名人数', dataIndex: 'fourRepeatCount', key: 'fourRepeatCount', align: 'center', render: (text: any) => }, { title: '重复添加4名人数比例', dataIndex: 'fourRepeatCountRate', key: 'fourRepeatCountRate', align: 'center', render: (text: any) => 0.08 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, { title: '重复添加5名人数', dataIndex: 'fiveRepeatCount', key: 'fiveRepeatCount', align: 'center', render: (text: any) => }, { title: '重复添加5名人数比例', dataIndex: 'fiveRepeatCountRate', key: 'fiveRepeatCountRate', align: 'center', render: (text: any) => 0.07 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, { title: '重复添加5名以上人数', dataIndex: 'gtFiveRepeatCount', key: 'gtFiveRepeatCount', align: 'center', render: (text: any) => }, { title: '重复添加5名以上人数比例', dataIndex: 'gtFiveRepeatCountRate', key: 'gtFiveRepeatCountRate', align: 'center', render: (text: any) => 0.06 ? { color: '#cf1322', fontSize: 12 } : { color: '#3f8600', fontSize: 12 }} suffix="%" precision={4} /> }, ]} scroll={{ y: 300, x: 900 }} bordered dataSource={getCorpExternalUserRepeatList.data?.data?.records} loading={getCorpExternalUserRepeatList.loading} rowKey="corpId" pagination={{ total: getCorpExternalUserRepeatList.data?.data?.total, current: getCorpExternalUserRepeatList?.data?.data?.current || 1, pageSize: getCorpExternalUserRepeatList?.data?.data?.size || 20, onChange: (page: number, pageSize: number) => { setQueryParmasZt({ ...queryParmasZt, pageNum: page, pageSize }) } }} /> }, { key: '2', label: '企业维度', children: }, { key: '3', label: '客服号维度', children: }, ]} onChange={(e) => { setActiveKey(e) }} activeKey={activeKey} /> }; const DetailsTemplate: React.FC<{ data: { [x: string]: any }, title: string }> = ({ data, title }) => { return {title || '详细数据'}
粉丝总数
非重复添加人数
0.5 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }} suffix="%" precision={4} />)
重复添加2名人数
0.1 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }} suffix="%" precision={4} />)
重复添加3名人数
0.09 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }} suffix="%" precision={4} />)
重复添加4名人数
0.08 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }} suffix="%" precision={4} />)
重复添加5名人数
0.07 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }} suffix="%" precision={4} />)
重复添加5名以上人数
0.06 ? { color: '#cf1322', fontSize: 16 } : { color: '#3f8600', fontSize: 16 }} suffix="%" precision={4} />)
}; export default Home;