| | |
| | | label="ai.mcp.fields.builtinCode" |
| | | choices={[ |
| | | { id: "RSF_WMS", name: "RSF_WMS" }, |
| | | { id: "RSF_WMS_STOCK", name: "RSF_WMS_STOCK" }, |
| | | { id: "RSF_WMS_TASK", name: "RSF_WMS_TASK" }, |
| | | { id: "RSF_WMS_BASE", name: "RSF_WMS_BASE" }, |
| | | ]} |
| | | fullWidth |
| | | disabled={readOnly} |
| | |
| | | public static final String MCP_TRANSPORT_STDIO = "STDIO"; |
| | | public static final String MCP_TRANSPORT_BUILTIN = "BUILTIN"; |
| | | public static final String MCP_BUILTIN_RSF_WMS = "RSF_WMS"; |
| | | public static final String MCP_BUILTIN_RSF_WMS_STOCK = "RSF_WMS_STOCK"; |
| | | public static final String MCP_BUILTIN_RSF_WMS_TASK = "RSF_WMS_TASK"; |
| | | public static final String MCP_BUILTIN_RSF_WMS_BASE = "RSF_WMS_BASE"; |
| | | public static final String MCP_HEALTH_NOT_TESTED = "NOT_TESTED"; |
| | | public static final String MCP_HEALTH_HEALTHY = "HEALTHY"; |
| | | public static final String MCP_HEALTH_UNHEALTHY = "UNHEALTHY"; |
| | |
| | | } |
| | | |
| | | private List<String> resolveConflictCodes(String builtinCode) { |
| | | List<String> codes = new ArrayList<>(); |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS.equals(builtinCode)) { |
| | | codes.add(AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK); |
| | | codes.add(AiDefaults.MCP_BUILTIN_RSF_WMS_TASK); |
| | | codes.add(AiDefaults.MCP_BUILTIN_RSF_WMS_BASE); |
| | | return codes; |
| | | return List.of(); |
| | | } |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK.equals(builtinCode) |
| | | || AiDefaults.MCP_BUILTIN_RSF_WMS_TASK.equals(builtinCode) |
| | | || AiDefaults.MCP_BUILTIN_RSF_WMS_BASE.equals(builtinCode)) { |
| | | codes.add(AiDefaults.MCP_BUILTIN_RSF_WMS); |
| | | } |
| | | return codes; |
| | | throw new CoolException("不支持的内置 MCP 编码: " + builtinCode); |
| | | } |
| | | |
| | | private void ensureTenantId(Long tenantId) { |
| | |
| | | validateBuiltinCode(builtinCode); |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS.equals(builtinCode)) { |
| | | List<ToolCallback> callbacks = new ArrayList<>(); |
| | | callbacks.addAll(createValidatedCallbacks(rsfWmsStockTools, AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK)); |
| | | callbacks.addAll(createValidatedCallbacks(rsfWmsTaskTools, AiDefaults.MCP_BUILTIN_RSF_WMS_TASK)); |
| | | callbacks.addAll(createValidatedCallbacks(rsfWmsBaseTools, AiDefaults.MCP_BUILTIN_RSF_WMS_BASE)); |
| | | callbacks.addAll(createValidatedCallbacks(rsfWmsStockTools, builtinCode)); |
| | | callbacks.addAll(createValidatedCallbacks(rsfWmsTaskTools, builtinCode)); |
| | | callbacks.addAll(createValidatedCallbacks(rsfWmsBaseTools, builtinCode)); |
| | | return callbacks; |
| | | } |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK.equals(builtinCode)) { |
| | | return createValidatedCallbacks(rsfWmsStockTools, builtinCode); |
| | | } |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS_TASK.equals(builtinCode)) { |
| | | return createValidatedCallbacks(rsfWmsTaskTools, builtinCode); |
| | | } |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS_BASE.equals(builtinCode)) { |
| | | return createValidatedCallbacks(rsfWmsBaseTools, builtinCode); |
| | | } |
| | | throw new CoolException("不支持的内置 MCP 编码: " + builtinCode); |
| | | } |
| | |
| | | public List<AiMcpToolPreviewDto> listBuiltinToolCatalog(String builtinCode) { |
| | | validateBuiltinCode(builtinCode); |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS.equals(builtinCode)) { |
| | | List<AiMcpToolPreviewDto> catalog = new ArrayList<>(); |
| | | catalog.addAll(catalogByBuiltinCode(AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK).values()); |
| | | catalog.addAll(catalogByBuiltinCode(AiDefaults.MCP_BUILTIN_RSF_WMS_TASK).values()); |
| | | catalog.addAll(catalogByBuiltinCode(AiDefaults.MCP_BUILTIN_RSF_WMS_BASE).values()); |
| | | return catalog; |
| | | return new ArrayList<>(catalogByBuiltinCode(builtinCode).values()); |
| | | } |
| | | return new ArrayList<>(catalogByBuiltinCode(builtinCode).values()); |
| | | } |
| | |
| | | } |
| | | |
| | | private List<String> supportedBuiltinCodes() { |
| | | return List.of( |
| | | AiDefaults.MCP_BUILTIN_RSF_WMS, |
| | | AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK, |
| | | AiDefaults.MCP_BUILTIN_RSF_WMS_TASK, |
| | | AiDefaults.MCP_BUILTIN_RSF_WMS_BASE |
| | | ); |
| | | return List.of(AiDefaults.MCP_BUILTIN_RSF_WMS); |
| | | } |
| | | |
| | | private Map<String, AiMcpToolPreviewDto> catalogByBuiltinCode(String builtinCode) { |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS_STOCK.equals(builtinCode)) { |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS.equals(builtinCode)) { |
| | | Map<String, AiMcpToolPreviewDto> catalog = new LinkedHashMap<>(); |
| | | catalog.put("rsf_query_available_inventory", buildCatalogItem( |
| | | "rsf_query_available_inventory", |
| | |
| | | "必须提供站点类型列表,类型数量最多 10 个,最多返回 50 个站点。", |
| | | List.of("查询入库和出库作业可用站点", "列出 AGV_PICK 类型的作业站点") |
| | | )); |
| | | return catalog; |
| | | } |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS_TASK.equals(builtinCode)) { |
| | | Map<String, AiMcpToolPreviewDto> catalog = new LinkedHashMap<>(); |
| | | catalog.put("rsf_query_task_list", buildCatalogItem( |
| | | "rsf_query_task_list", |
| | | "任务查询", |
| | |
| | | "必须提供任务 ID 或任务号之一,只返回单个任务。", |
| | | List.of("查询任务 12345 的详情", "根据任务号 TASK24001 查看执行明细") |
| | | )); |
| | | return catalog; |
| | | } |
| | | if (AiDefaults.MCP_BUILTIN_RSF_WMS_BASE.equals(builtinCode)) { |
| | | Map<String, AiMcpToolPreviewDto> catalog = new LinkedHashMap<>(); |
| | | catalog.put("rsf_query_warehouses", buildCatalogItem( |
| | | "rsf_query_warehouses", |
| | | "基础资料", |
| | |
| | | WHERE `tenant_id` = 1 AND `transport_type` = 'BUILTIN' AND `builtin_code` = 'RSF_WMS' AND `deleted` = 0 |
| | | ); |
| | | |
| | | INSERT INTO `sys_ai_mcp_mount` |
| | | (`name`, `transport_type`, `builtin_code`, `request_timeout_ms`, `sort`, `tenant_id`, `status`, `deleted`, `create_time`, `create_by`, `update_time`, `update_by`, `memo`) |
| | | SELECT 'RSF WMS 库存作业内置 MCP', 'BUILTIN', 'RSF_WMS_STOCK', 60000, 1, 1, 0, 0, '2026-03-19 10:00:00', 2, '2026-03-19 10:00:00', 2, '内置库存查询和站点查询工具' |
| | | WHERE NOT EXISTS ( |
| | | SELECT 1 FROM `sys_ai_mcp_mount` |
| | | WHERE `tenant_id` = 1 AND `transport_type` = 'BUILTIN' AND `builtin_code` = 'RSF_WMS_STOCK' AND `deleted` = 0 |
| | | ); |
| | | |
| | | INSERT INTO `sys_ai_mcp_mount` |
| | | (`name`, `transport_type`, `builtin_code`, `request_timeout_ms`, `sort`, `tenant_id`, `status`, `deleted`, `create_time`, `create_by`, `update_time`, `update_by`, `memo`) |
| | | SELECT 'RSF WMS 任务查询内置 MCP', 'BUILTIN', 'RSF_WMS_TASK', 60000, 2, 1, 0, 0, '2026-03-19 10:00:00', 2, '2026-03-19 10:00:00', 2, '内置任务列表与任务详情查询工具' |
| | | WHERE NOT EXISTS ( |
| | | SELECT 1 FROM `sys_ai_mcp_mount` |
| | | WHERE `tenant_id` = 1 AND `transport_type` = 'BUILTIN' AND `builtin_code` = 'RSF_WMS_TASK' AND `deleted` = 0 |
| | | ); |
| | | |
| | | INSERT INTO `sys_ai_mcp_mount` |
| | | (`name`, `transport_type`, `builtin_code`, `request_timeout_ms`, `sort`, `tenant_id`, `status`, `deleted`, `create_time`, `create_by`, `update_time`, `update_by`, `memo`) |
| | | SELECT 'RSF WMS 基础资料内置 MCP', 'BUILTIN', 'RSF_WMS_BASE', 60000, 3, 1, 0, 0, '2026-03-19 10:00:00', 2, '2026-03-19 10:00:00', 2, '内置仓库、基础站点和字典数据查询工具' |
| | | WHERE NOT EXISTS ( |
| | | SELECT 1 FROM `sys_ai_mcp_mount` |
| | | WHERE `tenant_id` = 1 AND `transport_type` = 'BUILTIN' AND `builtin_code` = 'RSF_WMS_BASE' AND `deleted` = 0 |
| | | ); |
| | | UPDATE `sys_ai_mcp_mount` |
| | | SET `status` = 0, |
| | | `update_time` = '2026-03-19 10:00:00', |
| | | `update_by` = 2, |
| | | `memo` = '已下线,仅保留 RSF_WMS 内置 MCP' |
| | | WHERE `transport_type` = 'BUILTIN' |
| | | AND `builtin_code` IN ('RSF_WMS_STOCK', 'RSF_WMS_TASK', 'RSF_WMS_BASE') |
| | | AND `deleted` = 0; |
| | | |
| | | INSERT INTO `sys_menu` |
| | | (`id`, `name`, `parent_id`, `parent_name`, `path`, `path_name`, `route`, `component`, `brief`, `code`, `type`, `authority`, `icon`, `sort`, `meta`, `tenant_id`, `status`, `deleted`, `create_time`, `create_by`, `update_time`, `update_by`, `memo`) |