186 lines
4.2 KiB
TypeScript
186 lines
4.2 KiB
TypeScript
export type WorkReviewStatus = 'pending_review' | 'revision_required' | 'approved'
|
|
|
|
export type WorkReviewRole = 'manager' | 'final_reviewer'
|
|
|
|
export type WorkReviewReviewMode = 'dual' | 'single_reviewer_test'
|
|
|
|
/** 作品过稿看板当前使用的品牌选项。 */
|
|
export const WORK_REVIEW_BRANDS = ['亿家达', '卓禾', '欧意朗', '顾家', '索菲亚', '朴美'] as const
|
|
export type WorkReviewBrand = typeof WORK_REVIEW_BRANDS[number]
|
|
|
|
export type WorkReviewDecision = 'approved' | 'revision_required'
|
|
|
|
export type WorkReviewAnnotationShape = 'point' | 'rectangle' | 'ellipse' | 'arrow'
|
|
|
|
export type WorkReviewImageAnnotation = {
|
|
id: string
|
|
x: number
|
|
y: number
|
|
x2?: number
|
|
y2?: number
|
|
shape?: WorkReviewAnnotationShape
|
|
color?: string
|
|
comment: string
|
|
}
|
|
|
|
export type WorkReviewImageSlice = {
|
|
url: string
|
|
width: number
|
|
height: number
|
|
}
|
|
|
|
export type WorkReviewImageGroup = {
|
|
version?: number
|
|
imageId?: string
|
|
sourceName: string
|
|
sourceWidth?: number
|
|
sourceHeight?: number
|
|
previewUrl: string
|
|
previewWidth: number
|
|
previewHeight: number
|
|
width: number
|
|
height: number
|
|
slices: WorkReviewImageSlice[]
|
|
}
|
|
|
|
export type WorkReviewImageComment = {
|
|
imageId?: string
|
|
imageIndex: number
|
|
sourceName?: string
|
|
decision: WorkReviewDecision
|
|
comment: string
|
|
annotations?: WorkReviewImageAnnotation[]
|
|
}
|
|
|
|
export type WorkReviewReview = {
|
|
id: string
|
|
reviewerRole: WorkReviewRole
|
|
reviewerName: string
|
|
decision: WorkReviewDecision
|
|
imageComments: WorkReviewImageComment[]
|
|
generalComment: string | null
|
|
reviewedAt: string
|
|
}
|
|
|
|
export type WorkReviewVersion = {
|
|
id: string
|
|
version: number
|
|
submissionNote: string | null
|
|
status: WorkReviewStatus
|
|
submittedAt: string
|
|
completedAt: string | null
|
|
imageUrls: string[]
|
|
imageGroups: WorkReviewImageGroup[]
|
|
referenceImageUrls: string[]
|
|
referenceImageGroups: WorkReviewImageGroup[]
|
|
reviews: WorkReviewReview[]
|
|
}
|
|
|
|
export type WorkReviewPerson = {
|
|
id: string
|
|
name: string
|
|
}
|
|
|
|
export type WorkReviewReviewerOption = WorkReviewPerson & {
|
|
jobNumber: string | null
|
|
departmentName: string | null
|
|
positionTitle: string | null
|
|
}
|
|
|
|
export type WorkReviewProject = {
|
|
id: string
|
|
title: string
|
|
/** 新提交作品必填;历史作品可能尚未补录。 */
|
|
brand?: string | null
|
|
description: string | null
|
|
workDate: string
|
|
status: WorkReviewStatus
|
|
latestVersion: number
|
|
submitter: WorkReviewPerson & {
|
|
snapshot?: Record<string, unknown> | null
|
|
}
|
|
manager: WorkReviewPerson
|
|
finalReviewer: WorkReviewPerson
|
|
createdAt: string
|
|
updatedAt: string
|
|
reviewMode?: WorkReviewReviewMode
|
|
requiredReviewRoles?: WorkReviewRole[]
|
|
versions: WorkReviewVersion[]
|
|
permissions: {
|
|
canResubmit: boolean
|
|
pendingReviewRoles: WorkReviewRole[]
|
|
}
|
|
}
|
|
|
|
export type WorkReviewMe = {
|
|
user: {
|
|
id: string
|
|
name: string
|
|
avatar: string | null
|
|
role: string
|
|
}
|
|
employee: {
|
|
id: string
|
|
displayName: string
|
|
flowerName?: string | null
|
|
realName?: string | null
|
|
departmentName?: string | null
|
|
positionTitle?: string | null
|
|
positionLevel?: string | null
|
|
levelType?: string | null
|
|
} | null
|
|
permissions: {
|
|
canSubmit: boolean
|
|
canDeleteProjects: boolean
|
|
isSystemAdmin: boolean
|
|
isManager: boolean
|
|
isFinalReviewer: boolean
|
|
}
|
|
}
|
|
|
|
export type WorkReviewBoardData = {
|
|
me: WorkReviewMe
|
|
items: WorkReviewProject[]
|
|
pagination: {
|
|
page: number
|
|
pageSize: number
|
|
total: number
|
|
totalPages: number
|
|
}
|
|
}
|
|
|
|
export type WorkReviewProcessedImage = {
|
|
uploadId: string
|
|
mimeType: 'image/webp'
|
|
width: number
|
|
height: number
|
|
kind: 'slice' | 'preview'
|
|
sourceName: string
|
|
sourceIndex: number
|
|
sliceIndex: number
|
|
sliceCount: number
|
|
}
|
|
|
|
export type WorkReviewSubmissionInput = {
|
|
title?: string
|
|
brand?: string
|
|
description?: string
|
|
workDate?: string
|
|
reviewerEmployeeId?: string
|
|
expectedLatestVersion?: number
|
|
submissionNote?: string
|
|
processedImages: WorkReviewProcessedImage[]
|
|
processedReferenceImages: WorkReviewProcessedImage[]
|
|
}
|
|
|
|
export type WorkReviewReviewInput = {
|
|
reviewerRole: WorkReviewRole
|
|
imageComments: Array<{
|
|
imageIndex: number
|
|
decision: WorkReviewDecision
|
|
comment: string
|
|
annotations?: WorkReviewImageAnnotation[]
|
|
}>
|
|
generalComment: string
|
|
}
|