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.
187 lines
5.6 KiB
JavaScript
187 lines
5.6 KiB
JavaScript
import { observer } from 'mobx-react';
|
|
import { Mix } from '@ant-design/plots';
|
|
import { merge, isEmpty, cloneDeep } from '../utils/commons';
|
|
import { dataFieldAlias } from '../libs/ht';
|
|
|
|
const COLOR_SETS = [
|
|
"#FF6B3B",
|
|
"#9FB40F",
|
|
"#76523B",
|
|
"#DAD5B5",
|
|
"#E19348",
|
|
"#F383A2",
|
|
];
|
|
/**
|
|
* 当期数据; 同比; 环比
|
|
*/
|
|
export default observer((props) => {
|
|
const { dataSource, summaryData: areaData, ...config } = props;
|
|
const { xField, yFields, seriesField, tooltip, ...extConfig } = config;
|
|
const diffData0 = dataSource.reduce((r, row) => {
|
|
r.push({ ...row, yField: row[yFields[0]], yGroup: dataFieldAlias[yFields[0]].alias });
|
|
r.push({ ...row, yField: row.resultToQ[yFields[0]], yGroup: dataFieldAlias[yFields[0]].alias + ' 上个时间段' });
|
|
r.push({ ...row, yField: row.resultToY[yFields[0]], yGroup: dataFieldAlias[yFields[0]].alias + ' 去年同期' });
|
|
return r;
|
|
}, []);
|
|
const diffData1 = dataSource.reduce((r, row) => {
|
|
r.push({ ...row, yField: row[yFields[1]], yGroup: dataFieldAlias[yFields[1]].alias });
|
|
r.push({ ...row, yField: row.resultToQ[yFields[1]], yGroup: dataFieldAlias[yFields[1]].alias + ' 上个时间段' });
|
|
r.push({ ...row, yField: row.resultToY[yFields[1]], yGroup: dataFieldAlias[yFields[1]].alias + ' 去年同期' });
|
|
return r;
|
|
}, []);
|
|
const diffDataPercent = dataSource.reduce((r, row) => {
|
|
const _key0Q = `${yFields[0]}ToQ`;
|
|
const _key0Y = `${yFields[0]}ToY`;
|
|
r.push({ ...row, yField: row[_key0Q], yGroup: dataFieldAlias[yFields[0]].alias + ' 环比' });
|
|
r.push({ ...row, yField: row[_key0Y], yGroup: dataFieldAlias[yFields[0]].alias + ' 同比' });
|
|
const _key1Q = `${yFields[1]}ToQ`;
|
|
const _key1Y = `${yFields[1]}ToY`;
|
|
r.push({ ...row, yField: row[_key1Q], yGroup: dataFieldAlias[yFields[1]].alias + ' 环比' });
|
|
r.push({ ...row, yField: row[_key1Y], yGroup: dataFieldAlias[yFields[1]].alias + ' 同比' });
|
|
return r;
|
|
}, []);
|
|
const calcAxis = isEmpty(diffData0) ? 300 : (Math.max(...diffData0.map(ele => ele.yField))) * 3;
|
|
const calcAxisC = isEmpty(diffData0) ? 300 : (Math.max(...diffDataPercent.map(ele => ele.yField))) * 3;
|
|
const diffLine = [
|
|
{
|
|
type: 'text',
|
|
position: ['start', 0],
|
|
content: `同比, 环比`,
|
|
offsetX: -15,
|
|
style: {
|
|
fill: COLOR_SETS[0],
|
|
textBaseline: 'bottom',
|
|
},
|
|
},
|
|
{
|
|
type: 'line',
|
|
start: [-10, 0],
|
|
end: ['max', 0],
|
|
style: {
|
|
stroke: COLOR_SETS[0],
|
|
// lineDash: [2, 2],
|
|
lineWidth: 0.5,
|
|
},
|
|
},];
|
|
const MixConfig = {
|
|
appendPadding: 15,
|
|
height: 600,
|
|
syncViewPadding: true,
|
|
tooltip: {
|
|
shared: true,
|
|
// customItems: (originalItems) => {
|
|
// // process originalItems,
|
|
// const items = originalItems.map((ele) => ({ ...ele, name: ele.data?.extraLine ? ele.name : `${ele.name} ${dataFieldAlias[yField]?.alias || yField}` }));
|
|
// return items;
|
|
// },
|
|
},
|
|
legend: {position: 'top',layout: 'horizontal' },
|
|
plots: [
|
|
{
|
|
type: 'column',
|
|
options: {
|
|
data: diffData0,
|
|
isGroup: true,
|
|
xField,
|
|
yField: 'yField',
|
|
seriesField: 'yGroup',
|
|
// xAxis: false,
|
|
meta: merge({
|
|
...cloneDeep(dataFieldAlias),
|
|
}),
|
|
// color: '#b32b19',
|
|
// color: '#f58269',
|
|
legend: {},
|
|
smooth: true,
|
|
yAxis: {
|
|
type: 'linear',
|
|
tickCount: 4,
|
|
min: 0,
|
|
max: calcAxis,
|
|
title: { text: '团数', autoRotate: false, position: 'end' },
|
|
},
|
|
xAxis: {
|
|
label: {
|
|
autoHide: false,
|
|
autoRotate: true,
|
|
},
|
|
},
|
|
label: false,
|
|
},
|
|
},
|
|
{
|
|
type: 'line',
|
|
options: {
|
|
data: diffData1,
|
|
isGroup: true,
|
|
xField,
|
|
yField: 'yField',
|
|
seriesField: 'yGroup',
|
|
xAxis: false,
|
|
legend: {},
|
|
meta: merge(
|
|
{
|
|
...cloneDeep(dataFieldAlias),
|
|
},
|
|
{ yField: dataFieldAlias[yFields[1]] }
|
|
),
|
|
// color: '#1AAF8B',
|
|
smooth: true,
|
|
point: {
|
|
size: 4,
|
|
shape: 'cicle',
|
|
},
|
|
yAxis: {
|
|
type: 'linear',
|
|
// tickCount: 4,
|
|
min: 0,
|
|
position: 'right',
|
|
line: null,
|
|
grid: null,
|
|
title: { text: '业绩', autoRotate: false, position: 'end' },
|
|
},
|
|
label: {
|
|
style: {
|
|
fontWeight: 700,
|
|
stroke: '#fff',
|
|
lineWidth: 1,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
type: 'column',
|
|
options: {
|
|
data: diffDataPercent,
|
|
xField,
|
|
yField: 'yField',
|
|
seriesField: 'yGroup',
|
|
columnWidthRatio: 0.28,
|
|
meta: {
|
|
yField: {
|
|
formatter: (v) => `${v}%`,
|
|
},
|
|
},
|
|
isGroup: true,
|
|
xAxis: false,
|
|
yAxis: {
|
|
line: null,
|
|
grid: null,
|
|
label: false,
|
|
position: 'left',
|
|
// min: -calcAxisC,
|
|
// max: calcAxisC/4,
|
|
min: -3000,
|
|
max: 250,
|
|
tickCount: 4,
|
|
},
|
|
legend: {},
|
|
color: COLOR_SETS,
|
|
annotations: diffLine,
|
|
},
|
|
},
|
|
],
|
|
};
|
|
return <Mix {...MixConfig} />;
|
|
});
|