From b018b321edb20719afb28eabf0da6ccd14a78a61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Wed, 26 Feb 2025 15:57:00 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/print/PrinterHandler.java | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/print/PrinterHandler.java b/cash-service/account-service/src/main/java/com/czg/service/account/print/PrinterHandler.java index 4a7a9a55..07d73eee 100644 --- a/cash-service/account-service/src/main/java/com/czg/service/account/print/PrinterHandler.java +++ b/cash-service/account-service/src/main/java/com/czg/service/account/print/PrinterHandler.java @@ -1,5 +1,6 @@ package com.czg.service.account.print; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; @@ -78,7 +79,7 @@ public abstract class PrinterHandler { @Accessors(chain = true) public static class PrintDetailInfo { private boolean isPrint; -// private boolean isReturn; + // private boolean isReturn; private long orderId; private long detailId; private BigDecimal printNum; @@ -145,31 +146,37 @@ public abstract class PrinterHandler { } protected List getCanPrintOrderDetails(boolean partPrint, Long orderId, List tbOrderDetailList, List categoryIds) { - List detailList = redisService.lGet(RedisCst.getPrintOrderDetailKey(orderId), 0, -1); - Map detailMap = detailList.stream().collect(Collectors.toMap(i -> { - if (i instanceof PrintDetailInfo i2) { - return i2.getDetailId(); - } - throw new RuntimeException("转换orderDetail失败"); - }, i -> (PrintDetailInfo) i)); - List productIds = tbOrderDetailList.stream().map(OrderDetail::getProductId).collect(Collectors.toList()); Map canPrintProMap = partPrint || categoryIds.isEmpty() ? new HashMap<>() : productService.list(new QueryWrapper().in(Product::getCategoryId, categoryIds).in(Product::getId, productIds)) - .stream().collect(Collectors.toMap(com.czg.product.entity.Product::getId, i -> true)); + .stream().collect(Collectors.toMap(com.czg.product.entity.Product::getId, i -> true)); ArrayList orderDetails = new ArrayList<>(); tbOrderDetailList.forEach(item -> { - PrintDetailInfo printDetailInfo = detailMap.get(item.getId()); - if (item.getIsPrint() != null && item.getIsPrint() == 1 && (canPrintProMap.get(item.getProductId()) != null || !partPrint) && - (printDetailInfo == null || item.getNum().subtract(printDetailInfo.getPrintNum()).compareTo(BigDecimal.ZERO) > 0)) { + Object o = redisService.get(RedisCst.getPrintOrderDetailKey(orderId, item.getId())); + + if (item.getIsPrint() != null && item.getIsPrint() == 1 && (canPrintProMap.get(item.getProductId()) != null || !partPrint)) { item.setReturnNum(item.getReturnNum() == null ? BigDecimal.ZERO : item.getReturnNum()); + PrintDetailInfo printDetailInfo = o != null ? JSONObject.parseObject((String) o, PrintDetailInfo.class) : null; if (printDetailInfo != null) { + if (item.getNum().compareTo(printDetailInfo.getPrintNum()) <= 0) { + log.info("此菜品已打印, {} {} {}", item.getProductName(), item.getSkuName(), printDetailInfo); + } + + if (item.getReturnNum().compareTo(printDetailInfo.getPrintReturnNum()) <= 0) { + log.info("此退菜菜品已打印, {} {} {}", item.getProductName(), item.getSkuName(), printDetailInfo); + } item.setNum(item.getNum().subtract(printDetailInfo.getPrintNum())); - item.setReturnNum(item.getReturnNum().subtract(printDetailInfo.getPrintNum())); + item.setReturnNum(item.getReturnNum().subtract(printDetailInfo.getPrintReturnNum())); + orderDetails.add(item); + }else { + orderDetails.add(item); } - orderDetails.add(item); + + + } else { + log.info("此菜品不在打印分类或属于免打, {} {} {}", item.getProductName(), item.getSkuName(), item.getId()); } }); @@ -200,7 +207,7 @@ public abstract class PrinterHandler { } default -> log.warn("未知打印类型: {}", printMethod); } - }else { + } else { log.info("准备开始打印叫号单"); if (StrUtil.isBlank(machine.getPrintType())) { return; @@ -241,10 +248,8 @@ public abstract class PrinterHandler { } // 已打印详情信息 - ArrayList printDetailInfos = new ArrayList<>(); - Map detailMap = tbOrderDetailList.stream().collect(Collectors.toMap(OrderDetail::getId, i -> i)); + Map detailMap = tbOrderDetailList.stream().map(item -> BeanUtil.copyProperties(item, OrderDetail.class)).collect(Collectors.toMap(OrderDetail::getId, i -> i)); tbOrderDetailList = getCanPrintOrderDetails("1".equals(machine.getClassifyPrint()), orderInfo.getId(), tbOrderDetailList, categoryIds); - String printKey = RedisCst.getPrintOrderDetailKey(orderInfo.getId()); tbOrderDetailList.parallelStream().filter(o -> ObjectUtil.defaultIfNull(o.getIsPrint(), 0) == 1).forEach(item -> { log.info("开始打印菜品,商品名:{}", item.getProductName()); Integer isWaitCall = ObjectUtil.defaultIfNull(item.getIsWaitCall(), 0); @@ -291,8 +296,8 @@ public abstract class PrinterHandler { // 保存已打印信息 OrderDetail orderDetail = detailMap.get(item.getId()); - redisService.leftPush(printKey, new PrintDetailInfo().setPrint(item.getIsPrint() == 1).setDetailId(item.getId()) - .setPrintNum(orderDetail.getNum()).setPrintReturnNum(orderDetail.getReturnNum())); + redisService.set(RedisCst.getPrintOrderDetailKey(orderInfo.getId(), item.getId()), JSONObject.toJSONString(new PrintDetailInfo().setPrint(item.getIsPrint() == 1).setDetailId(item.getId()) + .setPrintNum(orderDetail.getNum()).setPrintReturnNum(orderDetail.getReturnNum())), 3600 * 24); }); @@ -383,10 +388,10 @@ public abstract class PrinterHandler { CallTable tbCallTable = callTableService.getById(queue.getCallTableId()); ShopInfo shopInfo = shopInfoService.getById(queue.getShopId()); callNumPrint(machine, queue.getCallNum(), shopInfo.getShopName(), tbCallTable.getName(), tbCallTable.getNote(), String.valueOf(callQueueService.count(new QueryWrapper() - .eq(CallQueue::getShopId, queue.getShopId()) - .eq(CallQueue::getCallTableId, queue.getCallTableId()) - .lt(CallQueue::getId, queue.getId()) - .in(CallQueue::getState, 0, 1))), callUrl == null ? "未配置页面" : StrUtil.format(callUrl, queue.getShopId(), queue.getId()), queue.getCreateTime(), + .eq(CallQueue::getShopId, queue.getShopId()) + .eq(CallQueue::getCallTableId, queue.getCallTableId()) + .lt(CallQueue::getId, queue.getId()) + .in(CallQueue::getState, 0, 1))), callUrl == null ? "未配置页面" : StrUtil.format(callUrl, queue.getShopId(), queue.getId()), queue.getCreateTime(), StrUtil.format("过号顺延{}桌 {}桌后需重新排号 谢谢理解!", tbCallTable.getPostponeNum(), tbCallTable.getPostponeNum())); } @@ -399,6 +404,7 @@ public abstract class PrinterHandler { /** * 根据订单信息判断是否是退单 + * * @param orderInfo 顶动感信息 * @return 是否退款 */ From 0d3b9abd2e59b3429bebd7ebfe2bd5e3eda1477b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Wed, 26 Feb 2025 15:57:07 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/czg/config/RedisCst.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java b/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java index a4853f94..1b9b531f 100644 --- a/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java +++ b/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java @@ -41,7 +41,7 @@ public interface RedisCst { } - static String getPrintOrderDetailKey(Long orderId) { - return PRINT_ORDER_DETAIL + orderId; + static String getPrintOrderDetailKey(Long orderId, Long detailId) { + return PRINT_ORDER_DETAIL + orderId + ":" + detailId; } } From 06749369019183f36a488e7b496cf5233497335d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Wed, 26 Feb 2025 16:06:59 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E6=89=93=E5=8D=B0=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../czg/controller/admin/AuthorizationController.java | 6 +++++- .../src/main/java/com/czg/mq/PrintMqListener.java | 9 +++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/AuthorizationController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/AuthorizationController.java index cb6c9b12..a4482c88 100644 --- a/cash-api/account-server/src/main/java/com/czg/controller/admin/AuthorizationController.java +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/AuthorizationController.java @@ -6,6 +6,7 @@ import com.czg.account.service.PermissionService; import com.czg.account.vo.LoginVO; import com.czg.annotation.SaAdminCheckPermission; import com.czg.annotation.SaStaffCheckPermission; +import com.czg.config.RabbitPublisher; import com.czg.mq.PrintMqListener; import com.czg.resp.CzgResult; import com.czg.sa.StpKit; @@ -54,9 +55,12 @@ public class AuthorizationController { @Resource PrintMqListener printMqListener; + @Resource + RabbitPublisher rabbitPublisher; @GetMapping("test") public CzgResult login() { - printMqListener.orderPrint("1"); + rabbitPublisher.sendOrderPrintMsg("1"); +// printMqListener.orderPrint("1"); // return CzgResult.success(Map.of("token", StpKit.USER.getShopId())); return CzgResult.success(); } diff --git a/cash-api/account-server/src/main/java/com/czg/mq/PrintMqListener.java b/cash-api/account-server/src/main/java/com/czg/mq/PrintMqListener.java index c384d0ca..75d4918c 100644 --- a/cash-api/account-server/src/main/java/com/czg/mq/PrintMqListener.java +++ b/cash-api/account-server/src/main/java/com/czg/mq/PrintMqListener.java @@ -15,7 +15,9 @@ import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -40,7 +42,7 @@ public class PrintMqListener { @Resource private PrinterHandler printerHandler; -// @RabbitListener(queues = {RabbitConstants.Queue.ORDER_PRINT_QUEUE}) + @RabbitListener(queues = {"${spring.profiles.active}-" + RabbitConstants.Queue.ORDER_PRINT_QUEUE}) public void orderPrint(String orderId) { long startTime = DateUtil.date().getTime(); log.info("接收到订单打印消息:{}", orderId); @@ -52,18 +54,17 @@ public class PrintMqListener { throw new RuntimeException("订单信息不存在"); } - getPrintMachine(1L, "cash", "one", "order").forEach(machine -> { + getPrintMachine(orderInfo.getShopId(), "cash", "all", "order").forEach(machine -> { printerHandler.handleRequest(machine, orderInfo, null); // printPlaceTicket(isReturn, machine, orderInfo, shopInfo); }); - }catch (Exception e) { log.error("订单打印失败", e); mqLog.setErrInfo(JSONObject.toJSONString(e)); mqLog.setDuration(DateUtil.date().getTime() - startTime); mqLog.setFailTime(DateUtil.date().toLocalDateTime()); -// mqLogService.save(mqLog); + mqLogService.save(mqLog); } } From b056d53e9195c89927f749b31a965e2c060b9211 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Wed, 26 Feb 2025 16:14:31 +0800 Subject: [PATCH 4/6] =?UTF-8?q?key=20=E8=BF=87=E6=9C=9F=20=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=20=E8=B6=85=E6=97=B6=20=E5=8F=96=E6=B6=88=20=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=20=E5=8E=86=E5=8F=B2=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=20=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88=20=E9=98=9F?= =?UTF-8?q?=E5=88=97=20redis=20=E5=BA=8F=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/czg/config/OTimeTask.java | 35 +++++++++++++ .../config/RedisKeyExpirationListener.java | 51 +++++++++++++++++++ .../admin/AdminOrderController.java | 7 +-- .../controller/user/UserOrderController.java | 6 ++- .../java/com/czg/config/RabbitConfig.java | 7 ++- .../java/com/czg/config/RabbitConstants.java | 1 + .../java/com/czg/config/RabbitPublisher.java | 21 ++++++-- .../main/java/com/czg/config/RedisConfig.java | 30 +---------- .../main/java/com/czg/config/RedisCst.java | 7 +++ .../java/com/czg/service/RedisService.java | 18 +++++++ .../czg/order/service/OrderInfoService.java | 4 +- .../service/impl/OrderInfoServiceImpl.java | 45 ++++++++++++++-- .../order/service/impl/PayServiceImpl.java | 3 ++ 13 files changed, 191 insertions(+), 44 deletions(-) create mode 100644 cash-api/order-server/src/main/java/com/czg/config/OTimeTask.java create mode 100644 cash-api/order-server/src/main/java/com/czg/config/RedisKeyExpirationListener.java diff --git a/cash-api/order-server/src/main/java/com/czg/config/OTimeTask.java b/cash-api/order-server/src/main/java/com/czg/config/OTimeTask.java new file mode 100644 index 00000000..e7e74cd2 --- /dev/null +++ b/cash-api/order-server/src/main/java/com/czg/config/OTimeTask.java @@ -0,0 +1,35 @@ +package com.czg.config; + +import cn.hutool.core.date.DateUtil; +import com.czg.order.entity.OrderInfo; +import com.czg.order.service.OrderInfoService; +import com.czg.service.order.enums.OrderStatusEnums; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 订单定时任务 + * + * @author ww + * @description + */ +@Slf4j +@Component +public class OTimeTask { + @Resource + private OrderInfoService orderInfoService; + + /** + * order 过期 + */ + @Scheduled(cron = "0 0 1 * * ? ") + public void run() { + orderInfoService.updateChain() + .set(OrderInfo::getStatus, OrderStatusEnums.CANCELLED.getCode()) + .eq(OrderInfo::getStatus, OrderStatusEnums.UNPAID.getCode()) + .lt(OrderInfo::getTradeDay, DateUtil.format(DateUtil.yesterday(), "yyyy-MM-dd")) + .update(); + } +} diff --git a/cash-api/order-server/src/main/java/com/czg/config/RedisKeyExpirationListener.java b/cash-api/order-server/src/main/java/com/czg/config/RedisKeyExpirationListener.java new file mode 100644 index 00000000..642bb0d5 --- /dev/null +++ b/cash-api/order-server/src/main/java/com/czg/config/RedisKeyExpirationListener.java @@ -0,0 +1,51 @@ +package com.czg.config; + +import com.czg.order.service.OrderInfoService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.Message; +import org.springframework.data.redis.connection.MessageListener; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.listener.PatternTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; + +/** + * redis key过期监听 + * + * @author ww + */ +@Slf4j +@Configuration +public class RedisKeyExpirationListener implements MessageListener { + + @Value("${spring.data.redis.database}") + private String database; + @Resource + private OrderInfoService tbOrderInfoService; + + + //redis key失效监听 + @Bean + public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory) { + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + container.setConnectionFactory(connectionFactory); + // 监听特定键的过期事件 + container.addMessageListener(this, new PatternTopic("__keyevent@" + database + "__:expired")); + return container; + } + + @Override + public void onMessage(Message message, byte[] pattern) { + String expiredKey = new String(message.getBody()); + + // 检查过期的键是否以特定前缀开头 + if (expiredKey.startsWith(RedisCst.classKeyExpired.EXPIRED_ORDER)) { + log.info("监听到订单过期,订单Id: {}", expiredKey); + String orderId = expiredKey.substring(RedisCst.classKeyExpired.EXPIRED_ORDER.length()); + tbOrderInfoService.expired(Long.parseLong(orderId)); + } + } +} diff --git a/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java b/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java index 15d32e7a..8395816a 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/admin/AdminOrderController.java @@ -42,8 +42,10 @@ public class AdminOrderController { } @GetMapping("/historyOrder") - public CzgResult historyOrder(Long orderId) { - return CzgResult.success(orderInfoService.historyOrder(orderId)); + public CzgResult historyOrder( + @RequestParam(required = false) Long orderId, + @RequestParam(required = false) String tableCode) { + return CzgResult.success(orderInfoService.historyOrder(orderId, tableCode)); } @PostMapping("/createOrder") @@ -58,7 +60,6 @@ public class AdminOrderController { /** * 订单全额退款 只传订单id * 部分退款 传参refundDetailMap {"详情id":"数量","详情id":"数量"} - * */ @PostMapping("/refundOrder") public CzgResult refundOrder(@Validated @RequestBody OrderInfoRefundDTO refundDTO) { diff --git a/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java b/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java index a4fef161..b63da0f8 100644 --- a/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java +++ b/cash-api/order-server/src/main/java/com/czg/controller/user/UserOrderController.java @@ -39,8 +39,10 @@ public class UserOrderController { } @GetMapping("/historyOrder") - public CzgResult historyOrder(Long orderId) { - return CzgResult.success(orderInfoService.historyOrder(orderId)); + public CzgResult historyOrder( + @RequestParam(required = false) Long orderId, + @RequestParam(required = false) String tableCode) { + return CzgResult.success(orderInfoService.historyOrder(orderId, tableCode)); } /** diff --git a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConfig.java b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConfig.java index 07a9067e..7286774f 100644 --- a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConfig.java +++ b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConfig.java @@ -26,9 +26,14 @@ public class RabbitConfig { // 设置消息过期时间为 180000 毫秒(即 180 秒) args.put("x-message-ttl", 180000); return new Queue(activeProfile + "-" + RabbitConstants.Queue.ORDER_PRINT_QUEUE, true, false, false, args); -// return new Queue(activeProfile + "-" + RabbitConstants.Queue.ORDER_PRINT_QUEUE, true, false, false, null); } + @Bean + public Queue orderCancelQueue() { + return new Queue(activeProfile + "-" + RabbitConstants.Queue.ORDER_CANCEL_QUEUE, true); + } + + @Bean public Queue orderStockQueue() { return new Queue(activeProfile + "-" + RabbitConstants.Queue.ORDER_STOCK_QUEUE, true); diff --git a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConstants.java b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConstants.java index 5eb48698..c01f98d6 100644 --- a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConstants.java +++ b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitConstants.java @@ -11,6 +11,7 @@ public interface RabbitConstants { class Queue { public static final String ORDER_STOCK_QUEUE = "order.stock.queue"; + public static final String ORDER_CANCEL_QUEUE = "order.cancel.queue"; public static final String ORDER_PRINT_QUEUE = "order.print.queue"; } } diff --git a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java index f435b2da..34777a77 100644 --- a/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java +++ b/cash-common/cash-common-mq/src/main/java/com/czg/config/RabbitPublisher.java @@ -17,24 +17,35 @@ public class RabbitPublisher { @Resource private RabbitTemplate rabbitTemplate; + /** + * 订单取消消息 + * 目前 用来回滚库存 + * @param orderId 订单id + */ + public void sendOrderCancelMsg(String orderId) { + sendMsg(RabbitConstants.Queue.ORDER_STOCK_QUEUE, orderId); + } + /** * 库存损耗消息 * @param orderId 订单id */ public void sendOrderStockMsg(String orderId) { - sendMsg(RabbitConstants.Exchange.CASH_EXCHANGE, RabbitConstants.Queue.ORDER_STOCK_QUEUE, orderId); + sendMsg(RabbitConstants.Queue.ORDER_STOCK_QUEUE, orderId); } /** * 订单打印消息 - * @param orderId + * @param orderId 订单id */ public void sendOrderPrintMsg(String orderId) { - sendMsg(RabbitConstants.Exchange.CASH_EXCHANGE, RabbitConstants.Queue.ORDER_PRINT_QUEUE, orderId); + sendMsg(RabbitConstants.Queue.ORDER_PRINT_QUEUE, orderId); } - private void sendMsg(String exchange, String queue, String msg) { - rabbitTemplate.convertAndSend(activeProfile + "-" + exchange, activeProfile + "-" + queue, msg); + + + private void sendMsg(String queue, String msg) { + rabbitTemplate.convertAndSend(activeProfile + "-" + RabbitConstants.Exchange.CASH_EXCHANGE, activeProfile + "-" + queue, msg); } } diff --git a/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisConfig.java b/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisConfig.java index 5b4c0dbe..0eff9f09 100644 --- a/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisConfig.java +++ b/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisConfig.java @@ -40,35 +40,9 @@ public class RedisConfig { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); - redisTemplate.setHashValueSerializer(new StringRedisSerializer()); - redisTemplate.setValueSerializer(new StringRedisSerializer()); + redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); + redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setConnectionFactory(factory); return redisTemplate; } - - @Bean - public HashOperations hashOperations(RedisTemplate redisTemplate) { - return redisTemplate.opsForHash(); - } - - @Bean - public ValueOperations valueOperations(RedisTemplate redisTemplate) { - return redisTemplate.opsForValue(); - } - - @Bean - public ListOperations listOperations(RedisTemplate redisTemplate) { - return redisTemplate.opsForList(); - } - - @Bean - public SetOperations setOperations(RedisTemplate redisTemplate) { - return redisTemplate.opsForSet(); - } - - @Bean - public ZSetOperations zSetOperations(RedisTemplate redisTemplate) { - return redisTemplate.opsForZSet(); - } - } diff --git a/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java b/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java index 1b9b531f..50658b01 100644 --- a/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java +++ b/cash-common/cash-common-redis/src/main/java/com/czg/config/RedisCst.java @@ -11,6 +11,13 @@ public interface RedisCst { String LOGIN_CODE = "login:code:"; String SYS_LOG_KEY = "sys:log:"; + /** + * key过期监听 + */ + class classKeyExpired { + //订单key过期 + public static final String EXPIRED_ORDER = "expired.order:"; + } String SMS_CODE = "sms:code:"; diff --git a/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java b/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java index 2e8d50ee..db2743d8 100644 --- a/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java +++ b/cash-common/cash-common-redis/src/main/java/com/czg/service/RedisService.java @@ -1,5 +1,7 @@ package com.czg.service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; @@ -17,6 +19,8 @@ import java.util.concurrent.TimeUnit; @Component public class RedisService { + Logger log = LoggerFactory.getLogger(RedisService.class); + /** * 默认过期时长为24小时,单位:秒 */ @@ -59,6 +63,7 @@ public class RedisService { } return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -83,6 +88,7 @@ public class RedisService { try { return redisTemplate.hasKey(key); } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -127,6 +133,7 @@ public class RedisService { redisTemplate.opsForValue().set(key, value); return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -148,6 +155,7 @@ public class RedisService { } return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -215,6 +223,7 @@ public class RedisService { redisTemplate.opsForHash().putAll(key, map); return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -235,6 +244,7 @@ public class RedisService { } return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -252,6 +262,7 @@ public class RedisService { redisTemplate.opsForHash().put(key, item, value); return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -273,6 +284,7 @@ public class RedisService { } return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -346,6 +358,7 @@ public class RedisService { try { return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(key, value)); } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -471,6 +484,7 @@ public class RedisService { redisTemplate.opsForList().rightPush(key, value); return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -491,6 +505,7 @@ public class RedisService { } return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -507,6 +522,7 @@ public class RedisService { redisTemplate.opsForList().rightPushAll(key, value); return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -527,6 +543,7 @@ public class RedisService { } return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } @@ -544,6 +561,7 @@ public class RedisService { redisTemplate.opsForList().set(key, index, value); return true; } catch (Exception e) { + log.error("redis error:{}", e + ""); return false; } } diff --git a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java index b5f2ae10..65b7f629 100644 --- a/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java +++ b/cash-common/cash-common-service/src/main/java/com/czg/order/service/OrderInfoService.java @@ -25,7 +25,7 @@ import java.time.LocalDateTime; public interface OrderInfoService extends IService { Page getOrderByPage(OrderInfoQueryDTO param); - HistoryOrderVo historyOrder(Long orderId); + HistoryOrderVo historyOrder(Long orderId,String tableCode); OrderInfo createOrder(OrderInfoAddDTO param); OrderInfo checkOrderPay(CheckOrderPay param); @@ -35,4 +35,6 @@ public interface OrderInfoService extends IService { void refundCallBackOrder(@NotBlank String orderNo, @NotNull JSONObject resultJson); void upOrderInfo(OrderInfo orderInfo, BigDecimal payAmount, LocalDateTime payTime, Long payOrderId, PayEnums payType); + + void expired(Long orderId); } diff --git a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java index 325324dd..ecda285f 100644 --- a/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java +++ b/cash-service/order-service/src/main/java/com/czg/service/order/service/impl/OrderInfoServiceImpl.java @@ -35,7 +35,6 @@ import com.czg.service.RedisService; import com.czg.service.order.dto.BigDecimalDTO; import com.czg.service.order.enums.OrderStatusEnums; import com.czg.service.order.mapper.OrderInfoMapper; -import com.czg.system.entity.SysParams; import com.czg.utils.AssertUtil; import com.czg.utils.CzgStrUtils; import com.czg.utils.PageUtil; @@ -131,13 +130,24 @@ public class OrderInfoServiceImpl extends ServiceImpl orderDetails = orderDetailService.queryChain().select() - .eq(OrderDetail::getOrderId, orderId).list(); + .eq(OrderDetail::getOrderId, orderInfo.getId()).list(); Map> resultMap = new HashMap<>(); // 遍历订单详情列表 for (OrderDetail orderDetail : orderDetails) { @@ -208,6 +218,8 @@ public class OrderInfoServiceImpl extends ServiceImpl Date: Wed, 26 Feb 2025 16:24:40 +0800 Subject: [PATCH 5/6] =?UTF-8?q?OrderDetail=20=E5=A1=AB=E5=85=85=20?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/OrderDetailMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cash-service/order-service/src/main/resources/mapper/OrderDetailMapper.xml b/cash-service/order-service/src/main/resources/mapper/OrderDetailMapper.xml index 96ea9c81..43f4da31 100644 --- a/cash-service/order-service/src/main/resources/mapper/OrderDetailMapper.xml +++ b/cash-service/order-service/src/main/resources/mapper/OrderDetailMapper.xml @@ -17,7 +17,7 @@ #{entity.couponNum}, #{entity.returnNum}, #{entity.refundNum}, #{entity.refundNo}, #{entity.discountSaleNote}, #{entity.status}, #{entity.placeNum}, #{entity.isTemporary}, #{entity.isPrint}, #{entity.isWaitCall}, #{entity.proGroupInfo}, #{entity.remark}, #{entity.refundRemark}, - #{entity.createTime}, #{entity.updateTime}) + now(), now()) From ab23223e3db8f7e32dbe90a3a1dd03983e54b8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=9D=BE?= <8605635+zhang3064194730@user.noreply.gitee.com> Date: Wed, 26 Feb 2025 16:36:19 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=BA=97=E9=93=BA=E5=B9=BF=E5=91=8A?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ShopAdController.java | 91 +++++++++++++++++++ .../com/czg/account/dto/ad/ShopAdDTO.java | 74 +++++++++++++++ .../java/com/czg/account/entity/ShopAd.java | 91 +++++++++++++++++++ .../czg/account/service/ShopAdService.java | 14 +++ .../service/account/mapper/ShopAdMapper.java | 14 +++ .../service/impl/ShopAdServiceImpl.java | 18 ++++ .../main/resources/mapper/ShopAdMapper.xml | 7 ++ 7 files changed, 309 insertions(+) create mode 100644 cash-api/account-server/src/main/java/com/czg/controller/admin/ShopAdController.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/dto/ad/ShopAdDTO.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopAd.java create mode 100644 cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopAdService.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopAdMapper.java create mode 100644 cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopAdServiceImpl.java create mode 100644 cash-service/account-service/src/main/resources/mapper/ShopAdMapper.xml diff --git a/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopAdController.java b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopAdController.java new file mode 100644 index 00000000..766662cd --- /dev/null +++ b/cash-api/account-server/src/main/java/com/czg/controller/admin/ShopAdController.java @@ -0,0 +1,91 @@ +package com.czg.controller.admin; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.czg.account.dto.ad.ShopAdDTO; +import com.czg.account.entity.ShopAd; +import com.czg.account.service.ShopAdService; +import com.czg.annotation.SaAdminCheckPermission; +import com.czg.exception.ApiNotPrintException; +import com.czg.resp.CzgResult; +import com.czg.sa.StpKit; +import com.czg.validator.group.InsertGroup; +import com.czg.validator.group.UpdateGroup; +import com.mybatisflex.core.query.QueryWrapper; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 小程序广告管理 + * @author Administrator + */ +@RestController +@RequestMapping("/admin/shopAd") +public class ShopAdController { + @Resource + private ShopAdService shopAdService; + + /** + * 小程序广告列表 + * @param showPosition 展示位置 home首页,make_order点餐页 + * @param status 状态 0未启用,1已启用 + * @return 列表 + */ + @SaAdminCheckPermission(value = "shopAd:list", name = "小程序广告列表") + @GetMapping + public CzgResult> list(String showPosition, Integer status) { + QueryWrapper queryWrapper = new QueryWrapper().eq(ShopAd::getShopId, StpKit.USER.getShopId()); + if (StrUtil.isNotBlank(showPosition)) { + queryWrapper.eq(ShopAd::getShowPosition, showPosition); + } + + queryWrapper.eq(ShopAd::getStatus, status); + return CzgResult.success(shopAdService.list(queryWrapper)); + } + + /** + * 小程序广告详情 + * @param id adId + * @return 详情 + */ + @SaAdminCheckPermission(value = "shopAd:detail", name = "小程序广告详情") + @GetMapping("/detail") + public CzgResult detail(@RequestParam Integer id) { + return CzgResult.success(shopAdService.getOne(new QueryWrapper().eq(ShopAd::getId, id).eq(ShopAd::getShopId, StpKit.USER.getShopId()))); + } + + /** + * 小程序广告编辑 + * @return 是否成功 + */ + @SaAdminCheckPermission(value = "shopAd:list", name = "小程序广告编辑") + @PutMapping + public CzgResult edit(@RequestBody @Validated(UpdateGroup.class) ShopAdDTO shopAdEditDTO) { + ShopAd shopAd = BeanUtil.copyProperties(shopAdEditDTO, ShopAd.class); + long count = shopAdService.count(new QueryWrapper().eq(ShopAd::getShopId, StpKit.USER.getShopId()).like(ShopAd::getShowPosition, shopAdEditDTO.getShowPosition()).ne(ShopAd::getId, shopAdEditDTO.getId())); + if (count > 0) { + return CzgResult.failure("小程序此位置已存在广告"); + } + return CzgResult.success(shopAdService.update(shopAd, new QueryWrapper().eq(ShopAd::getId, shopAdEditDTO.getId()).eq(ShopAd::getShopId, StpKit.USER.getShopId()))); + } + + + /** + * 小程序广告添加 + * @return 是否成功 + */ + @SaAdminCheckPermission(value = "shopAd:add", name = "小程序广告添加") + @PostMapping + public CzgResult add(@RequestBody @Validated(InsertGroup.class) ShopAdDTO shopAdEditDTO) { + long count = shopAdService.count(new QueryWrapper().eq(ShopAd::getShopId, StpKit.USER.getShopId()).like(ShopAd::getShowPosition, shopAdEditDTO.getShowPosition())); + if (count > 0) { + return CzgResult.failure("小程序此位置已存在广告"); + } + ShopAd shopAd = BeanUtil.copyProperties(shopAdEditDTO, ShopAd.class); + shopAd.setShopId(StpKit.USER.getShopId()); + return CzgResult.success(shopAdService.save(shopAd)); + } +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ad/ShopAdDTO.java b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ad/ShopAdDTO.java new file mode 100644 index 00000000..1f8d5855 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/dto/ad/ShopAdDTO.java @@ -0,0 +1,74 @@ + +package com.czg.account.dto.ad; + +import java.io.Serializable; +import java.time.LocalDateTime; +import com.alibaba.fastjson2.annotation.JSONField; +import java.io.Serial; + +import com.czg.validator.group.InsertGroup; +import com.czg.validator.group.UpdateGroup; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 店铺广告 实体类。 + * + * @author zs + * @since 2025-02-26 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ShopAdDTO implements Serializable { + + /** + * 自增id + */ + @NotNull(message = "id不为空", groups = {UpdateGroup.class}) + private Long id; + + /** + * 广告图片地址 + */ + private String imgUrl; + + /** + * 跳转页面路径 + */ + private String linkPath; + + /** + * 广告展示圆角 + */ + private Integer borderRadius; + + /** + * 弹窗展示位置:home首页,make_order点餐页 + */ + @NotBlank(message = "展示位置不为空", groups = InsertGroup.class) + private String showPosition; + + /** + * 显示频率:only_one 仅首次展示, every_show 每次打开都展示,every_day 每天展示一次,three_day 每三天展示一次, seven_day 每七天展示一次, thirty_day 没30天展示一次 + */ + @NotBlank(message = "显示频率不为空", groups = InsertGroup.class) + private String frequency; + + /** + * 广告状态:0未启用,1已启用 + */ + @NotNull(message = "广告状态不为空", groups = InsertGroup.class) + private Integer status; + + /** + * 排序 + */ + private Integer sort; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopAd.java b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopAd.java new file mode 100644 index 00000000..db61e743 --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/entity/ShopAd.java @@ -0,0 +1,91 @@ +package com.czg.account.entity; + +import com.mybatisflex.annotation.Column; +import com.mybatisflex.annotation.Id; +import com.mybatisflex.annotation.KeyType; +import com.mybatisflex.annotation.Table; +import java.io.Serializable; +import java.time.LocalDateTime; + +import java.io.Serial; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 店铺广告 实体类。 + * + * @author zs + * @since 2025-02-26 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table("tb_shop_ad") +public class ShopAd implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 自增id + */ + @Id(keyType = KeyType.Auto) + private Long id; + + /** + * 店铺id,如果是通用广告则为0 + */ + private Long shopId; + + /** + * 广告图片地址 + */ + private String imgUrl; + + /** + * 跳转页面路径 + */ + private String linkPath; + + /** + * 广告展示圆角 + */ + private Integer borderRadius; + + /** + * 弹窗展示位置:home首页,make_order点餐页 + */ + private String showPosition; + + /** + * 显示频率:only_one 仅首次展示, every_show 每次打开都展示,every_day 每天展示一次,three_day 每三天展示一次, seven_day 每七天展示一次, thirty_day 没30天展示一次 + */ + private String frequency; + + /** + * 广告状态:0未启用,1已启用 + */ + private Integer status; + + /** + * 排序 + */ + private Integer sort; + + /** + * 创建时间 + */ + @Column(onInsertValue = "now()") + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @Column(onInsertValue = "now()", onUpdateValue = "now()") + private LocalDateTime updateTime; + +} diff --git a/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopAdService.java b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopAdService.java new file mode 100644 index 00000000..ab5d385f --- /dev/null +++ b/cash-common/cash-common-service/src/main/java/com/czg/account/service/ShopAdService.java @@ -0,0 +1,14 @@ +package com.czg.account.service; + +import com.mybatisflex.core.service.IService; +import com.czg.account.entity.ShopAd; + +/** + * 店铺广告 服务层。 + * + * @author zs + * @since 2025-02-26 + */ +public interface ShopAdService extends IService { + +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopAdMapper.java b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopAdMapper.java new file mode 100644 index 00000000..2d49ff35 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/mapper/ShopAdMapper.java @@ -0,0 +1,14 @@ +package com.czg.service.account.mapper; + +import com.mybatisflex.core.BaseMapper; +import com.czg.account.entity.ShopAd; + +/** + * 店铺广告 映射层。 + * + * @author zs + * @since 2025-02-26 + */ +public interface ShopAdMapper extends BaseMapper { + +} diff --git a/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopAdServiceImpl.java b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopAdServiceImpl.java new file mode 100644 index 00000000..b609f5a0 --- /dev/null +++ b/cash-service/account-service/src/main/java/com/czg/service/account/service/impl/ShopAdServiceImpl.java @@ -0,0 +1,18 @@ +package com.czg.service.account.service.impl; + +import com.mybatisflex.spring.service.impl.ServiceImpl; +import com.czg.account.entity.ShopAd; +import com.czg.account.service.ShopAdService; +import com.czg.service.account.mapper.ShopAdMapper; +import org.springframework.stereotype.Service; + +/** + * 店铺广告 服务层实现。 + * + * @author zs + * @since 2025-02-26 + */ +@Service +public class ShopAdServiceImpl extends ServiceImpl implements ShopAdService{ + +} diff --git a/cash-service/account-service/src/main/resources/mapper/ShopAdMapper.xml b/cash-service/account-service/src/main/resources/mapper/ShopAdMapper.xml new file mode 100644 index 00000000..a7fb7340 --- /dev/null +++ b/cash-service/account-service/src/main/resources/mapper/ShopAdMapper.xml @@ -0,0 +1,7 @@ + + + + +