|
|
|
import { observer } from 'mobx-react';
|
|
|
|
import { Line } from '@ant-design/plots';
|
|
|
|
import { merge, isEmpty, groupBy } from '../utils/commons';
|
|
|
|
import { dataFieldAlias } from '../libs/ht';
|
|
|
|
|
|
|
|
const uniqueByKey = (array, key, pickLast) => {
|
|
|
|
const seen = new Map();
|
|
|
|
const isPickLast = pickLast === true;
|
|
|
|
|
|
|
|
return array.filter(item => {
|
|
|
|
const k = item[key];
|
|
|
|
const storedItem = seen.get(k);
|
|
|
|
|
|
|
|
if(storedItem) {
|
|
|
|
if(isPickLast) {
|
|
|
|
seen.set(k, item); // update with last item
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
seen.set(k, item);
|
|
|
|
return true;
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
export default observer((props) => {
|
|
|
|
const { dataSource, ...config } = props;
|
|
|
|
const kpiKey = dataFieldAlias[config.yField]?.nestkey?.v;
|
|
|
|
const seriesData = groupBy(dataSource, ele => ele[config.seriesField]);
|
|
|
|
const pickKey4KPI = Object.keys(seriesData)[0];
|
|
|
|
const KPIData = (seriesData?.[pickKey4KPI] || []).reduce((r, v) => {
|
|
|
|
if ( ! isEmpty(v[kpiKey])) { // 有设目标才多显示一条虚线 颜色: #F4664A
|
|
|
|
r.push({...v, [config.yField]: v[kpiKey], [config.seriesField]: dataFieldAlias[kpiKey].label, extraLine: true,});
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
}, []);
|
|
|
|
const dataColors = ['#598cf3', '#69deae', '#FAAD14'];
|
|
|
|
const colorSets = Object.keys(seriesData).sort().reduce((obj, k, i) => ({...obj, [k]: dataColors[i]}), {});
|
|
|
|
const mergeLineConfig = merge({
|
|
|
|
// color: ['#598cf3', '#69deae', '#F4664A', '#FAAD14'],
|
|
|
|
color: (item) => {
|
|
|
|
const thisSeries = item[config.seriesField];
|
|
|
|
return thisSeries.includes('目标') ? '#F4664A' : colorSets[thisSeries];
|
|
|
|
},
|
|
|
|
lineStyle: (data) => {
|
|
|
|
// console.log(data);
|
|
|
|
if (data[config.seriesField].includes('目标')) {
|
|
|
|
return {
|
|
|
|
lineDash: [4, 4],
|
|
|
|
opacity: 0.5,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
opacity: 1,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
}, config);
|
|
|
|
return <Line {...mergeLineConfig} data={[...dataSource, ...KPIData]} />;
|
|
|
|
});
|