diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/PrintMachineLogService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/PrintMachineLogService.java index f4888899..22d8d77f 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/PrintMachineLogService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/PrintMachineLogService.java @@ -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 { + void save(PrintMachine config, String bizType, String printContent, Object respJson); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/print/FeiPrinter.java b/cash-service/order-service/src/main/java/com/czg/service/order/print/FeiPrinter.java index bac8bc21..fc09a98b 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/print/FeiPrinter.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/print/FeiPrinter.java @@ -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 diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/print/YxyPrinter.java b/cash-service/order-service/src/main/java/com/czg/service/order/print/YxyPrinter.java index a0a165f0..48f3f409 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/print/YxyPrinter.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/print/YxyPrinter.java @@ -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 diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PrintMachineLogServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PrintMachineLogServiceImpl.java index 897bb500..3c76b570 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PrintMachineLogServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/PrintMachineLogServiceImpl.java @@ -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 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 getToken(String timestamp, String requestId) { + StringBuilder token = new StringBuilder(); + StringBuilder encode = new StringBuilder(); + SortedMap map = new TreeMap<>(); + map.put("appId", APP_ID); + map.put("timestamp", timestamp); + map.put("requestId", requestId); + map.put("userCode", USER_CODE); + for (Map.Entry 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 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 param = getToken(time, uuid); + String token = param.get("TOKEN"); + Map 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 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 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 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 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); + } } }