一、访问飞鹅云官网
http://www.feieyun.com/open/index.html
参考官网对接指引:
1、注册开发者账号
2、对接API
3、阅读飞鹅云远程接口请求调用
4、可参考官方提供的SDK
二、实际项目工程使用
对接官网必接接口,根据自身需求对接所需接口。以下为接口调用示例,根据自身项目需求自行调整:
package com.xunjing.smartCatering.modular.test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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;
public class FeiEPrinterApiDemo {
public static final String URL = "http://api.feieyun.cn/Api/Open/";//不需要修改
public static final String USER = "";//账号名
public static final String UKEY = "";//飞鹅云后台注册账号后生成的UKEY
public static final String SN = "";// *必填*:打印机编号,必须要在管理后台里添加打印机或调用API接口添加之后,才能调用API
//**********测试时,打开下面注释掉方法的即可,更多接口文档信息,请访问官网开放平台查看**********
public static void main(String[] args) throws Exception {
//==================添加打印机接口(支持批量)==================
//***返回值JSON字符串***
//正确例子:{"msg":"ok","ret":0,"data":{"ok":["sn#key#remark#carnum","316500011#abcdefgh#快餐前台"],"no":["316500012#abcdefgh#快餐前台#13688889999 (错误:识别码不正确)"]},"serverExecutedTime":3}
//错误:{"msg":"参数错误 : 该帐号未注册.","ret":-2,"data":null,"serverExecutedTime":37}
//提示:打印机编号(必填) # 打印机识别码(必填) # 备注名称(选填) # 流量卡号码(选填),多台打印机请换行(\n)添加新打印机信息,每次最多100行(台)。
String snlist = "720511182#ky8d777c#null#";
String method = addprinter(snlist);
System.out.println(method);
//==================方法1.小票机打印订单接口==================
//***返回值JSON字符串***
//成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}
//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
// String method1 = print(SN);//该接口只能是小票机使用,如购买的是标签机请使用下面方法2,调用打印
// System.out.println(method1);
//==================方法2.标签机专用打印订单接口==================
//***返回值JSON字符串***
//成功:{"msg":"ok","ret":0,"data":"xxxxxxx_xxxxxxxx_xxxxxxxx","serverExecutedTime":5}
//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
// String method2 = printLabelMsg(SN);//打开注释调用标签机打印接口进行打印,该接口只能是标签机使用,其它型号打印机请勿使用该接口
// System.out.println(method2);
//===========方法3.查询某订单是否打印成功=============
//***返回值JSON字符串***
//成功:{"msg":"ok","ret":0,"data":true,"serverExecutedTime":2}//data:true为已打印,false为未打印
//失败:{"msg":"错误描述","ret":非0, "data":null,"serverExecutedTime":7}
// String orderid = "xxxxxxx_xxxxxxxx_xxxxxxxx";//订单ID,从方法1返回值data获取
// String method3 = queryOrderState(orderid);
// System.out.println(method3);
//===========方法4.查询指定打印机某天的订单详情============
//***返回值JSON字符串***
//成功:{"msg":"ok","ret":0,"data":{"print":6,"waiting":1},"serverExecutedTime":9}//print已打印,waiting为打印
//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
// String strdate = "2016-11-12";//注意时间格式为"yyyy-MM-dd"
// String method4 = queryOrderInfoByDate(SN,strdate);
// System.out.println(method4);
//===========方法5.查询打印机的状态==========================
//***返回值JSON字符串***
//成功:{"msg":"ok","ret":0,"data":"状态","serverExecutedTime":4}
//失败:{"msg":"错误描述","ret":非0,"data":"null","serverExecutedTime":5}
// String method5 = queryPrinterStatus(SN);
// System.out.println(method5);
}
//=====================以下是函数实现部分================================================
private static String addprinter(String snlist) {
//通过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", signature(USER, UKEY, STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_printerAddlist"));//固定值,不需要修改
nvps.add(new BasicNameValuePair("printerContent", snlist));
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) {
result = EntityUtils.toString(httpentity);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
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();
}
}
return result;
}
//方法1
private static String print(String sn) {
//标签说明:
//单标签:
//"<BR>"为换行,"<CUT>"为切刀指令(主动切纸,仅限切刀打印机使用才有效果)
//"<LOGO>"为打印LOGO指令(前提是预先在机器内置LOGO图片),"<PLUGIN>"为钱箱或者外置音响指令
//成对标签:
//"<CB></CB>"为居中放大一倍,"<B></B>"为放大一倍,"<C></C>"为居中,<L></L>字体变高一倍
//<W></W>字体变宽一倍,"<QR></QR>"为二维码,"<BOLD></BOLD>"为字体加粗,"<RIGHT></RIGHT>"为右对齐
//拼凑订单内容时可参考如下格式
//根据打印纸张的宽度,自行调整内容的格式,可参考下面的样例格式
String content;
content = "<CB>测试打印</CB><BR>";
content += "名称 单价 数量 金额<BR>";
content += "--------------------------------<BR>";
content += "饭 1.0 1 1.0<BR>";
content += "炒饭 10.0 10 10.0<BR>";
content += "蛋炒饭 10.0 10 100.0<BR>";
content += "鸡蛋炒饭 100.0 1 100.0<BR>";
content += "番茄蛋炒饭 1000.0 1 100.0<BR>";
content += "西红柿蛋炒饭 1000.0 1 100.0<BR>";
content += "西红柿鸡蛋炒饭 100.0 10 100.0<BR>";
content += "备注:加辣<BR>";
content += "--------------------------------<BR>";
content += "合计:xx.0元<BR>";
content += "送货地点:广州市南沙区xx路xx号<BR>";
content += "联系电话:13888888888888<BR>";
content += "订餐时间:2016-08-08 08:08:08<BR>";
content += "<QR>http://www.dzist.com</QR>";
//通过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", signature(USER, UKEY, STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));//固定值,不需要修改
nvps.add(new BasicNameValuePair("sn", sn));
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 {
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();
}
}
return result;
}
//方法2
private static String printLabelMsg(String sn) {
String content;
content = "<DIRECTION>1</DIRECTION>";//设定打印时出纸和打印字体的方向,n 0 或 1,每次设备重启后都会初始化为 0 值设置,1:正向出纸,0:反向出纸,
content += "<TEXT x='9' y='10' font='12' w='1' h='2' r='0'>#001 五号桌 1/3</TEXT><TEXT x='80' y='80' font='12' w='2' h='2' r='0'>可乐鸡翅</TEXT><TEXT x='9' y='180' font='12' w='1' h='1' r='0'>张三先生 13800138000</TEXT>";//40mm宽度标签纸打印例子,打开注释调用标签打印接口打印
//通过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", signature(USER, UKEY, STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_printLabelMsg"));//固定值,不需要修改
nvps.add(new BasicNameValuePair("sn", sn));
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 {
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();
}
}
return result;
}
//方法3
private static String queryOrderState(String orderid) {
//通过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", signature(USER, UKEY, STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_queryOrderState"));//固定值,不需要修改
nvps.add(new BasicNameValuePair("orderid", orderid));
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) {
//服务器返回
result = EntityUtils.toString(httpentity);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
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();
}
}
return result;
}
//方法4
private static String queryOrderInfoByDate(String sn, String strdate) {
//通过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", signature(USER, UKEY, STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_queryOrderInfoByDate"));//固定值,不需要修改
nvps.add(new BasicNameValuePair("sn", sn));
nvps.add(new BasicNameValuePair("date", strdate));//yyyy-MM-dd格式
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) {
//服务器返回
result = EntityUtils.toString(httpentity);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
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();
}
}
return result;
}
//方法5
private static String queryPrinterStatus(String sn) {
//通过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", signature(USER, UKEY, STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_queryPrinterStatus"));//固定值,不需要修改
nvps.add(new BasicNameValuePair("sn", sn));
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) {
//服务器返回
result = EntityUtils.toString(httpentity);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
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();
}
}
return result;
}
//生成签名字符串
private static String signature(String USER, String UKEY, String STIME) {
String s = DigestUtils.sha1Hex(USER + UKEY + STIME);
return s;
}
}
3、格式模版调整工具类
/**
* 打印纸一行最大的字节
*/
private static final int LINE_BYTE_SIZE = 32;
/**
* 打印三列时,中间一列的中心线距离打印纸左侧的距离
*/
private static final int LEFT_LENGTH = 18;
/**
* 打印三列时,中间一列的中心线距离打印纸右侧的距离
*/
private static final int RIGHT_LENGTH = 14;
/**
* 打印三列时,第一列汉字最多显示几个文字
*/
private static final int LEFT_TEXT_MAX_LENGTH = 6;
/**
* 打印三列
* @param leftText 左侧文字
* @param middleText 中间文字
* @param rightText 右侧文字
* @return
*/
public static String printThreeData(String leftText, String middleText, String rightText) {
StringBuilder sb = new StringBuilder();
// 左边最多显示 LEFT_TEXT_MAX_LENGTH 个汉字 + 两个点
if (leftText.length() > LEFT_TEXT_MAX_LENGTH) {
leftText = leftText.substring(0, LEFT_TEXT_MAX_LENGTH) + "..";
}
int leftTextLength = getBytesLength(leftText);
int middleTextLength = getBytesLength(middleText);
int rightTextLength = getBytesLength(rightText);
sb.append(leftText);
// 计算左侧文字和中间文字的空格长度
int marginBetweenLeftAndMiddle = LEFT_LENGTH - leftTextLength - middleTextLength / 2;
for (int i = 0; i < marginBetweenLeftAndMiddle; i++) {
sb.append(" ");
}
sb.append(middleText);
// 计算右侧文字和中间文字的空格长度
int marginBetweenMiddleAndRight = RIGHT_LENGTH - middleTextLength / 2 - rightTextLength;
for (int i = 0; i < marginBetweenMiddleAndRight; i++) {
sb.append(" ");
}
// 打印的时候发现,最右边的文字总是偏右一个字符,所以需要删除一个空格
sb.delete(sb.length() - 1, sb.length()).append(rightText);
return sb.toString();
}
/**
* 获取数据长度
* @param msg
* @return
*/
private static int getBytesLength(String msg) {
return msg.getBytes(Charset.forName("GB2312")).length;
}
/**
* 打印两列
*
* @param leftText 左侧文字
* @param rightText 右侧文字
* @return
*/
public static String printTwoData(String leftText, String rightText) {
StringBuilder sb = new StringBuilder();
int leftTextLength = getBytesLength(leftText);
int rightTextLength = getBytesLength(rightText);
sb.append(leftText);
// 计算两侧文字中间的空格
int marginBetweenMiddleAndRight = LINE_BYTE_SIZE - leftTextLength - rightTextLength;
for (int i = 0; i < marginBetweenMiddleAndRight; i++) {
sb.append(" ");
}
sb.append(rightText);
return sb.toString();
}
/**
* 飞鹅云打印机签名
* */
private static String signature(String USER, String UKEY, String STIME) {
return DigestUtils.sha1Hex(USER + UKEY + STIME);
}
/**
* 关闭网络请求
* */
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();
}
}
调用示例:
public void printOrderInfoTakeOut(PrinterSetting ps, List<PrinterInfo> printerInfo, OrderInfo orderInfo, StoreInfo storeInfo) throws Exception {
//查询打印机数量
for (PrinterInfo printer : printerInfo) {
//外卖单前后都打印
if ("1".equals(printer.getLocation())) {
//打印结算单,通过订单id查询订单详情,附在页后
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("storeId", orderInfo.getStoreId());
wrapper.eq("orderId", orderInfo.getId());
List<OrderDetails> orderDetailsList = orderDetailsService.list(wrapper);
//发送前台打印命令(注意套餐打印)
StringBuilder sb = new StringBuilder();
sb.append("<CB><BOLD>外卖结账单(自配送)</BOLD></CB><BR>");
sb.append("--------------------------------<BR>");
sb.append(""+storeInfo.getName()+"<BR>");
sb.append(""+printTwoData("单号",orderInfo.getId()+"")+"<BR>");
sb.append(""+printTwoData("牌号",String.format("%04d", orderInfo.getBrandNum())+"")+"<BR>");
sb.append(""+printTwoData("下单时间",DateUtil.formatDateTime(orderInfo.getOrderTime())+"")+"<BR>");
sb.append(""+printTwoData("支付时间",DateUtil.formatDateTime(orderInfo.getPayTime())+"")+"<BR>");
sb.append(""+printTwoData("就餐人数",orderInfo.getNumber()==null?"":orderInfo.getNumber()+"")+"<BR>");
sb.append("------------------------------<BR>");
sb.append(""+printThreeData("菜品","数量","小计")+"<BR>");
sb.append("------------------------------<BR>");
for(OrderDetails orderDetails : orderDetailsList ){
sb.append("<B>"+orderDetails.getDishName()+"</B><BR>");
sb.append(""+printTwoData(orderDetails.getNum()+"*"+(Strings.isNullOrEmpty(orderDetails.getDishUnit())?"份":orderDetails.getDishUnit()),"¥"+ MoneyUtil.changeF2Y(orderDetails.getSmallAmount()))+"<BR>");
if(!Strings.isNullOrEmpty(orderDetails.getFlavorStr())||!Strings.isNullOrEmpty(orderDetails.getMakeStr())){
sb.append("备注:"+orderDetails.getFlavorStr()+" "+orderDetails.getMakeStr()+"<BR>");
}
//1-单品,2-套餐
if(orderDetails.getDishType() == 2){
//如果是套餐则需要查询套餐详情
QueryWrapper wrapperType = new QueryWrapper();
wrapperType.eq("storeId",printer.getStoreId());
wrapperType.eq("packageId",orderDetails.getDishId());
List<PackageDetail> packageDetails = packageDetailService.list(wrapperType);
if(packageDetails.size()>0){
for(PackageDetail packageDetail : packageDetails){
sb.append(printThreeData("["+packageDetail.getDishName()+"]",packageDetail.getNum()+"*份","")+"<BR>");
}
}
}
}
sb.append("<BR>");
sb.append("------------------------------<BR>");
sb.append(""+printTwoData("结算方式:", "金额")+"<BR>");
sb.append(printTwoData(orderPayTypeToString(orderInfo.getPayType()),"¥"+MoneyUtil.changeF2Y(orderInfo.getPayMoney())+""));
sb.append("------------------------------<BR>");
sb.append(""+printTwoData("合计:¥"+MoneyUtil.changeF2Y(orderInfo.getTotalMoney()), "优惠:¥"+MoneyUtil.changeF2Y(orderInfo.getDiscountMoney()))+"<BR>");
sb.append(""+printTwoData("实收:", "¥"+MoneyUtil.changeF2Y(orderInfo.getPayMoney()))+"<BR>");
sb.append("******************************<BR>");
sb.append(""+printTwoData("点单员:", orderInfo.getManagerName()==null?"自配送外卖":orderInfo.getManagerName())+"<BR>");
sb.append(""+printTwoData("整单备注:", orderInfo.getRemark()==null?"":orderInfo.getRemark())+"<BR>");
sb.append("------------------------------<BR>");
sb.append("客户姓名:"+orderInfo.getContacts()+"<BR>");
sb.append("客户电话:"+ orderInfo.getContactsPhone()+"<BR>");
sb.append("配送地址:"+orderInfo.getAddress()+"<BR>");
sb.append("------------------------------<BR>");
sb.append("<BOLD>谢谢光临<BOLD><BR>");
sb.append("------------------------------<BR>");
// 通过POST请求,发送打印信息到服务器
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(30000)// 读取超时
.setConnectTimeout(30000)// 连接超时
.build();
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
HttpPost post = new HttpPost(ps.getUrl());
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("user", ps.getUser()));
String STIME = String.valueOf(System.currentTimeMillis() / 1000);
nvps.add(new BasicNameValuePair("stime", STIME));
nvps.add(new BasicNameValuePair("sig", signature(ps.getUser(), ps.getUserKey(), STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));// 固定值,不需要修改
nvps.add(new BasicNameValuePair("sn", printer.getAppId()));
nvps.add(new BasicNameValuePair("content", sb.toString()));
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 {
close(response, post, httpClient);
}
log.info("调用云打印机后厨打印{}",result);
log.info(printer.getWindowName()+":结算成功【外卖单-先付后下】,前台打印结束- - - - - - ");
} else if ("2".equals(printer.getLocation())) {
//后厨打印(需要分出餐口)
Long windowId = printer.getWindowId();
//查询详情里是此出餐口的菜品,通过订单id查询订单详情
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("storeId", orderInfo.getStoreId());
wrapper.eq("orderId", orderInfo.getId());
wrapper.eq("windowId", windowId);
List<OrderDetails> orderDetailsList = orderDetailsService.list(wrapper);
if (orderDetailsList.size() > 0) {
//发送厨打命令(注意套餐打印)
log.info(printer.getWindowName()+":结算成功,开始打印后厨......................");
StringBuilder sb = new StringBuilder();
sb.append("<CB><BOLD>传菜单(自配送)</BOLD></CB><BR>");
sb.append(""+storeInfo.getName()+"<BR>");
sb.append(""+printTwoData("单号",orderInfo.getId()+"")+"<BR>");
sb.append(""+printTwoData("牌号",String.format("%04d", orderInfo.getBrandNum())+"")+"<BR>");
sb.append(""+printTwoData("出菜窗口",printer.getWindowName()+"")+"<BR>");
sb.append(""+printTwoData("下单时间",orderInfo.getUpdateTime()==null?DateUtil.formatDateTime(orderInfo.getOrderTime()):DateUtil.formatDateTime(orderInfo.getUpdateTime()))+"<BR>");
sb.append(""+printTwoData("就餐人数",orderInfo.getNumber()==null?"":orderInfo.getNumber()+"")+"<BR>");
sb.append("------------------------------<BR>");
sb.append(""+printThreeData("菜品","数量","小计")+"<BR>");
sb.append("------------------------------<BR>");
for(OrderDetails orderDetails : orderDetailsList ){
sb.append("<B>"+orderDetails.getDishName()+"</B><BR>");
sb.append(""+printTwoData(orderDetails.getNum()+"*"+(Strings.isNullOrEmpty(orderDetails.getDishUnit())?"份":orderDetails.getDishUnit()),"¥"+ MoneyUtil.changeF2Y(orderDetails.getSmallAmount()))+"<BR>");
if(!Strings.isNullOrEmpty(orderDetails.getFlavorStr())||!Strings.isNullOrEmpty(orderDetails.getMakeStr())){
sb.append("备注:"+orderDetails.getFlavorStr()+" "+orderDetails.getMakeStr()+"<BR>");
}
//1-单品,2-套餐
if(orderDetails.getDishType() == 2){
//如果是套餐则需要查询套餐详情
QueryWrapper wrapperType = new QueryWrapper();
wrapperType.eq("storeId",printer.getStoreId());
wrapperType.eq("packageId",orderDetails.getDishId());
List<PackageDetail> packageDetails = packageDetailService.list(wrapperType);
if(packageDetails.size()>0){
for(PackageDetail packageDetail : packageDetails){
sb.append(printThreeData("["+packageDetail.getDishName()+"]",packageDetail.getNum()+"*份","")+"<BR>");
}
}
}
}
sb.append("<BR>");
sb.append("------------------------------<BR>");
sb.append(""+printTwoData("点单员:", orderInfo.getManagerName()==null?"自配送外卖":orderInfo.getManagerName())+"<BR>");
sb.append(""+printTwoData("出菜窗口:",printer.getWindowName()+"")+"<BR>");
sb.append(""+printTwoData("整单备注:", orderInfo.getRemark()==null?"":orderInfo.getRemark())+"<BR>");
// 通过POST请求,发送打印信息到服务器
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(30000)// 读取超时
.setConnectTimeout(30000)// 连接超时
.build();
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).build();
HttpPost post = new HttpPost(ps.getUrl());
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("user", ps.getUser()));
String STIME = String.valueOf(System.currentTimeMillis() / 1000);
nvps.add(new BasicNameValuePair("stime", STIME));
nvps.add(new BasicNameValuePair("sig", signature(ps.getUser(), ps.getUserKey(), STIME)));
nvps.add(new BasicNameValuePair("apiname", "Open_printMsg"));// 固定值,不需要修改
nvps.add(new BasicNameValuePair("sn", printer.getAppId()));
nvps.add(new BasicNameValuePair("content", sb.toString()));
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 {
close(response, post, httpClient);
}
log.info("调用云打印机后厨打印{}",result);
}
log.info(printer.getWindowName()+":结算成功,后厨打印结束- - - - - - ");
}
}
}
只需要根据官网介绍,一步一步来就可以了。根据自身个性化需求自行调整。