Compare commits

...

10 Commits

4
package-lock.json generated

@ -1,12 +1,12 @@
{
"name": "haina-dashboard",
"version": "2.14.4",
"version": "2.14.7",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "haina-dashboard",
"version": "2.14.4",
"version": "2.14.7",
"dependencies": {
"@ant-design/charts": "^1.4.2",
"@ant-design/pro-components": "^2.6.16",

@ -1,6 +1,6 @@
{
"name": "haina-dashboard",
"version": "2.14.4",
"version": "2.14.7",
"private": true,
"dependencies": {
"@ant-design/charts": "^1.4.2",

@ -38,9 +38,9 @@ const Customer_care_regular = () => {
{
title: '订单状态',
width: '4rem',
dataIndex: 'OrderState1',
key: 'OrderState1',
render: (text, record) => record.OrderState === 1 ? '成行' : '未成行',
dataIndex: 'orderstate_name',
key: 'orderstate_name',
// render: (text, record) => record.OrderState === 1 ? '' : '',
sorter: (a, b) => b.OrderState - a.OrderState,
},
{
@ -314,32 +314,32 @@ const Customer_care_regular = () => {
</>
),
},
// {
// title: '',
// dataIndex: 'OrderRate',
// key: 'OrderRate',
// render: (text, record) => (
// <RenderVSDataCell
// showDiffData={!isEmpty(searchValuesToSub.DateDiff1)}
// data1={fixTo2Decimals(record.OrderRate * 100)}
// data2={fixTo2Decimals(record.diff?.OrderRate * 100)}
// dataSuffix="%"
// />
// ),
// },
{
title: '订单数占比(市场)',
dataIndex: 'OrderRate2',
key: 'OrderRate2',
title: '订单数占比',
dataIndex: 'OrderRate',
key: 'OrderRate',
render: (text, record) => (
<RenderVSDataCell
showDiffData={!isEmpty(searchValuesToSub.DateDiff1)}
data1={fixTo2Decimals(record.OrderRate2 * 100)}
data2={fixTo2Decimals(record.diff?.OrderRate2 * 100)}
data1={fixTo2Decimals(record.OrderRate * 100)}
data2={fixTo2Decimals(record.diff?.OrderRate * 100)}
dataSuffix="%"
/>
),
},
// {
// title: '()',
// dataIndex: 'OrderRate2',
// key: 'OrderRate2',
// render: (text, record) => (
// <RenderVSDataCell
// showDiffData={!isEmpty(searchValuesToSub.DateDiff1)}
// data1={fixTo2Decimals(record.OrderRate2 * 100)}
// data2={fixTo2Decimals(record.diff?.OrderRate2 * 100)}
// dataSuffix="%"
// />
// ),
// },
{
title: '成行数',
dataIndex: 'SUCOrderNum',
@ -365,32 +365,32 @@ const Customer_care_regular = () => {
key: 'ML',
render: (text, record) => <RenderVSDataCell showDiffData={!isEmpty(searchValuesToSub.DateDiff1)} data1={record.ML} data2={record.diff?.ML} />,
},
// {
// title: '',
// dataIndex: 'OrderMLRate',
// key: 'OrderMLRate',
// render: (text, record) => (
// <RenderVSDataCell
// showDiffData={!isEmpty(searchValuesToSub.DateDiff1)}
// data1={fixTo2Decimals(record.OrderMLRate * 100)}
// data2={fixTo2Decimals(record.diff?.OrderMLRate * 100)}
// dataSuffix="%"
// />
// ),
// },
{
title: '毛利占比(市场)',
dataIndex: 'OrderMLRate2',
key: 'OrderMLRate2',
title: '毛利占比',
dataIndex: 'OrderMLRate',
key: 'OrderMLRate',
render: (text, record) => (
<RenderVSDataCell
showDiffData={!isEmpty(searchValuesToSub.DateDiff1)}
data1={fixTo2Decimals(record.OrderMLRate2 * 100)}
data2={fixTo2Decimals(record.diff?.OrderMLRate2 * 100)}
data1={fixTo2Decimals(record.OrderMLRate * 100)}
data2={fixTo2Decimals(record.diff?.OrderMLRate * 100)}
dataSuffix="%"
/>
),
},
// {
// title: '()',
// dataIndex: 'OrderMLRate2',
// key: 'OrderMLRate2',
// render: (text, record) => (
// <RenderVSDataCell
// showDiffData={!isEmpty(searchValuesToSub.DateDiff1)}
// data1={fixTo2Decimals(record.OrderMLRate2 * 100)}
// data2={fixTo2Decimals(record.diff?.OrderMLRate2 * 100)}
// dataSuffix="%"
// />
// ),
// },
{
title: '人数(含成人+儿童)',
dataIndex: 'PersonNum',

@ -6,4 +6,4 @@ export const stores_Context = React.createContext();
export const DATE_FORMAT = "YYYY-MM-DD";
export const SMALL_DATETIME_FORMAT = 'YYYY-MM-DD 23:59:00';
export const DATETIME_FORMAT = 'YYYY-MM-DD 23:59:59';
export const HT_HOST = process.env.NODE_ENV === "production" ? "https://p9axztuwd7x8a7.mycht.cn" : "http://202.103.68.144:890";
export const HT_HOST = process.env.NODE_ENV === "production" ? "https://p9axztuwd7x8a7.mycht.cn" : "http://202.103.68.144:889";

@ -75,6 +75,7 @@ export const sites = [
{ value: '187', key: '187', label: 'HTravel', code: 'HTravel' },
{ value: '186', key: '186', label: 'JH', code: 'JH' },
{ value: '163', key: '163', label: 'GH', code: 'GH' },
{ value: '188', key: '188', label: 'Thailand', code: 'Thailand' },
{ value: '184', key: '184', label: 'GH站外渠道 (中国)', code: 'ZWQD' },
{ value: '185', key: '185', label: 'GH站外渠道 (海外)', code: 'GH_ZWQD_HW' },
{ value: '28', key: '28', label: '客运中国', code: 'GHKYZG' },

@ -2,7 +2,7 @@ import {makeAutoObservable, runInAction, toJS } from "mobx";
import { fetchJSON } from '@haina/utils-request';
import * as config from "../config";
import { groupsMappedByKey, sitesMappedByCode, pivotBy } from './../libs/ht';
import { sortBy, formatPercent, groupBy, isEmpty, uniqWith, formatPercentToFloat, fixTo2Decimals } from "@haina/utils-commons";
import { sortBy, formatPercent, groupBy, isEmpty, uniqWith, formatPercentToFloat, fixTo2Decimals, unique } from "@haina/utils-commons";
import { show_vs_tag, } from "./../utils/commons";
import moment from 'moment';
@ -14,6 +14,29 @@ const getDetailData = async (param) => {
return json.errcode === 0 ? json.result : [];
};
const initialSummaryRow = {
SumOrder: 0,
ResumeOrder: 0,
ResumeConfirmOrder: 0,
SumPersonNum: 0,
ConfirmPersonNum: 0,
ConfirmOrder: 0,
transactions: 0,
SumML: 0,
SumML_txt: '',
quotePrice: 0,
tourdays: 0,
applyDays: 0,
confirmDays: 0,
SingleML: 0,
OrderValue: 0,
PPPrice: 0,
AvgPPPrice: 0,
confirmTourdays: 0,
PPPriceRange: '',
unitPPPriceRange: '',
};
const calcSummaryRow = (data1, data2) => {
const summaryFields = ['ConfirmOrder', 'SumOrder', 'SumML', 'transactions', 'SumPersonNum', 'ConfirmPersonNum', 'ConfirmOrderKPIvalue', 'OrderKPIvalue', 'MLKPIvalue'];
@ -33,6 +56,65 @@ const calcSummaryRow = (data1, data2) => {
xSummary.vsData = xSummary2;
return xSummary;
};
const calcSummaryUniqueRow = (_data1, _data2, rawData = [[], []]) => {
// console.log('calcSummaryRow', _data1, _data2, rawData);
const uniqueKeysData1 = unique(_data1.reduce((a, r) => a.concat(r.key.split('_').reduce((a1, r1) => a1.concat(r1.split('@')[0]), [])), [])).map(x => Number(x));
const uniqueKeysData2 = unique(_data2.reduce((a, r) => a.concat(r.key.split('_').reduce((a1, r1) => a1.concat(r1.split('@')[0]), [])), [])).map(x => Number(x));
// console.log(uniqueKeysData1, uniqueKeysData2);
const data1 = rawData[0].filterHasOld.filter(row => uniqueKeysData1.includes((row.key)));
const data2 = rawData[1].filterHasOld.filter(row => uniqueKeysData2.includes((row.key)));
// console.log(data1, data2);
const xSummary = data1.reduce((r, v) => {
r.SumOrder += 1;
r.SumPersonNum += v.personNum;
r.ConfirmPersonNum += Number(v.orderState) === 1 ? v.personNum : 0;
r.ConfirmOrder += Number(v.orderState) === 1 ? 1 : 0;
r.ResumeOrder += v.hasOld === 1 ? 1 : 0;
r.ResumeConfirmOrder += Number(v.orderState) === 1 && v.hasOld === 1 ? 1 : 0;
r.transactions += v.transactions;
r.SumML += Number(v.orderState) === 1 ? v.ML : 0;
r.quotePrice += Number(v.orderState) === 1 ? v.quotePrice : 0;
r.tourdays += v.tourdays;
r.applyDays += v.applyDays;
r.confirmDays += v.confirmDays;
// r.PPPrice += Number(v.orderState) === 1 ? v.PPPrice : 0;
r.confirmTourdays += Number(v.orderState) === 1 ? v.tourdays : 0;
return r;
}, structuredClone(initialSummaryRow));
const xSummary2 = data2.reduce((r, v) => {
r.SumOrder += 1;
r.SumPersonNum += v.personNum;
r.ConfirmPersonNum += Number(v.orderState) === 1 ? v.personNum : 0;
r.ConfirmOrder += Number(v.orderState) === 1 ? 1 : 0;
r.ResumeOrder += v.hasOld === 1 ? 1 : 0;
r.ResumeConfirmOrder += Number(v.orderState) === 1 && v.hasOld === 1 ? 1 : 0;
r.transactions += v.transactions;
r.SumML += Number(v.orderState) === 1 ? v.ML : 0;
r.quotePrice += Number(v.orderState) === 1 ? v.quotePrice : 0;
r.tourdays += v.tourdays;
r.applyDays += v.applyDays;
r.confirmDays += v.confirmDays;
// r.PPPrice += Number(v.orderState) === 1 ? v.PPPrice : 0;
r.confirmTourdays += Number(v.orderState) === 1 ? v.tourdays : 0;
return r;
}, structuredClone(initialSummaryRow));
xSummary.ConfirmRates = xSummary.SumOrder ? fixTo2Decimals((xSummary.ConfirmOrder / xSummary.SumOrder) * 100) : 0;
xSummary.ConfirmRates_txt = xSummary.ConfirmRates; // + '%';
xSummary.confirmTourdays = '-';
xSummary.SingleML = '-';
xSummary._data = data1;
xSummary2.ConfirmRates = xSummary2.SumOrder ? fixTo2Decimals((xSummary2.ConfirmOrder / xSummary2.SumOrder) * 100) : 0;
xSummary2.ConfirmRates_txt = xSummary2.ConfirmRates; // + '%';
xSummary2.confirmTourdays = '-';
xSummary2.SingleML = '-';
xSummary2._data = data2;
xSummary.vsData = xSummary2;
return xSummary;
};
class CustomerStore {
@ -634,7 +716,50 @@ class CustomerStore {
eurusdSummary.key = '欧美4国';
eurusdSummary.country = '欧美4国';
this.sales_regular_data.countrySummary = [aseanSummary, eurusdSummary];
// 西班牙语国家/地区
const esLgc = ['阿根廷','玻利维亚','智利','哥伦比亚','哥斯达黎加','古巴','多米尼加共和国','厄瓜多尔','萨尔瓦多','赤道几内亚','危地马拉','洪都拉斯','墨西哥','尼加拉瓜','巴拿马','巴拉圭','秘鲁','波多黎各','西班牙','乌拉圭','委内瑞拉'];
const [esLgc1, esLgc2] = [
pivot1.filter((ele) => esLgc.includes(ele.country)),
pivot2.filter((ele) => esLgc.includes(ele.country)),
];
const esLgcSummary = calcSummaryRow(esLgc1, esLgc2);
esLgcSummary.key = '西班牙语国家/地区';
esLgcSummary.country = '西班牙语国家/地区';
// 意大利语国家/地区
const itLgc = ['意大利','圣马力诺','梵蒂冈','瑞士',];
const [itLgc1, itLgc2] = [
pivot1.filter((ele) => itLgc.includes(ele.country)),
pivot2.filter((ele) => itLgc.includes(ele.country)),
];
const itLgcSummary = calcSummaryRow(itLgc1, itLgc2);
itLgcSummary.key = '意大利语国家/地区';
itLgcSummary.country = '意大利语国家/地区';
// 德语国家/地区
const deLgc = ['德国','奥地利','瑞士','列支敦士登','卢森堡','比利时',];
const [deLgc1, deLgc2] = [
pivot1.filter((ele) => deLgc.includes(ele.country)),
pivot2.filter((ele) => deLgc.includes(ele.country)),
];
const deLgcSummary = calcSummaryRow(deLgc1, deLgc2);
deLgcSummary.key = '德语国家/地区';
deLgcSummary.country = '德语国家/地区';
// 葡萄牙语国家
const ptLgc = ['葡萄牙','巴西','安哥拉','莫桑比克','几内亚比绍','佛得角','圣多美和普林西比','东帝汶',];
const [ptLgc1, ptLgc2] = [
pivot1.filter((ele) => ptLgc.includes(ele.country)),
pivot2.filter((ele) => ptLgc.includes(ele.country)),
];
const ptLgcSummary = calcSummaryRow(ptLgc1, ptLgc2);
ptLgcSummary.key = '葡萄牙语国家/地区';
ptLgcSummary.country = '葡萄牙语国家/地区';
this.sales_regular_data.countrySummary = [
aseanSummary, eurusdSummary,
esLgcSummary, itLgcSummary, deLgcSummary, ptLgcSummary,
];
}
if (pivotRow === 'destinations') {
const city1 = ['昆明','大理','丽江','中甸','德钦','西双版纳','普洱','泸沽湖','腾冲'];
@ -642,7 +767,7 @@ class CustomerStore {
pivot1.filter((ele) => city1.includes(ele.destinations)),
pivot2.filter((ele) => city1.includes(ele.destinations)),
];
const city1Summary = calcSummaryRow(city11, city12);
const city1Summary = calcSummaryUniqueRow(city11, city12, toJS(this.sales_regular_data.rawDataArr));
city1Summary.key = '云南';
city1Summary.destinations = '云南';
@ -651,7 +776,7 @@ class CustomerStore {
pivot1.filter((ele) => city2.includes(ele.destinations)),
pivot2.filter((ele) => city2.includes(ele.destinations)),
];
const city2Summary = calcSummaryRow(city21, city22);
const city2Summary = calcSummaryUniqueRow(city21, city22, toJS(this.sales_regular_data.rawDataArr));
city2Summary.key = '华东';
city2Summary.destinations = '华东';
@ -660,7 +785,7 @@ class CustomerStore {
pivot1.filter((ele) => city3.includes(ele.destinations)),
pivot2.filter((ele) => city3.includes(ele.destinations)),
];
const city3Summary = calcSummaryRow(city31, city32);
const city3Summary = calcSummaryUniqueRow(city31, city32, toJS(this.sales_regular_data.rawDataArr));
city3Summary.key = '新疆';
city3Summary.destinations = '新疆';
const city4 = ['拉萨','江孜','林芝','鲁朗','巴松措','然乌','波密','日喀则','定日','泽当','塔钦'];
@ -668,7 +793,7 @@ class CustomerStore {
pivot1.filter((ele) => city4.includes(ele.destinations)),
pivot2.filter((ele) => city4.includes(ele.destinations)),
];
const city4Summary = calcSummaryRow(city41, city42);
const city4Summary = calcSummaryUniqueRow(city41, city42, toJS(this.sales_regular_data.rawDataArr));
city4Summary.key = '西藏';
city4Summary.destinations = '西藏';
@ -677,7 +802,7 @@ class CustomerStore {
pivot1.filter((ele) => city5.includes(ele.destinations)),
pivot2.filter((ele) => city5.includes(ele.destinations)),
];
const city5Summary = calcSummaryRow(city51, city52);
const city5Summary = calcSummaryUniqueRow(city51, city52, toJS(this.sales_regular_data.rawDataArr));
city5Summary.key = '贵州';
city5Summary.destinations = '贵州';

@ -71,9 +71,11 @@ class Orders extends Component {
</div> : null}
</span>
),
titleX: showDiff ? `${date_picker_store.start_date.format(config.DATE_FORMAT)}~${date_picker_store.end_date.format(config.DATE_FORMAT)} vs ${date_picker_store.start_date_cp.format(
config.DATE_FORMAT
)}~${date_picker_store.end_date_cp.format(config.DATE_FORMAT)}` : `${date_picker_store.start_date.format(config.DATE_FORMAT)}~${date_picker_store.end_date.format(config.DATE_FORMAT)}`,
titleX: showDiff ? `${
date_picker_store.start_date.format(config.DATE_FORMAT)}~${date_picker_store.end_date.format(config.DATE_FORMAT)
} vs ${
date_picker_store.start_date_cp.format(config.DATE_FORMAT)}~${date_picker_store.end_date_cp.format(config.DATE_FORMAT)
}` : `${date_picker_store.start_date.format(config.DATE_FORMAT)}~${date_picker_store.end_date.format(config.DATE_FORMAT)}`,
dataIndex: 'OrderType',
fixed: 'left',
render: (text, record) => <NavLink to={`/orders_sub/${orders_store.active_tab_key}/${record.OrderTypeSN}/${encodeURIComponent(record.OrderType)}`}>{text}</NavLink>,
@ -93,7 +95,7 @@ class Orders extends Component {
diffData={ordercountTotal1?.OrderCount_diff}
/>
),
titleX: [ordercountTotal1.OrderCount, ordercountTotal2.OrderCount].join(' vs '),
titleX: [ordercountTotal1.OrderCount, ordercountTotal2.OrderCount].filter(s => s).filter(s => s).join(' vs '),
dataIndex: 'OrderCount',
render: (text, r) => <RenderVSDataCell showDiffData={showDiff} data1={text} data2={r.diff?.OrderCount} diffPercent={r.OrderCount_vs} diffData={r.OrderCount_diff} />,
},
@ -112,7 +114,7 @@ class Orders extends Component {
diffData={ordercountTotal1?.CJCount_diff}
/>
),
titleX: [ordercountTotal1.CJCount, ordercountTotal2.CJCount].join(' vs '),
titleX: [ordercountTotal1.CJCount, ordercountTotal2.CJCount].filter(s => s).join(' vs '),
dataIndex: 'CJCount',
render: (text, r) => <RenderVSDataCell showDiffData={showDiff} data1={text} data2={r.diff?.CJCount} diffPercent={r.CJCount_vs} diffData={r.CJCount_diff} />,
},
@ -131,7 +133,7 @@ class Orders extends Component {
diffData={ordercountTotal1?.CJPersonNum_diff}
/>
),
titleX: [ordercountTotal1.CJPersonNum, ordercountTotal2.CJPersonNum].join(' vs '),
titleX: [ordercountTotal1.CJPersonNum, ordercountTotal2.CJPersonNum].filter(s => s).join(' vs '),
dataIndex: 'CJPersonNum',
render: (text, r) => <RenderVSDataCell showDiffData={showDiff} data1={text} data2={r.diff?.CJPersonNum} diffPercent={r.CJPersonNum_vs} diffData={r.CJPersonNum_diff} />,
},
@ -150,7 +152,7 @@ class Orders extends Component {
diffData={ordercountTotal1?.CJrate_diff}
/>
),
titleX: [ordercountTotal1.CJrate, ordercountTotal2.CJrate].join(' vs '),
titleX: [ordercountTotal1.CJrate, ordercountTotal2.CJrate].filter(s => s).join(' vs '),
dataIndex: 'CJrate',
render: (text, r) => <RenderVSDataCell showDiffData={showDiff} data1={text} data2={r.diff?.CJrate} diffPercent={r.CJrate_vs} diffData={r.CJrate_diff} />,
},
@ -169,7 +171,7 @@ class Orders extends Component {
diffData={ordercountTotal1?.YJLY_diff}
/>
),
titleX: [ordercountTotal1.YJLY, ordercountTotal2.YJLY].join(' vs '),
titleX: [ordercountTotal1.YJLY, ordercountTotal2.YJLY].filter(s => s).join(' vs '),
dataIndex: 'YJLY',
render: (text, r) => <RenderVSDataCell showDiffData={showDiff} data1={text} data2={r.diff?.YJLY} diffPercent={r.YJLY_vs} diffData={r.YJLY_diff} />,
},
@ -189,7 +191,7 @@ class Orders extends Component {
diffData={ordercountTotal1?.Ordervalue_diff}
/>
),
titleX: [ordercountTotal1.Ordervalue, ordercountTotal2.Ordervalue].join(' vs '),
titleX: [ordercountTotal1.Ordervalue, ordercountTotal2.Ordervalue].filter(s => s).join(' vs '),
dataIndex: 'Ordervalue',
render: (text, r) => <RenderVSDataCell showDiffData={showDiff} data1={text} data2={r.diff?.Ordervalue} diffPercent={r.Ordervalue_vs} diffData={r.Ordervalue_diff} />,
},

Loading…
Cancel
Save