From eb77373d92f01e51b98bda8fae66315ed9a4394d Mon Sep 17 00:00:00 2001
From: 彭雪彬 <1724387007@qq.com>
Date: Mon, 14 Jul 2025 17:08:57 +0800
Subject: [PATCH] 骑手接单和骑手取消订单

---
 oying-system/src/main/java/com/oying/modules/rider/service/impl/RiderOrderRecordServiceImpl.java |   56 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 53 insertions(+), 3 deletions(-)

diff --git a/oying-system/src/main/java/com/oying/modules/rider/service/impl/RiderOrderRecordServiceImpl.java b/oying-system/src/main/java/com/oying/modules/rider/service/impl/RiderOrderRecordServiceImpl.java
index d1b9785..ea3d97a 100644
--- a/oying-system/src/main/java/com/oying/modules/rider/service/impl/RiderOrderRecordServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/rider/service/impl/RiderOrderRecordServiceImpl.java
@@ -1,7 +1,9 @@
 package com.oying.modules.rider.service.impl;
 
+import cn.hutool.core.lang.UUID;
+import com.oying.exception.BadRequestException;
 import com.oying.modules.rider.domain.RiderOrderRecord;
-import com.oying.utils.FileUtil;
+import com.oying.utils.*;
 import lombok.RequiredArgsConstructor;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -10,14 +12,13 @@
 import com.oying.modules.rider.mapper.RiderOrderRecordMapper;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.oying.utils.PageUtil;
+
 import java.util.List;
 import java.util.Map;
 import java.io.IOException;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
-import com.oying.utils.PageResult;
 
 /**
 * @description 服务实现
@@ -29,6 +30,7 @@
 public class RiderOrderRecordServiceImpl extends ServiceImpl<RiderOrderRecordMapper, RiderOrderRecord> implements RiderOrderRecordService {
 
     private final RiderOrderRecordMapper riderOrderRecordMapper;
+    private final RedisUtils redisUtils;
 
     @Override
     public PageResult<RiderOrderRecord> queryAll(RiderOrderRecordQueryCriteria criteria, Page<Object> page){
@@ -87,4 +89,52 @@
         }
         FileUtil.downloadExcel(list, response);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R riderGrabOrder(String orderNum) {
+        // 唯一标识当前线程/客户端
+        String clientId = UUID.randomUUID().toString();
+        // Redis 锁 key
+        String lockKey = "lock:order:" + orderNum;
+        try {
+            // 获取分布式锁,设置超时时间10秒
+            boolean isLocked = redisUtils.setIfAbsent(lockKey, clientId, 10);
+            if (!isLocked) {
+                return R.fail(400, "请稍后重试");
+            }
+            // 查询当前订单 检查订单是否已经被其他骑手抢到或取消 直接返回
+
+            // 订单没有被接单或取消的情况下,进行接单操作
+            // 1.修改订单状态
+
+            // 2.新增订单接单流程信息
+
+            // 3.新增骑手端订单记录详情
+
+            // 返回成功信息
+            return R.success(null, "接单成功");
+        } catch (Exception e) {
+            throw new BadRequestException("接单失败,请稍后重试");
+        } finally {
+            // 安全释放锁(仅释放自己持有的锁)
+            String currentClientId = (String) redisUtils.get(lockKey);
+            // 当前线程持有锁
+            if (StringUtils.equals(currentClientId, clientId)) {
+                // 释放锁
+                redisUtils.del(lockKey);
+            }
+        }
+    }
+
+    @Override
+    public R riderCancelOrder(String orderNum) {
+        // 查询当前订单信息
+        // 根据信息判断当前订单信息是否满足取消条件
+        // 满足取消订单
+        // 不满足取消订单条件,返回错误信息
+        // 取消订单后通知商家
+        return null;
+    }
+
 }

--
Gitblit v1.9.3