9043886b6f
- src/doc/ 拆分为 src/core/extraction/, matching/, validation/(核心业务逻辑) - src/bot/ 重命名为 src/infra/browser/(浏览器自动化基础设施) - fill_consumable_doc.py → src/infra/documents/consumable.py - 新增 Agent 调度模块:coordinator.py, events.py, session.py,重构 orchestrator.py - 更新 AGENTS.md、README.md 及所有子目录 README
60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
"""
|
|
财务报销自动化 — 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)
|