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: [
|
{
|
type:"auto",
|
index: 0,
|
width,
|
height,
|
paperNumberDisabled:true,
|
// 我们实际需要打印的元素,都存放在这个数组里
|
printElements: [],
|
},
|
],
|
}
|
|
// 记录整体个数
|
let limitCount = 0;
|
let size = 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;
|
})
|
//判断总个数是否超过标签数量
|
|
if(limitCount<dataList.length){
|
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)
|
}
|
if(hiprintTemplateMap.panels[0].type==="auto"){
|
template = hiprintTemplateMap
|
}
|
|
|
|
//打印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}
|