Blame view

泰额版/Food Labeling Management App UniApp/src/utils/print/testPrintCanvas.ts 4.13 KB
59e51671   “wangming”   1
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 type { RawImageDataSource } from './types/printer'
  
  export function getTestPrintCanvasSize (maxWidthDots = 384): { width: number, height: number } {
    const width = Math.max(256, Math.round(maxWidthDots || 384) - (Math.round(maxWidthDots || 384) % 8))
    const height = Math.max(220, Math.round(width * 0.62))
    return { width, height }
  }
  
  function drawRoundedRect (
    ctx: UniNamespace.CanvasContext,
    x: number,
    y: number,
    width: number,
    height: number,
    radius: number
  ) {
    const r = Math.max(0, Math.min(radius, Math.min(width, height) / 2))
    ctx.beginPath()
    ctx.moveTo(x + r, y)
    ctx.lineTo(x + width - r, y)
    ctx.arcTo(x + width, y, x + width, y + r, r)
    ctx.lineTo(x + width, y + height - r)
    ctx.arcTo(x + width, y + height, x + width - r, y + height, r)
    ctx.lineTo(x + r, y + height)
    ctx.arcTo(x, y + height, x, y + height - r, r)
    ctx.lineTo(x, y + r)
    ctx.arcTo(x, y, x + r, y, r)
    ctx.closePath()
  }
  
  export async function renderTestPrintCanvasImageData (
    canvasId: string,
    componentInstance: any,
    size: { width: number, height: number }
  ): Promise<RawImageDataSource> {
    const width = Math.max(8, size.width - (size.width % 8))
    const height = Math.max(1, size.height)
    const scale = width / 800
    const ctx = uni.createCanvasContext(canvasId, componentInstance)
  
    ctx.setFillStyle('#ffffff')
    ctx.fillRect(0, 0, width, height)
  
    drawRoundedRect(ctx, 10 * scale, 10 * scale, width - 20 * scale, height - 20 * scale, 18 * scale)
    ctx.setLineWidth(Math.max(2, 3 * scale))
    ctx.setStrokeStyle('#111111')
    ctx.stroke()
  
    ctx.setFillStyle('#111111')
    ctx.setFontSize(Math.max(22, Math.round(width * 0.045)))
    ctx.fillText('IN USE FOOD LABEL', 26 * scale, 44 * scale)
  
    ctx.setLineWidth(Math.max(1, 2 * scale))
    ctx.beginPath()
    ctx.moveTo(24 * scale, 62 * scale)
    ctx.lineTo(width - 24 * scale, 62 * scale)
    ctx.stroke()
  
    ctx.setFontSize(Math.max(18, Math.round(width * 0.036)))
    ctx.fillText('Product', 26 * scale, 96 * scale)
    ctx.setFontSize(Math.max(20, Math.round(width * 0.04)))
    ctx.fillText('Grilled Chicken Breast', 26 * scale, 128 * scale)
  
    ctx.setFontSize(Math.max(17, Math.round(width * 0.034)))
    ctx.fillText('Prepared Protein / Hot Prep', 26 * scale, 162 * scale)
    ctx.fillText('Prepared: 03/20/2026 10:30 AM', 26 * scale, 220 * scale)
    ctx.fillText('Use By : 03/23/2026 10:30 AM', 26 * scale, 268 * scale)
    ctx.fillText('Shelf Life: 72 Hours', 26 * scale, 316 * scale)
  
    const rightX = 540 * scale
    ctx.setFontSize(Math.max(18, Math.round(width * 0.035)))
    ctx.fillText('Label ID', rightX, 96 * scale)
    ctx.setFontSize(Math.max(16, Math.round(width * 0.03)))
    ctx.fillText('TEST-260320-001', rightX, 128 * scale)
    ctx.fillText('Status: ACTIVE', rightX, 238 * scale)
    ctx.fillText('Station: LINE 1', rightX, 286 * scale)
    ctx.fillText('User: TEST USER', rightX, 334 * scale)
  
    const qrX = rightX
    const qrY = 148 * scale
    const qrSize = Math.round(120 * scale)
    ctx.setLineWidth(Math.max(2, 3 * scale))
    ctx.strokeRect(qrX, qrY, qrSize, qrSize)
    ctx.strokeRect(qrX + 10 * scale, qrY + 10 * scale, 20 * scale, 20 * scale)
    ctx.strokeRect(qrX + qrSize - 30 * scale, qrY + 10 * scale, 20 * scale, 20 * scale)
    ctx.strokeRect(qrX + 10 * scale, qrY + qrSize - 30 * scale, 20 * scale, 20 * scale)
    ctx.fillRect(qrX + 42 * scale, qrY + 18 * scale, 12 * scale, 12 * scale)
    ctx.fillRect(qrX + 58 * scale, qrY + 34 * scale, 8 * scale, 8 * scale)
    ctx.fillRect(qrX + 46 * scale, qrY + 54 * scale, 10 * scale, 10 * scale)
    ctx.fillRect(qrX + 68 * scale, qrY + 68 * scale, 12 * scale, 12 * scale)
    ctx.fillRect(qrX + 50 * scale, qrY + 84 * scale, 8 * scale, 8 * scale)
  
    await new Promise<void>((resolve) => {
      ctx.draw(false, () => resolve())
    })
  
    await new Promise<void>((resolve) => setTimeout(resolve, 30))
  
    return new Promise((resolve, reject) => {
      uni.canvasGetImageData({
        canvasId,
        x: 0,
        y: 0,
        width,
        height,
        success: (res: any) => {
          resolve({
            width,
            height,
            data: res.data,
          })
        },
        fail: (err: any) => {
          reject(new Error(err?.errMsg || 'CANVAS_GET_IMAGE_DATA_FAILED'))
        },
      }, componentInstance)
    })
  }