package com.doumee.service.business.impl;
|
|
import cn.binarywang.wx.miniapp.bean.intractiy.WxMaStoreBalance;
|
import com.alibaba.druid.sql.visitor.functions.Concat;
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.TypeReference;
|
import com.alipay.v3.model.GoodsDetail;
|
import com.doumee.config.xyy.dto.*;
|
import com.doumee.config.xyy.vo.ObjectRestResponse;
|
import com.doumee.config.xyy.vo.OrderStatisResult;
|
import com.doumee.config.xyy.vo.PrinterResult;
|
import com.doumee.core.constants.Constants;
|
import com.doumee.core.utils.HttpsUtil;
|
import com.doumee.dao.business.model.OrdersDetail;
|
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.util.Collection;
|
import java.util.Collections;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
/**
|
* 云打印相关接口封装类
|
* @author JavaLyl
|
*/
|
@Service
|
public class PrintService {
|
|
private static String BASE_URL = "https://open.xpyun.net/api/openapi";
|
|
|
public String getPrintContent(String shopName, List<OrdersDetail> detailList, String userInfo, String orderCode, String remark, String takeLocationRemark, String payTime, String expectedTakeTime){
|
StringBuilder printContent = new StringBuilder();
|
if(CollectionUtils.isNotEmpty(detailList)){
|
Integer num = detailList.stream().map(i->i.getNum()).reduce(Constants.ZERO, Integer::sum);
|
Integer index = 1;
|
for (OrdersDetail detail:detailList) {
|
for (int i = 1; i <= detail.getNum(); i++) {
|
int y = 160;
|
StringBuilder page = new StringBuilder();
|
page.append("<PAGE>").append("<SIZE>60,60</SIZE>");
|
page.append("<TEXT x=\"30\" y=\"10\" w=\"1\" h=\"1\" r=\"0\">")
|
.append(detail.getLuggageName()).append("(").append(i).append("/").append(detail.getNum()).append(")")
|
.append("</TEXT>");
|
page.append("<BC128 x=\"50\" y=\"60\" h=\"64\" s=\"1\" n=\"2\" w=\"2\" r=\"0\">")
|
.append(orderCode)
|
.append("</BC128>");
|
// 客户信息
|
page.append("<TEXT x=\"30\" y=\"").append(y).append("\" w=\"1\" h=\"1\" r=\"0\">")
|
.append("客户信息:").append(userInfo).append(StringUtils.repeat(" ", 4))
|
.append("</TEXT>");
|
y += 40;
|
// 下单时间(支付时间)
|
page.append("<TEXT x=\"30\" y=\"").append(y).append("\" w=\"1\" h=\"1\" r=\"0\">")
|
.append("下单时间:").append(payTime)
|
.append("</TEXT>");
|
y += 40;
|
// 取件地址(最多2行)
|
y = appendMultiLine(page, "取件地址:", takeLocationRemark, y, 2);
|
y += 10;
|
// 送达时间
|
page.append("<TEXT x=\"30\" y=\"").append(y).append("\" w=\"1\" h=\"1\" r=\"0\">")
|
.append("客户预计取件时间:").append(expectedTakeTime)
|
.append("</TEXT>");
|
y += 40;
|
// 订单备注(最多2行)
|
y = appendMultiLine(page, "订单备注:", remark, y, 2);
|
// 门店名 + 序号(固定在底部)
|
page.append("<TEXT x=\"30\" y=\"440\" w=\"1\" h=\"1\" r=\"0\">")
|
.append(shopName).append(StringUtils.repeat(" ", 18))
|
.append(index).append("/").append(num)
|
.append("</TEXT>");
|
page.append("</PAGE>");
|
printContent.append(page);
|
index = index+1;
|
}
|
}
|
}
|
return printContent.toString();
|
}
|
|
/**
|
* 追加可能换行的文本(标题+内容),超过maxChars个字符换行,最多maxLines行
|
* @return 消耗的y偏移后的下一个y坐标
|
*/
|
private int appendMultiLine(StringBuilder sb, String title, String content, int startY, int maxLines) {
|
String fullText = title + (StringUtils.isNotBlank(content) ? content : "");
|
int maxChars = 18;
|
int line = 0;
|
int pos = 0;
|
int y = startY;
|
while (pos < fullText.length() && line < maxLines) {
|
String lineText;
|
int end = Math.min(pos + maxChars, fullText.length());
|
lineText = fullText.substring(pos, end);
|
pos = end;
|
line++;
|
sb.append("<TEXT x=\"30\" y=\"").append(y).append("\" w=\"1\" h=\"1\" r=\"0\">")
|
.append(lineText).append(StringUtils.repeat(" ", 4))
|
.append("</TEXT>");
|
y += 35;
|
}
|
return y;
|
}
|
|
|
/**
|
* 1.批量添加打印机
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<PrinterResult> addPrinters(AddPrinterRequest restRequest) {
|
String url = BASE_URL + "/xprinter/addPrinters";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<PrinterResult> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<PrinterResult>>(){});
|
return result;
|
}
|
|
/**
|
* 2.设置打印机语音类型
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<Boolean> setPrinterVoiceType(SetVoiceTypeRequest restRequest) {
|
String url = BASE_URL + "/xprinter/setVoiceType";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<Boolean> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Boolean>>(){});
|
return result;
|
}
|
|
/**
|
* 3.打印小票订单
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<String> print(PrintRequest restRequest) {
|
String url = BASE_URL + "/xprinter/print";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
|
return result;
|
}
|
|
/**
|
* 4.打印标签订单
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<String> printLabel(PrintRequest restRequest) {
|
String url = BASE_URL + "/xprinter/printLabel";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
|
return result;
|
}
|
|
/**
|
* 5.批量删除打印机
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<PrinterResult> delPrinters(DelPrinterRequest restRequest) {
|
String url = BASE_URL + "/xprinter/delPrinters";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<PrinterResult> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<PrinterResult>>(){});
|
return result;
|
}
|
|
/**
|
* 6.修改打印机信息
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<Boolean> updPrinter(UpdPrinterRequest restRequest) {
|
String url = BASE_URL + "/xprinter/updPrinter";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<Boolean> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Boolean>>(){});
|
return result;
|
}
|
|
/**
|
* 7.清空待打印队列
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<Boolean> delPrinterQueue(PrinterRequest restRequest) {
|
String url = BASE_URL + "/xprinter/delPrinterQueue";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<Boolean> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Boolean>>(){});
|
return result;
|
}
|
|
/**
|
* 8.查询订单是否打印成功
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<Boolean> queryOrderState(QueryOrderStateRequest restRequest) {
|
String url = BASE_URL + "/xprinter/queryOrderState";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<Boolean> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Boolean>>(){});
|
return result;
|
}
|
|
/**
|
* 9.查询打印机某天的订单统计数
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<OrderStatisResult> queryOrderStatis(QueryOrderStatisRequest restRequest) {
|
String url = BASE_URL + "/xprinter/queryOrderStatis";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<OrderStatisResult> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<OrderStatisResult>>(){});
|
return result;
|
}
|
|
/**
|
* 10.查询打印机状态
|
*
|
* 0、离线 1、在线正常 2、在线不正常
|
* 备注:异常一般是无纸,离线的判断是打印机与服务器失去联系超过30秒
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<Integer> queryPrinterStatus(PrinterRequest restRequest) {
|
String url = BASE_URL + "/xprinter/queryPrinterStatus";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<Integer> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Integer>>(){});
|
return result;
|
}
|
|
/**
|
* 10.批量查询打印机状态
|
*
|
* 0、离线 1、在线正常 2、在线不正常
|
* 备注:异常一般是无纸,离线的判断是打印机与服务器失去联系超过30秒
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<List<Integer>> queryPrintersStatus(PrintersRequest restRequest) {
|
String url = BASE_URL + "/xprinter/queryPrintersStatus";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<List<Integer>> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<List<Integer>>>(){});
|
return result;
|
}
|
|
/**
|
* 11.云喇叭播放语音
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<String> playVoice(VoiceRequest restRequest) {
|
String url = BASE_URL + "/xprinter/playVoice";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
|
return result;
|
}
|
|
/**
|
* 12.POS指令
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<String> pos(PrintRequest restRequest) {
|
String url = BASE_URL + "/xprinter/pos";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
|
return result;
|
}
|
/**
|
* 13.钱箱控制
|
* @param restRequest
|
* @return
|
*/
|
public ObjectRestResponse<String> controlBox(PrintRequest restRequest) {
|
String url = BASE_URL + "/xprinter/controlBox";
|
String jsonRequest = JSON.toJSONString(restRequest);
|
String resp = HttpsUtil.postJson(url, jsonRequest);
|
ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
|
return result;
|
}
|
|
}
|