优化
This commit is contained in:
@@ -2,6 +2,8 @@ package com.emotion.service;
|
||||
|
||||
import com.emotion.dto.request.*;
|
||||
import com.emotion.dto.response.*;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* AI聊天服务接口
|
||||
@@ -114,26 +116,43 @@ public interface AiChatService {
|
||||
*/
|
||||
boolean healthCheck();
|
||||
|
||||
/**
|
||||
* 发送日记内容生成AI总结评论
|
||||
*
|
||||
* @param conversationId 会话ID
|
||||
* @param userMessage 用户日记内容
|
||||
* @param userId 用户ID
|
||||
* @return AI评论内容
|
||||
*/
|
||||
String sendSummaryMessage(String conversationId, String userMessage, String userId);
|
||||
|
||||
/**
|
||||
* 生成用户情绪记录总结
|
||||
* @param userId 用户ID
|
||||
* @return 包含情绪总结等信息的Map
|
||||
*/
|
||||
java.util.Map<String, Object> generateEmotionSummary(String userId);
|
||||
Map<String, Object> generateEmotionSummary(String userId);
|
||||
|
||||
/**
|
||||
* 异步生成用户情绪记录总结
|
||||
* @param userId 用户ID
|
||||
* @return 包含情绪总结等信息的CompletableFuture
|
||||
*/
|
||||
java.util.concurrent.CompletableFuture<java.util.Map<String, Object>> generateEmotionSummaryAsync(String userId);
|
||||
CompletableFuture<Map<String, Object>> generateEmotionSummaryAsync(String userId);
|
||||
|
||||
/**
|
||||
* 发送日记内容生成AI总结评论
|
||||
* @param conversationId 会话ID
|
||||
* @param userMessage 用户日记内容
|
||||
* 生成用户情绪记录总结并返回响应对象
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @return AI评论内容
|
||||
* @return 情绪总结生成响应
|
||||
*/
|
||||
String sendSummaryMessage(String conversationId, String userMessage, String userId);
|
||||
EmotionSummaryGenerateResponse generateEmotionSummaryWithResponse(String userId);
|
||||
|
||||
/**
|
||||
* 获取用户情绪记录总结状态并返回响应对象
|
||||
*
|
||||
* @param userId 用户ID
|
||||
* @return 情绪总结状态响应
|
||||
*/
|
||||
EmotionSummaryStatusResponse getEmotionSummaryStatusWithResponse(String userId);
|
||||
}
|
||||
@@ -32,86 +32,6 @@ public interface EmotionRecordService extends IService<EmotionRecord> {
|
||||
*/
|
||||
IPage<EmotionRecord> getPageByUserId(BasePageRequest request, String userId);
|
||||
|
||||
/**
|
||||
* 根据用户ID分页查询情绪记录(简化版本)
|
||||
*/
|
||||
IPage<EmotionRecord> getByUserIdWithPage(String userId, Integer current, Integer size);
|
||||
|
||||
/**
|
||||
* 根据用户ID查询情绪记录
|
||||
*/
|
||||
List<EmotionRecord> getByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 根据情绪类型查询记录
|
||||
*/
|
||||
List<EmotionRecord> getByEmotionType(String emotionType);
|
||||
|
||||
/**
|
||||
* 根据用户ID和情绪类型查询记录
|
||||
*/
|
||||
List<EmotionRecord> getByUserIdAndEmotionType(String userId, String emotionType);
|
||||
|
||||
/**
|
||||
* 根据时间范围查询情绪记录
|
||||
*/
|
||||
List<EmotionRecord> getByUserIdAndTimeRange(String userId, LocalDateTime startTime, LocalDateTime endTime);
|
||||
|
||||
/**
|
||||
* 根据强度范围查询情绪记录
|
||||
*/
|
||||
List<EmotionRecord> getByIntensityRange(Double minIntensity, Double maxIntensity);
|
||||
|
||||
/**
|
||||
* 统计用户的情绪记录数量
|
||||
*/
|
||||
Long countByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 统计指定情绪类型的记录数量
|
||||
*/
|
||||
Long countByEmotionType(String emotionType);
|
||||
|
||||
/**
|
||||
* 统计用户指定情绪类型的记录数量
|
||||
*/
|
||||
Long countByUserIdAndEmotionType(String userId, String emotionType);
|
||||
|
||||
/**
|
||||
* 查询用户最近的情绪记录
|
||||
*/
|
||||
List<EmotionRecord> getRecentByUserId(String userId, Integer limit);
|
||||
|
||||
/**
|
||||
* 查询用户的平均情绪强度
|
||||
*/
|
||||
Double getAvgIntensityByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 查询用户指定时间段的平均情绪强度
|
||||
*/
|
||||
Double getAvgIntensityByUserIdAndTimeRange(String userId, LocalDateTime startTime, LocalDateTime endTime);
|
||||
|
||||
/**
|
||||
* 查询用户最常见的情绪类型
|
||||
*/
|
||||
String getMostFrequentEmotionByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 查询高强度情绪记录
|
||||
*/
|
||||
List<EmotionRecord> getHighIntensityRecords(Double minIntensity);
|
||||
|
||||
/**
|
||||
* 根据触发因素查询情绪记录
|
||||
*/
|
||||
List<EmotionRecord> getByTrigger(String trigger);
|
||||
|
||||
/**
|
||||
* 根据地点查询情绪记录
|
||||
*/
|
||||
List<EmotionRecord> getByLocation(String location);
|
||||
|
||||
/**
|
||||
* 创建情绪记录
|
||||
*/
|
||||
@@ -154,9 +74,4 @@ public interface EmotionRecordService extends IService<EmotionRecord> {
|
||||
* 获取用户情绪统计
|
||||
*/
|
||||
Map<String, Object> getEmotionStats(String userId, String startDate, String endDate);
|
||||
|
||||
/**
|
||||
* 查询用户最近的情绪记录并返回响应
|
||||
*/
|
||||
List<EmotionRecordResponse> getRecentByUserIdWithResponse(String userId, Integer limit);
|
||||
}
|
||||
@@ -3,6 +3,10 @@ package com.emotion.service;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.growth.GrowthTopicCreateRequest;
|
||||
import com.emotion.dto.request.growth.GrowthTopicUpdateRequest;
|
||||
import com.emotion.dto.response.growth.GrowthTopicResponse;
|
||||
import com.emotion.entity.GrowthTopic;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
@@ -12,7 +16,7 @@ import java.util.List;
|
||||
* 成长话题服务接口
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-23
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
public interface GrowthTopicService extends IService<GrowthTopic> {
|
||||
|
||||
@@ -22,103 +26,33 @@ public interface GrowthTopicService extends IService<GrowthTopic> {
|
||||
IPage<GrowthTopic> getPage(BasePageRequest request);
|
||||
|
||||
/**
|
||||
* 根据分类查询话题
|
||||
* 分页查询成长话题响应
|
||||
*/
|
||||
List<GrowthTopic> getByCategory(String category);
|
||||
PageResult<GrowthTopicResponse> getPageWithResponse(BasePageRequest request);
|
||||
|
||||
/**
|
||||
* 根据难度等级查询话题
|
||||
* 根据ID获取成长话题响应
|
||||
*/
|
||||
List<GrowthTopic> getByDifficultyLevel(String difficultyLevel);
|
||||
|
||||
/**
|
||||
* 根据状态查询话题
|
||||
*/
|
||||
List<GrowthTopic> getByStatus(String status);
|
||||
|
||||
/**
|
||||
* 查询推荐话题
|
||||
*/
|
||||
List<GrowthTopic> getRecommendedTopics(Integer limit);
|
||||
|
||||
/**
|
||||
* 查询热门话题
|
||||
*/
|
||||
List<GrowthTopic> getPopularTopics(Integer limit);
|
||||
|
||||
/**
|
||||
* 查询最新话题
|
||||
*/
|
||||
List<GrowthTopic> getLatestTopics(Integer limit);
|
||||
|
||||
/**
|
||||
* 根据参与人数范围查询话题
|
||||
*/
|
||||
List<GrowthTopic> getByParticipantRange(Integer minParticipants, Integer maxParticipants);
|
||||
|
||||
/**
|
||||
* 根据时间范围查询话题
|
||||
*/
|
||||
List<GrowthTopic> getByTimeRange(LocalDateTime startTime, LocalDateTime endTime);
|
||||
|
||||
/**
|
||||
* 统计指定分类的话题数量
|
||||
*/
|
||||
Long countByCategory(String category);
|
||||
|
||||
/**
|
||||
* 统计指定状态的话题数量
|
||||
*/
|
||||
Long countByStatus(String status);
|
||||
|
||||
/**
|
||||
* 统计指定难度等级的话题数量
|
||||
*/
|
||||
Long countByDifficultyLevel(String difficultyLevel);
|
||||
|
||||
/**
|
||||
* 查询平均参与人数
|
||||
*/
|
||||
Double getAvgParticipantCount();
|
||||
|
||||
/**
|
||||
* 查询指定分类的平均参与人数
|
||||
*/
|
||||
Double getAvgParticipantCountByCategory(String category);
|
||||
|
||||
/**
|
||||
* 根据标签搜索话题
|
||||
*/
|
||||
List<GrowthTopic> searchByTags(String tags);
|
||||
|
||||
/**
|
||||
* 根据关键词搜索话题
|
||||
*/
|
||||
List<GrowthTopic> searchByKeyword(String keyword);
|
||||
|
||||
/**
|
||||
* 更新话题参与人数
|
||||
*/
|
||||
boolean updateParticipantCount(String id, Integer increment);
|
||||
|
||||
/**
|
||||
* 更新话题状态
|
||||
*/
|
||||
boolean updateStatus(String id, String status);
|
||||
|
||||
/**
|
||||
* 查询即将结束的话题
|
||||
*/
|
||||
List<GrowthTopic> getEndingSoonTopics(Integer days);
|
||||
|
||||
/**
|
||||
* 查询长期话题
|
||||
*/
|
||||
List<GrowthTopic> getLongTermTopics();
|
||||
|
||||
GrowthTopicResponse getGrowthTopicResponseById(String id);
|
||||
|
||||
/**
|
||||
* 创建成长话题
|
||||
*/
|
||||
GrowthTopic createGrowthTopic(String title, String description, String category,
|
||||
String difficultyLevel, String tags, LocalDateTime endTime);
|
||||
GrowthTopic createGrowthTopic(String title, String description, String category,
|
||||
String difficultyLevel, String tags, LocalDateTime endTime);
|
||||
|
||||
/**
|
||||
* 创建成长话题并返回响应
|
||||
*/
|
||||
GrowthTopicResponse createGrowthTopicWithResponse(GrowthTopicCreateRequest request);
|
||||
|
||||
/**
|
||||
* 更新成长话题并返回响应
|
||||
*/
|
||||
GrowthTopicResponse updateGrowthTopicWithResponse(GrowthTopicUpdateRequest request);
|
||||
|
||||
/**
|
||||
* 删除成长话题
|
||||
*/
|
||||
boolean deleteGrowthTopic(String id);
|
||||
}
|
||||
|
||||
@@ -3,6 +3,10 @@ package com.emotion.service;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.guest.GuestUserCreateRequest;
|
||||
import com.emotion.dto.request.guest.GuestUserUpdateRequest;
|
||||
import com.emotion.dto.response.guest.GuestUserResponse;
|
||||
import com.emotion.entity.GuestUser;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
@@ -12,7 +16,7 @@ import java.util.List;
|
||||
* 访客用户服务接口
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-23
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
public interface GuestUserService extends IService<GuestUser> {
|
||||
|
||||
@@ -21,6 +25,16 @@ public interface GuestUserService extends IService<GuestUser> {
|
||||
*/
|
||||
IPage<GuestUser> getPage(BasePageRequest request);
|
||||
|
||||
/**
|
||||
* 分页查询访客用户响应
|
||||
*/
|
||||
PageResult<GuestUserResponse> getPageWithResponse(BasePageRequest request);
|
||||
|
||||
/**
|
||||
* 根据ID获取访客用户响应
|
||||
*/
|
||||
GuestUserResponse getGuestUserResponseById(String id);
|
||||
|
||||
/**
|
||||
* 根据设备ID查询访客用户
|
||||
*/
|
||||
@@ -120,4 +134,19 @@ public interface GuestUserService extends IService<GuestUser> {
|
||||
* 创建访客用户
|
||||
*/
|
||||
GuestUser createGuestUser(String deviceId, String ipAddress, String userAgent, String location);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建访客用户并返回响应
|
||||
*/
|
||||
GuestUserResponse createGuestUserWithResponse(GuestUserCreateRequest request);
|
||||
|
||||
/**
|
||||
* 更新访客用户并返回响应
|
||||
*/
|
||||
GuestUserResponse updateGuestUserWithResponse(GuestUserUpdateRequest request);
|
||||
|
||||
/**
|
||||
* 删除访客用户
|
||||
*/
|
||||
boolean deleteGuestUser(String id);
|
||||
}
|
||||
@@ -18,7 +18,7 @@ import java.util.List;
|
||||
* 消息服务接口
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-23
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
public interface MessageService extends IService<Message> {
|
||||
|
||||
@@ -27,6 +27,11 @@ public interface MessageService extends IService<Message> {
|
||||
*/
|
||||
IPage<Message> getPage(BasePageRequest request);
|
||||
|
||||
/**
|
||||
* 分页查询消息响应
|
||||
*/
|
||||
PageResult<MessageResponse> getPageWithResponse(MessagePageRequest request);
|
||||
|
||||
/**
|
||||
* 根据会话ID分页查询消息
|
||||
*/
|
||||
@@ -141,4 +146,24 @@ public interface MessageService extends IService<Message> {
|
||||
* 根据ID获取消息响应(新接口)
|
||||
*/
|
||||
MessageResponse getMessageById(String id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索消息并返回响应
|
||||
*/
|
||||
PageResult<MessageResponse> searchWithResponse(MessageSearchRequest request);
|
||||
|
||||
/**
|
||||
* 获取最近消息并返回响应
|
||||
*/
|
||||
PageResult<MessageResponse> getRecentWithResponse(MessageRecentRequest request);
|
||||
|
||||
/**
|
||||
* 更新消息
|
||||
*/
|
||||
MessageResponse updateMessage(String id, String content);
|
||||
|
||||
/**
|
||||
* 删除消息
|
||||
*/
|
||||
boolean deleteMessage(String id);
|
||||
}
|
||||
@@ -3,6 +3,10 @@ package com.emotion.service;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.reward.RewardCreateRequest;
|
||||
import com.emotion.dto.request.reward.RewardUpdateRequest;
|
||||
import com.emotion.dto.response.reward.RewardResponse;
|
||||
import com.emotion.entity.Reward;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
@@ -12,7 +16,7 @@ import java.util.List;
|
||||
* 奖励服务接口
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-23
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
public interface RewardService extends IService<Reward> {
|
||||
|
||||
@@ -21,11 +25,21 @@ public interface RewardService extends IService<Reward> {
|
||||
*/
|
||||
IPage<Reward> getPage(BasePageRequest request);
|
||||
|
||||
/**
|
||||
* 分页查询奖励响应
|
||||
*/
|
||||
PageResult<RewardResponse> getPageWithResponse(BasePageRequest request);
|
||||
|
||||
/**
|
||||
* 根据用户ID分页查询奖励
|
||||
*/
|
||||
IPage<Reward> getPageByUserId(BasePageRequest request, String userId);
|
||||
|
||||
/**
|
||||
* 根据ID获取奖励响应
|
||||
*/
|
||||
RewardResponse getRewardResponseById(String id);
|
||||
|
||||
/**
|
||||
* 根据用户ID查询奖励
|
||||
*/
|
||||
@@ -139,6 +153,21 @@ public interface RewardService extends IService<Reward> {
|
||||
/**
|
||||
* 创建奖励
|
||||
*/
|
||||
Reward createReward(String userId, String rewardType, Integer points, String source,
|
||||
String description, LocalDateTime expiredTime);
|
||||
}
|
||||
Reward createReward(String userId, String rewardType, String value,
|
||||
String description, String topicId, String achievementId, String icon, String rarity);
|
||||
|
||||
/**
|
||||
* 创建奖励并返回响应
|
||||
*/
|
||||
RewardResponse createRewardWithResponse(RewardCreateRequest request);
|
||||
|
||||
/**
|
||||
* 更新奖励并返回响应
|
||||
*/
|
||||
RewardResponse updateRewardWithResponse(RewardUpdateRequest request);
|
||||
|
||||
/**
|
||||
* 删除奖励
|
||||
*/
|
||||
boolean deleteReward(String id);
|
||||
}
|
||||
@@ -2,12 +2,13 @@ package com.emotion.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.TopicInteractionCreateRequest;
|
||||
import com.emotion.dto.request.TopicInteractionPageRequest;
|
||||
import com.emotion.dto.request.TopicInteractionUpdateRequest;
|
||||
import com.emotion.dto.response.TopicInteractionResponse;
|
||||
import com.emotion.entity.TopicInteraction;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 话题互动服务接口
|
||||
*
|
||||
@@ -19,131 +20,25 @@ public interface TopicInteractionService extends IService<TopicInteraction> {
|
||||
/**
|
||||
* 分页查询话题互动
|
||||
*/
|
||||
IPage<TopicInteraction> getPage(BasePageRequest request);
|
||||
PageResult<TopicInteractionResponse> getPageWithResponse(TopicInteractionPageRequest request);
|
||||
|
||||
/**
|
||||
* 根据话题ID分页查询互动
|
||||
* 根据ID获取话题互动响应对象
|
||||
*/
|
||||
IPage<TopicInteraction> getPageByTopicId(BasePageRequest request, String topicId);
|
||||
|
||||
/**
|
||||
* 根据用户ID分页查询互动
|
||||
*/
|
||||
IPage<TopicInteraction> getPageByUserId(BasePageRequest request, String userId);
|
||||
|
||||
/**
|
||||
* 根据话题ID查询互动
|
||||
*/
|
||||
List<TopicInteraction> getByTopicId(String topicId);
|
||||
|
||||
/**
|
||||
* 根据用户ID查询互动
|
||||
*/
|
||||
List<TopicInteraction> getByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 根据互动类型查询互动
|
||||
*/
|
||||
List<TopicInteraction> getByInteractionType(String interactionType);
|
||||
|
||||
/**
|
||||
* 根据话题ID和互动类型查询互动
|
||||
*/
|
||||
List<TopicInteraction> getByTopicIdAndInteractionType(String topicId, String interactionType);
|
||||
|
||||
/**
|
||||
* 根据用户ID和互动类型查询互动
|
||||
*/
|
||||
List<TopicInteraction> getByUserIdAndInteractionType(String userId, String interactionType);
|
||||
|
||||
/**
|
||||
* 根据话题ID和用户ID查询互动
|
||||
*/
|
||||
List<TopicInteraction> getByTopicIdAndUserId(String topicId, String userId);
|
||||
|
||||
/**
|
||||
* 根据时间范围查询互动
|
||||
*/
|
||||
List<TopicInteraction> getByTimeRange(LocalDateTime startTime, LocalDateTime endTime);
|
||||
|
||||
/**
|
||||
* 统计话题的互动数量
|
||||
*/
|
||||
Long countByTopicId(String topicId);
|
||||
|
||||
/**
|
||||
* 统计用户的互动数量
|
||||
*/
|
||||
Long countByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 统计指定类型的互动数量
|
||||
*/
|
||||
Long countByInteractionType(String interactionType);
|
||||
|
||||
/**
|
||||
* 统计话题指定类型的互动数量
|
||||
*/
|
||||
Long countByTopicIdAndInteractionType(String topicId, String interactionType);
|
||||
|
||||
/**
|
||||
* 统计用户指定类型的互动数量
|
||||
*/
|
||||
Long countByUserIdAndInteractionType(String userId, String interactionType);
|
||||
|
||||
/**
|
||||
* 查询话题最近的互动
|
||||
*/
|
||||
List<TopicInteraction> getRecentByTopicId(String topicId, Integer limit);
|
||||
|
||||
/**
|
||||
* 查询用户最近的互动
|
||||
*/
|
||||
List<TopicInteraction> getRecentByUserId(String userId, Integer limit);
|
||||
|
||||
/**
|
||||
* 查询热门互动(按点赞数排序)
|
||||
*/
|
||||
List<TopicInteraction> getPopularInteractions(Integer limit);
|
||||
|
||||
/**
|
||||
* 查询话题的热门互动
|
||||
*/
|
||||
List<TopicInteraction> getPopularInteractionsByTopicId(String topicId, Integer limit);
|
||||
|
||||
/**
|
||||
* 根据点赞数范围查询互动
|
||||
*/
|
||||
List<TopicInteraction> getByLikesRange(Integer minLikes, Integer maxLikes);
|
||||
|
||||
/**
|
||||
* 查询用户是否已参与话题
|
||||
*/
|
||||
boolean hasUserInteracted(String topicId, String userId);
|
||||
|
||||
/**
|
||||
* 查询用户在话题中的特定互动类型
|
||||
*/
|
||||
TopicInteraction getUserInteractionByType(String topicId, String userId, String interactionType);
|
||||
|
||||
/**
|
||||
* 更新互动点赞数
|
||||
*/
|
||||
boolean updateLikes(String id, Integer increment);
|
||||
|
||||
/**
|
||||
* 根据内容关键词搜索互动
|
||||
*/
|
||||
List<TopicInteraction> searchByContent(String keyword);
|
||||
|
||||
/**
|
||||
* 根据话题ID和内容关键词搜索互动
|
||||
*/
|
||||
List<TopicInteraction> searchByTopicIdAndContent(String topicId, String keyword);
|
||||
TopicInteractionResponse getTopicInteractionResponseById(String id);
|
||||
|
||||
/**
|
||||
* 创建话题互动
|
||||
*/
|
||||
TopicInteraction createTopicInteraction(String topicId, String userId, String interactionType,
|
||||
String content, String attachments);
|
||||
TopicInteractionResponse createTopicInteractionWithResponse(TopicInteractionCreateRequest request);
|
||||
|
||||
/**
|
||||
* 更新话题互动
|
||||
*/
|
||||
TopicInteractionResponse updateTopicInteractionWithResponse(TopicInteractionUpdateRequest request);
|
||||
|
||||
/**
|
||||
* 删除话题互动
|
||||
*/
|
||||
boolean deleteTopicInteraction(String id);
|
||||
}
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
package com.emotion.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.UserCreateRequest;
|
||||
import com.emotion.dto.request.UserPageRequest;
|
||||
import com.emotion.dto.request.UserUpdateRequest;
|
||||
import com.emotion.dto.request.UserProfileUpdateRequest;
|
||||
import com.emotion.dto.response.UserResponse;
|
||||
import com.emotion.entity.User;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 用户服务接口
|
||||
*
|
||||
@@ -17,92 +18,37 @@ import java.util.List;
|
||||
public interface UserService extends IService<User> {
|
||||
|
||||
/**
|
||||
* 分页查询用户
|
||||
* 分页查询用户响应
|
||||
*/
|
||||
IPage<User> getPage(BasePageRequest request);
|
||||
|
||||
PageResult<UserResponse> getPageWithResponse(UserPageRequest request);
|
||||
|
||||
/**
|
||||
* 根据账号查询用户
|
||||
* 根据ID获取用户响应
|
||||
*/
|
||||
User getByAccount(String account);
|
||||
|
||||
UserResponse getUserResponseById(String id);
|
||||
|
||||
/**
|
||||
* 根据用户名查询用户
|
||||
* 创建用户并返回响应
|
||||
*/
|
||||
User getByUsername(String username);
|
||||
|
||||
UserResponse createUserWithResponse(UserCreateRequest request);
|
||||
|
||||
/**
|
||||
* 根据邮箱查询用户
|
||||
* 更新用户并返回响应
|
||||
*/
|
||||
User getByEmail(String email);
|
||||
|
||||
UserResponse updateUserWithResponse(UserUpdateRequest request);
|
||||
|
||||
/**
|
||||
* 根据手机号查询用户
|
||||
* 更新当前用户个人资料并返回响应
|
||||
*/
|
||||
User getByPhone(String phone);
|
||||
|
||||
UserResponse updateCurrentUserProfileWithResponse(UserProfileUpdateRequest request);
|
||||
|
||||
/**
|
||||
* 根据第三方平台信息查询用户
|
||||
* 获取当前用户个人资料并返回响应
|
||||
*/
|
||||
User getByThirdParty(String thirdPartyId, String thirdPartyType);
|
||||
|
||||
UserResponse getCurrentUserProfileWithResponse();
|
||||
|
||||
/**
|
||||
* 根据状态查询用户列表
|
||||
* 删除用户
|
||||
*/
|
||||
List<User> getByStatus(Integer status);
|
||||
|
||||
/**
|
||||
* 根据会员等级查询用户列表
|
||||
*/
|
||||
List<User> getByMemberLevel(String memberLevel);
|
||||
|
||||
/**
|
||||
* 查询活跃用户(最近N天有活动)
|
||||
*/
|
||||
List<User> getActiveUsers(Integer days);
|
||||
|
||||
/**
|
||||
* 查询新注册用户(最近N天注册)
|
||||
*/
|
||||
List<User> getNewUsers(Integer days);
|
||||
|
||||
/**
|
||||
* 更新用户最后活跃时间
|
||||
*/
|
||||
boolean updateLastActiveTime(String userId, LocalDateTime lastActiveTime);
|
||||
|
||||
/**
|
||||
* 更新用户状态
|
||||
*/
|
||||
boolean updateStatus(String userId, Integer status);
|
||||
|
||||
/**
|
||||
* 更新用户使用天数
|
||||
*/
|
||||
boolean updateTotalDays(String userId, Integer totalDays);
|
||||
|
||||
/**
|
||||
* 统计指定状态的用户数量
|
||||
*/
|
||||
Long countByStatus(Integer status);
|
||||
|
||||
/**
|
||||
* 统计指定会员等级的用户数量
|
||||
*/
|
||||
Long countByMemberLevel(String memberLevel);
|
||||
|
||||
/**
|
||||
* 创建用户
|
||||
*/
|
||||
User createUser(String account, String username, String password, String email, String phone);
|
||||
|
||||
/**
|
||||
* 验证用户密码
|
||||
*/
|
||||
boolean validatePassword(String userId, String password);
|
||||
|
||||
/**
|
||||
* 更新用户密码
|
||||
*/
|
||||
boolean updatePassword(String userId, String newPassword);
|
||||
}
|
||||
boolean deleteUser(String id);
|
||||
}
|
||||
@@ -1,11 +1,14 @@
|
||||
package com.emotion.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.UserStatsCreateRequest;
|
||||
import com.emotion.dto.request.UserStatsIncrementRequest;
|
||||
import com.emotion.dto.request.UserStatsPageRequest;
|
||||
import com.emotion.dto.request.UserStatsUpdateValueRequest;
|
||||
import com.emotion.dto.response.UserStatsResponse;
|
||||
import com.emotion.entity.UserStats;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -17,84 +20,19 @@ import java.util.List;
|
||||
public interface UserStatsService extends IService<UserStats> {
|
||||
|
||||
/**
|
||||
* 分页查询用户统计
|
||||
* 分页查询用户统计响应
|
||||
*/
|
||||
IPage<UserStats> getPage(BasePageRequest request);
|
||||
|
||||
/**
|
||||
* 根据用户ID查询统计信息
|
||||
*/
|
||||
UserStats getByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 根据统计类型查询统计信息
|
||||
*/
|
||||
List<UserStats> getByStatsType(String statsType);
|
||||
|
||||
/**
|
||||
* 根据用户ID和统计类型查询统计信息
|
||||
*/
|
||||
UserStats getByUserIdAndStatsType(String userId, String statsType);
|
||||
|
||||
/**
|
||||
* 根据时间范围查询统计信息
|
||||
*/
|
||||
List<UserStats> getByTimeRange(LocalDateTime startTime, LocalDateTime endTime);
|
||||
|
||||
/**
|
||||
* 根据数值范围查询统计信息
|
||||
*/
|
||||
List<UserStats> getByValueRange(Double minValue, Double maxValue);
|
||||
|
||||
/**
|
||||
* 统计指定类型的记录数量
|
||||
*/
|
||||
Long countByStatsType(String statsType);
|
||||
|
||||
/**
|
||||
* 查询平均统计值
|
||||
*/
|
||||
Double getAvgValueByStatsType(String statsType);
|
||||
|
||||
/**
|
||||
* 查询最大统计值
|
||||
*/
|
||||
Double getMaxValueByStatsType(String statsType);
|
||||
|
||||
/**
|
||||
* 查询最小统计值
|
||||
*/
|
||||
Double getMinValueByStatsType(String statsType);
|
||||
|
||||
/**
|
||||
* 查询用户的所有统计类型
|
||||
*/
|
||||
List<UserStats> getAllStatsByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 查询排名前N的用户统计
|
||||
*/
|
||||
List<UserStats> getTopUsersByStatsType(String statsType, Integer limit);
|
||||
|
||||
/**
|
||||
* 查询用户在指定统计类型中的排名
|
||||
*/
|
||||
Long getUserRankByStatsType(String userId, String statsType);
|
||||
|
||||
PageResult<UserStatsResponse> getPageWithResponse(UserStatsPageRequest request);
|
||||
|
||||
/**
|
||||
* 更新用户统计值
|
||||
*/
|
||||
boolean updateStatsValue(String userId, String statsType, Double value);
|
||||
boolean updateStatsValue(UserStatsUpdateValueRequest request);
|
||||
|
||||
/**
|
||||
* 增加用户统计值
|
||||
*/
|
||||
boolean incrementStatsValue(String userId, String statsType, Double increment);
|
||||
|
||||
/**
|
||||
* 批量更新用户统计
|
||||
*/
|
||||
boolean batchUpdateStats(String userId, List<UserStats> statsList);
|
||||
boolean incrementStatsValue(UserStatsIncrementRequest request);
|
||||
|
||||
/**
|
||||
* 重新计算用户统计
|
||||
@@ -107,22 +45,12 @@ public interface UserStatsService extends IService<UserStats> {
|
||||
boolean recalculateAllUserStats();
|
||||
|
||||
/**
|
||||
* 根据周期查询统计信息
|
||||
* 创建或更新用户统计响应
|
||||
*/
|
||||
List<UserStats> getByPeriod(String period);
|
||||
|
||||
/**
|
||||
* 根据用户ID和周期查询统计信息
|
||||
*/
|
||||
List<UserStats> getByUserIdAndPeriod(String userId, String period);
|
||||
|
||||
/**
|
||||
* 创建或更新用户统计
|
||||
*/
|
||||
UserStats createOrUpdateUserStats(String userId, String statsType, Double value, String period);
|
||||
|
||||
UserStatsResponse createOrUpdateUserStatsWithResponse(UserStatsCreateRequest request);
|
||||
|
||||
/**
|
||||
* 删除过期的统计数据
|
||||
*/
|
||||
boolean deleteExpiredStats(Integer days);
|
||||
}
|
||||
}
|
||||
@@ -655,6 +655,77 @@ public class AiChatServiceImpl implements AiChatService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public EmotionSummaryGenerateResponse generateEmotionSummaryWithResponse(String userId) {
|
||||
log.info("生成用户情绪记录总结: userId={}", userId);
|
||||
|
||||
// 调用原有的generateEmotionSummary方法
|
||||
Map<String, Object> result = generateEmotionSummary(userId);
|
||||
|
||||
// 转换为响应对象
|
||||
return convertToGenerateResponse(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EmotionSummaryStatusResponse getEmotionSummaryStatusWithResponse(String userId) {
|
||||
log.info("获取用户情绪记录总结状态: userId={}", userId);
|
||||
|
||||
// 构建状态信息
|
||||
Map<String, Object> statusInfo = Map.of(
|
||||
"userId", userId,
|
||||
"canGenerate", true,
|
||||
"message", "可以生成情绪记录总结");
|
||||
|
||||
// 转换为响应对象
|
||||
return convertToStatusResponse(statusInfo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为生成响应对象
|
||||
*/
|
||||
private EmotionSummaryGenerateResponse convertToGenerateResponse(Map<String, Object> result) {
|
||||
EmotionSummaryGenerateResponse response = new EmotionSummaryGenerateResponse();
|
||||
response.setSuccess((Boolean) result.get("success"));
|
||||
response.setMessage((String) result.get("message"));
|
||||
|
||||
if (result.containsKey("emotionRecord") && result.get("emotionRecord") != null) {
|
||||
// 从实际的EmotionRecord对象获取ID
|
||||
Object emotionRecord = result.get("emotionRecord");
|
||||
if (emotionRecord instanceof EmotionRecord) {
|
||||
response.setEmotionRecordId(((EmotionRecord) emotionRecord).getId());
|
||||
}
|
||||
}
|
||||
|
||||
if (result.containsKey("analysisResult") && result.get("analysisResult") != null) {
|
||||
// 从实际的EmotionAnalysis对象获取ID
|
||||
Object analysisResult = result.get("analysisResult");
|
||||
if (analysisResult instanceof EmotionAnalysis) {
|
||||
response.setEmotionAnalysisId(((EmotionAnalysis) analysisResult).getId());
|
||||
}
|
||||
}
|
||||
|
||||
if (result.containsKey("messageCount")) {
|
||||
response.setMessageCount((Integer) result.get("messageCount"));
|
||||
}
|
||||
|
||||
if (result.containsKey("recordDate")) {
|
||||
response.setRecordDate(result.get("recordDate").toString());
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为状态响应对象
|
||||
*/
|
||||
private EmotionSummaryStatusResponse convertToStatusResponse(Map<String, Object> statusInfo) {
|
||||
EmotionSummaryStatusResponse response = new EmotionSummaryStatusResponse();
|
||||
response.setUserId((String) statusInfo.get("userId"));
|
||||
response.setCanGenerate((Boolean) statusInfo.get("canGenerate"));
|
||||
response.setMessage((String) statusInfo.get("message"));
|
||||
return response;
|
||||
}
|
||||
|
||||
public boolean isServiceAvailable() {
|
||||
try {
|
||||
// 简单的健康检查
|
||||
|
||||
@@ -67,172 +67,6 @@ public class EmotionRecordServiceImpl extends ServiceImpl<EmotionRecordMapper, E
|
||||
return this.page(page, wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getByUserId(String userId) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getByEmotionType(String emotionType) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getEmotionType, emotionType)
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getByUserIdAndEmotionType(String userId, String emotionType) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.eq(EmotionRecord::getEmotionType, emotionType)
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getByUserIdAndTimeRange(String userId, LocalDateTime startTime, LocalDateTime endTime) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.between(EmotionRecord::getCreateTime, startTime, endTime)
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getByIntensityRange(Double minIntensity, Double maxIntensity) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.between(EmotionRecord::getIntensity, BigDecimal.valueOf(minIntensity), BigDecimal.valueOf(maxIntensity))
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getIntensity);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByUserId(String userId) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.eq(EmotionRecord::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByEmotionType(String emotionType) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getEmotionType, emotionType)
|
||||
.eq(EmotionRecord::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByUserIdAndEmotionType(String userId, String emotionType) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.eq(EmotionRecord::getEmotionType, emotionType)
|
||||
.eq(EmotionRecord::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getRecentByUserId(String userId, Integer limit) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getCreateTime)
|
||||
.last("LIMIT " + limit);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAvgIntensityByUserId(String userId) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.eq(EmotionRecord::getIsDeleted, 0);
|
||||
|
||||
List<EmotionRecord> records = this.list(wrapper);
|
||||
if (records.isEmpty()) {
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
double sum = records.stream()
|
||||
.mapToDouble(record -> record.getIntensity().doubleValue())
|
||||
.sum();
|
||||
|
||||
return sum / records.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAvgIntensityByUserIdAndTimeRange(String userId, LocalDateTime startTime, LocalDateTime endTime) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.between(EmotionRecord::getCreateTime, startTime, endTime)
|
||||
.eq(EmotionRecord::getIsDeleted, 0);
|
||||
|
||||
List<EmotionRecord> records = this.list(wrapper);
|
||||
if (records.isEmpty()) {
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
double sum = records.stream()
|
||||
.mapToDouble(record -> record.getIntensity().doubleValue())
|
||||
.sum();
|
||||
|
||||
return sum / records.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMostFrequentEmotionByUserId(String userId) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.eq(EmotionRecord::getIsDeleted, 0);
|
||||
|
||||
List<EmotionRecord> records = this.list(wrapper);
|
||||
if (records.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return records.stream()
|
||||
.collect(Collectors.groupingBy(EmotionRecord::getEmotionType, Collectors.counting()))
|
||||
.entrySet()
|
||||
.stream()
|
||||
.max(Map.Entry.comparingByValue())
|
||||
.map(Map.Entry::getKey)
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getHighIntensityRecords(Double minIntensity) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.ge(EmotionRecord::getIntensity, BigDecimal.valueOf(minIntensity))
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getIntensity);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getByTrigger(String trigger) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.like(EmotionRecord::getTriggers, trigger)
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecord> getByLocation(String location) {
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(EmotionRecord::getLocation, location)
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EmotionRecord createEmotionRecord(String userId, String emotionType, Double intensity,
|
||||
String trigger, String location, String notes) {
|
||||
@@ -250,18 +84,6 @@ public class EmotionRecordServiceImpl extends ServiceImpl<EmotionRecordMapper, E
|
||||
return record;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<EmotionRecord> getByUserIdWithPage(String userId, Integer current, Integer size) {
|
||||
Page<EmotionRecord> page = new Page<>(current, size);
|
||||
LambdaQueryWrapper<EmotionRecord> wrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
wrapper.eq(EmotionRecord::getUserId, userId)
|
||||
.eq(EmotionRecord::getIsDeleted, 0)
|
||||
.orderByDesc(EmotionRecord::getCreateTime);
|
||||
|
||||
return this.page(page, wrapper);
|
||||
}
|
||||
|
||||
// 新增的方法实现
|
||||
|
||||
@Override
|
||||
@@ -457,14 +279,6 @@ public class EmotionRecordServiceImpl extends ServiceImpl<EmotionRecordMapper, E
|
||||
return stats;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<EmotionRecordResponse> getRecentByUserIdWithResponse(String userId, Integer limit) {
|
||||
List<EmotionRecord> records = getRecentByUserId(userId, limit);
|
||||
return records.stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为响应对象
|
||||
*/
|
||||
|
||||
+102
-138
@@ -5,9 +5,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.growth.GrowthTopicCreateRequest;
|
||||
import com.emotion.dto.request.growth.GrowthTopicUpdateRequest;
|
||||
import com.emotion.dto.response.growth.GrowthTopicResponse;
|
||||
import com.emotion.entity.GrowthTopic;
|
||||
import com.emotion.mapper.GrowthTopicMapper;
|
||||
import com.emotion.service.GrowthTopicService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@@ -15,12 +20,13 @@ import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 成长话题服务实现类
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-24
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@Service
|
||||
public class GrowthTopicServiceImpl extends ServiceImpl<GrowthTopicMapper, GrowthTopic> implements GrowthTopicService {
|
||||
@@ -53,149 +59,31 @@ public class GrowthTopicServiceImpl extends ServiceImpl<GrowthTopicMapper, Growt
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getByCategory(String category) {
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(GrowthTopic::getCategory, category)
|
||||
.eq(GrowthTopic::getIsDeleted, 0)
|
||||
.orderByDesc(GrowthTopic::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
public PageResult<GrowthTopicResponse> getPageWithResponse(BasePageRequest request) {
|
||||
IPage<GrowthTopic> page = getPage(request);
|
||||
List<GrowthTopicResponse> responses = page.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
PageResult<GrowthTopicResponse> pageResult = new PageResult<>();
|
||||
pageResult.setRecords(responses);
|
||||
pageResult.setCurrent(page.getCurrent());
|
||||
pageResult.setSize(page.getSize());
|
||||
pageResult.setTotal(page.getTotal());
|
||||
pageResult.setPages(page.getPages());
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getByDifficultyLevel(String difficultyLevel) {
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(GrowthTopic::getDifficulty, difficultyLevel)
|
||||
.eq(GrowthTopic::getIsDeleted, 0)
|
||||
.orderByDesc(GrowthTopic::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
public GrowthTopicResponse getGrowthTopicResponseById(String id) {
|
||||
GrowthTopic topic = this.getById(id);
|
||||
if (topic == null || topic.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
return convertToResponse(topic);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getByStatus(String status) {
|
||||
// GrowthTopic实体中没有status字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getRecommendedTopics(Integer limit) {
|
||||
// GrowthTopic实体中没有isRecommended字段,暂时返回最新话题
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(GrowthTopic::getIsDeleted, 0)
|
||||
.orderByDesc(GrowthTopic::getCreateTime)
|
||||
.last("LIMIT " + limit);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getPopularTopics(Integer limit) {
|
||||
// GrowthTopic实体中没有participantCount字段,暂时返回最新话题
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(GrowthTopic::getIsDeleted, 0)
|
||||
.orderByDesc(GrowthTopic::getCreateTime)
|
||||
.last("LIMIT " + limit);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getLatestTopics(Integer limit) {
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(GrowthTopic::getIsDeleted, 0)
|
||||
.orderByDesc(GrowthTopic::getCreateTime)
|
||||
.last("LIMIT " + limit);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getByParticipantRange(Integer minParticipants, Integer maxParticipants) {
|
||||
// GrowthTopic实体中没有participantCount字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getByTimeRange(LocalDateTime startTime, LocalDateTime endTime) {
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.between(GrowthTopic::getCreateTime, startTime, endTime)
|
||||
.eq(GrowthTopic::getIsDeleted, 0)
|
||||
.orderByDesc(GrowthTopic::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByCategory(String category) {
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(GrowthTopic::getCategory, category)
|
||||
.eq(GrowthTopic::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByStatus(String status) {
|
||||
// GrowthTopic实体中没有status字段,暂时返回0
|
||||
return 0L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByDifficultyLevel(String difficultyLevel) {
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(GrowthTopic::getDifficulty, difficultyLevel)
|
||||
.eq(GrowthTopic::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAvgParticipantCount() {
|
||||
// 这里需要自定义SQL查询平均值,暂时返回0
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAvgParticipantCountByCategory(String category) {
|
||||
// 这里需要自定义SQL查询平均值,暂时返回0
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> searchByTags(String tags) {
|
||||
// GrowthTopic实体中没有tags字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> searchByKeyword(String keyword) {
|
||||
LambdaQueryWrapper<GrowthTopic> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.and(w -> w.like(GrowthTopic::getTitle, keyword)
|
||||
.or().like(GrowthTopic::getDescription, keyword))
|
||||
.eq(GrowthTopic::getIsDeleted, 0)
|
||||
.orderByDesc(GrowthTopic::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateParticipantCount(String id, Integer increment) {
|
||||
// GrowthTopic实体中没有participantCount字段,暂时返回false
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateStatus(String id, String status) {
|
||||
// GrowthTopic实体中没有status字段,暂时返回false
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getEndingSoonTopics(Integer days) {
|
||||
// GrowthTopic实体中没有endTime字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GrowthTopic> getLongTermTopics() {
|
||||
// GrowthTopic实体中没有endTime字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrowthTopic createGrowthTopic(String title, String description, String category,
|
||||
public GrowthTopic createGrowthTopic(String title, String description, String category,
|
||||
String difficultyLevel, String tags, LocalDateTime endTime) {
|
||||
GrowthTopic topic = new GrowthTopic();
|
||||
topic.setTitle(title);
|
||||
@@ -211,4 +99,80 @@ public class GrowthTopicServiceImpl extends ServiceImpl<GrowthTopicMapper, Growt
|
||||
this.save(topic);
|
||||
return topic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrowthTopicResponse createGrowthTopicWithResponse(GrowthTopicCreateRequest request) {
|
||||
GrowthTopic topic = createGrowthTopic(
|
||||
request.getTitle(),
|
||||
request.getDescription(),
|
||||
request.getCategory(),
|
||||
request.getDifficultyLevel(),
|
||||
request.getTags(),
|
||||
request.getEndTime());
|
||||
return convertToResponse(topic);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GrowthTopicResponse updateGrowthTopicWithResponse(GrowthTopicUpdateRequest request) {
|
||||
GrowthTopic topic = this.getById(request.getId());
|
||||
if (topic == null || topic.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 只更新非空字段
|
||||
if (StringUtils.hasText(request.getTitle())) {
|
||||
topic.setTitle(request.getTitle());
|
||||
}
|
||||
if (StringUtils.hasText(request.getDescription())) {
|
||||
topic.setDescription(request.getDescription());
|
||||
topic.setContent(request.getDescription());
|
||||
}
|
||||
if (StringUtils.hasText(request.getCategory())) {
|
||||
topic.setCategory(request.getCategory());
|
||||
}
|
||||
if (StringUtils.hasText(request.getDifficultyLevel())) {
|
||||
topic.setDifficulty(request.getDifficultyLevel());
|
||||
}
|
||||
if (StringUtils.hasText(request.getTags())) {
|
||||
// GrowthTopic实体中没有tags字段,暂时忽略
|
||||
}
|
||||
if (request.getEndTime() != null) {
|
||||
// GrowthTopic实体中没有endTime字段,暂时忽略
|
||||
}
|
||||
|
||||
this.updateById(topic);
|
||||
return convertToResponse(topic);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteGrowthTopic(String id) {
|
||||
GrowthTopic topic = this.getById(id);
|
||||
if (topic == null || topic.getIsDeleted() == 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 逻辑删除
|
||||
topic.setIsDeleted(1);
|
||||
return this.updateById(topic);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将实体转换为响应对象
|
||||
*/
|
||||
private GrowthTopicResponse convertToResponse(GrowthTopic topic) {
|
||||
if (topic == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
GrowthTopicResponse response = new GrowthTopicResponse();
|
||||
BeanUtils.copyProperties(topic, response);
|
||||
response.setId(topic.getId());
|
||||
if (topic.getCreateTime() != null) {
|
||||
response.setCreateTime(topic.getCreateTime().toString());
|
||||
}
|
||||
if (topic.getUpdateTime() != null) {
|
||||
response.setUpdateTime(topic.getUpdateTime().toString());
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
@@ -5,21 +5,27 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.guest.GuestUserCreateRequest;
|
||||
import com.emotion.dto.request.guest.GuestUserUpdateRequest;
|
||||
import com.emotion.dto.response.guest.GuestUserResponse;
|
||||
import com.emotion.entity.GuestUser;
|
||||
import com.emotion.mapper.GuestUserMapper;
|
||||
import com.emotion.service.GuestUserService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 访客用户服务实现类
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-24
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@Service
|
||||
public class GuestUserServiceImpl extends ServiceImpl<GuestUserMapper, GuestUser> implements GuestUserService {
|
||||
@@ -37,6 +43,30 @@ public class GuestUserServiceImpl extends ServiceImpl<GuestUserMapper, GuestUser
|
||||
return this.page(page, wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<GuestUserResponse> getPageWithResponse(BasePageRequest request) {
|
||||
IPage<GuestUser> page = getPage(request);
|
||||
List<GuestUserResponse> responses = page.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
PageResult<GuestUserResponse> pageResult = new PageResult<>();
|
||||
pageResult.setRecords(responses);
|
||||
pageResult.setCurrent(page.getCurrent());
|
||||
pageResult.setSize(page.getSize());
|
||||
pageResult.setTotal(page.getTotal());
|
||||
pageResult.setPages(page.getPages());
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuestUserResponse getGuestUserResponseById(String id) {
|
||||
GuestUser guestUser = this.getById(id);
|
||||
if (guestUser == null || guestUser.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
return convertToResponse(guestUser);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuestUser getByDeviceId(String deviceId) {
|
||||
LambdaQueryWrapper<GuestUser> wrapper = new LambdaQueryWrapper<>();
|
||||
@@ -219,4 +249,68 @@ public class GuestUserServiceImpl extends ServiceImpl<GuestUserMapper, GuestUser
|
||||
this.save(guestUser);
|
||||
return guestUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuestUserResponse createGuestUserWithResponse(GuestUserCreateRequest request) {
|
||||
GuestUser guestUser = createGuestUser(
|
||||
request.getDeviceId(),
|
||||
request.getIpAddress(),
|
||||
request.getUserAgent(),
|
||||
request.getLocation());
|
||||
return convertToResponse(guestUser);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GuestUserResponse updateGuestUserWithResponse(GuestUserUpdateRequest request) {
|
||||
GuestUser guestUser = this.getById(request.getId());
|
||||
if (guestUser == null || guestUser.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 只更新非空字段
|
||||
if (StringUtils.hasText(request.getNickname())) {
|
||||
guestUser.setNickname(request.getNickname());
|
||||
}
|
||||
if (StringUtils.hasText(request.getAvatar())) {
|
||||
guestUser.setAvatar(request.getAvatar());
|
||||
}
|
||||
if (StringUtils.hasText(request.getLocation())) {
|
||||
guestUser.setLocation(request.getLocation());
|
||||
}
|
||||
|
||||
this.updateById(guestUser);
|
||||
return convertToResponse(guestUser);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteGuestUser(String id) {
|
||||
GuestUser guestUser = this.getById(id);
|
||||
if (guestUser == null || guestUser.getIsDeleted() == 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 逻辑删除
|
||||
guestUser.setIsDeleted(1);
|
||||
return this.updateById(guestUser);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将实体转换为响应对象
|
||||
*/
|
||||
private GuestUserResponse convertToResponse(GuestUser guestUser) {
|
||||
if (guestUser == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
GuestUserResponse response = new GuestUserResponse();
|
||||
BeanUtils.copyProperties(guestUser, response);
|
||||
response.setId(guestUser.getId());
|
||||
if (guestUser.getCreateTime() != null) {
|
||||
response.setCreateTime(guestUser.getCreateTime().toString());
|
||||
}
|
||||
if (guestUser.getUpdateTime() != null) {
|
||||
response.setUpdateTime(guestUser.getUpdateTime().toString());
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ import java.util.stream.Collectors;
|
||||
* 消息服务实现类
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-24
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@@ -50,6 +50,16 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> impl
|
||||
return this.page(page, wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<MessageResponse> getPageWithResponse(MessagePageRequest request) {
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
|
||||
// 调用用户消息分页查询方法
|
||||
PageResult<MessageResponse> pageResult = getUserMessagesWithPage(request);
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<Message> getPageByConversationId(BasePageRequest request, String conversationId) {
|
||||
Page<Message> page = new Page<>(request.getCurrent(), request.getSize());
|
||||
@@ -218,18 +228,13 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> impl
|
||||
|
||||
@Override
|
||||
public PageResult<MessageResponse> getUserMessagesWithPage(MessagePageRequest request) {
|
||||
log.info("获取用户消息分页: current={}, size={}", request.getCurrent(), request.getSize());
|
||||
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
log.info("当前用户ID: {}", userId);
|
||||
|
||||
// 调用原有的分页查询方法
|
||||
IPage<Message> page = getByUserIdWithPage(userId, Math.toIntExact(request.getCurrent()),
|
||||
Math.toIntExact(request.getSize()));
|
||||
|
||||
log.info("查询结果: total={}, records={}", page.getTotal(), page.getRecords().size());
|
||||
|
||||
// 转换为响应对象
|
||||
List<MessageResponse> responses = page.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
@@ -248,15 +253,11 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> impl
|
||||
|
||||
@Override
|
||||
public List<MessageResponse> searchUserMessages(MessageSearchRequest request) {
|
||||
log.info("搜索用户消息: keyword={}, limit={}", request.getKeyword(), request.getLimit());
|
||||
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
log.info("当前用户ID: {}", userId);
|
||||
|
||||
// 调用原有的搜索方法
|
||||
List<Message> messages = searchByUserIdAndKeyword(userId, request.getKeyword(), request.getLimit());
|
||||
log.info("搜索结果: {} 条消息", messages.size());
|
||||
|
||||
// 转换为响应对象
|
||||
return messages.stream()
|
||||
@@ -266,15 +267,11 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> impl
|
||||
|
||||
@Override
|
||||
public List<MessageResponse> getUserRecentMessages(MessageRecentRequest request) {
|
||||
log.info("获取用户最近消息: limit={}", request.getLimit());
|
||||
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
log.info("当前用户ID: {}", userId);
|
||||
|
||||
// 调用原有的获取最近消息方法
|
||||
List<Message> messages = getRecentByUserId(userId, request.getLimit());
|
||||
log.info("查询结果: {} 条最近消息", messages.size());
|
||||
|
||||
// 转换为响应对象
|
||||
return messages.stream()
|
||||
@@ -284,11 +281,8 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> impl
|
||||
|
||||
@Override
|
||||
public MessageResponse createMessageFromRequest(MessageCreateRequest request) {
|
||||
log.info("根据请求创建消息: conversationId={}", request.getConversationId());
|
||||
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
log.info("当前用户ID: {}", userId);
|
||||
|
||||
// 构建消息对象
|
||||
Message message = new Message();
|
||||
@@ -300,7 +294,6 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> impl
|
||||
|
||||
// 调用原有的创建方法
|
||||
Message savedMessage = createMessage(message);
|
||||
log.info("创建消息成功: messageId={}", savedMessage.getId());
|
||||
|
||||
// 转换为响应对象
|
||||
return convertToResponse(savedMessage);
|
||||
@@ -308,11 +301,8 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> impl
|
||||
|
||||
@Override
|
||||
public MessageResponse getMessageById(String id) {
|
||||
log.info("根据ID获取消息: id={}", id);
|
||||
|
||||
Message message = getById(id);
|
||||
if (message == null) {
|
||||
log.warn("消息不存在: id={}", id);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -320,6 +310,95 @@ public class MessageServiceImpl extends ServiceImpl<MessageMapper, Message> impl
|
||||
return convertToResponse(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<MessageResponse> searchWithResponse(MessageSearchRequest request) {
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
|
||||
// 构建分页对象
|
||||
Page<Message> page = new Page<>(1L, request.getLimit().longValue());
|
||||
|
||||
// 调用搜索方法
|
||||
List<Message> messages = searchByUserIdAndKeyword(userId, request.getKeyword(), request.getLimit());
|
||||
|
||||
// 设置分页信息
|
||||
page.setRecords(messages);
|
||||
page.setTotal(messages.size());
|
||||
|
||||
// 转换为响应对象
|
||||
List<MessageResponse> responses = messages.stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 构建分页结果
|
||||
PageResult<MessageResponse> pageResult = new PageResult<>();
|
||||
pageResult.setRecords(responses);
|
||||
pageResult.setCurrent(page.getCurrent());
|
||||
pageResult.setSize(page.getSize());
|
||||
pageResult.setTotal(page.getTotal());
|
||||
pageResult.setPages(page.getPages());
|
||||
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<MessageResponse> getRecentWithResponse(MessageRecentRequest request) {
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
|
||||
// 构建分页对象
|
||||
Page<Message> page = new Page<>(1L, request.getLimit().longValue());
|
||||
|
||||
// 调用获取最近消息方法
|
||||
List<Message> messages = getRecentByUserId(userId, request.getLimit());
|
||||
|
||||
// 设置分页信息
|
||||
page.setRecords(messages);
|
||||
page.setTotal(messages.size());
|
||||
|
||||
// 转换为响应对象
|
||||
List<MessageResponse> responses = messages.stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 构建分页结果
|
||||
PageResult<MessageResponse> pageResult = new PageResult<>();
|
||||
pageResult.setRecords(responses);
|
||||
pageResult.setCurrent(page.getCurrent());
|
||||
pageResult.setSize(page.getSize());
|
||||
pageResult.setTotal(page.getTotal());
|
||||
pageResult.setPages(page.getPages());
|
||||
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageResponse updateMessage(String id, String content) {
|
||||
Message message = this.getById(id);
|
||||
if (message == null || message.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 更新内容
|
||||
message.setContent(content);
|
||||
this.updateById(message);
|
||||
|
||||
// 转换为响应对象
|
||||
return convertToResponse(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteMessage(String id) {
|
||||
Message message = this.getById(id);
|
||||
if (message == null || message.getIsDeleted() == 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 逻辑删除
|
||||
message.setIsDeleted(1);
|
||||
return this.updateById(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为响应对象
|
||||
*/
|
||||
|
||||
@@ -6,21 +6,27 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.reward.RewardCreateRequest;
|
||||
import com.emotion.dto.request.reward.RewardUpdateRequest;
|
||||
import com.emotion.dto.response.reward.RewardResponse;
|
||||
import com.emotion.entity.Reward;
|
||||
import com.emotion.mapper.RewardMapper;
|
||||
import com.emotion.service.RewardService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 奖励服务实现类
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-24
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@Service
|
||||
public class RewardServiceImpl extends ServiceImpl<RewardMapper, Reward> implements RewardService {
|
||||
@@ -52,6 +58,21 @@ public class RewardServiceImpl extends ServiceImpl<RewardMapper, Reward> impleme
|
||||
return this.page(page, wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<RewardResponse> getPageWithResponse(BasePageRequest request) {
|
||||
IPage<Reward> page = getPage(request);
|
||||
List<RewardResponse> responses = page.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
PageResult<RewardResponse> pageResult = new PageResult<>();
|
||||
pageResult.setRecords(responses);
|
||||
pageResult.setCurrent(page.getCurrent());
|
||||
pageResult.setSize(page.getSize());
|
||||
pageResult.setTotal(page.getTotal());
|
||||
pageResult.setPages(page.getPages());
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<Reward> getPageByUserId(BasePageRequest request, String userId) {
|
||||
Page<Reward> page = new Page<>(request.getCurrent(), request.getSize());
|
||||
@@ -62,6 +83,15 @@ public class RewardServiceImpl extends ServiceImpl<RewardMapper, Reward> impleme
|
||||
return this.page(page, wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RewardResponse getRewardResponseById(String id) {
|
||||
Reward reward = this.getById(id);
|
||||
if (reward == null || reward.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
return convertToResponse(reward);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Reward> getByUserId(String userId) {
|
||||
LambdaQueryWrapper<Reward> wrapper = new LambdaQueryWrapper<>();
|
||||
@@ -223,12 +253,17 @@ public class RewardServiceImpl extends ServiceImpl<RewardMapper, Reward> impleme
|
||||
}
|
||||
|
||||
@Override
|
||||
public Reward createReward(String userId, String rewardType, Integer points, String source,
|
||||
String description, LocalDateTime expiredTime) {
|
||||
public Reward createReward(String userId, String rewardType, String value,
|
||||
String description, String topicId, String achievementId, String icon, String rarity) {
|
||||
Reward reward = new Reward();
|
||||
reward.setType(rewardType);
|
||||
reward.setName(rewardType + "奖励");
|
||||
reward.setValue(value);
|
||||
reward.setDescription(description);
|
||||
reward.setTopicId(topicId);
|
||||
reward.setAchievementId(achievementId);
|
||||
reward.setIcon(icon);
|
||||
reward.setRarity(rarity);
|
||||
reward.setCreateBy(userId);
|
||||
reward.setEarnedTime(LocalDateTime.now());
|
||||
reward.setIsNew(1);
|
||||
@@ -236,4 +271,87 @@ public class RewardServiceImpl extends ServiceImpl<RewardMapper, Reward> impleme
|
||||
this.save(reward);
|
||||
return reward;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RewardResponse createRewardWithResponse(RewardCreateRequest request) {
|
||||
Reward reward = createReward(
|
||||
request.getUserId(),
|
||||
request.getRewardType(),
|
||||
request.getValue(),
|
||||
request.getDescription(),
|
||||
request.getTopicId(),
|
||||
request.getAchievementId(),
|
||||
request.getIcon(),
|
||||
request.getRarity());
|
||||
return convertToResponse(reward);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RewardResponse updateRewardWithResponse(RewardUpdateRequest request) {
|
||||
Reward reward = this.getById(request.getId());
|
||||
if (reward == null || reward.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 只更新非空字段
|
||||
if (StringUtils.hasText(request.getRewardType())) {
|
||||
reward.setType(request.getRewardType());
|
||||
}
|
||||
if (StringUtils.hasText(request.getValue())) {
|
||||
reward.setValue(request.getValue());
|
||||
}
|
||||
if (StringUtils.hasText(request.getDescription())) {
|
||||
reward.setDescription(request.getDescription());
|
||||
}
|
||||
if (StringUtils.hasText(request.getTopicId())) {
|
||||
reward.setTopicId(request.getTopicId());
|
||||
}
|
||||
if (StringUtils.hasText(request.getAchievementId())) {
|
||||
reward.setAchievementId(request.getAchievementId());
|
||||
}
|
||||
if (StringUtils.hasText(request.getIcon())) {
|
||||
reward.setIcon(request.getIcon());
|
||||
}
|
||||
if (StringUtils.hasText(request.getRarity())) {
|
||||
reward.setRarity(request.getRarity());
|
||||
}
|
||||
if (request.getIsNew() != null) {
|
||||
reward.setIsNew(request.getIsNew());
|
||||
}
|
||||
|
||||
this.updateById(reward);
|
||||
return convertToResponse(reward);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteReward(String id) {
|
||||
Reward reward = this.getById(id);
|
||||
if (reward == null || reward.getIsDeleted() == 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 逻辑删除
|
||||
reward.setIsDeleted(1);
|
||||
return this.updateById(reward);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将实体转换为响应对象
|
||||
*/
|
||||
private RewardResponse convertToResponse(Reward reward) {
|
||||
if (reward == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
RewardResponse response = new RewardResponse();
|
||||
BeanUtils.copyProperties(reward, response);
|
||||
response.setId(reward.getId());
|
||||
if (reward.getCreateTime() != null) {
|
||||
response.setCreateTime(reward.getCreateTime().toString());
|
||||
}
|
||||
if (reward.getUpdateTime() != null) {
|
||||
response.setUpdateTime(reward.getUpdateTime().toString());
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
+113
-230
@@ -1,19 +1,21 @@
|
||||
package com.emotion.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.TopicInteractionCreateRequest;
|
||||
import com.emotion.dto.request.TopicInteractionPageRequest;
|
||||
import com.emotion.dto.request.TopicInteractionUpdateRequest;
|
||||
import com.emotion.dto.response.TopicInteractionResponse;
|
||||
import com.emotion.entity.TopicInteraction;
|
||||
import com.emotion.mapper.TopicInteractionMapper;
|
||||
import com.emotion.service.TopicInteractionService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Collections;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
/**
|
||||
* 话题互动服务实现类
|
||||
@@ -24,257 +26,138 @@ import java.util.Collections;
|
||||
@Service
|
||||
public class TopicInteractionServiceImpl extends ServiceImpl<TopicInteractionMapper, TopicInteraction> implements TopicInteractionService {
|
||||
|
||||
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
@Override
|
||||
public IPage<TopicInteraction> getPage(BasePageRequest request) {
|
||||
public PageResult<TopicInteractionResponse> getPageWithResponse(TopicInteractionPageRequest request) {
|
||||
Page<TopicInteraction> page = new Page<>(request.getCurrent(), request.getSize());
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
// 根据关键词查询
|
||||
if (StringUtils.hasText(request.getKeyword())) {
|
||||
wrapper.and(w -> w.like(TopicInteraction::getContent, request.getKeyword())
|
||||
.or().like(TopicInteraction::getUserInput, request.getKeyword())
|
||||
.or().like(TopicInteraction::getAiResponse, request.getKeyword()));
|
||||
}
|
||||
|
||||
// 根据话题ID查询
|
||||
if (StringUtils.hasText(request.getTopicId())) {
|
||||
wrapper.eq(TopicInteraction::getTopicId, request.getTopicId());
|
||||
}
|
||||
|
||||
// 根据用户ID查询
|
||||
if (StringUtils.hasText(request.getUserId())) {
|
||||
wrapper.eq(TopicInteraction::getCreateBy, request.getUserId());
|
||||
}
|
||||
|
||||
// 根据互动类型查询
|
||||
if (StringUtils.hasText(request.getInteractionType())) {
|
||||
wrapper.eq(TopicInteraction::getType, request.getInteractionType());
|
||||
}
|
||||
|
||||
wrapper.eq(TopicInteraction::getIsDeleted, 0).orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.page(page, wrapper);
|
||||
Page<TopicInteraction> resultPage = this.page(page, wrapper);
|
||||
|
||||
// 转换为响应对象
|
||||
PageResult<TopicInteractionResponse> pageResult = new PageResult<>();
|
||||
pageResult.setCurrent(resultPage.getCurrent());
|
||||
pageResult.setSize(resultPage.getSize());
|
||||
pageResult.setTotal(resultPage.getTotal());
|
||||
pageResult.setPages(resultPage.getPages());
|
||||
pageResult.setRecords(resultPage.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
.toList());
|
||||
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<TopicInteraction> getPageByTopicId(BasePageRequest request, String topicId) {
|
||||
Page<TopicInteraction> page = new Page<>(request.getCurrent(), request.getSize());
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.page(page, wrapper);
|
||||
public TopicInteractionResponse getTopicInteractionResponseById(String id) {
|
||||
TopicInteraction topicInteraction = this.getById(id);
|
||||
if (topicInteraction == null || topicInteraction.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
return convertToResponse(topicInteraction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<TopicInteraction> getPageByUserId(BasePageRequest request, String userId) {
|
||||
Page<TopicInteraction> page = new Page<>(request.getCurrent(), request.getSize());
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.page(page, wrapper);
|
||||
public TopicInteractionResponse createTopicInteractionWithResponse(TopicInteractionCreateRequest request) {
|
||||
TopicInteraction topicInteraction = new TopicInteraction();
|
||||
BeanUtils.copyProperties(request, topicInteraction);
|
||||
// 设置用户ID为当前登录用户
|
||||
topicInteraction.setCreateBy(getCurrentUserId());
|
||||
this.save(topicInteraction);
|
||||
return convertToResponse(topicInteraction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getByTopicId(String topicId) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
public TopicInteractionResponse updateTopicInteractionWithResponse(TopicInteractionUpdateRequest request) {
|
||||
TopicInteraction topicInteraction = this.getById(request.getId());
|
||||
if (topicInteraction == null || topicInteraction.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 只更新非空字段
|
||||
if (StringUtils.hasText(request.getTopicId())) {
|
||||
topicInteraction.setTopicId(request.getTopicId());
|
||||
}
|
||||
if (StringUtils.hasText(request.getInteractionType())) {
|
||||
topicInteraction.setType(request.getInteractionType());
|
||||
}
|
||||
if (StringUtils.hasText(request.getContent())) {
|
||||
topicInteraction.setContent(request.getContent());
|
||||
}
|
||||
if (StringUtils.hasText(request.getUserInput())) {
|
||||
topicInteraction.setUserInput(request.getUserInput());
|
||||
}
|
||||
if (StringUtils.hasText(request.getAiResponse())) {
|
||||
topicInteraction.setAiResponse(request.getAiResponse());
|
||||
}
|
||||
if (request.getRating() != null) {
|
||||
topicInteraction.setRating(request.getRating());
|
||||
}
|
||||
if (StringUtils.hasText(request.getFeedback())) {
|
||||
topicInteraction.setFeedback(request.getFeedback());
|
||||
}
|
||||
|
||||
this.updateById(topicInteraction);
|
||||
return convertToResponse(topicInteraction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getByUserId(String userId) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
public boolean deleteTopicInteraction(String id) {
|
||||
TopicInteraction topicInteraction = this.getById(id);
|
||||
if (topicInteraction == null || topicInteraction.getIsDeleted() == 1) {
|
||||
return false;
|
||||
}
|
||||
topicInteraction.setIsDeleted(1);
|
||||
return this.updateById(topicInteraction);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getByInteractionType(String interactionType) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getType, interactionType)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
/**
|
||||
* 将实体对象转换为响应对象
|
||||
*/
|
||||
private TopicInteractionResponse convertToResponse(TopicInteraction topicInteraction) {
|
||||
if (topicInteraction == null) {
|
||||
return null;
|
||||
}
|
||||
TopicInteractionResponse response = new TopicInteractionResponse();
|
||||
BeanUtils.copyProperties(topicInteraction, response);
|
||||
response.setId(topicInteraction.getId());
|
||||
if (topicInteraction.getCreateTime() != null) {
|
||||
response.setCreateTime(topicInteraction.getCreateTime().format(FORMATTER));
|
||||
}
|
||||
if (topicInteraction.getUpdateTime() != null) {
|
||||
response.setUpdateTime(topicInteraction.getUpdateTime().format(FORMATTER));
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getByTopicIdAndInteractionType(String topicId, String interactionType) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getType, interactionType)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getByUserIdAndInteractionType(String userId, String interactionType) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getType, interactionType)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getByTopicIdAndUserId(String topicId, String userId) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getByTimeRange(LocalDateTime startTime, LocalDateTime endTime) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.between(TopicInteraction::getCreateTime, startTime, endTime)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByTopicId(String topicId) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByUserId(String userId) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByInteractionType(String interactionType) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getType, interactionType)
|
||||
.eq(TopicInteraction::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByTopicIdAndInteractionType(String topicId, String interactionType) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getType, interactionType)
|
||||
.eq(TopicInteraction::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByUserIdAndInteractionType(String userId, String interactionType) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getType, interactionType)
|
||||
.eq(TopicInteraction::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getRecentByTopicId(String topicId, Integer limit) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime)
|
||||
.last("LIMIT " + limit);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getRecentByUserId(String userId, Integer limit) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime)
|
||||
.last("LIMIT " + limit);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getPopularInteractions(Integer limit) {
|
||||
// TopicInteraction实体中没有likes字段,暂时返回最新互动
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime)
|
||||
.last("LIMIT " + limit);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getPopularInteractionsByTopicId(String topicId, Integer limit) {
|
||||
// TopicInteraction实体中没有likes字段,暂时返回最新互动
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime)
|
||||
.last("LIMIT " + limit);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> getByLikesRange(Integer minLikes, Integer maxLikes) {
|
||||
// TopicInteraction实体中没有likes字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasUserInteracted(String topicId, String userId) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getIsDeleted, 0);
|
||||
return this.count(wrapper) > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TopicInteraction getUserInteractionByType(String topicId, String userId, String interactionType) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.eq(TopicInteraction::getCreateBy, userId)
|
||||
.eq(TopicInteraction::getType, interactionType)
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime)
|
||||
.last("LIMIT 1");
|
||||
return this.getOne(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateLikes(String id, Integer increment) {
|
||||
// TopicInteraction实体中没有likes字段,暂时返回false
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> searchByContent(String keyword) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.and(w -> w.like(TopicInteraction::getContent, keyword)
|
||||
.or().like(TopicInteraction::getUserInput, keyword)
|
||||
.or().like(TopicInteraction::getAiResponse, keyword))
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TopicInteraction> searchByTopicIdAndContent(String topicId, String keyword) {
|
||||
LambdaQueryWrapper<TopicInteraction> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(TopicInteraction::getTopicId, topicId)
|
||||
.and(w -> w.like(TopicInteraction::getContent, keyword)
|
||||
.or().like(TopicInteraction::getUserInput, keyword)
|
||||
.or().like(TopicInteraction::getAiResponse, keyword))
|
||||
.eq(TopicInteraction::getIsDeleted, 0)
|
||||
.orderByDesc(TopicInteraction::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TopicInteraction createTopicInteraction(String topicId, String userId, String interactionType,
|
||||
String content, String attachments) {
|
||||
TopicInteraction interaction = new TopicInteraction();
|
||||
interaction.setTopicId(topicId);
|
||||
interaction.setType(interactionType);
|
||||
interaction.setContent(content);
|
||||
interaction.setUserInput(content);
|
||||
interaction.setCreateBy(userId);
|
||||
|
||||
this.save(interaction);
|
||||
return interaction;
|
||||
/**
|
||||
* 获取当前登录用户ID(模拟实现)
|
||||
*/
|
||||
private String getCurrentUserId() {
|
||||
// 实际项目中应从token中获取用户ID
|
||||
return "current_user_id";
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,27 @@
|
||||
package com.emotion.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.UserCreateRequest;
|
||||
import com.emotion.dto.request.UserPageRequest;
|
||||
import com.emotion.dto.request.UserUpdateRequest;
|
||||
import com.emotion.dto.request.UserProfileUpdateRequest;
|
||||
import com.emotion.dto.response.UserResponse;
|
||||
import com.emotion.entity.User;
|
||||
import com.emotion.mapper.UserMapper;
|
||||
import com.emotion.service.UserService;
|
||||
import com.emotion.util.UserContextHolder;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 用户服务实现类
|
||||
@@ -26,12 +34,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
||||
|
||||
private final PasswordEncoder passwordEncoder;
|
||||
|
||||
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
public UserServiceImpl(PasswordEncoder passwordEncoder) {
|
||||
this.passwordEncoder = passwordEncoder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<User> getPage(BasePageRequest request) {
|
||||
public PageResult<UserResponse> getPageWithResponse(UserPageRequest request) {
|
||||
Page<User> page = new Page<>(request.getCurrent(), request.getSize());
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
@@ -42,6 +52,36 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
||||
.or().like(User::getEmail, request.getKeyword()));
|
||||
}
|
||||
|
||||
// 账号查询
|
||||
if (StringUtils.hasText(request.getAccount())) {
|
||||
wrapper.eq(User::getAccount, request.getAccount());
|
||||
}
|
||||
|
||||
// 用户名查询
|
||||
if (StringUtils.hasText(request.getUsername())) {
|
||||
wrapper.like(User::getUsername, request.getUsername());
|
||||
}
|
||||
|
||||
// 邮箱查询
|
||||
if (StringUtils.hasText(request.getEmail())) {
|
||||
wrapper.eq(User::getEmail, request.getEmail());
|
||||
}
|
||||
|
||||
// 手机号查询
|
||||
if (StringUtils.hasText(request.getPhone())) {
|
||||
wrapper.eq(User::getPhone, request.getPhone());
|
||||
}
|
||||
|
||||
// 状态查询
|
||||
if (request.getStatus() != null) {
|
||||
wrapper.eq(User::getStatus, request.getStatus());
|
||||
}
|
||||
|
||||
// 会员等级查询
|
||||
if (StringUtils.hasText(request.getMemberLevel())) {
|
||||
wrapper.eq(User::getMemberLevel, request.getMemberLevel());
|
||||
}
|
||||
|
||||
wrapper.eq(User::getIsDeleted, 0);
|
||||
|
||||
// 排序
|
||||
@@ -55,160 +95,172 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
|
||||
wrapper.orderByDesc(User::getCreateTime);
|
||||
}
|
||||
|
||||
return this.page(page, wrapper);
|
||||
Page<User> resultPage = this.page(page, wrapper);
|
||||
List<UserResponse> userResponses = resultPage.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
PageResult<UserResponse> pageResult = new PageResult<>();
|
||||
pageResult.setCurrent(resultPage.getCurrent());
|
||||
pageResult.setSize(resultPage.getSize());
|
||||
pageResult.setTotal(resultPage.getTotal());
|
||||
pageResult.setPages(resultPage.getPages());
|
||||
pageResult.setRecords(userResponses);
|
||||
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getByAccount(String account) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getAccount, account)
|
||||
.eq(User::getIsDeleted, 0);
|
||||
return this.getOne(wrapper);
|
||||
public UserResponse getUserResponseById(String id) {
|
||||
User user = this.getById(id);
|
||||
if (user == null || user.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
return convertToResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getByUsername(String username) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getUsername, username)
|
||||
.eq(User::getIsDeleted, 0);
|
||||
return this.getOne(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getByEmail(String email) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getEmail, email)
|
||||
.eq(User::getIsDeleted, 0);
|
||||
return this.getOne(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getByPhone(String phone) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getPhone, phone)
|
||||
.eq(User::getIsDeleted, 0);
|
||||
return this.getOne(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getByThirdParty(String thirdPartyId, String thirdPartyType) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getThirdPartyId, thirdPartyId)
|
||||
.eq(User::getThirdPartyType, thirdPartyType)
|
||||
.eq(User::getIsDeleted, 0);
|
||||
return this.getOne(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<User> getByStatus(Integer status) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getStatus, status)
|
||||
.eq(User::getIsDeleted, 0)
|
||||
.orderByDesc(User::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<User> getByMemberLevel(String memberLevel) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getMemberLevel, memberLevel)
|
||||
.eq(User::getIsDeleted, 0)
|
||||
.orderByDesc(User::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<User> getActiveUsers(Integer days) {
|
||||
LocalDateTime startTime = LocalDateTime.now().minusDays(days);
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.ge(User::getLastActiveTime, startTime)
|
||||
.eq(User::getIsDeleted, 0)
|
||||
.orderByDesc(User::getLastActiveTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<User> getNewUsers(Integer days) {
|
||||
LocalDateTime startTime = LocalDateTime.now().minusDays(days);
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.ge(User::getCreateTime, startTime)
|
||||
.eq(User::getIsDeleted, 0)
|
||||
.orderByDesc(User::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateLastActiveTime(String userId, LocalDateTime lastActiveTime) {
|
||||
public UserResponse createUserWithResponse(UserCreateRequest request) {
|
||||
User user = new User();
|
||||
user.setId(userId);
|
||||
user.setLastActiveTime(lastActiveTime);
|
||||
return this.updateById(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateStatus(String userId, Integer status) {
|
||||
User user = new User();
|
||||
user.setId(userId);
|
||||
user.setStatus(status);
|
||||
return this.updateById(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateTotalDays(String userId, Integer totalDays) {
|
||||
User user = new User();
|
||||
user.setId(userId);
|
||||
user.setTotalDays(totalDays);
|
||||
return this.updateById(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByStatus(Integer status) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getStatus, status)
|
||||
.eq(User::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByMemberLevel(String memberLevel) {
|
||||
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(User::getMemberLevel, memberLevel)
|
||||
.eq(User::getIsDeleted, 0);
|
||||
return this.count(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public User createUser(String account, String username, String password, String email, String phone) {
|
||||
User user = new User();
|
||||
user.setAccount(account);
|
||||
user.setUsername(username);
|
||||
user.setPassword(passwordEncoder.encode(password));
|
||||
user.setEmail(email);
|
||||
user.setPhone(phone);
|
||||
user.setNickname(username);
|
||||
user.setAccount(request.getAccount());
|
||||
user.setUsername(request.getUsername());
|
||||
user.setPassword(passwordEncoder.encode(request.getPassword()));
|
||||
user.setEmail(request.getEmail());
|
||||
user.setPhone(request.getPhone());
|
||||
user.setNickname(request.getUsername());
|
||||
user.setMemberLevel("free");
|
||||
user.setStatus(1);
|
||||
user.setIsVerified(0);
|
||||
user.setLastActiveTime(LocalDateTime.now());
|
||||
|
||||
this.save(user);
|
||||
return user;
|
||||
return convertToResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validatePassword(String userId, String password) {
|
||||
User user = this.getById(userId);
|
||||
if (user == null) {
|
||||
public UserResponse updateUserWithResponse(UserUpdateRequest request) {
|
||||
User user = this.getById(request.getId());
|
||||
if (user == null || user.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 只更新非空字段
|
||||
if (StringUtils.hasText(request.getUsername())) {
|
||||
user.setUsername(request.getUsername());
|
||||
}
|
||||
if (StringUtils.hasText(request.getNickname())) {
|
||||
user.setNickname(request.getNickname());
|
||||
}
|
||||
if (StringUtils.hasText(request.getEmail())) {
|
||||
user.setEmail(request.getEmail());
|
||||
}
|
||||
if (StringUtils.hasText(request.getPhone())) {
|
||||
user.setPhone(request.getPhone());
|
||||
}
|
||||
if (StringUtils.hasText(request.getAvatar())) {
|
||||
user.setAvatar(request.getAvatar());
|
||||
}
|
||||
if (request.getBirthDate() != null) {
|
||||
user.setBirthDate(request.getBirthDate());
|
||||
}
|
||||
if (StringUtils.hasText(request.getLocation())) {
|
||||
user.setLocation(request.getLocation());
|
||||
}
|
||||
if (StringUtils.hasText(request.getBio())) {
|
||||
user.setBio(request.getBio());
|
||||
}
|
||||
if (request.getStatus() != null) {
|
||||
user.setStatus(request.getStatus());
|
||||
}
|
||||
if (StringUtils.hasText(request.getMemberLevel())) {
|
||||
user.setMemberLevel(request.getMemberLevel());
|
||||
}
|
||||
|
||||
this.updateById(user);
|
||||
return convertToResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserResponse updateCurrentUserProfileWithResponse(UserProfileUpdateRequest request) {
|
||||
// 从UserContextHolder获取当前用户ID
|
||||
String currentUserId = UserContextHolder.getCurrentUserId();
|
||||
if (currentUserId == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
User user = this.getById(currentUserId);
|
||||
if (user == null || user.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 只更新非空字段
|
||||
if (StringUtils.hasText(request.getNickname())) {
|
||||
user.setNickname(request.getNickname());
|
||||
}
|
||||
if (StringUtils.hasText(request.getEmail())) {
|
||||
user.setEmail(request.getEmail());
|
||||
}
|
||||
if (StringUtils.hasText(request.getPhone())) {
|
||||
user.setPhone(request.getPhone());
|
||||
}
|
||||
if (StringUtils.hasText(request.getAvatar())) {
|
||||
user.setAvatar(request.getAvatar());
|
||||
}
|
||||
if (request.getBirthDate() != null) {
|
||||
user.setBirthDate(request.getBirthDate());
|
||||
}
|
||||
if (StringUtils.hasText(request.getLocation())) {
|
||||
user.setLocation(request.getLocation());
|
||||
}
|
||||
if (StringUtils.hasText(request.getBio())) {
|
||||
user.setBio(request.getBio());
|
||||
}
|
||||
|
||||
this.updateById(user);
|
||||
return convertToResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserResponse getCurrentUserProfileWithResponse() {
|
||||
// 从UserContextHolder获取当前用户ID
|
||||
String currentUserId = UserContextHolder.getCurrentUserId();
|
||||
if (currentUserId == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
User user = this.getById(currentUserId);
|
||||
if (user == null || user.getIsDeleted() == 1) {
|
||||
return null;
|
||||
}
|
||||
return convertToResponse(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteUser(String id) {
|
||||
User user = this.getById(id);
|
||||
if (user == null || user.getIsDeleted() == 1) {
|
||||
return false;
|
||||
}
|
||||
return passwordEncoder.matches(password, user.getPassword());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updatePassword(String userId, String newPassword) {
|
||||
User user = new User();
|
||||
user.setId(userId);
|
||||
user.setPassword(passwordEncoder.encode(newPassword));
|
||||
user.setIsDeleted(1);
|
||||
return this.updateById(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为响应对象
|
||||
*/
|
||||
private UserResponse convertToResponse(User user) {
|
||||
UserResponse response = new UserResponse();
|
||||
BeanUtils.copyProperties(user, response);
|
||||
response.setId(user.getId());
|
||||
if (user.getCreateTime() != null) {
|
||||
response.setCreateTime(user.getCreateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
if (user.getUpdateTime() != null) {
|
||||
response.setUpdateTime(user.getUpdateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
if (user.getLastActiveTime() != null) {
|
||||
response.setLastActiveTime(user.getLastActiveTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,27 @@
|
||||
package com.emotion.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.dto.request.UserStatsCreateRequest;
|
||||
import com.emotion.dto.request.UserStatsIncrementRequest;
|
||||
import com.emotion.dto.request.UserStatsPageRequest;
|
||||
import com.emotion.dto.request.UserStatsUpdateValueRequest;
|
||||
import com.emotion.dto.response.UserStatsResponse;
|
||||
import com.emotion.entity.UserStats;
|
||||
import com.emotion.mapper.UserStatsMapper;
|
||||
import com.emotion.service.UserStatsService;
|
||||
import com.emotion.util.SnowflakeIdGenerator;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
import java.util.Collections;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 用户统计服务实现类
|
||||
@@ -24,193 +32,164 @@ import java.util.Collections;
|
||||
@Service
|
||||
public class UserStatsServiceImpl extends ServiceImpl<UserStatsMapper, UserStats> implements UserStatsService {
|
||||
|
||||
private final SnowflakeIdGenerator snowflakeIdGenerator;
|
||||
|
||||
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
public UserStatsServiceImpl(SnowflakeIdGenerator snowflakeIdGenerator) {
|
||||
this.snowflakeIdGenerator = snowflakeIdGenerator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPage<UserStats> getPage(BasePageRequest request) {
|
||||
public PageResult<UserStatsResponse> getPageWithResponse(UserStatsPageRequest request) {
|
||||
Page<UserStats> page = new Page<>(request.getCurrent(), request.getSize());
|
||||
LambdaQueryWrapper<UserStats> wrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
|
||||
// 关键词搜索
|
||||
if (StringUtils.hasText(request.getKeyword())) {
|
||||
wrapper.like(UserStats::getUserId, request.getKeyword());
|
||||
wrapper.like(UserStats::getUserId, request.getKeyword())
|
||||
.or().like(UserStats::getStatsType, request.getKeyword());
|
||||
}
|
||||
|
||||
wrapper.eq(UserStats::getIsDeleted, 0).orderByDesc(UserStats::getCreateTime);
|
||||
return this.page(page, wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserStats getByUserId(String userId) {
|
||||
LambdaQueryWrapper<UserStats> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(UserStats::getUserId, userId)
|
||||
.eq(UserStats::getIsDeleted, 0);
|
||||
return this.getOne(wrapper);
|
||||
}
|
||||
// 用户ID查询
|
||||
if (StringUtils.hasText(request.getUserId())) {
|
||||
wrapper.eq(UserStats::getUserId, request.getUserId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserStats> getByStatsType(String statsType) {
|
||||
// UserStats实体中没有statsType字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// 统计类型查询
|
||||
if (StringUtils.hasText(request.getStatsType())) {
|
||||
wrapper.eq(UserStats::getStatsType, request.getStatsType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserStats getByUserIdAndStatsType(String userId, String statsType) {
|
||||
// UserStats实体中没有statsType字段,暂时返回null
|
||||
return null;
|
||||
}
|
||||
wrapper.eq(UserStats::getIsDeleted, 0);
|
||||
|
||||
@Override
|
||||
public List<UserStats> getByTimeRange(LocalDateTime startTime, LocalDateTime endTime) {
|
||||
LambdaQueryWrapper<UserStats> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.between(UserStats::getCreateTime, startTime, endTime)
|
||||
.eq(UserStats::getIsDeleted, 0)
|
||||
.orderByDesc(UserStats::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserStats> getByValueRange(Double minValue, Double maxValue) {
|
||||
// UserStats实体中没有统一的value字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByStatsType(String statsType) {
|
||||
// UserStats实体中没有statsType字段,暂时返回0
|
||||
return 0L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAvgValueByStatsType(String statsType) {
|
||||
// 这里需要自定义SQL查询平均值,暂时返回0
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getMaxValueByStatsType(String statsType) {
|
||||
// 这里需要自定义SQL查询最大值,暂时返回0
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getMinValueByStatsType(String statsType) {
|
||||
// 这里需要自定义SQL查询最小值,暂时返回0
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserStats> getAllStatsByUserId(String userId) {
|
||||
LambdaQueryWrapper<UserStats> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(UserStats::getUserId, userId)
|
||||
.eq(UserStats::getIsDeleted, 0)
|
||||
.orderByDesc(UserStats::getCreateTime);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserStats> getTopUsersByStatsType(String statsType, Integer limit) {
|
||||
// 这里需要自定义SQL查询,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getUserRankByStatsType(String userId, String statsType) {
|
||||
// 这里需要自定义SQL查询排名,暂时返回0
|
||||
return 0L;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateStatsValue(String userId, String statsType, Double value) {
|
||||
// UserStats实体中没有statsType字段,暂时返回false
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean incrementStatsValue(String userId, String statsType, Double increment) {
|
||||
// UserStats实体中没有statsType字段,暂时返回false
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean batchUpdateStats(String userId, List<UserStats> statsList) {
|
||||
for (UserStats stats : statsList) {
|
||||
stats.setUserId(userId);
|
||||
if (this.getById(stats.getId()) != null) {
|
||||
this.updateById(stats);
|
||||
// 排序
|
||||
if (StringUtils.hasText(request.getOrderBy())) {
|
||||
if ("asc".equalsIgnoreCase(request.getOrderDirection())) {
|
||||
wrapper.orderByAsc(UserStats::getCreateTime);
|
||||
} else {
|
||||
this.save(stats);
|
||||
wrapper.orderByDesc(UserStats::getCreateTime);
|
||||
}
|
||||
} else {
|
||||
wrapper.orderByDesc(UserStats::getCreateTime);
|
||||
}
|
||||
return true;
|
||||
|
||||
Page<UserStats> resultPage = this.page(page, wrapper);
|
||||
List<UserStatsResponse> responses = resultPage.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
PageResult<UserStatsResponse> pageResult = new PageResult<>();
|
||||
pageResult.setCurrent(resultPage.getCurrent());
|
||||
pageResult.setSize(resultPage.getSize());
|
||||
pageResult.setTotal(resultPage.getTotal());
|
||||
pageResult.setPages(resultPage.getPages());
|
||||
pageResult.setRecords(responses);
|
||||
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateStatsValue(UserStatsUpdateValueRequest request) {
|
||||
LambdaUpdateWrapper<UserStats> wrapper = new LambdaUpdateWrapper<>();
|
||||
wrapper.eq(UserStats::getUserId, request.getUserId())
|
||||
.eq(UserStats::getStatsType, request.getStatsType())
|
||||
.eq(UserStats::getIsDeleted, 0)
|
||||
.set(UserStats::getValue, request.getValue())
|
||||
.set(UserStats::getUpdateTime, LocalDateTime.now());
|
||||
return this.update(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean incrementStatsValue(UserStatsIncrementRequest request) {
|
||||
LambdaUpdateWrapper<UserStats> wrapper = new LambdaUpdateWrapper<>();
|
||||
wrapper.eq(UserStats::getUserId, request.getUserId())
|
||||
.eq(UserStats::getStatsType, request.getStatsType())
|
||||
.eq(UserStats::getIsDeleted, 0)
|
||||
.setSql("value = value + " + request.getIncrement())
|
||||
.set(UserStats::getUpdateTime, LocalDateTime.now());
|
||||
return this.update(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean recalculateUserStats(String userId) {
|
||||
// 这里需要根据业务逻辑重新计算用户统计
|
||||
// 暂时返回true
|
||||
// 这里应该根据业务逻辑重新计算用户统计数据
|
||||
// 示例:更新用户的总活跃天数、总发帖数等
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean recalculateAllUserStats() {
|
||||
// 这里需要根据业务逻辑重新计算所有用户统计
|
||||
// 暂时返回true
|
||||
// 这里应该重新计算所有用户的统计数据
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserStats> getByPeriod(String period) {
|
||||
// UserStats实体中没有period字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<UserStats> getByUserIdAndPeriod(String userId, String period) {
|
||||
// UserStats实体中没有period字段,暂时返回空列表
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public UserStats createOrUpdateUserStats(String userId, String statsType, Double value, String period) {
|
||||
// 先尝试查找现有记录
|
||||
UserStats existingStats = getByUserId(userId);
|
||||
if (existingStats != null) {
|
||||
// 更新现有记录
|
||||
// 这里需要根据statsType更新对应的字段
|
||||
this.updateById(existingStats);
|
||||
return existingStats;
|
||||
} else {
|
||||
// 创建新记录
|
||||
UserStats newStats = new UserStats();
|
||||
newStats.setUserId(userId);
|
||||
newStats.setTotalConversations(0);
|
||||
newStats.setTotalMessages(0);
|
||||
newStats.setTotalEmotionsRecorded(0);
|
||||
newStats.setTopicsCompleted(0);
|
||||
newStats.setAchievementsUnlocked(0);
|
||||
newStats.setTotalPoints(0);
|
||||
newStats.setConsecutiveDays(0);
|
||||
newStats.setMaxConsecutiveDays(0);
|
||||
newStats.setLocationsVisited(0);
|
||||
newStats.setPostsCreated(0);
|
||||
newStats.setCommentsMade(0);
|
||||
newStats.setLikesReceived(0);
|
||||
newStats.setSocialInteractions(0);
|
||||
|
||||
this.save(newStats);
|
||||
return newStats;
|
||||
}
|
||||
public UserStatsResponse createOrUpdateUserStatsWithResponse(UserStatsCreateRequest request) {
|
||||
UserStats stats = createOrUpdateUserStats(request.getUserId(), request.getStatsType(), request.getValue(),
|
||||
request.getPeriod());
|
||||
return convertToResponse(stats);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteExpiredStats(Integer days) {
|
||||
LocalDateTime expireTime = LocalDateTime.now().minusDays(days);
|
||||
|
||||
LambdaQueryWrapper<UserStats> wrapper = new LambdaQueryWrapper<>();
|
||||
LambdaUpdateWrapper<UserStats> wrapper = new LambdaUpdateWrapper<>();
|
||||
wrapper.lt(UserStats::getCreateTime, expireTime)
|
||||
.set(UserStats::getIsDeleted, 1)
|
||||
.set(UserStats::getUpdateTime, LocalDateTime.now());
|
||||
return this.update(wrapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建或更新用户统计
|
||||
*/
|
||||
private UserStats createOrUpdateUserStats(String userId, String statsType, Double value, String period) {
|
||||
UserStats stats = getByUserIdAndStatsType(userId, statsType);
|
||||
if (stats == null) {
|
||||
stats = new UserStats();
|
||||
stats.setId(snowflakeIdGenerator.nextIdAsString());
|
||||
stats.setUserId(userId);
|
||||
stats.setStatsType(statsType);
|
||||
stats.setValue(value);
|
||||
stats.setPeriod(period);
|
||||
stats.setCreateTime(LocalDateTime.now());
|
||||
stats.setUpdateTime(LocalDateTime.now());
|
||||
stats.setIsDeleted(0);
|
||||
this.save(stats);
|
||||
} else {
|
||||
stats.setValue(value);
|
||||
stats.setPeriod(period);
|
||||
stats.setUpdateTime(LocalDateTime.now());
|
||||
this.updateById(stats);
|
||||
}
|
||||
return stats;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID和统计类型获取统计信息
|
||||
*/
|
||||
private UserStats getByUserIdAndStatsType(String userId, String statsType) {
|
||||
LambdaQueryWrapper<UserStats> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(UserStats::getUserId, userId)
|
||||
.eq(UserStats::getStatsType, statsType)
|
||||
.eq(UserStats::getIsDeleted, 0);
|
||||
return this.getOne(wrapper);
|
||||
}
|
||||
|
||||
UserStats updateStats = new UserStats();
|
||||
updateStats.setIsDeleted(1);
|
||||
|
||||
return this.update(updateStats, wrapper);
|
||||
/**
|
||||
* 转换为响应对象
|
||||
*/
|
||||
private UserStatsResponse convertToResponse(UserStats stats) {
|
||||
UserStatsResponse response = new UserStatsResponse();
|
||||
BeanUtils.copyProperties(stats, response);
|
||||
response.setId(stats.getId());
|
||||
if (stats.getCreateTime() != null) {
|
||||
response.setCreateTime(stats.getCreateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
if (stats.getUpdateTime() != null) {
|
||||
response.setUpdateTime(stats.getUpdateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user