gongxiangp2/types/work-review.ts
2026-08-05 16:49:54 +08:00

179 lines
3.8 KiB
TypeScript

export type WorkReviewStatus = 'pending_review' | 'revision_required' | 'approved'
export type WorkReviewRole = 'manager' | 'final_reviewer'
export type WorkReviewReviewMode = 'dual' | 'single_reviewer_test'
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
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
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
}