feat(ticket): 工单管理模块应用集成——load链/build.sh三清单/种子/i18n/菜单/冒烟

- app/pipeline_app.py: try-import load_ticket()+load链(pipeline_task之后,依赖pipeline_service的provider注册/llm_bridge/rag_client)
- build.sh: clone/pip install/wwwroot软链三清单加ticket(无json/CRUD故不进xls2ui清单)
- conf/config.json module_dbname: ticket→pipeline; scripts/import_init.py INIT_MODULES加ticket(码表+owner.maintainer角色种子)
- scripts/merge_i18n.py MODULES加ticket; i18n四语言+3词条(我的工单/工单管理/提交新工单)
- wwwroot/index.ui: 客户分支「我的工单」;管理分支「工单管理」(is_ticket_staff=owner.maintainer/admin/superuser Jinja门禁)
- deploy/smoke: s15/s16工单两页面用例
- rp.json不改: 权限由模块load_path.py逐个精确配(管理页壳owner三角色,业务权限服务端按current_role动态校验)
This commit is contained in:
yumoqing 2026-09-10 16:14:39 +08:00
parent 1adea1b2e6
commit 9674a2ee4b
11 changed files with 58 additions and 4 deletions

View File

@ -131,6 +131,11 @@ def init():
from pipeline_platform.init import load_pipeline_platform
except ImportError:
def load_pipeline_platform(): pass
# ticket平台工单客户提问→agent预处理→人工运维→转派接入平台待办通道
try:
from ticket.init import load_ticket
except ImportError:
def load_ticket(): pass
set_globalvariable()
ServerEnv().get_module_dbname = get_module_dbname
@ -153,6 +158,7 @@ def init():
load_pipeline_llm() # 模型治理:供应商/账号/端点/组织策略/限额限流/记账
load_pipeline_service()
load_pipeline_task() # 任务中心交互层:注册 task_detail/step_panel 页面所需 Jinja helper依赖 pipeline_service
load_ticket() # 工单管理:依赖 pipeline_service待办provider注册+llm_bridge+rag_clientagent poller 随 worker 进程启动
load_pipeline_platform() # 平台内部 agent依赖 pipeline_service 的 llm_bridge
load_pipeline_bidding() # 投标产线能力包(依赖 pipeline_service 的 capability 分发)
load_pipeline_opportunity() # 商机产线能力包(数据来自数据爬取平台内网 HTTP

View File

@ -56,7 +56,7 @@ done
# 注evaluate 只 clone 不 install——其 wwwroot/json/models 嵌套在包内(evaluate/evaluate/)
# 与本脚本 pkgs/<mod>/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
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 ticket; do
cd "$cdir/pkgs"
if [ ! -d "$mod" ]; then
git clone https://git.opencomputing.cn/yumoqing/$mod || echo "SKIP: $mod"
@ -67,7 +67,7 @@ done
# 6. pip install all modules from pkgs/pipeline-service 是普通 install 非 editable部署必 pull+pip install 都做)
# 注意与第 5 步 clone 清单对齐clone 了却不 install 的模块,主程序 try/except 会静默降级——
# 模块整个消失且零报错account_resource 等 4 个此前正是这种状态,测试机靠手工补装)。
for mod in pipeline_core pipeline_ops 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
for mod in pipeline_core pipeline_ops 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 ticket; do
if [ -d "pkgs/$mod" ]; then
"$cdir/py3/bin/pip" install "pkgs/$mod/" 2>&1 | tail -1
fi
@ -112,7 +112,7 @@ done
# 8. Link module wwwroot directories (symlinks from pkgs/)
for mod in pipeline-sdlc showcase tenant pipeline_core pipeline_ops 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
for mod in pipeline-sdlc showcase tenant pipeline_core pipeline_ops 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 ticket; do
src="pkgs/$mod/wwwroot"
dst="wwwroot/$mod"
if [ -d "$src" ]; then

View File

@ -25,7 +25,8 @@
"pipeline_core": "pipeline",
"pipeline_ops": "pipeline",
"pipeline_sdlc": "pipeline",
"showcase": "pipeline"
"showcase": "pipeline",
"ticket": "pipeline"
},
"website": {
"port": 9090,

View File

@ -124,6 +124,24 @@
"status": 200,
"contains": "产线"
}
},
{
"id": "s14",
"name": "工单-客户列表页",
"url": "/ticket/my/index.ui",
"auth": "login",
"expect": {
"status": 200
}
},
{
"id": "s15",
"name": "工单-管理页",
"url": "/ticket/manage/index.ui",
"auth": "login",
"expect": {
"status": 200
}
}
]
}

View File

@ -54,3 +54,6 @@ API Key: API Key
工作空间为通用会话专属目录,不进入项目空间: Workspace is the general session's own directory, not any project space
暂无已购产线: No purchased pipelines
尚未购买该产线或订阅已到期,请到产品商城购买后再开始对话: Pipeline not purchased or subscription expired. Buy it in the Product Store before chatting.
我的工单: My Tickets
工单管理: Ticket Management
提交新工单: New Ticket

View File

@ -33,3 +33,6 @@ Submit: 送信
显示所有已最小化的窗口: 最小化されたすべてのウィンドウを表示
通用助手: 汎用アシスタント
API Key: API Key
我的工单: マイチケット
工单管理: チケット管理
提交新工单: 新規チケット

View File

@ -33,3 +33,6 @@ Submit: 제출
显示所有已最小化的窗口: 최소화된 모든 창 표시
通用助手: 일반 어시스턴트
API Key: API Key
我的工单: 내 티켓
工单管理: 티켓 관리
提交新工单: 새 티켓

View File

@ -54,3 +54,6 @@ API Key: API Key
工作空间为通用会话专属目录,不进入项目空间: 工作空间为通用会话专属目录,不进入项目空间
暂无已购产线: 暂无已购产线
尚未购买该产线或订阅已到期,请到产品商城购买后再开始对话: 尚未购买该产线或订阅已到期,请到产品商城购买后再开始对话
我的工单: 我的工单
工单管理: 工单管理
提交新工单: 提交新工单

View File

@ -35,6 +35,7 @@ INIT_MODULES = [
('pipeline-bidding', 'pkgs/pipeline-bidding/init/data.json'),
('pipeline-opportunity', 'pkgs/pipeline-opportunity/init/data.json'),
('pipeline-llm', 'pkgs/pipeline-llm/init/data.json'),
('ticket', 'pkgs/ticket/init/data.json'),
]

View File

@ -25,6 +25,7 @@ MODULES = [
('pipeline-opportunity', os.path.join(ROOT_DIR, 'pkgs', 'pipeline-opportunity', 'i18n')),
('dingdingflow', os.path.join(ROOT_DIR, 'pkgs', 'dingdingflow', 'i18n')),
('rbac', os.path.join(ROOT_DIR, 'pkgs', 'rbac', 'i18n')),
('ticket', os.path.join(ROOT_DIR, 'pkgs', 'ticket', 'i18n')),
]
LANGS = ['zh', 'en', 'ko', 'jp']

View File

@ -2,6 +2,7 @@
{% set is_fin = ('owner.superuser' in roles) or ('owner.admin' in roles) or ('owner.account' in roles) or ('reseller.admin' in roles) or ('reseller.accountant' in roles) or ('reseller.operator' in roles) %}
{% set is_customer = ('customer.customer' in roles) or ('*.customer' in roles) %}
{% set is_admin = ('owner.superuser' in roles) or ('owner.admin' in roles) %}
{% set is_ticket_staff = is_admin or ('owner.maintainer' in roles) %}
{
"id": "app",
"widgettype": "VBox",
@ -210,6 +211,12 @@
"icon": "",
"script": "this.open_tab({name:'cust_apikey',label:'API Key',url:'/dapi/apikey_manage.ui',removable:true})"
},
{
"name": "cust_tickets",
"label": "我的工单",
"icon": "",
"script": "this.open_tab({name:'cust_tickets',label:'我的工单',url:'/ticket/my/index.ui',removable:true})"
},
{
"name": "cust_account",
"label": "我的账户",
@ -547,6 +554,14 @@
}
]
},
{% if is_ticket_staff %}
{
"name": "ticket_manage",
"label": "工单管理",
"icon": "",
"script": "this.open_tab({name:'ticket_manage',label:'工单管理',url:'/ticket/manage/index.ui',removable:true})"
},
{% endif %}
{
"name": "sysmgr",
"label": "系统管理",