顾问: 销售进度: 实际完成=传统+商务, 对比KPI

feature/person-num
Lei OT 2 years ago
parent 2942a61c8e
commit 3e3e7f1485

@ -6,6 +6,7 @@ import { NavLink } from 'react-router-dom';
import { groupsMappedByCode, dataFieldAlias } from './../libs/ht';
import * as req from '../utils/request';
import { parseKPI } from './KPI';
import { parseMergeItem } from './Trade';
// 销售数据
class SaleStore {
@ -512,19 +513,21 @@ class SaleStore {
async fetchOperatorTradeData(groupType, queryData) {
this.salesTrade.loading = true;
const param1 = Object.assign(queryData, {groupType, groupDateType: 'year' });
const yearData = await this.fetchTradeData(param1);
const yData = parseSaleData(yearData, ['groupsKey', 'groupDateType']);
const param2 = Object.assign(queryData, {groupType, groupDateType: 'month' });
const monthData = await this.fetchTradeData(param2);
const mData = parseSaleData(monthData, ['groupsKey', 'groupDateType']);
const param1 = Object.assign({}, queryData, {groupType, groupDateType: 'year' });
const yearData = await this.fetchTradeDataAll(param1);
const { mergeRows: yearMergeRows } = yearData.result1;
const yData = parseSaleData(yearMergeRows, ['groupsKey', 'groupDateType']);
const param2 = Object.assign({}, queryData, {groupType, groupDateType: 'month' });
const monthData = await this.fetchTradeDataAll(param2);
const { mergeRows: monthMergeRows } = monthData.result1;
const mData = parseSaleData(monthMergeRows, ['groupsKey', 'groupDateType']);
const mergeYearMonth = Object.keys(yData).map(ykey => ({
...yData[ykey],
mData: mData[ykey].data,
yData: Object.values(yData[ykey].data)[0],
data: undefined,
yearML: Object.values(yData[ykey].data)[0]?.SumML || 0, // 整理排序用
})).sort(comm.sortBy('yearML')).reverse();
}));
const kpiObjects = mergeYearMonth.map(v => ({ key: v.groupsKey, value: v.groupsKey, label: v.groupsLabel }));
const kpiData = await this.getKPISettings(groupType, queryData, kpiObjects);
@ -547,7 +550,7 @@ class SaleStore {
runInAction(() => {
this.salesTrade.loading = false;
this.salesTrade[groupType] = Object.values(salesTradeDataMapped);
this.salesTrade[groupType] = Object.values(salesTradeDataMapped).sort(comm.sortBy('yearML')).reverse();
this.salesTrade[`${groupType}Mapped`] = Object.values(salesTradeDataMapped).reduce((r, v) => ({...r, [v.groupsKey]: Object.values(v.mData)}), {});
});
}
@ -576,10 +579,25 @@ class SaleStore {
*/
async fetchTradeData(queryData) {
const json = await req.fetchJSON('/service-Analyse2/GetTradeProcess', queryData);
if (json.errcode === 0) {
return json.result1;
return json;
}
return [];
/**
* 获取业绩数据: 商务订单
*/
async fetchTradeDataBiz(queryData) {
const json = await req.fetchJSON('/service-Analyse2/GetTradeProcess_biz', queryData);
return json;
}
/**
* 合并传统和商务
*/
async fetchTradeDataAll(queryData) {
const traditional = await this.fetchTradeData(queryData);
const biz = await this.fetchTradeDataBiz(queryData);
const rr = parseMergeItem({ traditional, biz });
return rr;
}
}

@ -214,57 +214,7 @@ class Trade {
async fetchTradeDataAll(queryData) {
const traditional = await this.fetchTradeData(queryData);
const biz = await this.fetchTradeDataBiz(queryData);
const rr = ['result1', 'result2'].reduce((res, resKey) => {
const mergeItem = {
traditional: traditional[resKey].map(ele => ({...ele, groupsLabel: `传统 `})), // ${ele.groupsLabel}
biz: biz[resKey].map(ele => ({...ele, groupsLabel: `商务 `})), // ${ele.groupsLabel}
};
const mergeRes = [].concat(traditional[resKey], biz[resKey]);
const groupsData = mergeRes.reduce((r, v) => {
if (v.groupsLabel ) {
(r[v.groupsLabel] || (r[v.groupsLabel] = [])).push(v);
}
return r;
}, {});
const ByDate = sortKeys(groupBy(mergeRes, ele => ele.groupDateVal));
// 按日期汇总
const summaryRows = Object.keys(ByDate).map(dateVal => {
const sumFields = ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
(r, skey) => ({ ...r, [skey]: ByDate[dateVal].reduce((a, c) => a + c[skey], 0) }),
ByDate[dateVal]?.[0] || {}
);
const pickFields = pick(ByDate[dateVal], Object.keys(ByDate[dateVal]).filter(_k => _k.endsWith('KPIvalue') ));
return {...sumFields, ...pickFields};
}, {}).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,
// groupsLabel: `总 `, // ${row.groupsLabel}
ConfirmOrderKPIrates: row.ConfirmOrderKPIvalue ? fixTo2Decimals((row.ConfirmOrder/row.ConfirmOrderKPIvalue)*100) : 0,
OrderKPIrates: row.OrderKPIvalue ? fixTo2Decimals((row.SumOrder/row.OrderKPIvalue)*100) : 0,
// ConfirmRatesKPIrates: 0, // todo:
}));
// 按对象汇总
const TMapped = traditional[resKey].reduce((r, v) => ({...r, [v.groupsKey]: v}), {});
const BMapped = biz[resKey].reduce((r, v) => ({...r, [v.groupsKey]: v}), {});
const summary = Object.keys(groupsData).map(groupsLabel => {
const _groupsKey = groupsData[groupsLabel]?.[0]?.groupsKey || '';
return ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
(r, skey) => ({ ...r,
[skey]: groupsData[groupsLabel].reduce((a, c) => a + c[skey], 0),
// [`${skey}_arr`]: groupsData[groupsLabel].map(sv => sv[skey]),
[`${skey}_arr`]: [ _groupsKey ? TMapped?.[_groupsKey]?.[skey] || 0 : 0, _groupsKey ? BMapped?.[_groupsKey]?.[skey] || 0 : 0,],
}),
groupsData[groupsLabel]?.[0] || {}
);
}).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,
// groupsLabel: `总 `, // ${row.groupsLabel}
}));
return Object.assign(res, { [resKey]: Object.assign({}, mergeItem, { summary, summaryRows }) });
}, {});
const rr = parseMergeItem({ traditional, biz });
return rr;
}
@ -327,5 +277,81 @@ class Trade {
{key: 'transactions', title: '营收', dataIndex: 'transactions', render: (v) => dataFieldAlias.transactions.formatter(v)},
], dataSource: [] };
}
export const parseMergeItem = ({traditional, biz}) => {
return ['result1', 'result2'].reduce((res, resKey) => {
const mergeItem = {
traditional: traditional[resKey].map(ele => ({...ele, groupsLabel: `传统 `})), // ${ele.groupsLabel}
biz: biz[resKey].map(ele => ({...ele, groupsLabel: `商务 `})), // ${ele.groupsLabel}
};
const mergeRes = [].concat(traditional[resKey], biz[resKey]);
const groupsData = mergeRes.reduce((r, v) => {
if (v.groupsLabel ) {
(r[v.groupsLabel] || (r[v.groupsLabel] = [])).push(v);
}
return r;
}, {});
const ByDate = sortKeys(groupBy(mergeRes, ele => ele.groupDateVal));
// 按日期汇总
const summaryRows = Object.keys(ByDate).map(dateVal => {
const sumFields = ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
(r, skey) => ({ ...r, [skey]: ByDate[dateVal].reduce((a, c) => a + c[skey], 0) }),
ByDate[dateVal]?.[0] || {}
);
const pickFields = pick(ByDate[dateVal], Object.keys(ByDate[dateVal]).filter(_k => _k.endsWith('KPIvalue') ));
return {...sumFields, ...pickFields};
}, {}).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,
// groupsLabel: `总 `, // ${row.groupsLabel}
ConfirmOrderKPIrates: row.ConfirmOrderKPIvalue ? fixTo2Decimals((row.ConfirmOrder/row.ConfirmOrderKPIvalue)*100) : 0,
OrderKPIrates: row.OrderKPIvalue ? fixTo2Decimals((row.SumOrder/row.OrderKPIvalue)*100) : 0,
// ConfirmRatesKPIrates: 0, // todo:
}));
// 按对象汇总
const TMapped = traditional[resKey].reduce((r, v) => ({...r, [v.groupsKey]: v}), {});
const BMapped = biz[resKey].reduce((r, v) => ({...r, [v.groupsKey]: v}), {});
const summary = Object.keys(groupsData).map(groupsLabel => {
const _groupsKey = groupsData[groupsLabel]?.[0]?.groupsKey || '';
return ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
(r, skey) => ({ ...r,
[skey]: groupsData[groupsLabel].reduce((a, c) => a + c[skey], 0),
// [`${skey}_arr`]: groupsData[groupsLabel].map(sv => sv[skey]),
[`${skey}_arr`]: [ _groupsKey ? TMapped?.[_groupsKey]?.[skey] || 0 : 0, _groupsKey ? BMapped?.[_groupsKey]?.[skey] || 0 : 0,],
}),
groupsData[groupsLabel]?.[0] || {}
);
}).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,
// groupsLabel: `总 `, // ${row.groupsLabel}
}));
// 按每一行
// const ByDate = sortKeys(groupBy(mergeRes, ele => ele.groupDateVal));
const allRowsKeysData = groupBy(mergeRes, ele => `${ele.groupsKey}@${ele.groupDateVal}`);
const mergeRows = Object.keys(allRowsKeysData).map(rkey => {
const _groupsKey = allRowsKeysData[rkey]?.[0]?.groupsKey || '';
const sumFields = ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum'].reduce(
(r, skey) => ({ ...r,
[skey]: allRowsKeysData[rkey].reduce((a, c) => a + c[skey], 0),
[`${skey}_arr`]: [ _groupsKey ? TMapped?.[_groupsKey]?.[skey] || 0 : 0, _groupsKey ? BMapped?.[_groupsKey]?.[skey] || 0 : 0,],
}),
allRowsKeysData[rkey]?.[0] || {}
);
const pickFields = pick(allRowsKeysData[rkey], Object.keys(allRowsKeysData[rkey]).filter(_k => _k.endsWith('KPIvalue') ));
return {...sumFields, ...pickFields};
}, {}).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,
// groupsLabel: `总 `, // ${row.groupsLabel}
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 }) });
}, {});
};
export default Trade;

Loading…
Cancel
Save