Blame view

泰额版/Food Labeling Management App UniApp/src/utils/labelPreview/buildLabelPrintPayload.ts 4.05 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
  /**
   * 按平台 label-template-*.json 结构组装「打印任务」数据(合并后的模板快照 + printInputJson)。
   * 物理 BLE 打印仍走位图 TSC(与 Test Print 相同);本对象为业务/插件侧与 JSON 模板对齐的权威快照。
   */
  import type { SystemLabelTemplate, SystemTemplateElementBase } from '../print/types/printer'
  
  /** 与仓库内 label-template-template-*.json 根结构一致 */
  export interface LabelTemplateDocumentJson {
    id: string
    name: string
    labelType?: string
    unit: string
    width: number
    height: number
    appliedLocation?: string
    showRuler?: boolean
    showGrid?: boolean
    elements: Record<string, unknown>[]
  }
  
  export interface LabelPrintJobMeta {
    labelCode?: string
    productId?: string
    printQuantity?: number
    locationId?: string
  }
  
  export interface LabelPrintJobPayload {
    template: LabelTemplateDocumentJson
    /** 与接口 printInputJson 一致(inputKey / elementName 等键) */
    printInputJson: Record<string, unknown>
    meta?: LabelPrintJobMeta
  }
  
  function cloneJsonSafeConfig(cfg: Record<string, unknown>): Record<string, unknown> {
    try {
      return JSON.parse(JSON.stringify(cfg ?? {})) as Record<string, unknown>
    } catch {
      return { ...(cfg || {}) } as Record<string, unknown>
    }
  }
  
  /** 落库 config:完整深拷贝,避免白名单遗漏字段导致重打缺价签/过敏原/数字等 */
  function mergePersistConfigSnapshot(src: Record<string, unknown>): Record<string, unknown> {
    return cloneJsonSafeConfig(src)
  }
  
  /** 单元素序列化:与 JSON 模板 elements[] 项字段对齐,并保留 PRINT_INPUT 相关根字段 */
  export function serializeElementForLabelTemplateJson(el: SystemTemplateElementBase): Record<string, unknown> {
    const cfg = (el.config || {}) as Record<string, unknown>
    const o: Record<string, unknown> = {
      id: el.id,
      type: el.type,
      x: el.x,
      y: el.y,
      width: el.width,
      height: el.height,
      rotation: el.rotation ?? 'horizontal',
      border: el.border ?? 'none',
      config: mergePersistConfigSnapshot(cfg),
    }
    if (el.valueSourceType) o.valueSourceType = el.valueSourceType
    if (el.inputKey != null && String(el.inputKey).trim()) o.inputKey = el.inputKey
    if (el.elementName != null && String(el.elementName).trim()) o.elementName = el.elementName
    const zx = el as SystemTemplateElementBase & { zIndex?: number; orderNum?: number }
    if (zx.zIndex !== undefined) o.zIndex = zx.zIndex
    if (zx.orderNum !== undefined) o.orderNum = zx.orderNum
    return o
  }
  
  /**
   * 从当前合并模板 + 已组好的 printInputJson 生成与 label-template JSON 同构的打印载荷。
   */
  export function buildLabelPrintJobPayload(
    merged: SystemLabelTemplate,
    printInputJson: Record<string, unknown>,
    meta?: LabelPrintJobMeta
  ): LabelPrintJobPayload {
    const template: LabelTemplateDocumentJson = {
      id: String(merged.id || ''),
      name: String(merged.name || '未命名模板'),
      labelType: merged.labelType,
      unit: String(merged.unit || 'inch'),
      width: Number(merged.width) || 0,
      height: Number(merged.height) || 0,
      appliedLocation: merged.appliedLocation || 'ALL',
      showRuler: merged.showRuler !== false,
      showGrid: merged.showGrid !== false,
      elements: (merged.elements || []).map(serializeElementForLabelTemplateJson),
    }
    return {
      template,
      printInputJson: { ...printInputJson },
      meta: meta ? { ...meta } : undefined,
    }
  }
  
  let lastLabelPrintJobPayload: LabelPrintJobPayload | null = null
  
  /** 供调试或后续原生插件读取最近一次组装的任务(template + printInputJson) */
  export function setLastLabelPrintJobPayload(p: LabelPrintJobPayload): void {
    lastLabelPrintJobPayload = p
  }
  
  export function getLastLabelPrintJobPayload(): LabelPrintJobPayload | null {
    return lastLabelPrintJobPayload
  }
  
  /** 与原生 printTemplate 入参一致:插件侧可对齐平台导出 JSON */
  export function stringifyLabelPrintJobForNative(p: LabelPrintJobPayload): {
    templateJson: string
    dataJson: string
  } {
    return {
      templateJson: JSON.stringify(p.template),
      dataJson: JSON.stringify(p.printInputJson ?? {}),
    }
  }