pipeline-app/app/pipeline_app.py
yumoqing a08bac91b6 feat(商品化): 补 5 个模块集成 + 接入两个资源模块 + accounting 菜单(参考 sage)
关键修复:accounting/pricing/discount/unipay 的表和前端早已就位,
但 app/pipeline_app.py 从未 load 它们 —— 相关页面一点即 NameError 500。

- 入口补 load_pricing/accounting/discount/unipay + load_account_resource/storage_resource
  顺序:pricing 先于 accounting 与资源模块(资源计费依赖 pricing_program_charging)
- build.sh 四处列表 + 8b DDL 循环加 account_resource/storage_resource
- wwwroot/index.ui 加「账务管理」菜单 11 子项(参考 sage menu.ui 的配置账务结构)
  按 pipeline-app 实际存在的页面取项:sage 菜单里的 open_account.ui 本模块不存在,已剔除,
  另补上 sage 未列但存在的 我的账户/余额/明细/账单/信用额度/币种/汇率/记账日志
- i18n 四语言补「账务管理」
2026-08-26 14:54:24 +08:00

121 lines
4.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""Pipeline Application - 产线管理独立应用"""
import os, sys, asyncio
app_dir = os.path.dirname(os.path.abspath(__file__))
root_dir = os.path.dirname(app_dir)
sys.path.insert(0, root_dir)
sys.path.insert(0, app_dir)
from ahserver.webapp import webapp
from ahserver.serverenv import ServerEnv
def get_module_dbname(mname):
"""All modules use the pipeline database."""
return 'pipeline'
def init():
from bricks_for_python.init import load_pybricks
from rbac.init import load_rbac
from appbase.init import load_appbase
from pipeline_core.init import load_pipeline_core
from pipeline_ops.init import load_pipeline_ops
from pipeline_dist.init import load_pipeline_dist
try:
from pipeline_service.init import load_pipeline_service
except ImportError:
def load_pipeline_service(): pass
try:
from pipeline_sdlc.adapter import load_sdlc_adapter
except ImportError:
def load_sdlc_adapter(): pass
try:
from app_audit.init import load_app_audit
except ImportError:
def load_app_audit(): pass
from showcase.init import load_showcase
from tenant.init import load_tenant
from ktv_adapter import load_ktv_adapter
from global_func import set_globalvariable
import office_proxy # 注册 /office/* 转发函数(univer-office Node 服务代理)
try:
from smssend import load_smssend
except ImportError:
def load_smssend(): pass
# uapi:外部 API 网关(rag 模块依赖它调 vdb/reranker/ner/graph)
try:
from uapi.init import load_uapi
except ImportError:
def load_uapi(): pass
# rag:知识库(向量检索 + 图谱),表名统一 rag_ 前缀,与产线业务表不冲突
try:
from rag.init import init_rag_module
except ImportError:
def init_rag_module(): pass
# dingdingflow:钉钉审批(表名 dda_ 前缀)。必须早于 pipeline_service,
# 后者的 dingtalk_approval 适配器要用它注册的 register_biz_handler
try:
from dingdingflow.init import load_dingdingflow
except ImportError:
def load_dingdingflow(): pass
# ── 商品化:定价/账务/折扣/支付(模块与表早已就位,此前一直没 load,页面点了即 500)──
try:
from pricing.init import load_pricing
except ImportError:
def load_pricing(): pass
try:
from accounting.init import load_accounting
except ImportError:
def load_accounting(): pass
try:
from discount.init import load_discount
except ImportError:
def load_discount(): pass
try:
from unipay.init import load_unipay
except ImportError:
def load_unipay(): pass
# ── 资源模块:各自决定 ppid 挂法,统一暴露 resolve_ppid 给产品层 ──
try:
from account_resource.init import load_account_resource
except ImportError:
def load_account_resource(): pass
try:
from storage_resource.init import load_storage_resource
except ImportError:
def load_storage_resource(): pass
set_globalvariable()
ServerEnv().get_module_dbname = get_module_dbname
load_pybricks()
load_appbase()
load_rbac()
load_pipeline_core()
load_pipeline_ops()
load_pipeline_dist()
load_dingdingflow() # 先于 pipeline_service:其钉钉审批适配器依赖 register_biz_handler
# 商品化链路:pricing 必须先于资源模块(资源计费要调 pricing_program_charging)
load_pricing()
load_accounting()
load_discount()
load_unipay()
load_account_resource()
load_storage_resource()
load_pipeline_service()
load_sdlc_adapter()
load_app_audit()
load_showcase()
load_tenant()
load_ktv_adapter()
load_smssend()
load_uapi() # 必须在 rag 之前:rag 通过 uapi 调 vdb/reranker/ner/graph
init_rag_module()
# Permission cache warms up on first request
if __name__ == '__main__':
webapp(init)