package com.oying.modules.rider.service.impl;
|
|
import cn.hutool.core.lang.UUID;
|
import com.oying.exception.BadRequestException;
|
import com.oying.modules.pc.store.domain.Store;
|
import com.oying.modules.pc.store.service.StoreService;
|
import com.oying.modules.rider.domain.RiderInfo;
|
import com.oying.modules.rider.domain.RiderOrderRecord;
|
import com.oying.modules.rider.service.RiderInfoService;
|
import com.oying.modules.sh.domain.OrderOperationLog;
|
import com.oying.modules.sh.domain.vo.OrderResponse;
|
import com.oying.modules.sh.service.OrderOperationLogService;
|
import com.oying.modules.sh.service.OrderService;
|
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.service.RiderOrderRecordService;
|
import com.oying.modules.rider.domain.dto.RiderOrderRecordQueryCriteria;
|
import com.oying.modules.rider.mapper.RiderOrderRecordMapper;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.sql.Timestamp;
|
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;
|
|
/**
|
* @author pxb
|
* @description 服务实现
|
* @date 2025-07-01
|
**/
|
@Service
|
@RequiredArgsConstructor
|
public class RiderOrderRecordServiceImpl extends ServiceImpl<RiderOrderRecordMapper, RiderOrderRecord> implements RiderOrderRecordService {
|
|
private final RiderOrderRecordMapper riderOrderRecordMapper;
|
private final RedisUtils redisUtils;
|
private final OrderService orderService;
|
private final RiderInfoService riderInfoService;
|
private final StoreService storeService;
|
|
@Override
|
public PageResult<RiderOrderRecord> queryAll(RiderOrderRecordQueryCriteria criteria, Page<Object> page) {
|
return PageUtil.toPage(riderOrderRecordMapper.findAll(criteria, page));
|
}
|
|
@Override
|
public List<RiderOrderRecord> queryAll(RiderOrderRecordQueryCriteria criteria) {
|
return riderOrderRecordMapper.findAll(criteria);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void create(RiderOrderRecord resources) {
|
riderOrderRecordMapper.insert(resources);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void update(RiderOrderRecord resources) {
|
RiderOrderRecord riderOrderRecord = getById(resources.getRecordId());
|
riderOrderRecord.copy(resources);
|
riderOrderRecordMapper.updateById(riderOrderRecord);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void deleteAll(List<Long> ids) {
|
riderOrderRecordMapper.deleteBatchIds(ids);
|
}
|
|
@Override
|
public void download(List<RiderOrderRecord> all, HttpServletResponse response) throws IOException {
|
List<Map<String, Object>> list = new ArrayList<>();
|
for (RiderOrderRecord riderOrderRecord : all) {
|
Map<String, Object> map = new LinkedHashMap<>();
|
map.put("订单id", riderOrderRecord.getOrderId());
|
map.put("订单编号", riderOrderRecord.getOrderNum());
|
map.put("商家ID", riderOrderRecord.getMerchantId());
|
map.put("商家名称", riderOrderRecord.getMerchantName());
|
map.put("商家地址", riderOrderRecord.getMerchantAddress());
|
map.put("收货地址", riderOrderRecord.getReceiverAddress());
|
map.put("订单状态: 1-待取货 2-配送中 3-已完成 4-商家取消 5-骑手取消 6-客户取消 7-系统取消", riderOrderRecord.getOrderStatus());
|
map.put("接单时间", riderOrderRecord.getAcceptTime());
|
map.put("接单编号", riderOrderRecord.getAcceptNum());
|
map.put("完成/取消时间", riderOrderRecord.getFinishTime());
|
map.put("配送时长(秒)", riderOrderRecord.getDeliveryDuration());
|
map.put("是否超时:1-是 0-否", riderOrderRecord.getIsOvertime());
|
map.put("订单来源: 1-平台派单 2-骑手抢单 3-商家直派 4-其他", riderOrderRecord.getOrderSource());
|
map.put("订单收入配送费", riderOrderRecord.getOrderIncome());
|
map.put("创建人", riderOrderRecord.getCreateBy());
|
map.put("创建时间", riderOrderRecord.getCreateTime());
|
map.put("修改人", riderOrderRecord.getUpdateBy());
|
map.put("修改时间", riderOrderRecord.getUpdateTime());
|
list.add(map);
|
}
|
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, "订单已经被其他骑手接单,请稍后重试");
|
}
|
// 查询当前订单 检查订单是否已经被其他骑手抢到或取消 直接返回
|
OrderResponse orderResponse = orderService.getByOrderNum(orderNum);
|
// 商家已接单 商家已备货 这两个状态可以接单
|
if (orderResponse == null || orderResponse.getOrder().getOrderStatus() != 2 || orderResponse.getOrder().getOrderStatus() != 4) {
|
return R.fail(400, "订单已经被其他骑手接单或顾客取消,请稍后重试");
|
}
|
// 订单没有被接单或取消的情况下,进行接单操作
|
// 查询骑手信息
|
Long riderId = SecurityUtils.getCurrentUserId();
|
RiderInfo riderInfo = riderInfoService.getRiderSourceInfo(riderId);
|
// 查询商家信息
|
Store store = storeService.getById(orderResponse.getOrder().getStoreId());
|
// 1.新增骑手接单记录
|
addRiderOrderRecord(riderInfo, orderResponse, store);
|
// 2.新增订单接单流程信息
|
// 返回成功信息
|
return R.success(orderResponse, "接单成功");
|
} catch (Exception e) {
|
throw new BadRequestException("接单失败,请稍后重试");
|
} finally {
|
// 安全释放锁(仅释放自己持有的锁)
|
String currentClientId = (String) redisUtils.get(lockKey);
|
// 当前线程持有锁
|
if (StringUtils.equals(currentClientId, clientId)) {
|
// 释放锁
|
redisUtils.del(lockKey);
|
}
|
}
|
}
|
|
/**
|
* 功能描述: <添加接单记录>
|
*
|
* @Date: 2025/7/14 17:48
|
*/
|
public void addRiderOrderRecord(RiderInfo riderInfo, OrderResponse orderResponse, Store store) {
|
RiderOrderRecord riderOrderRecord = new RiderOrderRecord();
|
riderOrderRecord.setOrderId(orderResponse.getOrder().getOrderId());
|
riderOrderRecord.setOrderNum(orderResponse.getOrder().getOrderNum());
|
riderOrderRecord.setMerchantId(orderResponse.getOrder().getStoreId());
|
riderOrderRecord.setMerchantName(orderResponse.getOrder().getStoreName());
|
riderOrderRecord.setMerchantAddress(store.getAddress());
|
riderOrderRecord.setReceiverAddress(orderResponse.getAddress().getDetail());
|
// 当前为接单 设置为待取货状态 1-待取货 2-配送中 3-已完成 4-商家取消 5-骑手取消 6-客户取消 7-系统取消
|
riderOrderRecord.setOrderStatus("1");
|
riderOrderRecord.setAcceptTime(new Timestamp(System.currentTimeMillis()));
|
// 取单编号
|
riderOrderRecord.setAcceptNum(orderResponse.getOrder().getOrderStoreNum());
|
// 是否超时:1-是 0-否
|
riderOrderRecord.setIsOvertime("0");
|
// 订单来源: 1-平台派单 2-骑手抢单 3-商家直派 4-其他
|
riderOrderRecord.setOrderSource("3");
|
riderOrderRecord.setRiderId(riderInfo.getRiderId());
|
riderOrderRecord.setRiderName(riderInfo.getCardName());
|
riderOrderRecord.setPhone(riderInfo.getPhone());
|
riderOrderRecord.setUserId(orderResponse.getOrder().getUserId());
|
riderOrderRecord.setUserLongitude(String.valueOf(orderResponse.getAddress().getLongitude()));
|
riderOrderRecord.setUserLatitude(String.valueOf(orderResponse.getAddress().getLatitude()));
|
riderOrderRecord.setMerchantLongitude(String.valueOf(store.getLongitude()));
|
riderOrderRecord.setMerchantLatitude(String.valueOf(store.getLatitude()));
|
// 配送费详情Id
|
// riderOrderRecord.setDeliveryFeeId(orderResponse.getOrder().getDeliveryFeeId());
|
riderOrderRecord.setOrderIncome(orderResponse.getOrder().getSendPrice());
|
create(riderOrderRecord);
|
}
|
|
|
@Override
|
public R riderCancelOrder(String orderNum) {
|
// 查询当前订单信息
|
OrderResponse orderResponse = orderService.getByOrderNum(orderNum);
|
// 根据信息判断当前订单信息是否满足取消条件
|
// 满足取消订单
|
// 不满足取消订单条件,返回错误信息
|
// 取消订单后通知商家
|
return null;
|
}
|
|
|
}
|