|
|
@ -170,6 +170,26 @@ export const KPISubjects = [
|
|
|
|
// { key: 'sum_person_num', value: 'sum_person_num', label: '人数' },
|
|
|
|
// { key: 'sum_person_num', value: 'sum_person_num', label: '人数' },
|
|
|
|
];
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 计算指标值的分段区间
|
|
|
|
|
|
|
|
* @param {number} value
|
|
|
|
|
|
|
|
* @returns
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
const calcPPPriceRange = (value) => {
|
|
|
|
|
|
|
|
if (value < 0) {
|
|
|
|
|
|
|
|
return '--';
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const step = 30; // step = 30 USD
|
|
|
|
|
|
|
|
const start = Math.floor(value / step) * step;
|
|
|
|
|
|
|
|
const end = start + step;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (value >= 301) {
|
|
|
|
|
|
|
|
return `301-Infinity`;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return `${start === 0 ? start : (start+1)}-${end}`;
|
|
|
|
|
|
|
|
};
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 数据透视计算
|
|
|
|
* 数据透视计算
|
|
|
|
* @param {object[]} data
|
|
|
|
* @param {object[]} data
|
|
|
@ -194,6 +214,14 @@ export const pivotBy = (_data, [rows, columns, date]) => {
|
|
|
|
return r;
|
|
|
|
return r;
|
|
|
|
}, []);
|
|
|
|
}, []);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (groupbyKeys.includes('PPPriceRange')) {
|
|
|
|
|
|
|
|
// 补充计算的字段
|
|
|
|
|
|
|
|
data = _data.map(ele => {
|
|
|
|
|
|
|
|
ele.PPPrice = (Number(ele.orderState) === 1 && ele.tourdays && ele.personNum) ? fixToInt(ele.quotePrice / ele.tourdays / ele.personNum) : -1;
|
|
|
|
|
|
|
|
ele.PPPriceRange = calcPPPriceRange(ele.PPPrice);
|
|
|
|
|
|
|
|
return ele;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
const getKeys = (keys) => keys.map((keyField) => [...new Set(data.map((f) => f[keyField]))]);
|
|
|
|
const getKeys = (keys) => keys.map((keyField) => [...new Set(data.map((f) => f[keyField]))]);
|
|
|
|
const [rowsKeys, columnsKeys, dateKeys] = [getKeys(rows), getKeys(columns), [getKeys([date])[0].filter(s => s)]];
|
|
|
|
const [rowsKeys, columnsKeys, dateKeys] = [getKeys(rows), getKeys(columns), [getKeys([date])[0].filter(s => s)]];
|
|
|
@ -222,6 +250,9 @@ export const pivotBy = (_data, [rows, columns, date]) => {
|
|
|
|
_label: colKey || '(空)',
|
|
|
|
_label: colKey || '(空)',
|
|
|
|
key: _rowKey,
|
|
|
|
key: _rowKey,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_a:dataObj[colKey].map((v) => `${v.PPPrice}: ${v.PPPriceRange}`).join(', '),
|
|
|
|
|
|
|
|
_b:dataObj[colKey].map((v) => `${v.orderState}: ${v.quotePrice}/ ${v.tourdays}/ ${v.personNum}`).join(', '),
|
|
|
|
|
|
|
|
|
|
|
|
SumOrder: _len,
|
|
|
|
SumOrder: _len,
|
|
|
|
|
|
|
|
|
|
|
|
SumPersonNum: 0,
|
|
|
|
SumPersonNum: 0,
|
|
|
@ -236,6 +267,11 @@ export const pivotBy = (_data, [rows, columns, date]) => {
|
|
|
|
confirmDays: 0,
|
|
|
|
confirmDays: 0,
|
|
|
|
SingleML: 0,
|
|
|
|
SingleML: 0,
|
|
|
|
OrderValue: 0,
|
|
|
|
OrderValue: 0,
|
|
|
|
|
|
|
|
PPPrice: 0,
|
|
|
|
|
|
|
|
AvgPPPrice: 0,
|
|
|
|
|
|
|
|
confirmTourdays: 0,
|
|
|
|
|
|
|
|
PPPriceRange: '',
|
|
|
|
|
|
|
|
unitPPPriceRange: '',
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const calculatedData = dataObj[colKey].reduce((r, v) => {
|
|
|
|
const calculatedData = dataObj[colKey].reduce((r, v) => {
|
|
|
@ -244,10 +280,12 @@ export const pivotBy = (_data, [rows, columns, date]) => {
|
|
|
|
r.ConfirmOrder += Number(v.orderState) === 1 ? 1 : 0;
|
|
|
|
r.ConfirmOrder += Number(v.orderState) === 1 ? 1 : 0;
|
|
|
|
r.transactions += v.transactions;
|
|
|
|
r.transactions += v.transactions;
|
|
|
|
r.SumML += Number(v.orderState) === 1 ? v.ML : 0;
|
|
|
|
r.SumML += Number(v.orderState) === 1 ? v.ML : 0;
|
|
|
|
r.quotePrice += v.quotePrice;
|
|
|
|
r.quotePrice += Number(v.orderState) === 1 ? v.quotePrice : 0;
|
|
|
|
r.tourdays += v.tourdays;
|
|
|
|
r.tourdays += v.tourdays;
|
|
|
|
r.applyDays += v.applyDays;
|
|
|
|
r.applyDays += v.applyDays;
|
|
|
|
r.confirmDays += v.confirmDays;
|
|
|
|
r.confirmDays += v.confirmDays;
|
|
|
|
|
|
|
|
r.PPPrice += Number(v.orderState) === 1 ? v.PPPrice : 0;
|
|
|
|
|
|
|
|
r.confirmTourdays += Number(v.orderState) === 1 ? v.tourdays : 0;
|
|
|
|
return r;
|
|
|
|
return r;
|
|
|
|
}, initialData);
|
|
|
|
}, initialData);
|
|
|
|
|
|
|
|
|
|
|
@ -259,6 +297,10 @@ export const pivotBy = (_data, [rows, columns, date]) => {
|
|
|
|
ConfirmRates: calculatedData.ConfirmOrder ? fixTo4Decimals(calculatedData.ConfirmOrder / calculatedData.SumOrder) : 0,
|
|
|
|
ConfirmRates: calculatedData.ConfirmOrder ? fixTo4Decimals(calculatedData.ConfirmOrder / calculatedData.SumOrder) : 0,
|
|
|
|
OrderValue: calculatedData.SumOrder ? fixToInt(calculatedData.SumML / calculatedData.SumOrder) : 0,
|
|
|
|
OrderValue: calculatedData.SumOrder ? fixToInt(calculatedData.SumML / calculatedData.SumOrder) : 0,
|
|
|
|
SingleML: calculatedData.ConfirmOrder ? fixToInt(calculatedData.SumML / calculatedData.ConfirmOrder) : 0,
|
|
|
|
SingleML: calculatedData.ConfirmOrder ? fixToInt(calculatedData.SumML / calculatedData.ConfirmOrder) : 0,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AvgPPPrice: calculatedData.ConfirmOrder ? fixToInt(calculatedData.PPPrice / calculatedData.ConfirmOrder) : -1,
|
|
|
|
|
|
|
|
unitPPPrice:
|
|
|
|
|
|
|
|
calculatedData.confirmTourdays && calculatedData.ConfirmPersonNum ? fixToInt(calculatedData.quotePrice / calculatedData.confirmTourdays / calculatedData.ConfirmPersonNum) : -1,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
// Formatter
|
|
|
|
// Formatter
|
|
|
|
calculatedData.transactions = fixTo2Decimals(calculatedData.transactions);
|
|
|
|
calculatedData.transactions = fixTo2Decimals(calculatedData.transactions);
|
|
|
@ -266,7 +308,10 @@ export const pivotBy = (_data, [rows, columns, date]) => {
|
|
|
|
calculatedData.SumML_txt = dataFieldAlias.SumML.formatter(calculatedData.SumML);
|
|
|
|
calculatedData.SumML_txt = dataFieldAlias.SumML.formatter(calculatedData.SumML);
|
|
|
|
calculatedData.quotePrice = fixTo2Decimals(calculatedData.quotePrice);
|
|
|
|
calculatedData.quotePrice = fixTo2Decimals(calculatedData.quotePrice);
|
|
|
|
calculatedData.ConfirmRates_txt = dataFieldAlias.ConfirmRates.formatter(_rowCalc.ConfirmRates);
|
|
|
|
calculatedData.ConfirmRates_txt = dataFieldAlias.ConfirmRates.formatter(_rowCalc.ConfirmRates);
|
|
|
|
calculatedData.SingleML = fixTo2Decimals(calculatedData.SingleML);
|
|
|
|
// calculatedData.SingleML = fixTo2Decimals(calculatedData.SingleML);
|
|
|
|
|
|
|
|
calculatedData.PPPrice = fixTo2Decimals(calculatedData.PPPrice);
|
|
|
|
|
|
|
|
calculatedData.PPPriceRange = calcPPPriceRange(_rowCalc.AvgPPPrice);
|
|
|
|
|
|
|
|
calculatedData.unitPPPriceRange = calcPPPriceRange(_rowCalc.unitPPPrice);
|
|
|
|
|
|
|
|
|
|
|
|
DataGroupByKeys[colKey] = { ...calculatedData, ..._rowCalc };
|
|
|
|
DataGroupByKeys[colKey] = { ...calculatedData, ..._rowCalc };
|
|
|
|
});
|
|
|
|
});
|
|
|
@ -289,16 +334,34 @@ export const pivotBy = (_data, [rows, columns, date]) => {
|
|
|
|
.map((everyR) => {
|
|
|
|
.map((everyR) => {
|
|
|
|
const _colKey = dataKey || 'dataKey';
|
|
|
|
const _colKey = dataKey || 'dataKey';
|
|
|
|
const allColumns = Object.values(everyR[_colKey]).reduce((r, c) => r.concat([c]), []);
|
|
|
|
const allColumns = Object.values(everyR[_colKey]).reduce((r, c) => r.concat([c]), []);
|
|
|
|
const summaryCalc = ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum', 'ConfirmPersonNum', 'quotePrice', 'tourdays', 'applyDays', 'confirmDays'].reduce(
|
|
|
|
const summaryCalc = [
|
|
|
|
(r, skey) => ({ ...r, [skey]: allColumns.reduce((a, c) => Number(c.orderState) === 1 ? a : fixTo2Decimals(a + c[skey]), 0) }),
|
|
|
|
'ConfirmOrder',
|
|
|
|
everyR
|
|
|
|
'SumOrder',
|
|
|
|
);
|
|
|
|
'SumML',
|
|
|
|
|
|
|
|
'transactions',
|
|
|
|
|
|
|
|
'SumPersonNum',
|
|
|
|
|
|
|
|
'ConfirmPersonNum',
|
|
|
|
|
|
|
|
'quotePrice',
|
|
|
|
|
|
|
|
'tourdays',
|
|
|
|
|
|
|
|
'applyDays',
|
|
|
|
|
|
|
|
'confirmDays',
|
|
|
|
|
|
|
|
'PPPrice', 'AvgPPPrice',
|
|
|
|
|
|
|
|
'confirmTourdays',
|
|
|
|
|
|
|
|
].reduce((r, skey) => ({ ...r,
|
|
|
|
|
|
|
|
[skey]: allColumns.reduce((a, c) => (fixTo2Decimals(a + c[skey])), 0),
|
|
|
|
|
|
|
|
[`${skey}_arr`]: allColumns.reduce((a, c) => (a.concat(c[skey])), []),
|
|
|
|
|
|
|
|
}),everyR);
|
|
|
|
|
|
|
|
|
|
|
|
summaryCalc.tourdays = Math.ceil(summaryCalc.tourdays / allColumns.length);
|
|
|
|
summaryCalc.tourdays = Math.ceil(summaryCalc.tourdays / allColumns.length);
|
|
|
|
summaryCalc.applyDays = Math.ceil(summaryCalc.applyDays / allColumns.length);
|
|
|
|
summaryCalc.applyDays = Math.ceil(summaryCalc.applyDays / allColumns.length);
|
|
|
|
summaryCalc.confirmDays = Math.ceil(summaryCalc.confirmDays / allColumns.length);
|
|
|
|
summaryCalc.confirmDays = Math.ceil(summaryCalc.confirmDays / allColumns.length);
|
|
|
|
summaryCalc.ConfirmRates = summaryCalc.ConfirmOrder ? fixTo2Decimals(summaryCalc.ConfirmOrder / summaryCalc.SumOrder*100) : 0;
|
|
|
|
summaryCalc.ConfirmRates = summaryCalc.ConfirmOrder ? fixTo2Decimals(summaryCalc.ConfirmOrder / summaryCalc.SumOrder*100) : 0;
|
|
|
|
summaryCalc.OrderValue = summaryCalc.SumOrder ? fixToInt(summaryCalc.SumML / summaryCalc.SumOrder) : 0;
|
|
|
|
summaryCalc.OrderValue = summaryCalc.SumOrder ? fixToInt(summaryCalc.SumML / summaryCalc.SumOrder) : 0;
|
|
|
|
summaryCalc.SingleML = summaryCalc.ConfirmOrder ? fixTo2Decimals(summaryCalc.SumML / summaryCalc.ConfirmOrder) : 0;
|
|
|
|
summaryCalc.SingleML = summaryCalc.ConfirmOrder ? fixTo2Decimals(summaryCalc.SumML / summaryCalc.ConfirmOrder) : 0;
|
|
|
|
|
|
|
|
summaryCalc.AvgPPPrice = Math.ceil(summaryCalc.AvgPPPrice / allColumns.length);
|
|
|
|
|
|
|
|
summaryCalc.PPPriceRange = calcPPPriceRange(summaryCalc.AvgPPPrice);
|
|
|
|
|
|
|
|
summaryCalc.unitPPPrice = summaryCalc.confirmTourdays && summaryCalc.ConfirmPersonNum ? fixToInt(summaryCalc.quotePrice / summaryCalc.confirmTourdays / summaryCalc.ConfirmPersonNum) : -1;
|
|
|
|
|
|
|
|
summaryCalc.unitPPPriceRange = calcPPPriceRange(summaryCalc.unitPPPrice);
|
|
|
|
|
|
|
|
|
|
|
|
summaryCalc.SumML_txt = dataFieldAlias.SumML.formatter(summaryCalc.SumML);
|
|
|
|
summaryCalc.SumML_txt = dataFieldAlias.SumML.formatter(summaryCalc.SumML);
|
|
|
|
summaryCalc.ConfirmRates_txt = dataFieldAlias.ConfirmRates.formatter(summaryCalc.ConfirmRates);
|
|
|
|
summaryCalc.ConfirmRates_txt = dataFieldAlias.ConfirmRates.formatter(summaryCalc.ConfirmRates);
|
|
|
|