|
@@ -2,15 +2,19 @@ package com.ruoyi.app.unifiedorder;
|
|
|
|
|
|
|
|
import com.alibaba.fastjson2.JSONArray;
|
|
import com.alibaba.fastjson2.JSONArray;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
+import com.ruoyi.app.flashdelivery.service.FlashDeliveryUserCardStops;
|
|
|
import com.ruoyi.app.unifiedorder.dto.UnifiedOrderListItem;
|
|
import com.ruoyi.app.unifiedorder.dto.UnifiedOrderListItem;
|
|
|
import com.ruoyi.app.unifiedorder.dto.UnifiedOrderPageView;
|
|
import com.ruoyi.app.unifiedorder.dto.UnifiedOrderPageView;
|
|
|
import com.ruoyi.system.domain.PosOrder;
|
|
import com.ruoyi.system.domain.PosOrder;
|
|
|
import com.ruoyi.system.domain.PosStore;
|
|
import com.ruoyi.system.domain.PosStore;
|
|
|
import com.ruoyi.system.domain.flash.FlashDeliveryOrder;
|
|
import com.ruoyi.system.domain.flash.FlashDeliveryOrder;
|
|
|
|
|
+import com.ruoyi.system.domain.flash.FlashDeliveryOrderStop;
|
|
|
import com.ruoyi.system.mapper.PosOrderMapper;
|
|
import com.ruoyi.system.mapper.PosOrderMapper;
|
|
|
import com.ruoyi.system.mapper.PosStoreMapper;
|
|
import com.ruoyi.system.mapper.PosStoreMapper;
|
|
|
import com.ruoyi.system.mapper.flash.FlashDeliveryOrderMapper;
|
|
import com.ruoyi.system.mapper.flash.FlashDeliveryOrderMapper;
|
|
|
|
|
+import com.ruoyi.system.mapper.flash.FlashDeliveryOrderStopMapper;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
@@ -21,6 +25,7 @@ import java.util.List;
|
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
import java.util.Objects;
|
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 统一订单列表查询:外卖与闪送两路各取 size+1 条,Java 按游标全序归并,读时聚合零写路径。
|
|
* 统一订单列表查询:外卖与闪送两路各取 size+1 条,Java 按游标全序归并,读时聚合零写路径。
|
|
@@ -43,13 +48,16 @@ public class UnifiedOrderQueryService {
|
|
|
private final PosOrderMapper posOrderMapper;
|
|
private final PosOrderMapper posOrderMapper;
|
|
|
private final FlashDeliveryOrderMapper flashOrderMapper;
|
|
private final FlashDeliveryOrderMapper flashOrderMapper;
|
|
|
private final PosStoreMapper posStoreMapper;
|
|
private final PosStoreMapper posStoreMapper;
|
|
|
|
|
+ private final FlashDeliveryOrderStopMapper flashStopMapper;
|
|
|
|
|
|
|
|
public UnifiedOrderQueryService(PosOrderMapper posOrderMapper,
|
|
public UnifiedOrderQueryService(PosOrderMapper posOrderMapper,
|
|
|
FlashDeliveryOrderMapper flashOrderMapper,
|
|
FlashDeliveryOrderMapper flashOrderMapper,
|
|
|
- PosStoreMapper posStoreMapper) {
|
|
|
|
|
|
|
+ PosStoreMapper posStoreMapper,
|
|
|
|
|
+ FlashDeliveryOrderStopMapper flashStopMapper) {
|
|
|
this.posOrderMapper = posOrderMapper;
|
|
this.posOrderMapper = posOrderMapper;
|
|
|
this.flashOrderMapper = flashOrderMapper;
|
|
this.flashOrderMapper = flashOrderMapper;
|
|
|
this.posStoreMapper = posStoreMapper;
|
|
this.posStoreMapper = posStoreMapper;
|
|
|
|
|
+ this.flashStopMapper = flashStopMapper;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/** 查询统一列表:size 服务端钳制 1-50;cursor 为空表示首页。 */
|
|
/** 查询统一列表:size 服务端钳制 1-50;cursor 为空表示首页。 */
|
|
@@ -79,11 +87,12 @@ public class UnifiedOrderQueryService {
|
|
|
|
|
|
|
|
UnifiedOrderPageView view = new UnifiedOrderPageView();
|
|
UnifiedOrderPageView view = new UnifiedOrderPageView();
|
|
|
Map<Long, PosStore> stores = storesOf(displayed);
|
|
Map<Long, PosStore> stores = storesOf(displayed);
|
|
|
|
|
+ Map<Long, List<FlashDeliveryOrderStop>> flashStops = flashStopRows(displayed);
|
|
|
List<UnifiedOrderListItem> items = new ArrayList<>(displayed.size());
|
|
List<UnifiedOrderListItem> items = new ArrayList<>(displayed.size());
|
|
|
for (Row row : displayed) {
|
|
for (Row row : displayed) {
|
|
|
items.add(row.takeaway() != null
|
|
items.add(row.takeaway() != null
|
|
|
? takeawayItem(row.takeaway(), stores)
|
|
? takeawayItem(row.takeaway(), stores)
|
|
|
- : flashItem(row.flash(), userId));
|
|
|
|
|
|
|
+ : flashItem(row.flash(), userId, flashStops.get(row.flash().getId())));
|
|
|
}
|
|
}
|
|
|
view.setList(items);
|
|
view.setList(items);
|
|
|
view.setHasMore(hasMore);
|
|
view.setHasMore(hasMore);
|
|
@@ -204,7 +213,18 @@ public class UnifiedOrderQueryService {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private UnifiedOrderListItem flashItem(FlashDeliveryOrder order, Long userId) {
|
|
|
|
|
|
|
+ /** 展示页闪送 v2 多站点单一次 IN 批量取站点,避免逐单 N+1;外卖路与 v1 闪送不查。 */
|
|
|
|
|
+ private Map<Long, List<FlashDeliveryOrderStop>> flashStopRows(List<Row> displayed) {
|
|
|
|
|
+ List<Long> orderIds = displayed.stream().map(Row::flash).filter(Objects::nonNull)
|
|
|
|
|
+ .filter(order -> order.getDeliveryStopCount() != null)
|
|
|
|
|
+ .map(FlashDeliveryOrder::getId).toList();
|
|
|
|
|
+ if (orderIds.isEmpty()) return Map.of();
|
|
|
|
|
+ return flashStopMapper.selectList(new QueryWrapper<FlashDeliveryOrderStop>()
|
|
|
|
|
+ .in("order_id", orderIds).orderByAsc("stop_order", "id")).stream()
|
|
|
|
|
+ .collect(Collectors.groupingBy(FlashDeliveryOrderStop::getOrderId));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private UnifiedOrderListItem flashItem(FlashDeliveryOrder order, Long userId, List<FlashDeliveryOrderStop> stopRows) {
|
|
|
UnifiedOrderListItem item = new UnifiedOrderListItem();
|
|
UnifiedOrderListItem item = new UnifiedOrderListItem();
|
|
|
item.setSourceType("flash");
|
|
item.setSourceType("flash");
|
|
|
item.setRole(userId != null && userId.equals(order.getUserId()) ? "sender" : "receiver");
|
|
item.setRole(userId != null && userId.equals(order.getUserId()) ? "sender" : "receiver");
|
|
@@ -230,6 +250,16 @@ public class UnifiedOrderQueryService {
|
|
|
item.setPackageType(order.getPackageType());
|
|
item.setPackageType(order.getPackageType());
|
|
|
item.setQuantity(order.getQuantity());
|
|
item.setQuantity(order.getQuantity());
|
|
|
item.setTipAmount(order.getTipAmount());
|
|
item.setTipAmount(order.getTipAmount());
|
|
|
|
|
+ // v2 多站点单补双进度计数与逐站列表;卡片脱敏口径与闪送专属列表一致。
|
|
|
|
|
+ if (order.getDeliveryStopCount() != null) {
|
|
|
|
|
+ item.setPickupStopCount(order.getPickupStopCount());
|
|
|
|
|
+ item.setPickedUpStopCount(order.getPickedUpStopCount());
|
|
|
|
|
+ item.setDeliveryStopCount(order.getDeliveryStopCount());
|
|
|
|
|
+ item.setDeliveredStopCount(order.getDeliveredStopCount());
|
|
|
|
|
+ if (stopRows != null && !stopRows.isEmpty()) {
|
|
|
|
|
+ item.setStops(FlashDeliveryUserCardStops.of(stopRows, userId, Objects.equals(userId, order.getUserId())));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
return item;
|
|
return item;
|
|
|
}
|
|
}
|
|
|
|
|
|