【Android】Android 集成佳博80打印机打印票据

news/2024/11/29 4:32:12/

文章目录

  • 【Android】Android 集成佳博80打印机打印票据
    • 1、集成佳博80打印机依赖
    • 2、规范调用接口
    • 3、使用到的相关对象以及工具类
    • 4、MainActivity初始化接口
    • 5、Uniapp调用方法
  • 技术分享区

【Android】Android 集成佳博80打印机打印票据

1、集成佳博80打印机依赖

相关依赖在佳博的技术支持下载,然后导入到项目即可

implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.7'compile files('libs/gprintersdkv1.jar')

2、规范调用接口

个人习惯,先写接口,再写功能实现类

import java.util.List;/*** 佳博网口打印机** @author Tellsea* @date 2021-8-11*/
public interface NetworkPrintingService {/*** 制作单** @param param*/void makeFoodOrderPrinting(String param);}

实现接口

import android.webkit.JavascriptInterface;
import android.widget.Toast;import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.gprinter.command.EscCommand;
import com.gprinter.io.EthernetPort;
import com.zhhy.spotorder.app.cashier.MainActivity;
import com.zhhy.spotorder.app.cashier.entity.BizStoreNetwork;
import com.zhhy.spotorder.app.cashier.entity.OrderPrinting;
import com.zhhy.spotorder.app.cashier.entity.OrderPrintingDetail;
import com.zhhy.spotorder.app.cashier.service.NetworkPrintingService;
import com.zhhy.spotorder.app.cashier.utils.IntegerUtils;import org.apache.commons.lang3.StringUtils;import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;/*** 佳博网口打印机** @author Tellsea* @date 2021-8-11*/
public class NetworkPrintingServiceImpl implements NetworkPrintingService {private static Map<String, EthernetPort> ethernetPortMap = new HashMap<>();/*** 制作单** @param param*/@Override@JavascriptInterfacepublic void makeFoodOrderPrinting(String param) {System.out.println("制作单参数:" + param);if (param.isEmpty()) {Toast.makeText(MainActivity.CONTEXT, "打印参数不能为空", Toast.LENGTH_LONG).show();return;}Map<String, String> paramMap = new Gson().fromJson(param, new TypeToken<Map<String, String>>() {}.getType());for (Map.Entry<String, String> entry : paramMap.entrySet()) {BizStoreNetwork storeNetwork = new Gson().fromJson(entry.getKey(), BizStoreNetwork.class);OrderPrinting entity = new Gson().fromJson(entry.getValue(), OrderPrinting.class);if (entity.getOrderDetailList().isEmpty()) {Toast.makeText(MainActivity.CONTEXT, "佳博打印机:商品为空", Toast.LENGTH_LONG).show();continue;}EthernetPort ethernetPort = ethernetPortConn(storeNetwork.getPrinterIp(), storeNetwork.getPrinterPort());if (ethernetPort == null) {continue;}EscCommand esc = new EscCommand();esc.addInitializePrinter();// 大文字esc.addSetKanjiFontMode(EscCommand.ENABLE.ON, EscCommand.ENABLE.ON, EscCommand.ENABLE.OFF);// 大数字esc.addSelectPrintModes(EscCommand.FONT.FONTA, EscCommand.ENABLE.OFF, EscCommand.ENABLE.ON, EscCommand.ENABLE.ON, EscCommand.ENABLE.OFF);esc.addSelectJustification(EscCommand.JUSTIFICATION.CENTER);esc.addText("制作单 " + entity.getTakeOrderNumber() + "\n");esc.addText(entity.getStoreName() + "\n");esc.addPrintAndLineFeed();esc.addSelectJustification(EscCommand.JUSTIFICATION.LEFT);esc.addText("------------------------\n");esc.addText("桌台号:" + entity.getDeskName() + "\n");esc.addText("桌台类型:" + entity.getDeskType() + "\n");esc.addText("订单号:\n");esc.addText(entity.getOrderNumber() + "\n");esc.addText("------------------------\n");esc.addPrintAndLineFeed();esc.addText("菜名");esc.addSetHorAndVerMotionUnits((byte) 7, (byte) 0);esc.addSetAbsolutePrintPosition((short) 13);esc.addText("数量");esc.addSetHorAndVerMotionUnits((byte) 10, (byte) 0);esc.addSetAbsolutePrintPosition((short) 26);esc.addText("单价");esc.addPrintAndLineFeed();esc.addText("------------------------\n");for (OrderPrintingDetail item : entity.getOrderDetailList()) {esc.addText(item.getSpuTitle());esc.addSetHorAndVerMotionUnits((byte) 7, (byte) 0);esc.addSetAbsolutePrintPosition((short) 13);esc.addText(String.valueOf(item.getNumber()));esc.addSetHorAndVerMotionUnits((byte) 10, (byte) 0);esc.addSetAbsolutePrintPosition((short) 26);esc.addText(String.valueOf(item.getSpuSellPrice()));esc.addPrintAndLineFeed();String content = "";if (IntegerUtils.eq(item.getSpuAttrType(), 2) && StringUtils.isNotEmpty(item.getSpuDescription())) {content += item.getSpuDescription();}if (StringUtils.isNotEmpty(item.getSpuRemark())) {if (StringUtils.isEmpty(content)) {content += ",";}content += item.getSpuRemark();}if (StringUtils.isNotEmpty(content)) {esc.addText(content);esc.addPrintAndLineFeed();}}esc.addText("------------------------\n");esc.addText("总计:" + entity.getPayMoney() + "\n");esc.addText("------------------------\n");esc.addPrintAndFeedLines((byte) 6);esc.addCutPaper();Vector<Byte> data = esc.getCommand();try {ethernetPort.writeDataImmediately(data);} catch (IOException e) {e.printStackTrace();}}}/*** 以太网连接** @param ip   连接 wifi 的 ip 地址* @param port 连接 wifi 的端口号*/public EthernetPort ethernetPortConn(String ip, int port) {if (ethernetPortMap.get(ip) == null) {// 第一次连接EthernetPort ethernetPort = new EthernetPort(ip, port);if (ethernetPort.openPort()) {Toast.makeText(MainActivity.CONTEXT, "以太网连接打印机成功", Toast.LENGTH_SHORT).show();ethernetPortMap.put(ip, ethernetPort);return ethernetPort;}Toast.makeText(MainActivity.CONTEXT, "以太网连接打印机失败:IP:" + ip + ",端口:" + port, Toast.LENGTH_SHORT).show();return null;}// 已经连接成功if (ethernetPortMap.containsKey(ip)) {return ethernetPortMap.get(ip);}ethernetPortMap.remove(ip);Toast.makeText(MainActivity.CONTEXT, "以太网连接打印机失败:IP:" + ip + ",端口:" + port, Toast.LENGTH_SHORT).show();return null;}
}

3、使用到的相关对象以及工具类

订单对象

/*** 预结账单** @author Tellsea* @date 2021/07/22*/
@Data
@Accessors(chain = true)
public class OrderPrinting {private Long id;private String storeName;private String takeOrderNumber;private String deskName;private String deskType;private String orderNumber;private String serialNumber;private List<OrderPrintingDetail> orderDetailList;private BigDecimal originPrice;private BigDecimal reducePrice;private BigDecimal integerPrice;private String payWayName;private BigDecimal payMoney;private String placeOrderTime;private String payTime;private String orderRemark;
}

订单商品对象

/*** 商品信息** @author Tellsea* @date 2021/07/22*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class OrderPrintingDetail {private Long spuAttrType;private String spuTitle;private String spuDescription;private BigDecimal number;private BigDecimal spuSellPrice;private String spuRemark;}

打印机参数

import lombok.Data;
import lombok.experimental.Accessors;/*** 网口打印机** @author Tellsea* @date 2021-8-11*/
@Data
@Accessors(chain = true)
public class BizStoreNetwork {/*** 打印机IP*/private String printerIp;/*** 打印机端口*/private int printerPort;/*** 连接允许超时时间*/private int timeout = 1000;
}

使用到的比较工具类

/*** Integer 类型工具类* 原符号       <       <=      >       >=      <>* 对应函数    lt()     le()    gt()    ge()    ne()** @author Tellsea* @date 2021/04/12*/
public class IntegerUtils {/*** 等于** @param val1* @param val2* @return*/public static boolean eq(Integer val1, Integer val2) {if (val1 != null && val2 != null) {return val1.intValue() == val2.intValue();}return false;}public static boolean eq(Long val1, Integer val2) {if (val1 != null && val2 != null) {return val1.intValue() == val2.intValue();}return false;}/*** 大于** @param val1* @param val2* @return*/public static boolean gt(Integer val1, Integer val2) {if (val1 != null && val2 != null) {return val1.intValue() > val2.intValue();}return false;}public static boolean gt(Long val1, Integer val2) {if (val1 != null && val2 != null) {return val1.intValue() > val2.intValue();}return false;}/*** 小于** @param val1* @param val2* @return*/public static boolean lt(Integer val1, Integer val2) {if (val1 != null && val2 != null) {return val1.intValue() < val2.intValue();}return false;}/*** 大于等于** @param val1* @param val2* @return*/public static boolean ge(Integer val1, Integer val2) {if (val1 != null && val2 != null) {return (val1.intValue() > val2.intValue()) || (val1.intValue() == val2.intValue());}return false;}/*** 小于等于** @param val1* @param val2* @return*/public static boolean le(Integer val1, Integer val2) {if (val1 != null && val2 != null) {return (val1.intValue() < val2.intValue()) || (val1.intValue() == val2.intValue());}return false;}/*** 不等于** @param val1* @param val2* @return*/public static boolean ne(Integer val1, Integer val2) {if (val1 != null && val2 != null) {return val1.intValue() != val2.intValue();}return false;}
}

4、MainActivity初始化接口

// 佳博打印机初始化
NetworkPrintingService networkPrintingService = new NetworkPrintingServiceImpl();

5、Uniapp调用方法

在接口方法已经使用了@JavascriptInterface注解,可以使用JavaScript直接调用

/*** 制作单*/
function makeFoodNetwork(param) {window.networkPrinting.makeFoodOrderPrinting(param);
}

技术分享区

在这里插入图片描述


http://www.ppmy.cn/news/653834.html

相关文章

JAVA使用springboot整合佳博标签打印机(一)

呕心沥血啊,这个打印机真好玩(反话)! 佳博打印机官网:http://cn.gainscha.com/gjxz.html 1.标题打印机品牌:佳博打印机 佳博有个官网,二次开发文件可以去管网下载,需要注意的是,他的示例只有一个条形码打印示例(不带下面的编号) 2.标签纸规格 左边条形码标签纸规格:10mm40mm…

佳博android sdk,小白封装佳博gprintersdkv2.2,漫漫长路(一)

以前用用这个做了个APP,觉得模块库好用,很多都免费,基本功能都能实现,距做上一个APP已经好久了,我除了会写一点网页(ASP),不会设计,只专注做一些功能外,我其它基本什么都不会。现在项目需要一个蓝牙打印的,到库里一看,好贵。但人家的封装确实牛,贵也有道理…

佳博打印机安装教程

佳博公司出品的GP-3120TUA及GP-3200TUA系列热敏式条码打印机将以合理的经济价位提供给您安全可靠且高效的打印品质。同时GP-3120TUA及GP-3200TUA的超强功能及操作简便的特性&#xff0c;在热敏式感应条码打印机中&#xff0c;是您的最佳选择。 佳博条码打印机能够满足实时、批…

java 佳博打印机,佳博蓝牙打印的java 连接

适用于gp-3120tu机型通过蓝牙协议与android app的对接, 用的是TSC指令. package com.freestyle.demo; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.HandlerThread;…

佳博网口打印机驱动安装

内容包括 查看打印机的自检页信息设置打印机的ip地址&#xff08;设置打印机网络配置&#xff09;驱动安装和测试总结 查看打印机自建信息 把打印机用一个网线连接到路由器&#xff0c;接通电源&#xff0c;按住feed键不放&#xff0c;然后开机&#xff0c;等几秒后放开feed键…

【vue】- 简易版筛选组件可展开/收起

仅做记录&#xff0c;未整理格式 css部分未完全&#xff0c;每个筛选条件为固定宽度 实现效果 单行筛选条件时不触发更多按钮&#xff0c;且做占位处理 多行筛选条件时默认收起 同时设定最大/最小宽度并监听该组件宽度变化 filter.vue组件 <template><div :cla…

《移动互联网技术》第九章 感知与多媒体: 了解质感设计的基本原则和设计方法

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

PC端微信扫码登陆

1、跳转URL扫码 https://open.weixin.qq.com/connect/qrconnect?appidAPPID&redirect_uriREDIRECT_URI&response_typecode&scopeSCOPE&stateSTATE#wechat_redirect 2、内置微信二维码扫码登陆 mounted() {// 编码回调地址let url encodeURIComponent(proces…