瀏覽代碼

掉单定时查单发送消息

LiYi 1 周之前
父節點
當前提交
0a6f57ccff
共有 1 個文件被更改,包括 55 次插入19 次删除
  1. 55 19
      src/main/java/org/jebot/handler/impl/merchant/MerchantDropOrderHandler.java

+ 55 - 19
src/main/java/org/jebot/handler/impl/merchant/MerchantDropOrderHandler.java

@@ -11,34 +11,54 @@ import org.jebot.handler.dto.BotMessage;
 import org.jebot.models.jebot.BotGroup;
 import org.jebot.models.xxpay.PayOrder;
 
+import java.util.concurrent.*;
+
+// 定时任务工具类
+class OrderStatusScheduler {
+    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
+    private static final ConcurrentHashMap<String, Boolean> scheduledOrders = new ConcurrentHashMap<>();
+
+    public static void scheduleCheck(String orderId, Runnable task) {
+        // 避免重复任务
+        if (scheduledOrders.putIfAbsent(orderId, true) != null) {
+            return;
+        }
+
+        scheduler.schedule(() -> {
+            try {
+                task.run();
+            } finally {
+                scheduledOrders.remove(orderId);
+            }
+        }, 20, TimeUnit.SECONDS); // 延时 20 秒执行
+    }
+}
+
 @Slf4j
 public class MerchantDropOrderHandler extends AbstractHandler {
+
     @Override
     public boolean msgHandler(BotMessage botMessage) {
-        //判断是否类似掉单待处理
-//        if (!botMessage.getMessage().toString().contains("掉单")){
-//            return false;
-//        }
         if (botMessage.isContainsTextAndPhoto()) {
-            //查询当前群组是否绑定商户号
+            // 查询当前群组是否绑定商户号
             if (!botMessage.isGroupMch()) {
                 return false;
             }
 
-            //如果商户号存在,查询订单所属上游
-            PayOrder payOrder = handlerManager.getPayOrderRepository().findByPayOrderIdOrMchOrderNo(botMessage.getMessage().caption().trim(), botMessage.getBotGroup().getDataId());
+            // 查询订单
+            PayOrder payOrder = handlerManager.getPayOrderRepository()
+                    .findByPayOrderIdOrMchOrderNo(botMessage.getMessage().caption().trim(),
+                            botMessage.getBotGroup().getDataId());
             if (payOrder == null) {
-//                SendMessage sendMessage = new SendMessage(botMessage.getMessage().chat().id(), "订单不存在");
-//                sendMessage.replyParameters(new ReplyParameters(botMessage.getMessage().messageId()));
-//                botMessage.getTelegramBot().execute(sendMessage);
                 return false;
             }
 
-            //获取通道id
+            // 获取通道id
             Long channelId = payOrder.getPassageId();
 
-            //根据通道id获取绑定的群组
-            BotGroup botChannel = this.handlerManager.getGroupRepository().findBotGroupByDataIdAndDataType(channelId, Constant.DATA_TYPE_CHANNEL);
+            // 根据通道id获取绑定的群组
+            BotGroup botChannel = this.handlerManager.getGroupRepository()
+                    .findBotGroupByDataIdAndDataType(channelId, Constant.DATA_TYPE_CHANNEL);
             if (botChannel == null) {
                 SendMessage sendMessage = new SendMessage(botMessage.getMessage().chat().id(), "订单通道未绑定群组");
                 sendMessage.replyParameters(new ReplyParameters(botMessage.getMessage().messageId()));
@@ -46,19 +66,35 @@ public class MerchantDropOrderHandler extends AbstractHandler {
                 return false;
             }
 
-            //复制需要转发的掉单信息到通道群组
-            CopyMessage message = new CopyMessage(botChannel.getGroupId(), botMessage.getMessage().chat().id(), botMessage.getMessage().messageId());
+            // 转发掉单信息到通道群组
+            CopyMessage message = new CopyMessage(botChannel.getGroupId(),
+                    botMessage.getMessage().chat().id(),
+                    botMessage.getMessage().messageId());
             message.caption(payOrder.getPayOrderId());
             MessageIdResponse execute = botMessage.getTelegramBot().execute(message);
             if (!execute.isOk()) {
                 log.error("转发消息失败: {}", execute);
             }
-            SendMessage sendMessage = new SendMessage(botMessage.getMessage().chat().id(), "处理成功");
-            sendMessage.replyParameters(new ReplyParameters(botMessage.getMessage().messageId()));
-            botMessage.getTelegramBot().execute(sendMessage);
+
+            // 延时 30 秒后查询订单状态(只查一次)
+            OrderStatusScheduler.scheduleCheck(payOrder.getPayOrderId().toString(), () -> {
+                PayOrder updatedOrder = handlerManager.getPayOrderRepository()
+                        .findById(payOrder.getPayOrderId())
+                        .orElse(null);
+
+                if (updatedOrder != null && updatedOrder.getStatus() == 2) {
+                    SendMessage okMsg = new SendMessage(botMessage.getMessage().chat().id(),
+                            "订单【" + updatedOrder.getPayOrderId() + "】已完成支付 ✅");
+                    botMessage.getTelegramBot().execute(okMsg);
+                } else {
+                    SendMessage failMsg = new SendMessage(botMessage.getMessage().chat().id(),
+                            "补单信息已提交,暂未收到款,成功后会自动回调~");
+                    botMessage.getTelegramBot().execute(failMsg);
+                }
+            });
+
             return true;
         }
-
         return false;
     }
 }