fastlion-amis
Version:
一种MIS页面生成工具
338 lines (337 loc) • 19.5 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getChangeRows = exports.buildCrossData1 = exports.buildCrossColumn1 = exports.buildCrossData = exports.buildCrossColumn = exports.REG_EXP = exports.INDEX_NAME = exports.EMPTY_GROUP_VALUE = void 0;
var tslib_1 = require("tslib");
var amis_formula_1 = require("amis-formula");
var lodash_1 = require("lodash");
var uniqWith_1 = (0, tslib_1.__importDefault)(require("lodash/uniqWith"));
var commonTableFunction_1 = require("../../store/utils/commonTableFunction");
var utils_1 = require("../../utils/utils");
var crud_1 = require("../../store/crud");
exports.EMPTY_GROUP_VALUE = '空白';
exports.INDEX_NAME = 'SF_INDEX';
exports.REG_EXP = new RegExp("\\.|:|" + commonTableFunction_1.CROSS_SPLIT_CHAR, 'g');
var worker = new Worker('./public/worker/dataCross.js');
var uniqArr = function (fields, datas) {
var map = new Map(fields.map(function (field) { var _a, _b, _c; return [((_a = field.orderName) !== null && _a !== void 0 ? _a : field.name), { order: ((_c = (_b = field.order) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : 'asc') }]; }));
var sortData = (0, commonTableFunction_1.handleSort)(datas.slice(), fields.map(function (field) { var _a; return (_a = field.orderName) !== null && _a !== void 0 ? _a : field.name; }), map);
return (0, uniqWith_1.default)(sortData.map(function (data) {
var obj = {};
for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {
var field = fields_1[_i];
obj[field.name] = data[field.name];
}
return obj;
}), function (a, b) {
for (var _i = 0, fields_2 = fields; _i < fields_2.length; _i++) {
var field = fields_2[_i];
if (a[field.name] !== b[field.name]) {
return false;
}
}
return true;
});
};
var buildCrossColumn = function (rowFields, colFields, valueFields, datas, countSum) {
var _a, _b;
var ret = [];
var level = colFields.length + 1;
var uniqColArr = uniqArr(colFields, datas);
for (var _i = 0, rowFields_1 = rowFields; _i < rowFields_1.length; _i++) {
var rowField = rowFields_1[_i];
var type = rowField.type, label = rowField.label, name = rowField.name, align = rowField.align, sortable = rowField.sortable, map = rowField.map, fixed = rowField.fixed, pristine = rowField.pristine;
var groupName = new Array(level - 1).fill((_a = pristine.groupName) !== null && _a !== void 0 ? _a : name).join(',');
var groupLabels = new Array(level - 1).fill((_b = pristine.groupName) !== null && _b !== void 0 ? _b : name);
ret.push((0, tslib_1.__assign)((0, tslib_1.__assign)({}, pristine), { type: type, label: label, name: name, field: name, groupName: groupName, groupLabels: groupLabels, map: map, fixed: fixed, align: align, sortable: sortable, isCountField: false }));
}
var product = (0, utils_1.cartesianProduct)(uniqColArr, valueFields).map(function (_a) {
var _b, _c;
var item = _a[0], field = _a[1];
var cols = [];
for (var i = 0; i < colFields.length; i++) {
var field_1 = colFields[i];
if (i == 0) {
cols.push(String((_b = item[field_1.name]) !== null && _b !== void 0 ? _b : exports.EMPTY_GROUP_VALUE).replace(exports.REG_EXP, ''));
}
else {
var vals = [];
for (var j = 0; j <= i; j++) {
var preField = colFields[j];
vals.push(String((_c = item[preField.name]) !== null && _c !== void 0 ? _c : exports.EMPTY_GROUP_VALUE).replace(exports.REG_EXP, ''));
}
cols.push(vals.join(commonTableFunction_1.CROSS_SPLIT_CHAR));
}
}
return [item, field, cols.concat("" + cols[cols.length - 1] + commonTableFunction_1.CROSS_SPLIT_CHAR + field.name)];
});
var _loop_1 = function (uniqCol, valueField, item) {
var type = valueField.type, label = valueField.label, name = valueField.name, align = valueField.align, sortable = valueField.sortable;
var _f = valueField.pristine, quickEdit = _f.quickEdit, rest = (0, tslib_1.__rest)(_f, ["quickEdit"]);
var has$Expr = colFields.some(function (field) { return field.titleExpr && !/\$\{[^\}]*\}/g.test(field.titleExpr); });
var groupName = has$Expr ? colFields.map(function (field) { return field.titleExpr; }).join(commonTableFunction_1.CROSS_SPLIT_CHAR) : level == 1 ? '' : item.slice(0, level - 1).map(function (val) { return val.replaceAll(',', ''); }).join(',');
var groupLabels = colFields.map(function (field) {
var val = (0, commonTableFunction_1.getCellValue)(uniqCol[field.name], field) || exports.EMPTY_GROUP_VALUE;
return field.titleExpr ? field.titleExpr.replaceAll("${" + field.name + "}", val) : val;
});
ret.push((0, tslib_1.__assign)((0, tslib_1.__assign)({}, rest), { type: type, label: /\$\{[^\}]*\}/g.test(label) ? ((0, amis_formula_1.tokenize)(label, uniqCol) || exports.EMPTY_GROUP_VALUE) : label, name: item[level - 1], field: name, groupName: groupName, groupLabels: groupLabels, align: align, sortable: sortable, quickEdit: quickEdit ? (0, tslib_1.__assign)((0, tslib_1.__assign)({}, quickEdit), { name: item[level - 1] }) : undefined, isNumerical: true, isCountField: false }));
};
for (var _c = 0, product_1 = product; _c < product_1.length; _c++) {
var _d = product_1[_c], uniqCol = _d[0], valueField = _d[1], item = _d[2];
_loop_1(uniqCol, valueField, item);
}
if (countSum) {
for (var _e = 0, valueFields_1 = valueFields; _e < valueFields_1.length; _e++) {
var valueField = valueFields_1[_e];
var type = valueField.type, label = valueField.label, name = valueField.name, align = valueField.align, sortable = valueField.sortable, pristine = valueField.pristine;
var groupName = new Array(colFields.length).fill('SF_COUNT').join(',');
var groupLabels = new Array(colFields.length).fill('合计');
var rLabel = label.replace(exports.REG_EXP, '');
ret.push((0, tslib_1.__assign)((0, tslib_1.__assign)({}, pristine), { type: type, label: rLabel, name: "" + rLabel + commonTableFunction_1.CROSS_SPLIT_CHAR + groupName, field: name, groupName: groupName, groupLabels: groupLabels, align: align, sortable: sortable, isNumerical: false, isCountField: true }));
}
}
return ret;
};
exports.buildCrossColumn = buildCrossColumn;
var buildCrossData = function (rowFields, colFields, crossColumns, datas) {
return new Promise(function (resolve, reject) {
worker.postMessage({ rowFields: rowFields, colFields: colFields, crossColumns: crossColumns, datas: datas, regExp: exports.REG_EXP, EMPTY_GROUP_VALUE: exports.EMPTY_GROUP_VALUE, CROSS_SPLIT_CHAR: commonTableFunction_1.CROSS_SPLIT_CHAR });
worker.onmessage = function (e) {
var map = new Map(rowFields.map(function (field) { var _a, _b, _c; return [((_a = field.orderName) !== null && _a !== void 0 ? _a : field.name), { order: ((_c = (_b = field.order) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : 'asc') }]; }));
var sortData = (0, commonTableFunction_1.handleSort)(e.data.slice(), rowFields.map(function (field) { var _a; return (_a = field.orderName) !== null && _a !== void 0 ? _a : field.name; }), map);
resolve(sortData);
};
worker.onmessageerror = function (e) { reject(e.data); };
});
};
exports.buildCrossData = buildCrossData;
var buildCrossColumn1 = function (rowFields, colFields, datas) {
var _a, _b;
var ret = [];
var level = colFields.length;
// step 1
for (var _i = 0, rowFields_2 = rowFields; _i < rowFields_2.length; _i++) {
var rowField = rowFields_2[_i];
var type = rowField.type, label = rowField.label, name = rowField.name, align = rowField.align, sortable = rowField.sortable, map = rowField.map, fixed = rowField.fixed, pristine = rowField.pristine;
ret.push((0, tslib_1.__assign)((0, tslib_1.__assign)({}, pristine), { type: type, label: label, name: name, field: name, groupName: new Array(level - 1).fill(name).join(','), groupLabels: [], map: map, fixed: fixed, align: align, sortable: sortable, isCountField: false }));
}
// step 2
ret.push({
label: '指标',
name: exports.INDEX_NAME,
field: exports.INDEX_NAME,
groupName: new Array(level - 1).fill(exports.INDEX_NAME).join(','),
groupLabels: [],
isCountField: false,
type: 'plain',
align: 'left',
sortable: false,
});
// step 3
var uniqColArr = uniqArr(colFields, datas);
var _loop_2 = function (item) {
var cols = [];
for (var i = 0; i < colFields.length; i++) {
var field = colFields[i];
if (i == 0) {
cols.push(String((_a = item[field.name]) !== null && _a !== void 0 ? _a : exports.EMPTY_GROUP_VALUE).replace(exports.REG_EXP, ''));
}
else {
var vals = [];
for (var j = 0; j <= i; j++) {
var preField = colFields[j];
vals.push(String((_b = item[preField.name]) !== null && _b !== void 0 ? _b : exports.EMPTY_GROUP_VALUE).replace(exports.REG_EXP, ''));
}
cols.push(vals.join(commonTableFunction_1.CROSS_SPLIT_CHAR));
}
}
var groupName = level == 1 ? '' : cols.slice(0, level - 1).join(',');
var labels = colFields.map(function (field) {
var val = (0, commonTableFunction_1.getCellValue)(item[field.name], field) || exports.EMPTY_GROUP_VALUE;
return field.titleExpr ? field.titleExpr.replaceAll("${" + field.name + "}", val) : val;
});
ret.push({
label: labels[level - 1],
name: cols[level - 1],
field: '',
groupName: groupName,
groupLabels: labels.slice(0, level - 1),
isCountField: false,
type: 'plain',
align: 'right',
sortable: false
});
};
for (var _c = 0, uniqColArr_1 = uniqColArr; _c < uniqColArr_1.length; _c++) {
var item = uniqColArr_1[_c];
_loop_2(item);
}
return ret;
};
exports.buildCrossColumn1 = buildCrossColumn1;
var buildCrossData1 = function (rowFields, colFields, valueFields, crossColumns, datas) {
var uniqRowData = uniqArr(rowFields, datas);
return new Promise(function (resolve, reject) {
worker.postMessage({ rowFields: rowFields, colFields: colFields, valueFields: valueFields, crossColumns: crossColumns, datas: datas, uniqRowData: uniqRowData, regExp: exports.REG_EXP, EMPTY_GROUP_VALUE: exports.EMPTY_GROUP_VALUE, CROSS_SPLIT_CHAR: commonTableFunction_1.CROSS_SPLIT_CHAR, INDEX_NAME: exports.INDEX_NAME });
worker.onmessage = function (e) { resolve(e.data); };
worker.onmessageerror = function (e) { reject(e.data); };
});
};
exports.buildCrossData1 = buildCrossData1;
var getChangeRows = function (changeDatas, rawDatas, cross) {
var rowFields = cross.rowFields, columnFields = cross.columnFields, positionType = cross.positionType;
if (positionType === 1)
return [];
return (0, lodash_1.flatMap)(changeDatas, function (changeData) {
var colFields = Object.keys(changeData).filter(function (key) { return key.includes(commonTableFunction_1.CROSS_SPLIT_CHAR); });
var rowTarget = rawDatas.filter(function (data) { return rowFields.every(function (field) { return data[field.name] == changeData[field.name]; }); });
var result = [];
var _loop_3 = function (field) {
var values = field.split(commonTableFunction_1.CROSS_SPLIT_CHAR);
var valueField = values[values.length - 1];
var colTarget = rowTarget.find(function (data) {
return columnFields.every(function (field, index) {
var dValue = data[field.name];
return (dValue == null ? dValue : String(dValue).replace(exports.REG_EXP, '')) == (values[index] == exports.EMPTY_GROUP_VALUE ? null : values[index]);
});
});
if (colTarget) {
var temp_1 = (0, tslib_1.__assign)({}, colTarget);
var index = result.findIndex(function (item) { return item[crud_1.DATAKEYID] === temp_1[crud_1.DATAKEYID]; });
if (index == -1) {
temp_1[valueField] = changeData[field];
result.push(temp_1);
}
else {
result[index][valueField] = changeData[field];
}
}
};
for (var _i = 0, colFields_1 = colFields; _i < colFields_1.length; _i++) {
var field = colFields_1[_i];
_loop_3(field);
}
return result;
});
};
exports.getChangeRows = getChangeRows;
// export const buildCrossData = (rowFields: IColumnField[], colFields: IColumnField[], crossColumns: ICrossColumn[], datas: any[], countSum: boolean) => {
// return new Promise<any[]>((resolve, reject) => {
// const ret = datas.reduce((result, current) => {
// const index = result.findIndex((data: any) => rowFields.every(field => data[field.name] == current[field.name]))
// const compareFn = (field: IColumnField, index: number, name: string) => {
// const value = name.split(CROSS_SPLIT_CHAR)[index]
// const dValue = current[field.name]
// return (dValue == null ? dValue : String(dValue).replace(REG_EXP, '')) == (value == EMPTY_GROUP_VALUE ? null : value)
// }
// if (index == -1) {
// const target = { ...current }
// for (let i = 0; i < crossColumns.length; i++) {
// const { name, field, isPercentage, calculatedField, isCountField } = crossColumns[i]
// if (i < rowFields.length) {
// target[name] = current[field]
// } else {
// const isRate = isPercentage === true && (calculatedField?.length ?? 0) > 0
// const condition = colFields.every((field, index) => compareFn(field, index, name))
// if (isRate) {
// target[`Z_${name}`] = condition || isCountField ? +current[field] / 100 * +current[calculatedField] : null
// target[`M_${name}`] = condition || isCountField ? +current[calculatedField] : null
// }
// target[name] = condition || isCountField ? current[field] : null
// }
// }
// result.push(target)
// } else {
// const target = { ...result[index] }
// for (let i = rowFields.length; i < crossColumns.length; i++) {
// const { name, field, isPercentage, calculatedField, isCountField } = crossColumns[i]
// const isRate = isPercentage === true && (calculatedField?.length ?? 0) > 0
// if (isCountField) {
// if (isRate) {
// target[`Z_${name}`] += +current[field] / 100 * +current[calculatedField]
// target[`M_${name}`] += +current[calculatedField]
// target[name] = (target[`Z_${name}`] == 0 || target[`M_${name}`] == 0) ? null : target[`Z_${name}`] / target[`M_${name}`] * 100
// } else {
// target[name] += +current[field]
// }
// } else {
// const condition = colFields.every((field, index) => compareFn(field, index, name))
// if (condition) {
// if (isRate) {
// if (current[calculatedField] != null && !isNaN(+current[calculatedField])) {
// target[`Z_${name}`] += +current[field] / 100 * +current[calculatedField]
// target[`M_${name}`] += +current[calculatedField]
// target[name] = (target[`Z_${name}`] == 0 || target[`M_${name}`] == 0) ? null : target[`Z_${name}`] / target[`M_${name}`] * 100
// } else {
// target[name] = current[field]
// }
// } else {
// if (current[field] != null) {
// if (isNaN(+current[field])) {
// target[name] = current[field]
// } else {
// target[name] += +current[field]
// }
// }
// }
// }
// }
// }
// result[index] = target
// }
// return result
// }, [])
// resolve(ret)
// })
// }
// export const buildCrossData1 = (rowFields: IColumnField[], colFields: IColumnField[], valueFields: IColumnField[], crossColumns: ICrossColumn[], datas: any[]) => {
// const uniqRowData = uniqArr(rowFields, datas)
// const tempColumns = crossColumns.slice(rowFields.length + 1)
// return flatMap(uniqRowData ?? [], rowData => {
// const ret: any[] = []
// const rowDatas = datas.filter(data => rowFields.every(rowField => data[rowField.name] == rowData[rowField.name]))
// for (let i = 0; i < valueFields.length; i++) {
// const { name, label, pristine } = valueFields[i]
// const { isPercentage, calculatedField } = pristine
// const isRate = isPercentage === true && (calculatedField?.length ?? 0) > 0
// const obj = { ...rowData }
// obj[INDEX_NAME] = label
// for (const tempCol of tempColumns) {
// const items: any[] = rowDatas.filter(data => {
// return colFields.every((colField, index) => {
// const value = tempCol.name.split(CROSS_SPLIT_CHAR)[index]
// const dValue = data[colField.name]
// return (dValue == null ? dValue : String(dValue).replace(REG_EXP, '')) == (value == EMPTY_GROUP_VALUE ? null : value)
// })
// })
// if (items.length > 0) {
// let value = null, zSum = 0, mSum = 0
// for (const item of items) {
// if (item[name] != null) {
// if (isRate) {
// if (item[calculatedField] != null && !isNaN(+item[calculatedField])) {
// zSum += (+item[name] / 100 * + item[calculatedField])
// mSum += +(item[calculatedField])
// value = (zSum == 0 || mSum == 0) ? null : (zSum / mSum * 100)
// } else {
// value = item[name]
// }
// } else {
// if (isNaN(+item[name])) {
// value = item[name]
// } else {
// value += +item[name]
// }
// }
// }
// }
// obj[tempCol.name] = value ? getCellValue(value, valueFields[i]) : null
// } else {
// obj[tempCol.name] = null
// }
// }
// ret.push(obj)
// }
// return ret
// })
// }
//# sourceMappingURL=./renderers/Table/cross.js.map
;