UNPKG

wui-print

Version:

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

332 lines (331 loc) 13.7 kB
import { deepCopy, extractNumbers } from "../../print-designer-utils"; export default ({ printData, printConfig, formConfig, layoutConfig, printedRows, continuePrintElements } = {}) => { const formatLayoutConfig = () => { console.log("【自适应高度续打】formatLayoutConfig入参===>", { printData: deepCopy(printData), printConfig: deepCopy(printConfig), formConfig: deepCopy(formConfig), layoutConfig: deepCopy(layoutConfig), printedRows, continuePrintElements }); let continueDetails = _getContinueDetails(); console.log("【自适应高度续打】获取续打信息====>continueDetails", continueDetails); if (!continueDetails.continueState || !continueDetails.dataField) { return layoutConfig; } printData[continueDetails.dataField] = _formatTableData({ continueDetails }); let continueAllData = printData[continueDetails.dataField]; if (!continueAllData && printedRows <= 0) { // 没有续打数据 之前未打印数据 return layoutConfig; } if (!continueAllData && printedRows > 0) { // 没有续打数据 之前已打印数据 return []; } console.log("【自适应高度续打】处理后的数据====>continueAllData", deepCopy(continueAllData)); let continueSplitData = _splitContinueAllData({ continueAllData, pageMaxRow: continueDetails.pageMaxRow, continueBeforeRowCount: continueDetails.continueBeforeRowCount }); console.log("【自适应高度续打】拆分数据====>continueSplitData", continueSplitData); let oldLayoutConfig = _filterLayoutConfig(); let newLayoutConfig = []; if (printedRows.length <= 0) { // 不是续打 continueSplitData.forEach((item, index) => { let currentPage = continueDetails.continueBeginPageNum + index; let pageLayoutConfig = _createPageLayoutConfig({ oldLayoutConfig, continueDetails, pageComplateTableData: item, currentPage: currentPage, pageCount: continueSplitData.length }); newLayoutConfig.push(...pageLayoutConfig); }); } if (printedRows.length > 0) { // 是续打 continueSplitData.forEach((item, index) => { let currentPage = continueDetails.continueBeginPageNum + index; let pageLayoutConfig = _createContinuePageLayoutConfig({ oldLayoutConfig, continueDetails, pageComplateTableData: item, currentPage: currentPage, pageCount: continueDetails.continueBeginPageNum + continueSplitData.length - 1, continueBeforeRowCount: continueDetails.continueBeforeRowCount }); newLayoutConfig.push(...pageLayoutConfig); }); } if (!newLayoutConfig) { newLayoutConfig = []; } return newLayoutConfig; }; function _createPageLayoutConfig({ oldLayoutConfig, continueDetails, pageComplateTableData, currentPage, pageCount } = {}) { let pageLayoutConfig = deepCopy(oldLayoutConfig); let newField = `_continue_${continueDetails.dataField}_${currentPage}`; let nowContinueConfig = { type: "auto_default", currentPage, blankRowCount: 0 }; pageLayoutConfig[continueDetails.layoutConfigIndex].props.field = newField; printData[newField] = deepCopy(pageComplateTableData); // 最后一页还有空白行 if (currentPage == pageCount && pageComplateTableData.length < continueDetails.pageMaxRow) { nowContinueConfig.blankRowCount = continueDetails.pageMaxRow - pageComplateTableData.length; nowContinueConfig.type = "auto_afterBlankRow"; } pageLayoutConfig[continueDetails.layoutConfigIndex]._continueConfig = nowContinueConfig; if (pageCount > 1) { if (currentPage > 1) { // 添加分页上边距 pageLayoutConfig.unshift({ type: "pageTop" }); } if (currentPage < pageCount) { // 添加分页下边距 pageLayoutConfig.push({ type: "pageBottom" }); // 添加分页 pageLayoutConfig.push({ type: "pageBreak" }); } } return pageLayoutConfig; } function _createContinuePageLayoutConfig({ oldLayoutConfig, continueDetails, pageComplateTableData, currentPage, pageCount, continueBeforeRowCount } = {}) { let continuePageLayoutConfig = deepCopy(oldLayoutConfig); let newField = `_continue_${continueDetails.dataField}_${currentPage}`; continuePageLayoutConfig[continueDetails.layoutConfigIndex].props.field = newField; printData[newField] = deepCopy(pageComplateTableData); // _continueConfig先赋值 continuePageLayoutConfig[continueDetails.layoutConfigIndex]._continueConfig = { type: "auto_default", currentPage, blankRowCount: 0 }; if (currentPage === continueDetails.continueBeginPageNum && continueBeforeRowCount > 0) { // 第一页是续打页 continuePageLayoutConfig.forEach((item, index) => { if (index < continueDetails.layoutConfigIndex) { item._continueConfig = { isBefore: true }; } else if (index > continueDetails.layoutConfigIndex) { item._continueConfig = { isAfter: true }; } }); continuePageLayoutConfig[continueDetails.layoutConfigIndex]._continueConfig = { type: "auto_continuingContent", currentPage, continueBeforeRowCount: continueBeforeRowCount, blankRowCount: 0 }; } else if ( pageCount > continueDetails.continueBeginPageNum && currentPage == pageCount && pageComplateTableData.length < continueDetails.pageMaxRow ) { // 最后一页还有空白行 continuePageLayoutConfig[continueDetails.layoutConfigIndex]._continueConfig = { type: "auto_afterBlankRow", currentPage, blankRowCount: continueDetails.pageMaxRow - pageComplateTableData.length }; } if (currentPage > continueDetails.continueBeginPageNum) { // 添加分页上边距 continuePageLayoutConfig.unshift({ type: "pageTop" }); } if (currentPage < pageCount) { // 添加分页下边距 continuePageLayoutConfig.push({ type: "pageBottom" }); // 添加分页 continuePageLayoutConfig.push({ type: "pageBreak" }); } return continuePageLayoutConfig; } function _filterLayoutConfig() { // 只保留第一个续打表格 let newLayoutConfig = []; let continueConfigItem = false; layoutConfig.forEach((item, index) => { let nowProps = !!item.props ? item.props : {}; if (item.type == "complexTable" && !!nowProps.canContinue && !!continueConfigItem) { return; } if (item.type == "complexTable" && !!nowProps.canContinue) { continueConfigItem = item; } newLayoutConfig.push(item); }); return newLayoutConfig; } function _getContinueDetails() { let continueDetails = { continueState: false }; if (!layoutConfig || layoutConfig.length <= 0) { return continueDetails; } let continueConfigItem = false; layoutConfig.forEach((item, index) => { if (!!continueConfigItem) { return; } let nowProps = !!item.props ? item.props : {}; if (item.type == "complexTable" && !!nowProps.canContinue) { continueConfigItem = item; continueDetails.layoutConfigIndex = index; } }); if (!continueConfigItem) { return continueDetails; } let continueConfigItemProps = !!continueConfigItem.props ? continueConfigItem.props : {}; let continueConfigItemStyle = !!continueConfigItem.style ? continueConfigItem.style : {}; continueDetails.continueState = true; continueDetails.continueConfigItem = deepCopy(continueConfigItem); continueDetails.dataField = !!continueConfigItemProps.field ? continueConfigItemProps.field : ""; continueDetails.pageMaxRow = !!continueConfigItemProps.perPageMaxRow ? continueConfigItemProps.perPageMaxRow : 0; continueDetails.contentRowHeight = !!continueConfigItemProps.contentRowHeight ? continueConfigItemProps.contentRowHeight : 0; if (!continueConfigItemStyle.contentCell_borderWidth && !!continueConfigItemStyle.contentCell_borderTopWidth) { continueDetails.contentRowBorderTop = extractNumbers(continueConfigItemStyle.contentCell_borderTopWidth); } else if (!!continueConfigItemStyle.contentCell_borderWidth) { continueDetails.contentRowBorderTop = extractNumbers(continueConfigItemStyle.contentCell_borderWidth); } else { continueDetails.contentRowBorderTop = 0; } if (!continueConfigItemStyle.contentCell_borderWidth && !!continueConfigItemStyle.contentCell_borderBottomWidth) { continueDetails.contentRowBorderBottom = extractNumbers(continueConfigItemStyle.contentCell_borderBottomWidth); } else if (!!continueConfigItemStyle.contentCell_borderWidth) { continueDetails.contentRowBorderBottom = extractNumbers(continueConfigItemStyle.contentCell_borderWidth); } else { continueDetails.contentRowBorderBottom = 0; } continueDetails.continueBeginPageNum = 1; //页码从1开始,1代表第一页 continueDetails.continueBeforeRowCount = 0; //_printDataTotal内部逻辑使用 //最后一行数据如果是多行,这一行将在下一页显示 continueDetails._printDataTotal = 0; return continueDetails; } function _formatTableData({ continueDetails } = {}) { let oldTableData = []; let tempTableData = []; let tableDataGroup = []; if (!!printData[continueDetails.dataField]) { oldTableData = deepCopy(printData[continueDetails.dataField]); } if (!printedRows) { printedRows = []; } tempTableData.push(...printedRows, ...oldTableData); tempTableData.forEach((item, index) => { let groupItem = []; let excessRows = _getContentTrExcessRows({ continueDetails, index, rowData: item }); item._autoHeightMode_excessRowsLength = excessRows.length; groupItem.push(item, ...excessRows); tableDataGroup.push(groupItem); }); let newTableData = []; let nowPrintedRowCount = 0; tableDataGroup.forEach((groupItem, groupIndex) => { if (groupIndex < printedRows.length) { nowPrintedRowCount += groupItem.length; return; } if (groupIndex.length > 1) { groupItem[0]._autoHeightMode_type = "excessContentRow"; } else { groupItem[0]._autoHeightMode_type = "notExcess"; } newTableData.push(...groupItem); }); continueDetails.continueBeforeRowCount = nowPrintedRowCount % continueDetails.pageMaxRow; if (continueDetails.continueBeforeRowCount === 0) { continueDetails.continueBeginPageNum = nowPrintedRowCount / continueDetails.pageMaxRow + 1; } else { continueDetails.continueBeginPageNum = Math.ceil(nowPrintedRowCount / continueDetails.pageMaxRow); } return newTableData; } function _getContentTrExcessRows({ continueDetails, index, rowData }) { // 获取超出行数 const trElement = continuePrintElements.querySelector(`[content-index="${index}"]`); let trContentMinHeight = trElement.clientHeight - continueDetails.contentRowBorderTop - continueDetails.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 - continueDetails.contentRowHeight) / continueDetails.contentRowHeight; excessRowsLength = Math.ceil(excessRowsLength); continueDetails._printDataTotal += excessRowsLength + 1; // 剩余行数 let pageSurplus = continueDetails.pageMaxRow - (continueDetails._printDataTotal % continueDetails.pageMaxRow); if (pageSurplus >= 0 && pageSurplus <= 1) { excessRowsLength += 1; } for (let i = 0; i < excessRowsLength; i++) { let newRowData = deepCopy(rowData); newRowData._autoHeightMode_type = "excessBlankRow"; newRowData._autoHeightMode_excessIndex = i; newRowData._autoHeightMode_excessRowsLength = excessRowsLength; if (index < printedRows.length) { newRowData._autoHeightMode_isPrinted = true; } else { newRowData._autoHeightMode_isPrinted = false; } excessRows.push(newRowData); } return excessRows; } function _splitContinueAllData({ continueAllData, pageMaxRow, continueBeforeRowCount }) { let result = []; let newAllData = continueAllData; if (printedRows.length > 0) { let endIndex = pageMaxRow - continueBeforeRowCount; let firstContinueData = continueAllData.slice(0, endIndex); result.push(firstContinueData); newAllData = continueAllData.slice(endIndex, continueAllData.length); } for (let i = 0; i < newAllData.length; i += pageMaxRow) { result.push(newAllData.slice(i, i + pageMaxRow)); } return result; } return { formatLayoutConfig }; };