打印精灵:javascript 脚本助你设计复杂而灵活的标签


今天想和大家聊聊一个在软件开发中经常遇到的问题——打印功能的灵活性设计。

打印精灵的优雅起点

几年前,我们团队设计“打印精灵”时,坚持了一个核心原则:打印与程序分离,并依据此原则提供了配套的标签编辑器、打印API。大大简化了应用软件打印功能的开发, 为众多工厂,零售商,仓储管理者,软件开发商提供了优质的服务。

想象一下这样的场景:

  • 后端程序只需要准备好数据:{订单号: "2023001", 金额: 1580.50, 客户: "张三"}
  • 通过在线或内网部署的打印精灵编辑器定义好布局和样式
  • 调用API打印自动匹配填充,像魔法一样简单

最大的好处是什么?当业务部门说“打印格式要调整”时,开发人员可以微微一笑:“改标签模板就行,不用动代码。”

现实给的难题

但很快,我们就遇到了现实中的复杂需求。

最典型的例子:金额打印

财务部要求:“同一份订单,发票上要中文大写‘壹仟伍佰捌拾元伍角’,而内部留存联只要数字‘1580.50’。”

按照最初的设计,我们只能后端多送一个字段,比如是”大写金额",虽然也很简单,但必须要修改后端程序,违反了程序和打印分离的原则。

如果我们考虑更多情况:金额小写,中文大写,英文大写;日期时间不同格式的打印;国际贸易,医疗等 GS-1 合规条码的打印等等, 会大大加大程序维护的工作量。

灵光一现的解法

为了追求最大的灵活性,经过慎重开率,我们最终选择了Javascript脚本作为解决方案。

后端程序依旧只提供原始数据,但标签打印引擎具备了数据处理能力。

借助javascript强大的处理能力,可以执行条件判断,循环,字符格式话,获取日期,函数调用等等,几乎任何JS支持的功能。想怎么写,就怎么写,唯一的要求是,最后的结果必须通过return 返回

实现方案

无论是单行文字,多行文字,条码,二维码的编辑界面都多了一个JS脚本标签,可以维护JS脚本。脚本支持 ECMAScript 5.1 标准。

简单例子

1return `${订单日期} ${订单金额}`

使用内置库函数

这个例子使用GS1编码库函数,可以方便的生成合规的标准GS-1条码数据,自动根据AI生成校验码,插入分隔符。

1let code = new GS1()
2code.add(GS1.AI.GTIN, "1234567890123")
3code.add(GS1.AI.SSCC, "123456789012345675")
4
5//。。add其他条码AI字段
6
7return code.fullcode()

定义数组变量,汇总计算

1//set 订单明细=[{name:1, price:100}]
2
3return 订单明细.reduce((acc, cur) => acc + cur.price, 0);

注意:js脚本中可以使用任意变量,打印时通过API调用传递过来。 但是在标签设计时,变量并不存在,因此需要预先定义, 否则会报变量未定义错误。

方案1:通过变量管理界面定义,优点是直观。

方案2: 在脚本的开头使用//set var=xxxx 定义变量, 优点是可以实现和运行时完全相同的复杂数据结构,方便测试。 //set之间不能有空格

内置常用函数库

我们预置了最常用的转换函数,

  • GS1 编码库函数。
  • 文本处理函数
  • 日期处理函数
  • 数字处理函数
    • toChinese 中文大写。

函数不断更新中。。。 更多函数,参考模板内置JS脚本手册,

支持自定义库函数

当业务部门提出特殊需求时,比如“金额要显示为带千分位的格式”,我们可以通过自定义函数实现,自定义函数整个标签有效,在文本,条码等字段中均可以直接调用。

实际效果

实施这套方案后,变化是显著的:

对第三方应用开发团队

  • 打印相关的需求变更,90%不再需要开发介入
  • 减少了大量重复的数据格式化代码
  • 系统更稳定,因为核心逻辑不受打印需求影响

对业务部门

  • 打印格式调整响应时间从“几天”缩短到“几分钟”
  • 可以自主实验不同打印样式
  • 特殊打印需求(如促销活动专用格式)能够快速实现

打印功能看似简单,但其设计思路影响了整个系统的扩展性和维护成本。我们的打印精灵通过引入JS脚本,让我们在保持架构整洁的同时,满足了业务日益复杂的需求。

你们团队是如何处理这类问题的呢?欢迎在评论区分享你的经验和思考!


如果你觉得这篇文章有帮助,欢迎分享给可能需要的朋友。我们下期再见!


留言

登录