diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/model/OrderDetailPO.java b/src/main/java/com/chaozhanggui/system/cashierservice/model/OrderDetailPO.java index dda62d8..7032d06 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/model/OrderDetailPO.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/model/OrderDetailPO.java @@ -49,12 +49,14 @@ public class OrderDetailPO implements Serializable { private String amount; private String spec; + private String proGroupInfo; - public Detail(String productName, String number, String amount, String spec) { + public Detail(String productName, String number, String amount, String spec, String proGroupInfo) { this.productName = productName; this.number = number; this.amount = amount; this.spec = spec; + this.proGroupInfo = proGroupInfo; } } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java index 3b3a959..c87b580 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java @@ -186,7 +186,7 @@ public class PrintMechineConsumer { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNum(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); }); @@ -240,7 +240,7 @@ public class PrintMechineConsumer { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNum(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); } }); @@ -367,14 +367,14 @@ public class PrintMechineConsumer { data = PrinterUtils.getPrintData("return", StrUtil.isBlank(orderInfo.getTableName()) ? orderInfo.getMasterId() : orderInfo.getTableName(), - DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), Math.abs(printerNum), remark, null); + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), Math.abs(printerNum), remark, null, it.getProGroupInfo()); voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); } else { data = PrinterUtils.getPrintData("", orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), - printerNum, remark, null); + printerNum, remark, null, it.getProGroupInfo()); voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); @@ -393,7 +393,7 @@ public class PrintMechineConsumer { String data = PrinterUtils.getPrintData("return", StrUtil.isBlank(orderInfo.getTableName()) ? orderInfo.getMasterId() : orderInfo.getTableName(), // todo 修改为bigdecimal - DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), orderDetail.getNum().intValue(), orderDetail.getRemark(), null); + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), orderDetail.getNum().intValue(), orderDetail.getRemark(), null, orderDetail.getProGroupInfo()); String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); @@ -462,7 +462,7 @@ public class PrintMechineConsumer { // todo 修改为bigdecimal String data = PrinterUtils.getPrintData("return", StrUtil.isBlank(orderInfo.getTableName()) ? orderInfo.getMasterId() : orderInfo.getTableName(), - DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), orderDetail.getNum().intValue(), orderDetail.getRemark(), null); + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), orderDetail.getNum().intValue(), orderDetail.getRemark(), null, orderDetail.getProGroupInfo()); String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson, 3, 1, machine.getAddress(), data); @@ -505,7 +505,7 @@ public class PrintMechineConsumer { // todo 修改为bigdecimal String data = PrinterUtils.getPrintData("", orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), - it.getNum().intValue(), remark, null); + it.getNum().intValue(), remark, null, it.getProGroupInfo()); String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); } @@ -548,7 +548,7 @@ public class PrintMechineConsumer { // todo 修改为bigdecimal String data = PrinterUtils.getPrintData("return", orderInfo.getPayType().equals("wx_lite") ? - orderInfo.getTableName() : orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), it.getNum().intValue(), remark, null); + orderInfo.getTableName() : orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), it.getNum().intValue(), remark, null, it.getProGroupInfo()); String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); } @@ -600,7 +600,7 @@ public class PrintMechineConsumer { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNum(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); }); @@ -664,7 +664,7 @@ public class PrintMechineConsumer { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNumber(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getName(), it.getNumber().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getName(), it.getNumber().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); } @@ -729,7 +729,7 @@ public class PrintMechineConsumer { } - FeieyunPrintUtil.getPrintData(tbPrintMachineWithBLOBs.getAddress(), orderInfo, DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getName(), it.getNumber().intValue(), remark); + FeieyunPrintUtil.getPrintData(tbPrintMachineWithBLOBs.getAddress(), orderInfo, DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getName(), it.getNumber().intValue(), remark, it.getProGroupInfo()); } }); } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/FeiPrinter.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/FeiPrinter.java index 270a9f5..0f7a054 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/FeiPrinter.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/FeiPrinter.java @@ -73,7 +73,7 @@ public class FeiPrinter extends PrinterHandler { String remark = sku == null ? "" : sku.getSpecSnap(); // todo 修改为bigdecimal String[] resp = FeieyunPrintUtil.getPrintData(machine.getAddress(), orderInfo, - DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), orderDetail.getNum().intValue(), remark); + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), orderDetail.getNum().intValue(), remark, orderDetail.getProGroupInfo()); shopPrintLogService.save(machine, "新订单", resp[0], resp[1]); } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrinterHandler.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrinterHandler.java index 86ea2e7..1ab385a 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrinterHandler.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/PrinterHandler.java @@ -174,7 +174,7 @@ public abstract class PrinterHandler { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNum(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); }); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/YxyPrinter.java b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/YxyPrinter.java index 8d304aa..214ddf7 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/YxyPrinter.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/print/YxyPrinter.java @@ -68,7 +68,7 @@ public class YxyPrinter extends PrinterHandler { String data = PrinterUtils.getPrintData("return", getPickupNum(orderInfo), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), - orderDetail.getNum().abs().intValue(), orderDetail.getRemark(), orderDetail.getNote()); + orderDetail.getNum().abs().intValue(), orderDetail.getRemark(), orderDetail.getNote(), orderDetail.getProGroupInfo()); String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; // String voiceJson = "{\"bizType\":\"2\",\"content\":\"\"}"; String resp = PrinterUtils.printTickets(voiceJson, 3, 1, machine.getAddress(), data); @@ -81,7 +81,7 @@ public class YxyPrinter extends PrinterHandler { String data = PrinterUtils.getPrintData("", getPickupNum(orderInfo), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), - orderDetail.getNum().intValue(), orderDetail.getRemark(), orderDetail.getNote()); + orderDetail.getNum().intValue(), orderDetail.getRemark(), orderDetail.getNote(), orderDetail.getProGroupInfo()); String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; // String voiceJson = "{\"bizType\":\"2\",\"content\":\"\"}"; String resp = PrinterUtils.printTickets(voiceJson, 3, 1, machine.getAddress(), data); @@ -163,7 +163,7 @@ public class YxyPrinter extends PrinterHandler { public static void main(String[] args) { String data = PrinterUtils.getPrintData("", "#3", DateUtils.getTime(DateUtil.date()), "九度", - Integer.valueOf("20"), "少冰", "加菜防守打法火速地方啊地上1三大法宝苏俄倒海翻江"); + Integer.valueOf("20"), "少冰", "加菜防守打法火速地方啊地上1三大法宝苏俄倒海翻江",""); String voiceJson = "{\"bizType\":\"2\",\"content\":\"\"}"; PrinterUtils.printTickets(voiceJson, 3, 1, "ZF544PG03W00005", data); } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/CloudPrinterService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/CloudPrinterService.java index 8fa09f3..876fc8f 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/CloudPrinterService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/CloudPrinterService.java @@ -205,7 +205,7 @@ public class CloudPrinterService { // todo 修改为bigdecimal String data = PrinterUtils.getPrintData("return", orderInfo.getPayType().equals("wx_lite") ? - orderInfo.getTableName() : orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), it.getNum().intValue(), remark, null); + orderInfo.getTableName() : orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), it.getNum().intValue(), remark, null, it.getProGroupInfo()); String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson, 3, Integer.valueOf(printerNum), tbPrintMachineWithBLOBs.getAddress(), data); } @@ -241,7 +241,7 @@ public class CloudPrinterService { // todo 修改为bigdecimal String data = PrinterUtils.getPrintData("", orderInfo.getOrderType().equals("miniapp") ? - orderInfo.getTableName() : orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getName(), it.getNumber().intValue(), remark, null); + orderInfo.getTableName() : orderInfo.getMasterId(), DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getName(), it.getNumber().intValue(), remark, null, it.getProGroupInfo()); String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; PrinterUtils.printTickets(voiceJson, 3, Integer.valueOf(printerNum), tbPrintMachineWithBLOBs.getAddress(), data); @@ -283,7 +283,7 @@ public class CloudPrinterService { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNum(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); }); @@ -353,7 +353,7 @@ public class CloudPrinterService { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNumber(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getName(), it.getNumber().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getName(), it.getNumber().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); } @@ -430,7 +430,7 @@ public class CloudPrinterService { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNum(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getProductName(), it.getNum().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); }); @@ -493,7 +493,7 @@ public class CloudPrinterService { unitPrice = it.getMemberPrice(); } BigDecimal subTotal = NumberUtil.mul(it.getNumber(), unitPrice.subtract(NumberUtil.null2Zero(it.getDiscountSaleAmount()))); - OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getName(), it.getNumber().toString(), subTotal.toPlainString(), remark); + OrderDetailPO.Detail detail = new OrderDetailPO.Detail(it.getName(), it.getNumber().toString(), subTotal.toPlainString(), remark, it.getProGroupInfo()); detailList.add(detail); } @@ -568,7 +568,7 @@ public class CloudPrinterService { } // todo 修改为bigdecimal - FeieyunPrintUtil.getPrintData(tbPrintMachineWithBLOBs.getAddress(), orderInfo, DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getName(), it.getNumber().intValue(), remark); + FeieyunPrintUtil.getPrintData(tbPrintMachineWithBLOBs.getAddress(), orderInfo, DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getName(), it.getNumber().intValue(), remark, it.getProGroupInfo()); } }); } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/FeieyunPrintUtil.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/FeieyunPrintUtil.java index 83287f6..fc941e2 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/util/FeieyunPrintUtil.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/FeieyunPrintUtil.java @@ -1,11 +1,13 @@ package com.chaozhanggui.system.cashierservice.util; +import cn.hutool.core.convert.Convert; import cn.hutool.core.text.UnicodeUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.chaozhanggui.system.cashierservice.bean.OrderUseTypeEnum; @@ -121,24 +123,29 @@ public class FeieyunPrintUtil { } - public static String buildPrintContent(String pickupNumber, String date, String productName, Integer number, String remark) { + public static String buildPrintContent(String pickupNumber, String date, String productName, Integer number, String remark, String proGroupInfo) { StringBuilder builder = new StringBuilder(); builder.append("" + pickupNumber + "

"); builder.append("时间: " + date + "


"); remark = StrUtil.emptyToDefault(remark, ""); - if (productName.length() > 4 || remark.length() > 4) { - builder.append("" + productName + " x " + number + "

"); - builder.append("" + remark + "
"); - } else { - builder.append("" + productName + " x " + number + "

"); - builder.append("" + remark + "
"); + builder.append("" + productName + " x " + number + "

"); + builder.append("" + remark + "

"); + if (!StrUtil.isBlank(proGroupInfo) && cn.hutool.json.JSONUtil.isJsonArray(proGroupInfo)) { + JSONArray subItems = cn.hutool.json.JSONUtil.parseArray(proGroupInfo); + for (int i = 0; i < subItems.size(); i++) { + String proName = subItems.getJSONObject(i).getStr("proName"); + int qty = subItems.getJSONObject(i).getInt("number"); + builder.append("("+(i+1)+")"+proName + " x " + qty + "
"); + } } + + //builder.append(""); return builder.toString(); } - public static String[] getPrintData(String sn, TbOrderInfo orderInfo, String date, String productName, Integer number, String remark) { - String content = buildPrintContent(getPickupNum(orderInfo), date, productName, number, remark); + public static String[] getPrintData(String sn, TbOrderInfo orderInfo, String date, String productName, Integer number, String remark, String proGroupInfo) { + String content = buildPrintContent(getPickupNum(orderInfo), date, productName, number, remark, proGroupInfo); System.out.println("content:".concat(content)); @@ -230,18 +237,31 @@ public class FeieyunPrintUtil { data.append("--------------------------------
"); for (OrderDetailPO.Detail detail : detailPO.getDetailList()) { String productName = detail.getProductName(); - String number = detail.getNumber(); + String number = Convert.toBigDecimal(detail.getNumber()).setScale(0).toPlainString(); String amount = toPlainStr(detail.getAmount()); //58mm的机器,一行打印16个汉字,32个字母; 80mm的机器,一行打印24个汉字,48个字母 //展示4列 b1代表名称列占用(14个字节) b2单价列(6个字节) b3数量列(3个字节) b4金额列(6个字节)-->这里的字节数可按自己需求自由改写,14+6+3+6再加上代码写的3个空格就是32了,58mm打印机一行总占32字节 //String row = FeieYunUtil.getRow(productName, "",number, amount, 14, 6,3, 6) //展示3列 b1代表名称列占用(20个字节) b2单价列(0个字节) b3数量列(3个字节) b4金额列(6个字节)-->这里的字节数可按自己需求自由改写,20+0+3+6再加上代码写的3个空格就是32了,58mm打印机一行总占32字节 - String row = FeieYunUtil.getRow(productName, "", number, amount, 20, 0, 3, 6); + String row = FeieYunUtil.getRow(productName, "", " "+number, amount, 20, 0, 4, 6); data.append(row); - if (StrUtil.isBlank(detail.getSpec())) { + if (StrUtil.isNotBlank(detail.getSpec())) { + data.append("规格:" + detail.getSpec() + "
"); + } + String proGroupInfo = detail.getProGroupInfo(); + if (StrUtil.isBlank(proGroupInfo)) { continue; } - data.append("规格:" + detail.getSpec() + "
"); + if (!JSONUtil.isJsonArray(proGroupInfo)) { + continue; + } + JSONArray subItems = JSONUtil.parseArray(proGroupInfo); + for (int i = 0; i < subItems.size(); i++) { + String proName = subItems.getJSONObject(i).getStr("proName"); + int qty = subItems.getJSONObject(i).getInt("number"); + String subRow = FeieYunUtil.getRow(" - "+proName, "", qty+"", "0.00", 20, 0, 4, 6); + data.append(subRow); + } } log.error("打印数据>>>>>>>>>>>>>>>>>>>>>:{}{}", detailPO.getDiscountAmount(), detailPO.getDiscountAdio()); if (ObjectUtil.isNotNull(detailPO.getDiscountAmount()) && ObjectUtil.isNotNull(detailPO.getDiscountAdio())) { @@ -256,9 +276,9 @@ public class FeieyunPrintUtil { } else { data.append(StrUtil.format("应收:{}
", t)); } + data.append("--------------------------------
"); if (ObjectUtil.isNotEmpty(detailPO.getPayType()) && ObjectUtil.isNotNull(detailPO.getPayType()) && detailPO.getPayType().equals("deposit")) { data.append(StrUtil.format("储值:{}
", toPlainStr(detailPO.getReceiptsAmount()))); - data.append("--------------------------------
"); data.append(StrUtil.format("积分:{}
", detailPO.getIntegral())); } data.append(StrUtil.format("余额:{}
", toPlainStr(detailPO.getBalance()))); @@ -506,7 +526,7 @@ public class FeieyunPrintUtil { public static void testPrint() { String STIME = String.valueOf(System.currentTimeMillis() / 1000); - String content = buildPrintContent("123456789", "2024-10-10 18:11:11", "澳洲大龙虾", 1, "一只吃爽爽"); + String content = buildPrintContent("123456789", "2024-10-10 18:11:11", "澳洲大龙虾", 1, "一只吃爽爽",""); Map paramMap = new HashMap<>(); // 参考文档:https://help.feieyun.com/home/doc/zh;nav=0-2 paramMap.put("user", USER); @@ -529,7 +549,7 @@ public class FeieyunPrintUtil { */ public static void testPrint2() { String STIME = String.valueOf(System.currentTimeMillis() / 1000); - String content = buildPrintContent("123456789", "2024-10-10 18:11:11", "澳洲大龙虾", 1, "一只吃爽爽"); + String content = buildPrintContent("123456789", "2024-10-10 18:11:11", "澳洲大龙虾", 1, "一只吃爽爽",""); Map paramMap = new HashMap<>(); // 参考文档:https://help.feieyun.com/home/doc/zh;nav=0-2 paramMap.put("user", USER); @@ -549,7 +569,7 @@ public class FeieyunPrintUtil { */ public static void testPrint3() { String STIME = String.valueOf(System.currentTimeMillis() / 1000); - String content = buildPrintContent("123456789", "2024-10-10 18:11:11", "澳洲大龙虾", 1, "一只吃爽爽"); + String content = buildPrintContent("123456789", "2024-10-10 18:11:11", "澳洲大龙虾", 1, "一只吃爽爽",""); Map paramMap = new HashMap<>(); // 参考文档:https://help.feieyun.com/home/doc/zh;nav=0-2 paramMap.put("user", USER); diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java index 15c7830..73d2624 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java @@ -1,9 +1,11 @@ package com.chaozhanggui.system.cashierservice.util; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONArray; import com.chaozhanggui.system.cashierservice.entity.po.CallNumPrintPO; import com.chaozhanggui.system.cashierservice.entity.po.ProductInfo; import com.chaozhanggui.system.cashierservice.entity.po.ProductInfoPO; @@ -79,7 +81,7 @@ public class PrinterUtils { * @param remark sku规格名 * @param note 备注 */ - public static String getPrintData(String type, String pickupNumber, String date, String productName, Integer number, String remark, String note) { + public static String getPrintData(String type, String pickupNumber, String date, String productName, Integer number, String remark, String note, String proGroupInfo) { StringBuilder builder = new StringBuilder(); if ("return".equals(type)) { builder.append("").append(pickupNumber).append("【退】

"); @@ -102,6 +104,14 @@ public class PrinterUtils { if (StrUtil.isNotBlank(note)) { builder.append("备注: ").append(note == null ? "" : note).append("
"); } + if (!StrUtil.isBlank(proGroupInfo) && cn.hutool.json.JSONUtil.isJsonArray(proGroupInfo)) { + JSONArray subItems = cn.hutool.json.JSONUtil.parseArray(proGroupInfo); + for (int i = 0; i < subItems.size(); i++) { + String proName = subItems.getJSONObject(i).getStr("proName"); + int qty = subItems.getJSONObject(i).getInt("number"); + builder.append("("+(i+1)+")"+proName + " x " + qty + "
"); + } + } builder.append(""); builder.append(""); return builder.toString(); @@ -109,91 +119,74 @@ public class PrinterUtils { public static String getCashPrintData(OrderDetailPO detailPO, String type, String orderType) { - log.info("getCashPrintData detailPO:{},type:{},orderType:{}", JSONUtil.toJSONString(detailPO), type, orderType); - StringBuilder sb = new StringBuilder(); - - sb.append("").append(detailPO.getMerchantName()).append("

"); - sb.append("").append(type).append("【").append(detailPO.getMasterId()).append("】

"); - if (Objects.nonNull(detailPO.getOutNumber())) { - sb.append("").append(detailPO.getOutNumber()).append("

"); - } - - sb.append("订单号: ").append(detailPO.getOrderNo()).append("
"); - sb.append("交易时间: ").append(detailPO.getTradeDate()).append("
"); - sb.append("收银员: ").append(detailPO.getOperator()).append("


"); - char paddingCharacter = ' '; - sb.append("").append(String.format("%-15s", "品名").replace(' ', paddingCharacter)).append(String.format("%-4s", "数量").replace(' ', paddingCharacter)).append(String.format("%4s", "小计").replace(' ', paddingCharacter)).append("
"); - sb.append("------------------------
"); + StringBuffer data = new StringBuffer(); + data.append(StrUtil.format("{}
", detailPO.getMerchantName())); + data.append("
"); + data.append(""); + data.append(StrUtil.format("{}【{}】
", type, detailPO.getMasterId())); + //if (Objects.nonNull(detailPO.getOutNumber())) { + // data.append(StrUtil.format("{}",detailPO.getOutNumber())); + //} + data.append(""); + data.append("
"); + data.append(StrUtil.format("订单号:{}
", detailPO.getOrderNo())); + data.append(StrUtil.format("交易时间:{}
", detailPO.getTradeDate())); + data.append(StrUtil.format("收银员:{}
", detailPO.getOperator())); + data.append(""); + data.append("
"); + data.append("品名 数量 小计
"); + data.append("--------------------------------
"); for (OrderDetailPO.Detail detail : detailPO.getDetailList()) { - - if (detail.getProductName().length() > 4 && detail.getProductName().length() <= 10) { - - int count = getProducrName(detail.getProductName()); - if (count <= 0) { - int length = 15 - (detail.getProductName().length() - 4); - sb.append("").append(String.format("%-" + length + "s", detail.getProductName()).replace(' ', paddingCharacter)).append(String.format("%-4s", detail.getNumber()).replace(' ', paddingCharacter)).append(String.format("%8s", toPlainStr(detail.getAmount())).replace(' ', paddingCharacter)).append("
"); - } else { - int length = 15 + count - (detail.getProductName().length() - 4); - sb.append("").append(String.format("%-" + length + "s", detail.getProductName()).replace(' ', paddingCharacter)).append(String.format("%-4s", detail.getNumber()).replace(' ', paddingCharacter)).append(String.format("%8s", toPlainStr(detail.getAmount())).replace(' ', paddingCharacter)).append("
"); - } - - } else if (detail.getProductName().length() > 10) { - - sb.append("").append(detail.getProductName()).append("
"); - sb.append("").append(String.format("%20s", detail.getNumber()).replace(' ', paddingCharacter)).append(String.format("%11s", toPlainStr(detail.getAmount())).replace(' ', paddingCharacter)).append("
"); - - } else { - sb.append("").append(String.format("%-15s", detail.getProductName()).replace(' ', paddingCharacter)).append(String.format("%-4s", detail.getNumber()).replace(' ', paddingCharacter)).append(String.format("%8s", toPlainStr(detail.getAmount())).replace(' ', paddingCharacter)).append("
"); + String number = Convert.toBigDecimal(detail.getNumber()).setScale(0).toPlainString(); + String row = YunXiangYinUtil.getRow(detail.getProductName(), "", " " + number, toPlainStr(detail.getAmount()), 20, 0, 4, 6); + data.append(row); + if (StrUtil.isNotBlank(detail.getSpec())) { + data.append("规格:").append(detail.getSpec()).append("
"); } - - if (detail.getSpec() != null && ObjectUtil.isNotEmpty(detail.getSpec())) { - sb.append("规格:").append(detail.getSpec()).append("
"); + String proGroupInfo = detail.getProGroupInfo(); + if (StrUtil.isBlank(proGroupInfo)) { + continue; + } + if (!cn.hutool.json.JSONUtil.isJsonArray(proGroupInfo)) { + continue; + } + JSONArray subItems = cn.hutool.json.JSONUtil.parseArray(proGroupInfo); + for (int i = 0; i < subItems.size(); i++) { + String proName = subItems.getJSONObject(i).getStr("proName"); + int qty = subItems.getJSONObject(i).getInt("number"); + String subRow = YunXiangYinUtil.getRow(" - "+proName, "", " "+qty, "0.00", 20, 0, 4, 6); + data.append(subRow); } - } - if (ObjectUtil.isNotNull(detailPO.getDiscountAmount()) && ObjectUtil.isNotNull(detailPO.getDiscountAdio())) { - sb.append("------------------------
"); - sb.append("原价:".concat(String.format("%15s", toPlainStr(detailPO.getReceiptsAmount())).replace(' ', paddingCharacter)).concat("
")); - sb.append("折扣: ".concat(String.format("%15s", "-".concat(toPlainStr(detailPO.getDiscountAmount()))).replace(' ', paddingCharacter)).concat("
")); + data.append("--------------------------------
"); + data.append(StrUtil.format("原价:{}
", toPlainStr(detailPO.getReceiptsAmount()))); + data.append(StrUtil.format("折扣:-{}
", toPlainStr(detailPO.getDiscountAmount()))); } - - - sb.append("------------------------
"); + data.append("--------------------------------
"); String t = "¥" + (ObjectUtil.isEmpty(detailPO.getDiscountAmount()) || ObjectUtil.isNull(detailPO.getDiscountAmount()) ? toPlainStr(detailPO.getReceiptsAmount()) : NumberUtil.sub(new BigDecimal(detailPO.getReceiptsAmount()), new BigDecimal(detailPO.getDiscountAmount())).setScale(2, RoundingMode.DOWN).toPlainString()); - t = String.format("%11s", t).replace(' ', paddingCharacter); if (orderType.equals("return")) { - sb.append("应退" + t + "
"); + data.append("应退" + t + "
"); + data.append(StrUtil.format("应收:{}
", t)); } else { - sb.append("实付" + t + "
"); - + data.append(StrUtil.format("应收:{}
", t)); } + data.append("--------------------------------
"); if (ObjectUtil.isNotEmpty(detailPO.getPayType()) && ObjectUtil.isNotNull(detailPO.getPayType()) && detailPO.getPayType().equals("deposit")) { - sb.append("储值¥" + toPlainStr(detailPO.getReceiptsAmount()) + "
"); - sb.append("------------------------
"); - sb.append("积分:" + detailPO.getIntegral() + "
"); + data.append(StrUtil.format("储值:{}
", toPlainStr(detailPO.getReceiptsAmount()))); + data.append(StrUtil.format("积分:{}
", detailPO.getIntegral())); } - - sb.append("余额:" + toPlainStr(detailPO.getBalance()) + "
"); - sb.append("------------------------
"); - - if (ObjectUtil.isNotEmpty(detailPO.getRemark()) && ObjectUtil.isNotNull(detailPO.getRemark())) { - sb.append("备注:" + detailPO.getRemark() + "
"); - } - - + data.append(StrUtil.format("余额:{}
", toPlainStr(detailPO.getBalance()))); + data.append("--------------------------------
"); + data.append(StrUtil.format("备注:{}
", detailPO.getRemark())); if (Objects.nonNull(detailPO.getOutNumber())) { - sb.append("".concat(detailPO.getOutNumber()).concat("
")); + data.append("".concat(detailPO.getOutNumber()).concat("
")); } - - - sb.append("打印时间:" + DateUtils.getTime(new Date()) + "
"); - - sb.append(""); - sb.append(""); - return sb.toString(); - + data.append("打印时间:" + DateUtils.getTime(new Date()) + "
"); + data.append(""); + data.append(""); + return data.toString(); } private static String toPlainStr(String str) { diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/util/YunXiangYinUtil.java b/src/main/java/com/chaozhanggui/system/cashierservice/util/YunXiangYinUtil.java new file mode 100644 index 0000000..dbf403f --- /dev/null +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/YunXiangYinUtil.java @@ -0,0 +1,145 @@ +package com.chaozhanggui.system.cashierservice.util; + +import lombok.experimental.UtilityClass; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author tankaikai + * @since 2024-10-15 15:12 + */ +@UtilityClass +public class YunXiangYinUtil { + + public String titleAddSpace(String str, int b1) { + int k = 0; + int b = b1; + 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) + "
" + 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 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 getStrList(String inputString, int length, int size) { + List list = new ArrayList(); + 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); + } + } + + /** + * 获取对齐后的小票明细行数据 + * 58mm的机器,一行打印16个汉字,32个字母;80mm的机器,一行打印24个汉字,48个字母 + * b1代表名称列占用字节 b2单价列 b3数量列 b4金额列-->这里的字节数可按自己需求自由改写 + * + * @param title 品名 + * @param price 单价 + * @param num 数量 + * @param total 小计 + * @param b1 品名占用字节 + * @param b2 单价占用字节 + * @param b3 数量占用字节 + * @param b4 小计占用字节 + * @return 对齐后的行数据 + */ + public static String getRow(String title, String price, String num, String total, int b1, int b2, int b3, int b4) { + price = addSpace(price, b2); + num = addSpace(num, b3); + total = 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; + title = "" + title + ""; + } else if (tl == b1) { + title += otherStr; + title = "" + title + ""; + } else { + List list = null; + if (isEn(title)) { + list = getStrList(title, b1); + } else { + list = getStrList(title, b1 / 2); + } + String s0 = titleAddSpace(list.get(0), b1); + title = ""+s0 + otherStr + "
";// 添加 单价 数量 总额 + String s = ""; + for (int k = 1; k < list.size(); k++) { + s += list.get(k); + } + try { + s = getStringByEnter(b1, s); + } catch (Exception e) { + e.printStackTrace(); + } + title += s; + } + return title + "
"; + } +}