feat: home: 瀑布图-百分比; 排名图-进度
parent
d83e7dec92
commit
230ec4be81
@ -1,100 +0,0 @@
|
||||
import { observer } from 'mobx-react';
|
||||
import { Bullet } from '@ant-design/plots';
|
||||
|
||||
export default observer((props) => {
|
||||
const { dataSource, ...extProps } = props;
|
||||
// todo: 处理进度图的数据格式, number -> array
|
||||
const parseData = dataSource?.map(ele => ({...ele, CJCountRange: [0,1000], [extProps.measureField]: [ele[extProps.measureField]]}));
|
||||
const config = {
|
||||
// data,
|
||||
// measureField: 'measures',
|
||||
// rangeField: 'ranges',
|
||||
// targetField: 'target',
|
||||
// xField: 'title',
|
||||
color: {
|
||||
range: ['#FFbcb8', '#FFe0b0', '#bfeec8'],
|
||||
measure: '#5B8FF9',
|
||||
target: '#39a3f4',
|
||||
},
|
||||
label: {
|
||||
// target: true,
|
||||
// measure: {
|
||||
// position: 'middle',
|
||||
// style: {
|
||||
// fill: '#fff',
|
||||
// },
|
||||
// },
|
||||
},
|
||||
xAxis: {
|
||||
line: null,
|
||||
},
|
||||
yAxis: false,
|
||||
// 自定义 legend
|
||||
legend: {
|
||||
custom: true,
|
||||
position: 'bottom',
|
||||
items: [
|
||||
// {
|
||||
// value: '差',
|
||||
// name: '差',
|
||||
// marker: {
|
||||
// symbol: 'square',
|
||||
// style: {
|
||||
// fill: '#FFbcb8',
|
||||
// r: 5,
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// {
|
||||
// value: '良',
|
||||
// name: '良',
|
||||
// marker: {
|
||||
// symbol: 'square',
|
||||
// style: {
|
||||
// fill: '#FFe0b0',
|
||||
// r: 5,
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
// {
|
||||
// value: '优',
|
||||
// name: '优',
|
||||
// marker: {
|
||||
// symbol: 'square',
|
||||
// style: {
|
||||
// fill: '#bfeec8',
|
||||
// r: 5,
|
||||
// },
|
||||
// },
|
||||
// },
|
||||
{
|
||||
value: '实际',
|
||||
name: '实际',
|
||||
marker: {
|
||||
symbol: 'square',
|
||||
style: {
|
||||
fill: '#5B8FF9',
|
||||
r: 5,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
value: '目标',
|
||||
name: '目标',
|
||||
marker: {
|
||||
symbol: 'line',
|
||||
style: {
|
||||
stroke: '#39a3f4',
|
||||
r: 5,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
return (
|
||||
<>
|
||||
<Bullet {...config} {...extProps} data={parseData} />
|
||||
</>
|
||||
);
|
||||
});
|
@ -0,0 +1,88 @@
|
||||
import { useEffect, useState } from 'react';
|
||||
import { observer } from 'mobx-react';
|
||||
import { Bullet } from '@ant-design/plots';
|
||||
import { sortBy } from '../utils/commons';
|
||||
import { dataFieldAlias } from './../libs/ht';
|
||||
|
||||
export default observer((props) => {
|
||||
const { dataSource, ...extProps } = props;
|
||||
// 处理进度图的数据格式, 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);
|
||||
const sortData = origin.sort(sortBy(measureField));
|
||||
// 顶格的值定在更远
|
||||
const _parseData = sortData?.map((ele) => ({ ...ele, [rangeField]: [0, Math.ceil(_max / 0.9)], [measureField]: [ele[measureField]] }));
|
||||
return _parseData;
|
||||
};
|
||||
|
||||
const [parseData, setParseData] = useState([]);
|
||||
useEffect(() => {
|
||||
setParseData(dataParser(dataSource));
|
||||
return () => {};
|
||||
}, [extProps.measureField, dataSource]);
|
||||
|
||||
const config = {
|
||||
color: {
|
||||
range: ['#FFbcb8', '#FFe0b0', '#bfeec8'],
|
||||
measure: '#5B8FF9',
|
||||
target: '#FF9845',
|
||||
},
|
||||
label: {
|
||||
// target: true,
|
||||
// measure: {
|
||||
// position: 'middle',
|
||||
// style: {
|
||||
// fill: '#fff',
|
||||
// },
|
||||
// },
|
||||
},
|
||||
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,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
// 全局的alias不起作用
|
||||
tooltip: {
|
||||
customItems: (originalItems) => {
|
||||
// process originalItems,
|
||||
return originalItems.map((ele) => ({ ...ele, name: dataFieldAlias[ele.name]?.alias || ele.name }));
|
||||
},
|
||||
},
|
||||
};
|
||||
return (
|
||||
<>
|
||||
<Bullet {...config} {...extProps} data={parseData} />
|
||||
</>
|
||||
);
|
||||
});
|
@ -0,0 +1,67 @@
|
||||
import { observer } from 'mobx-react';
|
||||
import { Waterfall } from '@ant-design/plots';
|
||||
import { dataFieldAlias } from './../libs/ht';
|
||||
|
||||
export default observer((props) => {
|
||||
const { dataSource, line, title, ...extProps } = props;
|
||||
const yMax = Math.max(line?.value || 0, ...dataSource.map((ele) => ele[extProps.yField]));
|
||||
const annotationsLine = line
|
||||
? [
|
||||
{
|
||||
type: 'text',
|
||||
position: ['start', line.value],
|
||||
content: `${line.label} ${line.value / 1000} K`,
|
||||
// offsetX: -15,
|
||||
style: {
|
||||
fill: '#F4664A',
|
||||
textBaseline: 'bottom',
|
||||
},
|
||||
},
|
||||
{
|
||||
type: 'line',
|
||||
start: [-10, line.value],
|
||||
end: ['max', line.value],
|
||||
style: {
|
||||
stroke: '#F4664A',
|
||||
lineDash: [2, 2],
|
||||
},
|
||||
},
|
||||
]
|
||||
: [];
|
||||
|
||||
const config = {
|
||||
padding: 'auto',
|
||||
appendPadding: [20, 0, 0, 0],
|
||||
|
||||
/** 展示总计 */
|
||||
total: {
|
||||
label: `${title}总`,
|
||||
style: {
|
||||
fill: '#96a6a6',
|
||||
},
|
||||
},
|
||||
legend: false,
|
||||
/** 数据标签展示模式:绝对值 */
|
||||
labelMode: 'absolute',
|
||||
label: {
|
||||
style: {
|
||||
fontSize: 12,
|
||||
},
|
||||
},
|
||||
annotations: [...annotationsLine],
|
||||
meta: {
|
||||
...extProps.mergeMeta,
|
||||
[extProps.yField]: {
|
||||
...extProps.mergeMeta[extProps.yField],
|
||||
max: Math.ceil(yMax / 0.95),
|
||||
alias: dataFieldAlias[extProps.yField]?.alias || extProps.yField,
|
||||
formatter: (v) => dataFieldAlias[extProps.yField]?.formatter(v) || v,
|
||||
},
|
||||
},
|
||||
};
|
||||
return (
|
||||
<>
|
||||
<Waterfall {...config} {...extProps} data={dataSource} />
|
||||
</>
|
||||
);
|
||||
});
|
Loading…
Reference in New Issue