核心改动: - TestCase 主归属 versionId,requirementId 改为可选语义标签 - Bug 新增 versionId(直接挂版本)+ requirementId(可选追溯) - 新增 calcVersionExecutionStatus() 版本执行态推导函数 规则:DevTask全部提测→已提测,TestCase全部通过+Bug全关→可发布 - 概览页展示推导出的执行态标签 - BugTab 改为直接 versionId 查询(不再走 testCase→req 链路) - 统计卡片"参与人员"替换为"未关闭Bug" 心智模型: 版本(执行线)→ DevTask/TestCase/Bug 需求(语义线)→ 解释为什么做,不驱动流程 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import type { Priority } from './derive';
|
|
|
|
export type BugStatus = 'open' | 'fixing' | 'fixed' | 'verifying' | 'closed' | 'rejected';
|
|
export type BugSeverity = 'critical' | 'major' | 'minor' | 'trivial';
|
|
|
|
export interface Bug {
|
|
id: string;
|
|
bugNo: string;
|
|
versionId: string;
|
|
testCaseId: string;
|
|
requirementId?: string;
|
|
title: string;
|
|
description: string;
|
|
severity: BugSeverity;
|
|
priority: Priority;
|
|
reportedBy: string;
|
|
assigneeId: string;
|
|
status: BugStatus;
|
|
resolvedAt?: string;
|
|
closedAt?: string;
|
|
resolution?: string;
|
|
createdAt: string;
|
|
updatedAt: string;
|
|
}
|
|
|
|
export const BUG_STATUS_LABEL: Record<BugStatus, string> = {
|
|
open: '待修复',
|
|
fixing: '修复中',
|
|
fixed: '已修复',
|
|
verifying: '验证中',
|
|
closed: '已关闭',
|
|
rejected: '已拒绝',
|
|
};
|
|
|
|
export const BUG_STATUS_COLOR: Record<BugStatus, string> = {
|
|
open: 'bg-red-50 text-red-600',
|
|
fixing: 'bg-blue-50 text-blue-600',
|
|
fixed: 'bg-indigo-50 text-indigo-600',
|
|
verifying: 'bg-purple-50 text-purple-600',
|
|
closed: 'bg-emerald-50 text-emerald-600',
|
|
rejected: 'bg-zinc-100 text-zinc-500',
|
|
};
|
|
|
|
export const BUG_SEVERITY_LABEL: Record<BugSeverity, string> = {
|
|
critical: '致命',
|
|
major: '严重',
|
|
minor: '一般',
|
|
trivial: '轻微',
|
|
};
|
|
|
|
export const BUG_SEVERITY_COLOR: Record<BugSeverity, string> = {
|
|
critical: 'bg-red-100 text-red-700',
|
|
major: 'bg-orange-50 text-orange-700',
|
|
minor: 'bg-yellow-50 text-yellow-700',
|
|
trivial: 'bg-zinc-100 text-zinc-600',
|
|
};
|
|
|
|
export const BUG_ALLOWED_TRANSITIONS: Record<BugStatus, BugStatus[]> = {
|
|
open: ['fixing', 'rejected'],
|
|
fixing: ['fixed'],
|
|
fixed: ['verifying'],
|
|
verifying: ['closed', 'open'],
|
|
closed: [],
|
|
rejected: [],
|
|
};
|
|
|
|
export function canBugTransition(from: BugStatus, to: BugStatus): boolean {
|
|
return BUG_ALLOWED_TRANSITIONS[from].includes(to);
|
|
}
|
|
|
|
export function generateBugNo(existingBugs: Bug[]): string {
|
|
const maxNum = existingBugs.reduce((max, b) => {
|
|
const num = parseInt(b.bugNo.replace('BUG-', ''), 10);
|
|
return isNaN(num) ? max : Math.max(max, num);
|
|
}, 0);
|
|
return `BUG-${String(maxNum + 1).padStart(3, '0')}`;
|
|
}
|