语法

模板采用 freemarker 引擎解析,所以原生支持所有的 freemarker 语法,你可以自行百度一下 freemarker 语法的简单使用,包括如何判断、如何循环、如何格式化处理数据等等

标签支持

小票打印机

打印机使用标签(类似 html 格式)来格式化输出内容,具体说明如下:

  1. <BR> :换行符
  2. <CUT> :切刀指令(主动切纸,仅限切刀打印机使用才有效果)
  3. <LOGO> :打印LOGO指令(前提是预先在机器内置LOGO图片)
  4. <PLUGIN> :钱箱或者外置音响指令
  5. <CB></CB>:居中放大
  6. <B></B>:放大一倍
  7. <C></C>:居中
  8. <L></L>:字体变高一倍
  9. <W></W>:字体变宽一倍
  10. <QR></QR>:二维码(单个订单,最多只能打印一个二维码)
  11. <RIGHT></RIGHT>:右对齐
  12. <BOLD></BOLD>:字体加粗

参考模板A

  1. <CB>${order.id} 号</CB><BR>
  2. <RIGHT>${.now?datetime}</RIGHT><BR>
  3. 名称 数量 金额<BR>
  4. --------------------------------<BR>
  5. <#list goods as test>
  6. ${test.goodsName} ${test.property!""} ${test.number} ${test.amount}
  7. </#list>
  8. --------------------------------<BR>
  9. 合计:${order.amountReal}元<BR>
  10. 订单号:${order.orderNumber}<BR>
  11. 联系电话:0571-28180512<BR>
  12. <QR>https://www.it120.cc/</QR>

参考模版B

  1. <CB>小程序订单</CB>
  2. <CB>${order.id}</CB>
  3. <RIGHT>${.now?datetime}</RIGHT>
  4. <#list goods as test>
  5. ${test.goodsName} ${test.property!""}
  6. 数量:${test.number} 金额:${test.amount}
  7. --------------------------------
  8. </#list>
  9. 优惠券抵扣:${order.amountCoupons}
  10. 备注:${order.remark!"无"}
  11. --------------------------------
  12. 姓名:${extJson["姓名"]}
  13. 电话:${extJson["手机号码"]}
  14. 用餐时段:${extJson["用餐时间段"]}
  15. 用餐日期:${extJson["自取时间"]}
  16. --------------------------------
  17. <#if order.isNeedLogistics>
  18. 联系人: ${logistics.linkMan} <BR> 联系电话: ${logistics.mobile}<BR> 配送地址:${logistics.address}<BR>
  19. </#if>
  20. <#if order.isCanHx>
  21. <QR>${order.hxNumber}</QR>
  22. <C>自取点: ${extJson["提货点"]}</C>
  23. <#else>
  24. <QR>${order.pickPointPwd}</QR>
  25. <C>取餐柜: ${extJson["提货点"]}</C>
  26. <C>取餐码: ${order.pickPointPwd}</C>
  27. </#if>
  28. 合计:${order.amountReal}元
  29. 订单号:${order.orderNumber}<BR>

标签机

  1. <DIRECTION>n</DIRECTION>
  2. 设定打印时出纸和打印字体的方向,n 0 或 1,每次设备重启后都会初始化为 0 值设置,1:正向出纸,0:反向出纸,
  3. <DIRECTION>1</DIRECTION>
  4. <QR x="10" y="100" e="L" w="5">二维码内容</QR>
  5. 打印二维码,其中属性x为水平方向起始点坐标(默认为0),属性y为垂直方向起始点坐标(默认为0),属性e为纠错等级:
  6. L 7%M 15%Q 25%H 30%(默认为K),属性w为二维码宽度(默认为5)
  7. <TEXT x="10" y="100" font="12" w="2" h="2" r="0">文本内容</TEXT>
  8. 打印文本,其中属性x为水平方向起始点坐标(默认为0),属性y为垂直方向起始点坐标(默认为0),属性font为字体:
  9. 1、 8×12 dot 英数字体
  10. 2、 12×20 dot 英数字体
  11. 3、 16×24 dot 英数字体
  12. 4、 24×32 dot 英数字体
  13. 5、 32×48 dot 英数字体
  14. 6、 14×19 dot 英数字体 OCR-B
  15. 7、 21×27 dot 英数字体 OCR-B
  16. 8、 14×25 dot 英数字体 OCR-A
  17. 9、 9×17 dot 英数字体
  18. 10、 12×24 dot 英数字体
  19. 11、 繁体中文 24×24Font(大五码)
  20. 12、 简体中文 24×24Font(GB 码)
  21. 13、 韩文 24×24Font(KS 码)
  22. 默认为12 简体中文 24×24Font(GB 码),属性w为文字宽度放大倍率1-10(默认为1),属性h为文字高度放大倍率1-10
  23. 属性r为文字旋转角度(顺时针方向):
  24. 0 0度
  25. 90 90度
  26. 180 180度
  27. 270 270度
  28. (默认为0)
  29. <BC128 x="10" y="100" h="80" s="1" r="0" n="1" w="1">12345678</BC128>:打印code128一维码,其中属性x为水平
  30. 方向起始点坐标(默认为0),属性y为垂直方向起始点坐标(默认为0),属性s是否人眼可识:0 不可识,1 可识(默认为1),
  31. 属性n为窄 bar 宽度,以点(dot)表示(默认为1),属性w为宽 bar 宽度(默认为1),以点(dot)表示,属性r为文字旋转角度
  32. (顺时针方向):
  33. 0 0度
  34. 90 90度
  35. 180 180度
  36. 270 270度
  37. (默认为0)
  38. <BC39 x="10" y="100" h="80" s="1" r="0" n="1" w="1">12345678</BC39>:打印code39一维码,其中属性x为水平方向
  39. 起始点坐标(默认为0),属性y为垂直方向起始点坐标(默认为0),属性s是否人眼可识:0 不可识,1 可识(默认为1),属性
  40. n为窄bar宽度,以点(dot)表示(默认为1),属性w为宽 bar 宽度(默认为2),以点(dot)表示,属性r为文字旋转角度(顺时针
  41. 方向):
  42. 0 0度
  43. 90 90度
  44. 180 180度
  45. 270 270度
  46. (默认为0)

上述标签中的数字单位是 dot ,按照 1mm = 8dots,自行根据自己的标签尺寸进行设置

参考模版

  1. <DIRECTION>1</DIRECTION>
  2. <TEXT x="10" y="20" font="12">#001 五号桌 1/3</TEXT>
  3. <TEXT x="70" y="80" font="12" w="2" h="2">可乐鸡翅</TEXT>
  4. <TEXT x="10" y="180" font="12">张三先生 13800138000</TEXT>

可用变量

打印时间

  1. ${.now?string('yyyy-MM-dd HH:mm:ss')}

时间格式化参数说明:

  1. yyyy 为4位数的年份
  2. MM 为2位数的月份
  3. dd 为日期
  4. HH 为24小时制的小时数
  5. mm 为分钟数
  6. ss 为秒数

具体可以查阅 freemarker 的使用手册

订单相关变量引用

  1. ${order.XXXXX}

后台订单详情接口返回的json数据中的 order 对象里的值都可以调用,比如:
${order.qudanhao} 将会打印出取餐号;

${order.orderNumber} 将会打印出订单号;

${order.amountReal} 将会打印出订单实际支付金额;

  1. {
  2. "type": 1, // 2 为扫码点餐订单,1 为普通订单
  3. "amount": 500, // 商品货款金额,不包含运费
  4. "amountLogistics": 0, // 运费价格
  5. "amountReal": 500, // 订单实际金额
  6. "dateAdd": "2020-02-25 11:43:40", // 下单时间
  7. "goodsNumber": 1, // 商品数量
  8. "id": 464320, // 订单ID
  9. "qudanhao": "0006", // 取餐号
  10. "orderNumber": "20022511439510006", // 订单号
  11. "isNeedLogistics": true, // 是否需要快递
  12. "isPay": true, // 是否已支付
  13. "pingtuanOpenId": false, // 拼团团号
  14. "isSuccessPingtuan": false, // 是否已成团
  15. "payNumber": "ZF2002251642338367", // 微信支付订单号
  16. "remark": "不要麻也不要辣", // 备注
  17. "tableCode": "A11", // 餐桌号
  18. "pickPointId": "657340", // 取餐码
  19. "shopId": 1234, // 订单归属门店ID
  20. "shopName": "订单归属门店名称",
  21. "shopIdZt": 1234, // 订单自提门店ID
  22. "shopNameZt": "订单自提门店名称",
  23. }

订单的商品明细

  1. <#list goods as test>
  2. ... (这里面就可以调用 ${test.XXXX} 来显示商品数据)
  3. </#list>

上面代码遍历打印所有的订单商品,后台订单详情接口返回的json数据中的 goodsList 对象里的值都可以调用

  1. {
  2. "amount": 500, // 商品总价
  3. "amountSingle": 500, // 单价
  4. "goodsName": "WIFI 58mm 热敏打印机工厂定制版", // 商品名称
  5. "goodsSubName": "副标题", // 商品副标题
  6. "number": 1, // 商品数量
  7. "unit": "盒", // 商品单位
  8. "property": "sku信息", // 商品的规格尺寸数据
  9. "barCode": "1212343", // 商品条码
  10. "pic": "https://cdn.it120.cc/apifactory/2019/03/07/133eb6294e3853ebe4eb8551359a26dc.png", // 商品图片
  11. }

收货地址

  1. ${logistics.XXXXXX}

后台订单详情接口返回的json数据中的 apiExtOrderLogistics 对象里的值都可以调用

  1. {
  2. "address": "详细地址",
  3. "areaStr": "南岸区",
  4. "cityId": "500100000000",
  5. "cityStr": "市辖区",
  6. "code": "322000", // 邮编
  7. "districtId": "500108000000",
  8. "linkMan": "收件人姓名",
  9. "linkManMask": "收***名",
  10. "mobile": "手机号码",
  11. "mobileMask": "135*****890",
  12. "provinceId": "500000000000", // 省份编号
  13. "provinceStr": "重庆市",
  14. "shipperName": "其他快递公司",
  15. "trackingNumber": "快递单号",
  16. "type": 0 // 0 快递,1 达达配送, 2 美团配送, 3 快跑者
  17. }

所属门店数据

  1. ${shopInfo.XXXXXX}

如果当前订单有归属门店,那么你就可以调用上面的变量直接打印门店数据;
后台门店详情接口返回的json数据中变量都可以调用

门店区域数据

  1. ${shopArea.XXXXXX}

门店所属区域的信息:

  • name 名称
  • address 地址

订单扩展属性

  1. ${extJson.XXXXXX}

后台订单详情接口返回的json数据中的 extJson 对象里的值都可以调用

打印下单用户信息

  1. ${user.xxx}

其中 xxx 可以用下面的字段代替:

  • username 用户名
  • email 邮箱
  • mobile 手机
  • id 用户编号
  • nick 昵称
  • avatarUrl 头像图片路径
  • referrer 邀请人
  • gender 性别
  • birthday 生日,日期类型,所以需要 ${user.birthday?string(‘yyyy-MM-dd’)} 格式化

标签机商品拆分打印变量

  1. ${goodsIndex}

当前打印第几种商品(从 0 开始)

  1. ${goodsNumberIndex}

当前打印的某种商品的第几个(最大为用户购买的总数)

  1. ${gIdx}

假如用户下单3种商品,每种商品各2个,那么如果是数量拆开打印的话,这个变量将依次打印 1-6;如果数量合并打印的话,这个变量将依次打印 1-3;如果是汇总打印的话,这个变量固定为 1

  1. ${curGoods.XXXXXX}
  1. {
  2. "amount": 500, // 商品总价
  3. "amountSingle": 500, // 单价
  4. "goodsName": "WIFI 58mm 热敏打印机工厂定制版", // 商品名称
  5. "number": 1, // 商品数量
  6. "pic": "https://cdn.it120.cc/apifactory/2019/03/07/133eb6294e3853ebe4eb8551359a26dc.png", // 商品图片
  7. }

固定显示文字数量

比如标签机,文字不会自动换行,所以需要可以变量的文字长度,自动进行换行,那么,就需要可以截取显示字数长度进行控制:

比如下面的这句代码,本来是打印商品的规格信息,但是如果规格太长,标签机又不会自动换行,就会无法打印剩下的文字内容:

  1. <TEXT x="10" y="170" font="12">${curGoods.property}</TEXT>

假如一行只能打印 10 个字(只是举例),那么上面的这句语句就可以改成:

  1. <#if curGoods.property?? && curGoods.property?length gt 10>
  2. <TEXT x="10" y="170" font="12">${curGoods.property?substring(0,10)}</TEXT>
  3. <TEXT x="10" y="170" font="12">${curGoods.property?substring(10)}</TEXT>
  4. <#else>
  5. <TEXT x="10" y="170" font="12">${curGoods.property}</TEXT>
  6. </#if>