100 lines
3.5 KiB
Python
100 lines
3.5 KiB
Python
# -*- 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")
|