Files

211 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 开发方案(v4.0:依据 PRD v1.24)
> 本文整合截至 CHG-025 的全部决策:**数值走表、文档走 MD 文件流、状态字段可查询化**。
> 一期 W≈1~2 人日(仅 1 列);二期立项评估;三期立项评估+口径锁定。
## 0. 文档信息
| 字段 | 内容 |
|---|---|
| 版本 | v4.0 |
| 状态 | 评审中 |
| 作者 | AI(pmassist/tgassist 流程产出) |
| 创建日期 | 2026-07-23 |
| 依据 | outputs/prd.md v1.24 |
### 变更记录
| 版本 | 日期 | 变更编号 | 变更说明 |
|---|---|---|---|
| v4.0 | 2026-07-23 | — | 基于 PRD v1.24 全量重生成(取代 v3.x:融入 CHG-014 MD 文件流、CHG-018 zt_file.url、CHG-019 砍 zt_task_extend、CHG-020 zt_meeting.url、CHG-021~025 zt_story 7 url 列+code_review_status+测试 4 文档字段) |
---
## 1. 架构总览
```mermaid
graph LR
subgraph AI框架
A1[pmassist: PRD/纪要/用例] --> M[MD 文件]
A2[tgassist: 审查报告/工作日志] --> M
A3[demand-assessor: 指标数值] --> N[/zt-story-expand 已有/]
A4[tgassist: 任务拆分] --> T[/zt-task/aiBatchAdd 新增/]
end
M -->|/common/uploadBind| F[zt_file + url]
F --> S[zt_story 7 url 列 + code_review_status<br/>zt_meeting.url 自动刷新]
F --> P[详情页在线渲染 MD]
F --> C[FR-014 齐备核查·三期]
```
- **数值类**:zt_story_expand(已有+一期加 1 列);任务工时入 zt_task.estimate(任务级指数豁免)
- **文档类**:一律 MD → zt_file(FileTypes 6 新类)→ url 直取 + 在线渲染
- **状态类**:code_review_status 随审查报告上传写入(SOP 卡点可系统强制)
---
## 2. 一期(极瘦版,W≈1~2 人日)
### 2.1 唯一 DDL(codes/zentao/sql/`20260724_alter_zt_story_expand_add_ai_rate.sql`,含说明头+回滚+可重入)
```sql
SET @c := (SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='zt_story_expand' AND COLUMN_NAME='ai_participation_rate');
SET @s := IF(@c=0,
'ALTER TABLE `zt_story_expand` ADD COLUMN `ai_participation_rate` VARCHAR(16) DEFAULT NULL COMMENT ''AI参与率(只存不算,口径待定)'' AFTER `ai_efficiency_coefficient`',
'SELECT 1');
PREPARE st FROM @s; EXECUTE st; DEALLOCATE PREPARE st;
-- 回滚:ALTER TABLE zt_story_expand DROP COLUMN ai_participation_rate;
```
### 2.2 实体与测试
- `ZtStoryExpand.java` 加 `private String aiParticipationRate;`(紧随 aiEfficiencyCoefficient);saveOrUpdate 自动携带,XML 不动;无新 Service/Controller
- 回归测试 1 场景:saveOrUpdate 实体带 aiParticipationRate → 透传到 insert/update(JUnit5+Mockito)
### 2.3 步骤(1 人 1~2 天)
D1 DDL+评审+本地执行+实体加字段 → D2 回归测试+dev_log+送审
### 2.4 检查单
- [ ] 仅此 1 项 DDL;无计算逻辑;无 Controller 泄漏;说明头+回滚+可重入齐全;现有编译/测试不红
---
## 3. 二期:文件流 + 接口 + 页面 + 挂钩(详细规格)
### 3.1 DDL 清单(3 个文件,均含说明头+可重入)
```sql
-- ① zt_file 加访问链接
ALTER TABLE zt_file ADD COLUMN url VARCHAR(512) DEFAULT NULL COMMENT '附件访问链接' AFTER pathname;
-- ② zt_meeting 加纪要链接(多份存最新)
ALTER TABLE zt_meeting ADD COLUMN url VARCHAR(512) DEFAULT NULL COMMENT '会议纪要MD访问链接(最新一份)';
-- ③ zt_story 加 8 列
ALTER TABLE zt_story
ADD COLUMN prd_url VARCHAR(512) DEFAULT NULL,
ADD COLUMN code_review_url VARCHAR(512) DEFAULT NULL,
ADD COLUMN work_log_url VARCHAR(512) DEFAULT NULL,
ADD COLUMN test_case_url VARCHAR(512) DEFAULT NULL,
ADD COLUMN test_report_download_url VARCHAR(512) DEFAULT NULL,
ADD COLUMN test_report_submit_url VARCHAR(512) DEFAULT NULL,
ADD COLUMN test_other_url VARCHAR(512) DEFAULT NULL,
ADD COLUMN code_review_status VARCHAR(16) DEFAULT NULL COMMENT '审查状态 pass/reject';
```
### 3.2 FileTypes 扩展 6 类 + uploadBind
`enums/FileTypes.java` 新增:`aiCodeReview`、`aiWorkLog`、`testCase`、`testReport`、`testReportSubmit`、`testOther`。
新增 `POST /common/uploadBind`(上传+绑定一步完成;现状 /common/upload 不写 objectType 需业务表单二次绑定,AI 纯上传无表单)。按 objectType 自动刷新主表字段:
| objectType | 附件 | 自动写入 |
|---|---|---|
| story | PRD | zt_story.prd_url |
| aiCodeReview | 审查报告 | code_review_url;**code_review_status**(报文参数或 MD 头部「结果」解析) |
| aiWorkLog | 工作日志 | work_log_url |
| testCase | 测试用例(下载) | test_case_url |
| testReport | 报告模版(下载) | test_report_download_url |
| testReportSubmit | 报告(模版填完提交) | test_report_submit_url |
| testOther | 其他测试文档 | test_other_url |
| meeting | 会议纪要 | zt_meeting.url(刷新为最新一份) |
**MD 附件字段**:zt_file(objectType/objectID/title/pathname/url/extension/addedBy 操作人/addedDate 操作时间/extra);extra 约定:审查报告 {"round":N}、工作日志 {"logType":"8类之一"}、测试报告 {"reviewRound":N};审查报告 MD 头部约定「严重:N/错误:N」(三期取数)。
### 3.3 MD 在线渲染
引入 markdown-it,封装 MdPreview 组件:.md 附件点击→按 url(空则 pathname 拼接)拉取→页面内渲染;其他格式维持下载;上传组件放开 .md 类型。
### 3.4 接口(2 新增 + 2 小改 + 前置)
1. `POST /common/uploadBind`:见 3.2
2. `POST /zt-task/aiBatchAdd`:
```json
{"storyId": 8319, "tasks": [
{"name": "建表与实体生成", "type": "devel", "assignedTo": "zhangsan", "aiEvaluationTime": "6", "planStartDate": "2026-07-27", "deadline": "2026-07-29"},
{"name": "接口联调测试", "type": "test", "assignedTo": "lisi", "aiEvaluationTime": "2"}
]}
```
事务:storyId 不存在或 type 非 devel/test → 整批拒绝;同 storyId+name+type 重复 → 跳过记 skipped;建 zt_task(status=wait、create_user=`ai`、estimate=aiEvaluationTime)。响应含 taskIds:`{"code":0,"data":{"created":2,"taskIds":[12001,12002],"skipped":[]}}`
3. `ZtStoryUserServiceImpl.java:562` 附近补写 `activateddate`(1 行)
4. 鉴权**必决**(多人环境):签名/内部 token,不得裸连
5. 前置:`zt_user` 建 `ai` 账户
### 3.5 页面改动(web_zentao)
**用户需求详情**:右侧 tabs 加「需求讨论会议」——列出 zt_meeting.storyIds 含本需求的会议(主题/类型/时间/参与人/创建人),点击跳详情;查询用 FIND_IN_SET(防 12 误中 112);关系多对多。
**会议纪要页**:add/editDialog 渲染 uploads(objectType=meeting);多份 MD 按时间排列,显示操作人(addedBy)/操作时间(addedDate)/会议人(users);.md 点击 MdPreview;查看直取 zt_meeting.url(最新一份)。
**研发需求详情**(对应补充⑧,②~⑥展示位):
| 区块/按钮 | 内容 | 数据 |
|---|---|---|
| ~~需求 ID 展示~~ | 已按用户验收反馈移除(页面顶部已有 ID+标题,冗余) | — |
| 「AI 指标」区块 | 12 字段只读(含 aiParticipationRate) | zt_story_expand |
| 测试用例 | 查看+下载(不上传覆盖) | zt_file(testCase)+zt_case |
| 测试报告模版 | 查看+下载 | zt_file(testReport) |
| 「提交测试报告」 | 上传+在线查看(**code_review_status≠pass 禁用**——SOP 卡点系统强制) | zt_file(testReportSubmit) |
| 其他测试文档 | 上传+查看 | zt_file(testOther) |
| 「代码审查报告」 | 上传 MD 多份(按轮次)+在线查看+**状态展示(code_review_status)** | zt_file(aiCodeReview)+zt_story |
| 「工作日志」 | 上传 MD+在线查看 | zt_file(aiWorkLog) |
### 3.6 框架挂钩(upload_md.py,模式照 submit_assessment.py)
```bash
python upload_md.py --story-id 8319 --type aiWorkLog --file outputs/work_log.md
```
| 触发点 | --type |
|---|---|
| pmassist 定稿 PRD | story |
| 会议纪要产出 | meeting(objectId=meetingId) |
| 代码审查每轮结束 | aiCodeReview(文件名含轮次,头部带「结果/严重/错误」) |
| 各节点工作日志 | aiWorkLog |
| 用例/报告模版产出 | testCase / testReport |
| 测试报告提交 | testReportSubmit |
| 其他测试文档 | testOther |
| demand-assessor 评估完 | 维持 submit_assessment.py(数值通道已通) |
原则:产生即传、不补传;人工按钮为备选通道。
---
## 4. 三期:绩效消费(要点,承接 v2.2 详细版)
- **FR-014 判定源**:zt_case + zt_file(testReportSubmit / aiCodeReview / aiWorkLog);《AI 文档更新记录》=zt_file(aiWorkLog) 中 doc_update 类内容
- **代码质量取数**:审查报告 MD 头部「严重:N/错误:N」解析(三期前确认约定;否则人工读数)
- 其余不变:三层架构(指标/规则 zt_perf_config/落库 zt_month_score)、zt_doc_check 快照、13 项自动指标取数表、6 接口 4 页面、人工评分入口、对拍验收(取 1~2 个已考核月份与线下 Excel 对拍)
- 立项前锁定:口径待确认 5 项(PRD 7.3)
---
## 5. 里程碑与风险
| 里程碑 | 内容 | 时间 |
|---|---|---|
| M0 定稿 | PRD Final + 验收标准 | 待确认 |
| M1 一期 | 1 列 DDL+实体+回归(1~2 天) | 定稿后启动 |
| M2 二期 | 3 项 DDL+uploadBind+aiBatchAdd+MD 渲染+页面+挂钩+ai 账户+鉴权 | 立项评估 |
| M3 三期 | 绩效(承接第 4 章) | 立项评估 |
| M4 验收 | 对照 PRD+SRC-002 | — |
| 风险 | 等级 | 应对 |
|---|---|---|
| DDL 手工执行(zt_story 8 列为核心表,需低峰+备份) | 中 | 说明头+可重入+评审 |
| 接口鉴权未决(多人必决) | 中 | 二期立项前定签名/token |
| MD 头部计数约定不被遵守 | 中 | 模板+上传校验提示;降级人工读数 |
| 测试欠账(安全门) | 中 | 新代码强制单测 |
| 挂钩漏接(多技能) | 低 | upload_md.py 单脚本+清单核对 |
---
## 6. FR 对照
一期=FR-004 部分;二期=FR-001/002/003/004/005 部分/006/008/010/011;三期=FR-012/013/014;复用=FR-009;豁免=FR-007 指数部分(CHG-019)。