记录一下,以为对接好最少要半天,没想到总的下来十几分钟就对接好了
OrderParam
public class OrderParam {
private String title;
private String price;
private String num;
public OrderParam() {
}
public OrderParam(String title, String price, String num) {
this.title = title;
this.price = price;
this.num = num;
}
@Override
public String toString() {
return "Order [title=" + title + ", price=" + price + ", num=" + num + "]";
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
}
PrintSmallTicketParam
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class PrintSmallTicketParam {
/**
* 打印机编号
*/
@ApiModelProperty(value = "打印机编号")
private String sn;
/**
* 订单排版
*/
@ApiModelProperty(value = "订单排版")
private List<OrderParam> orderParamList;
/**
* 订单排版
*/
@ApiModelProperty(value = "预约号")
private String number;
/**
* 订单排版
*/
@ApiModelProperty(value = "下单时间")
private String time;
/**
* 订单排版
*/
@ApiModelProperty(value = "订单编号")
private String orderNo;
/**
* 店铺/商品 类型(0:预约 1:在售)
*/
@ApiModelProperty(value = "店铺/商品 类型(0:预约 1:在售)")
private Integer shopType;
/**
* 送货地点
*/
@ApiModelProperty(value = "送货地点")
private String address;
/**
* 联系电话
*/
@ApiModelProperty(value = "联系电话")
private String phone;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remarks;
/**
* 姓名
*/
@ApiModelProperty(value = "姓名")
private String realName;
}
PrintSmallTicketUtil
import com.alibaba.fastjson.JSONObject;
import com.shop.cereshop.commons.utils.StringUtils;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.util.ObjectUtils;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@SuppressWarnings("static-access")
public class PrintSmallTicketUtil {
static PrintSmallTicketUtil p = new PrintSmallTicketUtil();
/**
* 不需要修改
*/
public static final String URL = "http://api.feieyun.cn/Api/Open/";
/**
* *必填*:飞鹅云后台注册账号
*/
public static final String USER = "xxxxxxx";
/**
* *必填*: 飞鹅云后台注册账号后生成的UKEY 【备注:这不是填打印机的KEY】
*/
public static final String UKEY = "xxxxxxxxxxx";
/**
* *必填*:打印机编号,必须要在管理后台里添加打印机或调用API接口添加之后,才能调用API
*/
// public static final String SN = "xxxxxxx";
// public static void main(String[] args) {
// ======================1.多个打印机同时打印======================================
// List<String> list = new ArrayList<>();
// list.add(SN);
// list.add(SN2);
// for (String sn : list) {
// String method1 = p.print(sn);
// System.out.println(method1);
// }
// ======================2单个打印机打印======================================
// p.writeFile("E:/retlog.txt", result);
// System.out.println("返回json数据已保存至 E:/retlog.txt 文件,有需要请查看");
// String result=printerTest(SN);
// System.out.println(result);
// }
//订单测试打印
public static String printerTest(String sn,Integer shopType){
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
OrderParam order1 = new OrderParam("xx牛仔裤-牛油果绿", "100.4", "1");
OrderParam order2 = new OrderParam("学生护甲油-透明", "10.3", "2");
OrderParam order3 = new OrderParam("可口可乐-瓶装", "3.5", "1");
OrderParam order4 = new OrderParam("哑铃-10KG", "50.2", "2");
OrderParam order5 = new OrderParam("xx同款衣服-白色V领", "100.2", "1");
List<OrderParam> orderLists = new ArrayList<>();
orderLists.add(order1);
orderLists.add(order2);
orderLists.add(order3);
orderLists.add(order4);
orderLists.add(order5);
PrintSmallTicketParam param=new PrintSmallTicketParam();
param.setRealName("陈XX");
param.setNumber("9999");
param.setOrderNo("0000000000001");
param.setSn(sn);
param.setOrderParamList(orderLists);
if(shopType==0){
param.setTime(DateAddDayNumber(simpleDateFormat.format(new Date()), 1, "yyyy-MM-dd HH:mm"));
param.setRemarks("明天这个点,麻烦预留一下哦~");
}else{
param.setTime(simpleDateFormat.format(new Date()));
param.setRemarks("麻烦检查好在送过来,感谢!!!");
}
param.setShopType(shopType);
param.setAddress("广东省广州市xxxxxxxxxxxxxx");
param.setPhone("173xxxxxx71");
// String result = p.printSmallTicket(param);
return p.printSmallTicket(param);
}
// =====================打印订单排版调用核心方法==========================
public static String printSmallTicket(PrintSmallTicketParam param) {
if(StringUtils.isBlank(param.getTime()) || StringUtils.isBlank(param.getSn())
|| ObjectUtils.isEmpty(param.getOrderParamList()) || StringUtils.isBlank(param.getOrderNo())
|| param.getShopType()==null){
return "param_null";
}
if(param.getShopType()>2){
return "shopType_param_error";
}
// =====================1.字体大小效果测试=====================================
// String s1 = "<C><DB>放大两倍</DB></C><BR>";
// String s2 = "<C><B>放大一倍</B></C><BR>";
// String s3 = "<C><L>变高一倍</L></C><BR>";
// String s4 = "<C><W>变宽一倍</W></C><BR>";
// String s5 = "<C><BOLD>字体加粗</BOLD></C><BR>";
// String s6 = "<C>默认不加标签最小效果</C><BR>";
// String s7 = "<C><L><BOLD>变高一倍加粗</BOLD></L></C><BR>";
// String s8 = "<C><W><BOLD>变宽一倍加粗</BOLD></W></C><BR>";
//
// String content = s1+s2+s3+s4+s5+s6+s7+s8;
// =====================1.end===================================
// =====================2.字体行间距测试======================================
// String content = "<CB>飞鹅云测试</CB><BR>";
// content += "名称 单价 数量 金额<BR>";
// content += "--------------------------------<BR>";
// content += "鸡蛋炒饭1 100.0 1 100.0<BR>";
// content += "鸡蛋炒饭2 100.0 2 200.0<BR>";
// content += "鸡蛋炒饭3 100.0 3 300.0<BR>";
// byte[] spaces = new byte[3];
// spaces[0] = 0x1b;
// spaces[1] = 0x33;
// spaces[2] = 0x30;//7f => 50 行距距离设置最小值为\x50 最大值为\x7f
// String ls = new String(spaces);//行距开始
// byte[] spacee = new byte[2];
// spacee[0] = 0x1b;
// spacee[1] = 0x32;
// String le = new String(spacee);//行距结束
// content += ls+content+le;
// =====================2.end======================================
// =====================3.字体大小测试===========================================
// String content = "鸡蛋炒饭 数量:1 单价:100.0 总额:100.0<BR>";
// byte[] start = new byte[3];
// start[0] = 0x1d;
// start[1] = 0x21;
// start[2] = 0x11;//7f => 50 行距距离设置最小值为\x50 最大值为\x7f
// String ls = new String(start);//行距开始
// byte[] end = new byte[4];
// end[0] = 0x0d;
// end[1] = 0x0a;
// end[2] = 0x1b;
// end[3] = 0x40;
// String le = new String(end);//行距结束
// content += ls+content+le;
// =====================3.end=======================================
// *********************4.排版测试*******************************************************************
// Order order1 = new Order("荣耀 畅玩7 2+16G(全网通)-黑(爱施德集采)/Android", "100.4", "10");
// Order order2 = new Order("小蘑菇音乐铃 JSN-3022 -文创 UP+", "10.3", "10");
// Order order3 = new Order("功夫小子 手机座 JSN-1002-文创 UP+", "10.5", "10");
// Order order4 = new Order("zsfhjksgh菜名四dk", "10.0", "8");
// Order order5 = new Order("zsfhjksghd菜名五hjk", "100.2", "8");
//
// List<Order> orderLists = new ArrayList<>();
// orderLists.add(order1);
// orderLists.add(order2);
// orderLists.add(order3);
// orderLists.add(order4);
// orderLists.add(order5);
//orderList为数组 b1代表名称列占用(14个字节) b2单价列(6个字节) b3数量列(3个字节) b4金额列(6个字节)-->这里的字节数可按自己需求自由改写,14+6+3+6再加上代码写的3个空格就是32了,58mm打印机一行总占32字节
//姓名加密处理
String content = p.getOrder(param, 14, 6, 3, 6);
// 通过POST请求,发送打印信息到服务器
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(30000)// 读取超时
.setConnectTimeout(30000)// 连接超时
.build();
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
HttpPost post = new HttpPost(URL);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("user", USER));
String STIME = String.valueOf(System.currentTimeMillis() / 1000);
nvps.add(new BasicNameValuePair("stime", STIME));
nvps.add(new BasicNameValuePair("sig", p.signature(USER, UKEY, STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));// 固定值,不需要修改
nvps.add(new BasicNameValuePair("sn", param.getSn()));
nvps.add(new BasicNameValuePair("content", content));
nvps.add(new BasicNameValuePair("times", "1"));// 打印联数
CloseableHttpResponse response = null;
String result = null;
try {
post.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
response = httpClient.execute(post);
int statecode = response.getStatusLine().getStatusCode();
if (statecode == 200) {
HttpEntity httpentity = response.getEntity();
if (httpentity != null) {
// 服务器返回的JSON字符串,建议要当做日志记录起来
result = EntityUtils.toString(httpentity);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
p.close(response, post, httpClient);
}
JSONObject jsonObject=JSONObject.parseObject(result);
return jsonObject.getString("msg");
}
public void writeFile(String path, String content) {
content = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date()) + ",保存的订单日志信息为: " + content;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path, true);
fos.write(content.getBytes());
fos.write("\r<BR>".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static String signature(String USER, String UKEY, String STIME) {
return DigestUtils.sha1Hex(USER + UKEY + STIME);
}
//飞鹅技术支持
//#########################################################################################################
//进行订单的多列排版demo,实现商品超出字数的自动换下一行对齐处理,同时保持各列进行对齐
//排版原理是统计字符串字节数,补空格换行处理
//58mm的机器,一行打印16个汉字,32个字母;80mm的机器,一行打印24个汉字,48个字母
//#########################################################################################################
//orderList为数组 b1代表名称列占用字节 b2单价列 b3数量列 b4金额列-->这里的字节数可按自己需求自由改写,详细往上看112行调用实际例子运用
public static String getOrder(PrintSmallTicketParam param, int b1, int b2, int b3, int b4) {
String orderInfo = null;
if(param.getShopType()==0) {
orderInfo = "<CB>天邻里预约订单</CB><BR>";
}else if(param.getShopType()==1) {
orderInfo = "<CB>天邻里订单</CB><BR>";
}
orderInfo += "<BOLD>订单号:" + param.getOrderNo() + "</BOLD><BR>";
orderInfo += "名称 单价 数量 金额<BR>";
orderInfo += "--------------------------------<BR>";
List<OrderParam> orderParamList = param.getOrderParamList();
double totals = 0.0;
for (int i = 0; i < orderParamList.size(); i++) {
String title = orderParamList.get(i).getTitle();
String price = orderParamList.get(i).getPrice();
String num = orderParamList.get(i).getNum();
String total = "" + Double.valueOf(price) * Integer.parseInt(num);
totals += Double.parseDouble(total);
price = p.addSpace(price, b2);
num = p.addSpace(num, b3);
total = p.addSpace(total, b4);
String otherStr = " " + price + num + " " + total;
int tl = 0;
try {
tl = title.getBytes("GBK").length;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
int spaceNum = (tl / b1 + 1) * b1 - tl;
if (tl < b1) {
for (int k = 0; k < spaceNum; k++) {
title += " ";
}
title += otherStr;
} else if (tl == b1) {
title += otherStr;
} else {
List<String> list = null;
if (p.isEn(title)) {
list = p.getStrList(title, b1);
} else {
list = p.getStrList(title, b1 / 2);
}
String s0 = p.titleAddSpace(list.get(0));
title = s0 + otherStr + "<BR>";// 添加 单价 数量 总额
String s = "";
for (int k = 1; k < list.size(); k++) {
s += list.get(k);
}
try {
s = p.getStringByEnter(b1, s);
} catch (Exception e) {
e.printStackTrace();
}
title += s;
}
orderInfo += title + "<BR>";
}
orderInfo += "--------------------------------<BR>";
orderInfo += "合计:" + totals + "元<BR>";
orderInfo += "--------------------------------<BR>";
orderInfo += "姓名:" + param.getRealName() + "<BR>";
if(param.getShopType()==0) {
orderInfo += "<B><BOLD>预约号:" + param.getNumber() + "</BOLD></B><BR>";
orderInfo += "<BOLD>服务时间:" + param.getTime() + "</BOLD><BR>";
}else if(param.getShopType()==1){
orderInfo += "联系电话:<BOLD><B>" + param.getPhone() + "</B></BOLD><BR>";
orderInfo += "送货地址:" + param.getAddress() + "<BR>";
orderInfo += "下单时间:<BOLD>" + param.getTime() + "</BOLD><BR>";
}
orderInfo += "--------------------------------<BR>";
if (StringUtils.isNotBlank(param.getRemarks())) {
orderInfo += "<BOLD>备注:" + param.getRemarks() + "</BOLD><BR>";
}else{
orderInfo += "<BOLD>备注:</BOLD><BR>";
}
// orderInfo += "订餐时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "<BR>";
// orderInfo += "备注:加辣<BR>";
// orderInfo += "<QR>http://42.193.180.111:10599/city/sinopec/164102604446494720.png</QR>";
return orderInfo;
}
public String titleAddSpace(String str) {
int k = 0;
int b = 14;
try {
k = str.getBytes("GBK").length;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
for (int i = 0; i < b - k; i++) {
str += " ";
}
return str;
}
public static String getStringByEnter(int length, String string) throws Exception {
for (int i = 1; i <= string.length(); i++) {
if (string.substring(0, i).getBytes("GBK").length > length) {
return string.substring(0, i - 1) + "<BR>" + getStringByEnter(length, string.substring(i - 1));
}
}
return string;
}
public static String addSpace(String str, int size) {
int len = str.length();
if (len < size) {
for (int i = 0; i < size - len; i++) {
str += " ";
}
}
return str;
}
public static Boolean isEn(String str) {
Boolean b = false;
try {
b = str.getBytes("GBK").length == str.length();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return b;
}
public static List<String> getStrList(String inputString, int length) {
int size = inputString.length() / length;
if (inputString.length() % length != 0) {
size += 1;
}
return getStrList(inputString, length, size);
}
public static List<String> getStrList(String inputString, int length, int size) {
List<String> list = new ArrayList<String>();
for (int index = 0; index < size; index++) {
String childStr = substring(inputString, index * length, (index + 1) * length);
list.add(childStr);
}
return list;
}
public static String substring(String str, int f, int t) {
if (f > str.length()) {
return null;
}
if (t > str.length()) {
return str.substring(f, str.length());
} else {
return str.substring(f, t);
}
}
public static void close(CloseableHttpResponse response, HttpPost post, CloseableHttpClient httpClient) {
try {
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
post.abort();
} catch (Exception e) {
e.printStackTrace();
}
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static String DateAddDayNumber(String nowDate, Integer number, String fmt) {
String endDate = "";
SimpleDateFormat sdf = new SimpleDateFormat(fmt);
Date creatTime = null;
try {
creatTime = sdf.parse(nowDate);
Calendar rightNow = Calendar.getInstance();
rightNow.setTime(creatTime);
rightNow.add(Calendar.DAY_OF_YEAR, number); //日期加有效天数
creatTime = rightNow.getTime();
endDate = sdf.format(creatTime);
} catch (ParseException e) {
e.printStackTrace();
}
return endDate;
}
}