From 43315000b2840313a5aff96bf314b3c061e4616d Mon Sep 17 00:00:00 2001
From: zepengdev <lzpsmith@outlook.com>
Date: Mon, 14 Jul 2025 21:00:53 +0800
Subject: [PATCH] feat: 增加店铺和商品审核功能

---
 oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java |   41 ++++++++++++++++++++++++++++++-----------
 1 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java
index b8bc400..88e77e6 100644
--- a/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java
+++ b/oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java
@@ -1,9 +1,9 @@
 package com.oying.modules.pc.store.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.util.NumberUtil;
 import com.oying.modules.pc.store.domain.Store;
 import com.oying.modules.pc.store.domain.dto.StoreQueryCriteria;
-import com.oying.modules.pc.store.mapper.StoreMapper;
 import com.oying.modules.pc.store.service.StoreQueryService;
 import com.oying.modules.pc.store.service.StoreService;
 import com.oying.utils.PageResult;
@@ -26,7 +26,6 @@
 
     private final RedisTemplate<Object, Object> redisTemplate;
     private final StoreService storeService;
-    private final StoreMapper storeMapper;
 
     @Override
     public PageResult<Store> findPagedStores(StoreQueryCriteria criteria) {
@@ -38,12 +37,13 @@
         Long total = redisTemplate.opsForZSet().size(setKey);
         if (total == null || total == 0) {
             // 初始化缓存
-            List<Long> ids = storeMapper.queryStoreIds(criteria);
+            List<Long> ids = storeService.queryStoreIds(criteria);
+            int index = 0;
             for (Long id : ids) {
-                redisTemplate.opsForZSet().add(setKey, id, 1);
+                redisTemplate.opsForZSet().add(setKey, id, index++);
             }
             // 设置缓存过期时间
-            redisTemplate.expire(setKey, 30, TimeUnit.MINUTES);
+            redisTemplate.expire(setKey, 15, TimeUnit.MINUTES);
             total = (long) ids.size();
         }
 
@@ -51,16 +51,35 @@
         int current = (criteria.getPage() == null || criteria.getPage() < 1) ? 1 : criteria.getPage();
         int offset = (current - 1) * criteria.getSize();
         int end = offset + criteria.getSize() - 1;
-        Set<Long> storeIds = Optional.ofNullable(redisTemplate.opsForZSet()
-                        .range(setKey, offset, end))
+        Set<Long> storeIds = Optional.ofNullable(redisTemplate.opsForZSet().range(setKey, offset, end))
                 .orElse(Collections.emptySet())
-                .stream().map(i-> (Long) i).collect(Collectors.toSet());
+                .stream()
+                .map(i -> (Long) i)
+                .collect(Collectors.toSet());
 
-        // 3. 获取详情数据
-        List<Store> stores = Optional.ofNullable(storeService.listByIds(storeIds)).orElse(ListUtil.toList());
+        // 3. 获取详情数据]
+        List<Store> stores = Optional.of(storeIds)
+                .filter(CollectionUtil::isNotEmpty)
+                .map(storeService::getStoresByIds)
+                .orElse(ListUtil.toList());
+
+        stores.forEach(u -> u.setDeliveryDuration(distanceCalculation(criteria.getLatitude(), criteria.getLongitude(), u.getLatitude(), u.getLongitude())));
 
         page.setContent(stores);
         page.setTotalElements(total);
         return page;
     }
+
+    private Integer distanceCalculation(double lat1, double lon1, double lat2, double lon2) {
+        // 地球半径(千米)
+        final int R = 6371;
+        // 将纬度、经度从度转换为弧度
+        double latDistance = Math.toRadians(lat2 - lat1);
+        double lonDistance = Math.toRadians(lon2 - lon1);
+        double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
+                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
+                * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
+        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+        return new Double(R * c * 1000).intValue();
+    }
 }

--
Gitblit v1.9.3