feat: GH例会: 顾问成交; 客服; todo: 年数据用1.1-12.31; 顾问成交用总览/产品接口

feature/hotel-cruise
Lei OT 1 year ago
parent 512b4699ba
commit a7280a79b9

@ -1,7 +1,9 @@
import { makeAutoObservable, runInAction } from 'mobx'; import { makeAutoObservable, runInAction } from 'mobx';
import { fetchJSON } from '../utils/request'; 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 { 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); const json = await fetchJSON(url, paramBody);
return json.errcode === 0 ? json : {}; 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 = { const GHproductTypeListSetting = {
ja: ['日本', '东亚跨国'], ja: ['日本', '东亚跨国'],
se: ['东南亚跨国', '泰国', '越南', '印度尼西亚', '水灯节'], se: ['东南亚跨国', '泰国', '越南', '印度尼西亚', '水灯节'],
@ -89,6 +102,29 @@ const dataGHOther = (rawData, yearData) => {
return { ...rowItem(filterData), rowYear }; 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 { class MeetingData {
constructor(rootStore) { constructor(rootStore) {
this.rootStore = rootStore; this.rootStore = rootStore;
@ -104,22 +140,27 @@ class MeetingData {
} }
GHTableData = []; GHTableData = [];
GHLoading = false; GHTableLoading = false;
/**
dataGH = async (param) => { * 获取市场订单数据
*/
dataGHOrder = async (param) => {
// console.log('dataGH', 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 CHData = await getDetailData({ ...param, ...defaultParam, 'DepartmentList': '1', 'WebCode': 'All' });
const exceptCHData = await getDetailData({ ...param, 'DepartmentList': '28,33', '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 { ordercountTotal1: CHDataYear } = await getOrderCountByType({ ...param, ...defaultParam, Date1: yearStart, 'DepartmentList': '1', 'WebCode': 'All', OrderType: 'LineClass' });
const { ordercount1: exceptCHDataYear } = await getOrderCountByType({ ...param, Date1: '2024-01-01', 'DepartmentList': '28,33', 'WebCode': 'All', OrderType: 'Product' }); 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 { ordercount1: ColLineClassDataYear } = await getOrderCountByType({ ...param, ...defaultParam, Date1: yearStart, '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 { 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 { isOld1: isOld1Year } = rowItem(yearDetail);
const colYearRow = { const colYearRow = {
@ -145,10 +186,80 @@ class MeetingData {
); );
rows.push({ key: 'columnSum', label: '合计', ...columnsSum }); rows.push({ key: 'columnSum', label: '合计', ...columnsSum });
rows.push({ key: 'colYearRow', label: '截至', ...colYearRow }); rows.push({ key: 'colYearRow', label: '截至', ...colYearRow });
// console.log(rows);
runInAction(() => { runInAction(() => {
this.GHTableData = rows; 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;
}); });
}; };
} }

@ -4,7 +4,11 @@ import { stores_Context } from '../config';
import { Table, Row, Col, Divider } from 'antd'; import { Table, Row, Col, Divider } from 'antd';
import SearchForm from '../components/search/SearchForm'; import SearchForm from '../components/search/SearchForm';
import { TableExportBtn } from './../components/Data'; import { TableExportBtn } from './../components/Data';
import { fixTo2Decimals } from './../utils/commons';
const numberConvert10K = (number, scale = 10) => {
return fixTo2Decimals(number / (1000 * scale)) + '';
};
// TdCellDataTable // TdCellDataTable
const TdCell = (tdprops) => { const TdCell = (tdprops) => {
// onMouseEnter, onMouseLeave // onMouseEnter, onMouseLeave
@ -17,9 +21,9 @@ export default observer((props) => {
const { formValues, formValuesToSub, siderBroken } = searchFormStore; const { formValues, formValuesToSub, siderBroken } = searchFormStore;
const dataRefresh = async (obj) => { const dataRefresh = async (obj) => {
await MeetingDataStore.dataGH({ // MeetingDataStore.dataGHOrder({ ...(obj || formValuesToSub) });
...(obj || formValuesToSub), MeetingDataStore.dataGHSales({ ...(obj || formValuesToSub) });
}); // MeetingDataStore.dataGHService({ ...(obj || formValuesToSub) });
}; };
const targetTableProps = { const targetTableProps = {
@ -27,8 +31,9 @@ export default observer((props) => {
// sticky: true, // sticky: true,
scroll: { x: 1000, y: 400 }, scroll: { x: 1000, y: 400 },
pagination: false, pagination: false,
columns: [ components: { body: { cell: TdCell } },
{ key: 'label', title: '', dataIndex: 'label' }, orderColumns: [
{ key: 'label', title: '', dataIndex: 'label', width: 150, },
{ key: 'LineClass_Origin', title: '网站', dataIndex: 'LineClass_Origin' }, { key: 'LineClass_Origin', title: '网站', dataIndex: 'LineClass_Origin' },
{ key: 'LineClass_PPC', title: 'PPC', dataIndex: 'LineClass_PPC' }, { key: 'LineClass_PPC', title: 'PPC', dataIndex: 'LineClass_PPC' },
{ key: 'toB', title: 'To B', dataIndex: 'toB' }, { 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' },
// { 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 ( return (
@ -51,7 +71,7 @@ export default observer((props) => {
...MeetingDataStore.searchValues, ...MeetingDataStore.searchValues,
// ...searchInitial, // ...searchInitial,
}, },
shows: ['DateType', 'IncludeTickets', 'dates'], // 'country' shows: ['IncludeTickets', 'dates'], // 'country'
fieldProps: { fieldProps: {
dates: { hide_vs: true }, dates: { hide_vs: true },
}, },
@ -65,10 +85,23 @@ export default observer((props) => {
</Row> </Row>
<Divider orientation="right" plain> <Divider orientation="right" plain>
<span>2024-GH</span> <span>2024-GH: 市场</span>
<TableExportBtn label={formValuesToSub.Date1} {...{ columns: targetTableProps.columns, dataSource: MeetingDataStore.GHTableData }} /> <TableExportBtn label={formValuesToSub.Date1} {...{ columns: targetTableProps.orderColumns, dataSource: MeetingDataStore.GHTableData }} />
</Divider> </Divider>
<Table {...targetTableProps} dataSource={MeetingDataStore.GHTableData} components={{ body: { cell: TdCell } }} /> <Table {...targetTableProps} key={'GHTable'} dataSource={MeetingDataStore.GHTableData} columns={targetTableProps.orderColumns} loading={MeetingDataStore.GHTableLoading} />
<Divider orientation="right" plain>
<span>2024-GH: 顾问成交</span>
<TableExportBtn label={formValuesToSub.Date1} {...{ columns: targetTableProps.salesColumns, dataSource: MeetingDataStore.GHSalesTableData }} />
</Divider>
<Table {...targetTableProps} key={'GHSales'} dataSource={MeetingDataStore.GHSalesTableData} columns={targetTableProps.salesColumns} loading={MeetingDataStore.GHSalesLoading} />
<Divider orientation="right" plain>
<span>2024-GH: 客服</span>
<TableExportBtn label={formValuesToSub.Date1} {...{ columns: targetTableProps.serviceColumns, dataSource: MeetingDataStore.GHServiceTableData }} />
</Divider>
<Table {...targetTableProps} key={'GHService'} dataSource={MeetingDataStore.GHServiceTableData} columns={targetTableProps.serviceColumns} loading={MeetingDataStore.GHServiceLoading} />
</> </>
); );
}); });

Loading…
Cancel
Save