- 请确认已处理 V{project?.latestVersion || 1} 中的评审建议。提交后,原评审人与元泽会收到 V{nextVersion} 的新一轮评审通知。
+ 请确认已处理 V{project?.latestVersion || 1} 中的评审建议。提交后,{project?.reviewMode === 'single_reviewer_test'
+ ? '原评审人会收到'
+ : '原评审人与元泽会收到'} V{nextVersion} 的新一轮评审通知。
>
)}
diff --git a/components/work-review/WorkReviewProjectCard.tsx b/components/work-review/WorkReviewProjectCard.tsx
index e23d195..93fcf26 100644
--- a/components/work-review/WorkReviewProjectCard.tsx
+++ b/components/work-review/WorkReviewProjectCard.tsx
@@ -49,10 +49,20 @@ function getVersionReview(version: WorkReviewVersion, role: WorkReviewRole) {
return version.reviews.find((review) => review.reviewerRole === role) || null
}
-function getVersionAnnotations(version: WorkReviewVersion): WorkReviewDisplayAnnotation[][] {
+function getRequiredReviewRoles(project: WorkReviewProject): WorkReviewRole[] {
+ return project.requiredReviewRoles?.length
+ ? project.requiredReviewRoles
+ : ['manager', 'final_reviewer']
+}
+
+function getVersionAnnotations(
+ version: WorkReviewVersion,
+ requiredRoles: WorkReviewRole[],
+): WorkReviewDisplayAnnotation[][] {
const imageCount = version.imageGroups?.length || version.imageUrls?.length || 0
const result = Array.from({ length: imageCount }, () => [] as WorkReviewDisplayAnnotation[])
for (const review of version.reviews || []) {
+ if (!requiredRoles.includes(review.reviewerRole)) continue
for (const imageComment of review.imageComments || []) {
if (!result[imageComment.imageIndex]) continue
result[imageComment.imageIndex].push(...(imageComment.annotations || []).map((annotation, index) => ({
@@ -73,10 +83,12 @@ function ReviewProgress({
project: WorkReviewProject
version: WorkReviewVersion
}) {
- const roles: Array<{ role: WorkReviewRole; label: string; name: string }> = [
+ const requiredRoles = getRequiredReviewRoles(project)
+ const allRoles: Array<{ role: WorkReviewRole; label: string; name: string }> = [
{ role: 'manager', label: '评审人', name: project.manager.name },
{ role: 'final_reviewer', label: '元泽', name: project.finalReviewer.name },
]
+ const roles = allRoles.filter((item) => requiredRoles.includes(item.role))
return (
@@ -121,9 +133,11 @@ export function WorkReviewProjectCard({
)
const cover = latestVersion?.imageGroups?.[0]?.previewUrl || latestVersion?.imageUrls?.[0] || ''
const isLatestSelected = selectedVersion?.id === latestVersion?.id
+ const requiredReviewRoles = getRequiredReviewRoles(project)
+ const singleReviewerTest = project.reviewMode === 'single_reviewer_test'
const annotationsByImageIndex = useMemo(
- () => selectedVersion ? getVersionAnnotations(selectedVersion) : [],
- [selectedVersion],
+ () => selectedVersion ? getVersionAnnotations(selectedVersion, requiredReviewRoles) : [],
+ [requiredReviewRoles, selectedVersion],
)
if (!latestVersion || !selectedVersion) return null
@@ -270,30 +284,34 @@ export function WorkReviewProjectCard({
-
双评审意见
+ {singleReviewerTest ? '评审意见' : '双评审意见'}
-
-
-
+
+ {requiredReviewRoles.includes('manager') && (
+
+ )}
+ {requiredReviewRoles.includes('final_reviewer') && (
+
+ )}
diff --git a/components/work-review/WorkReviewReviewerWorkspace.tsx b/components/work-review/WorkReviewReviewerWorkspace.tsx
index 8698069..8ba7ba3 100644
--- a/components/work-review/WorkReviewReviewerWorkspace.tsx
+++ b/components/work-review/WorkReviewReviewerWorkspace.tsx
@@ -7,6 +7,7 @@ import type {
WorkReviewImageGroup,
WorkReviewProject,
WorkReviewReviewInput,
+ WorkReviewRole,
WorkReviewVersion,
} from '@/types/work-review'
import {
@@ -404,6 +405,13 @@ export function WorkReviewReviewerWorkspace({
if (!selectedVersion || !latestVersion) return null
const isLatestSelected = selectedVersion.id === latestVersion.id
+ const requiredReviewRoles: WorkReviewRole[] = project.requiredReviewRoles?.length
+ ? project.requiredReviewRoles
+ : ['manager', 'final_reviewer']
+ const singleReviewerTest = project.reviewMode === 'single_reviewer_test'
+ const relevantReviews = selectedVersion.reviews.filter((review) => (
+ requiredReviewRoles.includes(review.reviewerRole)
+ ))
const pendingRole = isLatestSelected ? project.permissions.pendingReviewRoles[0] : undefined
const currentDrafts = draftAnnotations[activeWorkImageIndex] || []
const selectedDraft = selectedAnnotation
@@ -413,13 +421,13 @@ export function WorkReviewReviewerWorkspace({
? draftAnnotations[positionEditableAnnotation.imageIndex]?.find((item) => item.id === positionEditableAnnotation.id)
: undefined
const totalDraftCount = draftAnnotations.reduce((sum, annotations) => sum + annotations.length, 0)
- const totalSubmittedAnnotationCount = selectedVersion.reviews.reduce((reviewSum, review) => (
+ const totalSubmittedAnnotationCount = relevantReviews.reduce((reviewSum, review) => (
reviewSum + (review.imageComments || []).reduce((imageSum, imageComment) => (
imageSum + (imageComment.annotations?.length || 0)
), 0)
), 0)
const totalAnnotationCount = totalSubmittedAnnotationCount + totalDraftCount
- const submittedAnnotations: WorkReviewDisplayAnnotation[] = selectedVersion.reviews.flatMap((review) => {
+ const submittedAnnotations: WorkReviewDisplayAnnotation[] = relevantReviews.flatMap((review) => {
const imageComment = (review.imageComments || []).find((item) => item.imageIndex === activeWorkImageIndex)
return (imageComment?.annotations || []).map((annotation, index) => ({
annotation,
@@ -627,6 +635,11 @@ export function WorkReviewReviewerWorkspace({
return (
+ {singleReviewerTest && (
+
+ 测试模式:当前作品由指定评审人单独完成评审,已跳过元泽。
+
+ )}