diff --git a/server/src/main/java/com/emotion/service/impl/ScriptFavoriteServiceImpl.java b/server/src/main/java/com/emotion/service/impl/ScriptFavoriteServiceImpl.java new file mode 100644 index 0000000..398451d --- /dev/null +++ b/server/src/main/java/com/emotion/service/impl/ScriptFavoriteServiceImpl.java @@ -0,0 +1,149 @@ +package com.emotion.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.emotion.common.PageResult; +import com.emotion.dto.response.EpicScriptResponse; +import com.emotion.dto.response.ScriptFavoriteResponse; +import com.emotion.entity.ScriptFavorite; +import com.emotion.mapper.ScriptFavoriteMapper; +import com.emotion.service.EpicScriptService; +import com.emotion.service.ScriptFavoriteService; +import com.emotion.util.UserContextHolder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; + +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 剧本收藏服务实现 + * + * @author huazhongmin + * @date 2026-07-19 + */ +@Slf4j +@Service +public class ScriptFavoriteServiceImpl extends ServiceImpl + implements ScriptFavoriteService { + + private static final DateTimeFormatter FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Autowired + private EpicScriptService epicScriptService; + + @Override + @Transactional(rollbackFor = Exception.class) + public ScriptFavoriteResponse toggleFavorite(String scriptId) { + String userId = UserContextHolder.getCurrentUserId(); + ScriptFavoriteResponse r = new ScriptFavoriteResponse(); + r.setScriptId(scriptId); + + if (!StringUtils.hasText(userId)) { + r.setIsFavorited(false); + return r; + } + + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(ScriptFavorite::getUserId, userId) + .eq(ScriptFavorite::getScriptId, scriptId) + .eq(ScriptFavorite::getIsDeleted, 0); + + ScriptFavorite existing = this.getOne(w); + if (existing != null) { + this.removeById(existing.getId()); + r.setIsFavorited(false); + } else { + ScriptFavorite fav = new ScriptFavorite(); + fav.setUserId(userId); + fav.setScriptId(scriptId); + this.save(fav); + r.setIsFavorited(true); + if (fav.getCreateTime() != null) { + r.setFavoriteTime(fav.getCreateTime().format(FMT)); + } + } + return r; + } + + @Override + public PageResult getFavoritePage(long current, long size) { + String userId = UserContextHolder.getCurrentUserId(); + if (!StringUtils.hasText(userId)) { + return new PageResult<>(); + } + + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(ScriptFavorite::getUserId, userId) + .eq(ScriptFavorite::getIsDeleted, 0) + .orderByDesc(ScriptFavorite::getCreateTime); + + Page page = new Page<>(current, size); + Page result = this.page(page, w); + + List records = result.getRecords().stream() + .map(ScriptFavorite::getScriptId) + .map(epicScriptService::getScriptById) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + PageResult pr = new PageResult<>(); + pr.setCurrent(result.getCurrent()); + pr.setSize(result.getSize()); + pr.setTotal(result.getTotal()); + pr.setPages(result.getPages()); + pr.setRecords(records); + return pr; + } + + @Override + public Set getFavoritedScriptIds(Set scriptIds) { + String userId = UserContextHolder.getCurrentUserId(); + if (!StringUtils.hasText(userId) || scriptIds == null || scriptIds.isEmpty()) { + return Collections.emptySet(); + } + + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(ScriptFavorite::getUserId, userId) + .in(ScriptFavorite::getScriptId, scriptIds) + .eq(ScriptFavorite::getIsDeleted, 0); + + return this.list(w).stream() + .map(ScriptFavorite::getScriptId) + .collect(Collectors.toSet()); + } + + @Override + public boolean isFavorited(String scriptId) { + String userId = UserContextHolder.getCurrentUserId(); + if (!StringUtils.hasText(userId) || !StringUtils.hasText(scriptId)) { + return false; + } + + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(ScriptFavorite::getUserId, userId) + .eq(ScriptFavorite::getScriptId, scriptId) + .eq(ScriptFavorite::getIsDeleted, 0); + + return this.count(w) > 0; + } + + @Override + public long getFavoriteCount() { + String userId = UserContextHolder.getCurrentUserId(); + if (!StringUtils.hasText(userId)) { + return 0L; + } + + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(ScriptFavorite::getUserId, userId) + .eq(ScriptFavorite::getIsDeleted, 0); + + return this.count(w); + } +}