{siteMetadata.headerTitle}
Published on

仓库管理系统WMS中标签打印方案及实现

Authors

需求分析

  1. 多端:发起标签打印的终端有 App 和 Web
  2. 批量:除了单个打印,还需要支持后台自动批量打印
  3. 便携:仓库人员能随身携带打印机,出标签后直接贴到对应库位或物品上

调研标签机

  1. 云打印机如飞鹅云都是需要插电的,没有电池,无法在仓库随身携带;
  2. 汉印蓝牙标签打印机,无法支持Web端发起打印请求
  3. 最后选定 优博讯 UROVO K329 WIFI版。

其中有个小插曲,最开始验证方案可行性的时候,产品总监买到的是k319。验证完可行性之后准备走合同批量买的时候,卖k319的代理说没货了,我也去咸鱼问了好几个人,顶多只有一台的。。 真是无奸不商啊。后来直接找优博讯官方也没货,只能换成 k329,幸好区别不大。

Web触发打印方案分析

标签打印机有2种调用方式:

  • 驱动模式:在Windows上安装驱动,发送要打印的数据到打印机
  • 指令模式:将 tspl,cpcl或esc 指令通过蓝牙或者WIFI方式发送到打印机

使用驱动模式的话,App端无法发送数据,Web端也必须先生成图片或PDF,无法跳过浏览器的文件存储逻辑,也就无法实现后台静默自动打印。

使用指令模式,由于蓝牙距离限制,PC和打印机通过蓝牙通信是不稳定的,所以采用 WIFI 连接发送数据。

其实也可以主要用App蓝牙交互的逻辑,Web把数据推到队列,App轮询接口或者websockt连接,和前端同事讨论对App性能有影响。

另外考虑到工期和前端工作量问题,App端的打印调API来还是走Web转发打印的逻辑,后期可以实现App通过蓝牙发指令到打印机,这样会更稳定,毕竟WiFi信号离路由器远了也会变弱。

流程确认

  1. App和Web向队列写数据
  2. PC上运行一个打印数据转发程序 Printer.exe,向服务器请求打印数据
  3. PC程序 Printer.exe 向打印机发送打印指令数据

考虑到将 Rabbitmq 的配置写到exe程序里会有安全问题,所以还是才用接口轮询的方法,让 Printer.exe 每隔一秒去请求打印数据。

Windows 打印数据转发程序实现

主要实现以下几个功能:

  • 请求数据接口
  • 向标签机 IP:PORT 发送打印指令
  • 定时重复请求
  • 记录日志,清理7天前的日志文件
  • 使用 pyinstaller -F .\printer.py 打包成exe程序