|
|
|
@ -1,5 +1,6 @@ |
|
|
|
package cc.hiver.mall.serviceimpl.mybatis; |
|
|
|
|
|
|
|
import cc.hiver.core.common.constant.DealingsRecordConstant; |
|
|
|
import cc.hiver.core.common.constant.SettingConstant; |
|
|
|
import cc.hiver.core.common.sms.SmsUtil; |
|
|
|
import cc.hiver.core.entity.Worker; |
|
|
|
@ -14,10 +15,7 @@ import cc.hiver.mall.pojo.vo.MallOrderVO; |
|
|
|
import cc.hiver.mall.pojo.vo.WorkerRedisVo; |
|
|
|
import cc.hiver.mall.service.CommentService; |
|
|
|
import cc.hiver.mall.service.ShopService; |
|
|
|
import cc.hiver.mall.service.mybatis.MallDeliveryOrderService; |
|
|
|
import cc.hiver.mall.service.mybatis.MallOrderService; |
|
|
|
import cc.hiver.mall.service.mybatis.MallRefundRecordService; |
|
|
|
import cc.hiver.mall.service.mybatis.MallUserCouponService; |
|
|
|
import cc.hiver.mall.service.mybatis.*; |
|
|
|
import cc.hiver.mall.utils.*; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
|
|
|
@ -28,12 +26,12 @@ import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.context.annotation.Lazy; |
|
|
|
import org.springframework.data.redis.core.StringRedisTemplate; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.sql.Timestamp; |
|
|
|
import java.text.DecimalFormat; |
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.time.ZoneId; |
|
|
|
@ -69,6 +67,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
@Autowired |
|
|
|
JPushServiceImpl jPushService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private DealingsRecordService dealingsRecordService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private OrderAsyncProducer orderAsyncProducer; |
|
|
|
|
|
|
|
@ -78,6 +79,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
@Autowired |
|
|
|
private ShopTakeawayMapper shopTakeawayMapper; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private FreeOrderCacheUtil freeOrderCacheUtil; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private DeliveryRejectUtil deliveryRejectUtil; |
|
|
|
|
|
|
|
@ -105,6 +109,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
@Autowired |
|
|
|
private WaitOrderCacheUtil waitOrderCacheUtil; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private RedisLuaScripts redisLuaScripts; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private ShopIndexCountCacheUtil shopIndexCountCacheUtil; |
|
|
|
|
|
|
|
@ -126,6 +133,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
@Autowired |
|
|
|
private MallUserCouponService mallUserCouponService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private StringRedisTemplate stringRedisTemplate; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private RefundOrderCacheUtil refundOrderCacheUtil; |
|
|
|
|
|
|
|
@ -165,153 +175,174 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public Integer workerAccept(String workerPhone, String deliveryId, String workerId,String workerName, String groupId) { |
|
|
|
public Integer workerAccept(String workerPhone, String deliveryId, String workerId, String workerName, String groupId) { |
|
|
|
Worker worker = workerServiceImpl.findByWorkerId(workerId); |
|
|
|
if(worker != null && worker.getWorkerStatus() == 3){ |
|
|
|
if (worker != null && worker.getWorkerStatus() == 3) { |
|
|
|
return 5; |
|
|
|
} |
|
|
|
MallDeliveryOrder delivery = this.getById(deliveryId); |
|
|
|
if (delivery == null) return 0;//throw new RuntimeException("配送单不存在");
|
|
|
|
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) return 1;//throw new RuntimeException("配送单已被接取或已取消");
|
|
|
|
if (delivery == null) return 0; |
|
|
|
if (delivery.getStatus() != STATUS_WAIT_ACCEPT) return 1; |
|
|
|
|
|
|
|
// 指派单校验
|
|
|
|
if (StringUtils.isNotBlank(delivery.getWorkerId()) && !delivery.getWorkerId().equals(workerId)) { |
|
|
|
return 2;//throw new RuntimeException("该单已指定其他配送员,无法抢单");
|
|
|
|
return 2; |
|
|
|
} |
|
|
|
|
|
|
|
List<String> orderIdsSend = new ArrayList<>(); |
|
|
|
// 更新配送单
|
|
|
|
Date createTime = new Timestamp(System.currentTimeMillis()); |
|
|
|
// 1. 获取当前时间 (LocalDateTime)
|
|
|
|
// 计算必须完成时间
|
|
|
|
LocalDateTime now = LocalDateTime.now(); |
|
|
|
// 2. 加40分钟
|
|
|
|
LocalDateTime futureTime = now.plusMinutes(40); |
|
|
|
// 3. 如果需要转回 java.util.Date (为了兼容旧代码)
|
|
|
|
Date mustFinishTime = Date.from(futureTime.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
Date mustFinishTime = Date.from(now.plusMinutes(40).atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
Date acceptTime = new Date(); |
|
|
|
|
|
|
|
// 预先更新 delivery 对象字段(后续 buildVO 和缓存复用同一对象)
|
|
|
|
delivery.setWorkerPhone(workerPhone); |
|
|
|
delivery.setStatus(STATUS_WAIT_PICKUP); |
|
|
|
delivery.setWorkerId(workerId); |
|
|
|
delivery.setWorkerName(workerName); |
|
|
|
delivery.setAcceptTime(acceptTime); |
|
|
|
delivery.setMustFinishTime(mustFinishTime); |
|
|
|
|
|
|
|
LambdaUpdateWrapper<MallDeliveryOrder> uw = new LambdaUpdateWrapper<>(); |
|
|
|
uw.eq(MallDeliveryOrder::getId, deliveryId) |
|
|
|
.set(MallDeliveryOrder::getStatus, STATUS_WAIT_PICKUP) |
|
|
|
.set(MallDeliveryOrder::getWorkerId, workerId).set(MallDeliveryOrder::getWorkerName, workerName).set(MallDeliveryOrder::getWorkerPhone, workerPhone) |
|
|
|
.set(MallDeliveryOrder::getAcceptTime, new Date()) |
|
|
|
.set(MallDeliveryOrder::getMustFinishTime, mustFinishTime); |
|
|
|
.set(MallDeliveryOrder::getWorkerId, workerId) |
|
|
|
.set(MallDeliveryOrder::getWorkerName, workerName) |
|
|
|
.set(MallDeliveryOrder::getWorkerPhone, workerPhone) |
|
|
|
.set(MallDeliveryOrder::getAcceptTime, acceptTime) |
|
|
|
.set(MallDeliveryOrder::getMustFinishTime, mustFinishTime); |
|
|
|
|
|
|
|
MallOrder order = mallOrderService.getById(delivery.getOrderId()); |
|
|
|
|
|
|
|
String numberCode = ""; |
|
|
|
List<MallOrderGoods> goodsList = new ArrayList<>(); |
|
|
|
//需要查询该group的所有关联订单,如果是面对面拼团需要更新订单序号
|
|
|
|
if(delivery.getGroupId() != null){ |
|
|
|
// 提前查好 Shop,避免重复查询(后续推送复用)
|
|
|
|
Shop cachedShop = null; |
|
|
|
String pushClientId = null; |
|
|
|
if (order != null && StringUtils.isNotBlank(order.getShopId())) { |
|
|
|
cachedShop = shopService.findById(order.getShopId()); |
|
|
|
pushClientId = cachedShop != null ? cachedShop.getClientId() : null; |
|
|
|
} |
|
|
|
// 推送 orderId 列表,待事务提交后异步推送
|
|
|
|
List<String> pushOrderIds = new ArrayList<>(); |
|
|
|
|
|
|
|
if (delivery.getGroupId() != null) { |
|
|
|
// ---- 有 groupId ----
|
|
|
|
LambdaQueryWrapper<MallOrderGroup> gq = new LambdaQueryWrapper<>(); |
|
|
|
gq.eq(MallOrderGroup::getId, delivery.getGroupId()); |
|
|
|
MallOrderGroup group = mallOrderGroupMapper.selectOne(gq); |
|
|
|
if(group.getIsFace() == 1){ |
|
|
|
|
|
|
|
if (group.getIsFace() == 1) { |
|
|
|
// ---- 面对面拼团 ----
|
|
|
|
List<String> orderIds = Arrays.asList(group.getGroupOrderIds().split(",")); |
|
|
|
orderIdsSend = orderIds; |
|
|
|
|
|
|
|
// 2. 一次 IN 查询所有商品明细
|
|
|
|
// 一次批量查询所有商品明细
|
|
|
|
goodsList = mallOrderGoodsMapper.selectByOrderIds(orderIds); |
|
|
|
|
|
|
|
// 批量查询所有子订单,避免循环内 N+1
|
|
|
|
List<MallOrder> orderInnerList = mallOrderService.listByIds(orderIds); |
|
|
|
Map<String, MallOrder> orderInnerMap = new HashMap<>(orderInnerList.size()); |
|
|
|
for (MallOrder o : orderInnerList) { |
|
|
|
orderInnerMap.put(o.getId(), o); |
|
|
|
} |
|
|
|
|
|
|
|
// 收集需要更新的订单 id,批量 UPDATE
|
|
|
|
List<String> toUpdateOrderIds = new ArrayList<>(); |
|
|
|
Map<String, String> orderSeqMap = new HashMap<>(); |
|
|
|
StringBuilder numberCodeBuilder = new StringBuilder(); |
|
|
|
for (String orderId : orderIds) { |
|
|
|
MallOrder orderInner = mallOrderService.getById(orderId); |
|
|
|
MallOrder orderInner = orderInnerMap.get(orderId); |
|
|
|
if (orderInner != null && orderInner.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { |
|
|
|
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1); |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, orderId) |
|
|
|
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); |
|
|
|
mallOrderService.update(oUw); |
|
|
|
//更新缓存
|
|
|
|
delivery.setWorkerPhone(workerPhone); |
|
|
|
delivery.setStatus(STATUS_WAIT_PICKUP); |
|
|
|
delivery.setWorkerId(workerId); |
|
|
|
delivery.setWorkerName(workerName); |
|
|
|
delivery.setAcceptTime(new Date()); |
|
|
|
delivery.setMustFinishTime(mustFinishTime); |
|
|
|
toUpdateOrderIds.add(orderId); |
|
|
|
orderSeqMap.put(orderId, latestSeq); |
|
|
|
numberCodeBuilder.append(latestSeq).append("+"); |
|
|
|
// 更新用户缓存
|
|
|
|
MallOrderVO orderVO = buildVO(orderInner, null, null, delivery); |
|
|
|
orderVO.setStatus(3); |
|
|
|
userPendingOrderCacheUtil.update(orderInner.getUserId(), orderVO); |
|
|
|
//极光推送
|
|
|
|
if(StringUtils.isNotBlank(order.getShopId())){ |
|
|
|
Shop shop = shopService.findById(order.getShopId()); |
|
|
|
jPushService.sendPushNotification(shop.getClientId(), "您有一笔新的订单",orderId); |
|
|
|
} |
|
|
|
numberCode+=latestSeq+"+"; |
|
|
|
// 收集推送 orderId
|
|
|
|
pushOrderIds.add(orderId); |
|
|
|
} |
|
|
|
} |
|
|
|
}else{ |
|
|
|
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
|
|
|
|
if (StringUtils.isNotBlank(delivery.getOrderId())) { |
|
|
|
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { |
|
|
|
orderIdsSend.add(delivery.getOrderId()); |
|
|
|
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1); |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, delivery.getOrderId()) |
|
|
|
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); // 待取货
|
|
|
|
//缺少根据groupId更新面对面团所有订单状态
|
|
|
|
mallOrderService.update(oUw); |
|
|
|
//更新缓存
|
|
|
|
delivery.setWorkerPhone(workerPhone); |
|
|
|
delivery.setStatus(STATUS_WAIT_PICKUP); |
|
|
|
delivery.setWorkerId(workerId); |
|
|
|
delivery.setWorkerName(workerName); |
|
|
|
delivery.setAcceptTime(new Date()); |
|
|
|
delivery.setMustFinishTime(mustFinishTime); |
|
|
|
MallOrderVO orderVO = buildVO(order, null, null, delivery); |
|
|
|
orderVO.setStatus(3); |
|
|
|
userPendingOrderCacheUtil.update(order.getUserId(), orderVO); |
|
|
|
|
|
|
|
//极光推送
|
|
|
|
if(StringUtils.isNotBlank(order.getShopId())){ |
|
|
|
Shop shop = shopService.findById(order.getShopId()); |
|
|
|
jPushService.sendPushNotification(shop.getClientId(), "您有一笔新的订单",delivery.getOrderId()); |
|
|
|
} |
|
|
|
numberCode = latestSeq; |
|
|
|
|
|
|
|
goodsList = mallOrderGoodsMapper.selectByOrderId(delivery.getOrderId()); |
|
|
|
} |
|
|
|
// 逐条 UPDATE(各订单 numberCode 不同,无法单条 IN 批量更新 numberCode)
|
|
|
|
for (String orderId : toUpdateOrderIds) { |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, orderId) |
|
|
|
.set(MallOrder::getNumberCode, orderSeqMap.get(orderId)) |
|
|
|
.set(MallOrder::getStatus, 3); |
|
|
|
mallOrderService.update(oUw); |
|
|
|
} |
|
|
|
} |
|
|
|
}else{ |
|
|
|
// 同步更新关联订单状态:待配送员接单 -> 配送中(或待取货)
|
|
|
|
if (StringUtils.isNotBlank(delivery.getOrderId())) { |
|
|
|
if (order != null && order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { |
|
|
|
numberCode = numberCodeBuilder.toString(); |
|
|
|
|
|
|
|
} else { |
|
|
|
// ---- 非面对面拼团(有 groupId 但 isFace != 1)----
|
|
|
|
if (StringUtils.isNotBlank(delivery.getOrderId()) && order != null |
|
|
|
&& order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { |
|
|
|
orderIdsSend.add(delivery.getOrderId()); |
|
|
|
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1); |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, delivery.getOrderId()) |
|
|
|
.set(MallOrder::getNumberCode, latestSeq).set(MallOrder::getStatus, 3); // 待取货
|
|
|
|
//缺少根据groupId更新面对面团所有订单状态
|
|
|
|
.set(MallOrder::getNumberCode, latestSeq) |
|
|
|
.set(MallOrder::getStatus, 3); |
|
|
|
mallOrderService.update(oUw); |
|
|
|
//更新缓存
|
|
|
|
delivery.setWorkerPhone(workerPhone); |
|
|
|
delivery.setStatus(STATUS_WAIT_PICKUP); |
|
|
|
delivery.setWorkerId(workerId); |
|
|
|
delivery.setWorkerName(workerName); |
|
|
|
delivery.setAcceptTime(new Date()); |
|
|
|
delivery.setMustFinishTime(mustFinishTime); |
|
|
|
MallOrderVO orderVO = buildVO(order, null, null, delivery); |
|
|
|
orderVO.setStatus(3); |
|
|
|
userPendingOrderCacheUtil.update(order.getUserId(), orderVO); |
|
|
|
//极光推送
|
|
|
|
if(StringUtils.isNotBlank(order.getShopId())){ |
|
|
|
Shop shop = shopService.findById(order.getShopId()); |
|
|
|
jPushService.sendPushNotification(shop.getClientId(), "您有一笔新的订单",delivery.getOrderId()); |
|
|
|
} |
|
|
|
pushOrderIds.add(delivery.getOrderId()); |
|
|
|
numberCode = latestSeq; |
|
|
|
//商品明细
|
|
|
|
goodsList = mallOrderGoodsMapper.selectByOrderId(delivery.getOrderId()); |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
// ---- 无 groupId(普通单)----
|
|
|
|
if (StringUtils.isNotBlank(delivery.getOrderId()) && order != null |
|
|
|
&& order.getStatus() == ORDER_STATUS_WAIT_DELIVERY) { |
|
|
|
orderIdsSend.add(delivery.getOrderId()); |
|
|
|
String latestSeq = merchantOrderSeqUtil.generateOrderSequence(order.getShopId(), 1); |
|
|
|
LambdaUpdateWrapper<MallOrder> oUw = new LambdaUpdateWrapper<>(); |
|
|
|
oUw.eq(MallOrder::getId, delivery.getOrderId()) |
|
|
|
.set(MallOrder::getNumberCode, latestSeq) |
|
|
|
.set(MallOrder::getStatus, 3); |
|
|
|
mallOrderService.update(oUw); |
|
|
|
MallOrderVO orderVO = buildVO(order, null, null, delivery); |
|
|
|
orderVO.setStatus(3); |
|
|
|
userPendingOrderCacheUtil.update(order.getUserId(), orderVO); |
|
|
|
pushOrderIds.add(delivery.getOrderId()); |
|
|
|
numberCode = latestSeq; |
|
|
|
goodsList = mallOrderGoodsMapper.selectByOrderId(delivery.getOrderId()); |
|
|
|
} |
|
|
|
} |
|
|
|
//更新订单编号
|
|
|
|
|
|
|
|
// 更新配送单(含订单编号)
|
|
|
|
uw.set(MallDeliveryOrder::getNumberCode, numberCode); |
|
|
|
this.update(uw); |
|
|
|
//触发商家出餐超时提醒
|
|
|
|
triggerShopCookTimeoutEvent(orderIdsSend); |
|
|
|
//放进缓存
|
|
|
|
|
|
|
|
// 触发商家出餐超时提醒(传入已有订单,避免重复查 DB)
|
|
|
|
triggerShopCookTimeoutEvent(orderIdsSend, order); |
|
|
|
|
|
|
|
// 放进配送员缓存
|
|
|
|
delivery.setGoodsList(goodsList); |
|
|
|
delivery.setNumberCode(numberCode); |
|
|
|
workerOrderCacheUtil.put(workerId, delivery); |
|
|
|
//抢单大厅缓存去掉
|
|
|
|
|
|
|
|
// 抢单大厅缓存去掉
|
|
|
|
waitOrderCacheUtil.remove(delivery.getRegionId(), delivery.getId()); |
|
|
|
|
|
|
|
// 极光推送:异步执行,不阻塞主事务(clientId 已在上方查好)
|
|
|
|
final String finalPushClientId = pushClientId; |
|
|
|
if (StringUtils.isNotBlank(finalPushClientId) && !pushOrderIds.isEmpty()) { |
|
|
|
String firstOrderId = pushOrderIds.get(0); |
|
|
|
new Thread(() -> { |
|
|
|
try { |
|
|
|
jPushService.sendPushNotification(finalPushClientId, "您有一笔新的订单", firstOrderId); |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("极光推送失败, orderId={}, err={}", firstOrderId, e.getMessage()); |
|
|
|
} |
|
|
|
}).start(); |
|
|
|
} |
|
|
|
|
|
|
|
log.info("配送员 {} 接单成功,deliveryId={}", workerId, deliveryId); |
|
|
|
return 3; |
|
|
|
} |
|
|
|
@ -329,25 +360,53 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
return vo; |
|
|
|
} |
|
|
|
|
|
|
|
//设置商家出餐超时提醒
|
|
|
|
//设置商家出餐超时提醒(原始版,供其他调用方使用)
|
|
|
|
private void triggerShopCookTimeoutEvent(List<String> orderId) { |
|
|
|
orderId.forEach(id -> { |
|
|
|
MallOrder order = mallOrderService.getById(id); |
|
|
|
if (order != null) { |
|
|
|
long cookTimeMins = 10; // default
|
|
|
|
triggerShopCookTimeoutEvent(orderId, null); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 设置商家出餐超时提醒 |
|
|
|
* @param orderIds 需要触发的订单 ID 列表 |
|
|
|
* @param knownOrder 若调用方已持有该 shopId 对应的订单对象,可直接传入以复用,避免重复查 DB;传 null 时自行查询 |
|
|
|
*/ |
|
|
|
private void triggerShopCookTimeoutEvent(List<String> orderIds, MallOrder knownOrder) { |
|
|
|
if (orderIds == null || orderIds.isEmpty()) return; |
|
|
|
// 若调用方已知 shopId,仅查一次 ShopTakeaway
|
|
|
|
String knownShopId = knownOrder != null ? knownOrder.getShopId() : null; |
|
|
|
Long sharedCookTimeMins = null; |
|
|
|
if (StringUtils.isNotBlank(knownShopId)) { |
|
|
|
try { |
|
|
|
LambdaQueryWrapper<ShopTakeaway> qw = new LambdaQueryWrapper<>(); |
|
|
|
qw.eq(ShopTakeaway::getShopId, knownShopId); |
|
|
|
ShopTakeaway shopTakeaway = shopTakeawayMapper.selectOne(qw); |
|
|
|
sharedCookTimeMins = shopTakeaway != null ? shopTakeaway.getCookingTime() : 10L; |
|
|
|
} catch (Exception e) { |
|
|
|
log.error("获取 ShopTakeaway cookingTime 异常: {}", e.getMessage()); |
|
|
|
sharedCookTimeMins = 10L; |
|
|
|
} |
|
|
|
} |
|
|
|
for (String id : orderIds) { |
|
|
|
long cookTimeMins = 10L; |
|
|
|
if (sharedCookTimeMins != null) { |
|
|
|
// 所有订单同属一个商家,直接复用已查好的数值
|
|
|
|
cookTimeMins = sharedCookTimeMins; |
|
|
|
} else { |
|
|
|
// 无法复用:逐条查订单 + ShopTakeaway(兼容外部调用)
|
|
|
|
try { |
|
|
|
LambdaQueryWrapper<ShopTakeaway> qw = new LambdaQueryWrapper<>(); |
|
|
|
qw.eq(ShopTakeaway::getShopId, order.getShopId()); |
|
|
|
ShopTakeaway shopTakeaway = shopTakeawayMapper.selectOne(qw); |
|
|
|
if (shopTakeaway != null) { |
|
|
|
cookTimeMins = shopTakeaway.getCookingTime(); |
|
|
|
MallOrder o = mallOrderService.getById(id); |
|
|
|
if (o != null && StringUtils.isNotBlank(o.getShopId())) { |
|
|
|
LambdaQueryWrapper<ShopTakeaway> qw = new LambdaQueryWrapper<>(); |
|
|
|
qw.eq(ShopTakeaway::getShopId, o.getShopId()); |
|
|
|
ShopTakeaway shopTakeaway = shopTakeawayMapper.selectOne(qw); |
|
|
|
if (shopTakeaway != null) cookTimeMins = shopTakeaway.getCookingTime(); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
log.error("获取 ShopTakeaway cookingTime 异常: {}", e.getMessage()); |
|
|
|
} |
|
|
|
orderAsyncProducer.sendDelayMessage(id, "Shop_Cook_Timeout", cookTimeMins * 60 * 1000L); |
|
|
|
} |
|
|
|
}); |
|
|
|
orderAsyncProducer.sendDelayMessage(id, "Shop_Cook_Timeout", cookTimeMins * 60 * 1000L); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@ -436,6 +495,8 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
.set(MallDeliveryOrder::getFinishTime, new Date()); |
|
|
|
this.update(uw); |
|
|
|
|
|
|
|
Boolean isFantuan = true; |
|
|
|
|
|
|
|
//如果是有groupId证明是面对面配送,需要更新所有子订单状态为完成
|
|
|
|
if(StringUtils.isNotBlank(delivery.getGroupId())){ |
|
|
|
MallOrderGroup group = mallOrderGroupMapper.selectById(delivery.getGroupId()); |
|
|
|
@ -465,6 +526,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
MallOrder orderInner = mallOrderService.getById(delivery.getOrderId()); |
|
|
|
userPendingOrderCacheUtil.remove(orderInner.getUserId(),orderInner.getId()); |
|
|
|
|
|
|
|
if(orderInner.getOtherOrder() != null){ |
|
|
|
isFantuan = false; |
|
|
|
} |
|
|
|
//优惠券变成已使用
|
|
|
|
mallUserCouponService.useCoupon(delivery.getOrderId()); |
|
|
|
} |
|
|
|
@ -496,6 +560,17 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
String formattedResult = df.format(newAvgTime); |
|
|
|
worker.setAvgTime(new BigDecimal(formattedResult)); |
|
|
|
workerServiceImpl.update(worker); |
|
|
|
//增加余额变动记录
|
|
|
|
DealingsRecord dealingsRecord = new DealingsRecord(); |
|
|
|
dealingsRecord.setDealingsWay(DealingsRecordConstant.TYPE_REMARK[0]); |
|
|
|
dealingsRecord.setAmount(delivery.getDeliveryFee()); |
|
|
|
dealingsRecord.setDealingsTime(new Date()); |
|
|
|
dealingsRecord.setLinkId(deliveryId); |
|
|
|
dealingsRecord.setLinkUserId(worker.getWorkerId()); |
|
|
|
dealingsRecord.setLinkType(DealingsRecordConstant.TYPE[1]); |
|
|
|
dealingsRecord.setDealingsType(DealingsRecordConstant.DEALINGS_TYPE[0]); |
|
|
|
dealingsRecord.setCreateBy(worker.getWorkerId()); |
|
|
|
dealingsRecordService.save(dealingsRecord); |
|
|
|
//更新缓存
|
|
|
|
workerOrderCacheUtil.remove(workerId,deliveryId); |
|
|
|
//更新缓存
|
|
|
|
@ -504,6 +579,16 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
workerRedisVo.setWorker(worker); |
|
|
|
workerRedisCacheUtil.update(worker.getRegion(), workerRedisVo); |
|
|
|
} |
|
|
|
//是否开启了免单活动
|
|
|
|
if(isFantuan){ |
|
|
|
if(freeOrderCacheUtil.exists(delivery.getRegionId())){ |
|
|
|
stringRedisTemplate.execute( |
|
|
|
redisLuaScripts.getIncrementScript(), |
|
|
|
Arrays.asList("free_order:count", "free_order:flag"), // 两个 key:计数器和免单开关
|
|
|
|
String.valueOf(freeOrderCacheUtil.get(delivery.getRegionId()).getOrderNumber())// N = 100
|
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
@ -647,6 +732,11 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
return this.count(query); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Worker> countOrdersLimit(String regionId) { |
|
|
|
return this.baseMapper.countOrdersLimit(regionId); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Map<Integer, Integer>> countOrdersByType(String regionId) { |
|
|
|
return this.baseMapper.countOrdersByType(regionId); |
|
|
|
@ -720,6 +810,78 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
return returnList; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<Map<String, Object>> countOrdersByStatus1(String workerId,String regionId) { |
|
|
|
List<Map<String, Object>> returnList = new ArrayList<>(); |
|
|
|
// ---- 从订单缓存获取该配送员的待完成订单,统计各状态数量 ----
|
|
|
|
List<MallDeliveryOrder> workerOrders = workerOrderCacheUtil.getAllAsList(workerId); |
|
|
|
if(workerOrders != null){ |
|
|
|
int orderWaitCount = waitOrderCacheUtil.getAllByWorkerId(workerId,regionId); // status=0 待接单
|
|
|
|
int orderGetCount = 0; // status=1 待取货
|
|
|
|
int orderPutCount = 0; // status=2 待送达
|
|
|
|
|
|
|
|
for (MallDeliveryOrder order : workerOrders) { |
|
|
|
if (order.getStatus() == null) continue; |
|
|
|
else if (order.getStatus() == 1) orderGetCount++; |
|
|
|
else if (order.getStatus() == 2) orderPutCount++; |
|
|
|
} |
|
|
|
Map<String, Object> newRecord = new HashMap<>(); |
|
|
|
newRecord.put("status", 0); // 状态
|
|
|
|
newRecord.put("orderCount", orderWaitCount); |
|
|
|
returnList.add(newRecord); |
|
|
|
|
|
|
|
Map<String, Object> newRecord1 = new HashMap<>(); |
|
|
|
newRecord1.put("status", 1); // 状态
|
|
|
|
newRecord1.put("orderCount", orderGetCount); |
|
|
|
returnList.add(newRecord1); |
|
|
|
|
|
|
|
Map<String, Object> newRecord2 = new HashMap<>(); |
|
|
|
newRecord2.put("status", 2); // 状态
|
|
|
|
newRecord2.put("orderCount", orderPutCount); |
|
|
|
returnList.add(newRecord2); |
|
|
|
}else{ |
|
|
|
returnList = this.baseMapper.countOrdersByStatus(workerId); |
|
|
|
} |
|
|
|
|
|
|
|
Integer pendingBadReviewCount = 0; |
|
|
|
List<MallRefundRecord> all = refundOrderCacheUtil.getAll(workerId); |
|
|
|
if(all != null){ |
|
|
|
pendingBadReviewCount = all.size(); |
|
|
|
}else{ |
|
|
|
//查待售后待退款数
|
|
|
|
MallRefundRecordPageQuery q = new MallRefundRecordPageQuery(); |
|
|
|
q.setPageSize(PAGE_SIZE); |
|
|
|
IPage<MallRefundRecord> page = new Page<>(q.getPageNum(), q.getPageSize()); |
|
|
|
q.setLinkId(workerId); |
|
|
|
List<Integer> statusList = new ArrayList<>(); |
|
|
|
statusList.add(STATUS_WAIT_ACCEPT); |
|
|
|
statusList.add(STATUS_DONE); |
|
|
|
q.setStatusList(statusList); |
|
|
|
IPage<MallRefundRecord> result = mallRefundRecordService.selectPageVO(q); |
|
|
|
if(result != null && !result.getRecords().isEmpty()){ |
|
|
|
pendingBadReviewCount = result.getRecords().size(); |
|
|
|
} |
|
|
|
} |
|
|
|
Map<String, Object> newRecord = new HashMap<>(); |
|
|
|
newRecord.put("status", STATUS_DONE); // 状态
|
|
|
|
newRecord.put("orderCount", pendingBadReviewCount); |
|
|
|
returnList.add(newRecord); |
|
|
|
|
|
|
|
Integer pendingBadReviewCount1 = 0; |
|
|
|
List<Comment> all1 = commentCacheUtil.getAll(workerId); |
|
|
|
if(all1 != null){ |
|
|
|
pendingBadReviewCount1 += all1.size(); |
|
|
|
}else{ |
|
|
|
//查询待回复差评
|
|
|
|
pendingBadReviewCount1 += mallOrderMapper.selectPendingBadReviewCount(workerId); |
|
|
|
} |
|
|
|
Map<String, Object> newRecord1 = new HashMap<>(); |
|
|
|
newRecord1.put("status", 4); // 状态
|
|
|
|
newRecord1.put("orderCount", pendingBadReviewCount1); |
|
|
|
returnList.add(newRecord1); |
|
|
|
return returnList; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 用户增加配送费(在现有 deliveryFee 基础上追加) |
|
|
|
*/ |
|
|
|
@ -837,4 +999,9 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
public List<MallDeliveryOrder> selectByOrderIds(List<String> ids) { |
|
|
|
return this.baseMapper.selectByOrderIds(ids); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public HashMap<String, Object> countOrdersWorkerIndex(String workerId) { |
|
|
|
return this.baseMapper.countOrdersWorkerIndex(workerId); |
|
|
|
} |
|
|
|
} |
|
|
|
|