zoukankan      html  css  js  c++  java
  • 商家自动打印订单小票,原来可以这样做

    如何借助云开发让小程序自动打印小票?

    很多商家,尤其是餐饮/超市行业的商家,他们的小程序在收到新订单的时候,无法像美团那样自动打印订单小票,这给他们配货、送货带来很大的不便。所以他们非常希望小程序能够对接小票打印机自动打印小票,我们今天就介绍一下如何通过云开发实现这个功能。

    1、 准备一台网络小票打印机

    我们以飞鹅这个牌子为例。首先购买一台飞鹅打印机,然后在飞鹅网站上注册成为开发者,添加这台打印机,USER和UKEY会用在云开发后台来调用打印机。

    2、云开发后台调用打印机

    在打印机所有接口中,最重要是“小票机打印订单”这个接口。在这个接口中,我们看到只需要将打印参数组装好,然后通过POST请求发送给URL即可。

    代码非常简单,如下:

    request('http://api.feieyun.cn/Api/Open/', qs.stringify(postData))

    postData是要发送的数据,因为打印机要求请求头是:
    application/x-www-form-urlencoded,所以请注意请求头而且请求数据需要进行qs.stringify()拼接操作。至于postData的具体内容将在第3步中介绍。

    3、postData组成

    根据文档,数据由用户名、时间戳、签名、接口名、打印机编号、打印内容、打印次数等组合而成。我们按照要求将数据进行组合就行了。

    代码非常简单,如下:

      const postData = {
          user: USER,   //用户名 
          stime:timeStamp, //时间戳
          sig: crypto.createHash('sha1').update(USER + UKEY + timeStamp).digest('hex'),//签名
          apiname: "Open_printMsg",
          sn: printer, //打印机编号
          content: util.formatOrderInfo (orderInfo), //打印内容
          times: times,//打印份数
        };
    

    4、打印效果如下

    5、打印格式参考代码

    打印内容处理:

    const formatOrderInfo = function (cloudOrder, name = '') {
    var orderInfo = '<CB>' + name + ' 新订单</CB><BR>';
    orderInfo = '<B>' + cloudOrder.startDate + '</B><BR><BR>';
    orderInfo += '名称  数量  单价  总价<BR>';
    orderInfo += '--------------------------------<BR>';
    for (var i = 0; i < cloudOrder.products.length; i++) {
      let price = cloudOrder.products[i].price
      orderInfo += cloudOrder.products[i].name + ' ' + cloudOrder.products[i].label + hanleSpace(cloudOrder.products[i].name + ' ' + cloudOrder.products[i].label, 16) + cloudOrder.products[i].number + hanleSpace(cloudOrder.products[i].number.toString(), 4) + price + hanleSpace(price.toString(), 6) + parseFloat(parseFloat(cloudOrder.products[i].number * price).toFixed(2)) + '<BR><BR>';
    }
    if (cloudOrder.coupon) orderInfo += "优惠券抵扣: -" + cloudOrder.coupon.disCount + "<BR>";
    if (cloudOrder.remark) orderInfo += "<B>备注:" + cloudOrder.remark + "</B><BR>";
    orderInfo += '--------------------------------<BR>';
    orderInfo += '<B>总计:' + cloudOrder.amount + '元</B><BR>';
    orderInfo += '<B>' + cloudOrder.linkMan + ' ' + cloudOrder.mobile + "</B><BR>";
    if (cloudOrder.city || cloudOrder.address) orderInfo += '<B>' + cloudOrder.city + cloudOrder.address + "</B><BR>";
    
    orderInfo += '支付方式:' + cloudOrder.payWay + "<BR>";
    orderInfo += '下单时间:' + cloudOrder.dateTime + "<BR>";
    orderInfo += "订单编号:" + cloudOrder.orderId + "<BR>";
    orderInfo += "下单手机:" + cloudOrder.phoneNumber + "<BR>";
    orderInfo += "会员卡号:" + cloudOrder.cardNumber + "<BR>";
    
    //orderInfo += '<QR>http://www.pcloud.ac.cn</QR>'; 
    return orderInfo
      }
    

    空格处理:

    const hanleSpace = function (item, widht) {
      var len = 0;
      for (var j = 0; j < item.length; j++) {
    var c = item.charCodeAt(j);
    //单字节加1 
    if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
      len++;
    } else {
      len += 2;
    }
      }
      let tmp = widht - len % 32
      len = tmp > 0 ? tmp : 32 + tmp;
      var kong = '';
      for (var a = 0; a < len; a++) {
    kong += ' ';
      }
      return kong
    }
  • 相关阅读:
    MVC项目实践,在三层架构下实现SportsStore-04,实现分页
    MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
    MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层
    MVC单元测试,使用Repository模式、Ninject、Moq
    MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
    rsync算法原理和工作流程分析
    man rsync翻译(rsync命令中文手册)
    rsync工作机制(翻译)
    rsync技术报告(翻译)
    第2章 rsync(二):inotify+rsync详细说明和sersync
  • 原文地址:https://www.cnblogs.com/CloudBase/p/12704712.html
Copyright © 2011-2022 走看看