请选择 进入手机版 | 继续访问电脑版

技术控

    今日:116| 主题:57503
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 每日一博 | JFinal小插件:Java驱动打印小票

[复制链接]
九级车震 投递于 2016-10-2 06:34:11
165 3
驱动打印小票--80热敏打印机

   项目环境基于JFinal2.2 偷了个懒直接在JFinal demo上做的_

   在大神 SubLuLu/thermal_printer 开源的项目基础上写了这个demo,SubLuLu用的是指令打印,而且环境是基于Android的,所以我用Java做的项目无法很方便的打印图片和兼容更多的热敏打印机,因此借鉴大神的构思我采用驱动方式进行打印。
   * 我的项目地址:DriverPOSPrint *
  打印流程

   

每日一博 | JFinal小插件:Java驱动打印小票

每日一博 | JFinal小插件:Java驱动打印小票-1-技术控-打印,keys,put,模板,import

  如图中所示,在项目实际使用中采用异步的方式进行打印。调用者只需要创建新的PrintJob 添加到任务队列中,挂起的线程就会被自动唤起完成打印任务
  打印模板

  模板采用Json格式存储,分为header、goods、warn、msg四个部分,对模板的解析采用阿里出品的fastjson,模板共5中,模板名称分别对应PrintJob中missionType
  模板示例-(simple.json)

  1. {
  2. "header": [{
  3. "text": "{$title}",
  4. "size": 14,
  5. "bold": true,
  6. "align": 1,
  7. "line": true,
  8. "type": 0
  9. },
  10. {
  11. "text": "品    牌:{$brandName}",
  12. "size": 9,
  13. "bold": false,
  14. "align": 0,
  15. "line": false,
  16. "type": 0
  17. },
  18. {
  19. "text": "({$shopName})",
  20. "size": 9,
  21. "bold": false,
  22. "align": 0,
  23. "line": true,
  24. "type": 0
  25. },
  26. {
  27. "text": "桌    号:{$tableNumb}",
  28. "size": 9,
  29. "bold": false,
  30. "align": 0,
  31. "line": false,
  32. "type": 0
  33. },
  34. {
  35. "text": "({$tableName})",
  36. "size": 9,
  37. "bold": false,
  38. "align": 0,
  39. "line": true,
  40. "type": 0
  41. },
  42. {
  43. "text": "--------------------------------",
  44. "size": 9,
  45. "bold": false,
  46. "align": 0,
  47. "line": true,
  48. "type": 0
  49. }],
  50. "goods": [{
  51. "name": "编码",
  52. "width": 8,
  53. "variable": "code"
  54. },
  55. {
  56. "name": "名称",
  57. "width": 12,
  58. "variable": "name"
  59. },
  60. {
  61. "name": "数量",
  62. "width": 6,
  63. "variable": "quantity"
  64. },
  65. {
  66. "name": "  金额",
  67. "width": 8,
  68. "variable": "price"
  69. }],
  70. "warn": [{
  71. "text": "-------------{$warnTitle}--------------",
  72. "size": 9,
  73. "bold": false,
  74. "align": 0,
  75. "line": true,
  76. "type": 0
  77. },
  78. {
  79. "text": "  ",
  80. "size": 9,
  81. "bold": false,
  82. "align": 0,
  83. "line": true,
  84. "type": 0
  85. },
  86. {
  87. "text": "{$warnMsg}",
  88. "size": 11,
  89. "bold": true,
  90. "align": 0,
  91. "line": true,
  92. "type": 0
  93. }],
  94. "msg": [{
  95. "text": "----------{$posTitle}-----------",
  96. "size": 9,
  97. "bold": false,
  98. "align": 0,
  99. "line": true,
  100. "type": 0
  101. },
  102. {
  103. "text": "{$posMsg}",
  104. "size": 9,
  105. "bold": false,
  106. "align": 0,
  107. "line": true,
  108. "type": 0
  109. }]
  110. }
复制代码
打印规则

   

每日一博 | JFinal小插件:Java驱动打印小票

每日一博 | JFinal小插件:Java驱动打印小票-2-技术控-打印,keys,put,模板,import

  打印参数

  
       
  • 打印根据模板和打印参数合成按照顺序进行打印   
  • 打印参数替换模板中的占位符   
  • 打印参数解析商品信息进行输出  
  参数示例

  1. json
  2. {
  3. "keys": {
  4. "dateTime": "2016-09-10 12:21:00",
  5. "posTitle": "收银软件下单结果",
  6. "brandName": "智慧餐厅",
  7. "orderId": "1609101220001",
  8. "shopName": "天山店",
  9. "title": "网络订单",
  10. "tableName": "外卖1",
  11. "barCode": "7255",
  12. "allPrice": "66.88",
  13. "tableNumb": "0002",
  14. "warnTitle": "异常提示",
  15. "posMsg": "点菜成功!1001 无此菜 本次点菜3/3份。其中2成功,1失败。合计XXXX元祝您用餐愉快!欢迎下次光临",
  16. "warnMsg": "部分菜品未下成功请联系服务员人工处理"
  17. },
  18. "goods": [{
  19. "code": "01001",
  20. "quantity": "1.0",
  21. "price": "18.0",
  22. "name": "牛肉"
  23. },
  24. {
  25. "code": "01002",
  26. "quantity": "1.0",
  27. "price": "10.0",
  28. "name": "酸辣土豆"
  29. },
  30. {
  31. "code": "01003",
  32. "quantity": "1.0",
  33. "price": "6.0",
  34. "name": "拍黄瓜"
  35. }]
  36. }
复制代码

       
  • keys中的值负责替换模板中的占位符,如果模板中有,keys中没有则将占位符原样输出   
  • goods中的参数对用模板中的goods的每个属性  
  封装的PrintJob

  ```
  1. /**
  2. * 任务类型:0=普通订单 1=预定单 2=支付订单 3=警告单 4=test单
  3. */
  4. private int missionType;
  5. /**
  6. * 需要打印的参数--可扩展
  7. */
  8. private Map<String, Object> param;
  9. /**
  10. * 打印机逻辑名称
  11. */
  12. private String printerName;
复制代码
``` 根据不同的missionType自动选用对应的模板,替换参数后打印
  效果图(多模板)

   

每日一博 | JFinal小插件:Java驱动打印小票

每日一博 | JFinal小插件:Java驱动打印小票-3-技术控-打印,keys,put,模板,import

每日一博 | JFinal小插件:Java驱动打印小票

每日一博 | JFinal小插件:Java驱动打印小票-4-技术控-打印,keys,put,模板,import

每日一博 | JFinal小插件:Java驱动打印小票

每日一博 | JFinal小插件:Java驱动打印小票-5-技术控-打印,keys,put,模板,import

每日一博 | JFinal小插件:Java驱动打印小票

每日一博 | JFinal小插件:Java驱动打印小票-6-技术控-打印,keys,put,模板,import

每日一博 | JFinal小插件:Java驱动打印小票

每日一博 | JFinal小插件:Java驱动打印小票-7-技术控-打印,keys,put,模板,import

每日一博 | JFinal小插件:Java驱动打印小票

每日一博 | JFinal小插件:Java驱动打印小票-8-技术控-打印,keys,put,模板,import

  使用示例

  ``` Java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
  import com.demo.common.driverpos.PrintJob; import com.demo.common.driverpos.PrintQueue; import com.demo.common.driverpos.PrintThread; import com.jfinal.kit.JsonKit; import com.jfinal.plugin.activerecord.Db; import com.jfinal.plugin.activerecord.Record;
  public class DriverPrintQueueTest extends BaseTest {
  1. static{
  2.     System.out.println("printThread is start : " + System.currentTimeMillis());
  3.     PrintThread.start();
  4. }
  5. @Override
  6. public void test() {
  7.     mySleep(5);
  8.     PrintQueue.add(new PrintJob(0, jsonParam(), "BTP-2002CP(E)"));
  9.     mySleep(15);
  10. }
  11. public void mySleep(int i) {
  12.     try {
  13.         System.out.println("sleep" + i*1000 + "ms ...");
  14.         Thread.sleep(i * 1000);
  15.     } catch (InterruptedException e) {
  16.         e.printStackTrace();
  17.     }
  18. }
  19. public static Map<String, Object> jsonParam(){
  20.     Map<String, Object> template = new HashMap<String, Object>();
  21.     Map<String, Object> keys = new HashMap<String, Object>();
  22.     String posResult = "点菜成功!1001 无此菜 本次点菜3/3份。其中2成功,1失败。合计XXXX元祝您用餐愉快!欢迎下次光临";
  23.     keys.put("title", "网络订单");
  24.     keys.put("brandName", "智慧餐厅");
  25.     keys.put("shopName", "天山店");
  26.     keys.put("tableNumb", "0002");
  27.     keys.put("tableName", "外卖1");
  28.     keys.put("orderId", "1609101220001");
  29.     keys.put("dateTime", "2016-09-10 12:21:00");
  30.     keys.put("allPrice", "66.88");
  31.     keys.put("barCode","7255");
  32.     if(!posResult.contains("成功")){
  33.         if(posResult.contains("重单")){
  34.             keys.put("warnTitle", "提    示");
  35.             keys.put("warnMsg", "该订单已处理");
  36.         }else{
  37.             keys.put("warnTitle", "异常提示");
  38.             keys.put("warnMsg", "自动下单失败请人工处理");
  39.         }
  40.     }else{
  41.         if(posResult.contains("无此") || posResult.contains("沽清")
  42.                 || posResult.contains("不存在")){
  43.             keys.put("warnTitle", "异常提示");
  44.             keys.put("warnMsg", "部分菜品未下成功请联系服务员人工处理");
  45.         }
  46.     }
  47.     keys.put("posTitle", "收银软件下单结果");
  48.     keys.put("posMsg", posResult);
  49.     List<Map<String, Object>> goods = new ArrayList<Map<String,Object>>();
  50.     List<Record> menu = Db.find("select * from menu");
复制代码
  // int count = 0; for (Record record : menu) { Map       good = new HashMap        (); good.put("code", record.get("code")); good.put("name", record.get("name")); good.put("quantity", "1.0"); good.put("price", record.get("price")); // good.put("qrcode", "1.png"); // if(count!=1){ // good.put("remark", "免葱、免辣"); // } // count++; goods.add(good); }      
  1. template.put("goods", goods);
  2.     template.put("keys", keys);
  3.     System.out.println(JsonKit.toJson(template));
  4.     return template;
  5. }
复制代码
} ```
  
       
  • 在上面的代码中模拟多线程,一个线程取打印任务(Queue.take),当Queue队列为空时挂起。   
  • 另一个线程add PrintJob,这时挂起的线程会被唤起,完成打印任务   
  • 需要注意一点,[email protected] 的方法加载SQLite数据库,用于读取菜品, 子类重写test方法即可用Unit进行单元测试  
  另外强调一点:驱动打印文本时自动换行没有采用指令方便,项目中已经实现自动换行功能,有兴趣的可以看看实现方式:)



上一篇:JStorm-Alibaba —— Storm 的实时流式计算框架
下一篇:Vx32: portable, efficient, safe execution of untrusted x86 code
刘笛 投递于 2016-10-8 07:52:00
我来查水表的
回复 支持 反对

使用道具 举报

cola_cy 投递于 2016-10-9 09:44:42
最伤人的话,总出自最温柔的嘴。
回复 支持 反对

使用道具 举报

董堰平 投递于 2016-10-20 02:57:45
介是神马?!!
回复 支持 反对

使用道具 举报

我要投稿

推荐阅读


回页顶回复上一篇下一篇回列表
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 | 粤公网安备 44010402000842号 )

© 2001-2017 Comsenz Inc.

返回顶部 返回列表