|
|
@@ -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));
|
|
|
}
|
|
|
|
|
|
/**
|