解决两个技术问题后小有感触-QZ Tray使用经验小总结
老朋友都知道,我现在是一家软件公司销售部门的项目经理和全栈开发工程师,就是这么“奇怪”的岗位,大概我是公司销售团队里比较少有技术背景、销售业绩又不那么理想的销售。
近期在某个票务系统项目上驻场,原来我是这个项目的项目经理(从去年10月份做项目经理,到今年3月份),因为种种复杂的原因,我转为驻场开发工程师,专门负责解决打印模块。
这件事原来我一直以为比较简单,因为十几年前就做过某合作社的存单打印,b/s的项目,调好页面中打印参数设置,直接用浏览器打印就可以了,打印按钮直接调用ctrl+p 。 但项目的开发经理认为不能这样,他也有他的理由,我看了现在的票务系统的打印流程,考虑到实际场景,比如多张票连续打印,浏览器自带的打印功能确实不合适。
接下来准备自己用node.js开发一个打印的本地服务,给票务系统的相关页面提供接口,接收要打印的信息,驱动打印机打印。但开发时间相对较长,时间成本上合适,于是发现了QZ Tray,一个很成熟的第三方解决方案,可以很好地与web进行交互,支持原始的打印命令驱动,方便定制打印模板。
打开Cursor,说干就干。没多长时间就做好了演示模板,但问题出在了中文乱码,不论我怎么调试,中文总是乱码。
于是我把自己的AI员工问了一个遍,分别有谷歌的Gemini、DeepSeek,还有Qwen,甚至豆包。问他们同一个问题,得到了不同的答案,但一直没有最优的解决方案。
后来终于在我反复推进提问中,找到了一丝线索,关于“字体”设置。虽然我在QZ Tray中一直设置各种编码,可是我忽略了字体的设置。
打印机是TSC TTP-247,又经过N小时的探索,下载并使用了TSC Console V3.2.6.0,使用它的“点阵子工具”,自定义了一款中文字体,下载字型到打印机闪存中,才解决了这个问题。
这个问题说起来简单,实际困扰了我两天。这两天让我很煎熬,不能回到我销售的岗位上,我又很惦记我的销售业绩,还有别的项目的任务等待我去推进,所以当解决问题之后,心里异常开心。
也许是QZ Tray使用的人相对比较少吧,能查到的资料真的不多,感谢几位AI小伙伴。
可没想到解决了以为是最大问题的中文乱码问题,后边的二维码问题才是真正的问题。
TSC TTP-247是支持TSPL2打印语言的,所以不论是Cursor来写代码,还是我自己改来改去,直接用QRCODE的命令应该就可以。顺利地生成了二维码,看起来是没有问题。不过二维码这东西,人的肉眼怎么能一眼扫出问题呢?我随手测试扫了一下,满以为会随着就能听到“滴”的一声,然后解析出二维码的内容,但是,但是摄像头在二维码面前拍半天,愣是没反应。
加起来就这么几个参数,X,Y的坐标,容错级别,大小等等,我来回把几个参数从小调到大,从高调到低,打了几十张测试票,就是不能扫码成功。
甚至我把相同内容的二维码,在电脑上生成,然后和打印出来的二维码“人肉”对比,还是不行。
这个问题又困了我一整天。我最后以为这是打印机的问题,后来想想这种可能性太低了;
难道是这台打印机生成的二维码,只能检票机器才能解码?
这也不科学呀,技术上说不通,也没必要。
除了用手机扫码,还用草料网等在线解码,甚至让AI用算法解码。
折腾得我快没脾气了,但一直没放弃,有一点办法都要去反复测试。甚至把二维码先生成位图图片,再让打印机去打印这个位图,但结果惨不忍睹,打印质量像是一个密码二维码。
今天下午突然想到用官方的标签工具来生成二维码做测试,于是下载安装了BarTender2022_92912,用它生成了二维码再打印,这次居然成功了。
这说明打印机硬件是没问题的,打印机只是一个输出终端,一个输出设备,为什么我在网页用它的标准命令生成的二维码就不行呢?
我想到了打印机日志。
于是打开打印机日志,再用BarTender打印了一张正常的二维码,果然生成了一个改变此次事件的日志。
打开日志后如下图:
上面的乱码不重要,可以忽略,红框是关键,就是这一行代码,是BarTender向打印机发送二维码的关键命令,和我在网页中发送的命令,果然是有区别。
我参考这段命令完善了我的代码,果然解决了这个问题。当我来质问Cursor时,它居然还振振有词地说:
意思是我一开始给它提供的命令就是简化版的,我一个大无语,你说面对这么一个AI员工,我能怎么办?扣它工资?不存在,根本不存在工资和绩效,骂它?那会让AI觉得我没素质,没准以后不配合我工作,也不是咱的风格,真拿这家伙没办法。
最后我的收获是,目前的AI水平真不能代替人工,不论是驾驶还是写代码,人脸的创造力是AI所不具备的。遇到问题的发散性思维,是作为一个人类工作者最宝贵的东西。
好久没遇到过这种难题了,这事甚至让我今天这个工作日请了病假,可能是压力太大,肠胃不舒服又有些低烧,精神太差,撑不到正式工作场景,可下午实在气不过(放心不下),又起来折腾,终于解决成功了。
回头看看,很简单的解决方案,看着这400来行的代码(主文件)简单,一看就懂,但是想要写出来,真是有点考验脑筋。
好了,不夸自己了,连夜写篇总结,给后来也许会在b/s架构项目中用到QZ Tray的朋友提个醒:
解决中文乱码问题,要在打印机生成中文字体,记住字体名称,在网页中定义好。
解决二维码问题,参数一定要完整,例如:QRCODE 566,160,L,4,A,90,M2,S7,”TEST123″
遇到问题不要慌,要坚信一定有解决的问题,也许这就是做技术和做销售最大的不同。做销售的感觉,并不是100%努力了就一定能解决问题,或者是说,需要努力的层面太大,更多的是要和不同的人去打交道。而做技术写代码,只需要搞定代码就可以。
其实我即使解决不了这两个问题,会有什么严重的后果呢?丢面子吧,反正不会丢工作。但面子比工作重要,怎么能解决不了呢?不用去想别人怎么想我,我自己都接受不了自己在技术上的失败,也许这个固执的性格问题,是让我来解决这个问题的根本原因。
时间不早了,不敢熬夜了,最近血糖从20多到7~8来回震荡,我这身体真是有点受不住。今天虽然在休息,但老板依然找我,说有个国外的视频会议的项目打算让我做开发,一会说让我做前端,一会儿也可以让我做后端,其实我想自己做全栈,即前后端一个人全做了。并不是我有什么大侠情景,可能是因为一个人开发习惯了吧,异地远程团队办公,是最后的选择。
我还比较关心,如果我一个全包了这个项目的开发,能给我多少$,我是一个累不死的小强。