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.
212 lines
7.5 KiB
JavaScript
212 lines
7.5 KiB
JavaScript
import { makeAutoObservable, runInAction } from 'mobx';
|
|
import { fetchJSON } from '@haina/utils-request';
|
|
import { isEmpty, sortDescBy, groupBy, pick, unique } from '@haina/utils-commons';
|
|
import { groupsMappedByCode } from './../libs/ht';
|
|
import { DATE_FORMAT, SMALL_DATETIME_FORMAT, HT_HOST } from './../config';
|
|
import moment from 'moment';
|
|
|
|
const fetchResultsData = async (param) => {
|
|
const defaultParam = {
|
|
WebCode: 'All',
|
|
DepartmentList: '',
|
|
opisn: -1,
|
|
Date1: '',
|
|
Date2: '',
|
|
groupType: '',
|
|
groupDateType: '',
|
|
};
|
|
const json = await fetchJSON(HT_HOST + '/service-Analyse2/sales_crm_results', { ...defaultParam, ...param });
|
|
return json.errcode === 0 ? json.result : [];
|
|
};
|
|
|
|
const fetchProcessData = async (param) => {
|
|
const defaultParam = {
|
|
WebCode: 'All',
|
|
DepartmentList: '',
|
|
opisn: -1,
|
|
Date1: '',
|
|
Date2: '',
|
|
groupType: '',
|
|
groupDateType: '',
|
|
};
|
|
const json = await fetchJSON(HT_HOST + '/service-Analyse2/sales_crm_process', { ...defaultParam, ...param });
|
|
return json.errcode === 0 ? json.result : [];
|
|
};
|
|
|
|
const fetchRiskDetailData = async (param) => {
|
|
const defaultParam = {
|
|
opisn: -1,
|
|
DateType: '',
|
|
WebCode: 'All',
|
|
DepartmentList: '',
|
|
Date1: '',
|
|
Date2: '',
|
|
IncludeTickets: '1',
|
|
};
|
|
const json = await fetchJSON(HT_HOST + '/service-Analyse2/sales_crm_process_detail', {...defaultParam, ...param});
|
|
return json.errcode === 0 ? json.result : [];
|
|
};
|
|
|
|
class SalesCRMData {
|
|
constructor(appStore) {
|
|
this.appStore = appStore;
|
|
makeAutoObservable(this);
|
|
}
|
|
|
|
async get90n180Data(param = {}) {
|
|
const retProps = param?.retLabel || '';
|
|
|
|
let retKey = param.groupDateType === '' ? (param.groupType === 'overview' ? 'dataSource' : 'details') : 'byDate';
|
|
retKey = param.opisn ? `operator_${param.opisn}`: retKey;
|
|
if (param.opisn ) {
|
|
if (!isEmpty(this.results.details)) {
|
|
const _this_opi_row = this.results.details.filter(ele => ele.groupsKey === param.opisn);
|
|
this.results[retKey] = _this_opi_row;
|
|
return;
|
|
}
|
|
if (!isEmpty(this.results[retKey])) {
|
|
return;
|
|
}
|
|
}
|
|
this.results.loading = true;
|
|
const date90=this.searchValues.date90;
|
|
const date180=this.searchValues.date180;
|
|
const [result90, result180] = await Promise.all([
|
|
fetchResultsData({ ...this.searchValuesToSub, ...date90, ...param }),
|
|
fetchResultsData({ ...this.searchValuesToSub, ...date180, ...param }),
|
|
]);
|
|
const _90O = groupBy(result90, 'groupsKey');
|
|
const _180O = groupBy(result180, 'groupsKey');
|
|
const result2 = unique(Object.keys(_90O).concat(Object.keys(_180O))).map((key) => {
|
|
return {
|
|
...pick(_90O[key]?.[0] || _180O[key][0], ['groupsKey', 'groupsLabel', 'groupType']),
|
|
...(retProps && retKey === 'dataSource' ? { groupsLabel: retProps, retProps } : { retProps }),
|
|
key: `${param.groupType}-${key}`,
|
|
result90: _90O[key]?.[0] || {},
|
|
result180: _180O[key]?.[0] || {},
|
|
};
|
|
});
|
|
// console.log(result2, '+++++ +++', retKey);
|
|
// console.log(this.results[retKey]?.length);
|
|
|
|
runInAction(() => {
|
|
this.results.loading = false;
|
|
this.results[retKey] = [].concat((this.results[retKey] || []), result2);
|
|
});
|
|
return this.results;
|
|
}
|
|
|
|
async getResultData(param = {}) {
|
|
let retKey = param.groupDateType === '' ? 'byOperator' : 'byDate';
|
|
retKey = param.opisn ? `operator_byDate_${param.opisn}`: retKey;
|
|
if (!isEmpty(this.results[retKey])) {
|
|
return;
|
|
}
|
|
this.results.loading = true;
|
|
this.results[retKey] = [];
|
|
const res = await fetchResultsData({ ...this.searchValuesToSub, ...param });
|
|
runInAction(() => {
|
|
this.results.loading = false;
|
|
this.results[retKey] = retKey === 'byOperator' ? res.filter(ele => ele.SumML > 0).sort(sortDescBy('SumML')) : res;
|
|
});
|
|
return this.results;
|
|
};
|
|
|
|
async getProcessData(param = {}) {
|
|
// const retKey = param.groupDateType === '' ? 'byOperator' : 'byDate';
|
|
let retKey = param.groupDateType === '' ? (param.groupType !== 'operator' ? 'dataSource' : 'details') : 'byDate';
|
|
retKey = param.opisn ? `operator_${param.opisn}`: retKey;
|
|
if (param.opisn) {
|
|
if (!isEmpty(this.process.details)) {
|
|
const _this_opi_row = this.process.details.filter(ele => ele.groupsKey === param.opisn);
|
|
this.process[retKey] = _this_opi_row;
|
|
return;
|
|
}
|
|
if (!isEmpty(this.process[retKey])) {
|
|
return;
|
|
}
|
|
}
|
|
this.process.loading = true;
|
|
this.process[retKey] = [];
|
|
const res = await fetchProcessData({ ...this.searchValuesToSub, ...param });
|
|
runInAction(() => {
|
|
this.process.loading = false;
|
|
this.process[retKey] = [].concat(this.process[retKey], res);
|
|
});
|
|
}
|
|
|
|
async getRiskDetailData(param = {}) {
|
|
this.risk.loading = true;
|
|
this.risk.dataSource = [];
|
|
const res = await fetchRiskDetailData({ ...this.searchValuesToSub, ...param });
|
|
runInAction(() => {
|
|
this.risk.loading = false;
|
|
this.risk.dataSource = res;
|
|
this.risk.byLostType = groupBy(res, 'lost_type');
|
|
});
|
|
}
|
|
|
|
searchValues = {
|
|
date: moment(),
|
|
Date1: moment().startOf("week").subtract(7, "days"),
|
|
Date2: moment().endOf("week").subtract(7, "days"),
|
|
DateType: { key: 'applyDate', label: '提交日期'},
|
|
WebCode: { key: 'All', label: '所有来源' },
|
|
// IncludeTickets: { key: '1', label: '含门票'},
|
|
DepartmentList: [groupsMappedByCode.GH],
|
|
operator: '-1',
|
|
IncludeTickets: { key: '0', value: '0', label: '不含门票' },
|
|
opisn: '-1',
|
|
date90: {
|
|
Date1: moment().subtract(90, 'days').format(DATE_FORMAT),
|
|
Date2: moment().subtract(30, 'days').format(SMALL_DATETIME_FORMAT),
|
|
},
|
|
date180: {
|
|
Date1: moment().subtract(180, 'days').format(DATE_FORMAT),
|
|
Date2: moment().subtract(50, 'days').format(SMALL_DATETIME_FORMAT),
|
|
}
|
|
};
|
|
|
|
searchValuesToSub = {
|
|
date: moment().format(DATE_FORMAT),
|
|
Date1: moment().startOf("week").subtract(7, "days").format(DATE_FORMAT),
|
|
Date2: moment().endOf("week").subtract(7, "days").format(SMALL_DATETIME_FORMAT),
|
|
DateType: 'applyDate',
|
|
DepartmentList: groupsMappedByCode.GH.value,
|
|
WebCode: 'All',
|
|
operator: '-1',
|
|
opisn: '-1',
|
|
};
|
|
|
|
setSearchValues(obj, values) {
|
|
this.searchValues = { ...this.searchValues, ...values };
|
|
if (values.date) {
|
|
this.searchValues.date90 = {
|
|
Date1: (values.date.clone()).subtract(90, 'days').format(DATE_FORMAT),
|
|
Date2: (values.date.clone()).subtract(30, 'days').format(SMALL_DATETIME_FORMAT),
|
|
};
|
|
this.searchValues.date180 = {
|
|
Date1: (values.date.clone()).subtract(180, 'days').format(DATE_FORMAT),
|
|
Date2: (values.date.clone()).subtract(50, 'days').format(SMALL_DATETIME_FORMAT),
|
|
};
|
|
}
|
|
this.searchValuesToSub = {...this.searchValuesToSub, ...obj};
|
|
}
|
|
|
|
results = { loading: false, dataSource: [], details: [], byDate: [], byOperator: [] };
|
|
process = { loading: false, dataSource: [], details: [], byDate: [], byOperator: [] };
|
|
risk = { loading: false, dataSource: [], byLostType: {}, };
|
|
resetData = (rootKey = '') => {
|
|
if (rootKey === '') {
|
|
return false;
|
|
}
|
|
this[rootKey].loading = false;
|
|
for (const key of Object.keys(this[rootKey])) {
|
|
if (key !== 'loading') {
|
|
this[rootKey][key] = [];
|
|
}
|
|
}
|
|
};
|
|
}
|
|
export default SalesCRMData;
|