刘光辉
5 小时以前 cf11e63b659afcc9792ab3e395f1b45d844431a8
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
111
112
113
114
115
116
117
118
import { describe, expect, it } from 'vitest';
 
import { applyMergedBatchPrintLayout, getMergedBatchPrintTableStyle, mergePrintDataSet } from './printData';
 
describe('mergePrintDataSet', () => {
  it('merges the selected data set and keeps the first record metadata', () => {
    const result = mergePrintDataSet(
      [
        { orderList: [{ id: '1', name: '记录1' }], systemInfo: { printer: '管理员' }, title: '批量清单' },
        { orderList: [{ id: '2', name: '记录2' }], systemInfo: { printer: '管理员' }, title: '忽略的标题' },
      ],
      'orderList',
    );
 
    expect(result).toEqual([
      {
        orderList: [
          { id: '1', name: '记录1' },
          { id: '2', name: '记录2' },
        ],
        systemInfo: { printer: '管理员' },
        title: '批量清单',
      },
    ]);
  });
 
  it('ignores missing, non-array and invalid data set values', () => {
    const result = mergePrintDataSet([{ orderList: [{ id: '1' }] }, null, {}, { orderList: 'invalid' }], 'orderList');
 
    expect(result).toEqual([{ orderList: [{ id: '1' }] }]);
  });
 
  it('keeps the original print records when no data set is specified', () => {
    const printDataList = [{ id: '1' }, null, { id: '2' }];
 
    expect(mergePrintDataSet(printDataList, '')).toEqual(printDataList);
  });
 
  it('does not throw when a custom script passes an invalid data set name', () => {
    const printDataList = [{ id: '1' }];
 
    expect(mergePrintDataSet(printDataList, null as unknown as string)).toEqual(printDataList);
  });
});
 
describe('applyMergedBatchPrintLayout', () => {
  it('reserves top spacing for table continuation pages', () => {
    const template = { panels: [{ paperHeader: 0 }, { paperHeader: 20 }] };
 
    expect(applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList' })).toEqual({
      panels: [{ paperHeader: 15 }, { paperHeader: 20 }],
    });
  });
 
  it('supports a custom continuation page top spacing', () => {
    const template = { panels: [{ paperHeader: 0 }] };
 
    expect(applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList', pageTopSpacing: 24 })).toEqual({
      panels: [{ paperHeader: 24 }],
    });
  });
 
  it('reserves the footer area on every page while preserving larger existing margins', () => {
    const template: any = {
      panels: [
        {
          height: 297,
          paperHeader: 30,
          paperFooter: 840,
          firstPaperFooter: 820,
          evenPaperFooter: 835,
          oddPaperFooter: 810,
          lastPaperFooter: 800,
        },
      ],
    };
 
    applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList' });
 
    const panel = template.panels[0];
    expect(panel.paperHeader).toBe(30);
    expect(panel.paperFooter).toBeCloseTo(297 * (72 / 25.4) - 15);
    expect(panel.firstPaperFooter).toBe(820);
    expect(panel.evenPaperFooter).toBeCloseTo(297 * (72 / 25.4) - 15);
    expect(panel.oddPaperFooter).toBe(810);
    expect(panel.lastPaperFooter).toBe(800);
    expect(panel.paperFooter - panel.paperHeader).toBeCloseTo(297 * (72 / 25.4) - 45);
  });
 
  it('supports custom bottom spacing when the template has no footer line', () => {
    const template: any = { panels: [{ height: 297, paperHeader: 0 }] };
 
    applyMergedBatchPrintLayout(template, { mergeDataSet: 'orderList', pageBottomSpacing: 24 });
 
    expect(template.panels[0].height).toBe(297);
    expect(template.panels[0].paperHeader).toBe(15);
    expect(template.panels[0].paperFooter).toBeCloseTo(297 * (72 / 25.4) - 24);
  });
 
  it('does not change regular print templates', () => {
    const template = { panels: [{ paperHeader: 0 }] };
 
    expect(applyMergedBatchPrintLayout(template, {})).toEqual({ panels: [{ paperHeader: 0 }] });
  });
});
 
describe('getMergedBatchPrintTableStyle', () => {
  it('creates scoped wrapping and automatic row height styles', () => {
    const style = getMergedBatchPrintTableStyle('body.merged-print');
 
    expect(style).toContain('body.merged-print .hiprint-printElement-tableTarget thead td');
    expect(style).toContain('body.merged-print .hiprint-printElement-tableTarget tbody td');
    expect(style).toContain('table-layout: fixed !important');
    expect(style).toContain('height: auto !important');
    expect(style).toContain('overflow-wrap: anywhere !important');
    expect(style).toContain('white-space: normal !important');
  });
});