|
|
@ -1,7 +1,9 @@
|
|
|
|
import { makeAutoObservable, runInAction, toJS } from 'mobx';
|
|
|
|
import { makeAutoObservable, runInAction, toJS } from 'mobx';
|
|
|
|
import * as req from '../utils/request';
|
|
|
|
import * as req from '../utils/request';
|
|
|
|
|
|
|
|
import moment from 'moment';
|
|
|
|
import { isEmpty, sortBy, pick, merge, fixTo2Decimals, groupBy, sortKeys, fixToInt, cloneDeep } from '../utils/commons';
|
|
|
|
import { isEmpty, sortBy, pick, merge, fixTo2Decimals, groupBy, sortKeys, fixToInt, cloneDeep } from '../utils/commons';
|
|
|
|
import { dataFieldAlias } from './../libs/ht';
|
|
|
|
import { dataFieldAlias } from './../libs/ht';
|
|
|
|
|
|
|
|
import { DATE_FORMAT, SMALL_DATETIME_FORMAT } from './../config';
|
|
|
|
|
|
|
|
|
|
|
|
class Trade {
|
|
|
|
class Trade {
|
|
|
|
constructor(rootStore) {
|
|
|
|
constructor(rootStore) {
|
|
|
@ -14,19 +16,27 @@ class Trade {
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
async fetchSummaryData(queryData) {
|
|
|
|
async fetchSummaryData(queryData) {
|
|
|
|
this.summaryData.loading = true;
|
|
|
|
this.summaryData.loading = true;
|
|
|
|
queryData.groupType = queryData?.groupType || 'overview';
|
|
|
|
const curQueryData = cloneDeep(queryData);
|
|
|
|
queryData.groupDateType = 'year';
|
|
|
|
curQueryData.groupType = curQueryData?.groupType || 'overview';
|
|
|
|
const multiData = await this.fetchTradeDataAll(cloneDeep(queryData));
|
|
|
|
curQueryData.groupDateType = 'year';
|
|
|
|
|
|
|
|
if (isEmpty(curQueryData.DateDiff1)) {
|
|
|
|
|
|
|
|
curQueryData.DateDiff1 = moment(curQueryData.Date1).subtract(1, 'year').format(DATE_FORMAT);
|
|
|
|
|
|
|
|
curQueryData.DateDiff2 = moment(curQueryData.Date2).subtract(1, 'year').format(SMALL_DATETIME_FORMAT);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const multiData = await this.fetchTradeDataAll((curQueryData));
|
|
|
|
const { summary, traditional, biz } = multiData.result1;
|
|
|
|
const { summary, traditional, biz } = multiData.result1;
|
|
|
|
// console.log(JSON.stringify(summary), 'mmmmmmmmmmm');
|
|
|
|
const { summary: summary2, traditional: traditional2, biz: biz2 } = multiData.result2;
|
|
|
|
|
|
|
|
// console.log(JSON.stringify(summary), 'mmmmmmmmmmm', multiData);
|
|
|
|
const summaryData = {
|
|
|
|
const summaryData = {
|
|
|
|
loading: false,
|
|
|
|
loading: false,
|
|
|
|
dataSource: [
|
|
|
|
dataSource: [
|
|
|
|
{
|
|
|
|
{
|
|
|
|
title: '成团',
|
|
|
|
title: '成团',
|
|
|
|
|
|
|
|
col: 6,
|
|
|
|
value: summary?.[0]?.ConfirmOrder,
|
|
|
|
value: summary?.[0]?.ConfirmOrder,
|
|
|
|
originVal: (summary?.[0]?.ConfirmOrder || 0),
|
|
|
|
originVal: summary?.[0]?.ConfirmOrder || 0,
|
|
|
|
valueSuffix: summary?.[0]?.ConfirmRates ? ` / ${summary?.[0]?.ConfirmRates} %` : undefined,
|
|
|
|
valueSuffix: undefined,
|
|
|
|
|
|
|
|
// valueSuffix: summary?.[0]?.ConfirmRates ? ` / ${summary?.[0]?.ConfirmRates} %` : undefined,
|
|
|
|
// VSrate: summary?.[0]?.ConfirmOrderrate,
|
|
|
|
// VSrate: summary?.[0]?.ConfirmOrderrate,
|
|
|
|
KPIrate: summary?.[0]?.[dataFieldAlias.ConfirmOrder.nestkey.p],
|
|
|
|
KPIrate: summary?.[0]?.[dataFieldAlias.ConfirmOrder.nestkey.p],
|
|
|
|
// hasKPI: !isEmpty(summary?.[0]?.[dataFieldAlias.ConfirmOrder.nestkey.p]),
|
|
|
|
// hasKPI: !isEmpty(summary?.[0]?.[dataFieldAlias.ConfirmOrder.nestkey.p]),
|
|
|
@ -35,39 +45,83 @@ class Trade {
|
|
|
|
kpiVal: summary?.[0]?.[dataFieldAlias.ConfirmOrder.nestkey.v],
|
|
|
|
kpiVal: summary?.[0]?.[dataFieldAlias.ConfirmOrder.nestkey.v],
|
|
|
|
traditional: { title: '传统', value: traditional?.[0]?.ConfirmOrder },
|
|
|
|
traditional: { title: '传统', value: traditional?.[0]?.ConfirmOrder },
|
|
|
|
biz: { title: '商务', value: biz?.[0]?.ConfirmOrder },
|
|
|
|
biz: { title: '商务', value: biz?.[0]?.ConfirmOrder },
|
|
|
|
|
|
|
|
...(summary2?.[0]
|
|
|
|
|
|
|
|
? {
|
|
|
|
|
|
|
|
diff: {
|
|
|
|
|
|
|
|
label: summary2[0]?.groupDateVal || '对比',
|
|
|
|
|
|
|
|
value: summary2[0]?.ConfirmOrder || 0,
|
|
|
|
|
|
|
|
VSrate: summary2[0]?.ConfirmOrder ? fixTo2Decimals(((summary[0]?.ConfirmOrder - summary2[0]?.ConfirmOrder) / summary2[0]?.ConfirmOrder) * 100) : null,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
: {}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
title: '毛利',
|
|
|
|
title: '毛利',
|
|
|
|
originVal: (summary?.[0]?.SumML || 0),
|
|
|
|
col: 8,
|
|
|
|
value: dataFieldAlias.SumML.formatter(summary?.[0]?.SumML || 0) + '=' + dataFieldAlias.SumML.formatter((traditional?.[0]?.SumML || 0)) + '+' + dataFieldAlias.SumML.formatter((biz?.[0]?.SumML || 0)),
|
|
|
|
originVal: summary?.[0]?.SumML || 0,
|
|
|
|
|
|
|
|
value:
|
|
|
|
|
|
|
|
dataFieldAlias.SumML.formatter(summary?.[0]?.SumML || 0) +
|
|
|
|
|
|
|
|
'=' +
|
|
|
|
|
|
|
|
dataFieldAlias.SumML.formatter(traditional?.[0]?.SumML || 0) +
|
|
|
|
|
|
|
|
'+' +
|
|
|
|
|
|
|
|
dataFieldAlias.SumML.formatter(biz?.[0]?.SumML || 0),
|
|
|
|
KPIrate: summary?.[0]?.[dataFieldAlias.SumML.nestkey.p],
|
|
|
|
KPIrate: summary?.[0]?.[dataFieldAlias.SumML.nestkey.p],
|
|
|
|
hasKPI: false,
|
|
|
|
hasKPI: false,
|
|
|
|
childrenVisible: true,
|
|
|
|
childrenVisible: true,
|
|
|
|
kpiVal: summary?.[0]?.[dataFieldAlias.SumML.nestkey.v],
|
|
|
|
kpiVal: summary?.[0]?.[dataFieldAlias.SumML.nestkey.v],
|
|
|
|
traditional: { title: '传统', value: (traditional?.[0]?.SumML || 0) },
|
|
|
|
traditional: { title: '传统', value: traditional?.[0]?.SumML || 0 },
|
|
|
|
biz: { title: '商务', value: (biz?.[0]?.SumML || 0) },
|
|
|
|
biz: { title: '商务', value: biz?.[0]?.SumML || 0 },
|
|
|
|
|
|
|
|
...(summary2?.[0]
|
|
|
|
|
|
|
|
? {
|
|
|
|
|
|
|
|
diff: {
|
|
|
|
|
|
|
|
label: summary2[0]?.groupDateVal || '对比',
|
|
|
|
|
|
|
|
value: dataFieldAlias.SumML.formatter(summary2[0]?.SumML || 0),
|
|
|
|
|
|
|
|
VSrate: summary2[0]?.SumML ? fixTo2Decimals(((summary?.[0]?.SumML - summary2[0]?.SumML) / summary2[0]?.SumML) * 100) : null,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
: {}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
title: '完成率',
|
|
|
|
title: '完成率',
|
|
|
|
originVal: (summary?.[0]?.[dataFieldAlias.SumML.nestkey.p] || 0),
|
|
|
|
col: 5,
|
|
|
|
|
|
|
|
originVal: summary?.[0]?.[dataFieldAlias.SumML.nestkey.p] || 0,
|
|
|
|
value: `${summary?.[0]?.[dataFieldAlias.SumML.nestkey.p] || ''}%`,
|
|
|
|
value: `${summary?.[0]?.[dataFieldAlias.SumML.nestkey.p] || ''}%`,
|
|
|
|
hasKPI: false,
|
|
|
|
hasKPI: false,
|
|
|
|
childrenVisible: false,
|
|
|
|
childrenVisible: false,
|
|
|
|
kpiVal: 0 , // summary?.[0]?.[dataFieldAlias.SumML.nestkey.p],
|
|
|
|
kpiVal: 0, // summary?.[0]?.[dataFieldAlias.SumML.nestkey.p],
|
|
|
|
traditional: { title: '传统', value: traditional?.[0]?.[dataFieldAlias.SumML.nestkey.p] || 0, },
|
|
|
|
traditional: { title: '传统', value: traditional?.[0]?.[dataFieldAlias.SumML.nestkey.p] || 0 },
|
|
|
|
biz: { title: '商务', value: biz?.[0]?.[dataFieldAlias.SumML.nestkey.p] || 0, },
|
|
|
|
biz: { title: '商务', value: biz?.[0]?.[dataFieldAlias.SumML.nestkey.p] || 0 },
|
|
|
|
|
|
|
|
...(summary2?.[0]
|
|
|
|
|
|
|
|
? {
|
|
|
|
|
|
|
|
diff: {
|
|
|
|
|
|
|
|
label: summary2[0]?.groupDateVal || '对比',
|
|
|
|
|
|
|
|
value: `${summary2[0]?.[dataFieldAlias.SumML.nestkey.p] || '-'}%`,
|
|
|
|
|
|
|
|
VSrate: null,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
: {}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
title: '人数',
|
|
|
|
title: '人数',
|
|
|
|
originVal: (summary?.[0]?.SumPersonNum || 0),
|
|
|
|
col: 5,
|
|
|
|
|
|
|
|
originVal: summary?.[0]?.SumPersonNum || 0,
|
|
|
|
value: summary?.[0]?.SumPersonNum,
|
|
|
|
value: summary?.[0]?.SumPersonNum,
|
|
|
|
// VSrate: summary?.[0]?.SumPersonNumrate,
|
|
|
|
// VSrate: summary?.[0]?.SumPersonNumrate,
|
|
|
|
// KPIrate: summary?.[0]?.[dataFieldAlias.SumPersonNum.nestkey.p],
|
|
|
|
// KPIrate: summary?.[0]?.[dataFieldAlias.SumPersonNum.nestkey.p],
|
|
|
|
hasKPI: false, // // !isEmpty(summary?.[0]?.[dataFieldAlias.SumPersonNum.nestkey.p]),,
|
|
|
|
hasKPI: false, // // !isEmpty(summary?.[0]?.[dataFieldAlias.SumPersonNum.nestkey.p]),,
|
|
|
|
childrenVisible: true,
|
|
|
|
childrenVisible: true,
|
|
|
|
// kpiVal: summary?.[0]?.[dataFieldAlias.SumPersonNum.nestkey.v],
|
|
|
|
// kpiVal: summary?.[0]?.[dataFieldAlias.SumPersonNum.nestkey.v],
|
|
|
|
traditional: { title: '传统', value: traditional?.[0]?.SumPersonNum, },
|
|
|
|
traditional: { title: '传统', value: traditional?.[0]?.SumPersonNum },
|
|
|
|
biz: { title: '商务', value: biz?.[0]?.SumPersonNum, },
|
|
|
|
biz: { title: '商务', value: biz?.[0]?.SumPersonNum },
|
|
|
|
|
|
|
|
...(summary2?.[0]
|
|
|
|
|
|
|
|
? {
|
|
|
|
|
|
|
|
diff: {
|
|
|
|
|
|
|
|
label: summary2[0]?.groupDateVal || '对比',
|
|
|
|
|
|
|
|
value: summary2[0]?.SumPersonNum || '',
|
|
|
|
|
|
|
|
VSrate: summary2[0]?.SumPersonNum ? fixTo2Decimals(((summary?.[0]?.SumPersonNum - summary2[0]?.SumPersonNum) / summary2[0]?.SumPersonNum) * 100) : null,
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
: {}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
],
|
|
|
|
],
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -87,15 +141,59 @@ class Trade {
|
|
|
|
queryData.groupType = queryData?.groupType || 'overview';
|
|
|
|
queryData.groupType = queryData?.groupType || 'overview';
|
|
|
|
Object.assign(queryData, { groupDateType: this.timeLineKey });
|
|
|
|
Object.assign(queryData, { groupDateType: this.timeLineKey });
|
|
|
|
const multiData = await this.fetchTradeDataAll(cloneDeep(queryData));
|
|
|
|
const multiData = await this.fetchTradeDataAll(cloneDeep(queryData));
|
|
|
|
const { traditional, biz } = multiData.result1;
|
|
|
|
const { traditional, biz, summaryRows: summaryRows1, } = multiData.result1;
|
|
|
|
|
|
|
|
// const { summaryRows: summaryRows2, mergeRows: mergeRows2 } = multiData.result2;
|
|
|
|
// console.log(biz, 'mmmmmmmm', queryData, multiData);
|
|
|
|
// console.log(biz, 'mmmmmmmm', queryData, multiData);
|
|
|
|
const mergeData = [].concat(traditional, biz);
|
|
|
|
const mergeData = [].concat(traditional, biz);
|
|
|
|
const dateKeyData = groupBy(mergeData, ele => ele.groupDateVal);
|
|
|
|
const dateKeyData = groupBy(mergeData, ele => ele.groupDateVal);
|
|
|
|
const sortByDateKey = Object.values(sortKeys(dateKeyData)).reduce( (a, b) => a.concat(b), []);
|
|
|
|
const sortByDateKey = Object.values(sortKeys(dateKeyData)).reduce( (a, b) => a.concat(b), []);
|
|
|
|
|
|
|
|
|
|
|
|
runInAction(() => {
|
|
|
|
runInAction(() => {
|
|
|
|
this.timeData.loading = false;
|
|
|
|
this.timeData.loading = false;
|
|
|
|
this.timeData.dataSource = sortByDateKey;
|
|
|
|
this.timeData.dataSource = sortByDateKey;
|
|
|
|
this.timeData.origin = multiData.result1;
|
|
|
|
this.timeData.origin = { summaryRows: summaryRows1 || [] }; // multiData.result1;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* 有对比的时间轴
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
async fetchTradeDataDiffByDate(queryData = {}) {
|
|
|
|
|
|
|
|
this.timeDiffData.loading = true;
|
|
|
|
|
|
|
|
queryData = Object.assign({}, this.searchPayloadHome, queryData); // queryData || this.searchPayloadHome;
|
|
|
|
|
|
|
|
queryData.groupType = queryData?.groupType || 'overview';
|
|
|
|
|
|
|
|
Object.assign(queryData, { groupDateType: this.timeLineKey });
|
|
|
|
|
|
|
|
const multiData = await this.fetchTradeDataAll(cloneDeep(queryData));
|
|
|
|
|
|
|
|
const { mergeRows: mergeRows1 } = multiData.result1;
|
|
|
|
|
|
|
|
const { mergeRows: mergeRows2 } = multiData.result2;
|
|
|
|
|
|
|
|
// console.log(biz, 'mmmmmmmm', queryData, multiData);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 为了图表的X轴一致
|
|
|
|
|
|
|
|
const allDateKey1 = [...new Set(mergeRows1.reduce((rv, vk) => {
|
|
|
|
|
|
|
|
rv.push(vk.groupDateVal);
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
|
|
|
|
}, []))].sort();
|
|
|
|
|
|
|
|
const allDateKey2 = [...new Set(mergeRows2.reduce((rv, vk) => {
|
|
|
|
|
|
|
|
rv.push(vk.groupDateVal);
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
|
|
|
|
}, []))].sort();
|
|
|
|
|
|
|
|
const allLabelDateKeyMapped = {
|
|
|
|
|
|
|
|
...allDateKey2.reduce((obj, k, i) => ({...obj, [k]: allDateKey1[i] || `_${k}`}), {})
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
const mergeKeyDateRows = [].concat(
|
|
|
|
|
|
|
|
mergeRows1 || [],
|
|
|
|
|
|
|
|
(mergeRows2 || []).map((row, ri) => {
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
|
|
...row,
|
|
|
|
|
|
|
|
groupsLabel: `${row.groupsLabel} @${moment(queryData.DateDiff1).year()}`,
|
|
|
|
|
|
|
|
groupDateVal: allLabelDateKeyMapped[row.groupDateVal],
|
|
|
|
|
|
|
|
rawGroupDateVal: row.groupDateVal,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
).sort(sortBy('groupDateVal'));
|
|
|
|
|
|
|
|
runInAction(() => {
|
|
|
|
|
|
|
|
this.timeDiffData.loading = false;
|
|
|
|
|
|
|
|
this.timeDiffData.dataSource = mergeKeyDateRows;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -240,18 +338,26 @@ class Trade {
|
|
|
|
this.targetTableProps.dataSource = [].concat(Object.values(finalTargetData.targetGuest), Object.values(finalTargetData.targetCountry)); // [finalTargetData.targetTotal], // todo: 总数是重复的
|
|
|
|
this.targetTableProps.dataSource = [].concat(Object.values(finalTargetData.targetGuest), Object.values(finalTargetData.targetCountry)); // [finalTargetData.targetTotal], // todo: 总数是重复的
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
setStateSearch(body) {
|
|
|
|
searchValues = {};
|
|
|
|
|
|
|
|
setSearch(body, form) {
|
|
|
|
this.searchPayloadHome = body;
|
|
|
|
this.searchPayloadHome = body;
|
|
|
|
|
|
|
|
this.searchValues = form;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
timeLineKey = 'week';
|
|
|
|
timeLineKey = 'month';
|
|
|
|
setTimeLineKey(v) {
|
|
|
|
setTimeLineKey(v) {
|
|
|
|
this.timeLineKey = v;
|
|
|
|
this.timeLineKey = v;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
groupKey = 'overview';
|
|
|
|
|
|
|
|
setGroupKey(v) {
|
|
|
|
|
|
|
|
this.groupKey = v;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
resetData = () => {
|
|
|
|
resetData = () => {
|
|
|
|
this.summaryData = { loading: false, dataSource: [], kpi: {}, };
|
|
|
|
this.summaryData = { loading: false, dataSource: [], kpi: {}, };
|
|
|
|
this.timeData = { loading: false, dataSource: [], origin: {} };
|
|
|
|
this.timeData = { loading: false, dataSource: [], origin: {}, diff: {} };
|
|
|
|
|
|
|
|
this.timeDiffData = { loading: false, dataSource: [], origin: {}, };
|
|
|
|
this.BuData = { loading: false, dataSource: [] };
|
|
|
|
this.BuData = { loading: false, dataSource: [] };
|
|
|
|
this.sideData = { loading: false, dataSource: {}, monthData: [], yearData: [] };
|
|
|
|
this.sideData = { loading: false, dataSource: {}, monthData: [], yearData: [] };
|
|
|
|
this.topData = {};
|
|
|
|
this.topData = {};
|
|
|
@ -261,7 +367,8 @@ class Trade {
|
|
|
|
|
|
|
|
|
|
|
|
searchPayloadHome = {};
|
|
|
|
searchPayloadHome = {};
|
|
|
|
summaryData = { loading: false, dataSource: [], kpi: {}, };
|
|
|
|
summaryData = { loading: false, dataSource: [], kpi: {}, };
|
|
|
|
timeData = { loading: false, dataSource: [], origin: {} };
|
|
|
|
timeData = { loading: false, dataSource: [], origin: {}, diff: {} };
|
|
|
|
|
|
|
|
timeDiffData = { loading: false, dataSource: [], origin: {}, };
|
|
|
|
BuData = { loading: false, dataSource: [] };
|
|
|
|
BuData = { loading: false, dataSource: [] };
|
|
|
|
sideData = { loading: false, dataSource: {}, monthData: [], yearData: [] };
|
|
|
|
sideData = { loading: false, dataSource: {}, monthData: [], yearData: [] };
|
|
|
|
topData = {};
|
|
|
|
topData = {};
|
|
|
@ -275,6 +382,7 @@ class Trade {
|
|
|
|
{key: 'transactions', title: '营收', dataIndex: 'transactions', render: (v) => dataFieldAlias.transactions.formatter(v)},
|
|
|
|
{key: 'transactions', title: '营收', dataIndex: 'transactions', render: (v) => dataFieldAlias.transactions.formatter(v)},
|
|
|
|
], dataSource: [] };
|
|
|
|
], dataSource: [] };
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export const parseMergeItem = ({traditional, biz}) => {
|
|
|
|
export const parseMergeItem = ({traditional, biz}) => {
|
|
|
|
return ['result1', 'result2'].reduce((res, resKey) => {
|
|
|
|
return ['result1', 'result2'].reduce((res, resKey) => {
|
|
|
|
const mergeItem = {
|
|
|
|
const mergeItem = {
|
|
|
@ -284,7 +392,8 @@ export const parseMergeItem = ({traditional, biz}) => {
|
|
|
|
const mergeRes = [].concat(traditional[resKey], biz[resKey]);
|
|
|
|
const mergeRes = [].concat(traditional[resKey], biz[resKey]);
|
|
|
|
const groupsData = mergeRes.reduce((r, v) => {
|
|
|
|
const groupsData = mergeRes.reduce((r, v) => {
|
|
|
|
if (v.groupsKey ) {
|
|
|
|
if (v.groupsKey ) {
|
|
|
|
(r[v.groupsKey] || (r[v.groupsKey] = [])).push(v);
|
|
|
|
const groupsKeyLower = v.groupsKey.toLowerCase();
|
|
|
|
|
|
|
|
(r[groupsKeyLower] || (r[groupsKeyLower] = [])).push(v);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return r;
|
|
|
|
return r;
|
|
|
|
}, {});
|
|
|
|
}, {});
|
|
|
@ -307,8 +416,8 @@ export const parseMergeItem = ({traditional, biz}) => {
|
|
|
|
// ConfirmRatesKPIrates: 0, // todo:
|
|
|
|
// ConfirmRatesKPIrates: 0, // todo:
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
// 按对象汇总
|
|
|
|
// 按对象汇总
|
|
|
|
const TMapped = traditional[resKey].reduce((r, v) => ({...r, [v.groupsKey]: v}), {});
|
|
|
|
const TMapped = traditional[resKey].reduce((r, v) => ({...r, [(v.groupsKey.toLowerCase())]: v}), {});
|
|
|
|
const BMapped = biz[resKey].reduce((r, v) => ({...r, [v.groupsKey]: v}), {});
|
|
|
|
const BMapped = biz[resKey].reduce((r, v) => ({...r, [(v.groupsKey.toLowerCase())]: v}), {});
|
|
|
|
const summary = Object.keys(groupsData).map(groupsKey => {
|
|
|
|
const summary = Object.keys(groupsData).map(groupsKey => {
|
|
|
|
const _groupsKey = groupsKey; // groupsData[groupsKey]?.[0]?.groupsKey || '';
|
|
|
|
const _groupsKey = groupsKey; // groupsData[groupsKey]?.[0]?.groupsKey || '';
|
|
|
|
return ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
|
|
|
|
return ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
|
|
|
@ -327,9 +436,9 @@ export const parseMergeItem = ({traditional, biz}) => {
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
// 按每一行
|
|
|
|
// 按每一行
|
|
|
|
// const ByDate = sortKeys(groupBy(mergeRes, ele => ele.groupDateVal));
|
|
|
|
// const ByDate = sortKeys(groupBy(mergeRes, ele => ele.groupDateVal));
|
|
|
|
const allRowsKeysData = groupBy(mergeRes, ele => `${ele.groupsKey}@${ele.groupDateVal}`);
|
|
|
|
const allRowsKeysData = groupBy(mergeRes, ele => `${ele.groupsKey.toLowerCase()}@${ele.groupDateVal}`);
|
|
|
|
const mergeRows = Object.keys(allRowsKeysData).map(rkey => {
|
|
|
|
const mergeRows = Object.keys(allRowsKeysData).map(rkey => {
|
|
|
|
const _groupsKey = allRowsKeysData[rkey]?.[0]?.groupsKey || '';
|
|
|
|
const _groupsKey = (allRowsKeysData[rkey]?.[0]?.groupsKey || '').toLowerCase();
|
|
|
|
const sumFields = ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
|
|
|
|
const sumFields = ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
|
|
|
|
(r, skey) => ({ ...r,
|
|
|
|
(r, skey) => ({ ...r,
|
|
|
|
[skey]: allRowsKeysData[rkey].reduce((a, c) => a + c[skey], 0),
|
|
|
|
[skey]: allRowsKeysData[rkey].reduce((a, c) => a + c[skey], 0),
|
|
|
@ -348,7 +457,32 @@ export const parseMergeItem = ({traditional, biz}) => {
|
|
|
|
OrderKPIrates: row.OrderKPIvalue ? fixTo2Decimals((row.SumOrder/row.OrderKPIvalue)*100) : 0,
|
|
|
|
OrderKPIrates: row.OrderKPIvalue ? fixTo2Decimals((row.SumOrder/row.OrderKPIvalue)*100) : 0,
|
|
|
|
// ConfirmRatesKPIrates: 0, // todo:
|
|
|
|
// ConfirmRatesKPIrates: 0, // todo:
|
|
|
|
}));
|
|
|
|
}));
|
|
|
|
return Object.assign(res, { [resKey]: Object.assign({}, mergeItem, { mergeRows, summary, summaryRows }) });
|
|
|
|
// 合并账户
|
|
|
|
|
|
|
|
const allRowsLabelsData = groupBy(mergeRes, ele => `${ele.groupsLabel.replace(/\([^)]*\)/gi, '').toLowerCase()}@${ele.groupDateVal}`);
|
|
|
|
|
|
|
|
const mergeLabelsRows = Object.keys(allRowsLabelsData).map(rkey => {
|
|
|
|
|
|
|
|
const _groupsLabel = rkey.split('@')[0].toLowerCase();
|
|
|
|
|
|
|
|
const _groupsKey = (allRowsLabelsData[rkey]?.[0]?.groupsKey || '').toLowerCase();
|
|
|
|
|
|
|
|
const sumFields = [
|
|
|
|
|
|
|
|
'ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum',
|
|
|
|
|
|
|
|
'ConfirmOrderKPIvalue', 'OrderKPIvalue', 'MLKPIvalue',
|
|
|
|
|
|
|
|
].reduce(
|
|
|
|
|
|
|
|
(r, skey) => ({ ...r,
|
|
|
|
|
|
|
|
[skey]: allRowsLabelsData[rkey].reduce((a, c) => a + c[skey], 0),
|
|
|
|
|
|
|
|
// [`${skey}_arr`]: [ _groupsKey ? TMapped?.[_groupsKey]?.[skey] || 0 : 0, _groupsKey ? BMapped?.[_groupsKey]?.[skey] || 0 : 0,],
|
|
|
|
|
|
|
|
}),
|
|
|
|
|
|
|
|
allRowsLabelsData[rkey]?.[0] || {}
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
const pickFields = pick(allRowsLabelsData[rkey], Object.keys(allRowsLabelsData[rkey]).filter(_k => _k.endsWith('KPIvalue') ));
|
|
|
|
|
|
|
|
return {...pickFields, ...sumFields, groupsLabel: _groupsLabel, groupsKey: _groupsLabel };
|
|
|
|
|
|
|
|
}, {}).map(row => ({...row,
|
|
|
|
|
|
|
|
ConfirmRates: row.SumOrder ? fixTo2Decimals((row.ConfirmOrder/row.SumOrder)*100) : 0,
|
|
|
|
|
|
|
|
MLKPIrates: row.MLKPIvalue ? fixTo2Decimals((row.SumML/row.MLKPIvalue)*100) : 0,
|
|
|
|
|
|
|
|
OrderValue: row.SumOrder ? fixToInt((row.SumML/row.SumOrder)) : 0,
|
|
|
|
|
|
|
|
ConfirmOrderKPIrates: row.ConfirmOrderKPIvalue ? fixTo2Decimals((row.ConfirmOrder/row.ConfirmOrderKPIvalue)*100) : 0,
|
|
|
|
|
|
|
|
OrderKPIrates: row.OrderKPIvalue ? fixTo2Decimals((row.SumOrder/row.OrderKPIvalue)*100) : 0,
|
|
|
|
|
|
|
|
// ConfirmRatesKPIrates: 0, // todo:
|
|
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
return Object.assign(res, { [resKey]: Object.assign({}, mergeItem, { mergeRows, summary, summaryRows, mergeLabelsRows }) });
|
|
|
|
}, {});
|
|
|
|
}, {});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|