解决两个技术问题后小有感触-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来回震荡,我这身体真是有点受不住。今天虽然在休息,但老板依然找我,说有个国外的视频会议的项目打算让我做开发,一会说让我做前端,一会儿也可以让我做后端,其实我想自己做全栈,即前后端一个人全做了。并不是我有什么大侠情景,可能是因为一个人开发习惯了吧,异地远程团队办公,是最后的选择。

我还比较关心,如果我一个全包了这个项目的开发,能给我多少$,我是一个累不死的小强。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/77464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos 7.6安装redis-6.2.6

1. 安装依赖 确保系统已经安装了必要的编译工具和库: sudo yum groupinstall "Development Tools" -y sudo yum install gcc make tcl -y 2. 解压 Redis 源码包 进入 /usr/local/ 目录并解压 redis-6.2.6.tar.gz 文件: cd /usr/local/ sudo ta…

Ejs模版引擎介绍,什么是模版引擎,什么是ejs,ejs基本用法

** EJS 模板引擎**,让你彻底搞明白什么是模板引擎、什么是 EJS、怎么用、语法、最佳实践等等: 📚 一、什么是模板引擎? 模板引擎是前后端分离之前的一种服务器端“渲染技术”。它的主要作用是: 将 HTML 页面和后端传递…

2025.4.21-2025.4.26学习周报

目录 摘要Abstract1 文献阅读1.1 模型架构1.1.1 动态图邻接矩阵的构建1.1.2 多层次聚合机制模块1.1.3 AHGC-GRU 1.2 实验分析 总结 摘要 在本周阅读的论文中,作者提出了一种名为AHGCNN的自适应层次图卷积神经网络。AHGCNN通过将监测站点视为图结构中的节点&#xf…

6.1 客户服务:智能客服与自动化支持系统的构建

随着企业数字化转型的加速,客户服务作为企业与用户交互的核心环节,正经历从传统人工服务向智能化、自动化服务的深刻变革。基于大语言模型(LLM)和智能代理(Agent)的技术为构建智能客服与自动化支持系统提供…

java Optional

我还没用过java8的一些语法,有点老古董了,记录下Optional怎么用。 从源码看,Optional内部持有一个对象, 有一些api对这个对象进行判空处理。 静态方法of ,生成Optional对象, 但这个value不能为空&#…

【Java面试笔记:进阶】24.有哪些方法可以在运行时动态生成一个Java类?

在Java中,运行时动态生成类是实现动态编程、框架扩展(如AOP、ORM)和插件化系统的关键技术。 1.动态生成Java类的方法 1.从源码生成 直接生成源码文件:通过Java程序生成源码并保存为文件。编译源码: 使用ProcessBuilder启动javac进程进行编译。使用Java Compiler API(ja…

基于Jamba模型的天气预测实战

深入探索Mamba模型架构与应用 - 商品搜索 - 京东 DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 由于大气运动极为复杂,影响天气的因素较多,而人们认识大气本身运动的能力极为有限,因此以前天气预报水平较低 。预报员在预…

GAMES202-高质量实时渲染(Real-Time Shadows)

目录 Shadow MappingshadowMapping的问题shadow mapping背后的数学PCF(Percentage Closer Filtering)PCSS(Percentage closer soft shadows)VSSM(Variance Soft Shadow Mapping)优化步骤3优化步骤1SAT&…

iphonex uniapp textarea标签兼容性处理过程梳理

嗨,我是小路。今天主要和大家分享的主题是“iphonex uniapp textarea标签兼容性处理过程梳理”。 在uniapp项目中,经常会使用到uniapp原生的textarea标签,但在手机兼容性这块,textarea并不是很好用,会出现一些…

C++ 区分关键字和标识符

1. 关键字(Keywords) 定义:关键字是编程语言预定义的具有特定意义的单词。它们是语言的一部分,C编译器具有特殊的理解规则,不能作为用户自定义的标识符。作用:关键字用于定义语言结构,如声明变…

杭电oj(1087、1203、1003)题解

DP 即动态规划(Dynamic Programming),是一种通过把原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,从而解决复杂问题的算法策略。以下从几个方面简述动态规划: 基本思想 动态规划的核心在…

一键多环境构建——用 Hvigor 玩转 HarmonyOS Next

引言 在 HarmonyOS Next 的应用开发中,常常需要针对不同环境(测试、预发、线上)或不同签名(调试、正式)输出多个 APP/HAP 包。虽然 HarmonyOS 提供了多目标构建(Multi-Target Build)能力&#…

qt/c++云对象浏览器

简介 本项目为基于QT5和C11的云对象存储可视化管理工具 源码获取 int main(){ printf("源码联系绿泡泡:%s","joyfelic"); return 0; }

【Ubuntu】提升 docker ps -a 输出的可读性:让 Docker 容器状态更清晰

提升 docker ps -a 输出的可读性:让 Docker 容器状态更清晰 当我们使用 docker ps -a 查看所有 Docker 容器时,输出的信息通常会非常多,尤其是在容器数量较多时。默认输出中包含容器 ID、名称、镜像、状态、端口等信息,容易让人眼…

Spring Security自定义身份认证

尽管项目启动时,Spring Security会提供了默认的用户信息,可以快速认证和启动,但大多数应用程序都希望使用自定义的用户认证。对于自定义用户认证,Spring Security提供了多种认证方式,常用的有In-Memory Authentication…

在亚马逊云服务器上部署WordPress服务

在亚马逊云服务器上部署WordPress服务第一步:创建EC2实例第二步:初始设置与安装第三步:配置MySQL与WordPress第四步:配置Apache与WordPress第五步:访问WordPress第六步:测试数据库连接第七步:使…

Web3.0的认知补充(去中心化)

涉及开发技术: Vue Web3.js Solidity 基本认知 Web3.0含义: 新一代互联网思想:去中心化及用户为中心的互联网 数据:可读可写可授权 核心技术:区块链、NFT 应用:互联网上应用 NFT &…

如何修复宝可梦时时刻刻冒险无法正常工作

宝可梦的时时刻刻冒险模式是一项强大的功能,即使应用程序关闭,它也能追踪你的步行距离。它的工作原理是将你的步数与 iOS 上的 Apple Health 或 Android 上的 Google Fit 同步。它对于孵化宝可梦蛋和赚取好友糖果至关重要,但一旦它停止工作&a…

redis常用集合操作命令

在 Redis 的命令行界面(redis-cli)中, Redis 的集合(Set)是无序的,且集合中的元素是唯一的。Redis 本身没有直接提供获取集合中某个特定属性的命令,因为集合中的元素是简单的值,而不…

初识数据结构——二叉树从基础概念到实践应用

数据结构专栏 ⬅(click) 初识二叉树:从基础概念到实践应用🌳 一、树型结构基础 1.1 树的基本概念 树是一种非线性的数据结构,由n(n>0)个有限节点组成一个具有层次关系的集合。它看起来像一棵倒挂的树,根朝上而叶朝下。 关键特…