OrderExpireTask.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package com.zanxiang.sdk.task;
  2. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  3. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  4. import com.zanxiang.common.enums.ExpireTimeEnum;
  5. import com.zanxiang.common.enums.OrderStateEnum;
  6. import com.zanxiang.common.utils.SpringUtils;
  7. import com.zanxiang.mybatis.entity.Order;
  8. import com.zanxiang.sdk.constant.RedisKeyConstant;
  9. import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
  10. import com.zanxiang.sdk.enums.PayTypeEnum;
  11. import com.zanxiang.sdk.service.IOrderService;
  12. import com.zanxiang.sdk.service.IPayApplicationService;
  13. import com.zanxiang.sdk.service.pay.PayBaseService;
  14. import com.zanxiang.sdk.util.RedisUtil;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.cloud.context.config.annotation.RefreshScope;
  18. import org.springframework.scheduling.annotation.Scheduled;
  19. import org.springframework.stereotype.Component;
  20. import java.util.Objects;
  21. import java.util.Set;
  22. /**
  23. * @author : lingfeng
  24. * @time : 2023-01-17
  25. * @description : 订单过期定时器
  26. */
  27. @Slf4j
  28. @Component
  29. @RefreshScope
  30. public class OrderExpireTask {
  31. @Autowired
  32. private RedisUtil<String> redisUtil;
  33. @Autowired
  34. private IOrderService orderService;
  35. @Autowired
  36. private IPayApplicationService payApplicationService;
  37. /**
  38. * 订单过期每分钟检测
  39. */
  40. @Scheduled(cron = "0 0/1 * * * ?")
  41. public void orderExpireCheck() {
  42. double min = 0.0;
  43. double max = System.currentTimeMillis();
  44. //获取缓存订单
  45. Set<String> paramList = redisUtil.getZSetByScore(RedisKeyConstant.ORDER_EXPIRE, min, max);
  46. //不存在过期订单
  47. if (CollectionUtils.isEmpty(paramList)) {
  48. return;
  49. }
  50. //循环处理
  51. paramList.forEach(param -> {
  52. //缓存锁
  53. String lock = RedisKeyConstant.ORDER_EXPIRE_LOCK + param;
  54. //判断订单是否在执行, 设置执行锁 1 分钟
  55. boolean ifAbsent = redisUtil.setIfAbsent(lock, param, ExpireTimeEnum.ONE_MIN.getTime());
  56. if (!ifAbsent) {
  57. return;
  58. }
  59. //小程序商城的订单取消
  60. if (param.contains("_")) {
  61. payApplicationService.appletStoreCancel(param);
  62. } else {
  63. this.orderExpire(param);
  64. }
  65. //删除订单列表缓存
  66. redisUtil.delZSetValue(RedisKeyConstant.ORDER_EXPIRE, param);
  67. //删除执行缓存锁
  68. redisUtil.deleteCache(lock);
  69. });
  70. }
  71. private void orderExpire(String orderId) {
  72. //查询订单信息
  73. PlatformOrderDTO platformOrderDTO = orderService.getByOrderId(orderId);
  74. //订单不存在
  75. if (platformOrderDTO == null) {
  76. return;
  77. }
  78. //已支付订单或者已取消订单不处理
  79. if (Objects.equals(OrderStateEnum.SUCCESS_PAY.getCode(), platformOrderDTO.getStatus())
  80. || Objects.equals(OrderStateEnum.CANCEL_PAY.getCode(), platformOrderDTO.getStatus())) {
  81. return;
  82. }
  83. //关闭商户订单
  84. PayTypeEnum payTypeEnum = PayTypeEnum.getByPayType(platformOrderDTO.getPayWayId().intValue());
  85. PayBaseService service = SpringUtils.getBean(payTypeEnum.getClazz());
  86. service.closeOrder(platformOrderDTO);
  87. //订单状态变更
  88. orderService.update(new LambdaUpdateWrapper<Order>()
  89. .set(Order::getStatus, OrderStateEnum.CANCEL_PAY.getCode())
  90. .eq(Order::getOrderId, orderId));
  91. }
  92. }