打印记录日志

This commit is contained in:
张松 2025-03-14 18:00:33 +08:00
parent 1879d3f6d4
commit 2c531d8bc7
4 changed files with 278 additions and 135 deletions

View File

@ -1,5 +1,6 @@
package com.czg.order.service;
import com.czg.account.entity.PrintMachine;
import com.mybatisflex.core.service.IService;
import com.czg.order.entity.PrintMachineLog;
@ -10,5 +11,6 @@ import com.czg.order.entity.PrintMachineLog;
* @since 2025-03-11
*/
public interface PrintMachineLogService extends IService<PrintMachineLog> {
void save(PrintMachine config, String bizType, String printContent, Object respJson);
}

View File

@ -69,7 +69,9 @@ public class FeiPrinter extends PrinterHandler implements PrinterImpl {
String remark = orderDetail.getRemark();
String content = buildDishPrintData(false, getPickupNum(orderInfo), orderInfo.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
orderDetail.getProductName(), orderDetail.getSkuName(), orderDetail.getNum(), remark, orderDetail.getProGroupInfo());
sendPrintRequest(machine.getAddress(), content, null, "1");
Object o = sendPrintRequest(machine.getAddress(), content, null, "1");
printMachineLogService.save(machine, "新订单", content, o);
// printMachineLogService.save(machine, "新订单", , );
}
@ -78,7 +80,9 @@ public class FeiPrinter extends PrinterHandler implements PrinterImpl {
String remark = orderDetail.getRemark();
String content = buildDishPrintData(true, getPickupNum(orderInfo), orderInfo.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
orderDetail.getProductName(), orderDetail.getSkuName(), orderDetail.getReturnNum(), remark, orderDetail.getProGroupInfo());
sendPrintRequest(machine.getAddress(), content, null, "1");
Object o = sendPrintRequest(machine.getAddress(), content, null, "1");
printMachineLogService.save(machine, "退款单", content, o);
}
@Override
@ -97,7 +101,9 @@ public class FeiPrinter extends PrinterHandler implements PrinterImpl {
.setOutNumber(orderInfo.getTakeCode()).setPrintTitle("结算单")
.setRemark(orderInfo.getRemark()).setDiscountAmount(orderInfo.getOriginAmount().subtract(orderInfo.getPayAmount()).toPlainString());
String string = buildOrderPrintData(printInfoDTO, detailList);
sendPrintRequest(machine.getAddress(), string, null, printerNum);
Object o = sendPrintRequest(machine.getAddress(), string, null, printerNum);
printMachineLogService.save(machine, "退款单", string, o);
}
@Override
@ -116,16 +122,16 @@ public class FeiPrinter extends PrinterHandler implements PrinterImpl {
.setOutNumber(orderInfo.getTakeCode()).setPrintTitle(isPre ? "预结算单" : "结算单")
.setRemark(orderInfo.getRemark()).setDiscountAmount(orderInfo.getOriginAmount().subtract(orderInfo.getPayAmount()).toPlainString());
String string = buildOrderPrintData(printInfoDTO, detailList);
sendPrintRequest(machine.getAddress(), string, null, printerNum);
// shopPrintLogService.save(machine, "结算单", resp[0], resp[1]);
Object resp = sendPrintRequest(machine.getAddress(), string, null, printerNum);
printMachineLogService.save(machine, "结算单", string, resp);
}
@Override
protected void callNumPrint(PrintMachine machine, String callNum, String shopName, String tableName, String tableNote, String preNum, String codeUrl, LocalDateTime takeTime, String shopNote) {
String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一条新的排号记录\"}";
String resp = buildCallTicketData(shopName, tableName, callNum, preNum, codeUrl, shopNote, takeTime);
sendPrintRequest(machine.getAddress(), resp, voiceJson, "1");
// shopPrintLogService.save(machine, "叫号单", data, resp);
String data = buildCallTicketData(shopName, tableName, callNum, preNum, codeUrl, shopNote, takeTime);
Object resp = sendPrintRequest(machine.getAddress(), data, voiceJson, "1");
printMachineLogService.save(machine, "叫号单", data, resp);
}
@Override

View File

@ -113,8 +113,10 @@ public class YxyPrinter extends PrinterHandler implements PrinterImpl {
orderDetail.getNum(), orderDetail.getRemark(), orderDetail.getProGroupInfo());
// String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}";
String voiceJson = "{\"bizType\":\"2\",\"content\":\"\"}";
sendPrintRequest(machine.getAddress(), buildDishPrintData, voiceJson, "1");
Object resp = sendPrintRequest(machine.getAddress(), buildDishPrintData, voiceJson, "1");
// sendPrintRequest(voiceJson, 3, 1, machine.getAddress(), data);
printMachineLogService.save(machine, "新订单", buildDishPrintData, resp);
}
@Override
@ -123,7 +125,9 @@ public class YxyPrinter extends PrinterHandler implements PrinterImpl {
orderDetail.getReturnNum(), orderDetail.getRemark(), orderDetail.getProGroupInfo());
// String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}";
String voiceJson = "{\"bizType\":\"2\",\"content\":\"\"}";
sendPrintRequest(machine.getAddress(), buildDishPrintData, voiceJson, "1");
Object resp = sendPrintRequest(machine.getAddress(), buildDishPrintData, voiceJson, "1");
printMachineLogService.save(machine, "退款单", buildDishPrintData, resp);
}
@Override
@ -144,6 +148,8 @@ public class YxyPrinter extends PrinterHandler implements PrinterImpl {
printerNum = machine.getPrintQty().split("\\^")[1];
}
String resp = sendPrintRequest(machine.getAddress(), data, voiceJson, printerNum);
printMachineLogService.save(machine, "新订单", data, resp);
}
@Override
@ -164,7 +170,9 @@ public class YxyPrinter extends PrinterHandler implements PrinterImpl {
printerNum = machine.getPrintQty().split("\\^")[1];
}
String resp = sendPrintRequest(machine.getAddress(), data, voiceJson, printerNum);
// shopPrintLogService.save(machine, printType, data, resp);
// printMachineLogService.save(machine, printType, data, resp);
printMachineLogService.save(machine, "新订单", data, resp);
}
@Override

View File

@ -4,8 +4,12 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapProxy;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.UnicodeUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.czg.account.entity.PrintMachine;
import com.github.pagehelper.PageHelper;
@ -17,11 +21,13 @@ import com.czg.order.service.PrintMachineLogService;
import com.czg.service.order.mapper.PrintMachineLogMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
import java.util.*;
/**
* 店铺小票打印记录ServiceImpl
@ -33,7 +39,128 @@ import java.util.Map;
@Service
@RequiredArgsConstructor
public class PrintMachineLogServiceImpl extends ServiceImpl<PrintMachineLogMapper, PrintMachineLog> implements PrintMachineLogService{
//请求地址
private static final String URL_STR = "https://ioe.car900.com/v1/openApi/dev/customPrint.json";
//APPID
private static final String APP_ID = "ZF544";
//USERCODE
private static final String USER_CODE = "ZF544";
//APPSECRET
private static final String APP_SECRET = "2022bsjZF544GAH";
public static final String URL = "http://api.feieyun.cn/Api/Open/";//不需要修改
public static final String USER = "chaozhanggui2022@163.com";//*必填*账号名
public static final String UKEY = "UfWkhXxSkeSSscsU";//*必填*: 飞鹅云后台注册账号后生成的UKEY 备注这不是填打印机的KEY
public static final String SN = "960238952";//*必填*打印机编号必须要在管理后台里添加打印机或调用API接口添加之后才能调用API
/**
* 获取TOKEN值
*
* @param timestamp 时间戳13位
* @param requestId 请求ID自定义
* @return
*/
private static Map<String, String> getToken(String timestamp, String requestId) {
StringBuilder token = new StringBuilder();
StringBuilder encode = new StringBuilder();
SortedMap<String, Object> map = new TreeMap<>();
map.put("appId", APP_ID);
map.put("timestamp", timestamp);
map.put("requestId", requestId);
map.put("userCode", USER_CODE);
for (Map.Entry<String, Object> next : map.entrySet()) {
String key = next.getKey();
Object value = next.getValue();
token.append(key).append(value);
encode.append(key).append("=").append(value).append("&");
}
System.out.println("token" + token);
Map<String, String> finalMap = new HashMap<>();
finalMap.put("ENCODE", encode.toString());
System.out.println("+++++++++++++++" + token + APP_SECRET);
finalMap.put("TOKEN", SecureUtil.md5(token + APP_SECRET).toUpperCase());
return finalMap;
}
/**
* 检查打印状态
*
* @param devName 设备名称(唯一) 对应配置表中的address字段即IP地址/打印机编号
* @param taskId 打印任务id用于复查打印状态云想印=orderId
* @return
*/
public static String checkPrintStatus(String devName, String taskId) {
String time = String.valueOf(System.currentTimeMillis());
String uuid = UUID.randomUUID().toString();
Map<String, String> param = getToken(time, uuid);
String token = param.get("TOKEN");
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("devName", devName);
paramMap.put("orderId", taskId);
paramMap.put("token", token);
paramMap.put("appId", APP_ID);
paramMap.put("timestamp", time);
paramMap.put("requestId", uuid);
paramMap.put("userCode", USER_CODE);
return HttpUtil.get("https://ioe.car900.com/v1/openApi/dev/findOrder.json", paramMap, 1000 * 5);
}
private static String signature(String USER, String UKEY, String STIME) {
return DigestUtils.sha1Hex(USER + UKEY + STIME);
}
/**
* 检查飞鹅打印机打印任务是否已打印
*
* @param printOrderId 打印订单编号
* @return null-未知错误true-已打印false-未打印
*/
public static Boolean checkFPrintStatus(String printOrderId) {
String STIME = String.valueOf(System.currentTimeMillis() / 1000);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("user", USER);
paramMap.put("stime", STIME);
paramMap.put("sig", signature(USER, UKEY, STIME));
paramMap.put("apiname", "Open_queryOrderState");
paramMap.put("orderid", printOrderId);
Boolean ret;
try {
String resp = HttpUtil.post(URL, paramMap, 1000 * 5);
//成功 {"msg":"ok","ret":0,"data":true,"serverExecutedTime":4}
//失败 {"msg":"ok","ret":0,"data":false,"serverExecutedTime":4}
JSONObject json = JSONUtil.parseObj(UnicodeUtil.toString(resp));
ret = json.getBool("data");
} catch (Exception e) {
ret = null;
}
return ret;
}
/**
* 检查飞鹅打印机是否在线
*
* @param sn 设备编号
* @return 在线工作状态正常/离线/未知错误
*/
public static String checkOnline(String sn) {
String STIME = String.valueOf(System.currentTimeMillis() / 1000);
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("user", USER);
paramMap.put("stime", STIME);
paramMap.put("sig", signature(USER, UKEY, STIME));
paramMap.put("apiname", "Open_queryPrinterStatus");
paramMap.put("sn", sn);
String msg;
try {
String resp = HttpUtil.post(URL, paramMap, 1000 * 5);
//成功 开机 {"msg":"ok","ret":0,"data":"在线,工作状态正常。","serverExecutedTime":4}
//成功 离线 {"msg":"ok","ret":0,"data":"离线。","serverExecutedTime":7}
JSONObject json = JSONUtil.parseObj(UnicodeUtil.toString(resp));
msg = json.getStr("data");
} catch (Exception e) {
msg = "未知错误";
}
return msg;
}
/**
* 保存打印记录
*
@ -43,129 +170,129 @@ public class PrintMachineLogServiceImpl extends ServiceImpl<PrintMachineLogMappe
* @param respJson 打印机响应结果
*/
@Async
public void save(PrintMachine config, String bizType, String printContent, String respJson) {
// if (config == null) {
// return;
// }
// PrintMachineLog entity = new PrintMachineLog();
// BeanUtil.copyProperties(config, entity);
// int failFlag = 0;
// String respCode = "0";
// String respMsg = "打印中";
//
// Map<Integer, String> yxxStatusMap = MapUtil.builder(0, "离线(设备上线后自动补打)").put(1, "在线").put(2, "获取失败").put(3, "未激活").put(4, "设备已禁用").build();
// // 云想印
// if ("yxyPrinter".equals(config.getContentType())) {
// cn.hutool.json.JSONObject resp = JSONUtil.parseObj(respJson);
// int code = resp.getInt("code");
// cn.hutool.json.JSONObject data = resp.getJSONObject("data").getJSONObject("data");
// //设备状态0: 离线, 1: 在线, 2: 获取失败, 3:未激活, 4:设备已禁用
// int status = data.getInt("status");
// if (code != 0) {
// failFlag = 1;
// respCode = code + "";
// respMsg = resp.getStr("msg");
// } else if (status != 1) {
// failFlag = 1;
// respCode = code + "";
//
// respMsg = status + "_" + yxxStatusMap.get(status);
// }
// if (code == 0) {
// String taskId = resp.getJSONObject("data").getStr("orderId");
// entity.setTaskId(taskId);
// }
// // 飞鹅云打印机暂时没有适配先return不做打印记录
// } else if ("fePrinter".equals(config.getContentType())) {
// cn.hutool.json.JSONObject resp = JSONUtil.parseObj(respJson);
// int ret = resp.getInt("ret");
// if (ret != 0) {
// failFlag = 1;
// respCode = ret + "";
// respMsg = resp.getStr("msg");
// } else {
// String printOrderId = resp.getStr("data");
// entity.setTaskId(printOrderId);
// }
// } else {
// // 其他打印机暂时没有适配先return不做打印记录
// return;
// }
// entity.setBizType(bizType);
//// entity.setCreateUserId(config.getCurrentUserId());
//// entity.setCreateUserName(config.getCurrentUserName());
//// if (StrUtil.isNotBlank(config.getCurrentUserNickName())) {
//// entity.setCreateUserName(StrUtil.concat(true, config.getCurrentUserNickName(), " | ", config.getCurrentUserName()));
//// }
// entity.setPrintContent(printContent);
// entity.setCreateTime(DateUtil.date().toLocalDateTime());
// if (failFlag == 0) {
// entity.setPrintTime(entity.getCreateTime());
// }
// entity.setFailFlag(failFlag);
// entity.setRespCode(respCode);
// entity.setRespMsg(respMsg);
// super.save(entity);
//
// // 云想印
// if ("yxyPrinter".equals(config.getContentType())) {
// // 延迟3ms复查打印状态 (用户可以根据设备信息查询到当前设备的在线情况该接口只能提供参考设备的离线状态是在设备离线3分钟后才会生效)
// ThreadUtil.safeSleep(1000 * 5);
// String jsonStr = PrinterUtils.checkPrintStatus(config.getAddress(), entity.getTaskId());
// cn.hutool.json.JSONObject resp = JSONUtil.parseObj(jsonStr);
// int code = resp.getInt("code");
// if (code == 0) {
// cn.hutool.json.JSONObject data = resp.getJSONObject("data");
// boolean status = data.containsKey("status");
// if (!status) {
// return;
// }
// boolean success = data.getBool("status", false);
// if (entity.getFailFlag() == 0 && success) {
// entity.setFailFlag(0);
// entity.setRespMsg("打印成功");
// entity.setPrintTime(entity.getCreateTime());
// } else if (entity.getFailFlag() == 1 && success) {
// entity.setFailFlag(0);
// entity.setPrintTime(new Date());
// entity.setRespMsg("打印成功");
// // 如果设备在线 and 休眠5秒后查询结果是未打印即视为设备已离线云端3分钟后才会同步到离线信息
// } else if (entity.getFailFlag() == 0 && !success) {
// entity.setFailFlag(1);
// entity.setPrintTime(null);
// entity.setRespMsg("0_离线(设备上线后自动补打)");
// } else {
// entity.setFailFlag(1);
// entity.setPrintTime(null);
// entity.setRespMsg(StrUtil.concat(true, "打印失败,", "_", entity.getRespMsg()));
// }
// super.updateById(entity);
// }
// // 飞鹅云打印机
// } else if ("fePrinter".equals(config.getContentType())) {
// ThreadUtil.safeSleep(1000 * 5);
// Boolean success = FeieyunPrintUtil.checkPrintStatus(entity.getTaskId());
// if (success == null) {
// entity.setFailFlag(1);
// entity.setRespMsg("打印失败,未知错误");
// } else if (success) {
// entity.setFailFlag(0);
// entity.setPrintTime(new Date());
// entity.setRespMsg("打印成功");
// } else {
// String msg = FeieyunPrintUtil.checkOnline(entity.getAddress());
// if (msg.indexOf("在线,工作状态正常") > 0) {
// entity.setFailFlag(0);
// entity.setPrintTime(new Date());
// entity.setRespMsg("打印成功");
// } else {
// entity.setFailFlag(1);
// entity.setPrintTime(null);
// entity.setRespMsg(StrUtil.concat(true, "打印失败,", "_", msg));
// }
// }
// super.updateById(entity);
public void save(PrintMachine config, String bizType, String printContent, Object respJson) {
if (config == null) {
return;
}
PrintMachineLog entity = new PrintMachineLog();
BeanUtil.copyProperties(config, entity);
int failFlag = 0;
String respCode = "0";
String respMsg = "打印中";
Map<Integer, String> yxxStatusMap = MapUtil.builder(0, "离线(设备上线后自动补打)").put(1, "在线").put(2, "获取失败").put(3, "未激活").put(4, "设备已禁用").build();
// 云想印
if ("yxyPrinter".equals(config.getContentType())) {
cn.hutool.json.JSONObject resp = JSONUtil.parseObj(respJson);
int code = resp.getInt("code");
cn.hutool.json.JSONObject data = resp.getJSONObject("data").getJSONObject("data");
//设备状态0: 离线, 1: 在线, 2: 获取失败, 3:未激活, 4:设备已禁用
int status = data.getInt("status");
if (code != 0) {
failFlag = 1;
respCode = code + "";
respMsg = resp.getStr("msg");
} else if (status != 1) {
failFlag = 1;
respCode = code + "";
respMsg = status + "_" + yxxStatusMap.get(status);
}
if (code == 0) {
String taskId = resp.getJSONObject("data").getStr("orderId");
entity.setTaskId(taskId);
}
// 飞鹅云打印机暂时没有适配先return不做打印记录
} else if ("fePrinter".equals(config.getContentType())) {
cn.hutool.json.JSONObject resp = JSONUtil.parseObj(respJson);
int ret = resp.getInt("ret");
if (ret != 0) {
failFlag = 1;
respCode = ret + "";
respMsg = resp.getStr("msg");
} else {
String printOrderId = resp.getStr("data");
entity.setTaskId(printOrderId);
}
} else {
// 其他打印机暂时没有适配先return不做打印记录
return;
}
entity.setBizType(bizType);
// entity.setCreateUserId(config.getCurrentUserId());
// entity.setCreateUserName(config.getCurrentUserName());
// if (StrUtil.isNotBlank(config.getCurrentUserNickName())) {
// entity.setCreateUserName(StrUtil.concat(true, config.getCurrentUserNickName(), " | ", config.getCurrentUserName()));
// }
entity.setPrintContent(printContent);
entity.setCreateTime(DateUtil.date().toLocalDateTime());
if (failFlag == 0) {
entity.setPrintTime(entity.getCreateTime());
}
entity.setFailFlag(failFlag);
entity.setRespCode(respCode);
entity.setRespMsg(respMsg);
super.save(entity);
// 云想印
if ("yxyPrinter".equals(config.getContentType())) {
// 延迟3ms复查打印状态 (用户可以根据设备信息查询到当前设备的在线情况该接口只能提供参考设备的离线状态是在设备离线3分钟后才会生效)
ThreadUtil.safeSleep(1000 * 5);
String jsonStr = checkPrintStatus(config.getAddress(), entity.getTaskId());
cn.hutool.json.JSONObject resp = JSONUtil.parseObj(jsonStr);
int code = resp.getInt("code");
if (code == 0) {
cn.hutool.json.JSONObject data = resp.getJSONObject("data");
boolean status = data.containsKey("status");
if (!status) {
return;
}
boolean success = data.getBool("status", false);
if (entity.getFailFlag() == 0 && success) {
entity.setFailFlag(0);
entity.setRespMsg("打印成功");
entity.setPrintTime(entity.getCreateTime());
} else if (entity.getFailFlag() == 1 && success) {
entity.setFailFlag(0);
entity.setPrintTime(DateUtil.date().toLocalDateTime());
entity.setRespMsg("打印成功");
// 如果设备在线 and 休眠5秒后查询结果是未打印即视为设备已离线云端3分钟后才会同步到离线信息
} else if (entity.getFailFlag() == 0 && !success) {
entity.setFailFlag(1);
entity.setPrintTime(null);
entity.setRespMsg("0_离线(设备上线后自动补打)");
} else {
entity.setFailFlag(1);
entity.setPrintTime(null);
entity.setRespMsg(StrUtil.concat(true, "打印失败,", "_", entity.getRespMsg()));
}
super.updateById(entity);
}
// 飞鹅云打印机
} else if ("fePrinter".equals(config.getContentType())) {
ThreadUtil.safeSleep(1000 * 5);
Boolean success = checkFPrintStatus(entity.getTaskId());
if (success == null) {
entity.setFailFlag(1);
entity.setRespMsg("打印失败,未知错误");
} else if (success) {
entity.setFailFlag(0);
entity.setPrintTime(DateUtil.date().toLocalDateTime());
entity.setRespMsg("打印成功");
} else {
String msg = checkOnline(entity.getAddress());
if (msg.indexOf("在线,工作状态正常") > 0) {
entity.setFailFlag(0);
entity.setPrintTime(DateUtil.date().toLocalDateTime());
entity.setRespMsg("打印成功");
} else {
entity.setFailFlag(1);
entity.setPrintTime(null);
entity.setRespMsg(StrUtil.concat(true, "打印失败,", "_", msg));
}
}
super.updateById(entity);
}
}
}