From 43d3f76e6af471de90b2442f4b59fbbae7f96e55 Mon Sep 17 00:00:00 2001 From: Script Generator Date: Mon, 15 Jun 2026 15:09:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=9C=80=E6=B1=82=E6=B1=A0=E9=87=8D?= =?UTF-8?q?=E6=9E=84=20+=20=E8=81=94=E5=8A=A8=E5=BC=95=E6=93=8E=20+=20?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E7=8A=B6=E6=80=81=E6=8E=A8=E5=AF=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 架构:新建 lib/linkage-engine.ts 联动引擎 - deriveReqDevStatus(): 从 devTasks 推导需求开发状态 - canEditRequirement(): 开发中的需求不可编辑 - checkVersionChangeRisk(): 版本变更风险检查 - 所有跨模块推导逻辑集中在此文件 功能改动: 1. 导航改名"需求"→"需求池" 2. 新建需求:所属产品/项目必填,移除产品负责人字段 3. 需求表格新增"开发状态"列: 未排期/待开发/开发中/已完成(从 devTasks 实时推导) 4. 开发中的需求:编辑按钮禁用 5. 需求设 versionId → 版本详情关联需求天然兼容 (版本详情通过 filter(r.versionId === versionId) 读取) Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/web/app/requirements/page.tsx | 23 +++++--- apps/web/components/layout/Sidebar.tsx | 2 +- .../requirement/RequirementModal.tsx | 25 ++------- apps/web/lib/linkage-engine.ts | 52 +++++++++++++++++++ apps/web/lib/requirement.ts | 2 +- 5 files changed, 76 insertions(+), 28 deletions(-) create mode 100644 apps/web/lib/linkage-engine.ts diff --git a/apps/web/app/requirements/page.tsx b/apps/web/app/requirements/page.tsx index 3e84850..ec8f117 100644 --- a/apps/web/app/requirements/page.tsx +++ b/apps/web/app/requirements/page.tsx @@ -4,9 +4,11 @@ import { useEffect, useMemo, useState } from 'react'; import { Search, Plus, Lightbulb, ArrowUp, ArrowDown } from 'lucide-react'; import { useRequirementStore } from '@/stores/useRequirementStore'; import { useProductStore } from '@/stores/useProductStore'; +import { useDevTaskStore } from '@/stores/useDevTaskStore'; import { flattenProjects, flattenVersions } from '@/lib/derive'; import { REQ_STATUS_LABEL, REQ_STATUS_COLOR, SOURCE_TYPE_LABEL } from '@/lib/requirement'; import type { Requirement, RequirementStatus, SourceType } from '@/lib/requirement'; +import { deriveReqDevStatus, canEditRequirement, REQ_DEV_STATUS_LABEL, REQ_DEV_STATUS_COLOR } from '@/lib/linkage-engine'; import { Pagination, usePagination } from '@/components/Pagination'; import { RequirementModal } from '@/components/requirement/RequirementModal'; import { RequirementDetail } from '@/components/requirement/RequirementDetail'; @@ -42,6 +44,7 @@ export default function RequirementsPage() { addPlatform, updatePlatform, deletePlatform, } = useRequirementStore(); const { overview, fetchOverview } = useProductStore(); + const { tasks: devTasks, fetchTasks: fetchDevTasks } = useDevTaskStore(); const allProjects = useMemo(() => flattenProjects(overview), [overview]); const allVersions = useMemo(() => flattenVersions(overview), [overview]); @@ -62,6 +65,7 @@ export default function RequirementsPage() { useEffect(() => { fetchOverview(); }, [fetchOverview]); useEffect(() => { fetchRequirements(); }, [fetchRequirements]); + useEffect(() => { fetchDevTasks(); }, [fetchDevTasks]); // Resolve version name from overview const resolveVersionName = (versionId?: string): string => { @@ -249,7 +253,7 @@ export default function RequirementsPage() { 状态 优先级 所属版本 - 产品负责人 + 开发状态 录入人员 - {/* 产品负责人 */} - - {req.productOwner || '-'} + {/* 开发状态 */} + + {(() => { + const devStatus = deriveReqDevStatus(req.id, devTasks); + return ( + + {REQ_DEV_STATUS_LABEL[devStatus]} + + ); + })()} {/* 录入人员 */} @@ -332,8 +343,8 @@ export default function RequirementsPage() { {/* 操作 */} e.stopPropagation()}>
- {/* 编辑:待评审/已采纳/已规划 */} - {(['pending_review', 'adopted', 'planned'] as const).includes(req.status as any) && ( + {/* 编辑:待评审/已采纳/已规划,且开发中不可编辑 */} + {(['pending_review', 'adopted', 'planned'] as const).includes(req.status as any) && canEditRequirement(req.id, devTasks) && (