zhangchen hace 1 mes
padre
commit
6f1582c9bb

+ 75 - 46
alien-store/src/main/java/shop/alien/store/service/LifeUserDynamicsService.java

@@ -392,68 +392,97 @@ public class LifeUserDynamicsService extends ServiceImpl<LifeUserDynamicsMapper,
     }
 
     public List<LifeUserDynamicsVo> getStoreUserDynamics(String storePhone, String userType, String loginPhone) {
-            LambdaQueryWrapper<LifeUserDynamics> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-            lambdaQueryWrapper.eq(LifeUserDynamics :: getPhoneId, storePhone);
-            List<LifeUserDynamics> lifeUserDynamics = lifeUserDynamicsMapper.selectList(lambdaQueryWrapper);
+            // 动态列表与点赞记录并行查询
+            CompletableFuture<List<LifeUserDynamics>> dynamicsFuture = CompletableFuture.supplyAsync(() -> {
+                LambdaQueryWrapper<LifeUserDynamics> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(LifeUserDynamics::getPhoneId, storePhone);
+                return lifeUserDynamicsMapper.selectList(lambdaQueryWrapper);
+            });
+            CompletableFuture<Set<String>> likeSetFuture = CompletableFuture.supplyAsync(() -> {
+                LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
+                likeWrapper.eq(LifeLikeRecord::getType, "2");
+                if (userType.equals("1")) {
+                    likeWrapper.eq(LifeLikeRecord::getDianzanId, "user_" + loginPhone);
+                } else {
+                    likeWrapper.eq(LifeLikeRecord::getDianzanId, "store_" + loginPhone);
+                }
+                List<LifeLikeRecord> lifeLikeList = lifeLikeRecordMapper.selectList(likeWrapper);
+                return lifeLikeList.stream().map(LifeLikeRecord::getHuifuId).collect(Collectors.toSet());
+            });
+
+            List<LifeUserDynamics> lifeUserDynamics = dynamicsFuture.join();
+            Set<String> likeSet = likeSetFuture.join();
+
             List<LifeUserDynamicsVo> lifeUserDynamicsVos = lifeUserDynamics.stream()
                 .map(dynamics -> {
                     LifeUserDynamicsVo vo = new LifeUserDynamicsVo();
                     BeanUtils.copyProperties(dynamics, vo);
-                    // 特殊字段处理
                     return vo;
                 })
                 .collect(Collectors.toList());
 
-            // 查询我的点赞记录,构建点赞ID列表
-            LambdaQueryWrapper<LifeLikeRecord> likeWrapper = new LambdaQueryWrapper<>();
-            likeWrapper.eq(LifeLikeRecord::getType, "2");
-            if(userType.equals("1")){
-                likeWrapper.eq(LifeLikeRecord::getDianzanId, "user_"+loginPhone);
-            }else{
-                likeWrapper.eq(LifeLikeRecord::getDianzanId, "store_"+loginPhone);
-            }
-            List<LifeLikeRecord> lifeLikeList = lifeLikeRecordMapper.selectList(likeWrapper);
-            List<String> likeList = lifeLikeList.stream().map(LifeLikeRecord::getHuifuId).collect(Collectors.toList());
-         for (LifeUserDynamicsVo vo : lifeUserDynamicsVos) {
-            if (likeList.contains(String.valueOf(vo.getId()))) {
-                vo.setIsLike("1");
-            } else {
-                vo.setIsLike("0");
-            }
-            
-            // 查询用户名称和头像
-            String phoneId = vo.getPhoneId();
-            if (StringUtils.hasText(phoneId)) {
-                if (phoneId.startsWith("user_")) {
-                    // 用户类型
-                    String userPhone = phoneId.substring(5);
-                    LifeUser lifeUser = lifeUserService.getUserByPhone(userPhone);
-                    if (lifeUser != null) {
-                        vo.setUserName(lifeUser.getUserName());
-                        vo.setUserImage(lifeUser.getUserImage());
+            // 收集所有 phoneId,批量查询用户/商户信息,消除 N+1
+            Set<String> userPhones = new HashSet<>();
+            Set<String> storePhones = new HashSet<>();
+            for (LifeUserDynamicsVo vo : lifeUserDynamicsVos) {
+                String phoneId = vo.getPhoneId();
+                if (StringUtils.hasText(phoneId)) {
+                    if (phoneId.startsWith("user_")) {
+                        userPhones.add(phoneId.substring(5));
+                    } else if (phoneId.startsWith("store_")) {
+                        storePhones.add(phoneId.substring(6));
                     }
-                } else if (phoneId.startsWith("store_")) {
-                    // 商户类型
-                    String storePhoneNum = phoneId.substring(6);
-                    StoreUserVo storeUser = storeUserService.getUserByPhone(storePhoneNum);
-                    if (storeUser != null) {
-                        // 查询店铺信息获取店铺名称
-                        if (storeUser.getStoreId() != null) {
-                            StoreInfo storeInfo = storeInfoMapper.selectById(storeUser.getStoreId());
-                            if (storeInfo != null && StringUtils.hasText(storeInfo.getStoreName())) {
-                                vo.setUserName(storeInfo.getStoreName());
+                }
+            }
+
+            // 批量查询 LifeUser、StoreUser
+            Map<String, LifeUser> userByPhoneMap = CollectionUtils.isEmpty(userPhones) ? Collections.emptyMap()
+                    : lifeUserMapper.selectList(new LambdaQueryWrapper<LifeUser>().in(LifeUser::getUserPhone, userPhones))
+                            .stream().collect(Collectors.toMap(LifeUser::getUserPhone, u -> u, (a, b) -> a));
+            List<StoreUser> storeUserList = CollectionUtils.isEmpty(storePhones) ? Collections.emptyList()
+                    : storeUserService.list(new LambdaQueryWrapper<StoreUser>().in(StoreUser::getPhone, storePhones));
+            Map<String, StoreUser> storeUserByPhoneMap = storeUserList.stream().collect(Collectors.toMap(StoreUser::getPhone, u -> u, (a, b) -> a));
+
+            // 批量查询店铺信息
+            List<Integer> storeIds = storeUserList.stream().map(StoreUser::getStoreId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+            Map<Integer, StoreInfo> storeInfoMap = CollectionUtils.isEmpty(storeIds) ? Collections.emptyMap()
+                    : storeInfoMapper.selectBatchIds(storeIds).stream().collect(Collectors.toMap(StoreInfo::getId, s -> s, (a, b) -> a));
+
+            for (LifeUserDynamicsVo vo : lifeUserDynamicsVos) {
+                if (likeSet.contains(String.valueOf(vo.getId()))) {
+                    vo.setIsLike("1");
+                } else {
+                    vo.setIsLike("0");
+                }
+
+                String phoneId = vo.getPhoneId();
+                if (StringUtils.hasText(phoneId)) {
+                    if (phoneId.startsWith("user_")) {
+                        String userPhone = phoneId.substring(5);
+                        LifeUser lifeUser = userByPhoneMap.get(userPhone);
+                        if (lifeUser != null) {
+                            vo.setUserName(lifeUser.getUserName());
+                            vo.setUserImage(lifeUser.getUserImage());
+                        }
+                    } else if (phoneId.startsWith("store_")) {
+                        String storePhoneNum = phoneId.substring(6);
+                        StoreUser storeUser = storeUserByPhoneMap.get(storePhoneNum);
+                        if (storeUser != null) {
+                            if (storeUser.getStoreId() != null) {
+                                StoreInfo storeInfo = storeInfoMap.get(storeUser.getStoreId());
+                                if (storeInfo != null && StringUtils.hasText(storeInfo.getStoreName())) {
+                                    vo.setUserName(storeInfo.getStoreName());
+                                } else {
+                                    vo.setUserName(storeUser.getNickName());
+                                }
                             } else {
                                 vo.setUserName(storeUser.getNickName());
                             }
-                        } else {
-                            vo.setUserName(storeUser.getNickName());
+                            vo.setUserImage(storeUser.getHeadImg());
                         }
-                        // 设置商户头像
-                        vo.setUserImage(storeUser.getHeadImg());
                     }
                 }
             }
-        }
             return lifeUserDynamicsVos;
     }