fastlion-amis
Version:
一种MIS页面生成工具
284 lines (283 loc) • 11.5 kB
JavaScript
;
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