You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.6 KiB
React
94 lines
2.6 KiB
React
2 years ago
|
import { useEffect, useState } from 'react';
|
||
|
import { observer } from 'mobx-react';
|
||
|
import { Bullet } from '@ant-design/plots';
|
||
2 years ago
|
import { sortBy, merge } from '../utils/commons';
|
||
2 years ago
|
import { dataFieldAlias } from '../libs/ht';
|
||
|
|
||
|
// const layoutLabel = {
|
||
|
// 'vertical':
|
||
|
// };
|
||
2 years ago
|
|
||
|
export default observer((props) => {
|
||
2 years ago
|
const { dataSource, itemLength, ...extProps } = props;
|
||
2 years ago
|
// 处理进度图的数据格式, number -> array
|
||
|
const dataParser = (origin) => {
|
||
|
const { measureField, rangeField, targetField } = extProps;
|
||
|
const maxKPI = Math.max(...(origin || []).map((ele) => ele[targetField]));
|
||
|
const maxValue = Math.max(...(origin || []).map((ele) => ele[measureField]));
|
||
|
const _max = Math.max(maxKPI, maxValue);
|
||
2 years ago
|
const sortData = origin.sort(sortBy(measureField)).slice(-itemLength);
|
||
2 years ago
|
// 顶格的值定在更远
|
||
|
const _parseData = sortData?.map((ele) => ({ ...ele, [rangeField]: [0, Math.ceil(_max / 0.9)], [measureField]: [ele[measureField]] }));
|
||
2 years ago
|
console.log(_parseData, 'vvvvvvvvvvvvvv');
|
||
2 years ago
|
return _parseData;
|
||
|
};
|
||
|
|
||
|
const [parseData, setParseData] = useState([]);
|
||
|
useEffect(() => {
|
||
|
setParseData(dataParser(dataSource));
|
||
|
return () => {};
|
||
|
}, [extProps.measureField, dataSource]);
|
||
|
|
||
2 years ago
|
const config = merge({
|
||
2 years ago
|
color: {
|
||
2 years ago
|
range: [ '#FFF3E1', '#FFe0b0', '#bfeec8'], // '#FFbcb8', '#FFe0b0',
|
||
2 years ago
|
measure: '#5B8FF9',
|
||
|
target: '#FF9845',
|
||
|
},
|
||
|
label: {
|
||
|
// target: true,
|
||
|
// measure: {
|
||
2 years ago
|
// position: extProps?.vertical === 'vertical' ? 'top' : 'right',
|
||
2 years ago
|
// style: {
|
||
2 years ago
|
// fill: '#063CAA',
|
||
2 years ago
|
// },
|
||
|
// },
|
||
|
},
|
||
|
xAxis: {
|
||
|
line: null,
|
||
|
},
|
||
|
yAxis: false,
|
||
|
// 自定义 legend
|
||
|
legend: {
|
||
|
custom: true,
|
||
|
position: 'bottom',
|
||
|
items: [
|
||
|
{
|
||
|
value: '实际',
|
||
|
name: '实际',
|
||
|
marker: {
|
||
|
symbol: 'square',
|
||
|
style: {
|
||
|
fill: '#5B8FF9',
|
||
|
r: 5,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
value: '目标',
|
||
|
name: '目标',
|
||
|
marker: {
|
||
|
symbol: 'line',
|
||
|
style: {
|
||
|
stroke: '#FF9845', // '#39a3f4',
|
||
|
r: 5,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
],
|
||
|
},
|
||
2 years ago
|
// ? 全局的alias不起作用
|
||
2 years ago
|
tooltip: {
|
||
|
customItems: (originalItems) => {
|
||
|
// process originalItems,
|
||
|
return originalItems.map((ele) => ({ ...ele, name: dataFieldAlias[ele.name]?.alias || ele.name }));
|
||
|
},
|
||
|
},
|
||
2 years ago
|
}, extProps);
|
||
2 years ago
|
return (
|
||
|
<>
|
||
2 years ago
|
<Bullet {...config} data={parseData} />
|
||
2 years ago
|
</>
|
||
|
);
|
||
|
});
|