diff --git a/app/pipeline_app.py b/app/pipeline_app.py index dc2b36d..a675953 100644 --- a/app/pipeline_app.py +++ b/app/pipeline_app.py @@ -28,9 +28,16 @@ def init(): except ImportError: def load_pipeline_service(): pass try: - from pipeline_sdlc.adapter import load_sdlc_adapter + from pipeline_sdlc.init import load_pipeline_sdlc except ImportError: - def load_sdlc_adapter(): pass + def load_pipeline_sdlc(): pass + # pipeline_task:任务中心交互层(无自有表,调 pipeline_service 的函数)。 + # 必须加载:task_detail.ui/step_panel.ui 在 Jinja 渲染期直接调 + # get_task_data/get_step_node_data,未注册则详情页 500 UndefinedError。 + try: + from pipeline_task.init import load_pipeline_task + except ImportError: + def load_pipeline_task(): pass try: from app_audit.init import load_app_audit except ImportError: @@ -65,9 +72,9 @@ def init(): def load_dapi(): pass # rag:知识库(向量检索 + 图谱),表名统一 rag_ 前缀,与产线业务表不冲突 try: - from rag.init import init_rag_module + from rag.init import load_rag except ImportError: - def init_rag_module(): pass + def load_rag(): pass # dingdingflow:钉钉审批(表名 dda_ 前缀)。必须早于 pipeline_service, # 后者的 dingtalk_approval 适配器要用它注册的 register_biz_handler try: @@ -117,9 +124,9 @@ def init(): def load_supplychain(): pass # pipeline_llm:模型治理(供应商/账号/端点/组织策略/限额限流/双维度记账) try: - from pipeline_llm.init import load_llm + from pipeline_llm.init import load_pipeline_llm except ImportError: - def load_llm(): pass + def load_pipeline_llm(): pass # pipeline_platform:平台内部 agent(模型自动配置等,仅管理员) try: from pipeline_platform.init import load_pipeline_platform @@ -145,12 +152,13 @@ def init(): load_product_management() # 产品层:依赖资源模块的 product_interface load_filemgr() # 文件管理:先于 supplychain(合同附件依赖) load_supplychain() # 供应链:供应商/分销商/折扣 - load_llm() # 模型治理:供应商/账号/端点/组织策略/限额限流/记账 + load_pipeline_llm() # 模型治理:供应商/账号/端点/组织策略/限额限流/记账 load_pipeline_service() + load_pipeline_task() # 任务中心交互层:注册 task_detail/step_panel 页面所需 Jinja helper(依赖 pipeline_service) load_pipeline_platform() # 平台内部 agent(依赖 pipeline_service 的 llm_bridge) load_pipeline_bidding() # 投标产线能力包(依赖 pipeline_service 的 capability 分发) load_pipeline_opportunity() # 商机产线能力包(数据来自数据爬取平台内网 HTTP) - load_sdlc_adapter() + load_pipeline_sdlc() load_app_audit() load_showcase() load_tenant() @@ -158,7 +166,7 @@ def init(): load_smssend() load_uapi() # 必须在 rag 之前:rag 通过 uapi 调 vdb/reranker/ner/graph load_dapi() # 必须在 rag 之前:注册 Bearer key 认证,rag API 端点鉴权依赖 - init_rag_module() + load_rag() # Permission cache warms up on first request diff --git a/build.sh b/build.sh index 7582296..2670c2e 100644 --- a/build.sh +++ b/build.sh @@ -53,7 +53,10 @@ for mod in pipeline_core pipeline_ops pipeline_dist; do done # 5. Install business modules (clone external, local already in pkgs) -for mod in pipeline-sdlc showcase evaluate pipeline-service pipeline-task tenant app_audit product_management discount pricing unipay smssend accounting uapi rag dingdingflow account_resource storage_resource filemgr supplychain pipeline-bidding pipeline-llm pipeline-platform; do +# 注:evaluate 只 clone 不 install——其 wwwroot/json/models 嵌套在包内(evaluate/evaluate/), +# 与本脚本 pkgs//wwwroot 软链约定不兼容,且依赖 VBench/torch 重环境; +# 待营销产线开发时连同结构规范化一起接入。 +for mod in pipeline-sdlc showcase evaluate pipeline-service pipeline-task tenant app_audit product_management discount pricing unipay smssend accounting uapi rag dingdingflow account_resource storage_resource filemgr supplychain pipeline-bidding pipeline-llm pipeline-platform pipeline-opportunity; do cd "$cdir/pkgs" if [ ! -d "$mod" ]; then git clone https://git.opencomputing.cn/yumoqing/$mod || echo "SKIP: $mod" @@ -62,7 +65,9 @@ for mod in pipeline-sdlc showcase evaluate pipeline-service pipeline-task tenant done # 6. pip install all modules from pkgs/(pipeline-service 是普通 install 非 editable,部署必 pull+pip install 都做) -for mod in pipeline_core pipeline_ops pipeline_dist pipeline-sdlc showcase pipeline-service tenant app_audit product_management discount pricing unipay smssend accounting uapi rag dingdingflow pipeline-bidding pipeline-llm pipeline-platform; do +# 注意与第 5 步 clone 清单对齐:clone 了却不 install 的模块,主程序 try/except 会静默降级—— +# 模块整个消失且零报错(account_resource 等 4 个此前正是这种状态,测试机靠手工补装)。 +for mod in pipeline_core pipeline_ops pipeline_dist pipeline-sdlc showcase pipeline-service pipeline-task tenant app_audit product_management discount pricing unipay smssend accounting uapi rag dingdingflow account_resource storage_resource filemgr supplychain pipeline-bidding pipeline-llm pipeline-platform pipeline-opportunity; do if [ -d "pkgs/$mod" ]; then "$cdir/py3/bin/pip" install "pkgs/$mod/" 2>&1 | tail -1 fi @@ -91,7 +96,7 @@ fi # 7. Regenerate CRUD from json for all pipeline modules # 注意:凡 json/ 下有 CRUD 定义的模块都必须在列——漏掉则页面从未生成, # 菜单点进去 500(fpath is None)。pricing 曾因遗漏导致定价管理 500。 -for mod in appbase pipeline_core pipeline_ops pipeline_dist pipeline-sdlc rbac dapi accounting uapi rag dingdingflow account_resource storage_resource filemgr supplychain pipeline-bidding pricing pipeline-llm; do +for mod in appbase pipeline_core pipeline_ops pipeline_dist pipeline-sdlc rbac dapi accounting uapi rag dingdingflow account_resource storage_resource filemgr supplychain pipeline-bidding pricing pipeline-llm pipeline-opportunity; do json_dir="pkgs/$mod/json" models_dir="pkgs/$mod/models" wwwroot_dir="pkgs/$mod/wwwroot" @@ -104,17 +109,19 @@ done # 8. Link module wwwroot directories (symlinks from pkgs/) -for mod in pipeline-sdlc showcase tenant pipeline_core pipeline_ops pipeline_dist appbase app_audit product_management discount pricing unipay rbac dapi accounting uapi rag dingdingflow account_resource storage_resource filemgr supplychain pipeline-bidding pipeline-llm pipeline-platform; do +for mod in pipeline-sdlc showcase tenant pipeline_core pipeline_ops pipeline_dist appbase app_audit product_management discount pricing unipay rbac dapi accounting uapi rag dingdingflow account_resource storage_resource filemgr supplychain pipeline-bidding pipeline-llm pipeline-platform pipeline-opportunity pipeline-task; do src="pkgs/$mod/wwwroot" dst="wwwroot/$mod" if [ -d "$src" ]; then rm -rf "$dst" 2>/dev/null + # pipeline-task 的菜单/RBAC 路径用下划线(/pipeline_task),软链名保持下划线 + [ "$mod" = "pipeline-task" ] && dst="wwwroot/pipeline_task" ln -sf "../pkgs/$mod/wwwroot" "$dst" echo " wwwroot: $mod linked" fi done -# pipeline_task has no separate module -mkdir -p wwwroot/pipeline_task +# pipeline_task 兜底:模块缺失时保留空目录防菜单 404(正常路径已由上方软链覆盖) +[ -e wwwroot/pipeline_task ] || mkdir -p wwwroot/pipeline_task # 8b. uapi + rag 模块建表 + 导入外部服务配置种子 # uapi 表(upapp/uapi/uapiio...)必须先建,rag 的 uapi_seed.sql 才有表可插 diff --git a/scripts/create_tables.py b/scripts/create_tables.py index 8825129..4030b5c 100644 --- a/scripts/create_tables.py +++ b/scripts/create_tables.py @@ -24,7 +24,10 @@ TABLE_MODULES = ['product_management', 'discount', 'pricing', 'unipay', 'smssend # appbase 也放这里:svgicon/appcodes/appcodes_kv/params 是系统级配置表,含种子数据,幂等建(params 另在下方手动 ensure 默认参数) # dapi 放这里:downapp/downapikey 是下位系统接入表,幂等建(不 DROP,避免误删已注册的下位系统) # accounting 放这里:subject/account_config/accounting_config 是记账配置,account/ledger 是运行时数据,幂等建(不 DROP) -IDEMPOTENT_MODULES = ['pipeline_core', 'pipeline-service', 'appbase', 'dapi', 'accounting'] +# 产线模块 pipeline-bidding(bid_*) / pipeline-opportunity(opp_*) 放这里:走 json2ddl 从 models/*.json 生成 +# (已验证无 DEFAULT ''N'' bug),项目里含运行时数据(标书章节/商机报告),必须幂等不 DROP +IDEMPOTENT_MODULES = ['pipeline_core', 'pipeline-service', 'appbase', 'dapi', 'accounting', + 'pipeline-bidding', 'pipeline-opportunity'] # appbase 系统级配置表(幂等建表 + 默认参数,不 DROP 以免清空运行时数据) diff --git a/scripts/import_init.py b/scripts/import_init.py index 1e6127f..dd16bcb 100644 --- a/scripts/import_init.py +++ b/scripts/import_init.py @@ -31,6 +31,7 @@ INIT_MODULES = [ ('rbac', 'pkgs/rbac/init/data.json'), ('accounting', 'pkgs/accounting/init/data.json'), ('pipeline-bidding', 'pkgs/pipeline-bidding/init/data.json'), + ('pipeline-opportunity', 'pkgs/pipeline-opportunity/init/data.json'), ('pipeline-llm', 'pkgs/pipeline-llm/init/data.json'), ]