wui-print
Version:
前端打印插件,包含打印设计器、打印表单、打印API
332 lines (331 loc) • 13.7 kB
JavaScript
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
};
};