perf: 订单数据: 时间轴切换

feature/2.0-sales-trade
Lei OT 2 years ago
parent f0b3fd5e2a
commit 06812ffeef

@ -6,6 +6,7 @@ import * as comm from "../utils/commons";
import moment from "moment"; import moment from "moment";
import { NavLink } from "react-router-dom"; import { NavLink } from "react-router-dom";
import { groupsMappedByCode } from './../libs/ht'; import { groupsMappedByCode } from './../libs/ht';
import { resultDataCb } from '../components/DateGroupRadio/date';
class OrdersStore { class OrdersStore {
constructor(rootStore) { constructor(rootStore) {
@ -23,6 +24,7 @@ class OrdersStore {
// diff_count_day = 0; //开始日期和结束日期的间隔,用于计算平均数 // diff_count_day = 0; //开始日期和结束日期的间隔,用于计算平均数
active_tab_key = "Form"; // 当前切换的标签页 active_tab_key = "Form"; // 当前切换的标签页
active_tab_key_sub = "detail"; // 当前切换的子维度标签页 active_tab_key_sub = "detail"; // 当前切换的子维度标签页
orderCountDataRaw = [];
orderCountData = []; // 订单统计数据源 orderCountData = []; // 订单统计数据源
orderCountData_type = []; // 子维度订单统计 orderCountData_type = []; // 子维度订单统计
orderCountData_Form = []; // 表单类型统计数据源 orderCountData_Form = []; // 表单类型统计数据源
@ -30,6 +32,11 @@ class OrdersStore {
diff_days1 = 0; // 日期相差天数,用于计算日平均值 diff_days1 = 0; // 日期相差天数,用于计算日平均值
diff_days2 = 0; // 日期相差天数,比较数据时使用 diff_days2 = 0; // 日期相差天数,比较数据时使用
lineChartXGroup = ''; // x轴: 按 日/月/年
avgLine1 = 0;
orderCountDataMapper = { 'data1': 'ordercount1', data2: 'ordercount2' };
orderCountDataFieldMapper ={ 'dateKey': 'ApplyDate', 'valueKey': 'orderCount', 'seriesKey': 'WebCode', _f: 'sum' };
// 选择事业部 // 选择事业部
group_handleChange(value) { group_handleChange(value) {
this.groups = value; this.groups = value;
@ -40,7 +47,7 @@ class OrdersStore {
const date_picker_store = this.rootStore.date_picker_store; const date_picker_store = this.rootStore.date_picker_store;
const _start_date = moment(date_picker_store.start_date.format(config.DATE_FORMAT)); const _start_date = moment(date_picker_store.start_date.format(config.DATE_FORMAT));
const _end_date = moment(date_picker_store.end_date.format(config.DATE_FORMAT)); const _end_date = moment(date_picker_store.end_date.format(config.DATE_FORMAT));
return _end_date.diff(_start_date, "days") + 1; return _end_date.diff(_start_date, `${this.lineChartXGroup}s`) + 1;
} }
// 下单日期、确认日期、出发日期 // 下单日期、确认日期、出发日期
@ -103,6 +110,31 @@ class OrdersStore {
return comm.set_array_index(result); return comm.set_array_index(result);
} }
/**
* 更新值: orderCountData
* @author LYT
* @returns void
*/
onChangeDateGroup = (value, data, avg1) => {
this.lineChartXGroup = value;
const groupByDate = data.reduce((r, v) => {
(r[v.ApplyDate] || (r[v.ApplyDate] = [])).push(v);
return r;
}, {});
this.orderCountData = Object.keys(groupByDate)
.reduce((r, _d) => {
const summaryVal = groupByDate[_d].reduce((rows, row) => rows + row.orderCount, 0);
r.push({ ...groupByDate[_d][0], orderCount: summaryVal });
return r;
}, [])
.map((row) => ({ xField: row.ApplyDate, yField: row.orderCount, seriesField: row.groups }));
this.avgLine1 = avg1;
};
parseOrderCount = (orderCountData, dateGroup) => {
resultDataCb(orderCountData, dateGroup, this.orderCountDataMapper, this.orderCountDataFieldMapper, this.onChangeDateGroup);
};
// 网站订单数量,根据类型 // 网站订单数量,根据类型
getOrderCount_type(ordertype, ordertype_sub) { getOrderCount_type(ordertype, ordertype_sub) {
this.loading = true; this.loading = true;
@ -143,7 +175,9 @@ class OrdersStore {
.then(response => response.json()) .then(response => response.json())
.then(json => { .then(json => {
runInAction(() => { runInAction(() => {
this.orderCountData = this.format_data_source(json, date_picker_store.start_date, date_picker_store.start_date_cp); this.orderCountDataRaw = json;
// 第一次得到数据
this.parseOrderCount(json, 'day');
this.loading = false; this.loading = false;
}); });
}) })

@ -1,5 +1,5 @@
import React, { Component } from "react"; import React, { Component } from "react";
import { Row, Col, Button, Tabs, Table, Divider, Select } from "antd"; import { Row, Col, Button, Tabs, Table, Divider, Select, Radio } from "antd";
import { ContainerOutlined, CarryOutOutlined, BlockOutlined, SmileOutlined, TagsOutlined, GlobalOutlined, SearchOutlined, FullscreenOutlined, DingtalkOutlined } from "@ant-design/icons"; import { ContainerOutlined, CarryOutOutlined, BlockOutlined, SmileOutlined, TagsOutlined, GlobalOutlined, SearchOutlined, FullscreenOutlined, DingtalkOutlined } from "@ant-design/icons";
import { stores_Context } from "../config"; import { stores_Context } from "../config";
import { Line, Pie } from "@ant-design/charts"; import { Line, Pie } from "@ant-design/charts";
@ -12,7 +12,7 @@ import * as config from "../config";
import { NavLink } from "react-router-dom"; import { NavLink } from "react-router-dom";
import * as comm from "../utils/commons"; import * as comm from "../utils/commons";
import { utils, writeFileXLSX } from "xlsx"; import { utils, writeFileXLSX } from "xlsx";
import DateGroupRadio from '../components/DateGroupRadio';
class Orders extends Component { class Orders extends Component {
static contextType = stores_Context; static contextType = stores_Context;
@ -110,7 +110,7 @@ class Orders extends Component {
has_same_type = false; has_same_type = false;
// 12 // 12
for (const item2 of data.ordercount2) { for (const item2 of data.ordercount2) {
if (item.OrderType == item2.OrderType) { if (item.OrderType === item2.OrderType) {
has_same_type = true; has_same_type = true;
result.dataSource.push({ result.dataSource.push({
key: item.key, key: item.key,
@ -126,7 +126,7 @@ class Orders extends Component {
} }
} }
// 12 // 12
if (has_same_type == false) { if (has_same_type === false) {
result.dataSource.push({ result.dataSource.push({
key: item.key, key: item.key,
OrderType: item.OrderType, OrderType: item.OrderType,
@ -144,11 +144,11 @@ class Orders extends Component {
for (const item2 of data.ordercount2) { for (const item2 of data.ordercount2) {
has_same_type = false; has_same_type = false;
for (const item of data.ordercount1) { for (const item of data.ordercount1) {
if (item.OrderType == item2.OrderType) { if (item.OrderType === item2.OrderType) {
has_same_type = true; has_same_type = true;
} }
} }
if (has_same_type == false) { if (has_same_type === false) {
result.dataSource.push({ result.dataSource.push({
key: item2.key, key: item2.key,
OrderType: item2.OrderType, OrderType: item2.OrderType,
@ -222,7 +222,7 @@ class Orders extends Component {
const { orders_store } = this.context; const { orders_store } = this.context;
const table_data = orders_store.orderCountData_Form ? this.format_data(orders_store.orderCountData_Form) : []; const table_data = orders_store.orderCountData_Form ? this.format_data(orders_store.orderCountData_Form) : [];
const data_source = orders_store.orderCountData ? orders_store.orderCountData : []; const data_source = orders_store.orderCountData ? orders_store.orderCountData : [];
const avg_line_y = data_source.length ? Math.round(data_source.reduce((a, b) => a + b.yField, 0) / orders_store.diff_count_day) : 0; // 线 const avg_line_y = Math.round(orders_store.avgLine1);
const pie_data = comm.empty(orders_store.orderCountData_Form) ? [] : orders_store.orderCountData_Form.ordercount1; // const pie_data = comm.empty(orders_store.orderCountData_Form) ? [] : orders_store.orderCountData_Form.ordercount1; //
const pie_data2 = comm.empty(orders_store.orderCountData_Form) ? [] : orders_store.orderCountData_Form.ordercount2; const pie_data2 = comm.empty(orders_store.orderCountData_Form) ? [] : orders_store.orderCountData_Form.ordercount2;
@ -232,9 +232,9 @@ class Orders extends Component {
xField: "xField", xField: "xField",
yField: "yField", yField: "yField",
seriesField: "seriesField", seriesField: "seriesField",
xAxis: { // xAxis: {
type: "timeCat", // type: "timeCat",
}, // },
point: { point: {
size: 4, size: 4,
shape: "cicle", shape: "cicle",
@ -270,12 +270,21 @@ class Orders extends Component {
}, },
}, },
tooltip: { tooltip: {
// customContent: (title, items) => { customItems: (originalItems) => {
// const data = items[0]?.data || {}; // process originalItems,
// return `<div>${title}</div><div>${data.seriesField} ${data.yField}</div>`; return originalItems.map(ele => ({...ele, name: ele.data?.seriesKey || ele.data?.xField}));
// } },
title: (title, datum) => { title: (title, datum) => {
return title + " " + comm.getWeek(datum.xField); // let ret = title;
switch (orders_store.lineChartXGroup) {
case 'day':
ret = `${title} ${comm.getWeek(datum.xField)}`; //
break;
default:
break;
}
return ret;
}, },
}, },
smooth: true, smooth: true,
@ -346,7 +355,17 @@ class Orders extends Component {
</Row> </Row>
</Col> </Col>
</Row> </Row>
<Row gutter={[16, { sm: 16, lg: 32 }]}> <Row gutter={[16, { sm: 16, lg: 32 }]} >
<Col span={24} style={{textAlign: 'right'}}>
<DateGroupRadio
visible={data_source.length!==0}
dataRaw={orders_store.orderCountDataRaw}
onChange={orders_store.onChangeDateGroup}
value={orders_store.lineChartXGroup}
dataMapper={orders_store.orderCountDataMapper}
fieldMapper={orders_store.orderCountDataFieldMapper}
/>
</Col>
<Col span={24}> <Col span={24}>
<Line {...config} /> <Line {...config} />
</Col> </Col>

Loading…
Cancel
Save