feat: 计划转交功能 + 关联需求增强(描述/变更/类型/日期)

一、调研/产品方案/UI设计 - 转交功能:
- 未开始/进行中状态可转交给其他参与人员
- 转交按钮打开内联选择器,从 version.members 选人
- 确认后更新 plan.owner

二、关联需求表格增强:
- 描述列:超出宽度省略号,hover 显示完整 title 属性
- 需求类型列:原始需求(灰色)/ 变更需求(橙色)
- 变更原因列:显示变更原因标签
- 添加日期列:显示 createdAt

三、需求变更功能:
- 新增"需求变更"按钮(橙色边框)
- 变更表单:变更人员(从参与人员选)、变更原因(6种)、
  需求概述、需求详细
- 变更原因选项:需求理解偏差导致返工、反馈导致返工、
  实现难度超预期、上游交付延误、范围蔓延、其他
- 创建后自动关联到当前版本,标记为变更需求

四、数据模型扩展(lib/requirement.ts):
- 新增 reqType: 'original' | 'change'
- 新增 changeReason: ChangeReason
- 新增 changeBy: string
- 导出 CHANGE_REASON_LABEL 常量

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Script Generator
2026-06-15 16:21:14 +08:00
parent 54efe53b11
commit 700c8a9aba
4 changed files with 158 additions and 10 deletions

View File

@@ -52,7 +52,7 @@ export default function VersionDetailPage() {
const router = useRouter();
const versionId = params.id as string;
const { overview, fetchOverview, updateVersion, deleteVersion } = useProductStore();
const { requirements, fetchRequirements, updateRequirement } = useRequirementStore();
const { requirements, fetchRequirements, updateRequirement, createRequirement } = useRequirementStore();
const { records, fetchRecords } = useOvertimeStore();
const { plans, fetchPlans, createPlan, updatePlan, completePlan, deletePlan } = useVersionPlanStore();
const { tasks: devTasks, fetchTasks: fetchDevTasks, deleteTask: deleteDevTask } = useDevTaskStore();
@@ -751,11 +751,30 @@ export default function VersionDetailPage() {
projectId={version.projectId}
requirements={requirements}
devTasks={devTasks}
versionMembers={version.members ?? []}
currentUserName={user?.name ?? ''}
onLink={(ids, addedBy) => {
ids.forEach((id) => updateRequirement(id, { versionId: version.id, addedToVersionBy: addedBy }));
}}
onUnlink={(id) => updateRequirement(id, { versionId: undefined, addedToVersionBy: undefined })}
onCreateChange={(data) => {
createRequirement({
...data,
productId: version.productId,
projectId: version.projectId,
versionId: version.id,
sourceType: 'internal',
sourceTarget: '',
platforms: [],
typeId: '',
status: 'adopted',
priority: 'P2',
effort: 'M',
creator: user?.name ?? '',
addedToVersionBy: user?.name ?? '',
reqType: 'change',
} as any);
}}
/>
) : (activeTab === 'research' || activeTab === 'product' || activeTab === 'ui') ? (
(() => {
@@ -769,6 +788,7 @@ export default function VersionDetailPage() {
versionDeadline={version.expectedReleaseDate ?? undefined}
currentUserName={user?.name ?? ''}
planType={pt}
versionMembers={version.members ?? []}
linkedRequirements={pt !== 'research' ? linkedReqs : undefined}
onCreate={(data) => {
createPlan(data);