# -*- coding: utf-8 -*- """端到端冒烟:制单 → 提交 → 主管审核 → 经理批准 → 导出 PDF。""" import http.cookiejar import os import re import urllib.parse import urllib.request BASE = "http://127.0.0.1:8080" OUT = r"D:\2026-09-09-task-18\tools\out" os.makedirs(OUT, exist_ok=True) def new_session(): cj = http.cookiejar.CookieJar() return urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) def post(op, path, data): body = urllib.parse.urlencode(data).encode() req = urllib.request.Request(BASE + path, data=body) r = op.open(req, timeout=30) return r.geturl(), r.read().decode("utf-8", "replace") def get(op, path): r = op.open(BASE + path, timeout=30) return r.geturl(), r.read() def login(user, pwd): op = new_session() url, html = post(op, "/login", {"username": user, "password": pwd}) assert "/login" not in url, "%s 登录失败" % user print(" login %s ok" % user) return op def make_order(op, doc_type, supplier_id, n_items): url, _ = post(op, "/orders/new", {"doc_type": doc_type, "supplier_id": supplier_id}) m = re.search(r"/orders/(\d+)", url) oid = int(m.group(1)) form = [ ("order_date", "2026-09-09"), ("tax_rate", "13%"), ("supplier_name", "苏州精锐五金制品有限公司"), ("supplier_contact", "周经理"), ("supplier_phone", "13800000001"), ("payment_terms", "月结30天"), ("supplier_tax_no", "91320500MA1XXXXXXX"), ("supplier_bank_account", "4562 1088 0012 3456"), ("supplier_bank_name", "中国银行苏州工业园区支行"), ("our_company", "苏州博特维智能科技有限公司"), ("our_contact", "胡乃琛"), ("our_phone", "13913172516"), ("our_tax_no", "91320594MA1YYYYYYY"), ("delivery_place", "苏州市工业园区星汉街5号腾飞新苏工业坊B幢5楼05-06单元 胡乃琛 13913172516"), ("note", "本单为系统测试单,含 & <特殊> 字符校验"), ] for i in range(n_items): form += [ ("item_code", "M-10%02d" % (i + 1)), ("item_spec", "测试物料 规格 A&B <%d>" % (i + 1)), ("item_unit", "件"), ("item_qty", "12.5"), ("item_price", "38.5"), ("item_date", "2026-09-20"), ("item_remark", "行%d" % (i + 1)), ] post(op, "/orders/%d" % oid, form) return oid def run(tag, doc_type, n_items): print("[%s] doc=%s items=%d" % (tag, doc_type, n_items)) maker = login("maker", "123456") oid = make_order(maker, doc_type, 1, n_items) print(" 制单 ok, id=%d" % oid) post(maker, "/orders/%d/submit" % oid, {"comment": "请审核"}) rv = login("reviewer", "123456") post(rv, "/orders/%d/review" % oid, {"comment": "同意"}) ap = login("approver", "123456") post(ap, "/orders/%d/approve" % oid, {"comment": "批准"}) print(" 审核流程 ok") _, data = get(ap, "/orders/%d/pdf" % oid) path = os.path.join(OUT, "%s.pdf" % tag) with open(path, "wb") as f: f.write(data) print(" PDF -> %s (%d bytes)" % (path, len(data))) # 草稿水印版 oid2 = make_order(maker, doc_type, 1, 2) _, data2 = get(maker, "/orders/%d/pdf" % oid2) p2 = os.path.join(OUT, "%s_draft.pdf" % tag) with open(p2, "wb") as f: f.write(data2) print(" 草稿 PDF -> %s (%d bytes)" % (p2, len(data2))) if __name__ == "__main__": run("purchase", "purchase", 3) run("outsourcing_30rows", "outsourcing", 30) print("ALL DONE")