compare_goods.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. # -*- coding: utf-8 -*-
  2. """双跑对比:PHP 线上响应 vs Java 本地响应,逐字段 diff"""
  3. import json
  4. import re
  5. import sys
  6. from pathlib import Path
  7. import requests
  8. ROOT = Path(r"C:\Users\Administrator\WorkBuddy\2026-10-17-12-27-10\java-rewrite")
  9. src = Path(r"F:\import goods\upload_goods.py").read_text(encoding="utf-8")
  10. token = re.search(r'TOKEN\s*=\s*"([^"]+)"', src).group(1)
  11. params = {"page": 1, "listRows": 15}
  12. php = requests.post("https://shop.qinys.cn/index.php?s=/store/goods/list",
  13. headers={"Access-Token": token}, data=params, timeout=30).json()
  14. java = json.load(open(ROOT / "golden" / "java_goods_list.json", encoding="utf-8"))
  15. php_items = php["data"]["list"]["data"]
  16. java_items = java["data"]["list"]["data"]
  17. print(f"PHP 条数: {len(php_items)} Java 条数: {len(java_items)}")
  18. php_map = {g["goods_id"]: g for g in php_items}
  19. java_map = {g["goods_id"]: g for g in java_items}
  20. print(f"PHP goods_id: {sorted(php_map)}")
  21. print(f"Java goods_id: {sorted(java_map)}")
  22. def norm(v):
  23. if isinstance(v, str):
  24. return v
  25. if isinstance(v, bool):
  26. return v
  27. return v
  28. diff_count = 0
  29. for gid in sorted(set(php_map) & set(java_map)):
  30. p, j = php_map[gid], java_map[gid]
  31. pkeys, jkeys = set(p), set(j)
  32. for k in sorted(pkeys - jkeys):
  33. print(f"[缺字段] goods {gid} 缺少 {k}")
  34. diff_count += 1
  35. for k in sorted(jkeys - pkeys):
  36. print(f"[多字段] goods {gid} 多出 {k}")
  37. diff_count += 1
  38. for k in sorted(pkeys & jkeys):
  39. pv, jv = p[k], j[k]
  40. if type(pv).__name__ != type(jv).__name__:
  41. print(f"[类型] goods {gid}.{k}: PHP={type(pv).__name__}({pv!r}) Java={type(jv).__name__}({jv!r})")
  42. diff_count += 1
  43. elif isinstance(pv, list):
  44. if json.dumps(pv, ensure_ascii=False, sort_keys=True) != json.dumps(jv, ensure_ascii=False, sort_keys=True):
  45. print(f"[值] goods {gid}.{k}:\n PHP ={json.dumps(pv, ensure_ascii=False)[:200]}\n Java={json.dumps(jv, ensure_ascii=False)[:200]}")
  46. diff_count += 1
  47. elif pv != jv:
  48. print(f"[值] goods {gid}.{k}: PHP={pv!r} Java={jv!r}")
  49. diff_count += 1
  50. print(f"\n差异总数: {diff_count}")