From a7280a79b9cefb8c7ab9e2e41acba37a4d30070b Mon Sep 17 00:00:00 2001 From: Lei OT Date: Sat, 11 May 2024 17:20:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20GH=E4=BE=8B=E4=BC=9A:=20=E9=A1=BE?= =?UTF-8?q?=E9=97=AE=E6=88=90=E4=BA=A4;=20=E5=AE=A2=E6=9C=8D;=20todo:=20?= =?UTF-8?q?=E5=B9=B4=E6=95=B0=E6=8D=AE=E7=94=A81.1-12.31;=20=E9=A1=BE?= =?UTF-8?q?=E9=97=AE=E6=88=90=E4=BA=A4=E7=94=A8=E6=80=BB=E8=A7=88/?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/stores/MeetingData.js | 139 +++++++++++++++++++++++++++++++---- src/views/Meeting2024-GH.jsx | 51 ++++++++++--- 2 files changed, 167 insertions(+), 23 deletions(-) diff --git a/src/stores/MeetingData.js b/src/stores/MeetingData.js index 30fd89f..e6e7fd4 100644 --- a/src/stores/MeetingData.js +++ b/src/stores/MeetingData.js @@ -1,7 +1,9 @@ import { makeAutoObservable, runInAction } from 'mobx'; import { fetchJSON } from '../utils/request'; -import { objectMapper } from '../utils/commons'; +import { objectMapper, pick, price_to_number, } from '../utils/commons'; import { pivotBy } from './../libs/ht'; +import moment from "moment"; +import { DATE_FORMAT } from './../config'; /** * 用于透视的数据 @@ -27,6 +29,17 @@ const getOrderCountByType = async (param) => { const json = await fetchJSON(url, paramBody); return json.errcode === 0 ? json : {}; }; +const getAgentGroupInfoALL = async (param) => { + const paramBody = objectMapper(param, { + DateType: 'DateType', + DepartmentList: 'DepList', // { key: 'DepartmentList', transform: (v) => v.join(',') }, + Date1: 'OldDate1', + Date2: 'OldDate2', + }); + const url = '/service-web/QueryData/GetAgentGroupInfoALL'; + const json = await fetchJSON(url, paramBody); + return json.errcode === 0 ? json : {}; +}; const GHproductTypeListSetting = { ja: ['日本', '东亚跨国'], se: ['东南亚跨国', '泰国', '越南', '印度尼西亚', '水灯节'], @@ -89,6 +102,29 @@ const dataGHOther = (rawData, yearData) => { return { ...rowItem(filterData), rowYear }; }; +const dataSales = (tKey, rawData, yearData) => { + const productTypeList = GHproductTypeListSetting[tKey]; + const filterData = rawData.filter((ele) => productTypeList.some((item) => ele.OrderType.toLocaleLowerCase().indexOf(item) !== -1)); + const filterDataYear = yearData.filter((ele) => productTypeList.some((item) => ele.OrderType.toLocaleLowerCase().indexOf(item) !== -1)); + const rowYearData = ['YJLY', 'CJCount'].reduce((r, key) => ({ ...r, [key]: filterDataYear.reduce((a, c) => a + price_to_number(c[key]), 0) }), {}); + const rowYear = { YJLY: price_to_number(rowYearData.YJLY), CJCount: rowYearData.CJCount }; + + const cols = ['YJLY', 'CJCount'].reduce((r, key) => ({ ...r, [key]: filterData.reduce((a, c) => a + price_to_number(c[key]), 0) }), {}); + // console.log(tKey, filterData, filterDataYear); + return { ...cols, rowYear }; +}; +const dataSalesGHOther = (rawData, yearData) => { + const exceptProduct = Object.values(GHproductTypeListSetting).reduce((r, c) => r.concat(c), []); + const filterData = rawData.filter((ele) => exceptProduct.every((item) => ele.OrderType.toLocaleLowerCase().indexOf(item) === -1)); + const filterDataYear = yearData.filter((ele) => exceptProduct.every((item) => ele.OrderType.toLocaleLowerCase().indexOf(item) === -1)); + const rowYearData = ['YJLY', 'CJCount'].reduce((r, key) => ({ ...r, [key]: filterDataYear.reduce((a, c) => a + price_to_number(c[key]), 0) }), {}); + const rowYear = { YJLY: price_to_number(rowYearData.YJLY), CJCount: rowYearData.CJCount }; + + const cols = ['YJLY', 'CJCount'].reduce((r, key) => ({ ...r, [key]: filterData.reduce((a, c) => a + price_to_number(c[key]), 0) }), {}); + // console.log('Oo', filterData, filterDataYear); + return { ...cols, rowYear }; +}; + class MeetingData { constructor(rootStore) { this.rootStore = rootStore; @@ -104,22 +140,27 @@ class MeetingData { } GHTableData = []; - GHLoading = false; - - dataGH = async (param) => { + GHTableLoading = false; + /** + * 获取市场订单数据 + */ + dataGHOrder = async (param) => { // console.log('dataGH', param); - this.GHLoading = true; + this.GHTableLoading = true; + const defaultParam = { DateType: 'applyDate' }; // 本周 - const CHData = await getDetailData({ ...param, 'DepartmentList': '1', 'WebCode': 'All' }); - const exceptCHData = await getDetailData({ ...param, 'DepartmentList': '28,33', 'WebCode': 'All' }); + const CHData = await getDetailData({ ...param, ...defaultParam, 'DepartmentList': '1', 'WebCode': 'All' }); + const exceptCHData = await getDetailData({ ...param, ...defaultParam, 'DepartmentList': '28,33', 'WebCode': 'All' }); + + const yearStart = moment().startOf("year").format(DATE_FORMAT); /** 截至今年 - 行 */ - const { ordercountTotal1: CHDataYear } = await getOrderCountByType({ ...param, Date1: '2024-01-01', 'DepartmentList': '1', 'WebCode': 'All', OrderType: 'LineClass' }); - const { ordercount1: exceptCHDataYear } = await getOrderCountByType({ ...param, Date1: '2024-01-01', 'DepartmentList': '28,33', 'WebCode': 'All', OrderType: 'Product' }); + const { ordercountTotal1: CHDataYear } = await getOrderCountByType({ ...param, ...defaultParam, Date1: yearStart, 'DepartmentList': '1', 'WebCode': 'All', OrderType: 'LineClass' }); + const { ordercount1: exceptCHDataYear } = await getOrderCountByType({ ...param, ...defaultParam, Date1: yearStart, 'DepartmentList': '28,33', 'WebCode': 'All', OrderType: 'Product' }); /** 截至今年 - 列 */ - const { ordercount1: ColLineClassDataYear } = await getOrderCountByType({ ...param, Date1: '2024-01-01', 'DepartmentList': '1,2,28,7,33', 'WebCode': 'All', OrderType: 'LineClass' }); - const { ordercountTotal1: ColToBDataYear } = await getOrderCountByType({ ...param, Date1: '2024-01-01', 'DepartmentList': '1,2,28,7,33', 'WebCode': 'GHTOBHW,GHTOBZG', OrderType: 'LineClass' }); + const { ordercount1: ColLineClassDataYear } = await getOrderCountByType({ ...param, ...defaultParam, Date1: yearStart, 'DepartmentList': '1,2,28,7,33', 'WebCode': 'All', OrderType: 'LineClass' }); + const { ordercountTotal1: ColToBDataYear } = await getOrderCountByType({ ...param, ...defaultParam, Date1: yearStart, 'DepartmentList': '1,2,28,7,33', 'WebCode': 'GHTOBHW,GHTOBZG', OrderType: 'LineClass' }); // 老客户 - const yearDetail = await getDetailData({ ...param, Date1: '2024-01-01', 'DepartmentList': '1,2,28,7,33', 'WebCode': 'All' }); + const yearDetail = await getDetailData({ ...param, ...defaultParam, Date1: yearStart, 'DepartmentList': '1,2,28,7,33', 'WebCode': 'All' }); const { isOld1: isOld1Year } = rowItem(yearDetail); const colYearRow = { @@ -145,10 +186,80 @@ class MeetingData { ); rows.push({ key: 'columnSum', label: '合计', ...columnsSum }); rows.push({ key: 'colYearRow', label: '截至', ...colYearRow }); - // console.log(rows); runInAction(() => { this.GHTableData = rows; - this.GHLoading = false; + this.GHTableLoading = false; + }); + }; + + GHSalesTableData = []; + GHSalesLoading = false; + /** + * 获取GH销售数据 + */ + dataGHSales = async (param) => { + this.GHSalesLoading = true; + const salesParam = { ...param, DateType: 'confirmDate' }; + // console.log(param); + const { ordercountTotal1: CHSalesDataWeek } = await getOrderCountByType({ ...salesParam, 'DepartmentList': '1', 'WebCode': 'All', OrderType: 'LineClass' }); + const { ordercount1: exceptCHSalesDataWeek } = await getOrderCountByType({ ...salesParam, 'DepartmentList': '28,33', 'WebCode': 'All', OrderType: 'Product' }); + + const yearStart = moment().startOf("year").format(DATE_FORMAT); + const yearEnd = moment().endOf("year").format(DATE_FORMAT); + /** 截至今年 - 成交 */ + const { ordercountTotal1: CHDataYear } = await getOrderCountByType({ ...salesParam, Date1: yearStart,Date2:yearEnd, 'DepartmentList': '1', 'WebCode': 'All', OrderType: 'LineClass' }); + const { ordercount1: ColLineClassDataYear } = await getOrderCountByType({ ...salesParam, Date1: yearStart,Date2:yearEnd, 'DepartmentList': '28,33', WebCode: 'All', OrderType: 'Product' }); + /** 截至今年 - 走团 */ + const { ordercountTotal1: CHStartDataYear } = await getOrderCountByType({ ...salesParam, Date1: yearStart,Date2:yearEnd, DepartmentList: '1', 'WebCode': 'All', OrderType: 'LineClass', DateType: 'startDate' }); + const { ordercount1: GHStartDataYear } = await getOrderCountByType({ ...salesParam, Date1: yearStart,Date2:yearEnd, DepartmentList: '28,33', WebCode: 'All', OrderType: 'Product', DateType: 'startDate' }); + + const rows = [ + { + key: 'ch', + label: '中国', + YJLY: price_to_number(CHSalesDataWeek.YJLY), + CJCount: (CHSalesDataWeek.CJCount), + rowYear: { YJLY: price_to_number(CHDataYear.YJLY), CJCount: CHDataYear.CJCount, StartProfit: price_to_number(CHStartDataYear.YJLY) }, + }, + { key: 'ja', label: '日本+', ...dataSales('ja', exceptCHSalesDataWeek, ColLineClassDataYear) }, + { key: 'se', label: '东南亚+', ...dataSales('se', exceptCHSalesDataWeek, ColLineClassDataYear) }, + { key: 'in', label: '印度+', ...dataSales('in', exceptCHSalesDataWeek, ColLineClassDataYear) }, + { key: 'other', label: '其他GH', ...dataSalesGHOther(exceptCHSalesDataWeek, ColLineClassDataYear) }, + ]; + const columnsSum = ['CJCount', 'YJLY'].reduce((r, col) => ({ ...r, [col]: rows.reduce((rr, row) => rr + row[col], 0) }), {}); + const allYearData = rows.map(row => row.rowYear); + const rowYear = ['CJCount', 'YJLY'].reduce((r, col) => ({ ...r, [col]: allYearData.reduce((rr, row) => rr + row[col], 0) }), {}); + rows.push({ key: 'columnSum', label: '合计', ...columnsSum, rowYear }); + // console.log(rows, rowYear); + runInAction(() => { + this.GHSalesTableData = rows; + this.GHSalesLoading = false; + }); + }; + + + GHServiceTableData = []; + GHServiceLoading = false; + dataGHService = async (param) => { + this.GHServiceLoading = true; + const serviceParam = { ...param, DateType: 'startDate' }; + const { total1: CHDataWeek } = await getAgentGroupInfoALL({ ...serviceParam, 'DepartmentList': '1', }); + const yearStart = moment().startOf("year").format(DATE_FORMAT); + const { total1: CHDataYear } = await getAgentGroupInfoALL({ ...serviceParam, Date1: yearStart, 'DepartmentList': '1', }); + + // const { total1: yearData } = await getAgentGroupInfoALL({ ...serviceParam, 'DepartmentList': '28,33', Country: 'foreign' }); + + const rows = [ + { key: 'ch', label: '中国', ...pick(CHDataWeek, ['GroupCount', 'GoodCount']), rowYear: { GroupCount: CHDataYear.GroupCount, GoodCount: CHDataYear.GoodCount } }, + // { key: 'ja', label: '日本+', ...dataJA(exceptCHData, exceptCHDataYear) }, + // { key: 'se', label: '东南亚+', ...dataSE(exceptCHData, exceptCHDataYear) }, + // { key: 'in', label: '印度+', ...dataIN(exceptCHData, exceptCHDataYear) }, + // { key: 'other', label: '其他GH', ...dataGHOther(exceptCHData, exceptCHDataYear) }, + ]; + // console.log(rows); + runInAction(() => { + this.GHServiceTableData = rows; + this.GHServiceLoading = false; }); }; } diff --git a/src/views/Meeting2024-GH.jsx b/src/views/Meeting2024-GH.jsx index fe1d811..163d1cc 100644 --- a/src/views/Meeting2024-GH.jsx +++ b/src/views/Meeting2024-GH.jsx @@ -4,7 +4,11 @@ import { stores_Context } from '../config'; import { Table, Row, Col, Divider } from 'antd'; import SearchForm from '../components/search/SearchForm'; import { TableExportBtn } from './../components/Data'; +import { fixTo2Decimals } from './../utils/commons'; +const numberConvert10K = (number, scale = 10) => { + return fixTo2Decimals(number / (1000 * scale)) + ''; +}; // 注意TdCell要提到DataTable作用域外声明 const TdCell = (tdprops) => { // onMouseEnter, onMouseLeave在数据量多的时候,会严重阻塞表格单元格渲染,严重影响性能 @@ -17,9 +21,9 @@ export default observer((props) => { const { formValues, formValuesToSub, siderBroken } = searchFormStore; const dataRefresh = async (obj) => { - await MeetingDataStore.dataGH({ - ...(obj || formValuesToSub), - }); + // MeetingDataStore.dataGHOrder({ ...(obj || formValuesToSub) }); + MeetingDataStore.dataGHSales({ ...(obj || formValuesToSub) }); + // MeetingDataStore.dataGHService({ ...(obj || formValuesToSub) }); }; const targetTableProps = { @@ -27,8 +31,9 @@ export default observer((props) => { // sticky: true, scroll: { x: 1000, y: 400 }, pagination: false, - columns: [ - { key: 'label', title: '', dataIndex: 'label' }, + components: { body: { cell: TdCell } }, + orderColumns: [ + { key: 'label', title: '', dataIndex: 'label', width: 150, }, { key: 'LineClass_Origin', title: '网站', dataIndex: 'LineClass_Origin' }, { key: 'LineClass_PPC', title: 'PPC', dataIndex: 'LineClass_PPC' }, { key: 'toB', title: 'To B', dataIndex: 'toB' }, @@ -38,6 +43,21 @@ export default observer((props) => { // { key: 'groupsLabel2', title: '年订单目标', dataIndex: 'groupsLabel2' }, // { key: 'groupsLabel2', title: '进度', dataIndex: 'groupsLabel2' }, ], + salesColumns: [ + { key: 'label', title: '', dataIndex: 'label', width: 150, }, + { key: 'CJCount', title: '周成交个数', dataIndex: 'CJCount' }, + { key: 'YJLY', title: '周成交毛利(万)', dataIndex: 'YJLY', render: (text) => numberConvert10K(text) }, + { key: 'CJCount1', title: '年成交个数', dataIndex: ['rowYear', 'CJCount'] }, + { key: 'YJLY1', title: '年成交毛利(万)', dataIndex: ['rowYear', 'YJLY'], render: (text) => numberConvert10K(text) }, + { key: 'YJLY2', title: '年走团毛利(万)', dataIndex: ['rowYear', 'StartProfit'], render: (text) => numberConvert10K(text) }, + ], + serviceColumns: [ + { key: 'label', title: '', dataIndex: 'label', width: 150, }, + { key: 'GroupCount', title: '周走团个数', dataIndex: 'GroupCount' }, + { key: 'GoodCount', title: '周好评个数', dataIndex: 'GoodCount' }, + { key: 'GroupCount1', title: '年走团个数', dataIndex: ['rowYear', 'GroupCount'] }, + { key: 'GoodCount2', title: '年好评个数', dataIndex: ['rowYear', 'GoodCount'] }, + ], }; return ( @@ -51,7 +71,7 @@ export default observer((props) => { ...MeetingDataStore.searchValues, // ...searchInitial, }, - shows: ['DateType', 'IncludeTickets', 'dates'], // 'country' + shows: ['IncludeTickets', 'dates'], // 'country' fieldProps: { dates: { hide_vs: true }, }, @@ -65,10 +85,23 @@ export default observer((props) => { - 2024-GH - + 2024-GH: 市场 + + + + + + 2024-GH: 顾问成交 + -
+
+ + + 2024-GH: 客服 + + +
+ ); });