""" 财务报销自动化 — Web 界面 用户上传 PDF 发票,配置账号信息,自动完成: 1. 发票提取 2. 浏览器填报(可选) 发票类型区分: - 差旅发票(高铁票/酒店住宿):不生成易耗品出库单,走差旅报销流程 - 普通发票:生成易耗品出库单,走普通报销流程 启动: uv run python src/web/app.py 访问: http://localhost:5000 """ import sys from pathlib import Path # 确保项目根目录在 sys.path PROJECT_ROOT = Path(__file__).resolve().parent.parent.parent sys.path.insert(0, str(PROJECT_ROOT)) from flask import Flask # noqa: E402, I001 from src.web import pipeline_web, routes # noqa: E402, I001 from src.infra.documents import CONSUMABLE_DOC_FILENAME # noqa: E402, I001 app = Flask(__name__, template_folder="templates") UPLOAD_BASE = PROJECT_ROOT / "src" / "web" / "uploads" _app_initialized = False def create_app() -> Flask: """应用工厂:初始化配置并注册路由""" global _app_initialized if _app_initialized: return app _app_initialized = True # 设置出库单模板路径 pipeline_web.set_consumable_template(PROJECT_ROOT / CONSUMABLE_DOC_FILENAME) # 初始化路由配置 routes.init_routes(UPLOAD_BASE) # 注册 Blueprint app.register_blueprint(routes.web_bp) return app # 直接使用 app 实例(保持向后兼容) create_app() if __name__ == "__main__": UPLOAD_BASE.mkdir(parents=True, exist_ok=True) print("启动 Web 服务: http://localhost:5000") app.run(host="0.0.0.0", port=5000, debug=True, threaded=True, use_reloader=False)