2023-04-18 17:28:06 +08:00
|
|
|
|
import { post } from '@/services/ajax';
|
2023-04-17 17:47:31 +08:00
|
|
|
|
import { Area, Line } from '@ant-design/charts';
|
|
|
|
|
import { BarChartOutlined, CommentOutlined, TeamOutlined } from '@ant-design/icons';
|
|
|
|
|
import { PageContainer } from '@ant-design/pro-components';
|
2023-04-23 10:06:55 +08:00
|
|
|
|
import { Spin } from 'antd';
|
2023-04-17 17:47:31 +08:00
|
|
|
|
import React, { useEffect, useState } from 'react';
|
|
|
|
|
import { DataItemCard } from './components/DataItemCard';
|
|
|
|
|
import { DataSumItemCard } from './components/DataSumItemCard';
|
|
|
|
|
import styles from './index.module.scss';
|
|
|
|
|
|
2023-04-18 17:28:06 +08:00
|
|
|
|
type ICustChartItem = {
|
|
|
|
|
name: string;
|
|
|
|
|
num: number;
|
|
|
|
|
time: string;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
type IData = {
|
|
|
|
|
overView: {
|
|
|
|
|
custs_total: number;
|
|
|
|
|
groups_members_total: number;
|
|
|
|
|
groups_total: number;
|
|
|
|
|
};
|
|
|
|
|
custsInfo: {
|
|
|
|
|
month_custs: number;
|
|
|
|
|
today_custs: number;
|
|
|
|
|
today_loss: number;
|
|
|
|
|
today_net_growth: number;
|
|
|
|
|
};
|
|
|
|
|
groupsInfo: {
|
|
|
|
|
today_diss_groups: number;
|
|
|
|
|
today_diss_groups_members: number;
|
|
|
|
|
today_groups: number;
|
|
|
|
|
today_groups_members: number;
|
|
|
|
|
};
|
|
|
|
|
custsChart: ICustChartItem[];
|
|
|
|
|
groupsChart: ICustChartItem[];
|
|
|
|
|
};
|
|
|
|
|
|
2023-04-17 17:47:31 +08:00
|
|
|
|
const Workbench: React.FC = () => {
|
2023-04-18 17:28:06 +08:00
|
|
|
|
const [data, setData] = useState<IData>({
|
|
|
|
|
overView: {
|
|
|
|
|
custs_total: 0,
|
|
|
|
|
groups_members_total: 0,
|
|
|
|
|
groups_total: 0,
|
|
|
|
|
},
|
|
|
|
|
custsInfo: {
|
|
|
|
|
month_custs: 0,
|
|
|
|
|
today_custs: 0,
|
|
|
|
|
today_loss: 0,
|
|
|
|
|
today_net_growth: 0,
|
|
|
|
|
},
|
|
|
|
|
groupsInfo: {
|
|
|
|
|
today_diss_groups: 0,
|
|
|
|
|
today_diss_groups_members: 0,
|
|
|
|
|
today_groups: 0,
|
|
|
|
|
today_groups_members: 0,
|
|
|
|
|
},
|
|
|
|
|
custsChart: [],
|
|
|
|
|
groupsChart: [],
|
|
|
|
|
});
|
2023-04-23 10:06:55 +08:00
|
|
|
|
const [loading, setLoading] = useState(false);
|
2023-04-17 17:47:31 +08:00
|
|
|
|
|
2023-04-18 17:28:06 +08:00
|
|
|
|
const getWorkBenchInfo = () => {
|
2023-04-23 10:06:55 +08:00
|
|
|
|
setLoading(true);
|
2023-04-18 17:28:06 +08:00
|
|
|
|
post({ url: '/WorkBench/Info' }).then((res) => {
|
2023-04-23 10:06:55 +08:00
|
|
|
|
setLoading(false);
|
2023-04-18 17:28:06 +08:00
|
|
|
|
if (res.err_code == 0) {
|
|
|
|
|
if (res.over_view) {
|
|
|
|
|
data.overView = res.over_view;
|
|
|
|
|
}
|
|
|
|
|
if (res.groups_info) {
|
|
|
|
|
data.groupsInfo = res.groups_info;
|
|
|
|
|
}
|
|
|
|
|
if (res.custs_info) {
|
|
|
|
|
data.custsInfo = res.custs_info;
|
|
|
|
|
}
|
|
|
|
|
if (Array.isArray(res.custs_chart)) {
|
|
|
|
|
data.custsChart = res.custs_chart;
|
|
|
|
|
}
|
|
|
|
|
if (Array.isArray(res.groups_chart)) {
|
|
|
|
|
data.groupsChart = res.groups_chart;
|
|
|
|
|
}
|
|
|
|
|
setData({ ...data });
|
|
|
|
|
}
|
|
|
|
|
});
|
2023-04-17 17:47:31 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
2023-04-18 17:28:06 +08:00
|
|
|
|
getWorkBenchInfo();
|
2023-04-17 17:47:31 +08:00
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<PageContainer>
|
2023-04-23 10:06:55 +08:00
|
|
|
|
<Spin spinning={loading}>
|
|
|
|
|
<div className={styles.dataSum} style={{ padding: '24px 0' }}>
|
|
|
|
|
<div
|
|
|
|
|
style={{
|
|
|
|
|
display: 'flex',
|
|
|
|
|
justifyContent: 'space-between',
|
|
|
|
|
marginBottom: 24,
|
|
|
|
|
padding: '0 24px',
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<span style={{ fontSize: 18 }}>数据总览</span>
|
|
|
|
|
{/* <span style={{ color: '#999' }}>更新时间:2022-12-12 23:30:30</span> */}
|
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.dataSumBox}>
|
|
|
|
|
<DataSumItemCard
|
|
|
|
|
title="客户数量"
|
|
|
|
|
content="全部客户数量(含重复)"
|
|
|
|
|
icon={<TeamOutlined className={styles.icon} />}
|
|
|
|
|
count={data.overView.custs_total}
|
|
|
|
|
/>
|
|
|
|
|
<DataSumItemCard
|
|
|
|
|
title="客群数量"
|
|
|
|
|
content="全部客群数量"
|
|
|
|
|
icon={<CommentOutlined className={styles.icon} />}
|
|
|
|
|
count={data.overView.groups_total}
|
|
|
|
|
/>
|
|
|
|
|
<DataSumItemCard
|
|
|
|
|
title="客群成员总数"
|
|
|
|
|
content="客群成员的总数(含员工)(含重复)"
|
|
|
|
|
icon={<BarChartOutlined className={styles.icon} />}
|
|
|
|
|
count={data.overView.groups_members_total}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
2023-04-17 17:47:31 +08:00
|
|
|
|
</div>
|
2023-04-23 10:06:55 +08:00
|
|
|
|
<div className={styles.dataSum}>
|
|
|
|
|
<div style={{ fontSize: 18 }}>客户数据</div>
|
|
|
|
|
<div className={styles.dataCardBox}>
|
|
|
|
|
<DataItemCard
|
|
|
|
|
title="今日新增客户"
|
|
|
|
|
content="今日添加的客户数(含重复及流失)"
|
|
|
|
|
count={data.custsInfo.today_custs}
|
|
|
|
|
/>
|
|
|
|
|
<span style={{ width: 16 }} />
|
|
|
|
|
{/* <DataItemCard
|
2023-04-17 17:47:31 +08:00
|
|
|
|
title="今日跟进客户"
|
2023-04-19 15:30:29 +08:00
|
|
|
|
content="今日处于跟进中状态的客户数(含重复)"
|
2023-04-17 17:47:31 +08:00
|
|
|
|
count={11}
|
2023-04-18 17:28:06 +08:00
|
|
|
|
/> */}
|
2023-04-23 10:06:55 +08:00
|
|
|
|
{/* <span style={{ width: 16 }} /> */}
|
|
|
|
|
<DataItemCard
|
|
|
|
|
title="今日净增客户"
|
|
|
|
|
content="今日添加的客户数(不含重复及流失)"
|
|
|
|
|
count={data.custsInfo.today_net_growth}
|
|
|
|
|
/>
|
|
|
|
|
<span style={{ width: 16 }} />
|
|
|
|
|
<DataItemCard
|
|
|
|
|
title="今日流失客户"
|
|
|
|
|
content="今日流失的全部客户数量"
|
|
|
|
|
count={data.custsInfo.today_loss}
|
|
|
|
|
/>
|
|
|
|
|
<span style={{ width: 16 }} />
|
|
|
|
|
<DataItemCard
|
|
|
|
|
title="本月新增客户"
|
|
|
|
|
content="本月添加的客户数(含重复及流失)"
|
|
|
|
|
count={data.custsInfo.month_custs}
|
|
|
|
|
/>
|
|
|
|
|
{/* <DataItemCard
|
2023-04-17 17:47:31 +08:00
|
|
|
|
title="昨日发送申请"
|
|
|
|
|
content="当前员工数权限范围内主动向客户发起的申请数"
|
|
|
|
|
count={11}
|
2023-04-18 17:28:06 +08:00
|
|
|
|
/> */}
|
2023-04-23 10:06:55 +08:00
|
|
|
|
</div>
|
|
|
|
|
<Line
|
|
|
|
|
data={data.custsChart}
|
|
|
|
|
xField="time"
|
|
|
|
|
yField="num"
|
|
|
|
|
seriesField="name"
|
|
|
|
|
// yAxis= {{
|
|
|
|
|
// label: {
|
|
|
|
|
// formatter: (v: any) => `${(v / 10e8).toFixed(1)} B`,
|
|
|
|
|
// },
|
|
|
|
|
// },}
|
|
|
|
|
legend={{
|
|
|
|
|
position: 'top',
|
|
|
|
|
}}
|
|
|
|
|
smooth={true}
|
|
|
|
|
// @TODO 后续会换一种动画方式
|
|
|
|
|
animation={{
|
|
|
|
|
appear: {
|
|
|
|
|
animation: 'path-in',
|
|
|
|
|
duration: 3000,
|
|
|
|
|
},
|
|
|
|
|
}}
|
2023-04-17 17:47:31 +08:00
|
|
|
|
/>
|
2023-04-23 10:06:55 +08:00
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.dataSum}>
|
|
|
|
|
<div style={{ fontSize: 18 }}>客群数据</div>
|
|
|
|
|
<div className={styles.dataCardBox}>
|
|
|
|
|
<DataItemCard
|
|
|
|
|
title="今日新增客群"
|
|
|
|
|
content="今日创建的客群数"
|
|
|
|
|
count={data.groupsInfo.today_groups}
|
|
|
|
|
/>
|
|
|
|
|
<span style={{ width: 16 }} />
|
|
|
|
|
<DataItemCard
|
|
|
|
|
title="今日解散客群"
|
|
|
|
|
content="今日解散的客群数"
|
|
|
|
|
count={data.groupsInfo.today_diss_groups}
|
|
|
|
|
/>
|
|
|
|
|
<span style={{ width: 16 }} />
|
|
|
|
|
<DataItemCard
|
|
|
|
|
title="今日新增成员"
|
|
|
|
|
content="今日新增客群成员数(含员工)"
|
|
|
|
|
count={data.groupsInfo.today_groups_members}
|
|
|
|
|
/>
|
|
|
|
|
<span style={{ width: 16 }} />
|
|
|
|
|
<DataItemCard
|
|
|
|
|
title="今日退出成员"
|
|
|
|
|
content="今日退出客群成员数(含员工)"
|
|
|
|
|
count={data.groupsInfo.today_diss_groups_members}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
<Area
|
|
|
|
|
data={data.groupsChart}
|
|
|
|
|
xField="time"
|
|
|
|
|
yField="num"
|
|
|
|
|
seriesField="name"
|
|
|
|
|
smooth={true}
|
|
|
|
|
legend={{ position: 'top' }}
|
|
|
|
|
isStack={false}
|
2023-04-17 17:47:31 +08:00
|
|
|
|
/>
|
|
|
|
|
</div>
|
2023-04-23 10:06:55 +08:00
|
|
|
|
</Spin>
|
2023-04-17 17:47:31 +08:00
|
|
|
|
</PageContainer>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default Workbench;
|