UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

284 lines (283 loc) 11.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getBasedCount = exports.AbcAnalysisMath = exports.getAbcTableData = exports.statisticsData = exports.formatAbcTableData = exports.getTable = exports.activityBasedClassification = void 0; var tslib_1 = require("tslib"); var utils_1 = require("../../../utils/utils"); var activityBasedClassification = function (data, areaLimit) { data = data.sort(function (a, b) { return (b - a); }); var total = (data === null || data === void 0 ? void 0 : data.length) ? data.reduce(function (prev, curr) { return +prev + +curr; }) : 0; var A = [], B = [], C = []; var totalA = 0, totalB = 0, totalC = 0; // 修复A类分配逻辑:先检查添加后是否满足条件,再决定是否添加 while (data.length > 0) { var nextItem = data[0]; // 只有当前totalA加上下一项后仍不超过阈值时,才添加到A类 if (totalA + nextItem <= total * areaLimit.aType / 100) { A.push.apply(A, data.splice(0, 1)); totalA += nextItem; } else { break; } } // B类分配逻辑:B类的阈值应该是从A类阈值到B类阈值的总和 var bLimit = total * areaLimit.bType / 100; while (data.length > 0) { var nextItem = data[0]; // 需要考虑A类已经占用的部分,所以使用totalA + totalB + nextItem来比较 if (totalA + totalB + nextItem <= bLimit) { B.push.apply(B, data.splice(0, 1)); totalB += nextItem; } else { break; } } // 剩余数据为C类 C = data; totalC = data.length > 0 ? C.reduce(function (prev, curr) { return +prev + +curr; }) : 0; return { A: A, B: B, C: C }; }; exports.activityBasedClassification = activityBasedClassification; var getTable = function (colsName, abcData, params, originColList, data) { var _a; var colList = originColList.filter(function (col) { return col.name && colsName.includes(col.name); }); var label = colList[0].label; var yAxisLabel = (_a = colList.find(function (col) { return col.name === params.statisticsSelects; })) === null || _a === void 0 ? void 0 : _a.label; var colsArr = [ { label: label + '类', name: 'type', type: 'plain' }, { label: label + '项数', name: 'sum', type: 'number', }, { label: label + '占比', name: 'per', type: 'number', suffix: '%', precision: 3, isPercentage: true }, { label: yAxisLabel + '占比', name: 'sumPer', type: 'number', suffix: '%', precision: 3, isPercentage: true }, ]; if (params.displayEachColumn) { colsArr.push({ label: label + '列', name: 'col', type: 'plain' }); } var tableColList = []; for (var i = 0; i < colsArr.length; i++) { var info = colsArr[i]; var col_1 = { name: info.name, label: info.label, type: info.type, suffix: info.suffix, precision: info.precision, isNumerical: true, sortable: true, isPercentage: info.isPercentage, }; tableColList.push(col_1); } // { // caption: colList[1].attr.caption + '总价均值', // fieldName: 'sumValue' // } var col = JSON.parse(JSON.stringify(colList[1])); col = tslib_1.__assign(tslib_1.__assign({}, col.pristine), col); col.label = yAxisLabel + '均值'; col.name = 'sumValue'; // 江惠需求:希望每一类的那列 在最后一列 // tableColList.push(col) tableColList.splice(-1, 0, col); var colData = data .sort(compare(params.statisticsSelects)) .map(function (item) { var val = item[params.sortSelectes]; // 不太明白什么是lookUpData // let col = colList.find(item => item.name === params.sortSelectes) // if (col?.elementType === 'lookup' && lookUpData) { // val = lookUpData?.[col.fieldName]?.find(lookup => lookup.value == item[col?.lookUpKeyField])?.[col.fieldName] // } return val; }); function compare(property) { return function (obj1, obj2) { var value1 = obj1[property]; var value2 = obj2[property]; return value2 - value1; // 升序 }; } var tableData = Object.keys(abcData).map(function (key) { var cols = colData.splice(0, abcData[key].length); var sumValue = cols.length ? (exports.AbcAnalysisMath.sum(abcData[key]) / cols.length).toFixed(2) : 0; return { type: key + '类', sum: abcData[key].length, per: exports.AbcAnalysisMath.per(key, abcData), sumPer: exports.AbcAnalysisMath.percent(abcData[key], abcData), sumValue: sumValue, col: cols.join(',') }; }); return { tableColumns: tableColList, tableData: tableData }; }; exports.getTable = getTable; var formatAbcTableData = function (params, data1) { var settingType = params.settingType, aType = params.aType, bType = params.bType; var colName = params.statisticsSelects; var colData = []; data1.forEach(function (dataItem) { colData.push(+dataItem[colName]); }); var abType = { aType: 65, bType: 85 }; if (settingType === 'manual') { abType = { aType: aType, bType: bType }; } return { colData: colData, abType: abType }; }; exports.formatAbcTableData = formatAbcTableData; function statisticsData(sortName, compotedNames, data, originColList) { if (!sortName || !data.length) { return []; } var _data = []; if (compotedNames && compotedNames.length) { data.forEach(function (dataItem) { if (_data.length === 0) { return _data.push(dataItem); } var ifPush = true; _data.forEach(function (_dataItem) { if (_dataItem[sortName] === dataItem[sortName]) { ifPush = false; var compotedArr = Array.isArray(compotedNames) ? compotedNames : [compotedNames]; compotedArr.forEach(function (name) { _dataItem[name] = +dataItem[name] + +_dataItem[name]; }); } }); ifPush && _data.push(dataItem); }); } else { // 列统计 var sortNameContents_1 = []; data.forEach(function (item) { var field = originColList.find(function (item) { return item.name === sortName; }); var value = "".concat(item[sortName]); if (value && sortNameContents_1.indexOf(value) === -1) { sortNameContents_1.push(value); item['_COUNT'] = item['_COUNT'] || 1; item['_PERCENT'] = item['_PERCENT'] || (item['_COUNT'] / data.length * 100).toFixed(2) + '%'; // _data.push(field.elementType === 'lookup' ? // { // ...item, // [sortName]: item[field.lookUpKeyField].split(field?.flLookup?.valueSep || ',') // .join(field?.flLookup?.valueSep || ',') // } // : // item // ); _data.push(item); } else { sortNameContents_1.forEach(function (content) { if (content === value) { _data.forEach(function (_item, i) { var _value = _item[sortName] && "".concat(_item[sortName]); if (_value === value) { _data[i]['_COUNT'] = _item['_COUNT'] + 1; _data[i]['_PERCENT'] = (_data[i]['_COUNT'] / data.length * 100).toFixed(2) + '%'; } }); } }); } }); } return _data; } exports.statisticsData = statisticsData; var getAbcTableData = function (params, data, originColList) { var sortSelectes = params.sortSelectes, statisticsSelects = params.statisticsSelects; // 需要深拷贝data 因为statisticsData内部对引用地址的数据进行了操作 var dealData = JSON.parse(JSON.stringify(data)); // 需要处理的数据 var sortName = sortSelectes; var _data = statisticsData(sortName, [statisticsSelects], dealData, originColList); var _a = (0, exports.formatAbcTableData)(params, _data), colData = _a.colData, abType = _a.abType; var abcData = (0, exports.activityBasedClassification)(colData, abType); return (0, exports.getTable)([sortSelectes, statisticsSelects], abcData, params, originColList, _data); }; exports.getAbcTableData = getAbcTableData; exports.AbcAnalysisMath = { sum: function (values) { var numberMaxLen = 2; return values.length ? values.reduce(function (total, curr) { numberMaxLen = Math.max((0, utils_1.getDecimalPlaces)(curr), numberMaxLen); return +Number(+total) + Number(+curr); }, 0) : 0; }, colLen: function (values) { return values.length; }, avg: function (values) { return exports.AbcAnalysisMath.sum(values) / exports.AbcAnalysisMath.colLen(values); }, percent: function (v, values) { var totalA = values.A.length ? values.A.reduce(function (total, curr) { return total + curr; }) : 0; var totalB = values.B.length ? values.B.reduce(function (total, curr) { return total + curr; }) : 0; var totalC = values.C.length ? values.C.reduce(function (total, curr) { return total + curr; }) : 0; var value = v.length ? v.reduce(function (total, curr) { return total + curr; }) : 0; // 数据为数字型,才能进行继续统计 if (totalA + totalB + totalC === 0) return 0; return (value / (totalA + totalB + totalC)) * 100; }, per: function (key, values) { var len = values.A.length + values.B.length + values.C.length; // 数据为数字型,才能进行继续统计 if (len === 0) return 0; return (values[key].length / len) * 100; } }; // 计算累计占有 var getBasedCount = function (data, sortName, statisticsSelects) { if (!sortName || !data.length || !statisticsSelects) { return []; } var total = 0; data.forEach(function (item) { total += item[statisticsSelects]; }); var sum = 0; var newArr = data.map(function (item) { sum += item[statisticsSelects]; return tslib_1.__assign(tslib_1.__assign({}, item), { countPer: (sum / total * 100).toFixed(3) }); }); return newArr; }; exports.getBasedCount = getBasedCount; //# sourceMappingURL=./renderers/Table/AbcAnalysis/toolFunc.js.map