import type { Priority } from './derive'; export type RequirementStatus = 'pending_review' | 'adopted' | 'rejected' | 'planned' | 'developing' | 'testing' | 'released' | 'closed'; export type Effort = 'S' | 'M' | 'L' | 'XL'; export type SourceType = 'customer' | 'internal' | 'operation' | 'aftersale' | 'market' | 'competitor' | 'management'; export interface DictItem { id: string; name: string; createdAt: string; } export interface SourceTarget { id: string; name: string; sourceType: SourceType; createdAt: string; } export interface Requirement { id: string; code: string; title: string; description: string; productId: string; projectId: string; versionId?: string; sourceType: SourceType; sourceTarget: string; platforms: string[]; typeId: string; status: RequirementStatus; priority: Priority; effort: Effort; currentStage?: string; productOwner?: string; creator: string; createdAt: string; parentId?: string; addedToVersionBy?: string; reqType?: 'original' | 'change'; changeReason?: ChangeReason; changeBy?: string; } export type ChangeReason = 'misunderstanding' | 'feedback_rework' | 'difficulty_exceeded' | 'upstream_delay'; export const CHANGE_REASON_LABEL: Record = { misunderstanding: '需求理解偏差导致返工', feedback_rework: '反馈导致返工', difficulty_exceeded: '实现难度超预期', upstream_delay: '上游交付延误', }; export const SOURCE_TYPE_LABEL: Record = { customer: '客户', internal: '内部', operation: '运营', aftersale: '售后', market: '市场', competitor: '竞品', management: '管理层', }; export const SOURCE_TARGET_LABEL: Record = { customer: '来源客户', internal: '提出部门', operation: '提出部门', aftersale: '提出部门', market: '来源渠道', competitor: '竞品名称', management: '提出人', }; export const REQ_STATUS_LABEL: Record = { pending_review: '待评审', adopted: '已采纳', rejected: '已拒绝', planned: '已规划', developing: '开发中', testing: '测试中', released: '已上线', closed: '已关闭', }; export const REQ_STATUS_COLOR: Record = { pending_review: 'bg-zinc-100 text-zinc-700 border border-zinc-200', adopted: 'bg-emerald-50 text-emerald-700 border border-emerald-200', rejected: 'bg-red-50 text-red-600 border border-red-200', planned: 'bg-blue-50 text-blue-700 border border-blue-200', developing: 'bg-indigo-50 text-indigo-700 border border-indigo-200', testing: 'bg-purple-50 text-purple-700 border border-purple-200', released: 'bg-emerald-50 text-emerald-700 border border-emerald-200', closed: 'bg-zinc-50 text-zinc-500 border border-zinc-200', }; export const EFFORT_LABEL: Record = { S: 'S (1-2天)', M: 'M (3-5天)', L: 'L (5-10天)', XL: 'XL (10+天)', }; export const EFFORT_SHORT: Record = { S: 'S', M: 'M', L: 'L', XL: 'XL', }; export const EFFORT_COLOR: Record = { S: 'bg-emerald-50 text-emerald-700', M: 'bg-blue-50 text-blue-700', L: 'bg-orange-50 text-orange-700', XL: 'bg-red-50 text-red-700', };