# -*- coding: utf-8 -*- """端到端验证:问题四(备料台账无单选全部) + 问题六(盘点范围 + 物料分布)""" import json, urllib.request, urllib.parse, urllib.error BASE = "http://127.0.0.1:8902" TOKEN = None def req(method, path, payload=None, params=None): url = BASE + path if params: qs = urllib.parse.urlencode({k: v for k, v in params.items() if v not in (None, "")}) if qs: url += "?" + qs data = json.dumps(payload).encode() if payload is not None else None r = urllib.request.Request(url, data=data, method=method) r.add_header("Content-Type", "application/json") if TOKEN: r.add_header("Authorization", "Bearer " + TOKEN) try: with urllib.request.urlopen(r, timeout=20) as resp: return json.loads(resp.read().decode()) except urllib.error.HTTPError as e: return {"_http": e.code, "_body": e.read().decode()[:300]} def login(): global TOKEN d = req("POST", "/api/auth/login", {"username": "admin", "password": "123456"}) TOKEN = d.get("data", {}).get("token") assert TOKEN, f"登录失败: {d}" print("✓ 登录成功 admin") passed = [] def check(name, cond, extra=""): passed.append(bool(cond)) print(("✓ " if cond else "✗ ") + name + (f" {extra}" if extra and not cond else "")) def main(): login() # ---------- 问题四:备料台账无单号查全部 ---------- d = req("GET", "/api/ledger/query", params={"page": 1, "pageSize": 20}) t4 = d.get("data", {}) or d check("ledger/query 无 orderNo 返回 total+list", "list" in t4 and "total" in t4, f"got {list(t4.keys())}") # ---------- 问题六:盘点范围按物料过滤 ---------- # 先看库存有哪些物料可盘点,选一个真实物料 st = req("GET", "/api/stock/query", params={"page": 1, "pageSize": 10}) stock_data = st.get("data", {}) or st rows = stock_data.get("list") or [] if rows: mat = rows[0]["materialCode"] # 按该物料发起盘点 d = req("POST", "/api/stocktake/start", {"operator": "e2e", "materialCodes": [mat]}) data = d.get("data", {}) or d check("startStocktake 按物料过滤成功", bool(data.get("stocktakeNo")), f"got {data}") check("按物料盘点 totalTargets>0", data.get("totalTargets", 0) > 0, f"totalTargets={data.get('totalTargets')}") # 按类型过滤发起 d2 = req("POST", "/api/stocktake/start", {"operator": "e2e", "manageMode": 1}) data2 = d2.get("data", {}) or d2 check("startStocktake 按类型(结构件)成功", bool(data2.get("stocktakeNo")), f"got {data2}") else: check("stock/query 有数据(需先造数才能验盘点范围)", False, "库存为空") # ---------- 问题六:物料分布数据源(聚合含 zoneCode) ---------- d = req("GET", "/api/stock/query", params={"page": 1, "pageSize": 50}) dist = d.get("data", {}) or d dl = dist.get("list") or [] check("stock/query 返回 list(分布图数据源)", len(dl) > 0, f"len={len(dl)}") if dl: r0 = dl[0] check("聚合行含 zoneCode/materialCode/totalQty", all(k in r0 for k in ("zoneCode", "materialCode", "totalQty")), f"keys={list(r0.keys())}") print("\n==== 结果:%d/%d 通过 ====" % (sum(passed), len(passed))) return all(passed) if __name__ == "__main__": ok = main() raise SystemExit(0 if ok else 1)