diff --git a/backend-java/src/main/java/com/competition/modules/pub/service/PublicContentReviewService.java b/backend-java/src/main/java/com/competition/modules/pub/service/PublicContentReviewService.java index 340c6a1..3adad0b 100644 --- a/backend-java/src/main/java/com/competition/modules/pub/service/PublicContentReviewService.java +++ b/backend-java/src/main/java/com/competition/modules/pub/service/PublicContentReviewService.java @@ -2,8 +2,10 @@ package com.competition.modules.pub.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.competition.common.enums.ErrorCode; import com.competition.common.exception.BusinessException; import com.competition.common.result.PageResult; import com.competition.modules.sys.entity.SysUser; @@ -179,7 +181,7 @@ public class PublicContentReviewService { } /** - * 撤回审核 + * 撤回审核:已通过/已拒绝 → 待审核,重新进入审核队列(对齐设计文档,与下架 takedown 区分) */ @Transactional public void revoke(Long id, Long operatorId) { @@ -187,9 +189,22 @@ public class PublicContentReviewService { if (work == null) { throw new BusinessException(404, "作品不存在"); } - work.setStatus(WorkPublishStatus.UNPUBLISHED.getValue()); - work.setModifyTime(LocalDateTime.now()); - ugcWorkMapper.updateById(work); + String current = work.getStatus(); + if (!WorkPublishStatus.PUBLISHED.getValue().equals(current) + && !WorkPublishStatus.REJECTED.getValue().equals(current)) { + throw BusinessException.of(ErrorCode.BAD_REQUEST, "当前状态不允许撤销审核"); + } + LambdaUpdateWrapper uw = new LambdaUpdateWrapper<>(); + uw.eq(UgcWork::getId, id) + .set(UgcWork::getStatus, WorkPublishStatus.PENDING_REVIEW.getValue()) + .set(UgcWork::getReviewTime, null) + .set(UgcWork::getReviewerId, null) + .set(UgcWork::getReviewNote, null) + .set(UgcWork::getModifyTime, LocalDateTime.now()); + if (WorkPublishStatus.PUBLISHED.getValue().equals(current)) { + uw.set(UgcWork::getPublishTime, null); + } + ugcWorkMapper.update(null, uw); createLog(id, "revoke", null, null, operatorId); } diff --git a/frontend/src/views/content/WorkReview.vue b/frontend/src/views/content/WorkReview.vue index 145db11..dbe442a 100644 --- a/frontend/src/views/content/WorkReview.vue +++ b/frontend/src/views/content/WorkReview.vue @@ -242,8 +242,8 @@ const statsItems = computed(() => [ { key: 'rejected', label: '今日拒绝', count: stats.value.todayRejected, icon: CloseCircleOutlined, color: '#ef4444', bgColor: 'rgba(239,68,68,0.1)' }, ]) -const statusColor: Record = { pending_review: 'orange', processing: 'blue', published: 'green', rejected: 'red', taken_down: 'default', draft: 'default' } -const statusText: Record = { pending_review: '待审核', processing: '生成中', published: '已通过', rejected: '已拒绝', taken_down: '已下架', draft: '草稿' } +const statusColor: Record = { pending_review: 'orange', processing: 'blue', published: 'green', rejected: 'red', taken_down: 'default', unpublished: 'purple', draft: 'default' } +const statusText: Record = { pending_review: '待审核', processing: '生成中', published: '已通过', rejected: '已拒绝', taken_down: '已下架', unpublished: '未发布', draft: '草稿' } const logActionText: Record = { approve: '审核通过', reject: '审核拒绝', takedown: '下架', restore: '恢复', revoke: '撤销审核' } const logActionColor: Record = { approve: 'green', reject: 'red', takedown: 'gray', restore: 'blue', revoke: 'orange' } const formatDate = (d: string) => d ? dayjs(d).format('YYYY-MM-DD HH:mm') : '-' @@ -441,6 +441,10 @@ const handleRevoke = (id: number) => { try { await request.post(`/content-review/works/${id}/revoke`) message.success('已撤销') + // 切到待审核便于立刻看到重新入队的作品 + searchStatus.value = 'pending_review' + activeFilter.value = 'pending_review' + pagination.current = 1 fetchList(); fetchStats() // 如果在详情里撤销,刷新详情 if (detailVisible.value && detailData.value?.id === id) {