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.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; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; /** * 成长话题服务实现类 * * @author huazhongmin * @date 2025-09-08 */ @Service public class GrowthTopicServiceImpl extends ServiceImpl implements GrowthTopicService { @Override public IPage getPage(BasePageRequest request) { Page page = new Page<>(request.getCurrent(), request.getSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // 关键词搜索 if (StringUtils.hasText(request.getKeyword())) { wrapper.and(w -> w.like(GrowthTopic::getTitle, request.getKeyword()) .or().like(GrowthTopic::getDescription, request.getKeyword())); } wrapper.eq(GrowthTopic::getIsDeleted, 0); // 排序 if (StringUtils.hasText(request.getOrderBy())) { if ("asc".equalsIgnoreCase(request.getOrderDirection())) { wrapper.orderByAsc(GrowthTopic::getCreateTime); } else { wrapper.orderByDesc(GrowthTopic::getCreateTime); } } else { wrapper.orderByDesc(GrowthTopic::getCreateTime); } return this.page(page, wrapper); } @Override public PageResult getPageWithResponse(BasePageRequest request) { IPage page = getPage(request); List responses = page.getRecords().stream() .map(this::convertToResponse) .collect(Collectors.toList()); PageResult 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 GrowthTopicResponse getGrowthTopicResponseById(String id) { GrowthTopic topic = this.getById(id); if (topic == null || topic.getIsDeleted() == 1) { return null; } return convertToResponse(topic); } @Override public GrowthTopic createGrowthTopic(String title, String description, String category, String difficultyLevel, String tags, LocalDateTime endTime) { GrowthTopic topic = new GrowthTopic(); topic.setTitle(title); topic.setDescription(description); topic.setCategory(category); topic.setDifficulty(difficultyLevel); topic.setContent(description); topic.setDurationDays(30); // 默认30天 topic.setIsUnlocked(1); topic.setProgress(BigDecimal.ZERO); topic.setRewards("成长积分"); 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; } }