import { makeAutoObservable, runInAction, toJS } from 'mobx'; import * as req from '../utils/request'; import { isEmpty, sortBy, groupBy, cloneDeep } from '../utils/commons'; import moment from 'moment'; const currentYear = moment().year(); class KPI { constructor(appStore) { this.appStore = appStore; makeAutoObservable(this); } saveOrUpdate(x) { console.log('ssssssssssss', x); console.log(toJS(this.pageData)); const tableData = this.pageData.reduce((r, curObj) => { const allMonth = new Array(12).fill(1).map((_, index) => { const mIndex = index+1; const startM = moment([this.settingYear, index, 1]); const pick = (({ object, object_name, object_id, subject,date_type, }) => ({ object, object_name, object_id, subject,date_type, }))(curObj); return { ...pick, start_date: startM.format('YYYY-MM-DD'), end_date: startM.endOf('M').format('YYYY-MM-DD HH:mm:ss'), value: curObj[`M${mIndex}`], // ...(curObj[`M${mIndex}_id`] ? { kpi_id: curObj[`M${mIndex}_id`] } : {}), kpi_id: curObj[`M${mIndex}_id`] || undefined, key: undefined, }; }); console.log('cccccccccc', allMonth); return r.concat(allMonth); }, []); console.log('ppppp', tableData); const data = { 'kpis': tableData }; req.postJSON('/service-Analyse2/setkpi_multi/test', data).then((json) => { // req.postJSON('/service-Analyse2/setkpi_multi', data).then((json) => { if (json.errcode === 0) { runInAction(() => { console.log({ loading: false, ...json }, 'post kpi'); }); } }); } getList() { const param = { date_type: 'applyDate', start_date: '2020-01-01', end_date: '2024-12-31 23:59:59', }; // return req.fetchJSON('/service-Analyse2/getkpi/test', param).then((json) => { return req.fetchJSON('/service-Analyse2/getkpi', param).then((json) => { if (json.errcode === 0) { runInAction(() => { this.originData = json.result; const yearData = parseKPI(json.result, ['subject', 'object_id']); console.log(111, yearData, yearData[this.settingYear]); this.pageData = yearData?.[this.settingYear]?.[this.settingSubject] || []; }); } return this.pageData; }); } handleTableEdit(data) { console.log('handle change ', data); // this.pageData = data; } settingYear = 2023; settingSubject = 'sum_profit'; originData =[]; pageData = []; } /** * 把kpi数据按照对象和类型转换格式 * @param {array} keyArr 转换的字段的顺序, 返回结果的key层级 * @example * * parseKPI(json.result, ['object_id', 'subject']); * // => { 2023: { 114: [{...}, {...}], 216: [...] } } * * parseKPI(json.result, ['subject', 'object_id']); * // => { 2023: { in_order_count: [{...}, {...}], sum_profit: [...] } } */ export const parseKPI = (kpis, keyArr = []) => { const result = kpis.map((row) => ({ ...row, yearIndex: moment(row.start_date).year(), monthIndex: moment(row.start_date).month() + 1, monthRange: [moment(row.start_date).month() + 1, moment(row.end_date).month() + 1], fullYear: moment(row.start_date).month() === 0 && moment(row.end_date).month() === 11, })); const byYear = groupBy(result, (ele) => ele.yearIndex); const yearData = {}; const initialPercentKey = new Array(12).fill(1).reduce((r, v, i) => ({ ...r, [`M${i+1}Percent`]: 0 }), {}); const ret = {}; const [key0, key1] = keyArr; Object.keys(byYear).map((_yearVal) => { const _subjectRet = groupBy(byYear[_yearVal], (ele) => `${ele[key0]}`); Object.keys(_subjectRet).map((_subject) => { const subjectObject = groupBy(_subjectRet[_subject], (row) => row[key1]); const afterGroup = Object.keys(subjectObject).map((oID) => { const _ByFull = subjectObject[oID].reduce((r, v) => { (r[String(v.fullYear)] || (r[String(v.fullYear)] = [])).push(v); return r; }, {}); const kpiYear = (_ByFull?.true || []).reduce((r, v) => { // r.push({ monthIndex: v.monthIndex, yearIndex: v.yearIndex, value: v.value, kpi_id: v.kpi_id }); return { monthIndex: v.monthIndex, yearIndex: v.yearIndex, value: v.value, kpi_id: v.kpi_id }; }, {}); const kpiData = _ByFull.false.reduce((r, v) => { r.push({ monthIndex: v.monthIndex, yearIndex: v.yearIndex, value: v.value, kpi_id: v.kpi_id, percentVal: (v.value/kpiYear.value*100) }); return r; }, []); const kpiDataMapped = kpiData.reduce((r, v) => ({...r, [`M${v.monthIndex}`]: v }), {}); const kpiDataFlat = kpiData.reduce((r, v) => ({...r, [`M${v.monthIndex}Val`]: v.value, [`M${v.monthIndex}Percent`]: v.percentVal}), {}); const { start_date, end_date, kpi_id, value, unit, monthIndex, monthRange, ...objectEle } = subjectObject[oID][0]; return { ...cloneDeep(initialPercentKey), ...objectEle, ...kpiDataFlat, kpiData, kpiDataMapped, kpiYear, yearValue: kpiYear?.value || 0 }; }); ret[_subject] = afterGroup; return 1; }); Object.assign(yearData, { [_yearVal]: ret }); return _yearVal; }); return yearData; }; export default KPI;