diff --git a/src/libs/ht.js b/src/libs/ht.js index b77ffb9..d695a29 100644 --- a/src/libs/ht.js +++ b/src/libs/ht.js @@ -170,6 +170,26 @@ export const KPISubjects = [ // { 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 @@ -194,6 +214,14 @@ export const pivotBy = (_data, [rows, columns, date]) => { 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 [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 || '(空)', 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, SumPersonNum: 0, @@ -236,6 +267,11 @@ export const pivotBy = (_data, [rows, columns, date]) => { confirmDays: 0, SingleML: 0, OrderValue: 0, + PPPrice: 0, + AvgPPPrice: 0, + confirmTourdays: 0, + PPPriceRange: '', + unitPPPriceRange: '', }; 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.transactions += v.transactions; 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.applyDays += v.applyDays; r.confirmDays += v.confirmDays; + r.PPPrice += Number(v.orderState) === 1 ? v.PPPrice : 0; + r.confirmTourdays += Number(v.orderState) === 1 ? v.tourdays : 0; return r; }, initialData); @@ -259,6 +297,10 @@ export const pivotBy = (_data, [rows, columns, date]) => { ConfirmRates: calculatedData.ConfirmOrder ? fixTo4Decimals(calculatedData.ConfirmOrder / calculatedData.SumOrder) : 0, OrderValue: calculatedData.SumOrder ? fixToInt(calculatedData.SumML / calculatedData.SumOrder) : 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 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.quotePrice = fixTo2Decimals(calculatedData.quotePrice); 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 }; }); @@ -289,16 +334,34 @@ export const pivotBy = (_data, [rows, columns, date]) => { .map((everyR) => { const _colKey = dataKey || 'dataKey'; 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( - (r, skey) => ({ ...r, [skey]: allColumns.reduce((a, c) => Number(c.orderState) === 1 ? a : fixTo2Decimals(a + c[skey]), 0) }), - everyR - ); + const summaryCalc = [ + 'ConfirmOrder', + '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.applyDays = Math.ceil(summaryCalc.applyDays / allColumns.length); summaryCalc.confirmDays = Math.ceil(summaryCalc.confirmDays / allColumns.length); summaryCalc.ConfirmRates = summaryCalc.ConfirmOrder ? fixTo2Decimals(summaryCalc.ConfirmOrder / summaryCalc.SumOrder*100) : 0; summaryCalc.OrderValue = summaryCalc.SumOrder ? fixToInt(summaryCalc.SumML / summaryCalc.SumOrder) : 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.ConfirmRates_txt = dataFieldAlias.ConfirmRates.formatter(summaryCalc.ConfirmRates); diff --git a/src/views/DataPivot.jsx b/src/views/DataPivot.jsx index f3e401a..d2f2ef2 100644 --- a/src/views/DataPivot.jsx +++ b/src/views/DataPivot.jsx @@ -23,8 +23,10 @@ const filterFields = [ { key: 'travelMotivation', label: '出行目的' }, // { key: 'operatorName', label: '顾问' }, { key: 'WebCode', label: '来源站点' }, - // todo: 目的地, 目的地国家, { key: 'destinationCountry_AsJOSN', label: '目的地国籍' }, + { key: 'PPPriceRange', label: '人均天/单区间(外币)' }, + // { key: 'unitPPPriceRange', label: '人均天(外币)' }, + // todo: 目的地, 目的地国家, ]; const filterFieldsMapped = filterFields.reduce((r, v) => ({ ...r, [v.key]: v }), {}); @@ -73,6 +75,10 @@ const pageSetting = { { key: 'ConfirmRates', title: '成交率', dataIndex: 'ConfirmRates_txt', width: '5em' }, { key: 'SingleML', title: '单团毛利', dataIndex: 'SingleML', width: '5em' }, { key: 'OrderValue', title: '单个订单价值', dataIndex: 'OrderValue', width: '5em' }, + { key: 'PPPriceRange', title: '人均天(外币)', dataIndex: 'PPPriceRange', width: '5em' }, + { key: 'AvgPPPrice', title: '人均天/单(外币)', dataIndex: 'AvgPPPrice', width: '5em' }, + // { key: 'unitPPPrice', title: '人均天(外币)', dataIndex: 'unitPPPrice', width: '5em' }, + // { key: 'unitPPPriceRange', title: '人均天区间(外币)', dataIndex: 'unitPPPriceRange', width: '5em' }, ], searchInitial: { DateType: { key: 'confirmDate', value: 'confirmDate', label: '确认日期' } }, },