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.
56 lines
5.6 KiB
56 lines
5.6 KiB
# -*- 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 收敛 6→3 / Collab+Sub 分挂),Grep 复核旧前缀零残留。回归:`mvn test` 全仓 **873 测试 0 失败 0 错误**(base 38 / file 84 / auth 210 / dict 51 / rule 134 / preference 16 / lead 131 / opportunity 209),BUILD 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-31,api-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 基线目录树逐目录对照全 OK(38 目录计数一致 + 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')
|
|
|