feat(creator): 内容审核返回创作者与分集信息

This commit is contained in:
Zhou Weidong committed 2026-11-09 10:32:53 +08:00
1 parent 9b2833dfd3
commit 2fee329002
3 files changed
+120 -1

No files matched your search

@@ -61,6 +61,13 @@ public class DramaService {
.like(StringUtils.hasText(req.getKeyword()), Drama::getTitle, req.getKeyword())
.eq(StringUtils.hasText(req.getStatus()), Drama::getStatus, req.getStatus())
.eq(req.getIsHot() != null, Drama::getIsHot, Boolean.TRUE.equals(req.getIsHot()) ? 1 : 0);
// admin 短剧管理默认隐藏创作者发的、尚在审核中/被驳回的剧——审核通过后才自动进入;
// admin 自己建的(creator_id IS NULL)不受影响;手动选了状态时也放行。
if (!StringUtils.hasText(req.getStatus())) {
wrapper.and(w -> w.isNull(Drama::getCreatorId)
.or()
.notIn(Drama::getStatus, List.of("reviewing", "rejected")));
}
if (!dramaTypes.isEmpty()) {
DramaMultiTagSupport.applyDramaTypeTokens(wrapper, dramaTypes);
}
@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/** 创作者内容提交与审核流转,对应 content_submission 表。 */
@Data
@@ -38,4 +39,40 @@ public class ContentSubmission {
@TableLogic
private Integer deleted;
/** 非持久化:后台列表接口附加的创作者展示信息 */
@TableField(exist = false)
private String creatorName;
@TableField(exist = false)
private String creatorCode;
@TableField(exist = false)
private String creatorMobile;
/** 非持久化:后台列表/详情接口附加的短剧预览 */
@TableField(exist = false)
private String dramaTitle;
@TableField(exist = false)
private String dramaCover;
@TableField(exist = false)
private String dramaDescription;
@TableField(exist = false)
private String dramaGenre;
@TableField(exist = false)
private String dramaLanguage;
@TableField(exist = false)
private Integer dramaTotalEpisodes;
/** 非持久化:后台详情接口附加的分集预览(审核弹窗展示) */
@TableField(exist = false)
private List<EpisodePreview> episodePreviews;
@Data
public static class EpisodePreview {
private Long id;
private Integer epNo;
private String title;
private Integer durationSec;
private String coverUrl;
private String status;
}
}
@@ -9,12 +9,15 @@ import com.fruitshorts.common.exception.ErrorCode;
import com.fruitshorts.common.exception.ServiceException;
import com.fruitshorts.common.pojo.PageResult;
import com.fruitshorts.content.dal.entity.Drama;
import com.fruitshorts.content.dal.entity.DramaEpisode;
import com.fruitshorts.content.dal.mapper.DramaEpisodeMapper;
import com.fruitshorts.content.enums.ContentStatus;
import com.fruitshorts.content.service.DramaService;
import com.fruitshorts.content.service.EpisodeService;
import com.fruitshorts.creator.dal.entity.ContentSubmission;
import com.fruitshorts.creator.dal.entity.Creator;
import com.fruitshorts.creator.dal.mapper.ContentSubmissionMapper;
import com.fruitshorts.creator.dal.mapper.CreatorMapper;
import com.fruitshorts.creator.vo.SubmissionAuditReqVO;
import com.fruitshorts.creator.vo.SubmissionQueryReqVO;
import lombok.RequiredArgsConstructor;
@@ -24,8 +27,10 @@ import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/** 创作者内容提交:后台检索、审核,通过后按 type 落到短剧状态机。 */
@Service
@@ -50,8 +55,10 @@ public class ContentSubmissionService {
public static final Set<String> PENDING = Set.of(STATUS_SUBMITTED, STATUS_REVIEWING);
private final ContentSubmissionMapper submissionMapper;
private final CreatorMapper creatorMapper;
private final DramaService dramaService;
private final EpisodeService episodeService;
private final DramaEpisodeMapper dramaEpisodeMapper;
public PageResult<ContentSubmission> page(SubmissionQueryReqVO req) {
Page<ContentSubmission> page = new Page<>(req.getSafePageIndex(), req.getSafePageSize());
@@ -62,7 +69,9 @@ public class ContentSubmissionService {
.eq(StringUtils.hasText(req.getStatus()), ContentSubmission::getStatus, req.getStatus())
.eq(StringUtils.hasText(req.getType()), ContentSubmission::getType, req.getType())
.orderByDesc(ContentSubmission::getId));
return new PageResult<>(result.getTotal(), result.getRecords());
List<ContentSubmission> rows = result.getRecords();
enrichForList(rows);
return new PageResult<>(result.getTotal(), rows);
}
public ContentSubmission getExisting(Long id) {
@@ -70,9 +79,67 @@ public class ContentSubmissionService {
if (submission == null) {
throw new ServiceException(ErrorCode.DATA_NOT_FOUND, "内容提交记录不存在");
}
enrichForList(List.of(submission));
enrichEpisodes(submission);
return submission;
}
/** 列表/详情共用的回填:创作者信息 + 短剧预览(标题/封面/简介/题材/集数)。 */
private void enrichForList(List<ContentSubmission> rows) {
if (rows == null || rows.isEmpty()) return;
Set<Long> creatorIds = rows.stream().map(ContentSubmission::getCreatorId).filter(Objects::nonNull).collect(Collectors.toSet());
if (!creatorIds.isEmpty()) {
List<Creator> creators = creatorMapper.selectBatchIds(creatorIds);
Map<Long, Creator> byId = new java.util.HashMap<>();
creators.forEach(c -> byId.put(c.getId(), c));
rows.forEach(s -> {
Creator c = byId.get(s.getCreatorId());
if (c != null) {
s.setCreatorName(c.getName());
s.setCreatorCode(c.getCode());
s.setCreatorMobile(c.getContactMobile());
}
});
}
Set<Long> dramaIds = rows.stream().map(ContentSubmission::getDramaId).filter(Objects::nonNull).collect(Collectors.toSet());
if (!dramaIds.isEmpty()) {
List<Drama> dramas = dramaService.listByIds(List.copyOf(dramaIds));
Map<Long, Drama> byDrama = new java.util.HashMap<>();
dramas.forEach(d -> byDrama.put(d.getId(), d));
rows.forEach(s -> {
Drama d = byDrama.get(s.getDramaId());
if (d != null) {
s.setDramaTitle(d.getTitle());
s.setDramaCover(d.getCoverUrl());
s.setDramaDescription(d.getSynopsis());
s.setDramaGenre(d.getGenre());
s.setDramaLanguage(d.getLanguage());
s.setDramaTotalEpisodes(d.getTotalEpisodes());
}
});
}
}
/** 详情接口额外回填分集预览列表,供审核弹窗展示。 */
private void enrichEpisodes(ContentSubmission submission) {
if (submission.getDramaId() == null) return;
List<DramaEpisode> eps = dramaEpisodeMapper.selectList(
Wrappers.<DramaEpisode>lambdaQuery()
.eq(DramaEpisode::getDramaId, submission.getDramaId())
.orderByAsc(DramaEpisode::getEpNo));
List<ContentSubmission.EpisodePreview> previews = eps.stream().map(e -> {
ContentSubmission.EpisodePreview p = new ContentSubmission.EpisodePreview();
p.setId(e.getId());
p.setEpNo(e.getEpNo());
p.setTitle(e.getTitle());
p.setDurationSec(e.getDurationSec());
p.setCoverUrl(e.getCoverUrl());
p.setStatus(e.getStatus());
return p;
}).toList();
submission.setEpisodePreviews(previews);
}
/**
* 创作者提交内容。
*
@@ -205,6 +272,14 @@ public class ContentSubmissionService {
}
}
/** 按剧清掉所有提交记录(删剧时用)。 */
@Transactional(rollbackFor = Exception.class)
public void deleteByDrama(Long dramaId) {
if (dramaId == null) return;
submissionMapper.delete(Wrappers.<ContentSubmission>lambdaQuery()
.eq(ContentSubmission::getDramaId, dramaId));
}
/** 审核:通过 / 驳回 / 撤回。 */
@Transactional(rollbackFor = Exception.class)
public ContentSubmission audit(Long id, SubmissionAuditReqVO req, Long operatorId, String operatorName) {