完善采购审批流程、企业微信通知和采购专用章

This commit is contained in:
reddaniel110
2026-09-16 11:45:21 +08:00
parent 4876d8805d
commit bf952196fa
58 changed files with 3451 additions and 1909 deletions
+3 -97
View File
@@ -1,99 +1,5 @@
# -*- 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)))
"""Compatibility entry point; tests only use temporary databases."""
from run_tests import main
if __name__ == "__main__":
run("purchase", "purchase", 3)
run("outsourcing_30rows", "outsourcing", 30)
print("ALL DONE")
raise SystemExit(main(()))