diff --git a/src/stores/SaleStore.js b/src/stores/SaleStore.js index 4b28a99..08eabb8 100644 --- a/src/stores/SaleStore.js +++ b/src/stores/SaleStore.js @@ -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 []; + return json; + } + + /** + * 获取业绩数据: 商务订单 + */ + 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; } } diff --git a/src/stores/Trade.js b/src/stores/Trade.js index 2aca077..473f31d 100644 --- a/src/stores/Trade.js +++ b/src/stores/Trade.js @@ -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;