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