diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderDetail.java b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderDetail.java index 2b95fe1..120e92f 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderDetail.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/entity/TbOrderDetail.java @@ -37,6 +37,7 @@ public class TbOrderDetail implements Serializable { private BigDecimal priceAmount; private BigDecimal packAmount; + private String remark; private static final long serialVersionUID = 1L; -} \ No newline at end of file +} 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 436d07e..77299dc 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/rabbit/PrintMechineConsumer.java @@ -8,6 +8,7 @@ import com.chaozhanggui.system.cashierservice.dao.*; import com.chaozhanggui.system.cashierservice.entity.*; import com.chaozhanggui.system.cashierservice.model.CategoryInfo; import com.chaozhanggui.system.cashierservice.model.OrderDetailPO; +import com.chaozhanggui.system.cashierservice.redis.RedisCst; import com.chaozhanggui.system.cashierservice.util.DateUtils; import com.chaozhanggui.system.cashierservice.util.FeieyunPrintUtil; import com.chaozhanggui.system.cashierservice.util.JSONUtil; @@ -16,13 +17,15 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; @Slf4j @Component @@ -50,6 +53,10 @@ public class PrintMechineConsumer { @Autowired private TbOrderDetailMapper tbOrderDetailMapper; + @Autowired + private RedisTemplate redisTemplate2; + @Autowired + private StringRedisTemplate stringRedisTemplate; @RabbitHandler public void listener(String message) { @@ -188,6 +195,7 @@ public class PrintMechineConsumer { break; case "one": //一菜一品 cashierCarts = tbCashierCartMapper.selectByOrderId(orderId,"final"); + log.info("一菜一品打印,待打印信息:{}", cashierCarts); if (ObjectUtil.isNotEmpty(cashierCarts) && cashierCarts.size() > 0) { @@ -195,8 +203,11 @@ public class PrintMechineConsumer { // 取餐号不为空为代客下单 if ("postPay".equals(orderInfo.getUseType()) && StrUtil.isNotBlank(it.getMasterId())) { + log.info("--------------------代客下单 打印一菜一品"); + printTicket(Integer.valueOf(orderId), categoryInfos, tbPrintMachineWithBLOBs, orderInfo); return; } + log.info("--------------------非代客下单 打印一菜一品"); String categoryId; if(ObjectUtil.isEmpty(it.getCategoryId())){ @@ -232,6 +243,115 @@ public class PrintMechineConsumer { } } + private void printTicket(Integer orderId, List categoryInfos, TbPrintMachineWithBLOBs tbPrintMachineWithBLOBs, TbOrderInfo orderInfo) { + String printKey = RedisCst.ORDER_PRINT_PRO + orderId; + AtomicReference> printProductSet = new AtomicReference<>(redisTemplate2.opsForSet().members(printKey)); + List tbOrderDetails = tbOrderDetailMapper.selectAllByOrderId(orderId); + log.info("--------------------订单detail列表: {}", tbOrderDetails); + log.info("--------------------缓存打印printProductSet: {}", printProductSet); + if (!tbOrderDetails.isEmpty()) { + + // 重置打印数据 + redisTemplate2.delete(printKey); + tbOrderDetails.forEach(it -> { + log.info("开始打印一菜一品票据,:{}", it.getProductName()); + String categoryId = tbProductMapper.selectByPrimaryKey(it.getProductId()).getCategoryId(); + + long count = categoryInfos.stream().filter(c -> + c.getId().toString().equals(categoryId) + ).count(); + + log.info("获取当前类别是否未打印类别:{}", count); + if (count > 0) { + + // 统计已打数量 + int printerNum = 0; + boolean isReturn = false; + String key = RedisCst.ORDER_PRINT + orderId + ":" + it.getProductId() + ":" + it.getProductSkuId(); + String info = stringRedisTemplate.opsForValue().get(key); + stringRedisTemplate.opsForValue().set(key, String.valueOf(it.getNum()), 60 * 60 * 24, TimeUnit.SECONDS); + + log.info("--------------------已打印数量: {}", info); + + // 删除已打印数据 + if (printProductSet.get() != null) { + printProductSet.set(printProductSet.get().stream().filter(r -> { + TbOrderDetail detail = (TbOrderDetail) r; + return !detail.getProductSkuId().equals(it.getProductSkuId()) || !detail.getProductId().equals(it.getProductId()); + }).collect(Collectors.toSet())); + } + + + if (info != null) { + isReturn = it.getNum() - Integer.parseInt(info) < 0; + printerNum = it.getNum() - Integer.parseInt(info); + }else { + printerNum = it.getNum(); + } + + log.info("--------------------isReturn: {}, 数量: {}", isReturn, printerNum); + + + TbProductSkuWithBLOBs tbProductSkuWithBLOBs = tbProductSkuMapper.selectByPrimaryKey(it.getProductSkuId()); + String remark = ""; + if (ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs) && ObjectUtil.isNotEmpty(tbProductSkuWithBLOBs.getSpecSnap())) { + remark = tbProductSkuWithBLOBs.getSpecSnap(); + } + + // 将已打印信息加入redis + it.setRemark(remark); + redisTemplate2.opsForSet().add(printKey, it); + redisTemplate2.expire(printKey, 24, TimeUnit.HOURS); + + // 已打印不再打印 + if (info != null && printerNum == 0) { + log.info("--------------------------订单已打印,跳过打印"); + return; + } + + String data; + String voiceJson; + if (isReturn) { + + data = PrinterUtils.getPrintData("return", + StrUtil.isBlank(orderInfo.getTableName()) ? orderInfo.getMasterId() : orderInfo.getTableName(), + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), it.getProductName(), Math.abs(printerNum), remark); + 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); + voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔新的订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); + + + } + } + }); + + } + + // 已删除的商品打印退款信息 + if (printProductSet.get() != null) { + printProductSet.get().forEach(item -> { + log.info("已删除订单,打印退款票据, {}", item); + TbOrderDetail orderDetail = (TbOrderDetail) item; + String data = PrinterUtils.getPrintData("return", + StrUtil.isBlank(orderInfo.getTableName()) ? orderInfo.getMasterId() : orderInfo.getTableName(), + DateUtils.getTime(new Date(orderInfo.getCreatedAt())), orderDetail.getProductName(), orderDetail.getNum(), orderDetail.getRemark()); + String voiceJson = "{\"bizType\":\"2\",\"content\":\"您有一笔退款订单,请及时处理\"}"; + PrinterUtils.printTickets(voiceJson, 3, 1, tbPrintMachineWithBLOBs.getAddress(), data); + + String key = RedisCst.ORDER_PRINT + orderId + ":" + orderDetail.getProductId() + ":" + orderDetail.getProductSkuId(); + log.info("删除商品数量记录key, {}", key); + stringRedisTemplate.delete(key); + }); + } + } + diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisConfig.java b/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisConfig.java index 35934b2..0019723 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisConfig.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisConfig.java @@ -96,4 +96,11 @@ public class RedisConfig { template.setValueSerializer(new StringRedisSerializer(Charset.forName("UTF-8"))); return template; } + + @Bean + public RedisTemplate redisTemplate2(RedisConnectionFactory factory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(factory); + return template; + } } diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisCst.java b/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisCst.java index e83e9c2..45a477b 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisCst.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/redis/RedisCst.java @@ -26,8 +26,10 @@ public class RedisCst { public static final String CREATE_ORDER_LOCK = "CREATE_ORDER_LOCK:"; public static final String SEND_STOCK_WARN_MSG = "SEND_STOCK_WARN_MSG:"; public static final String SONG_PAY_LOCK = "song_pay_lock:"; + public static final String ORDER_PRINT_PRO = "ORDER_PRINT_PRODUCT:"; + public static final String ORDER_PRINT = "ORDER_PRINT:"; - static String CURRENT_TABLE_ORDER = "CURRENT_TABLE_ORDER:"; + static String CURRENT_TABLE_ORDER = "CURRENT_TABLE_ORDER:"; public static String getCurrentOrderKey(String tableId, String shopId) { diff --git a/src/main/java/com/chaozhanggui/system/cashierservice/service/CartService.java b/src/main/java/com/chaozhanggui/system/cashierservice/service/CartService.java index 63b6d84..f68534f 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/service/CartService.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/service/CartService.java @@ -228,7 +228,8 @@ public class CartService { if (cashierCart.getSkuId().equals(skuId) && cashierCart.getIsVip().intValue() == isVip) { cashierCart.setTotalNumber(buyNum); cashierCart.setNumber(buyNum); - if (type == 0 && isVip == 0 && tbProductSkuWithBLOBs.getSuit() != null && tbProductSkuWithBLOBs.getSuit() > 1 && cashierCart.getNumber() < tbProductSkuWithBLOBs.getSuit()) { + if (type == 0 && isVip == 0 && tbProductSkuWithBLOBs.getSuit() != null + && tbProductSkuWithBLOBs.getSuit() > 1 && cashierCart.getNumber() < tbProductSkuWithBLOBs.getSuit()) { cashierCartMapper.deleteByPrimaryKey(cashierCart.getId()); continue; } 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 16f3cbd..7f438c6 100644 --- a/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java +++ b/src/main/java/com/chaozhanggui/system/cashierservice/util/PrinterUtils.java @@ -2,6 +2,7 @@ package com.chaozhanggui.system.cashierservice.util; import cn.hutool.core.util.ObjectUtil; import com.chaozhanggui.system.cashierservice.model.OrderDetailPO; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -14,6 +15,7 @@ import java.util.*; /** * 打印机 */ +@Slf4j public class PrinterUtils { //请求地址 private static final String URL_STR = "https://ioe.car900.com/v1/openApi/dev/customPrint.json"; @@ -83,6 +85,41 @@ public class PrinterUtils { return builder.toString(); } + /** + * 厨房打印机 + * + * @param pickupNumber + * @param date + * @param productName + * @param number + * @param remark + * @return + */ + public static String getPrintData(String type, String pickupNumber, String date, String productName, Integer number, String remark) { + StringBuilder builder = new StringBuilder(); + if ("return".equals(type)) { + builder.append("" + pickupNumber + "【退】

"); + } else { + builder.append("" + pickupNumber + "

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


"); + + if (productName.length() > 4 || remark.length() > 4) { + builder.append("" + productName + " " + number + "
"); + builder.append("" + remark + "
"); + } else { + builder.append("" + productName + " " + number + "
"); + builder.append("" + remark + "
"); + } + builder.append(""); + builder.append(""); + + return builder.toString(); + } + + public static String getCashPrintData(OrderDetailPO detailPO,String type){ StringBuilder sb = new StringBuilder(); @@ -162,7 +199,46 @@ public class PrinterUtils { + /** + * 打印票据 + * + * @throws Exception + */ + public static void printTickets(String voiceJson, Integer actWay, Integer cn, String devName, String data) { + log.info("开始请求云享印,请求数据:{}, {}", voiceJson, data); + //设备名称 + //行为方式 1:只打印数据 2:只播放信息 3:打印数据并播放信息 +// actWay = 3; +// //打印联数 +// int cn = 1; + //打印内容 + //播报语音数据体,字段参考文档IOT_XY_API11001 + String time = String.valueOf(System.currentTimeMillis()); + String uuid = UUID.randomUUID().toString(); + Map param = getToken(time, uuid); + //参数 + MultiValueMap multiValueMap = new LinkedMultiValueMap<>(); + multiValueMap.add("token", param.get("TOKEN")); + multiValueMap.add("devName", devName); + multiValueMap.add("actWay", actWay); + multiValueMap.add("cn", cn); + multiValueMap.add("data", data); + multiValueMap.add("voiceJson", voiceJson); + multiValueMap.add("appId", APP_ID); + multiValueMap.add("timestamp", time); + multiValueMap.add("requestId", uuid); + multiValueMap.add("userCode", USER_CODE); + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders header = new HttpHeaders(); + header.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + HttpEntity> httpEntity = new HttpEntity<>(multiValueMap, header); + String httpResponse = restTemplate.postForObject(URL_STR, + httpEntity, String.class); + + System.out.println("map" + httpResponse); + }