Sfoglia il codice sorgente

036 组合卡补goodsCount:普通单卡本单件数、批次/组卡有效成员合计

与统一列表同口径(food 快照各行 number 求和,空或非法为 null):
普通单卡 goodsCount=本单件数,批次/组卡 members[] 逐店件数、卡级为有效成员合计;
单店普通单与多店批次卡均返回该字段,接入文档同步说明。
qmj 2 giorni fa
parent
commit
cb1250ab5a

+ 30 - 3
ruoyi-admin/src/main/java/com/ruoyi/app/order/MultiStoreCheckoutQueryService.java

@@ -4,6 +4,7 @@ import com.ruoyi.app.order.dto.MultiStoreCardView;
 import com.ruoyi.app.order.dto.MultiStoreMemberView;
 import com.ruoyi.app.order.dto.MultiStorePageView;
 import com.ruoyi.app.order.dto.MultiStoreRefundMemberView;
+import com.alibaba.fastjson.JSONArray;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.system.domain.CheckoutCardRow;
@@ -148,14 +149,22 @@ public class MultiStoreCheckoutQueryService {
             for (MultiStoreCardView view : result) {
                 if ("ORDER".equals(view.getCardType())) {
                     attachOrderContext(view.getOrderId(), originals, storeMap, userMap, longitude, latitude,
-                            view::setLegacyOrder, view::setStore, view::setUser, view::setJuli);
+                            view::setLegacyOrder, view::setStore, view::setUser, view::setJuli, view::setGoodsCount);
                 } else {
+                    int cardGoods = 0;
+                    boolean anyGoods = false;
                     for (MultiStoreMemberView member : view.getMembers()) {
                         attachOrderContext(member.getOrderId(), originals, storeMap, userMap, longitude, latitude,
-                                member::setLegacyOrder, member::setStore, member::setUser, member::setJuli);
+                                member::setLegacyOrder, member::setStore, member::setUser, member::setJuli,
+                                member::setGoodsCount);
                         // 组没有单一配送里程;逐子单暴露旧详情的 jvli,缺失快照不臆造距离。
                         member.setJvli(member.getLegacyOrder() == null ? null : member.getLegacyOrder().getJvli());
+                        if (member.getGoodsCount() != null) {
+                            cardGoods += member.getGoodsCount();
+                            anyGoods = true;
+                        }
                     }
+                    if (anyGoods) view.setGoodsCount(cardGoods);
                 }
             }
         }
@@ -168,12 +177,30 @@ public class MultiStoreCheckoutQueryService {
                                     java.util.function.Consumer<PosOrder> orderSetter,
                                     java.util.function.Consumer<PosStore> storeSetter,
                                     java.util.function.Consumer<InfoUser> userSetter,
-                                    java.util.function.Consumer<Double> juliSetter) {
+                                    java.util.function.Consumer<Double> juliSetter,
+                                    java.util.function.Consumer<Integer> goodsCountSetter) {
         PosOrder order = originals.get(orderId);
         orderSetter.accept(order);
         storeSetter.accept(order == null || order.getMdId() == null ? null : storeMap.get(order.getMdId().intValue()));
         userSetter.accept(order == null || order.getUserId() == null ? null : userMap.get(order.getUserId()));
         juliSetter.accept(straightKm(order, longitude, latitude));
+        goodsCountSetter.accept(goodsCount(order == null ? null : order.getFood()));
+    }
+
+    /** 商品件数与统一列表同口径:food 快照各行 number 求和,空或非法返回空。 */
+    private Integer goodsCount(String food) {
+        if (food == null || food.isBlank()) return null;
+        try {
+            JSONArray rows = JSONArray.parseArray(food);
+            int count = 0;
+            for (int i = 0; i < rows.size(); i++) {
+                Integer num = rows.getJSONObject(i).getInteger("number");
+                if (num != null) count += num;
+            }
+            return count;
+        } catch (RuntimeException e) {
+            return null;
+        }
     }
 
     /** 旧骑手列表同款球面直线距离(公里、两位小数);订单或请求坐标缺失返回空。 */

+ 2 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/order/dto/MultiStoreCardView.java

@@ -20,6 +20,8 @@ public class MultiStoreCardView {
     private PosStore store;
     private InfoUser user;
     private Double juli;
+    /** 商品件数:普通单卡为本单件数,批次/组卡为有效成员件数合计;口径同统一列表。 */
+    private Integer goodsCount;
     private Long batchId;
     private Long groupId;
     private Long version;

+ 2 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/order/dto/MultiStoreMemberView.java

@@ -29,6 +29,8 @@ public class MultiStoreMemberView {
     private PosStore store;
     private InfoUser user;
     private Double juli;
+    /** 本子单商品件数:food 快照各行 number 求和,口径同统一列表;food 缺失或非法为空。 */
+    private Integer goodsCount;
     /** 门店到收货地址的配送距离(公里),与 legacyOrder.jvli 相同。 */
     private Double jvli;
     private List<String> allowedActions = List.of();

+ 5 - 0
ruoyi-admin/src/test/java/com/ruoyi/app/order/MultiStoreCheckoutQueryServiceTest.java

@@ -178,9 +178,11 @@ class MultiStoreCheckoutQueryServiceTest {
         PosOrder memberOrder = new PosOrder();
         memberOrder.setId(71L); memberOrder.setMdId(5L); memberOrder.setUserId(21L);
         memberOrder.setLongitude(riderLng); memberOrder.setLatitude(riderLat);
+        memberOrder.setFood("[{\"name\":\"A\",\"number\":2},{\"name\":\"B\",\"number\":1}]");
         PosOrder ordinaryOrder = new PosOrder();
         ordinaryOrder.setId(9L); ordinaryOrder.setMdId(5L); ordinaryOrder.setUserId(21L);
         ordinaryOrder.setLongitude(riderLng); ordinaryOrder.setLatitude(riderLat);
+        ordinaryOrder.setFood("[{\"name\":\"C\",\"number\":4}]");
         when(ordinaryOrders.listByIds(List.of(9L, 71L))).thenReturn(List.of(memberOrder, ordinaryOrder));
         PosStore store = new PosStore();
         store.setId(5);
@@ -196,11 +198,14 @@ class MultiStoreCheckoutQueryServiceTest {
         assertEquals(5, groupCard.getMembers().get(0).getStore().getId());
         assertEquals(21L, groupCard.getMembers().get(0).getUser().getUserId());
         assertEquals(0.0, groupCard.getMembers().get(0).getJuli());
+        assertEquals(3, groupCard.getMembers().get(0).getGoodsCount());
+        assertEquals(3, groupCard.getGoodsCount());
         MultiStoreCardView orderCard = result.records().get(1);
         assertEquals(9L, orderCard.getLegacyOrder().getId());
         assertEquals(5, orderCard.getStore().getId());
         assertEquals(21L, orderCard.getUser().getUserId());
         assertEquals(0.0, orderCard.getJuli());
+        assertEquals(4, orderCard.getGoodsCount());
     }
 
     @Test