You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
5.6 KiB

6 days ago
# -*- coding: utf-8 -*-
# 票 04 / t12 关票:填 Answer + Status resolved;map.md 加 Decisions 指针行 + Not yet specified 收口
import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
TICKET = r'E:\code\crm-backend-matt\.scratch\api-docs-reorg\issues\04-execute-reorg.md'
MAP = r'E:\code\crm-backend-matt\.scratch\api-docs-reorg\map.md'
ANSWER = """## Answer
**2026-08-31 解决t1-t9 旧机会话完成t10-t12 换机后续跑收尾全绿关票**
1. **源码 tags 重构完成**25 Controller 按映射表 §2 逐行落地类级 @Tag 改全路径 / 方法级 @Operation(tags) 深路径 / LeadPool 5 端点双值 tags / SystemController 10 端点补显式 tag / Query 收敛 63 / Collab+Sub 分挂Grep 复核旧前缀零残留回归`mvn test` 全仓 **873 测试 0 失败 0 错误**base 38 / file 84 / auth 210 / dict 51 / rule 134 / preference 16 / lead 131 / opportunity 209BUILD SUCCESS
2. **文档仓重建完成**§4 git-mv 清单全部落地空分区 A1 / A1X / A4 / A5 / A6 folder.bru 占位seq 2/3/6/7/8公共依赖合并文件 + 行政区划调试(验证专用) 保留顶层全量对账tmp_reorg_audit.py本机复跑**src keys 196 / doc keys 196双向差集均 0**
3. **分区索引 README完成**生成方式落地裁决 = **手写**叙述性导航bruno-sync 不生成 README人工维护11 个分区 README.md 已落盘已落地 .bru 清单按二级目录列 + 空缺标注 + 对接工程师示位空分区只写占位说明文档仓 git status = 11 untracked README
4. **ADR-0024 修订完成**文末追加修订2026-08-31api-docs-reorg effort一级对齐 v29 权威树引用 lanhu-tree-v29.md tag 纪律商机规则归 A7 与线索规则双归属URL 回退关闭双归属 = 方法级多值 tags新接口挂载纪律另记机制联动生成器家族退役 / menuBindings 前缀 / 文档仓换机路径回读逐字一致 BOM
5. **机制联动完成**bruno-sync.config.json menuBindings 四键前缀换 `A2 线索管理/`viewType/scopeKey 未动手工生成器家族gen_bruno.py / gen_opp_*.py / gen_v2_*.py / bru_lib.py退役留档bruno-sync 注解驱动通道为唯一权威机制
6. **验收通过**§6 基线目录树逐目录对照全 OK38 目录计数一致 + 5 空分区 folder.bru/README + 接口 .bru 总数 196 = 191 + 5 LeadPool 副本knife4j 抽查 crm-app /v3/api-docs`A0 登录界面` / `A3 商机管理/商机详情/客户` / `A7 后台管理/权限管理/角色管理` / `公共依赖/文件` 4 + LeadPool 5 端点双归属 tags 全部命中按分区索引 README 即可确认各分区接口全集与空缺状态A7 分区空缺客户规则 / 项目规则 / 日志管理
遗留提醒不阻塞关票`A7 后台管理/权限点管理/资源树列表.bru` url 行为历史绝对地址对账脚本已归一化识别下次 bruno-sync 真跑时按结构听源码patch `{{baseUrl}}` 形式换机注记对账脚本 REPO/DOCS 常量已改本机路径bruno-sync.local.json = `{"docsRepoPath": "e:/code/crm-api-docs"}`两仓改动均未提交由用户审查后自行 commit
"""
MAP_DECISION_LINE = "- [04 文档仓重排执行落地](issues/04-execute-reorg.md) — **resolved(2026-08-31,换机续跑 t10-t12 收尾)**:25 Controller 深 tag 重构 + menuBindings 四键换前缀;文档仓 A 区一级重排(git-mv / 空分区占位 / LeadPool 双归属副本);11 分区索引 README(手写人工维护);ADR-0024 追加 2026-08-31 修订段。验收:对账 196/196 双向零差、§6 基线 38 目录逐项一致、knife4j 抽查 4 组 + LeadPool 双归属全 OK、全仓 873 单测 0 失败。文档仓路径换机后为 `E:\\code\\crm-api-docs`。\n"
MAP_OLD_BULLET = "- 分区索引 README 的生成方式与更新纪律(手写 vs 小脚本幂等产出;bruno-sync 本身不生成 README)——执行票落地时定。"
MAP_NEW_BULLET = "- (已随票 04 落地解决,2026-08-31)分区索引 README:11 个分区手写落盘、人工维护,bruno-sync 不生成;更新纪律 = 分区接口落地/变化后人工同步 README 清单与空缺标注。"
# --- 票 04 ---
t = open(TICKET, encoding='utf-8').read()
assert t.count('Status: claimed') == 1, 'ticket status anchor not unique'
t = t.replace('Status: claimed', 'Status: resolved', 1)
anchor = '## Answer\n\n<!-- 解决时填写 -->'
assert anchor in t, 'ticket answer anchor missing'
t = t.replace(anchor, '## Answer\n\n' + ANSWER, 1)
with open(TICKET, 'w', encoding='utf-8', newline='\n') as f:
f.write(t)
# --- map.md ---
m = open(MAP, encoding='utf-8').read()
dec_anchor = '部门管理归属为判断行,执行时可调整。'
assert m.count(dec_anchor) == 1, 'map decisions anchor not unique'
m = m.replace(dec_anchor, dec_anchor + '\n' + MAP_DECISION_LINE.rstrip('\n'), 1)
assert MAP_OLD_BULLET in m, 'map not-yet bullet missing'
m = m.replace(MAP_OLD_BULLET, MAP_NEW_BULLET, 1)
with open(MAP, 'w', encoding='utf-8', newline='\n') as f:
f.write(m)
# --- 回读校验 ---
t2 = open(TICKET, encoding='utf-8').read()
m2 = open(MAP, encoding='utf-8').read()
ok = ('Status: resolved' in t2 and ANSWER in t2 and MAP_DECISION_LINE.rstrip('\n') in m2 and MAP_NEW_BULLET in m2)
print('CLOSE OUT:', 'OK' if ok else 'MISMATCH')
print('ticket chars=', len(t2), ' map chars=', len(m2))
for p in (TICKET, MAP):
raw = open(p, 'rb').read()
print(p.split('\\')[-1], 'BOM=', raw[:3] == b'\xef\xbb\xbf')