import React, { useEffect, useState } from 'react'; import { Avatar, Button, Card, Col, List, Space, Tag } from 'antd'; import { useModel } from '@umijs/max'; import { PageContainer, ProCard } from '@ant-design/pro-components'; import { ArrowDownOutlined, ArrowUpOutlined, MoreOutlined } from '@ant-design/icons'; import * as echarts from 'echarts'; import ECharts from '@/pages/example/components/ECharts'; import { getDataList } from '@/services/rwa/Welcome'; const Welcome: React.FC = () => { const { initialState } = useModel('@@initialState'); const menuList = initialState?.menuList; const cols: React.ReactElement[] = []; menuList?.forEach((item) => { cols.push( , ); }); /** * 顶部任务卡片数据 * 存储8个数据 * 0:今日任务总数 * 1:昨日任务总数 * 2:今日完成总数 * 3:昨日完成总数 * 4:今日未完成总数 * 5:昨日未完成总数 * 6:今日废弃总数 * 7:昨日废弃总数 */ const [taskDataCount, setTaskDataCount] = useState([0, 0, 0, 0, 0, 0, 0, 0]); const [contUuCount, setContUuCount] = useState([]); // 表内业务风险暴露(一级)风险加权资产占比 const [ withinTableAssetType,setWithinTableAssetType] = useState([]); // 表外业务风险暴露(一级)风险加权资产占比 const [ outTableAssetType,setOutTableAssetType] = useState([]); // 前十大机构信用风险加权资产合计 const [top10OrgAssetAccountName,setTop10OrgAssetAccountName] = useState([]); const [top10OrgAssetAccountValue,setTop10OrgAssetAccountValue] = useState([]); // 风险暴露(一级)风险加权资产占比 const [riskExposeAssetRatio,setRiskExposeAssetRatio] = useState([]); // 风险暴露(一级)缓释前风险暴露占比 const [preReleaseRiskExposeAssetRatio,setPreReleaseRiskExposeAssetRatio] = useState([]); // 信用风险缓释工具当期缓释覆盖金额占比 const [creditRiskReleaseTool,setCreditRiskReleaseTool] = useState([]); // 风险暴露分类(一级)当期缓释情况 const [riskExposeClass,setRiskExposeClass] = useState([]); // 存放x轴标签值 const [xLableList,setXLableList] = useState([]); // 缓释数据存放list const [releaseDataList,setReleaseDataList] = useState([]); // 未缓释数据存放list const [unReleaseDataList,setUnReleaseDataList] = useState([]); // 缓释比例存放list const [releaseRatioDataList,setReleaseRatioDataList] = useState([]); /** * 模拟造数方法,正是环境删掉 * @param minValue * @param maxValue * @returns */ const selectFrom = (minValue: number, maxValue: number) => { // 通过最大值减去最小值然后加1得到取值的范围可能值的总数 // 例如取2到10之间的整数,10-2 = 8 const choices = maxValue - minValue; // 然后通过随机数乘以刚才的到的值, // 例如:Math.random() * 8,由于得到的是小于1的随机数,所以随机最大值0.99*8得到的数始终小于8 // 然后使用floor方法向下取正得到的数最大值就是7,然后再加上最小值 return Math.floor(Math.random() * choices + minValue); }; const chartSetOption = ( id: string, title: string, optionPropss: { seriesName: string; type: 'pie'; data: any[] }[], color?: string[], ) => { const titleProps = { text: title, left: 'left', textStyle: { fontSize: '20', }, }; const seriesProps: any[] = []; optionPropss.forEach((optionProps: { seriesName: string; type: 'pie'; data: any[] }) => { if (optionProps.type === 'pie') { seriesProps.push({ name: optionProps.seriesName, type: optionProps.type, data: optionProps.data, radius: '70%', label: { show: false, }, labelLine: { show: false, }, itemStyle: { borderRadius: 10, borderColor: '#fff', borderWidth: 2, }, center: ['30%', '50%'], }); } }); const option: Record = { title: titleProps, tooltip: { trigger: 'item', }, legend: { orient: 'vertical', left: 'right', }, series: seriesProps, }; if (color) { option!.color = color; } const dom = document.getElementById(id); if (dom) { let chart = echarts.init(dom); //销毁图表,否则图表无法重新创建 if (chart) { try { chart.dispose(); } catch (e) {} } chart = echarts.init(dom); chart.setOption(option); } }; const init = () => { setTaskDataCount([ selectFrom(1000, 4000), selectFrom(1000, 4000), selectFrom(800, 1000), selectFrom(800, 1000), selectFrom(800, 1000), selectFrom(800, 1000), selectFrom(800, 1000), selectFrom(800, 1000), ]); chartSetOption( 'contCard-prodUseCount', '产品使用统计', [ { seriesName: '使用数量', type: 'pie', data: [ { value: selectFrom(1000, 4000), name: '产品配置标准版本管理' }, { value: selectFrom(1000, 4000), name: '系统管理' }, { value: selectFrom(1000, 4000), name: '平台管理' }, { value: selectFrom(1000, 4000), name: '财务引擎' }, { value: selectFrom(1000, 4000), name: '规则引擎' }, { value: selectFrom(1000, 4000), name: '交易引擎' }, { value: selectFrom(1000, 4000), name: '模型引擎' }, { value: selectFrom(1000, 4000), name: '流程引擎' }, { value: selectFrom(1000, 4000), name: '权限管理' }, { value: selectFrom(1000, 4000), name: '公共机制管理' }, { value: selectFrom(1000, 4000), name: '数据补录' }, { value: selectFrom(1000, 4000), name: '批次配置管理' }, ], }, ], [ '#9ED4E8', '#F49495', '#FBD88B', '#B2DC9C', '#879BD6', '#FDC537', '#F833A1', '#718EF4', '#49C6FF', '#72EBCC', '#B6B7E9', '#FEDEE0', ], ); setContUuCount([ { title: '超级管理员', avatar: '/avatar.png', description: '系统管理:203 | 平台管理:23 | 权限管理:18', tags: [ { color: '#F53E27', title: '系统管理' }, { color: '#FA7921', title: '平台管理' }, ], }, { title: '测试管理员', }, { title: '业务管理员', }, { title: '维护管理员', }, ]); }; useEffect(() => { init(); //十分钟请求一次后台获取数据 setInterval(init, 1000 * 60 * 3); getChartData(); }, []); const getChartData = async () => { const resData = await getDataList() // 表内业务风险暴露(一级)风险加权资产占比 setWithinTableAssetType(resData.WithinTableAssetType?.pieData); // 表外业务风险暴露(一级)风险加权资产占比 setOutTableAssetType(resData.OutTableAssetType?.pieData); // 前十大机构信用风险加权资产合计 if (resData.Top10OrgAssetAccount?.pieData && resData.Top10OrgAssetAccount?.pieData.length > 0) { resData.Top10OrgAssetAccount?.pieData.forEach((item,index)=>{ if (item?.name) { top10OrgAssetAccountName.push(item?.name); } if (item.value) { top10OrgAssetAccountValue.push(item.value); } }); setTop10OrgAssetAccountName(...[top10OrgAssetAccountName]); setTop10OrgAssetAccountValue(...[top10OrgAssetAccountValue]); } else { setTop10OrgAssetAccountName([]); setTop10OrgAssetAccountValue([]); } // 风险暴露(一级)风险加权资产占比 setRiskExposeAssetRatio(resData.RiskExposeAssetRatio?.pieData); // 风险暴露(一级)缓释前风险暴露占比 setPreReleaseRiskExposeAssetRatio(resData.PreReleaseRiskExposeAssetRatio?.pieData); // 信用风险缓释工具当期缓释覆盖金额占比 setCreditRiskReleaseTool(resData.CreditRiskReleaseTool?.pieData); // 风险暴露分类(一级)当期缓释情况 if (resData.RiskExposeClass) { if (resData.RiskExposeClass.xLabels) { setXLableList(resData.RiskExposeClass.xLabels); } if (resData.RiskExposeClass.xData) { setReleaseDataList(resData.RiskExposeClass.xData); } if (resData.RiskExposeClass.yData) { setUnReleaseDataList(resData.RiskExposeClass.yData); } if (resData.RiskExposeClass.zData) { setReleaseRatioDataList(resData.RiskExposeClass.zData); } } setRiskExposeClass(resData.RiskExposeClass?.pieData); } /** * 任务卡片生成 * @param title 卡片标题 * @param taskIndex 卡片数据索引 * @returns */ const drawTaskCard = (title: string, taskIndex: number) => { const today = taskDataCount[taskIndex]; const yesterday = taskDataCount[taskIndex + 1]; return (
{title}
{today >= yesterday ? ( ) : ( )}
{today}
较昨日 {today >= yesterday ? ( 上涨 ) : ( 下降 )} {Math.abs(today - yesterday)}个
); }; const chartOne = { title: { text: '表内业务风险暴露(一级)风险加权资产占比', left: 'center' }, tooltip: { trigger: 'item' }, legend: { top: '90%', left: 'center' }, series: [ { name: 'Access From', type: 'pie', radius: ['40%', '70%'], avoidLabelOverlap: false, itemStyle: { borderRadius: 10, borderColor: '#fff', borderWidth: 2 }, label: { position: 'outer', alignTo: 'none', bleedMargin: 5 }, // emphasis: { // label: { // show: true, // fontSize: 10, // fontWeight: 'bold' // } // }, emphasis: { label: { show: true, fontSize: 20, fontWeight: 'bold' }, itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } }, labelLine: { show: true }, data: withinTableAssetType } ] }; const chartTwo = { title: { text: '表外业务风险暴露(一级)风险加权资产占比', left: 'center' }, tooltip: { trigger: 'item' }, legend: { top: '90%', left: 'center' }, series: [ { name: 'Access From', type: 'pie', radius: ['40%', '70%'], avoidLabelOverlap: false, itemStyle: { borderRadius: 10, borderColor: '#fff', borderWidth: 2 }, label: { position: 'outer', alignTo: 'none', bleedMargin: 5 }, emphasis: { label: { show: true, fontSize: 20, fontWeight: 'bold' } }, labelLine: { show: true }, data:outTableAssetType } ] }; const chartThree = { title: { text: '前十大机构信用风险加权资产合计', left: 'center' }, xAxis: { type: 'category', data: top10OrgAssetAccountName }, yAxis: { min:0, max: 250000, interval: 50000, type: 'value', }, series: [ { data: top10OrgAssetAccountValue, type: 'bar', } ] }; const chartFour = { title: { text: '风险暴露(一级)风险加权资产占比', left: 'center' }, tooltip: { trigger: 'item' }, legend: { top: '90%', left: 'center' }, series: [ { name: 'Access From', type: 'pie', radius: ['40%', '70%'], avoidLabelOverlap: false, itemStyle: { borderRadius: 10, borderColor: '#fff', borderWidth: 2 }, label: { position: 'outer', alignTo: 'none', bleedMargin: 5 }, emphasis: { label: { show: true, fontSize: 20, fontWeight: 'bold' } }, labelLine: { show: true }, data: riskExposeAssetRatio } ] }; const chartFive = { title: { text: '风险暴露(一级)缓释前风险暴露占比', left: 'center' }, tooltip: { trigger: 'item' }, legend: { top: '90%', left: 'center' }, series: [ { name: 'Access From', type: 'pie', radius: ['40%', '70%'], avoidLabelOverlap: false, itemStyle: { borderRadius: 10, borderColor: '#fff', borderWidth: 2 }, label: { position: 'outer', alignTo: 'none', bleedMargin: 5 }, emphasis: { label: { show: true, fontSize: 20, fontWeight: 'bold' } }, labelLine: { show: true }, data: preReleaseRiskExposeAssetRatio } ] }; const chartSix = { title: { text: '信用风险缓释工具当期缓释覆盖金额占比', left: 'center' }, tooltip: { trigger: 'item' }, legend: { top: '90%', left: 'center' }, series: [ { name: 'Access From', type: 'pie', radius: ['40%', '70%'], avoidLabelOverlap: false, itemStyle: { borderRadius: 10, borderColor: '#fff', borderWidth: 2 }, label: { position: 'outer', alignTo: 'none', bleedMargin: 5 }, emphasis: { label: { show: true, fontSize: 20, fontWeight: 'bold' } }, labelLine: { show: true }, data: creditRiskReleaseTool } ] }; const chartSeven ={ title: { text: '风险暴露分类(一级)当期缓释情况', left: 'center' }, tooltip: { trigger: 'axis', axisPointer: { type: 'cross', crossStyle: { color: '#999' } } }, toolbox: { feature: { dataView: { show: true, readOnly: true }, magicType: { show: true, type: ['line', 'bar'] }, restore: { show: true }, saveAsImage: { show: true } } }, legend: { top:'90%', data: ['缓释', '未缓释', '缓释比例'] }, xAxis: [ { type: 'category', data: xLableList, axisPointer: { type: 'shadow' } } ], yAxis: [ { type: 'value', min: 0, max: 5000000, interval: 1000000, axisLabel: { formatter: '{value}' } }, { type: 'value', min: 0, max: 125, interval: 25, axisLabel: { formatter: '{value}' } } ], series: [ { name: '缓释', type: 'bar', tooltip: { valueFormatter: function (value: number) { return (value as number) + ' 万元'; } }, stack: 'total', data:releaseDataList }, { name: '未缓释', type: 'bar', tooltip: { valueFormatter: function (value: number) { return (value as number) + ' 万元'; } }, stack: 'total', data: unReleaseDataList }, { name: '缓释比例', type: 'line', yAxisIndex: 1, tooltip: { valueFormatter: function (value: number) { return (value as number) + ' %'; } }, data: releaseRatioDataList } ] }; return (
); }; export default Welcome;