Browse Source

完善逻辑

Memory_LG 3 weeks ago
parent
commit
1fc9293105

+ 38 - 0
qmjszx-admin/src/main/java/beilv/web/controller/carinformation/cardAppController.java

@@ -13,7 +13,9 @@ import beilv.common.utils.DateUtils;
 import beilv.common.utils.StringUtils;
 import beilv.common.utils.uuid.IdUtils;
 import beilv.competition.domain.Competition;
+import beilv.competition.domain.RedisTask;
 import beilv.competition.service.ICompetitionService;
+import beilv.system.service.ISysConfigService;
 import beilv.usermembershipcard.domain.UserMembershipCard;
 import beilv.usermembershipcard.service.IUserMembershipCardService;
 import beilv.vipCard.domain.VipCard;
@@ -21,6 +23,7 @@ import beilv.vipCard.service.IVipCardService;
 import beilv.vipCardLog.domain.VipCardLog;
 import beilv.vipCardLog.service.IVipCardLogService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -28,6 +31,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+
+import static beilv.competition.domain.Constant.ORDER_QUEUE;
+import static beilv.competition.domain.Constant.TICKET_QUEUE;
 
 /**
  * 会员卡AppController
@@ -61,6 +70,12 @@ public class cardAppController extends BaseController {
     @Autowired
     private IAdmissionTicketService ticketService;
 
+    @Autowired
+    private ISysConfigService configService;
+
+    @Autowired
+    private StringRedisTemplate redisTemplate;
+
     /**
      * 新增充值记录
      * id                   生成的数据标识(后续交互的关键信息)
@@ -88,6 +103,10 @@ public class cardAppController extends BaseController {
         vipCardLog.setPaymentStatus("payment_status_to_be_paid");
         vipCardLog.setCreateTime(DateUtils.getNowDate());
         vipCardLog.setPaymentType("weChart");
+
+        //开启定时任务
+        createOrderTaskQueue(uuid,"chongzhi", "");
+
         if (vipCardLogService.insertVipCardLog(vipCardLog) > 0) {
             return AjaxResult.success("操作成功!", uuid);
         } else {
@@ -190,6 +209,10 @@ public class cardAppController extends BaseController {
             }
 
         }
+
+        //开启定时任务
+        createOrderTaskQueue(uuid, vipCardLog.getOrderType(), vipCardLog.getBusId());
+
         if (vipCardLogService.insertVipCardLog(vipCardLog) > 0) {
             return AjaxResult.success("操作成功!", uuid);
         } else {
@@ -290,6 +313,21 @@ public class cardAppController extends BaseController {
         return AjaxResult.success(getDataTable(vipCardLogService.selectCanSaiList(vipCardLog)));
     }
 
+    /**
+     * 新增订单开启定时任务
+     * @param uuid
+     */
+    private void createOrderTaskQueue(String uuid, String orderType, String busId){
+        //超时分钟数
+        long timeOut = Long.parseLong(configService.selectConfigByKey("order.task.timeout"));
+
+        long timeoutTime = LocalDateTime.now().plus(timeOut, ChronoUnit.MINUTES).atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
+
+        //创建订单, 开启定时
+        RedisTask redisTaskApply = new RedisTask(uuid, "","payment_status_cancelled", orderType, busId);
+        redisTemplate.opsForZSet().add(ORDER_QUEUE + uuid, redisTaskApply.toString(), timeoutTime);
+    }
+
 
 
 

+ 3 - 0
qmjszx-business/src/main/java/beilv/competition/domain/Constant.java

@@ -12,6 +12,9 @@ public class Constant {
     public static final String TICKET_QUEUE = "ticket:";
     public static final String TICKET_QUEUE_ALL = "ticket:*";
 
+    public static final String ORDER_QUEUE = "order:";
+
+    public static final String ORDER_QUEUE_ALL = "order:*";
     public Constant() {
     }
 }

+ 8 - 0
qmjszx-business/src/main/java/beilv/competition/domain/RedisTask.java

@@ -16,6 +16,14 @@ public class RedisTask {
     private String competitionId;
     private String competitionState;
     private String paymentStatus;
+    private String orderType;
+    private String busId;
+
+    public RedisTask(String competitionId, String competitionState, String paymentStatus) {
+        this.competitionId = competitionId;
+        this.competitionState = competitionState;
+        this.paymentStatus = paymentStatus;
+    }
 
     public String toString() {
         try {

+ 47 - 0
qmjszx-business/src/main/java/beilv/competition/task/RedisTaskChecker.java

@@ -217,6 +217,53 @@ public class RedisTaskChecker {
         }
     }
 
+
+    @Scheduled(fixedRate = 1000)
+    public void checkOrder() {
+        long currentTime = System.currentTimeMillis() / 1000;
+
+        // 获取所有有序集合的键
+        Set<String> keys = stringRedisTemplate.keys(ORDER_QUEUE_ALL);
+        if (keys != null && !keys.isEmpty()) {
+            for (String key : keys) {
+                // 获取当前时间之前的所有任务
+                Set<String> tasks = stringRedisTemplate.opsForZSet().rangeByScore(key, 0, currentTime);
+                if (tasks != null && !tasks.isEmpty()) {
+                    for (String taskJson : tasks) {
+                        try {
+//                            System.out.println("taskJson => " + taskJson);
+
+                            //获取任务信息
+                            ObjectMapper objectMapper = new ObjectMapper();
+                            RedisTask task = objectMapper.readValue(taskJson, RedisTask.class);
+
+                            //根据订单id, 修改订单为已取消
+                            VipCardLog vipCardLog = new VipCardLog();
+                            vipCardLog.setId(task.getCompetitionId());
+                            vipCardLog.setPaymentStatus(task.getPaymentStatus());
+                            vipCardLog.setCancellationTime(DateUtils.getNowDate());
+                            vipCardLogMapper.updateVipCardLog(vipCardLog);
+
+                            //判断订单类型, 如果是约球, 要重置球场信息
+                            if("yueqiu".equals(task.getOrderType())){
+                                AdmissionTicket admissionTicket = new AdmissionTicket();
+                                admissionTicket.setId(task.getBusId());
+                                admissionTicket.setAdmissionTicketStatus("0");
+                                ticketMapper.updateBeilvAdmissionTicket(admissionTicket);
+                            }
+
+                            // 移除当前已发布的任务
+                            stringRedisTemplate.opsForZSet().remove(key, taskJson);
+                            System.out.println("Removed task: " + taskJson);
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     public void removeTaskByKey(String zKey){
         stringRedisTemplate.delete(zKey);
     }

+ 1 - 1
qmjszx-quartz/src/main/java/beilv/quartz/task/SiteTask.java

@@ -79,7 +79,7 @@ public class SiteTask {
      */
     public void updateTicketStatus(Long millisecond) {
         AdmissionTicket admissionTicket = new AdmissionTicket();
-        admissionTicket.setAdmissionTicketStatus("-1");
+        admissionTicket.setAdmissionTicketStatus("0");
 
         List<AdmissionTicket> admissionTickets = ticketService.selectBeilvAdmissionTicketList(admissionTicket);