ソースを参照

1.修改店铺列表设置评分不一致

qmj 3 日 前
コミット
9d8ec45ab3

+ 7 - 122
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/PosFoodController.java

@@ -63,6 +63,9 @@ public class PosFoodController extends BaseController {
     @Autowired
     private IPosOrderService posOrderService;
 
+    @Autowired
+    private PosStoreEnrichService posStoreEnrichService;
+
     //删除商品
     @Anonymous
     @Auth
@@ -311,62 +314,11 @@ public class PosFoodController extends BaseController {
             // 按店铺ID分组商品
             Map<Long, List<PosFood>> foodsByStore = allFoods.stream()
                     .collect(Collectors.groupingBy(PosFood::getMdid));
-            // 1. 计算各门店评分
-            QueryWrapper<PosReview> reviewWrapper = new QueryWrapper<>();
-            reviewWrapper.in("md_id", storeIds);
-            List<PosReview> reviews = posReviewService.list(reviewWrapper);
-
-            reviewMap = reviews.stream()
-                    .collect(Collectors.groupingBy(PosReview::getMdId));
-
-            // 2. 统计各门店本月订单数(按 cretim 当前月份)
-            QueryWrapper<PosOrder> orderWrapper = new QueryWrapper<>();
-            orderWrapper.in("md_id", storeIds);
-            orderWrapper.apply("DATE_FORMAT(cretim,'%Y-%m') = DATE_FORMAT(NOW(),'%Y-%m')");
-            List<PosOrder> orders = posOrderService.list(orderWrapper);
-            orderCountMap = orders.stream()
-                    .collect(Collectors.groupingBy(PosOrder::getMdId, Collectors.counting()));
-            QueryWrapper<OperatingHours> wrapper = new QueryWrapper<>();
-            wrapper.in("md_id", storeIds);
-            hourslist = operatingHoursService.list(wrapper);
-            DateUtil dateUtil = new DateUtil();
-
+            posStoreEnrichService.enrichStoreList(stores);
             // 3. 为每个店铺设置对应的商品
             for (PosStore store : stores) {
                 FoodSearchOutput output = new FoodSearchOutput();
-                Long mdId = store.getId() == null ? null : store.getId().longValue();
-                List<PosReview> storeReviews = (mdId == null || reviewMap.isEmpty()) ? null : reviewMap.get(mdId);
-
-                double score;
-                if (storeReviews == null || storeReviews.isEmpty()) {
-                    score = 4.5d;
-                } else {
-                    double avg = storeReviews.stream()
-                            .mapToLong(PosReview::getScore)
-                            .average()
-                            .orElse(4.5d);
-                    // 平均分按 0.5 分粒度四舍五入,例如 3, 3.5, 4, 4.5
-                    score = Math.round(avg * 2.0d) / 2.0d;
-                }
-                store.setPingf(score);
-
-                // 设置本月售出订单数量(ddsl)
-                long monthCount = (mdId == null || orderCountMap.isEmpty()) ? 0L : orderCountMap.getOrDefault(mdId, 0L);
-                store.setDdsl(monthCount);
-
-                Boolean dayang = false;
-                List<OperatingHours> mdHours=hourslist.stream().filter(x-> store.getId().equals(x.getMdId().intValue())).collect(Collectors.toList());
-                //在营业时间范围内返回true
-                for (int i = 0; i < mdHours.size(); i++) {
-                    Boolean sbsj = dateUtil.isLegalTime(mdHours.get(i).getStartTime(), mdHours.get(i).getEndTime());
-                    if (sbsj == true) {
-                        dayang = true;
-                    }
-                }
-                //不在时间范围内标识为打烊
-                if (dayang == false) {
-                    store.setState(1L);
-                }
+
                 output.setPosStore(store);
                 // 从分组结果中获取该店铺的商品
                 List<PosFood> storeFoods = foodsByStore.getOrDefault(store.getId().longValue(), new ArrayList<>());
@@ -428,75 +380,8 @@ public class PosFoodController extends BaseController {
         IPage<PosStore> data = posStoreService.page(page, storeWrapper);
         Map<String, Object> response = new HashMap<>();
         List<PosStore> stores=data.getRecords();
-        Map<Long, List<PosReview>> reviewMap = Collections.emptyMap();
-        Map<Long, Long> orderCountMap = Collections.emptyMap();
-        List<OperatingHours> hourslist=new ArrayList<>();
-        if(!stores.isEmpty()){
-            List<Long> mdIds = stores.stream()
-                    .map(store -> store.getId() == null ? null : store.getId().longValue())
-                    .filter(idVal -> idVal != null)
-                    .collect(Collectors.toList());
-
-            if (!mdIds.isEmpty()) {
-                // 1. 计算各门店评分
-                QueryWrapper<PosReview> reviewWrapper = new QueryWrapper<>();
-                reviewWrapper.in("md_id", mdIds);
-                List<PosReview> reviews = posReviewService.list(reviewWrapper);
-
-                reviewMap = reviews.stream()
-                        .collect(Collectors.groupingBy(PosReview::getMdId));
-
-                // 2. 统计各门店本月订单数(按 cretim 当前月份)
-                QueryWrapper<PosOrder> orderWrapper = new QueryWrapper<>();
-                orderWrapper.in("md_id", mdIds);
-                orderWrapper.apply("DATE_FORMAT(cretim,'%Y-%m') = DATE_FORMAT(NOW(),'%Y-%m')");
-                List<PosOrder> orders = posOrderService.list(orderWrapper);
-                orderCountMap = orders.stream()
-                        .collect(Collectors.groupingBy(PosOrder::getMdId, Collectors.counting()));
-                QueryWrapper<OperatingHours> wrapper = new QueryWrapper<>();
-                wrapper.in("md_id", mdIds);
-                hourslist = operatingHoursService.list(wrapper);
-
-            }
-            DateUtil dateUtil = new DateUtil();
-            for(PosStore store:stores){
-                Long mdId = store.getId() == null ? null : store.getId().longValue();
-                List<PosReview> storeReviews = (mdId == null || reviewMap.isEmpty()) ? null : reviewMap.get(mdId);
-
-                double score;
-                if (storeReviews == null || storeReviews.isEmpty()) {
-                    score = 4.5d;
-                } else {
-                    double avg = storeReviews.stream()
-                            .mapToLong(PosReview::getScore)
-                            .average()
-                            .orElse(4.5d);
-                    // 平均分按 0.5 分粒度四舍五入,例如 3, 3.5, 4, 4.5
-                    score = Math.round(avg * 2.0d) / 2.0d;
-                }
-                store.setPingf(score);
-
-                // 设置本月售出订单数量(ddsl)
-                long monthCount = (mdId == null || orderCountMap.isEmpty()) ? 0L : orderCountMap.getOrDefault(mdId, 0L);
-                store.setDdsl(monthCount);
-
-                Boolean dayang = false;
-                List<OperatingHours> mdHours=hourslist.stream().filter(x-> store.getId().equals(x.getMdId().intValue())).collect(Collectors.toList());
-                //在营业时间范围内返回true
-                for (int i = 0; i < mdHours.size(); i++) {
-                    Boolean sbsj = dateUtil.isLegalTime(mdHours.get(i).getStartTime(), mdHours.get(i).getEndTime());
-                    if (sbsj == true) {
-                        dayang = true;
-                    }
-                }
-                //不在时间范围内标识为打烊
-                if (dayang == false) {
-                    store.setState(1L);
-                }
-            }
-        }
-
-        response.put("list", data.getRecords());
+        posStoreEnrichService.enrichStoreList(stores);
+        response.put("list", stores);
         response.put("total", data.getTotal());
         return success(response);
     }

+ 2 - 74
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/PosStoreController.java

@@ -34,8 +34,6 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
-import java.util.Collections;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
@@ -61,11 +59,9 @@ public class PosStoreController extends BaseController {
     @Autowired
     private IInfoUserService infoUserService;
     @Autowired
-    private IPosReviewService posReviewService;
-    @Autowired
     private IOperatingHoursService operatingHoursService;
     @Autowired
-    private IPosOrderService posOrderService;
+    private PosStoreEnrichService posStoreEnrichService;
     @Autowired
     private SysConfigMapper sysConfigMapper;
 
@@ -237,75 +233,7 @@ public class PosStoreController extends BaseController {
             list = posStoreMapper.getdaidiq(longitude, latitude, (page - 1) * 20, "%" + area + "%", juli, sort);
         }
 
-        // 为门店列表设置评分与月售订单数量
-        if (!list.isEmpty()) {
-            List<Long> mdIds = list.stream()
-                    .map(store -> store.getId() == null ? null : store.getId().longValue())
-                    .filter(idVal -> idVal != null)
-                    .collect(Collectors.toList());
-
-            Map<Long, List<PosReview>> reviewMap = Collections.emptyMap();
-            Map<Long, Long> orderCountMap = Collections.emptyMap();
-            List<OperatingHours> hourslist=new ArrayList<>();
-            if (!mdIds.isEmpty()) {
-                // 1. 计算各门店评分
-                QueryWrapper<PosReview> reviewWrapper = new QueryWrapper<>();
-                reviewWrapper.in("md_id", mdIds);
-                List<PosReview> reviews = posReviewService.list(reviewWrapper);
-
-                reviewMap = reviews.stream()
-                        .collect(Collectors.groupingBy(PosReview::getMdId));
-
-                // 2. 统计各门店本月订单数(按 cretim 当前月份)
-                QueryWrapper<PosOrder> orderWrapper = new QueryWrapper<>();
-                orderWrapper.in("md_id", mdIds);
-                orderWrapper.apply("DATE_FORMAT(cretim,'%Y-%m') = DATE_FORMAT(NOW(),'%Y-%m')");
-                List<PosOrder> orders = posOrderService.list(orderWrapper);
-                orderCountMap = orders.stream()
-                        .collect(Collectors.groupingBy(PosOrder::getMdId, Collectors.counting()));
-                QueryWrapper<OperatingHours> wrapper = new QueryWrapper<>();
-                wrapper.in("md_id", mdIds);
-                hourslist = operatingHoursService.list(wrapper);
-
-            }
-            DateUtil dateUtil = new DateUtil();
-            // 统一循环设置评分与月售(mdIds 为空时使用默认值)
-            for (PosStore store : list) {
-                Long mdId = store.getId() == null ? null : store.getId().longValue();
-                List<PosReview> storeReviews = (mdId == null || reviewMap.isEmpty()) ? null : reviewMap.get(mdId);
-
-                double score;
-                if (storeReviews == null || storeReviews.isEmpty()) {
-                    score = 4.5d;
-                } else {
-                    double avg = storeReviews.stream()
-                            .mapToLong(PosReview::getScore)
-                            .average()
-                            .orElse(4.5d);
-                    // 平均分按 0.5 分粒度四舍五入,例如 3, 3.5, 4, 4.5
-                    score = Math.round(avg * 2.0d) / 2.0d;
-                }
-                store.setPingf(score);
-
-                // 设置本月售出订单数量(ddsl)
-                long monthCount = (mdId == null || orderCountMap.isEmpty()) ? 0L : orderCountMap.getOrDefault(mdId, 0L);
-                store.setDdsl(monthCount);
-
-                Boolean dayang = false;
-                List<OperatingHours> mdHours=hourslist.stream().filter(x-> store.getId().equals(x.getMdId().intValue())).collect(Collectors.toList());
-                //在营业时间范围内返回true
-                for (int i = 0; i < mdHours.size(); i++) {
-                    Boolean sbsj = dateUtil.isLegalTime(mdHours.get(i).getStartTime(), mdHours.get(i).getEndTime());
-                    if (sbsj == true) {
-                        dayang = true;
-                    }
-                }
-                //不在时间范围内标识为打烊
-                if (dayang == false) {
-                    store.setState(1L);
-                }
-            }
-        }
+        posStoreEnrichService.enrichStoreList(list);
 
         return success(list);
 

+ 102 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/PosStoreEnrichService.java

@@ -0,0 +1,102 @@
+package com.ruoyi.app.mendian;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.app.utils.DateUtil;
+import com.ruoyi.system.domain.OperatingHours;
+import com.ruoyi.system.domain.PosOrder;
+import com.ruoyi.system.domain.PosReview;
+import com.ruoyi.system.domain.PosStore;
+import com.ruoyi.system.service.IOperatingHoursService;
+import com.ruoyi.system.service.IPosOrderService;
+import com.ruoyi.system.service.IPosReviewService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+public class PosStoreEnrichService {
+
+    @Autowired
+    private IPosReviewService posReviewService;
+    @Autowired
+    private IPosOrderService posOrderService;
+    @Autowired
+    private IOperatingHoursService operatingHoursService;
+
+    /**
+     * 为门店列表设置评分、月售、营业状态。
+     */
+    public void enrichStoreList(List<PosStore> list) {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+
+        List<Long> mdIds = list.stream()
+                .map(store -> store.getId() == null ? null : store.getId().longValue())
+                .filter(idVal -> idVal != null)
+                .collect(Collectors.toList());
+
+        Map<Long, List<PosReview>> reviewMap = Collections.emptyMap();
+        Map<Long, Long> orderCountMap = Collections.emptyMap();
+        List<OperatingHours> hourslist = Collections.emptyList();
+
+        if (!mdIds.isEmpty()) {
+            QueryWrapper<PosReview> reviewWrapper = new QueryWrapper<>();
+            reviewWrapper.in("md_id", mdIds);
+            List<PosReview> reviews = posReviewService.list(reviewWrapper);
+            reviewMap = reviews.stream()
+                    .collect(Collectors.groupingBy(PosReview::getMdId));
+
+            QueryWrapper<PosOrder> orderWrapper = new QueryWrapper<>();
+            orderWrapper.in("md_id", mdIds);
+            orderWrapper.apply("DATE_FORMAT(cretim,'%Y-%m') = DATE_FORMAT(NOW(),'%Y-%m')");
+            List<PosOrder> orders = posOrderService.list(orderWrapper);
+            orderCountMap = orders.stream()
+                    .collect(Collectors.groupingBy(PosOrder::getMdId, Collectors.counting()));
+
+            QueryWrapper<OperatingHours> wrapper = new QueryWrapper<>();
+            wrapper.in("md_id", mdIds);
+            hourslist = operatingHoursService.list(wrapper);
+        }
+
+        DateUtil dateUtil = new DateUtil();
+        for (PosStore store : list) {
+            Long mdId = store.getId() == null ? null : store.getId().longValue();
+            List<PosReview> storeReviews = (mdId == null || reviewMap.isEmpty()) ? null : reviewMap.get(mdId);
+
+            double score;
+            if (storeReviews == null || storeReviews.isEmpty()) {
+                score = 4.5d;
+            } else {
+                double avg = storeReviews.stream()
+                        .mapToLong(PosReview::getScore)
+                        .average()
+                        .orElse(4.5d);
+                score = Math.round(avg * 2.0d) / 2.0d;
+            }
+            store.setPingf(score);
+
+            long monthCount = (mdId == null || orderCountMap.isEmpty()) ? 0L : orderCountMap.getOrDefault(mdId, 0L);
+            store.setDdsl(monthCount);
+
+            boolean dayang = false;
+            List<OperatingHours> mdHours = hourslist.stream()
+                    .filter(x -> store.getId() != null && store.getId().equals(x.getMdId().intValue()))
+                    .collect(Collectors.toList());
+            for (OperatingHours operatingHours : mdHours) {
+                Boolean sbsj = dateUtil.isLegalTime(operatingHours.getStartTime(), operatingHours.getEndTime());
+                if (Boolean.TRUE.equals(sbsj)) {
+                    dayang = true;
+                    break;
+                }
+            }
+            if (!dayang) {
+                store.setState(1L);
+            }
+        }
+    }
+}

+ 4 - 26
ruoyi-admin/src/main/java/com/ruoyi/app/user/UserAppIndexController.java

@@ -1,13 +1,9 @@
 package com.ruoyi.app.user;
 
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.alibaba.fastjson.JSONArray;
-import com.ruoyi.app.utils.DateUtil;
+import com.ruoyi.app.mendian.PosStoreEnrichService;
 import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -58,7 +54,7 @@ public class UserAppIndexController extends BaseController {
     @Autowired
     private IInfoUserService infoUserService;
     @Autowired
-    private IOperatingHoursService operatingHoursService;
+    private PosStoreEnrichService posStoreEnrichService;
 
     /**
      * 获取夜市列表
@@ -92,6 +88,7 @@ public class UserAppIndexController extends BaseController {
                                         @RequestParam Integer page,
                                         @RequestParam(defaultValue = "0") Long flId) {
         List<PosStore> storeList = posStoreMapper.getjxStore(longitude,latitude,(page-1)*10,flId);
+        posStoreEnrichService.enrichStoreList(storeList);
         int count = posStoreMapper.getjxStoreCount(longitude,latitude,flId);
         String lang="3";
         if ("zh-CN".equals(language)) {
@@ -110,8 +107,7 @@ public class UserAppIndexController extends BaseController {
                 .collect(Collectors.toList());
 
         // 使用MyBatis Plus一次性查询所有门店的商品(避免N+1查询问题)
-        Map<Integer, List<PosFood>> foodMap = new java.util.HashMap<>();
-        List<OperatingHours> hourslist=new ArrayList<>();
+        java.util.Map<Integer, List<PosFood>> foodMap = new java.util.HashMap<>();
         if (!storeIds.isEmpty()) {
             // 将Integer类型的门店ID转换为Long类型用于查询(因为mdid是Long类型)
             List<Long> storeIdsLong = storeIds.stream()
@@ -125,32 +121,14 @@ public class UserAppIndexController extends BaseController {
             foodMap = allFoods.stream()
                     .collect(Collectors.groupingBy(food -> food.getMdid().intValue()));
 
-            QueryWrapper<OperatingHours> wrapper = new QueryWrapper<>();
-            wrapper.in("md_id", storeIdsLong);
-            hourslist = operatingHoursService.list(wrapper);
-
         }
 
         // 转换为StoreOutput并设置每个门店的商品列表(每个门店最多6条)
         List<StoreOutput> storeOutputList = new ArrayList<>();
-        DateUtil dateUtil = new DateUtil();
         for (PosStore store : storeList) {
             StoreOutput storeOutput = new StoreOutput();
             // 复制PosStore的所有属性
             BeanUtils.copyProperties(store, storeOutput);
-            Boolean dayang = false;
-            List<OperatingHours> mdHours=hourslist.stream().filter(x-> store.getId().equals(x.getMdId().intValue())).collect(Collectors.toList());
-            //在营业时间范围内返回true
-            for (int i = 0; i < mdHours.size(); i++) {
-                Boolean sbsj = dateUtil.isLegalTime(mdHours.get(i).getStartTime(), mdHours.get(i).getEndTime());
-                if (sbsj == true) {
-                    dayang = true;
-                }
-            }
-            //不在时间范围内标识为打烊
-            if (dayang == false) {
-                storeOutput.setState(1L);
-            }
             // 从分组结果中获取该门店的商品列表(已限制为最多6条)
             List<PosFood> foodList = foodMap.getOrDefault(store.getId(), new ArrayList<>());
             storeOutput.setFoodList(foodList);