如何在uniapp中接入商米打印等硬件功能

1,673 阅读4分钟

uniapp 是目前比较主流的开发框架支持一套代码多端部署,本文主要讲解uniapp如何使用商米机型实现打印,扫码,开钱箱等功能实现,实现功能需借助原生sdk,可在插件市场获取

适用机器

插件已测试商米机型 V2手持机 T1,T2 ,其他的机子尚未经过测试,如有问题可联系作者

插件已功能

  1. 实现商超类型票据打印,适配58mm,80mm页面纸张类型
  2. 实现收银机USB外接扫码枪获取商品条码,原理通过广播监听扫码数据,并回调通知收扫码结果,无需使用input组件。(解决input组件弹出键盘问题,失去焦点无法获取内容问题)
  3. 钱箱功能
  4. 切刀功能(仅支持有切刀的机型)
  5. 台式机主副屏通信

插件不足

因为票据模板内容各方有不同的需求,无法满足各位的不同显示效果,同时为了考虑插件的易用性,尽可能封装好直接调用,大家也懒得再看一大堆的文档和参数。

打印小票效果

如何使用

代码使用

因为考虑需求比较简单所以再接口设计方面并未考虑太复杂

1. 初始化插件

//引用插件对象以来
const shangMiPrint = uni.requireNativePlugin('G5KJ-ShangMiPrint')
const globalEvent = uni.requireNativePlugin('globalEvent');

//onLoad函数中执行始化插件
onLoad() {
	let _this=this;
	shangMiPrint.init(function(e){
		uni.showModal({
			content:"回调返回结果:"+JSON.stringify(e)
		})		
	})
	//扫码返回
	globalEvent.addEventListener('scancode',function(e){
		uni.showModal({
			content:"回调返回结果:"+JSON.stringify(e)
		})
		_this.code=e.data
	})
}

2. 类超市外卖小票打印

//打印调用
let data={
		title:"广西*****馆",
		subTitel:"收银小票单据",
		orderTotalPrice:"¥59",
		printUser:"收银员校长",
		orderId:"843905060353",
		saleRel:"0776-72939424 李亮",
		goods:[
				{
					goodName:"植护牌压花纸纸巾/56抽",
					goodNum:'1',
					goodNo:'78905060353',
					goodPrice:'¥17',
					goodTotalPrice:'¥17'
				},
				{
					goodName:"植护牌压花纸纸巾/56抽",
					goodNum:'1',
					goodNo:'78905060353',
					goodPrice:'¥17',
					goodTotalPrice:'¥17'
				},
			 ]
	   }
	shangMiPrint.printTicket(data,function(e){
		//打印返回结果:{code:ok}
		alert(JSON.stringify(e))
	})

打印字段字典说明

  • data字段说明
字段类型默认注释
titlevarchar(32)主标题
subTitelvarchar(16)副标题
orderTotalPricevarchar(20)实收总金额
printUservarchar(20)收银员
orderIdvarchar(32)0订单/流水ID
saleRelvarchar(32)0售后联系
goodsarray()0商品品列表
  • data.goods对象字段说明
字段类型默认注释
goodNamevarchar(32)商品名称
goodNumvarchar(16)购买数量
goodNovarchar(20)商品编号
goodPricevarchar(20)商品单价
goodTotalPricevarchar(32)0合计总价

3. 钱箱相关

//打开钱箱
shangMiPrint.openDrawer(function(e){
	//
	if(e.code=='ok'){
	}
})
//获取钱箱状态
shangMiPrint.getDrawerStatus(function(e){
	//true正常
	if(e.data==true){
	}
})

4. 二维码票务打印


let printData = []
let _this = this
let printTicketItem={
      title: item.commodityName,//主标题
      subTitle: item.saleName,//副标题
      code: item.checkCode,//票码
      indentId: item.indentId,// 订单Id
      useDate: _this.dateFormat(item.useTime, 'YYYY-MM-DD'),//使用时间
      saleDate: _this.dateFormat(item.initime, 'YYYY-MM-DD'),//销售时间
     'remark': '本门票仅限当天使用,欢迎您的到来'
 }
 
shangMiPrint.printTicketTemplet({
          templetId: 'LY01',
          cut: true,
          data: printData//传入数组
        }, function(e) {
			//判断业务漏记
		}
)
        

4. 主副屏通信

//price 为空时,主动关闭副屏
shangMiPrint.showPriceText({
			title: '总金额',
			content: '¥' + a,
			price: a + ""
			}, function() {
  
			}
);
        

客显效果图 kqhfavrq.png

调用方法列表

1. 插件初始化

  • init(func) 参数func:初始化成功回调

2. 小票打印

  • printTicket(data,func)

参数data:打印数据 参数func:执行回调结果

3. 钱箱相关

  • openDrawer(func)打开钱箱
  • getDrawerStatus (func) 获取钱箱状态

3. 二维码票务打印

  • printTicketTemplet(func)打印带二维码小票(景区票务,排号码等使用)

3. 主副屏通信显示价格

  • showPriceText(func)显示价格(景区票务,排号码等使用)

事件监听

usb接口扫码枪返回条码

  • scancode 事件监听回调

const globalEvent = uni.requireNativePlugin('globalEvent')
onLoad(){
    let _this=this
	globalEvent.addEventListener('scancode',function(e){
		uni.showModal({
			content:"回调返回结果:"+JSON.stringify(e)
		})
		//返回内容:{code:ok,data:'条码\n'}
		_this.code=e.data
	})


}

使用注意问题

  1. 插件使用调试需要先自定义打包基座,在进行测试,自定义基座可查看官方教程。 nativesupport.dcloud.net.cn/NativePlugi…

  2. 使用插件无法打包 检查是否使用其他商米插件,同类型插件无法共同兼容使用

如何获取使用插件

本篇幅功能使用到的插件,为避免推广链接等嫌疑,可私信发我获取。