|
|
|
@ -2,7 +2,7 @@ import {makeAutoObservable, runInAction} from "mobx";
|
|
|
|
|
import { fetchJSON } from '../utils/request';
|
|
|
|
|
import * as config from "../config";
|
|
|
|
|
import { groupsMappedByKey, sitesMappedByCode, pivotBy } from './../libs/ht';
|
|
|
|
|
import { sortBy, show_vs_tag, formatPercent, groupBy, isEmpty } from "../utils/commons";
|
|
|
|
|
import { sortBy, show_vs_tag, formatPercent, groupBy, isEmpty, uniqWith } from "../utils/commons";
|
|
|
|
|
import moment from 'moment';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -458,64 +458,78 @@ class CustomerStore {
|
|
|
|
|
DateType: { key: 'applyDate', label: '提交日期'},
|
|
|
|
|
IncludeTickets: { key: '0', label: '不含门票' },
|
|
|
|
|
},
|
|
|
|
|
pivotData: {
|
|
|
|
|
operatorName: { loading: false, data: [], rawData: [], filterColValues: [] },
|
|
|
|
|
country: { loading: false, data: [], rawData: [], filterColValues: [] },
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
get_sales_regular_data_vs = async (param) => {
|
|
|
|
|
this.sales_regular_data.loading = true;
|
|
|
|
|
get_sales_regular_data_vs = async (param, pivotRow = 'operatorName') => {
|
|
|
|
|
this.sales_regular_data.pivotData[pivotRow].loading = true;
|
|
|
|
|
const hasCompare = !isEmpty(param.DateDiff1);
|
|
|
|
|
const [result1, result2] = await Promise.all([
|
|
|
|
|
this.get_sales_regular_data(param),
|
|
|
|
|
hasCompare ? this.get_sales_regular_data({...param, Date1: param.DateDiff1, Date2: param.DateDiff2}) : { mergeDataBySales: [], mergeDataBySalesAccount: [], filterHasOld: []},
|
|
|
|
|
this.get_sales_regular_data(param, pivotRow),
|
|
|
|
|
hasCompare ? this.get_sales_regular_data({...param, Date1: param.DateDiff1, Date2: param.DateDiff2}, pivotRow) : { mergeDataBySales: [], mergeDataBySalesAccount: [], filterHasOld: []},
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const allTypes = ['老客户', '老客户推荐'];
|
|
|
|
|
// 独立的账户
|
|
|
|
|
const allSales = Array.from(new Set([...result1.mergeDataBySales.map(row=>row.operatorName), ...result2.mergeDataBySales.map(row=>row.operatorName)]));
|
|
|
|
|
const sales1 = groupBy(result1.mergeDataBySales, 'operatorName');
|
|
|
|
|
const sales2 = groupBy(result2.mergeDataBySales, 'operatorName');
|
|
|
|
|
const allSales = Array.from(new Set([...result1.mergeDataBySales.map(row=>row[pivotRow]), ...result2.mergeDataBySales.map(row=>row[pivotRow])]));
|
|
|
|
|
const sales1 = groupBy(result1.mergeDataBySales, pivotRow);
|
|
|
|
|
const sales2 = groupBy(result2.mergeDataBySales, pivotRow);
|
|
|
|
|
const mergeDataBySales = allSales.reduce((r, sale) => {
|
|
|
|
|
const _default = { operatorName: sale, rowLabel: sales1?.[sale]?.rowLabel || sales2?.[sale]?.rowLabel, children: sales1?.[sale]?.children || [], key: sale};
|
|
|
|
|
const _default = { [pivotRow]: sale, rowLabel: sales1?.[sale]?.rowLabel || sales2?.[sale]?.rowLabel, children: sales1?.[sale]?.children || [], key: sale};
|
|
|
|
|
const operatorRow = {...(sales1?.[sale]?.[0] || _default), vsData: sales2?.[sale]?.[0] || {}};
|
|
|
|
|
// 展开的两项: '老客户', '老客户推荐'
|
|
|
|
|
const series1Children = sales1?.[sale]?.[0]?.children || [];
|
|
|
|
|
const series2Children = sales2?.[sale]?.[0]?.children || [];
|
|
|
|
|
const children = allTypes.reduce((r, type) => {
|
|
|
|
|
const _default = { operatorName: type, rowLabel: type, key: type};
|
|
|
|
|
const _typeRow = series1Children.find(sc => sc.operatorName === type) || _default;
|
|
|
|
|
const _typeVSRow = series2Children.find(sc => sc.operatorName === type) || {};
|
|
|
|
|
const _default = { [pivotRow]: type, rowLabel: type, key: type};
|
|
|
|
|
const _typeRow = series1Children.find(sc => sc[pivotRow] === type) || _default;
|
|
|
|
|
const _typeVSRow = series2Children.find(sc => sc[pivotRow] === type) || {};
|
|
|
|
|
return r.concat({..._typeRow, vsData: _typeVSRow});
|
|
|
|
|
}, []);
|
|
|
|
|
operatorRow.children = children;
|
|
|
|
|
return r.concat(operatorRow);
|
|
|
|
|
}, []);
|
|
|
|
|
// 合并顾问的账户
|
|
|
|
|
const allSalesMerged = Array.from(new Set([...result1.mergeDataBySalesAccount.map(row=>row.operatorName), ...result2.mergeDataBySalesAccount.map(row=>row.operatorName)]));
|
|
|
|
|
const salesM1 = groupBy(result1.mergeDataBySalesAccount, 'operatorName');
|
|
|
|
|
const salesM2 = groupBy(result2.mergeDataBySalesAccount, 'operatorName');
|
|
|
|
|
const mergeDataBySalesAccount = allSalesMerged.reduce((r, sale) => {
|
|
|
|
|
const _default = { operatorName: sale, rowLabel: salesM1?.[sale]?.rowLabel || salesM2?.[sale]?.rowLabel, children: salesM1?.[sale]?.children || [], key: sale};
|
|
|
|
|
const operatorRow = {...(salesM1?.[sale]?.[0] || _default), vsData: salesM2?.[sale]?.[0] || {}};
|
|
|
|
|
// 展开的两项: '老客户', '老客户推荐'
|
|
|
|
|
const series1Children = salesM1?.[sale]?.[0]?.children || [];
|
|
|
|
|
const series2Children = salesM2?.[sale]?.[0]?.children || [];
|
|
|
|
|
const children = allTypes.reduce((r, type) => {
|
|
|
|
|
const _default = { operatorName: type, rowLabel: type, key: type};
|
|
|
|
|
const _typeRow = series1Children.find(sc => sc.operatorName === type) || _default;
|
|
|
|
|
const _typeVSRow = series2Children.find(sc => sc.operatorName === type) || {};
|
|
|
|
|
return r.concat({..._typeRow, vsData: _typeVSRow});
|
|
|
|
|
let mergeDataBySalesAccount = [];
|
|
|
|
|
if (pivotRow === 'operatorName') {
|
|
|
|
|
const allSalesMerged = Array.from(new Set([...result1.mergeDataBySalesAccount.map(row=>row.operatorName), ...result2.mergeDataBySalesAccount.map(row=>row.operatorName)]));
|
|
|
|
|
const salesM1 = groupBy(result1.mergeDataBySalesAccount, 'operatorName');
|
|
|
|
|
const salesM2 = groupBy(result2.mergeDataBySalesAccount, 'operatorName');
|
|
|
|
|
mergeDataBySalesAccount = allSalesMerged.reduce((r, sale) => {
|
|
|
|
|
const _default = { operatorName: sale, rowLabel: salesM1?.[sale]?.rowLabel || salesM2?.[sale]?.rowLabel, children: salesM1?.[sale]?.children || [], key: sale};
|
|
|
|
|
const operatorRow = {...(salesM1?.[sale]?.[0] || _default), vsData: salesM2?.[sale]?.[0] || {}};
|
|
|
|
|
// 展开的两项: '老客户', '老客户推荐'
|
|
|
|
|
const series1Children = salesM1?.[sale]?.[0]?.children || [];
|
|
|
|
|
const series2Children = salesM2?.[sale]?.[0]?.children || [];
|
|
|
|
|
const children = allTypes.reduce((r, type) => {
|
|
|
|
|
const _default = { operatorName: type, rowLabel: type, key: type};
|
|
|
|
|
const _typeRow = series1Children.find(sc => sc.operatorName === type) || _default;
|
|
|
|
|
const _typeVSRow = series2Children.find(sc => sc.operatorName === type) || {};
|
|
|
|
|
return r.concat({..._typeRow, vsData: _typeVSRow});
|
|
|
|
|
}, []);
|
|
|
|
|
operatorRow.children = children;
|
|
|
|
|
return r.concat(operatorRow);
|
|
|
|
|
}, []);
|
|
|
|
|
operatorRow.children = children;
|
|
|
|
|
return r.concat(operatorRow);
|
|
|
|
|
}, []);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.sales_regular_data.loading = false;
|
|
|
|
|
this.sales_regular_data.data = mergeDataBySales;
|
|
|
|
|
this.sales_regular_data.mergedData = mergeDataBySalesAccount;
|
|
|
|
|
this.sales_regular_data.rawData = [].concat(result1.filterHasOld, result2.filterHasOld);
|
|
|
|
|
const filterColValues = uniqWith(
|
|
|
|
|
mergeDataBySales.map((rr) => ({ text: rr[pivotRow], value: rr[pivotRow] })),
|
|
|
|
|
(a, b) => JSON.stringify(a) === JSON.stringify(b)
|
|
|
|
|
).sort((a, b) => a.text.localeCompare(b.text, 'zh-CN'));
|
|
|
|
|
|
|
|
|
|
this.sales_regular_data.pivotData[pivotRow].loading = false;
|
|
|
|
|
this.sales_regular_data.pivotData[pivotRow].rawData = [].concat(result1.filterHasOld, result2.filterHasOld);
|
|
|
|
|
this.sales_regular_data.pivotData[pivotRow].data = mergeDataBySales;
|
|
|
|
|
this.sales_regular_data.pivotData[pivotRow].mergedData = isEmpty(mergeDataBySalesAccount) ? mergeDataBySales : mergeDataBySalesAccount;
|
|
|
|
|
|
|
|
|
|
this.sales_regular_data.pivotData[pivotRow].filterColValues = filterColValues;
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
get_sales_regular_data = async (param) => {
|
|
|
|
|
get_sales_regular_data = async (param, pivotRow = 'operatorName') => {
|
|
|
|
|
const seriesKey = `${param.Date1}至${param.Date2}`;
|
|
|
|
|
const rawData = await getDetailData({...param, });
|
|
|
|
|
const filterHasOld = rawData.filter(ele => (ele.IsOld === '1' || ele.isCusCommend === '1')).map(e => ({
|
|
|
|
@ -524,40 +538,38 @@ class CustomerStore {
|
|
|
|
|
operatorNameB: e.operatorName.replace(/\([^)]*\)/gi, '').toLowerCase(),
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
const { data: hasOldData, } = pivotBy(filterHasOld, [['hasOld', 'operatorName'], [], []]);
|
|
|
|
|
const { data: IsOldData, } = pivotBy(filterHasOld.filter(ele => ele.IsOld === '1'), [['operatorName', 'IsOld_txt', ], [], []]);
|
|
|
|
|
const { data: isCusCommendData, } = pivotBy(filterHasOld.filter(ele => ele.isCusCommend === '1'), [['operatorName', 'isCusCommend_txt', ], [], []]);
|
|
|
|
|
const { data: hasOldData, } = pivotBy(filterHasOld, [['hasOld', pivotRow], [], []]);
|
|
|
|
|
const { data: IsOldData, } = pivotBy(filterHasOld.filter(ele => ele.IsOld === '1'), [[pivotRow, 'IsOld_txt', ], [], []]);
|
|
|
|
|
const { data: isCusCommendData, } = pivotBy(filterHasOld.filter(ele => ele.isCusCommend === '1'), [[pivotRow, 'isCusCommend_txt', ], [], []]);
|
|
|
|
|
// console.log('IsOldData====', IsOldData, '\nisCusCommend', isCusCommendData);
|
|
|
|
|
// console.log('data====', rawData, '\ncolumnValues', columnValues, '\nsummaryRows', summaryRows, '\nsummaryColumns', summaryColumns, '\nsummaryMix', summaryMix, '\nhasOld',filterHasOld);
|
|
|
|
|
const mergeDataBySales = hasOldData.map((ele) => ({
|
|
|
|
|
...ele,
|
|
|
|
|
seriesKey,
|
|
|
|
|
children: [].concat(
|
|
|
|
|
IsOldData.filter((ele1) => ele1.operatorName === ele.operatorName).map(o => ({...o, operatorName: o.IsOld_txt, key: o.rowLabel, seriesKey,})),
|
|
|
|
|
isCusCommendData.filter((ele2) => ele2.operatorName === ele.operatorName).map(o => ({...o, operatorName: o.isCusCommend_txt, key: o.rowLabel, seriesKey,}))
|
|
|
|
|
IsOldData.filter((ele1) => ele1[pivotRow] === ele[pivotRow]).map(o => ({...o, [pivotRow]: o.IsOld_txt, key: o.rowLabel, seriesKey,})),
|
|
|
|
|
isCusCommendData.filter((ele2) => ele2[pivotRow] === ele[pivotRow]).map(o => ({...o, [pivotRow]: o.isCusCommend_txt, key: o.rowLabel, seriesKey,}))
|
|
|
|
|
),
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
// 合并顾问的账户
|
|
|
|
|
const { data: hasOldDataSales, } = pivotBy(filterHasOld, [['hasOld', 'operatorNameB'], [], []]);
|
|
|
|
|
const { data: IsOldDataSales, } = pivotBy(filterHasOld.filter(ele => ele.IsOld === '1'), [['operatorNameB', 'IsOld_txt', ], [], []]);
|
|
|
|
|
const { data: isCusCommendDataSales, } = pivotBy(filterHasOld.filter(ele => ele.isCusCommend === '1'), [['operatorNameB', 'isCusCommend_txt', ], [], []]);
|
|
|
|
|
const mergeDataBySalesAccount = hasOldDataSales.map((ele) => ({
|
|
|
|
|
...ele,
|
|
|
|
|
operatorName: ele.operatorNameB,
|
|
|
|
|
seriesKey,
|
|
|
|
|
children: [].concat(
|
|
|
|
|
IsOldDataSales.filter((ele1) => ele1.operatorNameB === ele.operatorNameB).map(o => ({...o, operatorName: o.IsOld_txt, key: o.rowLabel, seriesKey,})),
|
|
|
|
|
isCusCommendDataSales.filter((ele2) => ele2.operatorNameB === ele.operatorNameB).map(o => ({...o, operatorName: o.isCusCommend_txt, key: o.rowLabel, seriesKey,}))
|
|
|
|
|
),
|
|
|
|
|
}));
|
|
|
|
|
let mergeDataBySalesAccount = [];
|
|
|
|
|
if (pivotRow === 'operatorName') {
|
|
|
|
|
const { data: hasOldDataSales, } = pivotBy(filterHasOld, [['hasOld', 'operatorNameB'], [], []]);
|
|
|
|
|
const { data: IsOldDataSales, } = pivotBy(filterHasOld.filter(ele => ele.IsOld === '1'), [['operatorNameB', 'IsOld_txt', ], [], []]);
|
|
|
|
|
const { data: isCusCommendDataSales, } = pivotBy(filterHasOld.filter(ele => ele.isCusCommend === '1'), [['operatorNameB', 'isCusCommend_txt', ], [], []]);
|
|
|
|
|
mergeDataBySalesAccount = hasOldDataSales.map((ele) => ({
|
|
|
|
|
...ele,
|
|
|
|
|
operatorName: ele.operatorNameB,
|
|
|
|
|
seriesKey,
|
|
|
|
|
children: [].concat(
|
|
|
|
|
IsOldDataSales.filter((ele1) => ele1.operatorNameB === ele.operatorNameB).map(o => ({...o, operatorName: o.IsOld_txt, key: o.rowLabel, seriesKey,})),
|
|
|
|
|
isCusCommendDataSales.filter((ele2) => ele2.operatorNameB === ele.operatorNameB).map(o => ({...o, operatorName: o.isCusCommend_txt, key: o.rowLabel, seriesKey,}))
|
|
|
|
|
),
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
// console.log('IsOldDataSales====', IsOldDataSales, '\nisCusCommendDataSales', isCusCommendDataSales);
|
|
|
|
|
// console.log('mergeDataBySalesAccount====', mergeDataBySalesAccount);
|
|
|
|
|
return { mergeDataBySales, mergeDataBySalesAccount, filterHasOld };
|
|
|
|
|
// this.sales_regular_data.loading = false;
|
|
|
|
|
// this.sales_regular_data.data = mergeDataBySales;
|
|
|
|
|
// this.sales_regular_data.mergedData = mergeDataBySalesAccount;
|
|
|
|
|
// this.sales_regular_data.rawData = filterHasOld;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
setSearchValues(obj, values, target) {
|
|
|
|
|