UNPKG

wui-print

Version:

前端打印插件,包含打印设计器、打印表单、打印API

287 lines (285 loc) 11.8 kB
import { deepCopy, extractNumbers } from "../../print-designer-utils"; export default ({ printData, printConfig, formConfig, layoutConfig, tablePaginationElements } = {}) => { const formatLayoutConfig = () => { console.log("【复杂表格分页】formatLayoutConfig入参===>", { printData: deepCopy(printData), printConfig: deepCopy(printConfig), formConfig: deepCopy(formConfig), layoutConfig: deepCopy(layoutConfig), tablePaginationElements }); let paginationDetails = _getPaginationDetails(); console.log("【复杂表格分页】获取续打信息====>paginationDetails", paginationDetails); if (!paginationDetails.paginationState || !paginationDetails.dataField) { return layoutConfig; } printData[paginationDetails.dataField] = _formatTableData({ paginationDetails }); let continueAllData = printData[paginationDetails.dataField]; console.log("【复杂表格分页】处理后的数据====>continueAllData", deepCopy(continueAllData)); let continueSplitData = _splitPaginationAllData({ continueAllData, pageMaxRow: paginationDetails.pageMaxRow }); console.log("【复杂表格分页】拆分数据====>continueSplitData", continueSplitData); let oldLayoutConfig = _filterLayoutConfig(); let layoutConfigExcludingLastPage = _formatLayoutConfigExcludingLastPage({ oldLayoutConfig }); let newLayoutConfig = []; continueSplitData.forEach((item, index) => { let currentPage = index + 1; let pageLayoutConfig = _createPageLayoutConfig({ oldLayoutConfig, layoutConfigExcludingLastPage, paginationDetails, pageComplateTableData: item, currentPage: currentPage, pageCount: continueSplitData.length }); newLayoutConfig.push(...pageLayoutConfig); }); return newLayoutConfig; }; function _createPageLayoutConfig({ oldLayoutConfig, layoutConfigExcludingLastPage, paginationDetails, pageComplateTableData, currentPage, pageCount } = {}) { let pageLayoutConfig; if (currentPage < pageCount) { // 不是最后一页 需要过滤在最后一页显示的元素 pageLayoutConfig = deepCopy(layoutConfigExcludingLastPage); } else { pageLayoutConfig = deepCopy(oldLayoutConfig); } let newField = `_pagination_${paginationDetails.dataField}_${currentPage}`; let nowTablePaginationConfig = { type: "pagination_default", currentPage, blankRowCount: 0 }; let layoutConfigIndex = _getComplexTableIndex({ nowLayoutConfig: pageLayoutConfig }); pageLayoutConfig[layoutConfigIndex].props.field = newField; printData[newField] = deepCopy(pageComplateTableData); // 最后一页还有空白行 if (currentPage == pageCount && pageComplateTableData.length < paginationDetails.pageMaxRow) { nowTablePaginationConfig.blankRowCount = paginationDetails.pageMaxRow - pageComplateTableData.length; nowTablePaginationConfig.type = "pagination_afterBlankRow"; } pageLayoutConfig[layoutConfigIndex]._tablePaginationConfig = nowTablePaginationConfig; if (pageCount > 1) { if (currentPage > 1) { // 添加分页上边距 pageLayoutConfig.unshift({ type: "pageTop" }); } if (currentPage < pageCount) { // 添加分页下边距 pageLayoutConfig.push({ type: "pageBottom" }); // 添加分页 pageLayoutConfig.push({ type: "pageBreak" }); } } return pageLayoutConfig; } function _filterLayoutConfig() { // 只保留第一个续打表格 let newLayoutConfig = []; let paginationConfigItem = false; layoutConfig.forEach((item, index) => { let nowProps = !!item.props ? item.props : {}; if (item.type == "complexTable" && !!nowProps.canContinue && !!paginationConfigItem) { return; } if (item.type == "complexTable" && !!nowProps.canContinue) { paginationConfigItem = item; } newLayoutConfig.push(item); }); return newLayoutConfig; } function _getPaginationDetails() { let paginationDetails = { paginationState: false }; if (!layoutConfig || layoutConfig.length <= 0) { return paginationDetails; } let paginationConfigItem = false; layoutConfig.forEach((item, index) => { if (!!paginationConfigItem) { return; } let nowProps = !!item.props ? item.props : {}; if (item.type == "complexTable" && !!nowProps.isPaginationMode) { paginationConfigItem = item; } }); if (!paginationConfigItem) { return paginationDetails; } let paginationConfigItemProps = !!paginationConfigItem.props ? paginationConfigItem.props : {}; let paginationConfigItemStyle = !!paginationConfigItem.style ? paginationConfigItem.style : {}; paginationDetails.paginationState = true; paginationDetails.paginationConfigItem = deepCopy(paginationConfigItem); paginationDetails.dataField = !!paginationConfigItemProps.field ? paginationConfigItemProps.field : ""; paginationDetails.pageMaxRow = !!paginationConfigItemProps.perPageMaxRow ? paginationConfigItemProps.perPageMaxRow : 0; paginationDetails.contentRowHeight = !!paginationConfigItemProps.contentRowHeight ? paginationConfigItemProps.contentRowHeight : 0; if (!paginationConfigItemStyle.contentCell_borderWidth && !!paginationConfigItemStyle.contentCell_borderTopWidth) { paginationDetails.contentRowBorderTop = extractNumbers(paginationConfigItemStyle.contentCell_borderTopWidth); } else if (!!paginationConfigItemStyle.contentCell_borderWidth) { paginationDetails.contentRowBorderTop = extractNumbers(paginationConfigItemStyle.contentCell_borderWidth); } else { paginationDetails.contentRowBorderTop = 0; } if (!paginationConfigItemStyle.contentCell_borderWidth && !!paginationConfigItemStyle.contentCell_borderBottomWidth) { paginationDetails.contentRowBorderBottom = extractNumbers(paginationConfigItemStyle.contentCell_borderBottomWidth); } else if (!!paginationConfigItemStyle.contentCell_borderWidth) { paginationDetails.contentRowBorderBottom = extractNumbers(paginationConfigItemStyle.contentCell_borderWidth); } else { paginationDetails.contentRowBorderBottom = 0; } // 页尾向上合并行数 if (!!paginationConfigItemProps.mergedFooterRowCount || paginationConfigItemProps.mergedFooterRowCount === 0) { paginationDetails.mergedFooterRowCount = paginationConfigItemProps.mergedFooterRowCount; } else { paginationDetails.mergedFooterRowCount = 1; } //_printDataTotal内部逻辑使用 paginationDetails._printDataTotal = 0; return paginationDetails; } function _formatTableData({ paginationDetails } = {}) { let oldTableData = []; let tempTableData = []; let tableDataGroup = []; if (!!printData[paginationDetails.dataField]) { oldTableData = deepCopy(printData[paginationDetails.dataField]); } tempTableData.push(...oldTableData); tempTableData.forEach((item, index) => { let groupItem = []; let excessRows = _getContentTrExcessRows({ paginationDetails, index, rowData: item }); item._paginationMode_excessRowsLength = excessRows.length; groupItem.push(item, ...excessRows); tableDataGroup.push(groupItem); }); let newTableData = []; tableDataGroup.forEach((groupItem, groupIndex) => { if (groupIndex.length > 1) { groupItem[0]._paginationMode_type = "excessContentRow"; } else { groupItem[0]._paginationMode_type = "notExcess"; } newTableData.push(...groupItem); }); return newTableData; } function _getContentTrExcessRows({ paginationDetails, index, rowData }) { // 获取超出行数 const trElement = tablePaginationElements.querySelector(`[content-index="${index}"]`); let trContentMinHeight = trElement.clientHeight - paginationDetails.contentRowBorderTop - paginationDetails.contentRowBorderBottom; let trContentHeight = trContentMinHeight; let contentTextElements = trElement.querySelectorAll(".content-text"); for (let i = 0; i < contentTextElements.length; i++) { let element = contentTextElements[i]; if (element.offsetHeight > trContentHeight) { trContentHeight = element.offsetHeight; } } let excessRows = []; let excessRowsLength = (trContentHeight - paginationDetails.contentRowHeight) / paginationDetails.contentRowHeight; excessRowsLength = Math.ceil(excessRowsLength); paginationDetails._printDataTotal += excessRowsLength + 1; // 剩余行数 let pageSurplus = paginationDetails.pageMaxRow - (paginationDetails._printDataTotal % paginationDetails.pageMaxRow); if (pageSurplus >= 0 && pageSurplus <= paginationDetails.mergedFooterRowCount) { excessRowsLength += pageSurplus; paginationDetails._printDataTotal += pageSurplus; } for (let i = 0; i < excessRowsLength; i++) { let newRowData = deepCopy(rowData); newRowData._paginationMode_type = "excessBlankRow"; newRowData._paginationMode_excessIndex = i; newRowData._paginationMode_excessRowsLength = excessRowsLength; excessRows.push(newRowData); } return excessRows; } function _splitPaginationAllData({ continueAllData, pageMaxRow, continueBeforeRowCount }) { let result = []; let newAllData = continueAllData; for (let i = 0; i < newAllData.length; i += pageMaxRow) { result.push(newAllData.slice(i, i + pageMaxRow)); } return result; } function _formatLayoutConfigExcludingLastPage({ oldLayoutConfig }) { // 排除最后一页显示的元素 let newLayoutConfig = []; let layoutConfigCopy = deepCopy(oldLayoutConfig); layoutConfigCopy.forEach((item, index) => { if (item.type == "grid") { item.children.forEach((gridItem, gridItemIndex) => { let gridItemCopy = deepCopy(gridItem); gridItem.children = []; gridItemCopy.children.forEach((componentItem, componentIndex) => { if (!__getExcludingState(componentItem)) { gridItem.children.push(componentItem); } }); }); newLayoutConfig.push(item); } else if (item.type == "tableLayout") { let itemCopy = deepCopy(item); item.children = []; itemCopy.children.forEach((componentItem, componentIndex) => { if (!__getExcludingState(componentItem)) { item.children.push(componentItem); } }); newLayoutConfig.push(item); } else if (item.type == "complexTable") { newLayoutConfig.push(item); } else { if (!__getExcludingState(item)) { newLayoutConfig.push(item); } } }); function __getExcludingState(componentItem) { if (!componentItem.props) { return false; } if (!!componentItem.props.showOnLastPage) { return true; } return false; } return newLayoutConfig; } function _getComplexTableIndex({ nowLayoutConfig }) { let layoutConfigIndex = -1; nowLayoutConfig.forEach((item, index) => { if (layoutConfigIndex >= 0) { return; } if (item.type == "complexTable") { layoutConfigIndex = index; } }); return layoutConfigIndex; } return { formatLayoutConfig }; };