V{selectedVersion.version} 作品内容
{!isLatestSelected && 历史版本 · 只读}提交于 {formatDateTime(selectedVersion.submittedAt)} {selectedVersion.completedAt ? ` · 评审完成于 ${formatDateTime(selectedVersion.completedAt)}` : ''}
{selectedVersion.submissionNote}
'use client' import Image from 'next/image' import { useEffect, useMemo, useState } from 'react' import type { WorkReviewProject, WorkReviewReview, WorkReviewRole, WorkReviewVersion, } from '@/types/work-review' import { WorkReviewImageGallery } from './WorkReviewImageGallery' import { WorkReviewDecisionBadge, WorkReviewStatusBadge } from './WorkReviewStatusBadge' function formatDateOnly(value: string) { const raw = String(value || '') const datePart = raw.match(/^\d{4}-\d{2}-\d{2}/)?.[0] return datePart || '-' } function formatDateTime(value?: string | null) { if (!value) return '-' const date = new Date(value) if (Number.isNaN(date.getTime())) return '-' return new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false, }).format(date) } function proxyImageUrl(value: string) { if (!/^https?:\/\//i.test(value)) return value try { const parsed = new URL(value) if (['s3.jiansun.vip', 's3.yydd.ai', 's3.1080p.hk'].includes(parsed.hostname.toLowerCase())) { return `/api/proxy-media?url=${encodeURIComponent(value)}` } } catch { // 使用原地址。 } return value } function getVersionReview(version: WorkReviewVersion, role: WorkReviewRole) { return version.reviews.find((review) => review.reviewerRole === role) || null } function ReviewProgress({ project, version, }: { project: WorkReviewProject version: WorkReviewVersion }) { const roles: Array<{ role: WorkReviewRole; label: string; name: string }> = [ { role: 'manager', label: '主管', name: project.manager.name }, { role: 'final_reviewer', label: '元泽', name: project.finalReviewer.name }, ] return (
提交于 {formatDateTime(selectedVersion.submittedAt)} {selectedVersion.completedAt ? ` · 评审完成于 ${formatDateTime(selectedVersion.completedAt)}` : ''}
{selectedVersion.submissionNote}
{item.comment}
{review.generalComment}
{canReview ? '当前版本等待你填写逐图评审建议' : '等待评审人提交'}
{canReview && ( )}