Sfoglia il codice sorgente

浏览记录点击后实时排序更新

caojp 1 mese fa
parent
commit
a1ff0a62c1

+ 46 - 14
service/dynamic/src/main/java/com/zhentao/service/impl/BrowseHistoryServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.transaction.annotation.Transactional;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -38,17 +39,30 @@ public class BrowseHistoryServiceImpl implements BrowseHistoryService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void addBrowseHistory(Integer userId, Integer dynamicId, String browseIp, String deviceInfo) {
-        // 先检查是否已经存在相同的浏览记录(避免重复记录)
-        UserBrowseHistory existingRecord = browseHistoryMapper.selectOne(new QueryWrapper<UserBrowseHistory>()
+        // 查询是否已经存在相同的浏览记录(可能有多条历史遗留记录)
+        List<UserBrowseHistory> existingRecords = browseHistoryMapper.selectList(new QueryWrapper<UserBrowseHistory>()
                 .eq("user_id", userId)
-                .eq("dynamic_id", dynamicId));
+                .eq("dynamic_id", dynamicId)
+                .orderByDesc("browse_time"));
         
-        if (existingRecord != null) {
-            // 更新浏览时间
-            existingRecord.setBrowseTime(LocalDateTime.now());
-            existingRecord.setBrowseIp(browseIp);
-            existingRecord.setDeviceInfo(deviceInfo);
-            browseHistoryMapper.updateById(existingRecord);
+        if (existingRecords != null && !existingRecords.isEmpty()) {
+            // 如果存在记录,更新最新的一条记录的浏览时间(使其排在最前面)
+            UserBrowseHistory latestRecord = existingRecords.get(0);
+            latestRecord.setBrowseTime(LocalDateTime.now());
+            latestRecord.setBrowseIp(browseIp);
+            latestRecord.setDeviceInfo(deviceInfo);
+            browseHistoryMapper.updateById(latestRecord);
+            
+            // 如果存在多条记录,删除其他旧记录(保持数据唯一性)
+            if (existingRecords.size() > 1) {
+                List<Integer> idsToDelete = existingRecords.subList(1, existingRecords.size())
+                        .stream()
+                        .map(UserBrowseHistory::getId)
+                        .collect(Collectors.toList());
+                if (!idsToDelete.isEmpty()) {
+                    browseHistoryMapper.deleteBatchIds(idsToDelete);
+                }
+            }
         } else {
             // 添加新的浏览记录
             UserBrowseHistory history = new UserBrowseHistory();
@@ -80,15 +94,33 @@ public class BrowseHistoryServiceImpl implements BrowseHistoryService {
             return new PageResult<DynamicVO>(new java.util.ArrayList<>(), 0L, Long.valueOf(pageNum), Long.valueOf(pageSize));
         }
         
-        // 查询动态详情(关联用户信息)
-        Page<UserDynamics> page = new Page<>(pageNum, pageSize);
-        com.baomidou.mybatisplus.core.metadata.IPage<UserDynamics> pg = userDynamicsMapper.selectDynamicsByIds(page, browseDynamicIds, userId);
+        // 手动分页:计算起始索引和结束索引
+        int total = browseDynamicIds.size();
+        int startIndex = (pageNum - 1) * pageSize;
+        int endIndex = Math.min(startIndex + pageSize, total);
+        
+        if (startIndex >= total) {
+            return new PageResult<DynamicVO>(new java.util.ArrayList<>(), (long)total, Long.valueOf(pageNum), Long.valueOf(pageSize));
+        }
         
-        List<DynamicVO> list = pg.getRecords().stream()
+        // 获取当前页的动态ID列表
+        List<Integer> pageDynamicIds = browseDynamicIds.subList(startIndex, endIndex);
+        
+        // 查询动态详情(关联用户信息)- 不进行分页,因为我们已经手动分页了
+        Page<UserDynamics> page = new Page<>(1, pageDynamicIds.size());
+        com.baomidou.mybatisplus.core.metadata.IPage<UserDynamics> pg = userDynamicsMapper.selectDynamicsByIds(page, pageDynamicIds, userId);
+        
+        // 按照原始ID列表的顺序重新排序(保持浏览时间倒序)
+        Map<Integer, DynamicVO> dynamicMap = pg.getRecords().stream()
                 .map(this::convertToVO)
+                .collect(Collectors.toMap(DynamicVO::getDynamicId, vo -> vo, (v1, v2) -> v1));
+        
+        List<DynamicVO> list = pageDynamicIds.stream()
+                .map(dynamicMap::get)
+                .filter(vo -> vo != null)
                 .collect(Collectors.toList());
         
-        return new PageResult<>(list, pg.getTotal(), pg.getCurrent(), pg.getSize());
+        return new PageResult<>(list, (long)total, Long.valueOf(pageNum), Long.valueOf(pageSize));
     }
     
     /**