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] =?UTF-8?q?key=20=E8=BF=87=E6=9C=9F=20=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=20=E8=B6=85=E6=97=B6=20=E5=8F=96=E6=B6=88=20=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=20=E5=8E=86=E5=8F=B2=E8=AE=A2=E5=8D=95=20?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88=20=E9=98=9F=E5=88=97=20red?= =?UTF-8?q?is=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 000000000..e7e74cd20 --- /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 000000000..642bb0d5d --- /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 15d32e7ad..8395816ae 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 a4fef1619..b63da0f81 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 07a9067e7..7286774fb 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 5eb486983..c01f98d68 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 f435b2da9..34777a779 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 5b4c0dbea..0eff9f09f 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 1b9b531fd..50658b015 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 2e8d50eea..db2743d89 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 b5f2ae105..65b7f6297 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 325324ddd..ecda285f9 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