Commit b2232985 authored by yuguo's avatar yuguo

feat(navigate-tool): add embeddable flag, return embed action for inline views

Co-Authored-By: default avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 3025da6e
package internalagent
import (
"log"
"internet-hospital/internal/model"
"internet-hospital/pkg/database"
)
// ensureRouteSeed 初始化路由注册表种子数据
func ensureRouteSeeds() {
db := database.GetDB()
if db == nil {
return
}
seeds := defaultRouteSeeds()
created := 0
for _, seed := range seeds {
var existing model.RouteEntry
if err := db.Where("page_code = ?", seed.PageCode).First(&existing).Error; err != nil {
if err := db.Create(&seed).Error; err != nil {
log.Printf("[RouteSeeds] 写入 %s 失败: %v", seed.PageCode, err)
} else {
created++
}
}
}
if created > 0 {
log.Printf("[RouteSeeds] 写入 %d 条路由注册数据", created)
}
}
func defaultRouteSeeds() []model.RouteEntry {
return []model.RouteEntry{
// ========== Admin 模块 ==========
{
PageCode: "dashboard",
PageName: "运营大盘",
Module: "admin",
Route: "/admin/dashboard",
Operations: `["view"]`,
RoleAccess: "admin",
Description: "展示系统运营数据看板,包含问诊量、收入、医生在线率等核心指标",
SortOrder: 1,
Status: "active",
},
{
PageCode: "patient_management",
PageName: "患者管理",
Module: "admin",
Route: "/admin/patients",
AddRoute: "/admin/patients?action=add",
EditRoute: "/admin/patients?action=edit",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理系统中的患者用户,查看患者信息和问诊历史,支持添加新患者",
Embeddable: true,
SortOrder: 2,
Status: "active",
},
{
PageCode: "doctor_management",
PageName: "医生管理",
Module: "admin",
Route: "/admin/doctors",
AddRoute: "/admin/doctors?action=add",
EditRoute: "/admin/doctors?action=edit",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理医生账户,添加新医生、审核资质、编辑信息。用户说'注册医生''添加医生''新增医生'时导航到此页面并使用open_add操作",
Embeddable: true,
SortOrder: 3,
Status: "active",
},
{
PageCode: "admin_management",
PageName: "管理员管理",
Module: "admin",
Route: "/admin/admins",
AddRoute: "/admin/admins?action=add",
EditRoute: "/admin/admins?action=edit",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理系统管理员账户和权限,支持添加新管理员",
SortOrder: 4,
Status: "active",
},
{
PageCode: "department_management",
PageName: "科室管理",
Module: "admin",
Route: "/admin/departments",
AddRoute: "/admin/departments?action=add",
EditRoute: "/admin/departments?action=edit",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理医院科室,添加新科室、设置科室信息和分诊规则",
Embeddable: true,
SortOrder: 5,
Status: "active",
},
{
PageCode: "consultation_management",
PageName: "问诊管理",
Module: "admin",
Route: "/admin/consultations",
Operations: `["view","edit"]`,
RoleAccess: "admin",
Description: "查看和管理所有问诊记录,包含问诊状态跟踪",
SortOrder: 6,
Status: "active",
},
{
PageCode: "prescription_regulation",
PageName: "处方监管",
Module: "admin",
Route: "/admin/prescription",
Operations: `["view"]`,
RoleAccess: "admin",
Description: "监管处方开具情况,审核处方合规性",
SortOrder: 7,
Status: "active",
},
{
PageCode: "pharmacy_management",
PageName: "药品库",
Module: "admin",
Route: "/admin/pharmacy",
AddRoute: "/admin/pharmacy?action=add",
EditRoute: "/admin/pharmacy?action=edit",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理药品目录、库存和价格,支持添加新药品",
SortOrder: 8,
Status: "active",
},
{
PageCode: "ai_configuration",
PageName: "AI配置",
Module: "admin",
Route: "/admin/ai-config",
Operations: `["view","edit"]`,
RoleAccess: "admin",
Description: "配置AI模型参数、API密钥和系统提示词",
SortOrder: 9,
Status: "active",
},
{
PageCode: "compliance_report",
PageName: "合规报表",
Module: "admin",
Route: "/admin/compliance",
Operations: `["view"]`,
RoleAccess: "admin",
Description: "查看合规性报表和审计日志",
SortOrder: 10,
Status: "active",
},
{
PageCode: "agent_management",
PageName: "Agent管理",
Module: "admin",
Route: "/admin/agents",
AddRoute: "/admin/agents?action=add",
EditRoute: "/admin/agents?action=edit",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理AI智能体定义、工具配置和执行日志",
SortOrder: 11,
Status: "active",
},
{
PageCode: "tool_center",
PageName: "工具中心",
Module: "admin",
Route: "/admin/tools",
AddRoute: "/admin/tools?action=add",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理所有AI工具:内置工具、HTTP工具、技能包、CRUD工具、表达式工具",
SortOrder: 12,
Status: "active",
},
{
PageCode: "workflow_management",
PageName: "工作流",
Module: "admin",
Route: "/admin/workflows",
AddRoute: "/admin/workflows?action=add",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理自动化工作流定义和执行记录",
SortOrder: 13,
Status: "active",
},
{
PageCode: "human_review",
PageName: "人工审核",
Module: "admin",
Route: "/admin/tasks",
Operations: `["view","edit"]`,
RoleAccess: "admin",
Description: "处理工作流中需要人工审核的任务",
SortOrder: 14,
Status: "active",
},
{
PageCode: "knowledge_base",
PageName: "知识库",
Module: "admin",
Route: "/admin/knowledge",
AddRoute: "/admin/knowledge?action=add",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "管理医学知识库集合和文档",
SortOrder: 15,
Status: "active",
},
{
PageCode: "content_safety",
PageName: "内容安全",
Module: "admin",
Route: "/admin/safety",
AddRoute: "/admin/safety?action=add",
Operations: `["view","create","edit","delete"]`,
RoleAccess: "admin",
Description: "配置安全词过滤规则,查看过滤日志",
SortOrder: 16,
Status: "active",
},
{
PageCode: "ai_operations",
PageName: "AI运营中心",
Module: "admin",
Route: "/admin/ai-center",
Operations: `["view"]`,
RoleAccess: "admin",
Description: "AI运营数据监控、Agent调用统计和成本分析",
SortOrder: 17,
Status: "active",
},
// ========== Patient 模块 ==========
{
PageCode: "patient_home",
PageName: "首页",
Module: "patient",
Route: "/patient/home",
Operations: `["view"]`,
RoleAccess: "patient",
Description: "患者端首页,展示快捷入口和健康信息概览",
SortOrder: 1,
Status: "active",
},
{
PageCode: "find_doctor",
PageName: "找医生",
Module: "patient",
Route: "/patient/doctors",
Operations: `["view"]`,
RoleAccess: "patient",
Description: "按科室、专长搜索和查看医生信息",
Embeddable: true,
SortOrder: 2,
Status: "active",
},
{
PageCode: "my_consultations",
PageName: "我的问诊",
Module: "patient",
Route: "/patient/consult",
Operations: `["view"]`,
RoleAccess: "patient",
Description: "查看患者的问诊历史和进行中的问诊",
Embeddable: true,
SortOrder: 3,
Status: "active",
},
{
PageCode: "electronic_prescription",
PageName: "电子处方",
Module: "patient",
Route: "/patient/prescription",
Operations: `["view"]`,
RoleAccess: "patient",
Description: "查看和管理电子处方",
SortOrder: 4,
Status: "active",
},
{
PageCode: "chronic_disease",
PageName: "慢病管理",
Module: "patient",
Route: "/patient/chronic",
Operations: `["view"]`,
RoleAccess: "patient",
Description: "慢性病管理、续方申请和用药提醒",
SortOrder: 5,
Status: "active",
},
{
PageCode: "health_records",
PageName: "健康档案",
Module: "patient",
Route: "/patient/health-records",
Operations: `["view"]`,
RoleAccess: "patient",
Description: "查看个人健康档案、检验报告和家庭成员信息",
SortOrder: 6,
Status: "active",
},
{
PageCode: "pre_consult",
PageName: "预问诊",
Module: "patient",
Route: "/patient/pre-consult",
Operations: `["view"]`,
RoleAccess: "patient",
Description: "AI预问诊对话,智能分析症状并推荐医生",
Embeddable: true,
SortOrder: 7,
Status: "active",
},
// ========== Doctor 模块 ==========
{
PageCode: "doctor_workbench",
PageName: "工作台",
Module: "doctor",
Route: "/doctor/workbench",
Operations: `["view"]`,
RoleAccess: "doctor",
Description: "医生工作台,展示待处理问诊、今日排班和工作统计",
SortOrder: 1,
Status: "active",
},
{
PageCode: "consult_hall",
PageName: "问诊大厅",
Module: "doctor",
Route: "/doctor/consult",
Operations: `["view","edit"]`,
RoleAccess: "doctor",
Description: "医生接诊工作区,包含患者列表、聊天窗口和AI辅助",
SortOrder: 2,
Status: "active",
},
{
PageCode: "doctor_schedule",
PageName: "排班管理",
Module: "doctor",
Route: "/doctor/schedule",
Operations: `["view","edit"]`,
RoleAccess: "doctor",
Description: "管理医生的排班时间和出诊状态",
SortOrder: 3,
Status: "active",
},
{
PageCode: "doctor_income",
PageName: "收入统计",
Module: "doctor",
Route: "/doctor/income",
Operations: `["view"]`,
RoleAccess: "doctor",
Description: "查看问诊收入统计和提现记录",
SortOrder: 4,
Status: "active",
},
}
}
package model
import "time"
// RouteEntry 前端路由注册表(供 AI 导航工具查询)
type RouteEntry struct {
ID uint `gorm:"primaryKey" json:"id"`
PageCode string `gorm:"type:varchar(100);uniqueIndex" json:"page_code"`
PageName string `gorm:"type:varchar(200)" json:"page_name"`
Module string `gorm:"type:varchar(50)" json:"module"` // admin/patient/doctor
Route string `gorm:"type:varchar(200)" json:"route"`
EditRoute string `gorm:"type:varchar(200)" json:"edit_route"`
AddRoute string `gorm:"type:varchar(200)" json:"add_route"`
Operations string `gorm:"type:jsonb;default:'[]'" json:"operations"` // ["view","create","edit","delete"]
RoleAccess string `gorm:"type:varchar(100)" json:"role_access"` // "admin"
Description string `gorm:"type:text" json:"description"`
Status string `gorm:"type:varchar(20);default:'active'" json:"status"`
SortOrder int `gorm:"default:0" json:"sort_order"`
Embeddable bool `gorm:"default:false" json:"embeddable"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
package tools
import (
"context"
"encoding/json"
"fmt"
"internet-hospital/internal/model"
agentpkg "internet-hospital/pkg/agent"
"internet-hospital/pkg/database"
)
// NavigateTool 根据用户意图生成页面导航指令
type NavigateTool struct{}
func (t *NavigateTool) Name() string { return "navigate" }
func (t *NavigateTool) Description() string {
return `根据用户意图导航到指定页面,前端会渲染为可点击的导航卡片。
常用 page_code:
- doctor_management: 医生管理(添加/编辑/查看医生)
- patient_management: 患者管理
- department_management: 科室管理
- pharmacy_management: 药品库管理
- consultation_management: 问诊管理
- prescription_regulation: 处方监管
- agent_management: Agent管理
- tool_center: 工具中心
- workflow_management: 工作流
- knowledge_base: 知识库
- dashboard: 运营大盘`
}
func (t *NavigateTool) Parameters() []agentpkg.ToolParameter {
return []agentpkg.ToolParameter{
{Name: "page_code", Type: "string", Description: "目标页面代码,如: doctor_management, patient_management, pharmacy_management", Required: true},
{Name: "operation", Type: "string", Description: "操作类型: view_list(查看列表), open_add(打开新增), open_edit(打开编辑)", Required: false, Enum: []string{"view_list", "open_edit", "open_add"}},
{Name: "record_id", Type: "string", Description: "编辑/查看的记录ID(operation 为 open_edit 时需要)", Required: false},
}
}
func (t *NavigateTool) Execute(_ context.Context, params map[string]interface{}) (interface{}, error) {
pageCode, _ := params["page_code"].(string)
if pageCode == "" {
return nil, fmt.Errorf("page_code 必填")
}
operation, _ := params["operation"].(string)
if operation == "" {
operation = "view_list"
}
recordID, _ := params["record_id"].(string)
db := database.GetDB()
if db == nil {
return nil, fmt.Errorf("数据库未初始化")
}
var entry model.RouteEntry
if err := db.Where("page_code = ? AND status = 'active'", pageCode).First(&entry).Error; err != nil {
return nil, fmt.Errorf("页面 %s 不存在或未启用", pageCode)
}
// 构建实际路由(始终以列表页路由为基础,通过 query param 传递操作意图)
route := entry.Route
actionParams := map[string]interface{}{}
switch operation {
case "open_edit":
if recordID != "" {
route = route + "?action=edit&id=" + recordID
actionParams["action"] = "edit"
actionParams["id"] = recordID
} else if entry.EditRoute != "" {
route = entry.EditRoute
}
case "open_add":
route = route + "?action=add"
actionParams["action"] = "add"
if recordID != "" {
route = route + "&parent_id=" + recordID
actionParams["parent_id"] = recordID
}
}
// 解析支持的操作
var ops []string
json.Unmarshal([]byte(entry.Operations), &ops)
// Determine action type: embed (inline in chat) or navigate (open page)
actionType := "navigate"
if entry.Embeddable {
actionType = "embed"
}
return map[string]interface{}{
"action": actionType,
"page": entry.PageName,
"page_code": entry.PageCode,
"module": entry.Module,
"operation": operation,
"route": route,
"params": actionParams,
"operations": ops,
"description": entry.Description,
"embeddable": entry.Embeddable,
}, nil
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment