fastlion-amis
Version:
一种MIS页面生成工具
514 lines (513 loc) • 27 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.staticList = void 0;
var tslib_1 = require("tslib");
/**
* 统计组件
*/
var antd_1 = require("antd");
var lodash_1 = require("lodash");
var react_1 = tslib_1.__importStar(require("react"));
var helper_1 = require("../../utils/helper");
var tools_1 = require("../../utils/shell/tools");
var commonSelect_1 = require("./commonSelect");
var components_1 = require("../../components");
var icons_1 = require("../../components/icons");
require("./dataStatic.scss");
var DragModal_1 = tslib_1.__importDefault(require("../../components/DragModal"));
var commonTableFunction_1 = require("../../store/utils/commonTableFunction");
exports.staticList = [
{
title: '合计值',
value: 'sum',
icon: '#icon-toolsum'
},
{
title: '平均值',
value: 'avg',
icon: '#icon-toolAvg'
},
{
title: '最大值',
value: 'max',
icon: '#icon-toolmax'
},
{
title: '最小值',
value: 'min',
icon: '#icon-toolmin'
},
{
title: '标准差',
value: 'std_v',
icon: '#icon-toolstandardDeviation'
},
{
title: '空值数',
value: 'count_null',
icon: '#icon-toolnull'
},
{
title: '百分比',
value: 'per',
icon: '#icon-toolpercent'
},
{
title: '组内百分比',
value: 'g_per',
icon: '#icon-toolgroupPercent1'
},
];
//统计字段类型,数字(11),货币,百分比(18), 进度条(16)
var dataTypeArr = ['number', 'static-number', 'input-number', 'progress', 'static-progress'];
//分组字段类型支持所有类型,除了15,17,20,21,22,34,35,38,39
var ungroupDataTypeArr = ['html', 'static-html', 'input-rich-text', 'lion-upload', 'link', 'input-table-field', 'input-table-dynamic'];
var DataStatic = function (props) {
var action = props.action, columns = props.columns, _a = props.data, items = _a.items, selectedItems = _a.selectedItems, itemRaws = _a.itemRaws, loadDataOnce = props.loadDataOnce, crudTitle = props.crudTitle, originHeaderToolbar = props.originHeaderToolbar, name = props.name, isStatic = props.isStatic, handleDealData = props.handleDealData, staticRecords = props.staticRecords;
var _b = (0, react_1.useState)(false), visible = _b[0], setVisible = _b[1];
var _c = (0, react_1.useState)(false), loading = _c[0], setLoading = _c[1];
var _d = (0, react_1.useState)([]), groupFields = _d[0], setGroupFields = _d[1]; //分组字段列表
var _e = (0, react_1.useState)([]), groupSelect = _e[0], setGroupSelect = _e[1]; //分组字段选中数据
var _f = (0, react_1.useState)([]), staticFields = _f[0], setStaticFields = _f[1]; //统计字段列表
var _g = (0, react_1.useState)([]), staticSelect = _g[0], setStaticSelect = _g[1]; //统计字段选中数据
var _h = (0, react_1.useState)(['sum']), staticContent = _h[0], setStaticContent = _h[1]; //统计内容选中数据
var _j = (0, react_1.useState)('present'), dataArea = _j[0], setDataArea = _j[1]; //数据范围
var hasInit = (0, react_1.useRef)(false);
//统计内容的置灰情况
var _k = (0, react_1.useState)({ "g_per": true, "per": true }), btnStatus = _k[0], setBtnStatus = _k[1];
var workRef = (0, react_1.useRef)();
(0, react_1.useEffect)(function () {
workRef.current = new Worker('./public/worker/dataStatics.js');
return function () {
var _a;
(_a = workRef.current) === null || _a === void 0 ? void 0 : _a.terminate();
};
}, []);
(0, react_1.useEffect)(function () {
mountHandle();
}, [columns]);
(0, react_1.useEffect)(function () {
var _a;
if (visible) {
if (!hasInit.current) {
var defaultValueStr = localStorage.getItem('static-' + name);
if (!(0, lodash_1.isNil)(defaultValueStr)) {
var defaultValues = JSON.parse(defaultValueStr);
setGroupSelect(defaultValues.groupSelect);
setStaticSelect(defaultValues.staticSelect);
setStaticContent(defaultValues.staticContent);
setDataArea(defaultValues.dataArea);
handleContent(((_a = defaultValues.groupSelect) === null || _a === void 0 ? void 0 : _a.length) > 0);
}
}
hasInit.current = true;
}
}, [visible]);
var createSchema = function (tableColList, tableData) {
return ({
type: "crud",
data: {
total: tableData.length,
items: tableData
},
aliasTitle: crudTitle ? crudTitle + '-统计' : '统计',
loadDataOnce: true,
"name": "".concat(name || (0, helper_1.uuid)(), "_total"),
"affixHeader": true,
"columns": tableColList,
"filterTogglable": false,
source: "${items}",
"autoFillHeight": true,
"multiple": true,
"setBorder": true,
"keepItemSelectionOnPageChange": false,
"syncLocation": false,
"headerToolbar": (0, helper_1.isMobile)() ?
[] : tslib_1.__spreadArray([
{
"redDot": false,
"actionType": "export",
"type": "action",
"name": "default_export",
"label": "导出",
"icon": "#icon-tooltool_download",
"tooltip": "默认导出",
"align": "right",
"close": true,
"tooltipPlacement": "top"
}
], (groupSelect.length ? originHeaderToolbar.filter(function (item) {
return ['tool-bar-action', 'data-statics', 'data-cross', 'data-chart', 'data-analysis'].includes(item.type);
})
: []), true),
"checkOnItemClick": false,
"showIndex": false,
"header": [],
"footer": [],
footerToolbar: [
{
"type": "pagination",
"align": "right"
},
{
"type": "switch-per-page",
"align": "right"
},
{
"type": "statistics",
"align": "right"
}
],
isStatic: true,
perPage: 100,
perPageAvailable: [100, 200, 500, 1000]
});
};
var handleDefaultValue = function () {
var _a;
var defaultValueStr = localStorage.getItem('static-' + name);
if (!(0, lodash_1.isNil)(defaultValueStr)) {
var defaultValues = JSON.parse(defaultValueStr);
setGroupSelect(defaultValues.groupSelect);
setStaticSelect(defaultValues.staticSelect);
setStaticContent(defaultValues.staticContent);
setDataArea(defaultValues.dataArea);
handleContent(((_a = defaultValues.groupSelect) === null || _a === void 0 ? void 0 : _a.length) > 0);
}
else {
var list_1 = [];
columns.forEach(function (item) {
if (item.pristine.isNumerical || (item === null || item === void 0 ? void 0 : item.isNumerical))
list_1.push(item.name);
});
setStaticSelect(list_1);
}
};
//根据column 数据进行分组 和 统计列分类
var mountHandle = function () {
var groupFileds = [];
var statisticsFields = [];
columns.forEach(function (col) {
var type = col.type, label = col.label, name = col.name;
var obj = Object.assign({}, col, {
title: (0, commonTableFunction_1.getColumnShowLabel)(col),
value: name
});
if (dataTypeArr.includes(type)) {
statisticsFields.push(obj);
}
if (!ungroupDataTypeArr.includes(type)) {
groupFileds.push(obj);
}
});
setGroupFields(groupFileds);
setStaticFields(statisticsFields);
};
var handleClose = function () {
setGroupSelect([]);
setStaticSelect([]);
setStaticContent(['sum']);
setDataArea('present');
setBtnStatus({
"sum": false,
"g_per": true,
"per": true,
"avg": false,
"max": false,
"min": false,
"std_v": false,
"count_null": false
});
};
var handleAction = function () {
setVisible(true);
};
var renderButton = function () {
var _a;
return react_1.default.createElement(components_1.Button, { onClick: handleAction },
react_1.default.createElement(icons_1.Icon, { icon: (_a = action === null || action === void 0 ? void 0 : action.icon) !== null && _a !== void 0 ? _a : "#icon-tooltool_autowidth", className: "icon", symbol: true }), action === null || action === void 0 ? void 0 :
action.label);
};
var handleGroupSelectsChange = function (value) {
setGroupSelect(value);
setStaticContent(['sum']);
handleContent((value === null || value === void 0 ? void 0 : value.length) > 0);
setStaticFields(staticFields.map(function (item) { return (tslib_1.__assign(tslib_1.__assign({}, item), { disabled: value.includes(item.value) })); }));
};
var handleStaticSelectsChange = function (value) {
setStaticSelect(value);
setGroupFields(groupFields.map(function (item) { return (tslib_1.__assign(tslib_1.__assign({}, item), { disabled: value.includes(item.value) })); }));
};
// 统计内容字段变化联动置灰情况
var handleStaticTypeChange = function (value) {
setStaticContent(value);
handleContent((groupSelect === null || groupSelect === void 0 ? void 0 : groupSelect.length) > 0);
};
// 置灰情况变化规则
var handleContent = function (hasGroupFields) {
setBtnStatus({
"sum": false,
"g_per": !hasGroupFields,
"per": !hasGroupFields,
"avg": false,
"max": false,
"min": false,
"std_v": hasGroupFields,
"count_null": hasGroupFields
});
};
//统计校验
var check = function (param) {
var selectedContent = param.selectedContent, selectedGroupingFiledData = param.selectedGroupingFiledData, selectedStatisticalFieldData = param.selectedStatisticalFieldData;
if (tools_1.tools.isEmpty(selectedGroupingFiledData) && tools_1.tools.isEmpty(selectedStatisticalFieldData)) {
return antd_1.message.warn({
content: '分组字段和统计字段至少选择一项'
});
}
if (tools_1.tools.isEmpty(param.dataArea)) {
return antd_1.message.warn({
content: '请选择范围'
});
}
if (tools_1.tools.isEmpty(selectedContent)) {
return antd_1.message.warn({
content: '内容不能为空'
});
}
if (selectedGroupingFiledData.length
&& selectedGroupingFiledData.find(function (item) { return selectedStatisticalFieldData.includes(item); })) {
return antd_1.message.warn({
content: '分组字段不能和统计字段相同'
});
}
return true;
};
//开启新线程计算数据
var buildWorkerData = function (_a) {
var calcData = _a.calcData, groupSelect = _a.groupSelect, staticSelect = _a.staticSelect, staticContent = _a.staticContent, selectedContentItem = _a.selectedContentItem, columns = _a.columns;
return new Promise(function (resolve, reject) {
if (workRef.current) {
workRef.current.postMessage({
calcData: calcData,
groupSelect: groupSelect,
staticSelect: staticSelect,
staticContent: staticContent,
selectedContentItem: selectedContentItem,
columns: columns
});
workRef.current.onmessage = function (e) {
resolve(e.data);
};
workRef.current.onmessageerror = function (e) {
reject(e.data);
};
}
else {
reject('webwork error');
}
});
};
var handleOk = function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var param, res, selectedContentItem, colList_1, selectedContentItem, colList_2, calcData;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
param = { selectedContent: staticContent, dataArea: dataArea, selectedGroupingFiledData: groupSelect, selectedStatisticalFieldData: staticSelect };
if (check(param) !== true) {
return [2 /*return*/, false];
}
if (!(dataArea === 'all' && !loadDataOnce)) return [3 /*break*/, 2];
setLoading(true);
return [4 /*yield*/, props.getAllData(tslib_1.__spreadArray(tslib_1.__spreadArray([], groupSelect, true), staticSelect, true))];
case 1:
res = _a.sent();
if (res == null) {
setLoading(false);
return [2 /*return*/];
}
if (!res.total) {
antd_1.message.info({ content: "统计结果为空" });
setLoading(false);
return [2 /*return*/];
}
selectedContentItem = exports.staticList.filter(function (item) { return staticContent.includes(item.value); });
colList_1 = getStaticPartColumns(param, columns, selectedContentItem);
buildWorkerData({
calcData: res.items,
groupSelect: groupSelect,
staticSelect: staticSelect,
staticContent: staticContent,
columns: columns,
selectedContentItem: selectedContentItem
}).then(function (resData) {
var newTableData = (0, lodash_1.orderBy)(resData, colList_1.map(function (item) { return item.name; }));
setLoading(false);
handleDealData('data-static', crudTitle ? crudTitle + '-统计' : '统计', createSchema(colList_1, newTableData), {
groupFields: groupFields,
groupSelect: groupSelect,
staticFields: staticFields,
staticSelect: staticSelect,
staticContent: staticContent,
dataArea: dataArea,
btnStatus: btnStatus
});
setVisible(false);
});
return [3 /*break*/, 3];
case 2:
if (dataArea === 'some' && !(selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.length)) {
return [2 /*return*/, antd_1.message.warn({
content: '选中数据为空'
})];
}
if (dataArea === 'present' && !(items === null || items === void 0 ? void 0 : items.length)) {
return [2 /*return*/, antd_1.message.warn({
content: '当前页数据为空'
})];
}
if (dataArea === 'all' && !(itemRaws === null || itemRaws === void 0 ? void 0 : itemRaws.length)) {
return [2 /*return*/, antd_1.message.warn({
content: '当前数据为空'
})];
}
setLoading(true);
selectedContentItem = exports.staticList.filter(function (item) { return staticContent.includes(item.value); });
colList_2 = getStaticPartColumns(param, columns, selectedContentItem);
calcData = dataArea === 'some' ? selectedItems : dataArea === 'present' ? items : itemRaws;
buildWorkerData({
calcData: calcData,
groupSelect: groupSelect,
staticSelect: staticSelect,
staticContent: staticContent,
columns: columns,
selectedContentItem: selectedContentItem
}).then(function (resData) {
// let resData
// if (groupSelect.length > 0) {
// resData = computed(calcData, groupSelect, staticSelect, staticContent,
// columns);
// } else {
// resData = computedStatic(calcData, selectedContentItem, staticSelect, columns)
// }
var newTableData = (0, lodash_1.orderBy)(resData, colList_2.map(function (item) { return item.name; }));
setLoading(false);
handleDealData('data-static', crudTitle ? crudTitle + '-统计' : '统计', createSchema(colList_2, newTableData), {
groupFields: groupFields,
groupSelect: groupSelect,
staticFields: staticFields,
staticSelect: staticSelect,
staticContent: staticContent,
dataArea: dataArea,
btnStatus: btnStatus
});
setVisible(false);
});
staticRecords(142);
_a.label = 3;
case 3: return [2 /*return*/];
}
});
}); };
//计算部分数据统计列
var getStaticPartColumns = function (param, originColList, selectedContentItem) {
var selectedStatisticalFieldData = param.selectedStatisticalFieldData, selectedGroupingFiledData = param.selectedGroupingFiledData;
var tableColsName = tslib_1.__spreadArray(tslib_1.__spreadArray([], selectedGroupingFiledData, true), selectedStatisticalFieldData, true);
var colList = [];
//没有选择分组字段
if (!selectedGroupingFiledData || selectedGroupingFiledData.length === 0) {
selectedContentItem.forEach(function (content) {
colList.push({
name: content.value,
label: content.title,
sortable: false,
isNumerical: false
});
});
var col = {
name: 'statistics',
label: '统计',
sortable: true
};
colList.unshift(col);
}
else {
colList = originColList.filter(function (col) {
return col.name && tableColsName.includes(col.name);
}).map(function (item) { return ['number', 'input-number'].includes(item.type) ? tslib_1.__assign(tslib_1.__assign({}, item), item.pristine) : item; });
colList.filter(function (col) { return (selectedStatisticalFieldData.length ? selectedStatisticalFieldData : selectedGroupingFiledData)
.includes(col.name); }).forEach(function (item) {
selectedContentItem.forEach(function (info) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
var name = item.name + info.value;
var calcField = (_a = item.calculatedField) !== null && _a !== void 0 ? _a : (_b = item.pristine) === null || _b === void 0 ? void 0 : _b.calculatedField;
colList.push({
name: name,
type: 'number',
label: item.label + info.title,
suffix: info.value === 'per' || info.value === 'g_per' ? '%' : ((_c = item.suffix) !== null && _c !== void 0 ? _c : (_d = item.pristine) === null || _d === void 0 ? void 0 : _d.suffix),
prefix: info.value === 'per' || info.value === 'g_per' ? '' : ((_e = item.prefix) !== null && _e !== void 0 ? _e : (_f = item.pristine) === null || _f === void 0 ? void 0 : _f.prefix),
kilobitSeparator: info.value === 'per' || info.value === 'g_per' ? false : ((_g = item.kilobitSeparator) !== null && _g !== void 0 ? _g : (_h = item.pristine) === null || _h === void 0 ? void 0 : _h.kilobitSeparator),
precision: ['per', 'g_per', 'std_v', 'avg'].includes(info.value) ? 2 : ((_j = item.precision) !== null && _j !== void 0 ? _j : (_k = item.pristine) === null || _k === void 0 ? void 0 : _k.precision),
isNumerical: true,
align: (_l = item.align) !== null && _l !== void 0 ? _l : (_m = item.pristine) === null || _m === void 0 ? void 0 : _m.align,
showUppercase: (_o = item.showUppercase) !== null && _o !== void 0 ? _o : (_p = item.pristine) === null || _p === void 0 ? void 0 : _p.showUppercase,
sortable: true,
isPercentage: (_q = item.isPercentage) !== null && _q !== void 0 ? _q : (_r = item.pristine) === null || _r === void 0 ? void 0 : _r.isPercentage,
calculatedField: calcField ? (info.value === 'sum' ? calcField + 'sum' : calcField) : undefined,
groupName: (_s = item.groupName) !== null && _s !== void 0 ? _s : (_t = item.pristine) === null || _t === void 0 ? void 0 : _t.groupName,
groupLabels: (_u = item.groupLabels) !== null && _u !== void 0 ? _u : (_v = item.pristine) === null || _v === void 0 ? void 0 : _v.groupLabels
});
});
});
//将统计字段剔除
colList = colList.filter(function (item) { return !selectedStatisticalFieldData.includes(item.name); });
}
return colList;
};
var setDefault = function () {
var param = { staticContent: staticContent, dataArea: dataArea, groupSelect: groupSelect, staticSelect: staticSelect };
localStorage.setItem('static-' + name, JSON.stringify(param));
antd_1.message.success('设置成功!');
};
var onReset = function () {
if (localStorage.getItem('static-' + name)) {
handleDefaultValue();
}
else {
var list_2 = [];
columns.forEach(function (item) {
if (item.pristine.isNumerical || (item === null || item === void 0 ? void 0 : item.isNumerical))
list_2.push(item.name);
});
setGroupSelect([]);
setStaticSelect(list_2);
setStaticContent(['sum']);
setDataArea('present');
}
};
var renderFooter = function () {
return react_1.default.createElement("div", { className: "statics-footer" },
react_1.default.createElement("div", null,
!isStatic && react_1.default.createElement(antd_1.Button, { loading: loading, className: "tools-set-default", onClick: setDefault }, "\u8BBE\u7F6E\u9ED8\u8BA4\u503C"),
react_1.default.createElement(antd_1.Button, { loading: loading, className: "tools-reset-default", onClick: onReset }, "\u91CD\u7F6E")),
react_1.default.createElement("div", null,
react_1.default.createElement(antd_1.Button, { loading: loading, onClick: function () { return setVisible(false); } }, "\u53D6\u6D88"),
react_1.default.createElement(antd_1.Button, { loading: loading, type: "primary", onClick: handleOk }, "\u786E\u8BA4")));
};
var renderBody = function () {
return react_1.default.createElement("div", null,
react_1.default.createElement("div", { className: "select-wrapper-group-container" },
react_1.default.createElement(commonSelect_1.SelectWrapperGroup, { label: "\u5206\u7EC4\u5B57\u6BB5", data: groupFields, onChange: handleGroupSelectsChange, defaultValue: groupSelect }),
react_1.default.createElement(commonSelect_1.SelectWrapperGroup, { label: "\u7EDF\u8BA1\u5B57\u6BB5", data: staticFields, defaultValue: staticSelect, onChange: handleStaticSelectsChange })),
react_1.default.createElement(commonSelect_1.SelectContent, { label: "\u7EDF\u8BA1\u5185\u5BB9", data: exports.staticList === null || exports.staticList === void 0 ? void 0 : exports.staticList.map(function (item) { return Object.assign({}, item, { disabled: btnStatus[item.value] || false }); }), defaultValue: staticContent, onChange: handleStaticTypeChange }),
react_1.default.createElement(commonSelect_1.DataArea, { value: dataArea, className: "static-data-area", onChange: function (e) {
setDataArea(e.target.value);
} }));
};
return (react_1.default.createElement(react_1.default.Fragment, null,
renderButton(),
!(0, helper_1.isMobile)() && visible && react_1.default.createElement(DragModal_1.default, { getContainer: props.container || document.body, zIndex: 1000, dialogVisible: visible, title: '统计', width: 540, destroyOnClose: true, centered: true, className: 'statics-modal common-modal-component', drag: true, afterClose: handleClose, footer: renderFooter(), onCancel: function () { return setVisible(false); } },
react_1.default.createElement(antd_1.Spin, { spinning: loading }, renderBody()))));
};
exports.default = DataStatic;
//# sourceMappingURL=./renderers/Table/DataStatic.js.map