# -*- coding: utf-8 -*- """盘点接口实现进度:对照 API清单.csv 与 Java 控制器的 @RequestMapping。""" import csv import re from pathlib import Path from _root import ROOT ROOT = Path(str(ROOT)) CTRL = ROOT / "yoshop-java/src/main/java/cn/yoshop/store/controller" # 收集 Java 已实现路由 implemented = set() for f in CTRL.glob("*.java"): src = f.read_text(encoding="utf-8") base = re.search(r'@RequestMapping\("([^"]+)"\)', src) if not base: continue base = base.group(1) # 支持 @RequestMapping("/x") 与 @RequestMapping(value = {"/x", "/y"}) 两种写法 for m in re.finditer(r'@(?:Get|Post|Request)Mapping\(([^)]*)\)', src): for sub in re.findall(r'"([^"]*)"', m.group(1)): if sub.startswith("/store/"): implemented.add(sub) elif sub.startswith("/"): implemented.add(base + sub) implemented = {p.rstrip("/") for p in implemented} def norm(p): """统一大小写/下划线:清单里是 list_by_ids,Java 路由是 listByIds""" return re.sub(r"[^a-z0-9]", "", p.lower()) implemented_norm = {norm(p) for p in implemented} # 收集 PHP 接口清单(仅 store 模块) php = [] with open(ROOT / "API清单.csv", encoding="utf-8-sig") as fp: for row in csv.reader(fp): if len(row) < 7 or row[0] != "store": continue action = row[4].strip() if not action: continue path = row[5].rstrip("/") if path not in php: php.append(path) done, todo = [], [] for p in php: if norm(p) in implemented_norm: done.append(p) else: todo.append(p) print("PHP 接口数:", len(php), " Java 已实现:", len(done), " 待实现:", len(todo)) print("\n待实现清单:") for p in todo: print(" " + p)