From c466ff02844412184c6e032c82eeca18836b4e2d Mon Sep 17 00:00:00 2001
From: zepengdev <lzpsmith@outlook.com>
Date: Mon, 23 Jun 2025 12:06:37 +0800
Subject: [PATCH] refactor(StoreQueryService): 查询优化

---
 oying-system/src/main/java/com/oying/modules/pc/store/service/impl/StoreQueryServiceImpl.java |   69 +++++++++++++++++++++++++++-------
 1 files changed, 54 insertions(+), 15 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 0514d5c..776807d 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,33 +1,72 @@
 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.StoreCustomerDetailDto;
-import com.oying.modules.pc.store.domain.dto.StoreCustomerQueryCriteria;
+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;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.BeanUtils;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
 @RequiredArgsConstructor
 public class StoreQueryServiceImpl implements StoreQueryService {
 
+    private final RedisTemplate<Object, Object> redisTemplate;
     private final StoreService storeService;
+    private final StoreMapper storeMapper;
 
     @Override
-    public StoreCustomerDetailDto getCustomerStoreDetail(StoreCustomerQueryCriteria criteria) {
-        Store store = storeService.getById(criteria.getStoreId());
-        StoreCustomerDetailDto storeDto = new StoreCustomerDetailDto();
-        BeanUtils.copyProperties(store, storeDto);
-        storeDto.setName(store.getStoreName());
-        storeDto.setLogoUrl("");
-        storeDto.setBusinessHours("");
-        storeDto.setDeliveryDuration(0);
-        storeDto.setMonthlySales(0);
-        storeDto.setScore(0);
-        return storeDto;
+    public PageResult<Store> findPagedStores(StoreQueryCriteria criteria) {
+
+        PageResult<Store> page = new PageResult<>();
+
+        // 1. 检查ZSET是否存在
+        String setKey = criteria.buildConditionCacheKey();
+        Long total = redisTemplate.opsForZSet().size(setKey);
+        if (total == null || total == 0) {
+            // 初始化缓存
+            List<Long> ids = storeMapper.queryStoreIds(criteria);
+            int index = 0;
+            for (Long id : ids) {
+                redisTemplate.opsForZSet().add(setKey, id, index++);
+            }
+            // 设置缓存过期时间
+            redisTemplate.expire(setKey, 15, TimeUnit.MINUTES);
+            total = (long) ids.size();
+        }
+
+        // 2. 从ZSET获取分页ID
+        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))
+                .orElse(Collections.emptySet())
+                .stream()
+                .map(i-> (Long) i)
+                .collect(Collectors.toSet());
+
+        // 3. 获取详情数据]
+        List<Store> stores = Optional.of(storeIds)
+                .filter(CollectionUtil::isNotEmpty)
+                .map(storeService::listByIds)
+                .orElse(ListUtil.toList());
+
+        page.setContent(stores);
+        page.setTotalElements(total);
+        return page;
     }
 }

--
Gitblit v1.9.3