58 Commits

Author SHA1 Message Date
2e595c7e72 refactor(data): 收口关系表运行时数据源
Some checks failed
Deploy Production / Build, push, deploy, verify (push) Has been cancelled
- 移除已迁移业务 AppData 运行时 fallback,改走领域 API 和关系表快读
- 补齐需求产品负责人、版本计划任务 JSON 和成员 username 回填迁移
- 统一治理字典入口,并补充 AI provider、数据源契约和领域服务测试

Co-Authored-By: Codex GPT-5 <codex@openai.com>
2026-07-09 14:59:49 +08:00
d18bbfa14b merge: 集成V2.7 企业协作与管理治理
# Conflicts:
#	apps/server/src/app.module.ts
#	apps/web/components/layout/Sidebar.tsx
#	apps/web/lib/permissions.ts
#	docs/architecture.md
#	docs/decisions.md
#	docs/roadmap.md
2026-07-08 18:10:08 +08:00
9ba9449c1a feat(v2.7): 接入协作治理前端体验 2026-07-08 16:31:06 +08:00
da71128ccd feat(v2.4): 完成领域主写迁移 2026-07-08 15:41:39 +08:00
2358dbd0b5 feat(v2.4): 切换测试与缺陷主写 2026-07-08 14:15:49 +08:00
1bf630a7bc feat(v2.4): 切换计划与开发任务主写 2026-07-08 12:34:33 +08:00
5f5a211c99 feat(v2.4): 切换需求池领域主写 2026-07-08 12:18:15 +08:00
142800f75b feat(v2.4): 切换根数据领域主写 2026-07-08 12:07:35 +08:00
Script Generator
b4a3c990b4 fix(data): 增加全局保存失败保护 2026-07-03 19:36:18 +08:00
Script Generator
516a5f1b63 fix(member): 修复成员密码保存失败误报成功 2026-07-03 19:10:02 +08:00
Script Generator
51767579d7 fix(product): 透传产品树AppData保存失败 2026-07-03 16:54:38 +08:00
cc73570396 fix(product): 以 AppData 产品树作为展示主源 2026-07-03 16:30:17 +08:00
Script Generator
a509bb4922 perf(web): 优化大数据量页面切换与聚合性能 2026-07-03 09:43:36 +08:00
Script Generator
68b768788b fix(ai): 收紧AI任务类型入库规则 2026-07-02 18:19:34 +08:00
Script Generator
a39dde3824 fix(ai): 自动追加AI任务类型 2026-07-02 18:01:38 +08:00
Script Generator
916bd17a48 fix(data): 清理旧数据并保护服务端写入 2026-07-02 09:30:50 +08:00
Script Generator
8947aeaac7 feat(工作台): 细化计划进展工时证据
关键改动:

- 支持需求覆盖和调研方向开始工作记录

- 日报按计划记录开始时间和进度下次开始时间计算证据

- 更新版本编辑校验、项目展示和 workflow 说明

Co-Authored-By: Codex GPT-5 <codex@openai.com>
2026-07-01 11:02:38 +08:00
Script Generator
eef3c8f000 feat(版本): 优化概览与只读状态
关键改动:

- 增加需求排序和版本只读状态规则及测试

- 完善版本概览阶段耗时、项目页和工作台展示

- 优化小宝预警请求节流、建议状态和风险过滤

Co-Authored-By: Codex GPT-5 <codex@openai.com>
2026-06-30 18:18:18 +08:00
Script Generator
3d3d56697a feat(版本): 完善研发计划与预警已读
关键改动:

- 增加版本表单、发布校验和调研方向进度规则

- 扩展小宝预警已读状态、风险签名和今日证据

- 补充组长权限、加班查看范围、活动记录与相关测试

Co-Authored-By: Codex GPT-5 <codex@openai.com>
2026-06-30 16:48:58 +08:00
Script Generator
04520bd8c5 feat(版本): 记录计划需求进展活动
关键改动:

- 记录产品/UI 计划需求覆盖进展,并写入工作活动与实体日志

- 日报和小宝预警补充需求进展活动证据

- 调整版本列表与需求覆盖面板展示,并补充测试

Co-Authored-By: Codex GPT-5 <codex@openai.com>
2026-06-30 15:35:36 +08:00
Script Generator
b365ce65a3 fix(小宝预警): 保证建议不为空并显示更新中 2026-06-30 14:55:13 +08:00
Script Generator
eb9996a987 fix(小宝预警): 等待缓存加载后再触发AI建议 2026-06-30 09:56:45 +08:00
Script Generator
7b1a48f1f7 fix(小宝预警): 串行保存风险缓存 2026-06-29 18:46:54 +08:00
Script Generator
b11830278c fix(小宝预警): 合并远端风险缓存 2026-06-29 18:44:59 +08:00
Script Generator
db72a420f5 feat(小宝预警): 增加趋势与解读缓存 2026-06-29 18:37:39 +08:00
Script Generator
46a002f817 feat(小宝预警): 增加权限与数据键 2026-06-29 17:13:54 +08:00
Script Generator
4278e4d565 feat(workspace): 增加工作活动日报引擎 2026-06-26 17:17:35 +08:00
Script Generator
2d802318fa feat(版本详情): 优化任务统计与测试轮次 2026-06-26 15:12:24 +08:00
Script Generator
4cda624dc7 fix(账号): 固化超级管理员身份 2026-06-26 11:18:00 +08:00
Script Generator
56e0fe562d feat(ai): 优化拆解重跑与结果展示 2026-06-26 11:01:11 +08:00
Script Generator
55e24442ab fix(任务): 修复快速创建导致的重复ID 2026-06-25 18:03:53 +08:00
Script Generator
5adc7759ad feat(平台): 补齐服务端持久化和AI拆解契约 2026-06-25 15:21:32 +08:00
Script Generator
125057ea55 feat(Bug): 状态流转接入单条工作流 2026-06-25 14:47:28 +08:00
Script Generator
c617625a99 feat(测试用例): 状态流转接入单条工作流 2026-06-25 14:13:32 +08:00
Script Generator
52833d81ac feat(开发任务): 状态流转接入单条工作流 2026-06-25 14:04:45 +08:00
Script Generator
d0fd390bd0 fix: 创建产品后要刷新才出现 + 刷新后已有产品的项目被清空
根因:
1. createProduct try 路径调 fetchOverview,但 fetchOverview 第 103 行
   `if (overview.length > 0) return` 直接 early return,导致新产品没被加进
   overview,需刷新才能从 localStorage 重读。
2. fetchOverview 在 cached 已有数据时仍会调 api.get 拉远端,远端 mock
   返回简化数据(无 projects)覆盖整个 overview,导致已有产品下的项目消失。

修复(mock 模式核心数据完全本地化):
- createProduct:直接本地新增 + saveLocal,异步尝试远端但不依赖(不再调
  fetchOverview)
- fetchOverview:cached 有数据时直接用,不再调远端覆盖;空时才走远端/MOCK 路径

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-17 11:23:39 +08:00
Script Generator
cad190d83b feat: 项目模块加删除按钮(仅超管 + 无版本可删)
- useProductStore 加 deleteProject(productId, projectId) action
- ProjectRow 行右侧加三点菜单(MoreHorizontal)+ 下拉项「删除项目」
- 项目下有版本时菜单项 disabled + tooltip「项目下还有 N 个版本,不可删除」
- 仅有 project:delete 权限的角色(默认仅超管)能看到三点 icon
- 点击删除 → confirm → 调 deleteProject

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-17 11:11:19 +08:00
Script Generator
53ae3f02a5 fix: 新建需求漏传 status 字段导致状态/操作按钮不显示
根因:RequirementModal.handleSubmit 提交时漏传 status,store
createRequirement 也无默认值,落库 status 为 undefined。
page.tsx 的所有操作按钮均按 req.status === '...' 判断,
undefined 不匹配任何分支 → 所有按钮消失;REQ_STATUS_LABEL[undefined]
也是 undefined → 状态列空白。

修复(双兜底,二选一就够,但都改更稳):
- RequirementModal.tsx: handleSubmit 加 status: initial?.status ?? 'pending_review'
- useRequirementStore.ts: createRequirement 加 status: data.status ?? 'pending_review'

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-16 20:55:04 +08:00
Script Generator
75519fd4e3 fix: 需求池操作矩阵微调 + 来源管理 bug 修复
需求池:
- 已采纳状态去掉「删除」操作(推进后不应直接删除,要走拒绝路径)

来源管理:
- 清空预设 mock 数据(海底捞/西贝/喜茶/奈雪等 17 条),用户自己维护
- 修复新建需求选「新建的来源对象」时显示数字 ID bug:
  原因是 RequirementModal 里 <option value={t.id}> 存了 ID,但 mock
  和详情页直接读 sourceTarget 当名字展示,导致新建的对象只显示 ID。
  改为 <option value={t.name}> 与 mock 数据格式对齐

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-16 20:39:03 +08:00
Script Generator
7c49868c4f feat: 个人中心管理(编辑信息 + 修改密码 + 退出登录)
- 新增 /profile 路由:两个 Tab(个人信息 / 修改密码)+ 退出按钮
- Sidebar 底部用户区改造:绑定真实登录用户(头像/姓名/角色)+ 加 Settings icon 跳 /profile
- useAuthStore 加 refreshUser:保存信息后立即同步 Sidebar 显示
- 个人信息表单:姓名/手机/邮箱可改,部门/角色只读,复用 updateMember
- 密码修改:原密 + 新密(≥8位且≠原密) + 确认 三档校验,眼睛 icon 切换可见,下次登录生效
- 退出登录:confirm → useAuthStore.logout → /login

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-16 19:51:22 +08:00
Script Generator
c2f2fed82c feat: 加班/版本/项目调整 + 角色权限设计
加班记录:
- 加班人默认回显当前用户且不可改
- 列表加创建日期列
- 移除编辑功能(创建即提交,仅可删除)
- 提交时校验结束>开始

版本列表:
- 移除顶部 9 个状态 tab + 表格状态列
- 仅保留搜索、项目、优先级筛选

项目列表:
- 行内显示进度未达 100% 的版本(与版本页同源算法)
- 新增 lib/version-progress.ts 抽出公共进度计算

角色权限:
- RoleItem 加 permissions 字段
- 新建 lib/permissions.ts: 14 组 37 个权限点 + 默认 5 角色映射 + hasPermission
- 角色表单内嵌权限矩阵(主模块 4 件套 + Tab 二档 + Bug Tab 4 档)+ 全选/反选/仅查看快捷
- 新建 components/auth/Guard.tsx: RouteGuard + PermissionGuard + useHasPermission + AccessDenied
- Sidebar 菜单按 view 权限过滤
- 7 个主路由(products/projects/versions/requirements/overtime/admin/members/roles)包 RouteGuard
- 版本详情 Tab 按 view 权限过滤,自动跳转到第一个有权限的 Tab
- 默认未登录/无角色按只读最严格
- 超管 role-admin: ['*'] 通配符,permissions 不可改

通用:
- 新建 components/FieldError.tsx 统一表单错误文案
- PlanTab 提交时校验结束>开始

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-16 19:15:28 +08:00
Script Generator
1f5bed0c79 feat: 开发任务时间字段重构 + 双口径耗时 + 搜索 + 性能优化
核心变更:
- DevTask 字段重构:startDate/dueDate/estimateHours/actualHours 替换为 expectedStartAt/expectedEndAt/actualStartAt/actualEndAt(含时分),预计/实际工时按工作时段(9:00-12:00 + 13:00-18:00)派生计算
- 状态机自动化:到点自动切开发中、未到可手动开干、超期需填延后原因
- 新建 lib/work-hours.ts:calcWorkHours(工作时段过滤)、formatWorkHours(X h(Y 天))、calcTwoMetrics(日历/人力双口径)
- 新建 lib/dev-task-transitions.ts:状态切换守卫
- 三个 Tab 顶部统计:开发任务(预/日历/人力)、测试用例 / Bug(日历 / 人力);版本概览总人天投入改双行(日历总耗时 / 人力总投入)
- 三个 Tab 加搜索框:300ms debounce + 标题/编号模糊匹配
- 性能优化:requirementIds/categories/requirements/testCases 转 Map/Set 索引、Row 组件 React.memo
- 全局耗时显示统一带天数换算:8h(1天)、11h(1.4天)

新增文件: SearchInput.tsx, useDebouncedValue.ts, work-hours.ts, dev-task-transitions.ts, 设计文档

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-16 17:44:59 +08:00
Script Generator
273182bb0f feat: Bug 图片上传 + 转交 + 操作日志 + 开发中含自测
1. 开发中统计包含 in_progress + testing(自测)

2. Bug 支持上传图片:
   - BugCreateModal 加宽为 max-w-2xl
   - 新增拖拽/点击上传图片区域,转 base64 存储
   - 上传后可预览缩略图、可删除
   - BugDetailDrawer 展示截图列表,点击可放大

3. Bug 支持转交:
   - BugDetailDrawer 操作栏新增"转交"按钮
   - 选人下拉 + 备注输入 → 确认转交
   - transferBug store 方法:更新 assigneeId + 追加日志

4. Bug 操作日志:
   - BugLog interface: create/status_change/transfer/resolve
   - createBug 时记录创建日志
   - changeStatus 时记录状态变更/修复日志
   - transferBug 时记录转交日志
   - BugDetailDrawer 底部展示操作时间线

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-15 13:37:01 +08:00
Script Generator
da1f98968b fix: 调研/产品/UI阶段耗时改为精确时间戳计算
- VersionPlan 新增 actualStartAt 字段
- updatePlan 流转到 in_progress 时自动记录 actualStartAt
- updatePlan 流转到 completed 时自动记录 completedAt(如未设)
- 概览阶段耗时改用 actualStartAt/completedAt 计算(不再用计划排期)
- 个人耗时汇总同步使用实际时间戳

所有阶段(调研/产品/UI/开发/测试)现在统一用精确时间戳算耗时。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-12 16:24:46 +08:00
Script Generator
c86e87f95b fix: 实际耗时改为精确时间戳计算(精确到0.5h)
之前用日期+工作日×8h 计算耗时太粗糙,现改为:
- DevTask startDate/completedAt 使用完整 ISO 时间戳(含时分秒)
- TestCase startedAt/completedAt 同上
- 耗时 = (endTimestamp - startTimestamp) / 3600000,精确到0.5h
- 详情抽屉显示精确到分钟的时间(YYYY-MM-DD HH:mm)

例如:08:00 开始,10:30 提测,耗时 2.5h(不再是8h)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-12 16:11:51 +08:00
Script Generator
8b3b3b7e21 feat(test-case): 测试耗时自动计算(逻辑同开发任务)
- TestCase 新增 startedAt / completedAt 字段
- 流转到"执行中"时记录 startedAt
- 流转到"通过/失败/阻塞"时记录 completedAt
- 回退到执行中时清除 completedAt
- 测试耗时 = startedAt → completedAt 工作日 × 8h
- 列表行显示耗时,详情抽屉显示开始/完成/耗时

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-12 15:38:48 +08:00
Script Generator
10ffb874aa refactor(dev-task): 去掉"已完成"状态,"已提测"作为终态
DevTask 状态简化为:待开发 → 开发中 → 自测 → 已提测(终态)

- 提测即代表开发交付完成,不需要额外的"已完成"
- 测试通过/失败产生的是 Bug,不影响 DevTask 状态
- 移除 TestCaseStore 中的自动完成副作用(不再需要)
- 版本执行态推导规则同步更新

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-12 14:44:49 +08:00
Script Generator
633f2619d3 fix(dev-task): 实际投入时间改为 开始→提测,而非 开始→测试完成
completedAt 在 DevTask 流转到"提测"时记录,代表开发交付时间。
实际工时 = startDate → completedAt(提测日),准确反映开发投入。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-12 14:29:32 +08:00
Script Generator
e4f3817719 feat: 提测通知 + 测试全通过自动完成开发任务
1. TestCaseTab 显示提测状态横幅:
   - 绿色:开发已全部提测,可以开始测试
   - 橙色:开发进行中,显示提测进度 (x/y)

2. TestCase 全部通过 + Bug 全关闭时,自动将版本下所有
   submitted 状态的 DevTask 流转为 done(无需手动操作)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-12 14:20:44 +08:00
Script Generator
93f6c33109 refactor: 压平数据模型 — 版本为执行主线,需求降为语义标签
核心改动:
- 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>
2026-06-12 14:07:46 +08:00