廖井涛
2025-12-02 fd2ec4214c6f8456b957c3545e7d67bcdbbb9985
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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}