| | |
| | | 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; |
| | |
| | | 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 服务实现 |
| | |
| | | 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){ |
| | |
| | | } |
| | | 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; |
| | | } |
| | | |
| | | } |