优化
This commit is contained in:
@@ -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