function createTemplate(hiprintTemplateMap,dataList,pageWidth,pageHeight){ // A4纸张大小 const { height, width } = { width: pageWidth, height: pageHeight } // 70:小模板的高 105:小模板的宽 // 垂直方向, 可以容纳多少个模板 const ver = parseInt(height / hiprintTemplateMap.panels[0].height); // 水平方向, 可以容纳多少个模板 const hor = parseInt(width / hiprintTemplateMap.panels[0].width); // 新的模板,宽高单位是 mm let template = { panels: [ { index: 0, width, height, // 我们实际需要打印的元素,都存放在这个数组里 printElements: [], }, ], } // 记录整体个数 let limitCount = 0; // top: 记录 打印元素 top值(注意单位); 提示:相当于记录上次填充到哪儿了 for (let v = 1, top = 0; v <= ver; v++) { // left: 记录 打印元素 left值 for (let h = 1, left = 0; h <= hor; h++) { // 这里就需要获取到小模板内的所有打印元素了,然后更新它的定位 // 为了更好理解, 我这里拆分来写 // 获取 模板 的 打印元素 let printElements1 = hiprintTemplateMap.panels[0].printElements; const printElements2 = printElements1.map((items) => { const item = JSON.parse(JSON.stringify(items)) // 偏移量计算 item.options.top += top item.options.left += left // !! 元素的字段名 肯定不能重复呀! 所以需要特殊处理!!! if (item.options.field) { // 及变成 字段名 + 第 v 行 第 h 列 // 如: qrcode 变成 qrcode_1_1 (第 1 行 的 第 1 列) item.options.field += `_${v}_${h}` } return item; }) template.panels[0].printElements = template.panels[0].printElements.concat(printElements2) // 3.3. 计算 下一列 模板的 left 值 (单位转换) left += hinnn.mm.toPt(hiprintTemplateMap.panels[0].width) // 记录整体个数 limitCount++ } // 3.4 计算下一行 模板的 top 值 (单位转换) top += hinnn.mm.toPt(hiprintTemplateMap.panels[0].height) } //打印data生成 let printData = []; // 清空数据 const len = dataList.length; let keys = Object.keys(dataList[0]); // 这里假设 每个模板数据格式一样, 取对象的 key // 需要多少个这样的面板(批量打印), 才能打印全部的数据 let needPanel = Math.ceil(len / limitCount); // curIndex:记录已经处理了多少数据 for (let p = 0, curIndex = 0; p < needPanel; p++) { // 当前面板的打印数据 const panelPrintData = {} for (let v = 1; v <= ver; v++) { for (let h = 1; h <= hor; h++) { // 数据已处理完 if (curIndex >= len) { break; } keys.forEach((key) => { panelPrintData[`${key}_${v}_${h}`] = dataList[curIndex][key]; }); curIndex++; } } printData.push(panelPrintData); } return { template, printData } } export {createTemplate}