From 4a5790d900318c98ffe5a0936dff56a91d1f6037 Mon Sep 17 00:00:00 2001 From: lovife <474239041@qq.com> Date: Wed, 30 Sep 2026 12:38:55 +0800 Subject: [PATCH] =?UTF-8?q?chore(clean):=20=E6=B5=8B=E8=AF=95=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=B8=89=E6=9C=AC=E8=B4=A6=E6=B8=85=E5=AE=8C=EF=BC=88?= =?UTF-8?q?=E5=BA=93=20/=20=E7=A3=81=E7=9B=98=20/=20=E4=B8=83=E7=89=9B?= =?UTF-8?q?=E6=A1=B6=EF=BC=89+=20100=20=E6=9D=A1=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E6=A0=B8=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 一、dev-clean-e2e.py:加「在用组织保护」后执行 · 先算「仍被存活任务引用的组织」并保留 —— 当前演示态就挂在其中一个 「E2E 24数控1班」上,删了它演示态就坏(保留 3 个,演示态完好: 任务 1449 / 名册 3 人 / 组织 43 都在) · 已执行 --apply --demo-tasks --orphan-files: 49 个 e2e 租户 + 147 个测试组织 + 84 个【演示·旧】任务, 共 3714 行 / 27 个文件(业务表按 information_schema 动态枚举,不写死清单) 二、dev-clean-qiniu.py(新增):清真实桶里本项目前缀的测试对象 · 只动 xiaotutongxue/ 前缀;默认 dry-run;删前核实库中零引用、 数量异常(>5000)直接停 · 已执行:2036 个对象 / 116 MB 全部删除,删后复验 0 个(F-93「删库不删桶」) · 签名按官方文档逐字核对 —— 踩了两个 401 才对:旧 QBox 格式(一个换行 + "QBox " 前缀)不对,是「两个换行 + Qiniu 前缀」;batch 的 Body 必须进 签名串(列举无 Body 能过、批删全 401 —— 同一签名函数一好一坏,线索在 Body) · 列举在 rsf.qiniuapi.com,不在 rs(打错 host 报「Bad method: list」) 三、xt-minio 容器已删(F-2)—— 代码早已不用 S3,deploy 里也没有它 四、文档核销与记录 · docs/08:F-3/4/7/10(小节)与 F-14/26/29/30/31/38/51/57/64/65/71/72/93 (表格行)全部标「已闭环」;F-5 补执行记录;F-28 备案维持两级(→D-11); 变更记录补两行 —— **F-1~F-100 至此无未决项**,剩余全部等外部输入 · docs/01:新增 E4「国标职业库数据来源待客户确认」(F-34,字典页如实显示 0 项) · 交接摘要:新增 §一·三十一(17 项决策执行记录) · AGENTS.md:清理一节写清三个工具与「在用组织保护」 验证:python scripts/verify-all.py --with-e2e → 通过 8 / 失败 0 / 跳过 0(37 个 E2E 脚本 / 1577 条断言 / 0 失败,291s; prodguard 9/9;test profile 能起) --- AGENTS.md | 8 +- docs/01-客户与机构确认函.md | 11 ++- docs/08-完成度盘点与问题清单.md | 46 +++++---- docs/交接摘要.md | 44 +++++++++ scripts/dev-clean-e2e.py | 55 +++++++++-- scripts/dev-clean-qiniu.py | 167 ++++++++++++++++++++++++++++++++ 6 files changed, 301 insertions(+), 30 deletions(-) create mode 100644 scripts/dev-clean-qiniu.py diff --git a/AGENTS.md b/AGENTS.md index b76cfdf..221a05d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -98,10 +98,10 @@ python scripts/e2e-m3-file.py # 单跑一个;前提是后端 8080 在跑 - 跑完 `e2e-m3-*` 会**清掉名册绑定**(`collect_roster.bind_user_id`); 想继续用浏览器验演示态,要先重新绑定(见交接摘要的"演示态"一节) - 清理残留:`python scripts/dev-clean-e2e.py`(**默认 dry-run**; - `--only-orphan-files --apply` 只清磁盘孤儿文件 —— 压测跑几轮就能攒下几百 MB)、 - `python scripts/dev-clean-test-users.py` - ⚠️ `--apply` 会连 e2e 租户与"E2E 24数控1班…"这类演示组织一起删,**当前演示态正挂在其中一个班下面**, - 所以要清先确认演示态已迁到正式组织名下 + `--only-orphan-files --apply` 只清磁盘孤儿文件 —— 压测跑几轮就能攒下几百 MB; + `--apply` 清 e2e 租户与测试组织,**会先算「仍被存活任务引用的组织」并保留**)、 + `python scripts/dev-clean-test-users.py`、`python scripts/dev-clean-qiniu.py` + (清真实桶里 `xiaotutongxue/` 前缀的测试对象,**默认 dry-run**,删前先核实库中零引用) - 文档一致性:`python scripts/verify-docs.py` ## 四、接口与数据契约(不显然、容易做错) diff --git a/docs/01-客户与机构确认函.md b/docs/01-客户与机构确认函.md index 927a40e..4de2a07 100644 --- a/docs/01-客户与机构确认函.md +++ b/docs/01-客户与机构确认函.md @@ -284,7 +284,7 @@ B1 选 A,但希望增加审批环节 ### E3. 二期(社会收集 / 社会评价 / 专项职业能力)的启动时点 -一期范围已按约定锁死为「学校收集 + 自主认定」(其他模式一律返回 `40044`)。 +一期范围已按约定锁死为「学校收集 + 自助认定」(其他模式一律返回 `40044`)。 但**二期什么时候启动**会影响两件现在就能做、也可以等的事: | 事项 | 如果二期在 3 个月内启动 | 如果更晚 | @@ -295,6 +295,15 @@ B1 选 A,但希望增加审批环节 回复:☐ 二期预计 ____ 启动 ☐ 暂无计划 +### E4. 国标职业库数据的来源(字典页「职业(国标)」目前是空的) + +`sys_occupation_ref`(国标职业库)一期为 **0 行**:契约 §13.3 把 `OCCUPATION` 字典的数据来源 +指定为这张表,而它是**国标数据**(GB/T 职业分类),需要贵方提供或采购后导入 —— +不是我们能自行生成的。现状:字典管理页里「职业(国标)」显示 0 项(如实展示,不假装有数据); +`itemCount` 直接用 `COUNT(*)`,数据导入后自动就对了,**不需要改代码**。 + +回复:☐ 我方提供数据(预计 ____) ☐ 采购(预算 ____) ☐ 一期不上这个字典 + ## 附:已闭环的决策(无需再讨论) | 决策 | 内容 | 依据 | diff --git a/docs/08-完成度盘点与问题清单.md b/docs/08-完成度盘点与问题清单.md index 1e8f69b..1ffb225 100644 --- a/docs/08-完成度盘点与问题清单.md +++ b/docs/08-完成度盘点与问题清单.md @@ -154,7 +154,7 @@ - **影响**:占用端口 + 误导(新人会以为本地有对象存储可用)。 - **建议**:`docker rm -f xt-minio`;若还有旧数据要留,先 `docker run --rm -v` 导出再删。同时在 `AGENTS.md` 的"环境与流程坑"里保留"MinIO 已删,别去找"这句(已有,够用)。 -### F-3【P1 · 文档与代码不一致】`/mp/files/upload-token` 与 `/mp/ocr/idcard` +### F-3【P1 · 文档与代码不一致】`/mp/files/upload-token` 与 `/mp/ocr/idcard` —— **已闭环** - **现象**:契约(PRD §8 与 03 §9.5/§9.9)规定上传是「OS 直传 + `upload-token`」,OCR 走 `/mp/ocr/idcard`;实际实现是 `POST /mp/files/upload`(服务端压缩 + 按模板改名,**默认不留原始件**),OCR 完全没做。 - **影响**:前端按契约写会调不存在的接口;`upload-token` 是"防重复建文件记录"的关键设计(重复提交幂等),现在靠 `POST /mp/files/upload` 每次新建记录来承担。 @@ -163,7 +163,9 @@ 2. §9.9 OCR 标注「一期缓做(等 D1 选型)」,不要留着像已实现的样子; 3. 若后续要恢复直传(大文件/弱网),再单独立任务,不要在这轮混做。 -### F-4【P1 · 文档与代码不一致】契约里没有的接口(首次盘点 19 个,现在 41 个) +- ✅ **已闭环(2026-09-30,客户确认后按建议改文档)**:§9.5 重写为「上传前置检查(预检/秒传/压缩建议)」、§9.6 改为「有原始件时的重新规范化」、§9.9 标注一期缓做 —— 口径见契约 §17.2 D-3/D-4/D-12。 + +### F-4【P1 · 文档与代码不一致】契约里没有的接口(首次盘点 19 个,现在 41 个) —— **已闭环** - **现象**(代码有、03 文档 §4 清单没有):最典型的是 `GET /mp/scene-context`、 `GET /auth/captcha`、`GET /mp/h5/authorize|callback|stub-login`(代替 `/mp/login`)、 @@ -174,6 +176,8 @@ 所以它必须以命令的形式存在,不能以表格的形式存在 —— 见 §九。 - **建议**:在 03 文档**新增一节「§17 实现补充与偏差记录」**,逐条列出这些接口(路径 / 权限 / 是否要补进 §4 清单),并在 §4 的合计口径里说明"121 是设计口径,另有 N 个实现补充"。改动后必须重跑 `python scripts/verify-docs.py`(它逐节核对接口数,加节时注意别改动 §4 的声称数)。 +- ✅ **已闭环(2026-09-30)**:契约新增 **§17 实现补充与偏差记录** —— 41 个接口按六类分组(清单由 `check-api-parity.py --extra` 生成,写明「手抄件会过期,以命令输出为准」),外加 12 条已确认偏离 D-1~D-12(含租户域名一行、`biz_type` 落库字符串、§14 路径前缀)。 + ### F-5【P2 · 数据卫生】E2E 租户残留到"每个请求多一次解析" —— **清理工具已补齐(2026-09-30)** - **现象**:`sys_tenant` 17 行、`sys_user` 300 行,而脚本每次跑都会建测试租户,清理只删自己建的那一个。 @@ -195,6 +199,7 @@ `【演示】审核台` 是当前在用的,原来那句 `LIKE '【演示】%'` 会把它一起删掉, 而这种错在预览里只表现为"83 个"(比 82 多一个),**极容易被放过**。 - **建议**:把 `--only-orphan-files --apply` 写进"跑完压测/E2E 的收尾动作"(见 `AGENTS.md` 第三节)。 +- ✅ **已执行(2026-09-30,含「在用组织保护」)**:`--apply --demo-tasks --orphan-files` 清掉 **49 个 e2e 租户 + 147 个测试组织 + 84 个【演示·旧】任务,共 3714 行、27 个文件**;清理前先算「仍被存活任务引用的组织」并保留(**3 个**,其中就有当前演示态挂着的 E2E 24数控1班 —— 演示态完好:任务 1449 / 名册 3 人 / 组织 43 都在)。另外 **xt-minio 容器已删**(F-2)、**七牛桶已清**(F-93)。 ### F-6【P2 · 文档误导】`frontend-pc/AGENTS.md` 里的 Mock 说明已过时 —— **已修(2026-09-30)** @@ -210,11 +215,13 @@ 但路的尽头还是错的",所以在那份 skill 开头加了 ⚠️ 说明(保留原文,供 Gi 模板升级时做差异比对)。 核实方式:`frontend-pc/` 下无 `mock/`,`package.json` 与 `vite.config.ts` 里都没有 mock 关键字。 -### F-7【P2 · 一致性】撤回的动作码与适用状态 +### F-7【P2 · 一致性】撤回的动作码与适用状态 —— **已闭环** - **现象**:DDL 注释 `3=批量通过` 与 03 §11.4「写入 `action = 3`(撤回)」冲突,代码取 `7`(已按"时间轴不能混淆"处理);§11.4 的状态表只列状态 3,代码额外允许状态 2。 - **建议**:客户确认后同步两处文档;若客户不同意状态 2 的撤回,删一个分支即可(代码里有注释标明)。 +- ✅ **已闭环(2026-09-30,客户确认按代码口径)**:§2.7 `auditAction` 补全 7 个动作(撤回=7),§11.4 约束表补「状态 2 可撤(撤的是初审)」、留痕改 `action=7`。DDL 注释少列 7(迁移已发布不改,以 §2.7 为准)。 + ### F-8【P2 · 安全/上线】打桩登录与存储密钥 - **现象**:`application-dev.yml` 里 `stub-enabled: ${WX_H5_STUB:true}`(**dev 默认开着**),而代码侧默认 `false`;`keep-raw: ${XT_STORAGE_KEEP_RAW:false}` 默认不留原始件;七牛 AK/SK 只在本地 `application-local.yml`。 @@ -225,13 +232,15 @@ - **现象**:`src/test` 为空,验证全靠 E2E(很硬,但每次要起服务 + 连库)。 - **建议**:先给三个**纯函数**补最小单测(不引框架之外的东西):`IdentityNormalizer`、命名规范化引擎、压缩档位推导。理由是这三个"输入输出确定、没有 IO",单测成本最低、回归收益最高;其余继续靠 E2E。 -### F-10【P3 · 一致】租户域名相关文档暂缓 +### F-10【P3 · 一致】租户域名相关文档暂缓 —— **已闭环** - **现象**:§一·二十五 的能力已实现且默认关闭,PRD 与 03 文档未写(当时有意暂缓)。 - **建议**:保持暂缓,但**在 03 文档 §17 留一行**"租户域名能力:`Host 定位 + token 授权`,默认关闭,启用条件 4 步",避免将来重开时找不到入口。 --- +- ✅ **已闭环(留一行入口,按建议)**:契约 §17.2 **D-10** 写明「能力已实现(Host 定位 + token 授权),默认关闭,启用四步见《交接摘要》§一·二十六」。 + ## 六、施工记录(本轮自主完成的事) > 客户要求:**"完成所有的开发计划,中途发现问题自己决定,记录出来让我知道即可。"** @@ -312,7 +321,7 @@ | F-11 | **`SubmissionValidator` 的 severity 口径有三处互相矛盾的注释**:`Issue` 的 JavaDoc 写"1信息 2警告 3错误",而 `Severity` 常量注释写"1=红 2=黄 3=蓝",实际代码是 `INFO=1 / WARN=2 / ERROR=3`(`SubmissionService` 数红黄就用它们)。**我第一版导出前置检查按"1=红"写,会把"提示"当成阻断 → 正常数据也导不出来** | 已改:导出按 `Issue.ERROR` 判定;前端 `ISSUE_SEVERITY` 与详情页配色改为 1 蓝 / 2 黄 / 3 红;`Issue` 的 JavaDoc 补上"不要按直觉改常量"。**建议**:把 `Severity` 常量注释也一起改掉(本轮未动,属纯注释) | | F-12 | **`collect_export_task` 表与契约字段不一致**:契约 §12.5 有 `currentStep / stepText / stats.rawSizeMb`,表里三列都没有 | 不新建迁移,改为推导(D6)。已在实体注释里写明"不要再按契约建字段" | | F-13 | `RevokePolicy` 在"已导出"之后**不返回** `auditRecordId`(只把 `canRevoke` 置 false) | 这不是 bug,但意味着 **`40033` 在界面上不可达**(只会出现 40001「缺少要撤回的记录 id」)。已在 E2E 里按"用户真正看得见的东西"断言,并写清 40033 只在绕过前端时可达 | -| F-14 | 已发布的任务**既删不掉也改不了名**(`40001`),演示/测试数据无法清理 | 开发种子脚本改为"SQL 清空 + 改名挪开"(夹具性质,已注明)。**建议**:给管理员留一个"归档后可删"的口径,否则本地库会一直堆任务 | +| F-14 | 已发布的任务**既删不掉也改不了名**(`40001`),演示/测试数据无法清理 | 开发种子脚本改为"SQL 清空 + 改名挪开"(夹具性质,已注明)。**建议**:给管理员留一个"归档后可删"的口径,否则本地库会一直堆任务 ✅ 已闭环(客户确认「归档后可删」):`DELETE /tasks/{id}` 支持 status=3 —— **级联物理删** 14 张表(刻意不软删:本条的动机就是库会一直堆)+ 尽力删物理文件 + `sys_operation_log` 记 `DELETE_TASK`;收集中/已截止仍拒删(归档是最后的后悔药)。验证:新增 `scripts/e2e-m1-task-delete.py` → **19/19**。 | | F-15 | 我第一次汇总时把 753 读成了 771(**我的算术错,不是脚本的问题**)。逐脚本累加可复现:原 18 个脚本合计**恰好 753**,加上新增的 `e2e-m6-export.py`(60)为 **813** | 已更正为 813,并在正文给出"753 + 60"的算式。**建议**:这类数字一律附上算式,别只写结论 —— 否则下一次还是会算错 | | F-16 | ⚠️ **我第一版把导出目录结构做错了**:做成"班级/姓名/文件"(更符合"给人翻"的直觉),而 PRD §5.9 明确是「`{批次号}-{任务名称}` / 班级 / **材料类型** / 文件」,根目录也不是用户填的导出名 | 已改回规范,并把"根目录名、第二层、第三层、汇总表位置"四条都写成 E2E 断言(`e2e-m6-export.py`),另加"预览节点与产物逐项一致"。**教训**:目录结构是**交付物的形状**,属于需求,不能按直觉设计 —— 这类错只在客户解压时暴露 | | F-17 | 汇总表文件名:契约 §12.4 只说"生成汇总 Excel",PRD §5.9 给的是机构叫法 `考生线下报名信息导入模板(汇总).xlsx` | 按 PRD 命名(机构按这个名字找它)。已写进 E2E | @@ -324,13 +333,13 @@ | F-23 | ⚠️ **后端启动直接崩**:`TeacherDashboardMapper` 的 `