新增订单收票付款交货跟进并完善使用升级手册

增加部分付款和部分交货状态、工作台筛选、权限校验、跟进记录及 v4 数据迁移;补充 Windows EXE 构建与验收脚本。附 16 页 PDF 使用升级手册及企业微信详细配置说明、生成脚本和测试截图。验证:76 项回归测试、EXE 浏览器验收与 PDF 逐页校验通过。
This commit is contained in:
reddaniel110
2026-09-16 13:40:43 +08:00
parent bf952196fa
commit 768b4705dc
28 changed files with 3783 additions and 43 deletions
+15 -4
View File
@@ -14,6 +14,7 @@ from security import db, current_user, login_required, role_required, init_secur
from money import number, format_price
from order_logic import scope
from order_routes import register_order_routes
from order_tracking import TRACKING_FILTERS, filter_tracking, register_tracking_routes
from excel_io import read_rows, read_material_rows, read_supplier_rows, save_upload
from flask import abort
@@ -51,6 +52,7 @@ app.config['PO_UPLOADS'] = UPLOADS
init_security(app, Session, INSTANCE)
app.jinja_env.filters['price'] = format_price
register_order_routes(app)
register_tracking_routes(app)
from notification_routes import register_notification_routes
register_notification_routes(app)
@@ -74,8 +76,11 @@ def index():
counts = {s: scope(db.query(Order)).filter_by(status=s).count() for s in STATUS_TEXT}
month_total = (scope(db.query(func.sum(Order.total_amount)))
.filter(Order.status == "approved").scalar() or 0)
tracking_counts = {key: filter_tracking(scope(db.query(Order)), key).count() for key in TRACKING_FILTERS}
tracking_rows = scope(db.query(Order)).filter_by(status='approved').order_by(Order.id.desc()).limit(12).all()
return render_template("index.html", user=u, todo=todo, my_orders=my_orders,
counts=counts, month_total=month_total,
tracking_counts=tracking_counts, tracking_rows=tracking_rows,
status_text=STATUS_TEXT, role_text=ROLE_TEXT)
@@ -103,6 +108,7 @@ def orders():
q = q.filter(Order.order_date <= date_to)
if u.role == "maker":
q = q.filter(Order.created_by == u.id)
q = filter_tracking(q, request.args.get('tracking', ''))
rows = q.order_by(Order.id.desc()).all()
return render_template("orders.html", user=u, rows=rows, status_text=STATUS_TEXT,
doc_types=DOC_TYPES, args=request.args)
@@ -479,13 +485,17 @@ def export_ledger():
wb = openpyxl.Workbook()
ws = wb.active
ws.append([u"采购单号", u"单据类型", u"供应商", u"采购日期", u"状态", u"金额",
u"制单人", u"审批人", u"创建时间"])
u"制单人", u"审批人", u"创建时间", '需预付款', '收票状态', '付款状态',
'付款日期', '交货状态', '采购跟进备注', '付款备注', '变更后待核对'])
for o in rows:
ws.append([o.order_no, o.doc_type_text, o.supplier_name, o.order_date,
o.status_text, o.total_amount, o.created_by_name,
o.approved_by,
o.created_at.strftime("%Y-%m-%d %H:%M") if o.created_at else ""])
for col, w in zip("ABCDEFGHI", (18, 14, 30, 12, 12, 12, 12, 12, 18)):
o.created_at.strftime("%Y-%m-%d %H:%M") if o.created_at else "",
'是' if o.needs_prepayment else '否', o.invoice_status_text, o.payment_status_text,
o.payment_date, o.delivery_status_text, o.fulfillment_note, o.payment_note,
'、'.join(label for label, stale in [('采购跟进', o.fulfillment_stale), ('付款', o.payment_stale)] if stale)])
for col, w in zip("ABCDEFGHIJKLMNOPQ", (18, 14, 30, 12, 12, 12, 12, 12, 18, 12, 12, 12, 14, 12, 36, 36, 22)):
ws.column_dimensions[col].width = w
buf = io.BytesIO()
wb.save(buf)
@@ -528,7 +538,8 @@ if __name__ == "__main__":
port = int(sys.argv[1]) if len(sys.argv) > 1 else 8080
while port_busy(port) and port < 8120:
port += 1
if getattr(sys, "frozen", False) or os.environ.get("PO_OPEN_BROWSER") == "1":
open_browser = os.environ.get("PO_OPEN_BROWSER")
if open_browser == "1" or (getattr(sys, "frozen", False) and open_browser != "0"):
threading.Timer(1.5, lambda: webbrowser.open("http://127.0.0.1:%d" % port)).start()
print("=" * 56)
print(" 博特维采购订单管理系统已启动")