彭雪彬
2025-07-14 eb77373d92f01e51b98bda8fae66315ed9a4394d
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;
    }
}