|
|
|
@ -189,22 +189,24 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
} |
|
|
|
|
|
|
|
private Date calculateMustFinishTime(String regionId, String shopId, Integer deliveryType) { |
|
|
|
Integer deliveryTime = 1 == (deliveryType == null ? 0 : deliveryType) |
|
|
|
? AdminSeckillGroupController.getTotalDeliveryTimeByRegionIdAndShopId(redisTemplateHelper, regionId, shopId) |
|
|
|
: 40; |
|
|
|
Integer deliveryTime = getSchoolDeliveryTime(regionId, shopId, deliveryType); |
|
|
|
LocalDateTime futureTime = LocalDateTime.now().plusMinutes(deliveryTime); |
|
|
|
return Date.from(futureTime.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
} |
|
|
|
|
|
|
|
private Date calculateTransferMustFinishTime(String regionId, String shopId, Integer deliveryType) { |
|
|
|
Integer schoolDeliveryTime = 1 == (deliveryType == null ? 0 : deliveryType) |
|
|
|
? AdminSeckillGroupController.getTotalDeliveryTimeByRegionIdAndShopId(redisTemplateHelper, regionId, shopId) |
|
|
|
: 40; |
|
|
|
Integer schoolDeliveryTime = getSchoolDeliveryTime(regionId, shopId, deliveryType); |
|
|
|
int totalMinutes = safeMinutes(getTransferDeliveryDuration(regionId, shopId)) + safeMinutes(schoolDeliveryTime); |
|
|
|
LocalDateTime futureTime = LocalDateTime.now().plusMinutes(totalMinutes); |
|
|
|
return Date.from(futureTime.atZone(ZoneId.systemDefault()).toInstant()); |
|
|
|
} |
|
|
|
|
|
|
|
private Integer getSchoolDeliveryTime(String regionId, String shopId, Integer deliveryType) { |
|
|
|
return 1 == (deliveryType == null ? 0 : deliveryType) |
|
|
|
? AdminSeckillGroupController.getTotalDeliveryTimeByRegionIdAndShopId(redisTemplateHelper, regionId, shopId) |
|
|
|
: 40; |
|
|
|
} |
|
|
|
|
|
|
|
private Integer getTransferDeliveryDuration(String regionId, String shopId) { |
|
|
|
Shop shop = getShopFromCache(regionId, shopId); |
|
|
|
return shop == null || shop.getTransferDeliveryDuration() == null ? 0 : shop.getTransferDeliveryDuration(); |
|
|
|
@ -282,14 +284,20 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
mustFinishTime = calculateMustFinishTime(delivery.getRegionId(), delivery.getShopId(), delivery.getDeliveryType()); |
|
|
|
} |
|
|
|
Date acceptTime = new Date(); |
|
|
|
int transferArriveMinutes = 0; |
|
|
|
long transferDelayMillis = 0L; |
|
|
|
if (transferDelivery) { |
|
|
|
transferArriveMinutes = safeMinutes(getCookingTime(delivery.getRegionId(), delivery.getShopId())) |
|
|
|
+ safeMinutes(getTransferDeliveryDuration(delivery.getRegionId(), delivery.getShopId())); |
|
|
|
String transferName = StringUtils.defaultIfBlank(delivery.getTransferAddressName(), |
|
|
|
order == null ? "" : StringUtils.defaultString(order.getTransferAddressName())); |
|
|
|
LocalDateTime transferArriveTime = LocalDateTime.ofInstant(acceptTime.toInstant(), ZoneId.systemDefault()) |
|
|
|
.plusMinutes(transferArriveMinutes); |
|
|
|
LocalDateTime transferArriveTime = calculateTransferArriveTime( |
|
|
|
delivery.getRegionId(), |
|
|
|
delivery.getShopId(), |
|
|
|
delivery.getDeliveryType(), |
|
|
|
mustFinishTime, |
|
|
|
appointmentDelivery, |
|
|
|
acceptTime |
|
|
|
); |
|
|
|
transferDelayMillis = Math.max(60 * 1000L, |
|
|
|
Date.from(transferArriveTime.atZone(ZoneId.systemDefault()).toInstant()).getTime() - acceptTime.getTime()); |
|
|
|
String timeText = String.format("%02d:%02d", transferArriveTime.getHour(), transferArriveTime.getMinute()); |
|
|
|
delivery.setShopAddress("商家预计" + timeText + "配送到-" + transferName); |
|
|
|
} |
|
|
|
@ -439,9 +447,12 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
this.update(uw); |
|
|
|
|
|
|
|
// 出餐超时提醒只依赖本次接单成功的配送单,不依赖订单状态更新分支是否命中。
|
|
|
|
triggerShopCookTimeoutEvent(cookTimeoutOrderIds, order); |
|
|
|
if (appointmentDelivery) { |
|
|
|
triggerAppointmentShopCookEvent(cookTimeoutOrderIds, order, delivery); |
|
|
|
} else { |
|
|
|
triggerShopCookTimeoutEvent(cookTimeoutOrderIds, order); |
|
|
|
} |
|
|
|
if (transferDelivery && StringUtils.isNotBlank(delivery.getOrderId())) { |
|
|
|
long transferDelayMillis = Math.max(1, transferArriveMinutes) * 60 * 1000L; |
|
|
|
orderAsyncProducer.sendDelayMessage(delivery.getOrderId(), "Transfer_Arrive_Timeout", transferDelayMillis); |
|
|
|
} |
|
|
|
|
|
|
|
@ -474,6 +485,16 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
return String.format("%04d", new Random().nextInt(10000)); |
|
|
|
} |
|
|
|
|
|
|
|
private LocalDateTime calculateTransferArriveTime(String regionId, String shopId, Integer deliveryType, |
|
|
|
Date mustFinishTime, boolean appointmentDelivery, Date acceptTime) { |
|
|
|
if (appointmentDelivery && mustFinishTime != null) { |
|
|
|
return LocalDateTime.ofInstant(mustFinishTime.toInstant(), ZoneId.systemDefault()) |
|
|
|
.minusMinutes(safeMinutes(getSchoolDeliveryTime(regionId, shopId, deliveryType))); |
|
|
|
} |
|
|
|
return LocalDateTime.ofInstant(acceptTime.toInstant(), ZoneId.systemDefault()) |
|
|
|
.plusMinutes(safeMinutes(getCookingTime(regionId, shopId)) + safeMinutes(getTransferDeliveryDuration(regionId, shopId))); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 构建返回 VO |
|
|
|
*/ |
|
|
|
@ -534,6 +555,26 @@ public class MallDeliveryOrderServiceImpl extends ServiceImpl<MallDeliveryOrderM |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void triggerAppointmentShopCookEvent(List<String> orderIds, MallOrder knownOrder, MallDeliveryOrder delivery) { |
|
|
|
if (orderIds == null || orderIds.isEmpty() || delivery == null || delivery.getMustFinishTime() == null) { |
|
|
|
return; |
|
|
|
} |
|
|
|
String regionId = StringUtils.defaultIfBlank(delivery.getRegionId(), knownOrder == null ? null : knownOrder.getRegionId()); |
|
|
|
String shopId = StringUtils.defaultIfBlank(delivery.getShopId(), knownOrder == null ? null : knownOrder.getShopId()); |
|
|
|
boolean transferDelivery = Integer.valueOf(1).equals(delivery.getTransferDelivery()) |
|
|
|
|| (knownOrder != null && Integer.valueOf(1).equals(knownOrder.getTransferDelivery())); |
|
|
|
int deliveryMinutes = safeMinutes(getSchoolDeliveryTime(regionId, shopId, delivery.getDeliveryType())); |
|
|
|
if (transferDelivery) { |
|
|
|
deliveryMinutes += safeMinutes(getTransferDeliveryDuration(regionId, shopId)); |
|
|
|
} |
|
|
|
int cookMinutes = safeMinutes(getCookingTime(regionId, shopId)); |
|
|
|
long notifyTimeMillis = delivery.getMustFinishTime().getTime() - (long) (deliveryMinutes + cookMinutes) * 60 * 1000L; |
|
|
|
long delayMillis = Math.max(1000L, notifyTimeMillis - System.currentTimeMillis()); |
|
|
|
for (String id : orderIds) { |
|
|
|
orderAsyncProducer.sendDelayMessage(id, "Appointment_Shop_Cook_Notify", delayMillis); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 配送员取货(状态:待取货 -> 配送中) |
|
|
|
*/ |
|
|
|
|