You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dashboard/src/stores/SaleStore.js

283 lines
10 KiB
JavaScript

import { makeAutoObservable, runInAction } from "mobx";
import moment from "moment";
import * as config from "../config";
import * as comm from "../utils/commons";
import { NavLink } from "react-router-dom";
//销售数据
class SaleStore {
constructor(rootStore) {
this.rootStore = rootStore;
makeAutoObservable(this);
}
loading = false;
loading_table = false;
active_tab_key = "All"; //当前选择的标签
group_select_mode = false;
date_type = "applyDate";
groups = ["1,2,28,7"];
ml_data = []; //毛利数据
type_data = []; //类型的数据
type_data_sub = []; //类型的子维度数据
date_title = "date_title"; //日期段,只用于显示,防止日期选择控件的变化导致页面刷新
//选择事业部
group_handleChange(value) {
this.groups = value;
}
//切换标签页
onChange_Tabs(active_key) {
this.active_tab_key = active_key;
//this.getOrderCountByType_sub(ordertype, ordertype_sub, this.active_tab_key_sub);
}
//下单日期或者出发日期
onChange_datetype(value) {
this.date_type = value;
}
//获取业绩信息
get_department_order_ml(date_moment) {
let result = [];
const date1_start = date_moment.start_date.format(config.DATE_FORMAT);
const date1_end = date_moment.end_date.format(config.DATE_FORMAT);
const date2_start = comm.empty(date_moment.start_date_cp) ? "" : date_moment.start_date_cp.format(config.DATE_FORMAT);
const date2_end = comm.empty(date_moment.end_date_cp) ? "" : date_moment.end_date_cp.format(config.DATE_FORMAT);
this.loading = true;
this.date_title = `${date1_start}~${date1_end}`;
let url = "/service-web/QueryData/GetDepartmentOrderML";
url += `?DepartmentList=${this.groups.toString()}&DateType=${this.date_type}`;
url += `&Date1=${date1_start}&Date2=${date1_end}%2023:59:59`;
if (date2_start && date2_end) {
url += `&OldDate1=${date2_start}&OldDate2=${date2_end}%2023:59:59`;
this.date_title += ` ${date2_start}~${date2_end}`;
}
fetch(config.HT_HOST + url)
.then((response) => response.json())
.then((json) => {
result.push(...json.result1);
if (!comm.empty(json.result2) && !comm.empty(date_moment.start_date_cp)) {
let diff_days = date_moment.start_date.diff(date_moment.start_date_cp, "days");
for (let item of json.result2) {
result.push({
COLI_Date: moment(item.COLI_Date).add(diff_days, "days").format(config.DATE_FORMAT),
COLI_YJLY: item.COLI_YJLY,
groups: item.groups,
key: item.key,
});
}
}
runInAction(() => {
this.ml_data = result;
this.loading = false;
});
})
.catch((error) => {
this.loading = false;
console.log("fetch data failed", error);
});
}
//按类型获取业绩
get_department_order_ml_by_type(date_moment) {
let result = { dataSource: [], columns: [] };
const date1_start = date_moment.start_date.format(config.DATE_FORMAT);
const date1_end = date_moment.end_date.format(config.DATE_FORMAT);
const date2_start = comm.empty(date_moment.start_date_cp) ? "" : date_moment.start_date_cp.format(config.DATE_FORMAT);
const date2_end = comm.empty(date_moment.end_date_cp) ? "" : date_moment.end_date_cp.format(config.DATE_FORMAT);
this.loading_table = true;
this.date_title = `${date1_start}~${date1_end}`;
let url = "/service-web/QueryData/GetDepartmentOrderMLByType";
url += `?DepartmentList=${this.groups.toString()}&DateType=${this.date_type}&OrderType=${this.active_tab_key}`;
url += `&Date1=${date1_start}&Date2=${date1_end}%2023:59:59`;
if (date2_start && date2_end) {
url += `&OldDate1=${date2_start}&OldDate2=${date2_end}%2023:59:59`;
this.date_title += ` ${date2_start}~${date2_end}`;
}
fetch(config.HT_HOST + url)
.then((response) => response.json())
.then((json) => {
if (!comm.empty(json.result2) && !comm.empty(date_moment.start_date_cp)) {
} else {
if (this.active_tab_key == "All") {
result.columns = [
{
title: "",
children: [
{
title: "",
dataIndex: "OPI_Name",
},
],
},
{
title: "毛利",
children: [{ title: json.result1.reduce((a, b) => a + comm.price_to_number(b.COLI_ML), 0), dataIndex: "COLI_ML" }],
sorter: (a, b) => comm.price_to_number(b.COLI_ML) - comm.price_to_number(a.COLI_ML),
},
{
title: "成行率",
children: [{ title: "", dataIndex: "COLI_CJrate" }],
sorter: (a, b) => parseInt(b.COLI_CJrate) - parseInt(a.COLI_CJrate),
},
{
title: "成团数",
children: [{ title: json.result1.reduce((a, b) => a + b.COLI_CJCount, 0), dataIndex: "COLI_CJCount" }],
sorter: (a, b) => b.COLI_CJCount - a.COLI_CJCount,
},
{
title: "订单数",
children: [{ title: json.result1.reduce((a, b) => a + b.COLI_OrderCount, 0), dataIndex: "COLI_OrderCount" }],
sorter: (a, b) => b.COLI_OrderCount - a.COLI_OrderCount,
},
{
title: "单团毛利",
children: [{ title: "", dataIndex: "COLI_SingleML" }],
sorter: (a, b) => comm.price_to_number(b.COLI_SingleML) - comm.price_to_number(a.COLI_SingleML),
},
{
title: "成团周期",
children: [{ title: "", dataIndex: "COLI_Cycle" }],
sorter: (a, b) => b.COLI_Cycle - a.COLI_Cycle,
},
];
result.dataSource = json.result1;
} else {
//if (this.active_tab_key == "Country")
//获取类型的项目,去掉重复,作为列名
let type_name_arr = [];
json.result1.map((item) => {
type_name_arr[item.SubTypeSN] = { SubTypeSN: item.SubTypeSN, SubTypeName: item.SubTypeName };
});
let type_data = [];
let type_data_arr = [];
for (let item of json.result1) {
let op_sn = "OP_" + item.OPI_SN; //顾问的SN
let items = json.result1.filter((d) => d.OPI_SN == item.OPI_SN); //筛选出有当前顾问的记录
let total_data_value = items.length ? items.reduce((a, b) => a + b.COLI_YJLY, 0) : ""; //记录累加
if (comm.empty(type_data[op_sn])) {
type_data[op_sn] = [{ key: item.OPI_SN }, { T_name: item.OPI_Name }, { T_total: total_data_value }];
}
type_data[op_sn].push({ ["T_" + item.SubTypeSN]: item.COLI_YJLY });
}
Object.values(type_data).map((item) => {
type_data_arr.push(
Object.assign(
...item.map((it) => {
return it;
})
)
);
});
result.columns.push(
{ title: "顾问", children: [{ title: "", dataIndex: "T_name", render: (text, record) => <NavLink to={`/sale_sub/${this.active_tab_key}`}>{text}</NavLink> }] },
{ title: "合计", children: [{ title: type_data_arr.reduce((a, b) => a + b.T_total, 0), dataIndex: "T_total" }], sorter: (a, b) => b.T_total - a.T_total }
);
Object.values(type_name_arr).map((item, index) => {
let data_index = "T_" + item.SubTypeSN;
let items = type_data_arr.filter((d) => d[data_index]); //筛选出有对应类型的记录
let total_data_value = items.length ? items.reduce((a, b) => a + b[data_index], 0) : ""; //记录累加
result.columns.push({
title: item.SubTypeName,
children: [{ title: total_data_value, dataIndex: data_index }],
sorter: (a, b) => b[data_index] - a[data_index],
});
});
result.dataSource = type_data_arr;
}
}
runInAction(() => {
this.type_data = result;
this.loading_table = false;
});
})
.catch((error) => {
this.loading_table = false;
console.log("fetch data failed", error);
});
}
//子维度查询 beign
get_department_order_ml_by_type_sub(date_moment, type_sub) {
let result = { dataSource: [], columns: [] };
const date1_start = date_moment.start_date.format(config.DATE_FORMAT);
const date1_end = date_moment.end_date.format(config.DATE_FORMAT);
const date2_start = comm.empty(date_moment.start_date_cp) ? "" : date_moment.start_date_cp.format(config.DATE_FORMAT);
const date2_end = comm.empty(date_moment.end_date_cp) ? "" : date_moment.end_date_cp.format(config.DATE_FORMAT);
let url = "/service-web/QueryData/GetDepartmentOrderMLByType_sub";
url += `?DepartmentList=${this.groups.toString()}&DateType=${this.date_type}&subType=${type_sub}&subTypeVal=-1`;
url += `&Date1=${date1_start}&Date2=${date1_end}%2023:59:59`;
if (date2_start && date2_end) {
url += `&OldDate1=${date2_start}&OldDate2=${date2_end}%2023:59:59`;
this.date_title += ` ${date2_start}~${date2_end}`;
}
fetch(config.HT_HOST + url)
.then((response) => response.json())
.then((json) => {
if (!comm.empty(json.result2) && !comm.empty(date_moment.start_date_cp)) {
} else {
result.columns = [
{
title: "",
dataIndex: "OPI_Name",
},
{
title: "毛利",
dataIndex: "COLI_ML",
sorter: (a, b) => b.COLI_ML - a.COLI_ML,
},
{
title: "成行率",
dataIndex: "COLI_CJrate",
sorter: (a, b) => parseFloat(b.COLI_CJrate) - parseFloat(a.COLI_CJrate),
},
{
title: "成团数",
dataIndex: "COLI_CJCount",
},
{
title: "订单数",
dataIndex: "COLI_OrderCount",
sorter: (a, b) => b.COLI_OrderCount - a.COLI_OrderCount,
},
{
title: "单团毛利",
dataIndex: "COLI_SingleML",
},
{
title: "成团周期",
dataIndex: "COLI_Cycle",
},
];
//数据处理,把相同类型放入同一个数组
let type_data = [];
!comm.empty(json.result1) &&
Object.values(json.result1).map((item) => {
let subtype_sn = "type_" + item.subType;
if (comm.empty(type_data[subtype_sn])) {
type_data[subtype_sn] = { subType: item.subType, subType_name: item.subTypeVal, data: [item] };
} else {
type_data[subtype_sn].data.push(item);
}
});
result.dataSource = Object.values(type_data);
}
runInAction(() => {
this.type_data_sub = result;
});
})
.catch((error) => {
console.log("fetch data failed", error);
});
}
//子维度查询 end
}
export default SaleStore;