关于web 服务打印

关于web 服务打印

现有一个餐饮社区团购,团长使用浏览器打开线上商城登陆本身的帐户,当该团长有新订单时则打印订单,一个收银打印机,一个后厨打印机javascript

web 打印一直是一个比较尴尬的问题,不过好在有不少第三方产品可供选择,至于哪一款更好相信每一个人都有属于本身的“车”。php

在解决问题过程当中,本人选择了 Lodop 打印。这款插件彻底知足以上需求 [ 除了水印以外 ]html

设备及软件

Lodop:Lodop综合版(Lodop6.226+CLodop3.083) [ 2019-05-23 目前官网是这个 ]java

打印机:Xprinter 80-c 网络打印机 [ 设置IP 的那种,-c是自动切纸 ]【 USB打印机不考虑,后厨可能会很远 】web

Xprinter 查看打印机信息:先关机->按住FEED键不要松->开机->松开FEED键,则会打印打印机的相关信息
打印机默认端口:9100。
打印机默认IP:192.168.0.xxx
能够去Xprinter 官网下载测试工具
若是修改不了的话,就设置一下路由器LAN口与打印机相同,而后浏览器登陆打印机IP进行设置,设置完成后再将路由器LAN口修改回来
eg:打印机默认IP:192.168.0.100
eg:路由器LAN口:192.168.1.1
eg:则须要将路由器LAN 口设置为:192.168.0.1
eg:设置完成后访问打印机IP 192.168.0.100 则能够看到设置页面相似下图:
访问打印机IP的设置界面浏览器

须要解决的问题:

服务器端如何链接线下的打印机服务器

解决方案:

web 服务器端:

1.下载 Lodop 软件
2.在web 服务器安装Lodop软件
3.将Lodop 的代码部署到web 项目首页页面 [ 方便监听订单 ]
4.在web项目首页页面编写打印票据的格式网络

Lodop 格式打印设计
在这里插入图片描述
5.写循环监听订单函数[ 固然是只监听登陆商户的了 ]
6.服务端选择本地打印机序号进行定向输出打印 [ 虽然是在服务器写的代码,但这里的本地,指的是商户端 ]app

得到打印设备和选择打印机输出
参考以上地址,发现 Lodop 能够获取本地打印机的个数以及打印机序号。那咱们使用打印机序号进行定向输出打印就能够了。svg

团长端:

1.安装与web服务器一样的 Lodop 软件
2.安装打印机控件
3.设置打印机IP
4.设置好后,可尝试打印测试页进行校验是否链接正常
5.此时能够查看本地打印机的序号,参考服务器端第 6 步连接

以上步骤完成后,当团长在浏览器访问web 服务器地址时,因在web服务器页面引入 Lodop 控件,而团长本地也安装了打印机和Lodop 插件,因此当有新订单时,Lodop 会根据服务器端设置的团长端打印机序号选择团长端打印机进行定向输出打印

服务器端代码

Html 页面引入 [ head 头内 ]

<script src="{__STATIC_PATH}Lop/LodopFuncs.js"></script>
    <object id="LODOP_OB" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width=0 height=0>
        <embed id="LODOP_EM" type="application/x-print-lodop" width=0 height=0></embed>
    </object>

Html 脚本 Script 内

var LODOP;
 //团长端打印机序号
 var strPrinterName = [0,1];
    /** * 打印函数 * @param printerPointer 打印机列表 * @param data 数据 * @constructor */
    function PrintByPrinterName(printerPointer,data) {
	    //遍历打印机序号
        for (var i = 0; i < printerPointer.length; i++) {
	        //设置当前打印机 SET_PRINTER_INDEXA
            if (LODOP.SET_PRINTER_INDEXA(printerPointer[i])) {
            	//遍历数据生成打印内容
                for(var j=0;j<data.length;j++){
                    CreatePrintPage(data[j]);
                    LODOP.PRINT();
                }
            }
        }
    }
    /** * 生成打印内容 * @param item 数据item * @constructor */
    function CreatePrintPage(item) {
        LODOP = getLodop();
        LODOP.SET_PRINT_MODE("PROGRAM_CONTENT_BYVAR",true);
        LODOP.SET_PRINT_PAGESIZE(3,700,45,'CreateCustomPage');//3高度自适应,700纸宽,45底部空白,CreateCustomPage自定义纸张类型
        LODOP.ADD_PRINT_TEXT(6,107,96,25,"故宫");
        LODOP.SET_PRINT_STYLEA(0,"FontSize",17);
        LODOP.SET_PRINT_STYLEA(0,"Horient",2);
        LODOP.ADD_PRINT_LINE(43,4,42,378,4,1);
        LODOP.ADD_PRINT_TEXT(56,29,58,33,"单号:");
        LODOP.ADD_PRINT_TEXT(56,63,310,33,item.order_id);
        LODOP.ADD_PRINT_TEXT(74,29,58,33,"日期:");
        LODOP.ADD_PRINT_TEXT(74,63,310,33,item.pay_time);
        LODOP.ADD_PRINT_TEXT(95,29,75,33,"名称");
        LODOP.ADD_PRINT_TEXT(95,119,75,33,"价格");
        LODOP.ADD_PRINT_TEXT(95,204,75,33,"数量");
        var marginTop=0;
        for(var k=0;k<item.detail.length;k++){
	        //产品与产品间隙
            marginTop=k*20;
            LODOP.ADD_PRINT_TEXT(120+marginTop,29,75,33,item.detail[k].store_name);
            LODOP.ADD_PRINT_TEXT(120+marginTop,119,75,33,item.detail[k].price);
            LODOP.ADD_PRINT_TEXT(120+marginTop,204,75,33,item.detail[k].cart_num);
        }
        LODOP.ADD_PRINT_TEXT(145+marginTop,29,75,20,"总数量:");
        LODOP.ADD_PRINT_TEXT(145+marginTop,119,75,20,item.total_num);
        LODOP.ADD_PRINT_TEXT(211+marginTop,29,75,20,"支付方式:");
        LODOP.ADD_PRINT_TEXT(211+marginTop,88,100,20,item.pay_type_name);
        LODOP.ADD_PRINT_TEXT(167+marginTop,29,75,20,"应收:");
        LODOP.ADD_PRINT_TEXT(167+marginTop,119,100,20,item.total_price);
        LODOP.ADD_PRINT_TEXT(190+marginTop,29,75,20,"实收:");
        LODOP.ADD_PRINT_TEXT(190+marginTop,119,100,20,item.pay_price);
        LODOP.ADD_PRINT_TEXT(233+marginTop,29,75,20,"配送社区:");
        LODOP.ADD_PRINT_TEXT(233+marginTop,88,273,20,item.user_address);
        LODOP.ADD_PRINT_TEXT(273+marginTop,29,75,20,"联系方式:");
        LODOP.ADD_PRINT_TEXT(273+marginTop,88,273,20,item.user_phone);
        LODOP.ADD_PRINT_TEXT(294+marginTop,29,75,20,"联系人:");
        LODOP.ADD_PRINT_TEXT(294+marginTop,88,273,20,item.real_name);
    }
    /** * 监听新订单 */
    function listenNewOrder() {
         $.post("{:Url('listenOrder')}", {kid: {$kid}}, function (res) {
              var result = JSON.parse(res);
              if (result.code !==400) {
                  var data=result.data,list=[];
                  for(var i=0;i<data.length;i++){
                  	var idxData=data[i];
                      var temp={
                          pay_time:idxData.pay_time,
                          order_id:idxData.order_id,
                          pay_price:idxData.pay_price,
                          pay_type_name:idxData.pay_type_name,
                          total_num:idxData.total_num,
                          total_price:idxData.total_price,
                          pay_time:idxData.pay_time,
                          user_address:idxData.user_address,
                          user_phone:idxData.user_phone,
                          real_name:idxData.real_name,
                          pay_time:idxData.pay_time,
                          pay_time:idxData.pay_time,
                          detail:[]
                      }
                      var info=idxData._info;
                      for(var j=0;j<info.length;j++){
                          var product=info[j].cart_info.productInfo;
                          var proInfo={
                              cart_num:info[j].cart_info.cart_num,
                              store_name:product.store_name,
                              price:product.price
                          }
                          temp.detail.push(proInfo);
                      }
                      list.push(temp);
                  }
                  PrintByPrinterName(strPrinterName,list);
              }
          })
    }
    function checkKid(){
     	var kid = {$kid};
        if (kid > 0) {
        	setInterval("listenNewOrder()",5000)
        }
    }
    checkKid();