瀏覽代碼

feat(queue): 添加预约状态定时处理与消息队列延时任务

- 新增FollowConsumer消费类,监听预约任务队列并处理预约状态更新
- 定义队列常量FOLLOW_ORDER_DATA用于预约任务延时处理
- 在新增预约时,根据预约时间发送延时消息,时间到后自动更新状态
- 优化新增预约逻辑,去除同步修改状态步骤,改为异步延时任务处理
- 引入RedisMQTemplate发送延时消息实现预约状态自动变更
zhangxf 1 月之前
父節點
當前提交
7207e023b7

+ 10 - 0
src/main/java/com/jtzx/crm/module/sys/common/QueueCommon.java

@@ -0,0 +1,10 @@
+package com.jtzx.crm.module.sys.common;
+
+public class QueueCommon {
+
+    /**
+     * 任务开始队列
+     */
+    public static  final String FOLLOW_ORDER_DATA = "followOrderData";
+
+}

+ 37 - 0
src/main/java/com/jtzx/crm/module/sys/queue/FollowConsumer.java

@@ -0,0 +1,37 @@
+package com.jtzx.crm.module.sys.queue;
+
+
+import com.jtzx.crm.module.sys.common.QueueCommon;
+import com.jtzx.crm.module.sys.entity.SysCustomerFollowEntity;
+import com.jtzx.crm.module.sys.mapper.SysCustomerFollowMapper;
+import com.redismq.RedisListener;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class FollowConsumer {
+
+
+    private final SysCustomerFollowMapper sysCustomerFollowMapper;
+
+    /**
+     * 定时处理预约状态
+     * @param id
+     */
+    @RedisListener(queue = QueueCommon.FOLLOW_ORDER_DATA, delay = true)
+    public void handleFollowStatus(Long id) {
+        log.info("handleFollowStatus: {}", id);
+        SysCustomerFollowEntity sysCustomerFollowEntity = sysCustomerFollowMapper.selectById(id);
+        if (sysCustomerFollowEntity != null) {
+            if (sysCustomerFollowEntity.getOrderType() != null && sysCustomerFollowEntity.getOrderType() == 0 &&
+                    sysCustomerFollowEntity.getOrderStatus() == 0) {
+                sysCustomerFollowEntity.setOrderStatus(1);
+                sysCustomerFollowMapper.updateById(sysCustomerFollowEntity);
+            }
+        }
+    }
+
+}

+ 21 - 9
src/main/java/com/jtzx/crm/module/sys/service/SysCustomerFollowService.java

@@ -6,6 +6,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.google.common.collect.Lists;
+import com.jtzx.crm.module.sys.common.QueueCommon;
 import com.jtzx.crm.module.sys.entity.*;
 import com.jtzx.crm.module.sys.mapper.*;
 import com.jtzx.crm.module.sys.model.request.AdminSysCustomerFollowInsertOrUpdateDTO;
@@ -13,13 +14,16 @@ import com.jtzx.crm.module.sys.model.response.CustomerFollowOverViewBO;
 import com.jtzx.crm.module.sys.model.response.CustomerProductBO;
 import com.jtzx.crm.module.sys.model.response.CustomerProductOverViewBO;
 import com.jtzx.crm.module.sys.model.response.SysCustomerFollowDataBO;
+import com.redismq.utils.RedisMQTemplate;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.Duration;
 import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
@@ -50,6 +54,8 @@ public class SysCustomerFollowService {
 
     private final SysCustomerDataPermissionService permissionService;
 
+    private final RedisMQTemplate redisMQTemplate;
+
     /**
      * 后台管理-新增
      */
@@ -64,16 +70,22 @@ public class SysCustomerFollowService {
         this.handleParams(dto);
         SysCustomerFollowEntity entity = new SysCustomerFollowEntity();
         BeanUtil.copyProperties(dto, entity);
+        entity.setOrderStatus(0);
+        entity.setOrderDatetime(dto.getOrderDatetime());
         sysCustomerFollowMapper.insert(entity);
         if (dto.getOrderType() != null && dto.getOrderType() == 0 && dto.getOrderDatetime() != null) {
-            entity.setOrderStatus(0);
-            entity.setOrderDatetime(dto.getOrderDatetime());
-            if (!dto.getOrderDatetime().isAfter(LocalDateTime.now())) {
-                entity.setOrderStatus(1);
-            }
-            sysCustomerFollowMapper.updateById(entity);
-            if (dto.getOrderDatetime().isAfter(LocalDateTime.now())) {
-                //TODO 发送定时任务,时间到之后改为已结束
+
+//            if (!dto.getOrderDatetime().isAfter(LocalDateTime.now())) {
+//                entity.setOrderStatus(1);
+//            }
+//            sysCustomerFollowMapper.updateById(entity);
+            LocalDateTime now = LocalDateTime.now();
+            if (dto.getOrderDatetime().isAfter(now)) {
+                //发送定时任务,时间到之后改为已结束
+                long between = Math.abs(ChronoUnit.SECONDS.between(now, dto.getOrderDatetime()));
+                if (between > 0) {
+                    redisMQTemplate.sendDelayMessage(entity.getId(), QueueCommon.FOLLOW_ORDER_DATA, Duration.ofSeconds(between));
+                }
             }
         }
     }
@@ -257,7 +269,7 @@ public class SysCustomerFollowService {
                         new LambdaQueryWrapper<>(SysCustomerFollowEntity.class)
                                 .eq(SysCustomerFollowEntity::getCustomerId, customerId)
                                 .eq(SysCustomerFollowEntity::getClaimUserId, userId)
-                                .eq(SysCustomerFollowEntity::getOrderStatus,0)//待开始的
+                                .eq(SysCustomerFollowEntity::getOrderStatus, 0)//待开始的
                                 .isNotNull(SysCustomerFollowEntity::getOrderType)//预约待办不能为空的
                                 .orderByDesc(SysCustomerFollowEntity::getCreatedAt)
                 );