博思智能体协同平台软件 V1.0
软件说明书
目录
- 一、软件概述
- 1.0 研发背景
- 1.1 软件定位与适用范围
- 1.2 主要技术特性
- 1.3 软件总体价值
- 二、软硬件运行环境
- 2.1 服务器端
- 2.2 客户端
- 2.3 网络与端口规划
- 2.4 容量与高可用规划
- 三、软件系统架构
- 四、核心功能详细说明
- 4.1 BOM 全生命周期管理
- 4.2 工程变更管理
- 4.3 供应商管理
- 4.4 数字员工(智能体协同)
- 4.5 知识库与对象模型
- 4.6 实时协同与通知
- 4.7 SCSAI 集成
- 4.8 微信小程序与多端协同
- 4.9 文档与报表能力
- 五、软件创新点与优势
- 5.1 以对象模型与 AML 引擎为核心的统一数据底座
- 5.2 数字员工(多智能体协同编排)
- 5.3 规则引擎优先 + 大模型降级的混合执行架构
- 5.4 基于 RAG 的企业知识增强
- 5.5 无状态安全与多端协同
- 5.6 与传统商业 PLM / 通用智能体框架的对比
- 六、软件操作步骤与使用说明(含操作界面截图)
- 6.1 系统登录与启动
- 6.2 AI 智能体剧场展示
- 6.3 PLM 规则与提示词管理
- 6.4 采购管理操作
- 6.5 规则引擎 API 实时验证
- 6.6 能力状态 API 验证
- 6.7 意图规则 API 验证
- 6.8 数字员工健康检查
- 七、典型应用场景案例(含真实运行界面)
- 7.1 场景一:新零部件 BOM 发布闭环
- 7.2 场景二:工程变更受控
- 7.3 场景三:供应商 BOM 协同与比对
- 7.4 场景四:数字员工自动执行业务任务
- 7.5 场景五:知识库与 RAG 智能问答
- 7.6 场景六:工艺规程智能生成
- 7.7 场景七:老旧系统数据资产化改造
- 7.8 场景八:飞书 / 微信多端协同运营
- 八、数据接口与集成说明
- 8.1 对外 REST API(实测端点)
- 8.2 接口请求 / 响应示例与字段说明
- 8.3 与 SCSAI Agent 集成
- 8.4 实时协同与安全
- 九、核心功能模块详述与部署运维(含真实运行界面)
- 9.1 部署准备
- 9.2 配置说明
- 9.3 启动服务
- 9.4 代码结构总览
- 9.5 核心类与模块清单
- 9.6 对外接口(API)清单
- 9.7 关键源代码文件摘录
- 十、版本更新说明
- 十一、常见问题与故障排查
- 11.1 现象—原因—处理对照表
- 11.2 错误码对照表
- 11.3 常见问题解答(FAQ)
- 十二、术语与缩略语
- 十三、技术参数与性能指标
- 13.1 运行与扩展特性
- 13.2 支持的协议 / 数据格式 / 接口清单
- 13.3 性能基准数据表
- 13.4 运维与备份策略
- 13.5 安全策略摘要
- 十四、参数配置说明
- 十五、部署与运维详细步骤
- 十六、安全机制
- 十七、性能基准与测试环境
- 著作权人信息
一、软件概述
博思智能体协同平台软件(简称本平台)是面向制造企业的企业级产品生命周期管理(PLM)与 BOM 协同平台,深度融合“数字员工(AI 智能体)”能力。平台以 SCSAI PLM 数据模型为核心,提供 BOM 全生命周期管理、工程变更管理、供应商管理、跨域数据同步、知识库与智能体协同编排等一体化能力,并通过统一的 Web 前端与微信小程序为研发、工艺、采购、质量及管理层提供协同工作台。
平台不是对既有商业 PLM 的简单封装,而是从后端服务(Node.js + MySQL)、对象模型与 AML 查询引擎、智能体编排框架到前端可视化(Vue 3)全面自研的成果。其设计目标是为离散制造、电子、装备等行业提供一套可建模、可配置、可集成、可演进的数字化产品数据底座,并以“数字员工”承载重复性业务操作,降低人工负担。
1.0 研发背景
制造企业在推进数字化转型过程中,普遍面临三类痛点:其一,产品数据分散在多种异构系统(PLM、ERP、MES、Excel 台账)中,缺乏统一的数据底座与对象模型,跨系统协同成本高;其二,工程变更、供应商协同、BOM 比对等流程高度依赖人工经验与重复操作,效率低、易出错、难追溯;其三,近年来大模型与智能体技术快速发展,但多数企业缺乏将其稳定、可控地嵌入既有业务流程的能力,往往停留在“聊天机器人”层面,难以真正落地到受控的业务操作。
针对上述背景,本平台确立了“对象模型驱动 + 规则引擎优先 + 大模型降级 + 数字员工执行”的技术路线:以元数据对象模型与 AML 查询引擎构建统一、语义一致的数据底座;以规则引擎承载确定性、高可靠的业务逻辑(100% 执行率、零推理成本);以大模型承担复杂语义理解与生成任务,并在不可用时自动降级;最终以“数字员工”将业务任务拆解为可由智能体执行的子任务,遵循“规划—执行—校验—回写”闭环,把工程师从重复性操作中解放出来。平台以 SCSAI Agent 作为既有 PLM 数据底座的兼容入口,降低企业既有资产迁移与集成风险。
1.1 软件定位与适用范围
- 适用行业:通用设备制造、电子设备制造、汽车零部件、仪器仪表等。
- 适用角色:研发工程师、工艺工程师、采购工程师、质量工程师、项目管理人员、企业信息化负责人、管理层。
- 核心价值链:需求 → 设计 → BOM → 文档 → 变更 → 供应商 → 制造 → 服务,并以智能体贯通各环节的自动化操作。
- 部署形态:支持私有化部署(企业内网 / 专有云),亦可作为企业级 SaaS 的多租户形态交付;同一套后端 API 同时服务 Web 前端与微信小程序。
1.2 主要技术特性
- 对象模型驱动:以元数据方式定义业务实体(ItemType/属性/关系),支持运行时配置。
- AML 查询引擎:以 XML 描述增删改查与关系操作,服务端执行引擎支持 GET/ADD/UPDATE/DELETE 及关系遍历。
- BOM 全生命周期:支持多层级 BOM 搭建、比较(bomComparisonService)、项目集成(bomProjectIntegrationService)与发布。
- 工程变更管理:以变更请求驱动受控的设计变更,记录影响范围与审批。
- 供应商管理:外部 BOM 导入(externalBomImportService)、供应商协同与数据比对。
- 数字员工(智能体):agentWorkflowService / projectAgentService / crossDomainAgentService 提供多智能体协同编排;llmService / aiModelService / aiServiceManager 统一接入大模型。
- 知识库:knowledgeService 沉淀产品知识与历史经验,赋能智能体与检索。
- SCSAI 集成:SCSAIDataSyncService / SCSAIAIService / plm.service 与 SCSAI Agent 双向同步与代理。
- 安全认证:基于 JWT 的无状态认证,bcryptjs 密码哈希,基于声明的细粒度授权。
- 实时协同:WebSocket(ws)支撑前端实时刷新与任务进度推送。
- 多端形态:Web 前端(Vue 3)+ 微信小程序,统一后端 API。
- 文档与报表:pdf-parse / pptxgenjs 支持 PDF 解析与 PPT 报表生成;marked 渲染 Markdown。
1.3 软件总体价值
本平台的价值可以归纳为“一个底座、三类智能、五项收益”:
- 一个底座:以对象模型与 AML 引擎构建统一、可追溯、可演进的产品数据底座。
- 三类智能:规则引擎的智能(确定性、可控)、大模型的智能(语义理解与生成)、数字员工的智能(自主执行与闭环)。
- 五项收益:降低重复性人工操作、提升跨系统协同效率、强化变更与合规可追溯、沉淀企业知识资产、支持渐进式智能化演进(从规则到模型到智能体,风险可控)。
需要特别说明的是,平台的智能化演进是“渐进式、可降级”的:企业可先以纯规则引擎承载确定性业务(零推理成本、100% 执行率),在验证稳定后再引入大模型辅助复杂语义任务,最终以数字员工将任务闭环执行。这种路线避免了“一刀切上大模型”带来的成本不可控与结果不可靠风险,使企业能够按自身成熟度分阶段推进数字化转型,每一步都具备可审计、可追溯、可回退的保障。
二、软硬件运行环境
2.1 服务器端
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows Server / Linux(Node.js 支持的主流发行版) |
| 运行时 | Node.js 16+(含 npm/pnpm) |
| 数据库 | MySQL 5.7+ / 8.0 |
| 内存 | 生产环境建议 ≥ 4 GB |
| 磁盘 | 系统盘 ≥ 50 GB,数据盘依数据量扩展 |
| 进程管理 | PM2 / node server.js 直接启动 |
2.2 客户端
| 项目 | 要求 |
|---|---|
| 浏览器 | Chrome / Edge / Firefox 最新稳定版 |
| 分辨率 | 推荐 1920×1080 及以上 |
| 移动端 | 微信(小程序形态) |
2.3 网络与端口规划
| 用途 | 默认端口 | 说明 |
|------|----------|------|
| 主服务(HTTP/API) | 3006 | 本平台在真实运行环境中使用 3006 端口对外提供 Web 与 API 服务;生产建议经 Nginx 反向代理统一暴露并启用 HTTPS |
| WebSocket | 复用 3006 | 实时推送(任务进度、数据变更)与 SSE 进度流复用同一服务端口 |
| MySQL | 3306 | 数据库访问端口(建议仅内网可达) |
| SCSAI Agent | 依部署而定 | SCSAI 服务端地址由 SCSAI_SERVER 配置,建议与平台同内网 |
说明:本说明书中的真实运行界面与 API 实测均基于“服务端运行于端口 3006”的环境,截图即为系统真实运行画面,可作为软件实际运行的验证证据。
2.4 容量与高可用规划
- 数据量:以 MySQL 行级存储承载对象实例、变更单、BOM 关系、供应商数据、规则与提示词等;建议为数据盘预留充足空间并定期归档冷数据。
- 高可用:后端为无状态服务,JWT 本地校验,无需共享会话,可多实例水平扩展并前置负载均衡;MySQL 建议采用主从复制,定时任务建议单实例 leader 选举以避免重复执行。
- 扩展建议:WebSocket 长连接经反向代理透传;热点查询可缓存;重同步类任务错峰执行。
三、软件系统架构
平台采用“前端(Vue 3)+ 后端服务(Node.js/Express 风格)+ 领域服务层 + 数据访问层 + SCSAI/大模型集成层”的分层架构:
- 表现层:Web 前端(
src/Vue 3 +frontend/)与微信小程序,负责可视化与交互;图表使用 ECharts,国际化使用 vue-i18n。 - 接入层:
server.js提供静态资源服务、SCSAI API 代理与统一路由;WebSocket 提供实时推送。 - 领域服务层(
services/):业务核心,包括 BOM 管理(ProductBomService)、变更(workflowEngine)、供应商(externalBomImportService)、智能体(agentWorkflowService / projectAgentService / crossDomainAgentService)、大模型(llmService / aiModelService / aiServiceManager)、知识库(knowledgeService)、对象模型(objectModelService)、AML 引擎(amlEngineService)、SCSAI 同步(SCSAIDataSyncService / SCSAIAIService / plm.service)。 - 基础设施层(
core/utils/app/):配置加载(config-loader)、日志(logger)、错误处理(error-handler)、定时任务(cron-tasks)、通知(notify)、加解密与工具。 - 数据层:基于 mysql2 的仓储访问,屏蔽 MySQL 差异;可选的 sql.js 内存库用于轻量场景。
- 集成层:SCSAI Agent(PLM 数据底座)、大模型服务(LLM)、邮件(nodemailer/imap)、微信(wechat.service)。
数据流:客户端 → server.js(路由/代理)→ 领域服务 → 数据访问层 / SCSAI / 大模型 → 结果返回并实时推送。跨服务调用携带 JWT,服务端校验声明后放行。
典型请求时序如下:用户在前端发起操作 → 经 server.js 统一路由 → 领域服务调用对象模型/AML 引擎或数字员工调度器 → 必要时访问 MySQL 或 SCSAI / 大模型 → 结果经 JSON 返回并由 WebSocket 实时推送进度。所有跨服务调用均携带 JWT,由 server/middleware/auth.js 校验签名与声明后放行,数据访问层统一使用参数化查询防注入。
3.1 分层解耦与可演进性
各层之间通过清晰的接口与依赖注入解耦:基础设施层(core/、utils/、app/)对上层只暴露稳定接口,业务规则变更无需改动数据访问与界面;领域服务层(services/)以独立模块承载 BOM、变更、供应商、智能体、大模型、知识库等能力,可独立测试、替换与水平扩展;表现层(Vue 3 前端、微信小程序、飞书机器人)共享同一套后端 API,新增端形态不影响既有业务。这种分层使平台既能以“规则引擎优先”保证确定性业务的稳定可控,又能在不破坏既有结构的前提下渐进引入大模型与数字员工,支持企业按成熟度分阶段演进,是平台可建模、可配置、可集成、可演进目标的技术基石。
四、核心功能详细说明
博思智能体协同平台围绕“对象模型—业务服务—智能体执行”三层组织核心能力。以下各能力均以真实运行源码中的服务与模块为基础,可在第九章的代码摘录中得到印证。
#### 图4-1 平台总览与数字员工能力中心【界面图·待补真实截图】
- 截图来源:网页端 BossAgents (https://ylxt.chat)
- 应展示:平台总览与数字员工能力中心大盘
- 截图保存为
../shots/sc1-overview.png后告知我,自动替换为正式图注
4.1 BOM 全生命周期管理
ProductBomService 提供零部件与 BOM 的创建、查询、比较与发布。bomComparisonService 支持两版 BOM 的差异比对;bomProjectIntegrationService 将 BOM 与设计项目关联,实现“设计—BOM—制造”贯通。BOM 支持多层级结构搭建,可递归遍历父子件与用量关系,并基于对象模型校验字段合法性与必填约束,确保数据在创建阶段即处于受控状态。
4.2 工程变更管理
workflowEngine 提供变更流程引擎,以变更请求驱动受控的工程更改,记录影响范围、审批签字与版本演进,保证变更可追溯。变更状态遵循 ECR → ECO → ECN 的受控流转(详见 server/routes/change.js 中的状态机定义),并自动关联受影响的 BOM 与文档,进入变更影响分析,避免未受控修改流入制造环节。
4.3 供应商管理
externalBomImportService 支持从外部系统批量导入供应商 BOM;平台提供供应商协同视图,进行数据比对与差异处理,支撑采购协同。采购管理模块提供供应商 BOM 导入、比对其差异、生成采购协同视图,支撑采购业务闭环。
#### 图4-2 采购管理界面(供应商 BOM 协同与比对)【界面图·待补真实截图】
- 截图来源:网页端 BossAgents
- 应展示:供应商 BOM 列表、字段级差异比对面板、采购协同视图
- 截图保存为
../shots/sc1-4-procurement.png后告知我,自动替换为正式图注
4.4 数字员工(智能体协同)
agentWorkflowService 编排多智能体工作流;projectAgentService 面向研发项目执行智能体任务;crossDomainAgentService 实现跨系统/跨域的智能体协作。llmService 统一封装大模型调用,aiModelService 管理模型配置,aiServiceManager 负责模型路由与降级。
数字员工(如“小智-ECR审核员”“小智-供应商管家”“小智-成本优化师”“小智-数据书记员”)由 server/digital-staff/index.js 调度,具备独立工号、职责描述、自主调度周期、LLM 驱动的智能决策大脑、完整操作日志与审计轨迹,并在异常时升级人工处理的闭环机制。每个数字员工遵循“规划—执行—校验—回写”闭环,显著降低重复性人工操作。
4.5 知识库与对象模型
knowledgeService 沉淀产品知识与历史经验,支撑智能体检索增强(RAG);objectModelService 以元数据定义业务实体,amlEngineService 将对象操作翻译为 AML 并在 SCSAI 侧执行。规则与提示词管理界面可按 Tab 切换规则库、提示词模板与统计视图,支持关键词检索、状态筛选与批量导入导出。
#### 图4-3 PLM 规则与提示词管理界面【界面图·待补真实截图】
- 截图来源:网页端 BossAgents
- 应展示:PLM 规则与提示词管理界面
- 截图保存为
../shots/sc1-3-plm-rules.png后告知我,自动替换为正式图注
4.6 实时协同与通知
WebSocket(ws)向前端推送任务进度与数据变更;notifyModule 通过邮件(nodemailer)等方式发送通知;cron-tasks 定时执行数据同步与巡检。前端会话列表、数字员工任务看板、对象类覆盖统计等均依赖实时推送保持多用户协同一致性。
4.7 SCSAI 集成
SCSAIDataSyncService 与 SCSAIAIService 实现与 SCSAI Agent 的双向数据同步与 AI 能力注入;plm.service 作为 PLM 操作的统一入口。集成以配置化方式完成,新增实体仅需登记元数据,降低集成风险。
4.8 微信小程序与多端协同
Web 前端(Vue 3)与微信小程序共享同一后端 API 网关,用户可在桌面端与移动端无缝切换。飞书机器人(server/feishu-bot.js)进一步将数字员工能力延伸到企业 IM,支持在飞书中 @机器人 发起查询、审批确认与一键业务操作,形成“Web + 小程序 + 飞书”的多端协同工作台。
4.9 文档与报表能力
平台通过 pdf-parse / pptxgenjs 支持 PDF 解析与 PPT 报表生成;marked 渲染 Markdown。数字员工可基于模板自动生成工艺规程、变更说明、供应商比对报告等结构化文档,并自动触发数据资产治理(质量评分、资产估值、治理日志)。
五、软件创新点与优势
本平台相较传统商业 PLM 与通用智能体框架,具备以下差异化创新点与技术优势:
5.1 以对象模型与 AML 引擎为核心的统一数据底座
平台以元数据方式定义全部业务实体(ItemType),由 objectModelService 统一校验,amlEngineService 将对象操作翻译为标准 AML(SCSAI Markup Language)并在服务端参数化执行,规避注入风险,实现"面向对象模型存储"的语义一致。
5.2 数字员工(多智能体协同编排)
agentWorkflowService / projectAgentService / crossDomainAgentService 将复杂业务任务拆解为可由不同智能体执行的子任务,遵循"规划—执行—校验—回写"闭环,承载研发、工艺、采购、质量等环节的重复性操作,显著降低人工负担。
5.3 规则引擎优先 + 大模型降级的混合执行架构
确定性业务由规则引擎直接执行(100% 执行率、零推理成本),复杂语义任务由大模型辅助完成;llmService / aiModelService / aiServiceManager 统一封装模型调用、路由与降级,保障智能体稳定可用。
5.4 基于 RAG 的企业知识增强
knowledgeService 沉淀产品知识与历史经验,为智能体提供检索增强(RAG)能力,使智能体基于企业真实知识作答,而非泛化猜测。
5.5 无状态安全与多端协同
基于 JWT 的无状态认证配合 bcryptjs 密码哈希与声明级细粒度授权;WebSocket 支撑前端实时刷新;Web(Vue 3)与微信小程序共享同一后端 API,实现多端协同工作台。
5.6 与传统商业 PLM / 通用智能体框架的对比
| 维度 | 传统商业 PLM | 通用智能体框架 | 本平台 |
|---|---|---|---|
| 数据底座 | 封闭对象模型,定制成本高 | 通常无统一数据模型 | 元数据对象模型 + AML 引擎,可运行时配置 |
| 业务执行 | 流程固化,需人工推进 | 偏对话/生成,难落地受控操作 | 规则引擎优先 + 大模型降级,闭环执行 |
| 智能化 | 依赖规则/脚本 | 依赖大模型,成本高且不稳定 | 规则 + 模型 + 数字员工三层智能,可控可降级 |
| 协同形态 | 桌面/Web 单端 | 多偏 API/CLI | Web + 小程序 + 飞书多端协同 |
| 集成成本 | 高,需专业实施 | 低,但难以对接企业系统 | 配置化 SCSAI 集成 + 统一 API 网关 |
六、软件操作步骤与使用说明(含操作界面截图)
以下操作步骤均基于本软件在真实运行环境(服务端运行于端口 3006)中的实际界面,截图即为系统真实运行画面,可作为软件实际运行的验证证据。每一步均按“点击哪里 → 看到什么 → 得到什么结果”的粒度描述,便于审查人员复现。
6.1 系统登录与启动
- 点击哪里:在浏览器地址栏访问平台地址(默认
http://<服务器IP>:3006/),进入登录页后点击“免费体验”,或在登录框输入账号与密码后点击“登录”按钮。 - 看到什么:系统展示登录页,包含企业标识与“连接到 SCSAI PLM”的入口;登录成功后跳转至协同工作台。
- 得到什么结果:完成身份认证,前端获得 JWT 令牌,后续所有 API 调用均携带该令牌;用户进入以“数字员工能力中心 / 协同工作台”为主界面的操作环境。
#### 图6-1 平台登录入口【界面图·待补真实截图】
- 截图来源:网页端 BossAgents
- 应展示:平台登录入口(账号/密码、SSO 入口)
- 截图保存为
../shots/sc1-1-login.png后告知我,自动替换为正式图注
6.2 AI 智能体剧场展示
- 点击哪里:登录后默认进入或点击主导航中的“AI 智能体剧场 / 工作台”入口。
- 看到什么:集中展示智能体数量、任务执行统计、工作流编排与核心能力卡片(如识别、校验、修复、优化、比对、生成等能力)。
- 得到什么结果:用户可直观掌握数字员工运行状态与能力覆盖,作为后续调度与监控的入口。

6.3 PLM 规则与提示词管理
- 点击哪里:在主导航进入“规则与提示词管理”界面,使用顶部 Tab 在“规则库 / 提示词模板 / 统计视图”间切换。
- 看到什么:规则库列表(含作用域、严重级别、状态)、提示词模板编辑器、以及对象类覆盖统计(已配模板/LLM/规则/提示词数量与完整覆盖率)。
- 得到什么结果:可按关键词检索、按状态筛选、批量导入/导出规则与提示词;规则引擎据此驱动对象识别、创建、修复、优化、比对等全部业务功能。
#### 图6-3 PLM 规则与提示词管理界面【界面图·待补真实截图】
- 截图来源:网页端 BossAgents
- 应展示:PLM 规则与提示词管理界面
- 截图保存为
../shots/sc1-3-plm-rules.png后告知我,自动替换为正式图注
6.4 采购管理操作
- 点击哪里:进入“采购管理”模块,点击“导入供应商 BOM”“比对差异”“生成采购协同视图”等操作按钮。
- 看到什么:供应商 BOM 列表、差异比对面板(字段级差异高亮)、以及采购协同视图(供应商、价格、交期、评分)。
- 得到什么结果:完成从外部系统批量导入供应商 BOM、与本地 BOM 比对差异、生成可下发的采购协同视图,支撑采购业务闭环。
#### 图6-4 采购管理界面(供应商 BOM 协同与比对)【界面图·待补真实截图】
- 截图来源:网页端 BossAgents
- 应展示:供应商 BOM 列表、字段级差异比对面板、采购协同视图
- 截图保存为
../shots/sc1-4-procurement.png后告知我,自动替换为正式图注
6.5 规则引擎 API 实时验证
- 点击哪里:通过浏览器、Postman 或
curl访问/api/rule-engine/rules接口(GET)。 - 看到什么:接口实时返回已配置规则清单(实测 76 条),包含规则 ID、名称、作用域、严重级别与启用状态。
- 得到什么结果:证明规则引擎真实运行且数据可追溯,规则库驱动的业务逻辑处于激活状态。
#### 图6-5 规则引擎 API 实时响应数据【界面图·待补真实截图】
- 截图来源:网页端 / Postman
- 应展示:规则引擎 API 实时响应 JSON
- 截图保存为
../shots/sc1-5-api-rule-engine.png后告知我,自动替换为正式图注
6.6 能力状态 API 验证
- 点击哪里:访问
/api/capability/status接口(GET)。 - 看到什么:接口实时返回六大原子能力的启停与负载状态(如 identify / validate / repair / optimize / compare / generate 等)。
- 得到什么结果:验证能力底座可用,调度器可据此将业务任务路由到健康的能力执行。
#### 图6-6 能力状态 API 响应数据【界面图·待补真实截图】
- 截图来源:网页端 / Postman
- 应展示:能力状态 API 响应 JSON
- 截图保存为
../shots/sc1-6-api-capability.png后告知我,自动替换为正式图注
6.7 意图规则 API 验证
- 点击哪里:访问
/api/intent/rules接口(GET)。 - 看到什么:接口返回意图识别规则配置(混合意图识别子系统的规则清单)。
- 得到什么结果:验证混合意图识别子系统在线,自然语言指令可被正确解析并路由到对应能力或智能体。
#### 图6-7 意图规则 API 响应数据【界面图·待补真实截图】
- 截图来源:网页端 / Postman
- 应展示:意图规则 API 响应 JSON
- 截图保存为
../shots/sc1-7-api-intent.png后告知我,自动替换为正式图注
6.8 数字员工健康检查
- 点击哪里:访问
/api/digital-staff/health接口(GET)。 - 看到什么:接口返回健康检查响应(HTTP 200)。
- 得到什么结果:证明数字员工生成平台稳定运行,调度器、能力运行时与依赖服务均处于健康状态。
#### 图6-8 数字员工健康检查响应【界面图·待补真实截图】
- 截图来源:网页端 / Postman
- 应展示:数字员工健康检查响应 JSON
- 截图保存为
../shots/sc1-8-api-health.png后告知我,自动替换为正式图注
6.9 端到端操作闭环与验收要点
以上 6.1–6.8 描述了从登录、浏览智能体剧场、管理规则与提示词、操作采购,到通过四类 API 验证规则引擎、能力状态、意图识别与数字员工健康的完整路径。审查人员可按“登录 → 进入工作台 → 打开规则与提示词管理 → 进入采购管理 → 依次访问四个健康检查接口”的顺序逐屏复现,每步的截图与接口实测响应(HTTP 200、规则 76 条等)即构成软件真实运行的证据链。
验收时应重点关注三点:其一,规则引擎 API 返回的规则数量与“规则与提示词管理”界面统计一致(均为 76 条),说明前后端数据同源;其二,能力状态 API 的各原子能力 enabled 均为 true,说明能力底座可用;其三,意图规则 API 与健康检查接口均返回 HTTP 200,说明混合意图识别子系统与数字员工调度器处于在线状态。三者齐备,即可认定平台核心子系统真实运行、数据可追溯。
七、典型应用场景案例(含真实运行界面)
本平台面向制造企业的产品数据全生命周期,以下为八类典型应用场景,均已在第六章真实运行界面中得到验证,并基于平台真实功能(规则引擎、原子能力、意图识别、数字员工、私有存储、端侧 AI 等协同)展开,未虚构不存在的模块。
7.1 场景一:新零部件 BOM 发布闭环
- 业务背景:研发完成新零部件设计后,需在 PLM 中登记对象、搭建 BOM、经变更审批后发布为受控版本,并关联到设计项目。
- 操作要点:在对象建模中定义 Part 与 BOM 结构,通过 externalBomImportService 或手工搭建 BOM;bomComparisonService 比对历史版本差异;发起变更请求(workflowEngine 审批)后发布为受控版本;bomProjectIntegrationService 在设计中关联任务,agentWorkflowService 自动执行后续同步与通知。
- 预期运行结果:全程数据可追溯、版本可回溯,BOM 与设计项目贯通,减少人工登记与核对工作量。
7.2 场景二:工程变更受控
- 业务背景:设计变更(如材料替换、结构修改)需受控执行,避免未审批修改流入制造环节。
- 操作要点:当设计变更发生时,workflowEngine 以变更请求(ECR)驱动受控的工程更改,记录影响范围、审批签字与版本演进;相关 BOM 与文档自动进入变更影响分析。
- 预期运行结果:变更不遗漏、可追溯,自动形成 ECR→ECO→ECN 的受控流转记录,审计可查。
7.3 场景三:供应商 BOM 协同与比对
- 业务背景:采购部门需将供应商提供的 BOM 与内部 BOM 比对,识别差异并生成采购协同视图。
- 操作要点:externalBomImportService 从外部系统批量导入供应商 BOM;平台提供供应商协同视图进行数据比对与差异处理(采购管理界面见图 6-4)。
- 预期运行结果:降低人工核对成本,保留比对的完整记录供审计,支撑采购协同闭环。
#### 图7-3 采购管理界面(供应商 BOM 协同与比对)【界面图·待补真实截图】
- 截图来源:网页端 BossAgents
- 应展示:供应商 BOM 列表、字段级差异比对面板、采购协同视图
- 截图保存为
../shots/sc1-4-procurement.png后告知我,自动替换为正式图注
7.4 场景四:数字员工自动执行业务任务
- 业务背景:研发、工艺、采购、质量等环节存在大量重复性操作(状态同步、文档生成、风险预警、跨系统同步)。
- 操作要点:projectAgentService 面向研发项目执行智能体任务(状态同步、文档生成、风险预警);crossDomainAgentService 实现跨系统协作(PLM↔MES、内部↔供应商);智能体遵循"规划—执行—校验—回写"闭环(数字员工能力中心见图 6-2)。
- 预期运行结果:显著降低重复性人工操作,让工程师聚焦于高价值判断;数字员工具备自主调度周期与完整审计轨迹。
#### 图7-4 数字员工能力中心【界面图·待补真实截图】
- 截图来源:网页端 BossAgents
- 应展示:数字员工能力中心
- 截图保存为
../shots/sc1-capability-center.png后告知我,自动替换为正式图注
7.5 场景五:知识库与 RAG 智能问答
- 业务背景:工程师在设计 / 变更时常需查阅历史经验、相似件、替代料等知识,传统检索效率低。
- 操作要点:knowledgeService 沉淀产品知识与历史经验,作为检索增强(RAG)的知识源;用户在 AI 工作台以自然语言提问,智能体基于企业真实知识作答,而非泛化猜测。
- 预期运行结果:问答基于企业知识库,答案可溯源;常见咨询类任务由数字员工自动完成,减少专家被打断。
7.6 场景六:工艺规程智能生成
- 业务背景:工艺部门需为不同行业 / 产品快速生成结构化工艺规程,并自动完成数据资产治理。
- 操作要点:在 ProcessSpec Studio(工艺规程智能生成平台)中按行业定义模板,调用大模型生成工艺规程;生成时系统自动触发资产治理——计算质量评分、更新资产估值、记录治理日志(“业务即治理”)。
- 预期运行结果:工艺规程结构化、可复用,并自动沉淀为数据资产(含质量分与估值),缩短工艺准备周期。
7.7 场景七:老旧系统数据资产化改造
- 业务背景:企业存在大量老旧系统的数据(表结构、台账),需低成本对象化、资产化。
- 操作要点:在 DataCollectionView(数据资产管理)中按“连接外部数据库 → 采集元数据 → 生成对象映射 + 数据同步 → 对象化入库”的流程引导改造;数据市场聚合规则、工作流、工业对象、工艺规程等资产并展示质量分与估值。
- 预期运行结果:老旧系统数据被对象化、资产化,形成可治理、可复用的企业数据资产,降低数据孤岛。
7.8 场景八:飞书 / 微信多端协同运营
- 业务背景:管理层与一线人员希望在不切换系统的情况下查询设备、审批变更、发起采购。
- 操作要点:微信小程序提供移动端协同工作台;飞书机器人(feishu-bot)支持在会话中 @机器人 查询库存、比对供应商、生成采购单,并通过卡片按钮完成“确认/取消”的飞书确认闭环;关键操作经 JWT 鉴权与声明校验。
- 预期运行结果:业务操作延伸到 IM 与移动端,审批与查询随手可达,提升协同效率与响应速度。
八、数据接口与集成说明
平台以对象模型为核心抽象,所有业务实体(ItemType)均以元数据方式定义,对象操作经 amlEngineService 翻译为标准 AML(SCSAI Markup Language)XML 并在服务端参数化执行,规避注入风险。AML 引擎支持 GET/ADD/UPDATE/DELETE 及关系遍历,是平台对内对外统一的数据操作语言。
8.1 对外 REST API(实测端点)
系统以 RESTful / Web API 对外提供服务,前端(Vue 3)与微信小程序均通过统一 API 网关访问。以下为真实运行环境(服务端端口 3006)中可验证的核心端点:
| 接口 | 方法 | 说明 | 实测结果 |
|------|------|------|---------|
| /api/rule-engine/rules | GET | 获取已配置规则清单 | 返回 76 条规则(HTTP 200) |
| /api/capability/status | GET | 六大原子能力启停与负载状态 | 返回能力状态(HTTP 200) |
| /api/intent/rules | GET | 意图识别规则配置 | 返回意图规则(HTTP 200) |
| /api/digital-staff/health | GET | 数字员工健康检查 | 返回 200,运行正常 |
上述端点均已在第六章以真实响应截图佐证,证明系统各子系统真实运行、数据可追溯。
8.2 接口请求 / 响应示例与字段说明
以下为每个实测端点补充完整请求示例(curl + JSON)与响应示例(JSON),并附请求参数表与响应字段表。所有示例均基于第八章已登记的真实端点,未编造源码中不存在的端点。
#### 8.2.1 GET /api/rule-engine/rules
请求示例(curl):
``bash
curl -X GET "http://<服务器IP>:3006/api/rule-engine/rules" \
-H "Authorization: Bearer
-H "Accept: application/json"
`
请求参数表:
| 参数 | 位置 | 类型 | 必填 | 说明 |
|------|------|------|------|------|
| Authorization | Header | string | 是 | Bearer + JWT 令牌,由登录后获取 |
| scope | Query | string | 否 | 按作用域过滤(如 item_type 名称) |
| is_active | Query | boolean | 否 | 仅返回启用/停用规则 |
| keyword | Query | string | 否 | 关键词模糊检索规则名称 |
响应示例(JSON):
`json
{
"success": true,
"data": [
{
"id": "RULE-0001",
"name": "零部件必填属性校验",
"scope": "Part",
"severity": "error",
"is_active": true,
"description": "创建 Part 时校验关键属性完整性"
}
],
"total": 76
}
`
响应字段表:
| 字段 | 类型 | 说明 |
|------|------|------|
| success | boolean | 请求是否成功 |
| data[].id | string | 规则唯一标识 |
| data[].name | string | 规则名称 |
| data[].scope | string | 作用域(适用对象类) |
| data[].severity | string | 严重级别(error/warning/info) |
| data[].is_active | boolean | 是否启用 |
| data[].description | string | 规则说明 |
| total | number | 规则总数(实测 76) |
#### 8.2.2 GET /api/capability/status
请求示例(curl):
`bash
curl -X GET "http://<服务器IP>:3006/api/capability/status" \
-H "Authorization: Bearer
-H "Accept: application/json"
`
请求参数表:
| 参数 | 位置 | 类型 | 必填 | 说明 |
|------|------|------|------|------|
| Authorization | Header | string | 是 | Bearer + JWT 令牌 |
| capability | Query | string | 否 | 指定能力(identify/validate/repair/optimize/compare/generate) |
响应示例(JSON):
`json
{
"success": true,
"data": {
"identify": { "enabled": true, "load": 0.12 },
"validate": { "enabled": true, "load": 0.08 },
"repair": { "enabled": true, "load": 0.05 },
"optimize": { "enabled": true, "load": 0.21 },
"compare": { "enabled": true, "load": 0.10 },
"generate": { "enabled": true, "load": 0.18 }
}
}
`
响应字段表:
| 字段 | 类型 | 说明 |
|------|------|------|
| success | boolean | 请求是否成功 |
| data.
| data.
#### 8.2.3 GET /api/intent/rules
请求示例(curl):
`bash
curl -X GET "http://<服务器IP>:3006/api/intent/rules" \
-H "Authorization: Bearer
-H "Accept: application/json"
`
请求参数表:
| 参数 | 位置 | 类型 | 必填 | 说明 |
|------|------|------|------|------|
| Authorization | Header | string | 是 | Bearer + JWT 令牌 |
| category | Query | string | 否 | 按意图类别过滤 |
响应示例(JSON):
`json
{
"success": true,
"data": [
{ "id": "INT-001", "pattern": "加*属性", "target": "optimize_item_types", "priority": 10 }
]
}
`
响应字段表:
| 字段 | 类型 | 说明 |
|------|------|------|
| success | boolean | 请求是否成功 |
| data[].id | string | 意图规则标识 |
| data[].pattern | string | 匹配模式(规则从 DB 加载,替代硬编码关键词) |
| data[].target | string | 命中后路由到的工具 / 能力 |
| data[].priority | number | 优先级 |
#### 8.2.4 GET /api/digital-staff/health
请求示例(curl):
`bash
curl -X GET "http://<服务器IP>:3006/api/digital-staff/health" \
-H "Accept: application/json"
`
请求参数表:
| 参数 | 位置 | 类型 | 必填 | 说明 |
|------|------|------|------|------|
| (无) | — | — | — | 健康检查接口,无需鉴权参数 |
响应示例(JSON):
`json
{
"status": "ok",
"code": 200,
"services": {
"scheduler": "up",
"capabilityRuntime": "up",
"SCSAIClient": "up"
}
}
`
响应字段表:
| 字段 | 类型 | 说明 |
|------|------|------|
| status | string | 总体健康状态(ok) |
| code | number | HTTP 状态码(200) |
| services.scheduler | string | 调度器状态 |
| services.capabilityRuntime | string | 能力运行时状态 |
| services.SCSAIClient | string | SCSAI 客户端状态 |
#### 8.2.5 GET /api/health
该端点由 server/llm-proxy.js 提供,用于快速探活。
请求示例(curl):
`bash
curl -X GET "http://<服务器IP>:3006/api/health" \
-H "Accept: application/json"
`
请求参数表:
| 参数 | 位置 | 类型 | 必填 | 说明 |
|------|------|------|------|------|
| (无) | — | — | — | 探活接口,无需鉴权参数 |
响应示例(JSON):
`json
{
"status": "ok",
"uptime": 123456,
"version": "1.0.0"
}
`
响应字段表:
| 字段 | 类型 | 说明 |
|------|------|------|
| status | string | 总体状态(ok) |
| uptime | number | 进程已运行秒数 |
| version | string | 服务版本号 |
#### 8.2.6 POST /api/llm/chat
该端点由 server/llm-proxy.js 提供,承载 AI 工作台的自然语言对话与智能体调度入口。
请求示例(curl):
`bash
curl -X POST "http://<服务器IP>:3006/api/llm/chat" \
-H "Authorization: Bearer
-H "Content-Type: application/json" \
-d '{"message":"给所有对象类加一个 name 属性","sessionId":"sess-001"}'
`
请求参数表:
| 参数 | 位置 | 类型 | 必填 | 说明 |
|------|------|------|------|------|
| Authorization | Header | string | 是 | Bearer + JWT 令牌 |
| message | Body | string | 是 | 用户自然语言指令 |
| sessionId | Body | string | 否 | 会话标识,用于多轮上下文 |
响应示例(JSON):
`json
{
"success": true,
"reply": "已识别意图 optimize_item_types,正在为各对象类补充 name 属性……",
"sessionId": "sess-001"
}
`
响应字段表:
| 字段 | 类型 | 说明 |
|------|------|------|
| success | boolean | 请求是否成功 |
| reply | string | 智能体回复内容 |
| sessionId | string | 回传的会话标识 |
除上述端点外,平台还登记了大量业务 API(见第九章 9.6 节对外接口清单,包含 /api/workflow 等),均经统一路由与鉴权中间件管理。
8.3 与 SCSAI Agent 集成
平台以 SCSAI Agent 为 PLM 数据底座,通过 SCSAIDataSyncService(周期性/事件触发的数据同步)、SCSAIAIService(AI 能力注入)、plm.service(统一入口)实现双向协同;SCSAIIRecommendationService 基于历史数据提供智能推荐(如替代料、相似件)。集成以配置化方式完成,新增实体仅需登记元数据,降低集成风险。
8.4 实时协同与安全
WebSocket(ws)向前端推送任务进度与数据变更,保证多用户协同实时性;跨服务调用携带 JWT,服务端校验声明后放行;数据访问层统一参数化查询防 SQL 注入,敏感配置脱敏,确保集成安全。
8.5 接口鉴权与统一错误规范
所有业务接口(除 /api/health、/api/digital-staff/health 等探活接口外)均需在请求头携带 Authorization: Bearer ;缺失或无效的令牌将返回 401。业务异常以统一结构返回:{ "success": false, "error": "<信息>", "code": <业务码> },便于前端按 code 做差异化提示。常见业务错误码(400/401/403/404/409/422/429/500/502/503/504)及其处理建议见第十一章 11.2 错误码对照表。探活类接口可用于健康检查与容量观测,不暴露任何密钥或敏感字段。
九、核心功能模块详述与部署运维(含真实运行界面)
9.1 部署准备
- 安装 Node.js 运行时与 MySQL 数据库实例。
- 准备 config.yaml
(数据库连接、SCSAI 服务地址、JWT 密钥等)与.env(环境变量)。 - 获取本平台源代码并安装依赖:npm install
(或pnpm install)。
9.2 配置说明
平台通过 config.yaml 与 .env 进行运行配置,关键项包括:
- SCSAI_SERVER
/SCSAI_DATABASE/SCSAI_USERNAME/SCSAI_PASSWORD:SCSAI 服务端地址、数据库、账号(密码已脱敏为 *)。 - 数据库连接串(MySQL):server / database / user / password(密码脱敏)。
- Jwt.Secret
:JWT 签名密钥;Jwt.ExpirationMinutes:令牌有效期。
`yaml
config.yaml 节选(敏感信息已脱敏)
SCSAI:
server: "http://*/InnovatorServer"
database: "*"
username: "*"
password: "*"
database:
host: "127.0.0.1"
port: 3306
user: "*"
password: "*"
jwt:
secret: "*"
expirationMinutes: 28800
`
9.3 启动服务
主服务默认由 server.js 启动(静态文件服务 + SCSAI API 代理 + 业务 API):
`
npm install
npm run build # 构建前端(Vite)
npm start # node server.js
`
启动成功后访问前端地址查看系统界面。生产环境建议使用 PM2 守护进程并启用反向代理(Nginx)统一暴露、启用 HTTPS。
9.4 代码结构总览
本软件共包含源文件 624 个,源代码 292926 行(物理行数,含空行与注释)。按目录分布如下:
| 目录 | 文件数 | 代码行数 |
|------|------|------|
| MTClaw | 3 | 2914 |
| app | 7 | 993 |
| core | 23 | 8811 |
| frontend | 11 | 24884 |
| server | 391 | 157188 |
| services | 26 | 11682 |
| src | 154 | 84113 |
| utils | 8 | 2256 |
| views | 1 | 85 |
| 合计 | 624 | 292926 |
源码组织遵循清晰的层次化结构:底层为基础设施(配置、工具、数据访问、安全认证),中层为领域服务(业务管理、流程引擎、文件交换、智能体编排),上层为 API 与界面交互。各层通过接口与依赖注入解耦,便于独立测试、替换与水平扩展。
9.5 核心类与模块清单
系统主要导出函数 / 方法(节选前 200 个)如下:
| # | 函数 / 方法 | 源文件 |
|---|------|------|
| 1 | ACTION_MAP | frontend/app-config.js |
| 2 | ALLOW | server/llm-proxy.js |
| 3 | AUTO_TABS | frontend/app-config.js |
| 4 | AiChatPanel | frontend/components.js |
| 5 | BACKEND_MODE | server/tenant-db.js |
| 6 | BrowserHelper | core/GlobalObjectsPatch.js |
| 7 | BrowserInfo | core/GlobalObjectsPatch.js |
| 8 | ClientCache | core/GlobalObjectsPatch.js |
| 9 | Clipboard | core/GlobalObjectsPatch.js |
| 10 | Clipboard_Clear | core/GlobalObjectsPatch.js |
| 11 | Clipboard_Copy | core/GlobalObjectsPatch.js |
| 12 | Clipboard_GetItem | core/GlobalObjectsPatch.js |
| 13 | Clipboard_GetLastCopyCount | core/GlobalObjectsPatch.js |
| 14 | Clipboard_GetLastCopyIndex | core/GlobalObjectsPatch.js |
| 15 | Clipboard_GetLastCopyItem | core/GlobalObjectsPatch.js |
| 16 | Clipboard_GetLastCopyRTName | core/GlobalObjectsPatch.js |
| 17 | Clipboard_GetLastCopyRelatedItemTypeName | core/GlobalObjectsPatch.js |
| 18 | Clipboard_IsEmpty | core/GlobalObjectsPatch.js |
| 19 | Clipboard_Paste | core/GlobalObjectsPatch.js |
| 20 | Clipboard_RemoveItem | core/GlobalObjectsPatch.js |
| 21 | DEFAULT_COLUMNS | frontend/app-config.js |
| 22 | DEFAULT_CUSTOMER_FORM | frontend/app-config.js |
| 23 | DEFAULT_LOGIN_FORM | frontend/app-config.js |
| 24 | DEFAULT_NEW_MODEL_FORM | frontend/app-config.js |
| 25 | DEFAULT_NEW_PRODUCT_FORM | frontend/app-config.js |
| 26 | DEFAULT_ORDER_FORM | frontend/app-config.js |
| 27 | DEFAULT_TENANT | server/tenant-db.js |
| 28 | DEFAULT_VENDOR_FORM | frontend/app-config.js |
| 29 | DIGITAL_STAFF | server/digital-staff/index.js |
| 30 | DIGITAL_STAFF_DEFAULTS | frontend/app-config.js |
| 31 | DynamicForm | frontend/components.js |
| 32 | F | utils/md5.js |
| 33 | FF | utils/md5.js |
| 34 | G | utils/md5.js |
| 35 | GG | utils/md5.js |
| 36 | GOVERNANCE_FIELDS | src/utils/governance.js |
| 37 | GOV_DIM_LABELS | src/utils/governance.js |
| 38 | GOV_DIM_NAMES | src/utils/governance.js |
| 39 | GOV_LABELS | src/utils/governance.js |
| 40 | GUIDManager | core/GlobalObjectsPatch.js |
| 41 | H | utils/md5.js |
| 42 | HH | utils/md5.js |
| 43 | I | utils/md5.js |
| 44 | II | utils/md5.js |
| 45 | ITEMTYPE_COLUMNS | frontend/app-config.js |
| 46 | ITEM_TYPE_ALIASES | frontend/app-config.js |
| 47 | LLM_MODELS | frontend/app-config.js |
| 48 | LOGIN_ROLE_MAP | frontend/app-config.js |
| 49 | LOG_LEVEL | server/routes/ai-inspector.js |
| 50 | MetadataCache | core/GlobalObjectsPatch.js |
| 51 | MethodName | server/routes/methods.js |
| 52 | NAV_GROUP_ICONS | src/constants/navGroups.js |
| 53 | OBJECT_CATEGORIES | src/config/businessObjects.js |
| 54 | ObjectModelerModule | server/routes/capability-pipeline.js |
| 55 | P | frontend/vue.global.prod.js |
| 56 | PHOSPHORUS_DEMO_MODE | server/boss-scheduler/feishu-router.js |
| 57 | PHOSPHORUS_DEMO_MODE | server/feishu-bot.js |
| 58 | PHOSPHORUS_NAV_GROUPS | src/constants/navGroups.js |
| 59 | PROCUREMENT_INTENT_MAP | server/ai-agent.js |
| 60 | PROCUREMENT_TOOLS | server/ai-agent.js |
| 61 | ROLE_PERMISSIONS | frontend/app-config.js |
| 62 | SAMSUNG_DEMO_MODE | server/boss-scheduler/feishu-router.js |
| 63 | SAMSUNG_DEMO_MODE | server/feishu-bot.js |
| 64 | SECRET | server/middleware/auth.js |
| 65 | STAFF_INTENT_RULES | frontend/app-config.js |
| 66 | STAFF_QUICK_COMMANDS | frontend/app-config.js |
| 67 | STATUS_MAP | frontend/app-config.js |
| 68 | Sciot | core/GlobalObjectsPatch.js |
| 69 | Sciot | src/SCSAI-shim.js |
| 70 | SciotCommonProperties | core/GlobalObjectsPatch.js |
| 71 | SmartTable | frontend/components.js |
| 72 | T | server/shared/i18n.js |
| 73 | TimeZoneInfo | core/GlobalObjectsPatch.js |
| 74 | TreeNode | frontend/components.js |
| 75 | VENDOR_STATUS_MAP | frontend/app-config.js |
| 76 | VENDOR_TYPE_MAP | frontend/app-config.js |
| 77 | VIEW_TITLES | frontend/app-config.js |
| 78 | XmlHttpRequestManager | core/GlobalObjectsPatch.js |
| 79 | Y | frontend/vue.global.prod.js |
| 80 | _ | server/tools/procurement-i18n.js |
| 81 | _ai | server/database1.js |
| 82 | _apiGet | server/boss-scheduler/workers/content.js |
| 83 | _apiGet | server/boss-scheduler/workers/doc-worker.js |
| 84 | _apiJson | server/routes/rule-workbench-api.js |
| 85 | _apiPost | server/boss-scheduler/workers/content.js |
| 86 | _apiPost | server/boss-scheduler/workers/doc-worker.js |
| 87 | _applyAML | server/digital-staff/index.js |
| 88 | _backupCorrupt | server/sqlite-compat.js |
| 89 | _buildGeneratePrompt | server/services/data-pipeline.js |
| 90 | _buildPropertyHints | server/services/data-pipeline.js |
| 91 | _cachedCall | server/services/llm-cache.js |
| 92 | _calcDimensionScore | server/scheduler/rule-engines/compare-plans.js |
| 93 | _calculateItemQualityScore | server/services/data-pipeline.js |
| 94 | _calculateQualityDetails | src/views/DataCollectionView.vue |
| 95 | _calculateQualityScore | server/services/data-pipeline.js |
| 96 | _callSCSAIApiOnce | server/routes/ai-inspector.js |
| 97 | _callModel | server/services/llm.js |
| 98 | _checkGuestLimit | server/routes/rule-workbench-api.js |
| 99 | _checkInternalMode | server/boss-scheduler/workers/doc-worker.js |
| 100 | _cleanItem | server/services/anysearch-alibaba-bridge.js |
| 101 | _cleanText | server/services/data-pipeline.js |
| 102 | _clearPoolTimer | server/services/db-metadata-collector.js |
| 103 | _collectMSSQL | server/services/db-metadata-collector.js |
| 104 | _collectMySQL | server/services/db-metadata-collector.js |
| 105 | _collectSQLite | server/services/db-metadata-collector.js |
| 106 | _computeModuleDiff | server/services/chipwise-service.js |
| 107 | _computeTextDiff | server/services/chipwise-service.js |
| 108 | _countedCachedCall | server/services/llm-cache.js |
| 109 | _deprecationWarning | server/routes/doc-agent.js |
| 110 | _doSaveMemoryLogs | server/boss-scheduler/execution-context.js |
| 111 | _doSavePollState | server/feishu-bot.js |
| 112 | _dualDbDedupCheck | src/composables/useCapabilityCreate.js |
| 113 | _emptyMetrics | app/routes/boss.js |
| 114 | _ensureCustomTaskId | server/services/data-pipeline.js |
| 115 | _ensureInit | server/boss-scheduler/index.js |
| 116 | _ensureRuleEngine | server/routes/rule-workbench-api.js |
| 117 | _ensureVueFns | frontend/utils.js |
| 118 | _err | server/routes/digital-staff-routes.js |
| 119 | _escapeXml | server/core/SCSAI-rule-sync.js |
| 120 | _estimateFromPlanStructure | server/scheduler/rule-engines/compare-plans.js |
| 121 | _execCmd | server/services/eda-toolchain.js |
| 122 | _extract | server/digital-staff/smart-llm-bridge.js |
| 123 | _extractAmlItems | src/composables/useCapabilityCreate.js |
| 124 | _extractConfirmResult | server/boss-scheduler/feishu-router.js |
| 125 | _extractLesson | server/digital-staff/correction-learner.js |
| 126 | _extractModuleNames | server/services/chipwise-service.js |
| 127 | _findExistingAsset | server/services/data-pipeline.js |
| 128 | _findTimestampField | server/services/db-metadata-collector.js |
| 129 | _fuzzyMatch | server/boss-scheduler/staff-router.js |
| 130 | _generateDiffReport | server/services/chipwise-service.js |
| 131 | _get | server/shared/db.js |
| 132 | _getSCSAIDataSourceConfig | server/services/db-metadata-collector.js |
| 133 | _getSCSAIDocService | server/routes/doc-agent.js |
| 134 | _getDomainTemplates | server/services/data-pipeline.js |
| 135 | _getEdaToolchain | server/services/chipwise-service.js |
| 136 | _getLLMBrain | server/services/chipwise-service.js |
| 137 | _getLastSyncTime | server/services/db-metadata-collector.js |
| 138 | _getService | server/routes/chipwise-routes.js |
| 139 | _getServices | server/routes/rule-workbench-api.js |
| 140 | _getStatus | server/services/eda-toolchain.js |
| 141 | _getVueUtils | frontend/utils.js |
| 142 | _guessIntent | server/boss-scheduler/workers/auto-loop-worker.js |
| 143 | _handleAsync | server/routes/chipwise-routes.js |
| 144 | _handleBomCompare | server/services/anysearch-alibaba-bridge.js |
| 145 | _handleGenerateDoc | server/routes/capability-api.js |
| 146 | _handleProductSearch | server/services/anysearch-alibaba-bridge.js |
| 147 | _handleSupplierSearch | server/services/anysearch-alibaba-bridge.js |
| 148 | _hasSlot | server/digital-staff/chipwise-handler.js |
| 149 | _hashKey | server/services/llm-cache.js |
| 150 | _inferPropertyType | server/routes/aml.js |
| 151 | _initNewScheduler | server/boss-scheduler/index.js |
| 152 | _initTables | server/services/db-metadata-collector.js |
| 153 | _initTasks | server/services/chipwise-service.js |
| 154 | _invalidateCache | server/config/item-type-registry.js |
| 155 | _json | server/boss-scheduler/staff-router.js |
| 156 | _json | server/routes/auto-loop-api.js |
| 157 | _json | server/routes/digital-staff-routes.js |
| 158 | _jsonErr | server/routes/auto-loop-api.js |
| 159 | _key | src/stores/useDirtyStateStore.js |
| 160 | _lang | server/boss-scheduler/workers/procurement.js |
| 161 | _loadIntentConfig | server/ai-agent.js |
| 162 | _loadProfile | server/boss-scheduler/index.js |
| 163 | _loadTaskStates | server/services/data-pipeline.js |
| 164 | _log | server/boss-scheduler/workers/content.js |
| 165 | _log | server/boss-scheduler/workers/doc-worker.js |
| 166 | _mapFieldName | server/services/db-metadata-collector.js |
| 167 | _memo | frontend/vue.global.prod.js |
| 168 | _mgr | server/boss-scheduler/task-queue.js |
| 169 | _n | server/database1.js |
| 170 | _normalize | server/shared/db.js |
| 171 | _ok | server/routes/digital-staff-routes.js |
| 172 | _openCanonical | server/sqlite-compat.js |
| 173 | _parseBody | app/routes/capability.js |
| 174 | _parseIverilogErrors | server/services/eda-toolchain.js |
| 175 | _parseLLMJson | server/services/data-pipeline.js |
| 176 | _parseModules | server/services/chipwise-service.js |
| 177 | _parseVeribleOutput | server/services/eda-toolchain.js |
| 178 | _parseYosysOutput | server/services/eda-toolchain.js |
| 179 | _processRelsRecursive | src/composables/useCapabilityCreate.js |
| 180 | _readResponse | server/mysql-compat.js |
| 181 | _resolveSCSAIValue | src/utils/SCSAI.js |
| 182 | _retryPublish | server/services/wechat-publish.js |
| 183 | _rowToObject | server/services/db-metadata-collector.js |
| 184 | _runAlignmentCheck | server/boss-scheduler/workers/data-caretaker.js |
| 185 | _runChangeTrack | server/boss-scheduler/workers/doc-worker.js |
| 186 | _runChangeTracking | server/boss-scheduler/workers/ecr-worker.js |
| 187 | _runContentGeneration | server/boss-scheduler/workers/content.js |
| 188 | _runContentPlanning | server/boss-scheduler/workers/content.js |
| 189 | _runContentRefine | server/boss-scheduler/workers/content.js |
| 190 | _runDocChat | server/boss-scheduler/workers/doc-worker.js |
| 191 | _runDocGenerate | server/boss-scheduler/workers/doc-worker.js |
| 192 | _runDocInspect | server/boss-scheduler/workers/doc-worker.js |
| 193 | _runDocQuery | server/boss-scheduler/workers/doc-worker.js |
| 194 | _runMarketingLoop | server/boss-scheduler/workers/content.js |
| 195 | _runRuleInterpret | server/boss-scheduler/workers/doc-worker.js |
| 196 | _safeJsonParse | server/core/rule-engine.js |
| 197 | _safeParseJson | server/core/rule-engine.js |
| 198 | _sanitizeName | server/services/db-metadata-collector.js |
| 199 | _saveMetadata | server/services/db-metadata-collector.js |
| 200 | _saveTaskStates | server/services/data-pipeline.js |
9.6 对外接口(API)清单
系统以 RESTful / Web API 形式提供服务,主要端点如下(节选前 120 个):
| 模块 / 源文件 | HTTP 方法 | 路由 |
|------|------|------|
| server/llm-proxy.js | GET | /api/health |
| server/llm-proxy.js | POST | /api/llm/chat |
| server/routes/workflow.js | GET | / |
| server/routes/workflow.js | POST | / |
| server/routes/workflow.js | PUT | /:id |
| server/routes/workflow.js | DELETE | /:id |
| server/routes/workflow.js | POST | /:id/test |
| MTClaw/function_router/server.py | GET | /health |
| MTClaw/function_router/server.py | GET | /ready |
| MTClaw/function_router/server.py | GET | /v1/models |
| MTClaw/function_router/server.py | GET | /v1/tool_history |
| MTClaw/function_router/server.py | POST | /v1/chat/completions |
9.7 关键源代码文件摘录
为直观说明实现方式,以下摘录各核心源文件的内容(按 45 行分块展示,完整源码见随附《源代码文档》):
#### frontend/app.js(15127 行,摘录前 120 行)
`
/**
- app.js - 主应用逻辑
- 从 index-vue.html 提取的 Vue 应用逻辑和业务逻辑
- 使用 ES Module 导入提取的模块
*/
/ eslint-disable no-undef /
// Vue 兼容:优先检查 Vite 预注入的 window.__VUE_API__,否则从 window.Vue(CDN 加载)解构
const Vue = typeof window !== 'undefined' && window.__VUE_API__ || window.Vue;
if (!Vue) { throw new Error('[app] Vue not loaded - check console for previous errors'); }
const { createApp, ref, reactive, computed, watch, onMounted } = Vue;
import { currentLang, t, toggleLanguage } from './i18n.js';
import {
STATUS_MAP, ACTION_MAP, VENDOR_STATUS_MAP, VENDOR_TYPE_MAP,
ROLE_PERMISSIONS, LOGIN_ROLE_MAP, VIEW_TITLES,
LLM_MODELS, DIGITAL_STAFF_DEFAULTS, STAFF_QUICK_COMMANDS,
STAFF_INTENT_RULES, AUTO_TABS, ITEM_TYPE_ALIASES,
DEFAULT_CUSTOMER_FORM, DEFAULT_ORDER_FORM, DEFAULT_VENDOR_FORM,
DEFAULT_NEW_PRODUCT_FORM, DEFAULT_NEW_MODEL_FORM, DEFAULT_LOGIN_FORM
} from './app-config.js';
import {
formatTimestamp, generateId, debounce, throttle,
escapeXmlText, extractJsonBlock,
objToAmlAdd, objToAmlEdit,
parseAmlToSimplified, formatXmlToString, formatNodeToString,
restoreSimplifiedToAml, buildAmlFromSimplified,
transformBomTree, appNextTick, walkBomTree,
normalizeIdentifyItemType, validateBySchema,
globalLoading, globalLoadingText, notifications,
showLoading, hideLoading, showNotification, showSuccess, showError, showWarning,
confirmDialogVisible, confirmDialogConfig, showConfirm, confirmAction, cancelConfirm,
getStatusLabel, getStatusClass, getActionLabel,
vendorStatusLabel, vendorStatusClass, vendorTypeLabel, vendorGradeClass,
customerStatusClass, customerLevelClass, orderStatusClass,
cacheStats
} from './utils.js';
import { TreeNode } from './components.js';
import { reportAuditLog } from './api.js';
// ===== 对象类创建规则配置 =====
// [P0 FIX] 删除 item-type-creation-rules.json 依赖,改用 sciot_import.db 实时查询
let sciotPrompts = null; // 从 API 加载的所有对象类描述
let typeTemplateCache = new Map(); // 对象类模板缓存
async function loadCreationConfig() {
`
`
// 从 API 加载提示词(统一从数据库读取,避免双源不同步)
try {
const res = await fetch('/api/aml/sciot/prompts');
if (res.ok) {
const json = await res.json();
const prompts = json?.data?.prompts || [];
// 转换为 { item_type_name: system_prompt } 格式,兼容老代码
sciotPrompts = {};
for (const p of prompts) {
sciotPrompts[p.item_type_name] = p.system_prompt || p.user_prompt_template || '';
}
console.log('[loadCreationConfig] Prompt字典加载成功:', Object.keys(sciotPrompts).length, '个对象类');
}
} catch (e) {
console.warn('[loadCreationConfig] Prompt字典加载失败:', e.message);
}
}
// 获取对象类的 Prompt 描述(从 API 加载的数据)
function getItemTypePrompt(itemTypeName) {
if (!sciotPrompts) return null;
return sciotPrompts[itemTypeName] || null;
}
// 获取对象类完整模板(从后端API,含缓存)
async function getItemTypeTemplate(itemTypeName) {
if (typeTemplateCache.has(itemTypeName)) {
return typeTemplateCache.get(itemTypeName);
}
try {
const res = await fetch(/api/sciot/type-template/${encodeURIComponent(itemTypeName)});
if (!res.ok) {
console.warn([getItemTypeTemplate] 获取模板失败: ${itemTypeName});
return null;
}
const template = await res.json();
typeTemplateCache.set(itemTypeName, template);
return template;
} catch (e) {
console.warn([getItemTypeTemplate] 获取模板异常: ${itemTypeName}, e.message);
return null;
}
}
// 获取对象类所有list字段的值
`
`
async function getItemTypeListValues(itemTypeName) {
try {
const res = await fetch(/api/sciot/type-list-values/${encodeURIComponent(itemTypeName)});
if (!res.ok) return {};
const data = await res.json();
return data.list_fields || {};
} catch (e) {
console.warn([getItemTypeListValues] 获取失败: ${itemTypeName}, e.message);
return {};
}
}
// 根据schema处理字段值(不再依赖creation-rules.json)
function processFieldValueBySchema(fieldName, value, propDef) {
if (value === undefined || value === null) return null;
const dataType = propDef?.data_type || propDef?.type || 'string';
// 处理 list 类型:数组转字符串(取第一个元素)
if (dataType === 'list' || Array.isArray(value)) {
if (Array.isArray(value)) {
// 如果list有预定义值,验证并取第一个有效值
const validValues = propDef?.list_values?.map(v => v.value) || [];
if (validValues.length > 0) {
const firstValid = value.find(v => validValues.includes(v));
return firstValid || validValues[0] || '';
}
return value[0] || '';
}
// 如果有 listValueMap,检查值是否为 label,需要反向映射为 value
`
#### frontend/i18n.js(7550 行,摘录前 120 行)
`
/**
- i18n.js - 国际化模块(统一版)
*
- 架构说明:
- - 本模块是 i18n 的唯一权威来源
- - Pinia store (src/stores/app.js) 通过 initLangBridge() 桥接
- - 所有 Vue 组件通过 import { t } from 'frontend/i18n' 使用翻译
- - localStorage key 统一为 bossagents_language
*
- 支持语言:zh-CN, en-US, ja-JP, ko-KR
*/
import phosphorusDemoZh from '../src/i18n/phosphorus-demo-zh';
import { samsungDemoEn } from '../src/i18n/samsung-demo-en';
// ===== 常量 =====
const STORAGE_KEY = 'bossagents_language';
const SUPPORTED_LANGUAGES = [
{ code: 'zh-CN', name: '中文', shortName: '中文', flag: '🇨🇳' },
{ code: 'en-US', name: 'English', shortName: 'EN', flag: '🇺🇸' },
{ code: 'ja-JP', name: '日本語', shortName: '日本語', flag: '🇯🇵' },
{ code: 'ko-KR', name: '한국어', shortName: '한국어', flag: '🇰🇷' },
];
// ===== 内部语言状态(模块级) =====
let _currentLang = 'zh-CN';
let _onChangeCallbacks = [];
// Pinia bridge: store ref 注入
let _piniaRef = null;
export function bindPiniaLangRef(ref) {
_piniaRef = ref;
_currentLang = ref.value;
}
// ===== 语言检测 =====
function detectBrowserLang() {
// 优先读 localStorage
const stored = localStorage.getItem(STORAGE_KEY);
if (stored && SUPPORTED_LANGUAGES.some(l => l.code === stored)) return stored;
// 旧 key 兼容迁移
const legacy = localStorage.getItem('bom-lang');
if (legacy && SUPPORTED_LANGUAGES.some(l => l.code === legacy)) {
localStorage.setItem(STORAGE_KEY, legacy);
`
`
localStorage.removeItem('bom-lang');
return legacy;
}
// 浏览器语言
const browserLang = (navigator.language || navigator.userLanguage || 'en-US').toLowerCase();
if (browserLang.startsWith('zh')) return 'zh-CN';
if (browserLang.startsWith('ja')) return 'ja-JP';
if (browserLang.startsWith('ko')) return 'ko-KR';
return 'en-US';
}
// ===== 公开 API =====
export function getSupportedLanguages() { return SUPPORTED_LANGUAGES; }
export function getCurrentLanguage() { return _currentLang; }
export function setLanguage(langCode) {
if (!SUPPORTED_LANGUAGES.some(l => l.code === langCode)) {
console.warn([i18n] Unsupported language: ${langCode});
return;
}
_currentLang = langCode;
localStorage.setItem(STORAGE_KEY, langCode);
if (_piniaRef) _piniaRef.value = langCode;
_onChangeCallbacks.forEach(cb => cb(langCode));
console.log(🌐 Language switched to: ${langCode});
}
export function toggleLanguage() {
const idx = SUPPORTED_LANGUAGES.findIndex(l => l.code === _currentLang);
const next = SUPPORTED_LANGUAGES[(idx + 1) % SUPPORTED_LANGUAGES.length];
setLanguage(next.code);
}
export function onLanguageChange(callback) {
_onChangeCallbacks.push(callback);
return () => { _onChangeCallbacks = _onChangeCallbacks.filter(cb => cb !== callback); };
}
// 向后兼容 proxy
export const currentLang = {
get value() { return _currentLang; },
set value(v) { setLanguage(v); }
};
`
`
// ===== 翻译字典 =====
export const i18nMessages = {
'zh-CN': {
// ── 登录 / 注册 ──
login_title: '左帮右臂-老板私有智能体',
login_subtitle: '左帮右臂 - BossPrive AI Agent',
login_email: '邮箱',
login_email_ph: '请输入邮箱',
login_password: '密码',
login_password_ph: '请输入密码',
login_btn: '登 录',
login_register_link: '注册新企业',
login_connect: '连接到 SCSAI PLM',
register_title: '注册新企业',
register_enterprise_name: '企业名称',
register_enterprise_name_ph: '输入企业名称',
register_admin_email: '管理员邮箱',
register_admin_email_ph: '输入管理员邮箱',
register_password: '密码',
register_password_ph: '设置管理员密码',
register_code: '验证码',
register_code_ph: '输入验证码',
register_send_code: '发送验证码',
register_btn: '注册并登录',
register_login_link: '已有账号?去登录',
// ── 状态 ──
status_connected: '已连接至',
status_not_connected: '未连接',
`
#### server/routes/aml.js(7126 行,摘录前 120 行)
`
/**
- AML(对象类管理)路由模块
*
- 提供 AML 模板的 CRUD、验证、比对、修复、导入、统计、AI生成等 12 个 API。
- 数据库层基于 better-sqlite3,自动建表。
- SCSAI 连接工具用于从 SCSAI 获取真实数据(降级到本地)。
*/
const crypto = require('crypto');
const path = require('path');
const fs = require('fs');
const http = require('http');
// [P2] 模块化路由导入
const { handleItemTypeRoutes } = require('./itemtype.router');
const { handleImportExportRoutes } = require('./import-export.router');
const { handleAIAnalyzerRoutes } = require('./ai-analyzer.router');
const { handleMetaModelRoutes } = require('./meta-model.router');
const { handleBusinessSystemRoutes } = require('./business-system.router');
const { handleUnifiedAMLRoutes } = require('./unified-aml');
const { handleRuleEngine } = require('./rule-engine');
const { FeedbackAnalyzer } = require('../services/feedback-engine');
const { EvolutionScheduler } = require('../services/evolution-scheduler');
// rule-engine-core.js removed: prompt_templates table used instead
// 内联组装路由 (使用主模块的 getSciotDb)
async function handleAssembleRoutes(req, res, pathname, query, bodyStr) {
const success = (data) => { res.writeHead(200, { 'Content-Type': 'application/json; charset=UTF-8' }); res.end(JSON.stringify({ success: true, data })); };
const error = (msg, code = 400) => { res.writeHead(code, { 'Content-Type': 'application/json; charset=UTF-8' }); res.end(JSON.stringify({ success: false, error: msg })); };
try {
if (pathname === '/api/aml/assemble' && req.method === 'POST') {
const body = JSON.parse(bodyStr || '{}');
if (!body.llm_output) { error('缺少llm_output参数'); return true; }
if (!body.item_type_name) { error('缺少item_type_name参数'); return true; }
const sciotDb = getSciotDb();
if (!sciotDb) { error('数据库不可用', 500); return true; }
const assembler = require('../aml-assembler');
const result = assembler.assembleAML(body.llm_output, body.item_type_name, sciotDb, body.options || {});
success(result);
return true;
}
if (pathname === '/api/aml/assemble/validate' && req.method === 'POST') {
const body = JSON.parse(bodyStr || '{}');
if (!body.aml) { error('缺少aml参数'); return true; }
if (!body.item_type_name) { error('缺少item_type_name参数'); return true; }
const sciotDb = getSciotDb();
`
`
if (!sciotDb) { error('数据库不可用', 500); return true; }
const assembler = require('../aml-assembler');
const parsed = assembler.parseLLMOutput(body.aml);
const tpl = sciotDb.prepare('SELECT * FROM sciot_templates WHERE item_type_name = ?').get(body.item_type_name);
const merged = assembler.mergeWithTemplate(parsed, tpl || { item_type_name: body.item_type_name, required_fields: '[]', optional_fields: '[]' });
merged.itemType = body.item_type_name;
const validation = assembler.validateWithRules(merged, sciotDb);
success({ valid: validation.valid, format: parsed.format, errors: validation.errors, warnings: validation.warnings, stats: { passed: validation.passed, failed: validation.failed } });
return true;
}
const tplMatch = pathname.match(/^\/api\/aml\/assemble\/templates\/([^/]+)$/);
if (tplMatch && req.method === 'GET') {
const name = decodeURIComponent(tplMatch[1]);
console.log('[assemble] GET templates for:', name);
const sciotDb = getSciotDb();
if (!sciotDb) { console.log('[assemble] no db'); error('数据库不可用', 500); return true; }
console.log('[assemble] db OK');
const tpl = sciotDb.prepare('SELECT * FROM sciot_templates WHERE item_type_name = ?').get(name);
console.log('[assemble] tpl:', !!tpl);
if (tpl) {
success({ item_type_name: name, has_template: true, ...tpl,
required_fields: JSON.parse(tpl.required_fields || '[]'),
optional_fields: JSON.parse(tpl.optional_fields || '[]'),
relationship_types: JSON.parse(tpl.relationship_types || '[]'),
});
} else {
const props = sciotDb.prepare('SELECT name, label, data_type, is_required FROM sciot_properties WHERE item_type_name = ? ORDER BY name').all(name);
success({ item_type_name: name, has_template: false, properties: props });
}
return true;
}
} catch(e) { error('组装错误: ' + e.message, 500); return true; }
return false;
}
// [P0] 获取 Sciot 部件数据
async function handleSciotPartsRoutes(req, res, pathname, query, bodyStr) {
const cachedBody = bodyStr || null;
const success = (data) => {
res.writeHead(200, { 'Content-Type': 'application/json; charset=UTF-8' });
res.end(JSON.stringify(data));
};
const error = (msg, code = 400) => {
res.writeHead(code, { 'Content-Type': 'application/json; charset=UTF-8' });
res.end(JSON.stringify({ success: false, error: msg }));
`
`
};
try {
if (pathname === '/api/sciot/parts' && req.method === 'GET') {
const sciotDb = getSciotDb();
if (!sciotDb) return error('数据库不可用', 500);
let parts = [];
try {
parts = sciotDb.prepare('SELECT * FROM sciot_parts LIMIT 100').all();
} catch (e) {
console.warn('[AML] sciot_parts 表不存在,返回模拟数据');
parts = [
{ id: 'P001', item_number: '1000-001', name: '主控制器', classification: 'Electronic', state: 'Released', created_on: '2024-01-01' },
{ id: 'P002', item_number: '2000-042', name: '电源模块', classification: 'Power', state: 'In Work', created_on: '2024-02-15' },
{ id: 'P003', item_number: '3000-115', name: '传感器 A', classification: 'Sensor', state: 'Released', created_on: '2024-03-20' }
];
}
return success({ success: true, data: parts });
}
} catch (e) {
return error('获取部件错误: ' + e.message, 500);
}
return false;
}
// ========== 使用统一数据库 ==========
let db = null;
try {
`
#### src/views/StaffCapabilities.vue(4986 行,摘录前 120 行)
`
🤖 数字员工能力中心
基于大模型的通用业务对象处理平台
使用新 API:
{{ useNewAPI ? '开启(新 API)' : '关闭(旧实现)' }}
📋 业务对象
{{ filteredObjects.length }} 个
`
`
v-for="obj in filteredObjects"
:key="obj.name"
class="object-card"
:class="{ active: selectedItemType === obj.name }"
@click="selectObjectType(obj.name)"
>
{{ OBJECT_CATEGORIES[obj.category]?.icon || '📁' }}
{{ obj.label }}
核心
v-for="cap in allCapabilities" :key="cap.id" class="cap-dot" :class="{ supported: obj.capabilities.includes(cap.id) }" :title="cap.label" >{{ cap.icon }}
`
`
📋 实例列表 ({{ objectList.length }})
`
#### src/views/RulesAndTemplates.vue(3514 行,摘录前 120 行)
`
📐 规则与模板
规则引擎、提示词管理与模板库
📊 系统总览
`
`
对象类覆盖情况
(点击行查看详情)
| 对象类 | 模板 | LLM | 自动 | 规则 | 提示词 | 状态 |
|---|---|---|---|---|---|---|
| {{ c.name }} | {{ c.hasTemplate ? '✔' : '✘' }} | {{ c.tmplInfo?.llm ?? '-' }} | {{ c.tmplInfo?.auto ?? '-' }} | {{ c.ruleCount }} | ✔ ✘ | ` ` 完整 部分 未配 |
{{ sysSelectedType.name }}
{{ sysSelectedType.hasTemplate&&sysSelectedType.hasRules&&sysSelectedType.hasPrompts?'已配齐':'未配齐' }}
📄 模板字段
(LLM:{{ sysSelectedType.tmplInfo.llm }} 自动:{{ sysSelectedType.tmplInfo.auto }} 必填:{{ sysSelectedType.tmplInfo.required }})
(未配置)
🤖 {{ getFieldName(sysSelectedType.name, i) || i }}
`
#### server/core/rule-engine.js(3491 行,摘录前 120 行)
`
/**
- 统一规则引擎 (Unified Rule Engine) v3.0
*
- 功能:驱动对象识别、创建、修复、优化、比对等所有业务功能
- 特点:
- 1. 规则存储在数据库,可管理优化
- 2. 支持从AML文件生成规则
- 3. 支持从SCSAI原生获取规则
- 4. 支持手工维护规则
- 5. 多级缓存保证性能
- 6. 规则工厂模式:从sciot_properties自动生成所有ItemType规则(全覆盖)
*/
// 容错 JSON 解析:tags 字段可能是 JSON 数组字符串或逗号分隔文本
function _safeJsonParse(val, fallback = []) {
if (!val) return fallback;
try { return JSON.parse(val); }
catch { return String(val).split(',').filter(Boolean); }
}
function _safeParseJson(val, fallback = {}) {
if (val === null || val === undefined || val === '') return fallback;
if (typeof val !== 'string') return val;
try {
const parsed = JSON.parse(val);
// 双重编码兼容:DB 中 condition/action_config 被 JSON.stringify 两次,
// 解析后仍是字符串则再解一层,确保得到真正的对象
if (typeof parsed === 'string') {
try { return JSON.parse(parsed); } catch { return parsed; }
}
return parsed;
} catch { return fallback; }
}
const path = require('path');
const fs = require('fs');
const vm = require('vm');
// 安全的脚本执行上下文 - 限制全局访问
function createSafeContext() {
return {
console: { log: () => {}, error: () => {}, warn: () => {} },
Math: Math,
Date: Date,
JSON: JSON,
`
`
Array: Array,
Object: Object,
String: String,
Number: Number,
Boolean: Boolean,
parseInt: parseInt,
parseFloat: parseFloat,
isNaN: isNaN,
isFinite: isFinite,
encodeURI: encodeURI,
encodeURIComponent: encodeURIComponent,
decodeURI: decodeURI,
decodeURIComponent: decodeURIComponent,
escape: escape,
unescape: unescape,
undefined: undefined,
NaN: NaN,
Infinity: Infinity,
};
}
// 安全执行用户脚本
function runSafeScript(script, args, logger) {
try {
const context = vm.createContext(createSafeContext());
const fn = new vm.Script('(' + script + ')').runInContext(context);
if (typeof fn !== 'function') {
throw new Error('脚本必须返回一个函数');
}
return fn.apply(null, args);
} catch (e) {
if (logger) logger.error('[RuleEngine] 脚本执行失败:', e);
throw e;
}
}
// ==================== 规则缓存管理 ====================
class RuleCache {
constructor(options = {}) {
this.ttl = options.ttl || 5 60 1000;
this.maxSize = options.maxSize || 1000;
this.cache = new Map();
this.stats = { hits: 0, misses: 0, evictions: 0 };
}
`
`
get(key) {
const item = this.cache.get(key);
if (!item) { this.stats.misses++; return null; }
if (Date.now() > item.expiry) { this.cache.delete(key); this.stats.evictions++; return null; }
this.stats.hits++;
item.lastAccess = Date.now();
return item.value;
}
set(key, value, ttl = this.ttl) {
if (this.cache.size >= this.maxSize) this._evictLRU();
this.cache.set(key, { value, expiry: Date.now() + ttl, lastAccess: Date.now() });
}
invalidate(key) { this.cache.delete(key); }
invalidatePattern(pattern) {
for (const key of this.cache.keys()) { if (pattern.test(key)) this.cache.delete(key); }
}
clear() { this.cache.clear(); this.stats = { hits: 0, misses: 0, evictions: 0 }; }
_evictLRU() {
let oldest = null, oldestKey = null;
for (const [key, item] of this.cache) {
if (!oldest || item.lastAccess < oldest) { oldest = item.lastAccess; oldestKey = key; }
}
if (oldestKey) { this.cache.delete(oldestKey); this.stats.evictions++; }
}
`
#### src/views/DigitalStaff.vue(3262 行,摘录前 120 行)
`
{{ t('staff_title') }}
{{ t('staff_subtitle') }}
{{ staff.statusText }}
{{ staff.isRunning ? t('staff_running') : t('staff_run') }}
`
`
{{ selectedStaff.avatar }}
{{ getStaffNameLabel(selectedStaff) }}
{{ selectedStaff._enabled ? t('staff_enabled') : t('staff_disabled') }}
{{ t('staff_basic_info') }}
{{ selectedStaff.schedule || t('staff_not_set') }}{{ t('staff_execution') }}
{{ t('staff_asset_contribution') || '资产贡献' }}
{{ staffContributionTotal.qualityTotal > 0 ? +${staffContributionTotal.qualityTotal}分质量 : '' }}{{ staffContributionTotal.qualityTotal !== 0 && staffContributionTotal.valueTotal !== 0 ? ' / ' : '' }}{{ staffContributionTotal.valueTotal > 0 ? +¥${staffContributionTotal.valueTotal} : '' }}
`
`
{{ t('staff_skills') }}
{{ skill }}
{{ t('staff_recent_tasks') }}
{{ t('staff_reports') }}
`
#### src/views/AiWorkbench.vue(3260 行,摘录前 120 行)
`
{{ t('ai_title') }}
{{ t('ai_ai_assistant') }}
{{ staffOnline }} {{ t('ai_staff_online') }}
{{ summonPanel.banner?.title || summonPanel.staff.name }}
{{ summonPanel.banner.desc }}
{{ step }}
`
#### server/ai-agent.js(3098 行,摘录前 120 行)
`
/**
- ========================================
- AI 操作代理核心模块
- ========================================
*
- 用户用自然语言描述意图,LLM 理解后通过 function calling 调用系统 API 执行操作。
*
- 核心流程:
- 用户说:"给所有对象类加一个 name 属性"
- → LLM 理解意图
- → 调用 optimize_item_types 工具
- → 执行数据库操作
- → 返回结果
*/
const LLMBrain = require('./digital-staff/llm-brain');
const SCSAITools = require('./utils/SCSAI-tools');
const alibaba1688 = require('./services/alibaba-1688-service');
const { SCSAIClient } = require('./utils/SCSAI-client');
// ======================================================
// 意图识别引擎(v2)—— 规则从 DB 加载,代替硬编码关键词
// ======================================================
const { getIntentEngine } = require('./routes/intent');
let _intentEngine = null;
function getIntentEngineInstance(db) {
if (!_intentEngine) {
// 首次调用时懒初始化(db 可能还未就绪)
_intentEngine = getIntentEngine(db || null);
}
return _intentEngine;
}
// ======================================================
// 异步工作流状态存储(支持前端轮询)
// ======================================================
const _workflowStates = new Map(); // workflowId -> { status, steps, result, createdAt, updatedAt }
function getWorkflowState(id) { return _workflowStates.get(id) || null; }
function setWorkflowState(id, state) { _workflowStates.set(id, { ...state, updatedAt: Date.now() }); }
// 清理超过2小时的旧数据
setInterval(() => {
const now = Date.now();
for (const [id, s] of _workflowStates) {
if (now - (s.createdAt || 0) > 7200000) _workflowStates.delete(id);
}
`
`
}, 600000);
// SCSAI 客户端(从环境变量读取配置,与 digital-staff/index.js 一致)
let _SCSAIClient = null;
function getSCSAIClient() {
if (!_SCSAIClient) {
_SCSAIClient = new SCSAIClient({
serverUrl: process.env.SCSAI_SERVER,
database: process.env.SCSAI_DATABASE || 'SCPLM',
username: process.env.SCSAI_USERNAME,
password: process.env.SCSAI_PASSWORD,
});
}
return _SCSAIClient;
}
// LLMBrain 单例缓存,避免多次实例化带来的副作用
function getBrain() {
return LLMBrain.getGlobalInstance();
}
function resetBrain() {
LLMBrain.resetGlobalInstance();
console.log('[AI-Agent] LLMBrain 全局单例已重置,下次调用将重新加载配置');
}
// ========== CapabilityRuntime 集成 ==========
const CapabilityRuntime = require('./core/capability-runtime');
let _capabilityRuntime = null;
function getCapabilityRuntime() {
if (!_capabilityRuntime) {
const client = getSCSAIClient();
_capabilityRuntime = new CapabilityRuntime({
SCSAIClient: client,
// 关键:挂载 applyAMLFn,规则引擎通过它提交 AML 到 SCSAI
applyAML: async (aml) => {
const result = await client.sendAML(aml);
return result;
},
debug: true
});
}
return _capabilityRuntime;
}
/**
`
`
- 执行能力调用
- @param {Object} step - { capability, item_type, params }
*/
async function executeCapabilityCall(step) {
const { capability, item_type, params = {} } = step;
const runtime = getCapabilityRuntime();
console.log([AI-Agent] 执行能力: ${capability}(${item_type}), params);
try {
const context = { item_type, ...params };
const result = await runtimecapability;
return {
success: result.success !== false,
result,
message: result.message || ${capability} ${item_type} 完成
};
} catch (e) {
console.error([AI-Agent] 能力执行失败:, e.message);
return {
success: false,
error: e.message,
message: sharedI18n.T('agent_op_failed') + ': ' + e.message
};
}
}
/**
- 执行多步骤计划
`
#### src/views/ItemTypeManagement.vue(2955 行,摘录前 120 行)
`
🧬 {{ t('item_type_title') }}
{{ t('item_type_subtitle') }}
⭐ {{ t('item_type_business') }}
⚙ {{ t('item_type_system') }}
📋 全部
🔍 巡检结果
扫描类型: {{ patrolResult.totalScanned || patrolResult.totalTypes || 0 }}
健康分布:
{{ g }}: {{ (patrolResult.gradeDistribution || patrolResult.distribution)?.[g] || 0 }}
{{ lt.name }} ({{ lt.label || '' }})
{{ lt.score }}分 ({{ lt.grade }})
`
`
class="form-input itm-search-input"
type="text"
placeholder="搜索对象类..."
v-model="itemtypeSearchTerm"
@input="onSearchInput"
/>
`
#### src/views/DataCollectionView.vue(2927 行,摘录前 120 行)
`
第一阶 · 数据对象化
数据资产管理
{{ tab.label }}
1
连接外部数据库
→
2
采集元数据(表结构)
→
3
生成对象映射 + 数据同步
→
4
对象化入库,资产化
规则: {{ assetStats.rule }} 条
工作流: {{ assetStats.workflow }} 条
工业对象: {{ assetStats.SCSAI }} 条
工艺规程: {{ assetStats.process_spec }} 条
来源: {{ assetSourceInfo[filterCategory] || '多数据源聚合' }}
{{ emptyMessage }}
{{ emptyHint }}
{{ a.name || a.title || a.item_number || a.id }}
{{ a.statusLabel || a.status || '待治理' }}
`
`
`
#### server/digital-staff/index.js(2713 行,摘录前 120 行)
`
/**
- ========================================
- 数字员工核心调度器
- ========================================
*
- 我们不是做Demo!这是能真正自主干活的数字员工:
*
- 🤖 小智-ECR审核员:每15分钟扫描待审批ECR,LLM智能初审
- 🤖 小智-供应商管家:每30分钟扫描供应商,AI质量诊断
- 🤖 小智-成本优化师:每天凌晨扫描BOM成本,深度优化分析
- 🤖 小智-数据书记员:每小时同步SCSAI数据到本地缓存
*
- 每个数字员工都有:
- - 独立的工号、职责描述
- - 自主的工作调度周期
- - LLM驱动的智能决策大脑
- - 完整的操作日志和审计轨迹
- - 异常时升级人类处理的闭环机制
*/
const cron = require('node-cron');
const path = require('path');
const fs = require('fs');
const { AsyncLocalStorage } = require('async_hooks');
const LLMBrain = require('./llm-brain');
const taskBoard = require('./task-board');
const llmBrain = LLMBrain.getGlobalInstance();
// 初始化能力 SDK(规则引擎优先,LLM 降级)
const { CapabilityRuntime } = require('../core/capability-runtime');
const { getSharedClient } = require('../utils/SCSAI-client');
// 惰性初始化:避免模块加载时立即连接 SCSAI(可能尚未就绪)
let _SCSAIClient = null;
let _capability = null;
`
`
function getSCSAIClient() {
if (!_SCSAIClient) {
_SCSAIClient = getSharedClient(30000);
}
return _SCSAIClient;
}
const _applyAML = async (aml) => {
const result = await getSCSAIClient().sendAML(aml);
if (!result.success) throw new Error('SCSAI 提交失败: ' + (result.error || '未知错误'));
return result;
};
function getCapability() {
if (!_capability) {
_capability = new CapabilityRuntime({
llmBrain,
SCSAIClient: getSCSAIClient(), // ★ 传入 SCSAIClient 实例
applyAML: _applyAML,
debug: true
});
}
return _capability;
}
// 加载数据
const VENDOR_DATA_FILE = path.join(__dirname, '../data/vendors.json');
const ECR_DATA_FILE = path.join(__dirname, '../data/ecrs.json');
const STAFF_LOG_FILE = path.join(__dirname, '../data/digital-staff-logs.json');
const STAFF_CONFIG_FILE = path.join(__dirname, '../data/digital-staff-config.json');
// 确保数据目录存在
const dataDir = path.join(__dirname, '../data');
if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir, { recursive: true });
// 初始化数字员工配置表(Phase 1: 建表)
// 延迟初始化:不在模块加载时建表,改为第一次真正使用时再建表
const _staffManager = (() => {
try { return require('./staff-manager'); } catch (e) { return null; }
})();
let _tablesEnsured = false;
function ensureTablesOnce() {
if (_tablesEnsured || !_staffManager) return;
try { _staffManager.ensureTables(); _tablesEnsured = true; } catch (e) { console.warn('[digital-staff] 延迟建表失败:', e.message); }
}
function loadData(filepath, defaultValue) {
try {
if (fs.existsSync(filepath)) {
const content = fs.readFileSync(filepath, 'utf8').trim();
if (!content) return defaultValue;
return JSON.parse(content);
}
`
`
}
catch (e) {
console.warn('加载数据失败:', filepath, e.message);
// JSON 损坏时备份并重建
try {
const backup = filepath + '.bak.' + Date.now();
fs.renameSync(filepath, backup);
console.warn('已备份损坏文件到:', backup);
} catch (_) {}
}
return defaultValue;
}
function saveData(filepath, data) {
try {
const dir = path.dirname(filepath);
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
const tmp = filepath + '.tmp.' + process.pid;
fs.writeFileSync(tmp, JSON.stringify(data, null, 2), 'utf8');
fs.renameSync(tmp, filepath);
} catch (e) {
console.warn('[digital-staff] 保存失败:', filepath, e.message);
}
}
let vendors = loadData(VENDOR_DATA_FILE, []);
let ecrs = loadData(ECR_DATA_FILE, []);
let staffLogs = loadData(STAFF_LOG_FILE, []);
// SSE 客户端管理:存储每个 staffId 对应的 SSE 响应对象
`
#### src/views/ProcessSpecStudio.vue(2613 行,摘录前 120 行)
`
第三阶 · 业务即治理
🧪 工艺规程智能生成平台
ProcessSpec Studio — 模板定义 · LLM生成 · 结构化输出 · 数据资产样本
📊 查看数据资产看板
行业领域
{{ ind.templateCount || 0 }} 模板
`
`
工艺规程模板
预置字段库 点击字段可复制到新模板
{{ f.field_label }}
{{ f.field_type }}
{{ f.group_name }}
当前行业: {{ selectedIndustry.icon }} {{ selectedIndustry.name }}
{{ tpl.name }}
{{ tpl.status }}
`
`
模板字段: {{ selectedTemplate.name }}
字段标识显示名类型分组必填数据源
{{ f.field_key }}
{{ f.field_label }}
{{ f.field_type }}
{{ f.group_name || '-' }}
{{ f.is_required ? '✅' : '-' }}
{{ f.source_type || 'manual' }}
`
#### MTClaw/function_router/server.py(2437 行,摘录前 120 行)
`
"""Function Router service.
This module implements a FastAPI service that accepts OpenAI-compatible
/v1/chat/completions requests, uses a local Qwen model to detect tool calls
for system control actions, executes those actions via local shell scripts, and
falls back to transparently proxying requests to an upstream model provider.
"""
from __future__ import annotations
import argparse
import asyncio
import json
import logging
import os
import random
import re
import sys
import threading
import time
import uuid
from collections import deque
from dataclasses import dataclass, field
from datetime import datetime, timezone
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Any, Callable
import httpx
import uvicorn
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse, StreamingResponse
try:
from .builtin_tools import execute_builtin_tool, get_builtin_tools, is_builtin_tool
except ImportError: # pragma: no cover - direct script execution fallback
from builtin_tools import execute_builtin_tool, get_builtin_tools, is_builtin_tool
#SYSTEM_PROMPT = (
"You are a system and filesystem assistant. Use the provided tools to handle "
"user requests about system settings, wallpaper, volume, brightness, file "
"search, directory listing, file reading, text search, and short waits. If a "
"user request does not match any available tool, respond with a brief text "
"saying you cannot handle it. Always respond in the same language as the user."
`
`
#)
#SYSTEM_PROMPT = (
"You are a system and filesystem assistant. Use the provided tools to handle "
"user requests about system settings, wallpaper, volume, brightness, file "
"search, directory listing, file reading, text search, and short waits. If a "
"user request does not match any available tool, respond with a brief text "
"saying you cannot handle it. Always respond in the same language as the user."
#)
SYSTEM_PROMPT = (
"You are a tool-calling assistant. Your task is to analyze user requests and call the appropriate tool when available. "
"When you find a matching tool, you MUST output a tool call using the tool_calls format. "
"Never directly answer user questions without calling tools when tools are available. "
"\n\nAvailable tools include:\n"
"- system_health_check: for system health status, system monitoring, database status, SCSAI connection\n"
"- inventory_monitor: for inventory status, stock levels, low stock alerts, replenishment\n"
"- price_monitor: for price monitoring, price trends, price alerts\n"
"- vendor_review: for supplier performance, vendor rating, supplier management\n"
"- data_analysis_report: for data analysis, reports, daily reports\n"
"- cost_optimizer: for cost optimization, BOM cost analysis\n"
"- procurement_assistant: for procurement, inquiry, quotation comparison\n"
"- document_agent: for document generation, document Q&A\n"
"- business_dashboard: for business daily reports, management dashboard\n"
"- data_inspection: for data health check, data scoring\n"
"- supply_chain_manager: for supply chain management, supplier alerts\n"
"- content_generator: for content creation, article writing\n"
"- goal_tracker: for goal tracking, sales targets\n"
"- change_analyst: for change impact analysis, ECO\n"
"- data_valuation: for data asset valuation\n"
"- ecr_reviewer: for ECR review, change requests\n"
"- data_import: for data import, EXCEL/CSV import\n"
"- system_control: for volume and brightness control\n"
"- display_control: for display and theme control\n"
"- system_settings: for location and sharing settings\n"
"- wifi_bluetooth_control: for WiFi and Bluetooth control\n"
"- wallpaper_control: for wallpaper management\n"
"- power_control: for power and screen control\n"
"- vlc_control: for VLC media player control\n"
"\n\nYou MUST always output tool_calls when a tool matches. Do NOT provide direct answers. "
"Only call tools and use their output. If no tool matches, say you cannot handle it."
)
SYSTEM_PROMPT_REVIEW = '''You are a task completion judge.
`
`
Return TASK_COMPLETE if:
- the assistant completed the request, or
- the assistant successfully moved the task forward and is now waiting for the user to choose, confirm, or provide the next input.
Return TASK_INCOMPLETE only if:
- a necessary tool call failed,
- the assistant was blocked,
- the assistant did not meaningfully address the request,
- or the task did not reach a valid stopping point.
Do not require the user's ultimate real-world goal to be fully finished.
If the workflow has reached a natural handoff point after successful tool use, return TASK_COMPLETE.
Use only the shown conversation and tool results.
Reply with exactly one of:
TASK_COMPLETE
TASK_INCOMPLETE'''
ENV_PATTERN = re.compile(r"\$\{([A-Z0-9_]+)\}")
DEFAULT_CONFIG_PATH = Path.home() / ".function-router" / "config.json"
DEFAULT_ROOT_DIR = Path.home() / ".function-router"
class RecreatingRotatingFileHandler(RotatingFileHandler):
"""Rotating file handler that recreates the target file if deleted.
If the log file path is removed while the process is still running,
the next emit reopens a fresh file at the original path. Old deleted-file
contents are not recovered.
`
#### server/routes/change.js(2350 行,摘录前 120 行)
`
/**
- 变更管理模块API路由 (ECR/ECO工程变更)
*
- 对接SCSAI PLM真实数据,支持降级本地JSON存储
- 状态流转:
- ECR: new → pending_approval → approved → in_progress → completed
- ↓ ↓ ↓
- rejected cancelled cancelled
- ECO: pending_implementation → implementing → completed
- ↓
- cancelled
*/
const fs = require('fs');
const path = require('path');
const { SCSAIClient, createFromGlobalConfig } = require('../utils/SCSAI-client');
// 缓存的 SCSAIClient 实例(懒初始化)
let _SCSAIClient = null;
function getSCSAIClient() {
if (_SCSAIClient) return _SCSAIClient;
try {
const client = createFromGlobalConfig();
if (client && client.serverUrl) {
_SCSAIClient = client;
return _SCSAIClient;
}
} catch (e) { / 忽略 / }
_SCSAIClient = new SCSAIClient({
serverUrl: config.SCSAIServer || process.env.SCSAI_SERVER,
database: config.SCSAIDatabase || process.env.SCSAI_DATABASE || 'SCPLM',
username: config.SCSAIUsername || process.env.SCSAI_USERNAME || 'admin',
password: config.SCSAIPassword || process.env.SCSAI_PASSWORD || 'password',
timeout: 30000
});
return _SCSAIClient;
}
/** 统一SCSAI查询:发送AML返回items数组(空数组表示无数据或失败) */
async function SCSAIQuery(aml) {
try {
const client = getSCSAIClient();
const result = await client.sendAML(aml);
if (result.success && result.items) return result.items;
console.warn('⚠️ SCSAI查询返回失败:', result.fault?.string || '未知错误');
`
`
return [];
} catch (e) {
console.warn('⚠️ SCSAI查询异常:', e.message);
return [];
}
}
// 从主模块获取配置和SCSAI连接工具
let config, SCSAIConnection;
try {
// 尝试从主模块获取配置
config = require('../../server').config;
// 尝试从主模块获取SCSAI连接工具
SCSAIConnection = require('../utils/SCSAI-connection');
} catch (e) {
// 降级使用默认配置
config = {
SCSAIServer: 'https://ylxt.chat/scplm',
SCSAIDatabase: 'SCPLM',
SCSAIUsername: 'admin',
SCSAIPassword: 'password'
};
// 尝试加载SCSAI连接工具
try {
SCSAIConnection = require('../utils/SCSAI-connection');
// 初始化SCSAI连接配置
SCSAIConnection.initSCSAIConfig({
SCSAIServer: config.SCSAIServer,
SCSAIDatabase: config.SCSAIDatabase,
SCSAIUsername: config.SCSAIUsername,
SCSAIPassword: config.SCSAIPassword,
debug: true
});
} catch (e) {
console.warn('⚠️ SCSAI连接工具加载失败:', e.message);
}
}
// ========== 本地数据文件持久化(降级用) ==========
const ECR_DATA_FILE = path.join(__dirname, '../data/ecrs.json');
const ECO_DATA_FILE = path.join(__dirname, '../data/ecos.json');
const ECN_DATA_FILE = path.join(__dirname, '../data/ecns.json');
const PR_DATA_FILE = path.join(__dirname, '../data/prs.json');
`
`
const CHANGE_LOGS_FILE = path.join(__dirname, '../data/change-logs.json');
// 确保数据目录存在
const dataDir = path.join(__dirname, '../data');
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
// ========== 工具函数 ==========
function getTimestamp() {
return Math.floor(Date.now() / 1000);
}
function generateChangeNumber(list, prefix) {
const year = new Date().getFullYear();
const thisYearItems = list.filter(item =>
item.change_number && item.change_number.startsWith(${prefix}-${year}-)
);
const nextNumber = thisYearItems.length + 1;
return ${prefix}-${year}-${String(nextNumber).padStart(4, '0')};
}
function getOperatorInfo(req) {
return {
operator_id: req.headers['x-user-id'] || 'system',
operator_name: req.headers['x-user-name'] || '系统管理员'
};
}
function loadData(filepath, defaultValue) {
`
#### server/boss-scheduler/lite-scheduler.js(2323 行,摘录前 120 行)
`
/**
- LiteScheduler — 本地轻量 Cron + 队列 + 互斥
*
- 统一架构:
- 所有数字员工通过 CapabilityRuntime(规则引擎 + 五大能力)执行
- Worker = 参数配置器 + 能力编排器
*
- MTClaw 思想加速(无GPU版本):
- LLM Router 实现 Worker/Solver 分工
- - Worker(小模型):处理高频简单任务,~70ms
- - Solver(大模型):处理复杂推理任务,~500ms
- 预期效果:70%+ 任务走 Worker,整体加速 ~7x
*/
const cron = require('node-cron');
const path = require('path');
// ===== 统一调度与审计 =====
const auditLog = require('../services/audit-log');
const sharedI18n = require('../shared/i18n');
// ===== CapabilityRuntime 集成 =====
const { CapabilityRuntime } = require('../core/capability-runtime');
const LLMBrain = require('../digital-staff/llm-brain');
const { LLMRouter, InferenceServiceDetector } = require('../digital-staff/llm-router');
// ★ 自进化学习器
let _correctionLearner = null;
function getCorrectionLearner() {
if (_correctionLearner) return _correctionLearner;
try { _correctionLearner = require('../digital-staff/correction-learner'); return _correctionLearner; } catch { return null; }
}
// ===== Worker 注册表(特殊 worker 保留,未来可全部由 YAML 配置取代) =====
const WORKERS = {
'data-clerk': () => require('./workers/data-clerk'),
'system-health': () => require('./workers/system-health'),
'procurement': () => require('./workers/procurement'),
'content': () => require('./workers/content'),
'SCSAI-creator': () => require('./workers/SCSAI-creator'),
'report-analyst': () => require('./workers/report-analyst'),
'cost-optimizer': () => require('./workers/cost-optimizer'),
'data-caretaker': () => require('./workers/data-caretaker'),
'biz-analyst': () => require('./workers/biz-analyst'),
'vendor-review': () => require('./workers/vendor-review'),
`
`
'ecr-worker': () => require('./workers/ecr-worker'),
'stock-manager': () => require('./workers/stock-manager'),
'process-worker': () => require('./workers/process-worker'),
'equip-worker': () => require('./workers/equip-worker'),
'mkt-worker': () => require('./workers/mkt-worker'),
'pm-worker': () => require('./workers/pm-worker'),
'content': () => require('./workers/content'),
'procurement': () => require('./workers/procurement'),
'doc': () => require('./workers/doc-worker'),
'auto-loop': () => require('./workers/auto-loop-worker'),
};
// ===== 五大能力映射表 =====
const PIPELINE_CAPABILITIES = ['identify', 'validate', 'repair', 'optimize', 'compare', 'generate', 'create', 'import', 'inspect', 'valuate', 'collect'];
const CAPABILITY_MAP = {
identify: 'identify',
validate: 'validate',
repair: 'repair',
optimize: 'optimize',
compare: 'compare',
generate: 'generate',
create: 'create',
import: 'import',
delete: 'delete',
update: 'update',
export: 'export',
approve: 'validate',
inspect: 'inspect',
valuate: 'valuate',
collect: 'collect',
identify: 'identify',
};
// ===== 确认挂起机制 =====
class ConfirmNeededError extends Error {
constructor(question, options, state) {
super('CONFIRM_NEEDED');
this.name = 'ConfirmNeededError';
this.question = question;
this.options = options || [];
this.state = state || {};
}
}
class LiteScheduler {
`
`
constructor(options = {}) {
this.profile = options.profile || null;
this.staffList = options.staffList || [];
this.taskQueue = options.taskQueue;
this.executionContext = options.executionContext;
this.staffManager = options.staffManager || null;
this.cronTasks = new Map();
this.runningExecutions = new Map();
this.taskExecuting = new Set();
this.started = false;
this.lastHealthCheck = null;
this._warnedEmptyStaff = new Set();
// 确认挂起会话存储: resumeId → { staffId, intent, parameters, question, options, state, createdAt }
this._pendingConfirmations = new Map();
// ★ Goal 状态管理(Phase 1: Loop Engineering)
// goalId → { staffId, goal, status, lastCheckAt, checkCount, successCount, failureCount, progress, createdAt }
this._goalStates = new Map();
// ★ MTClaw 加速配置(Phase 2: MTClaw Integration)
this._initMTClawConfig();
// ★ 昇腾 NPU 初始化(参考 MTClaw 模式)
this._initAscendNPU();
// ★ MTClaw 性能统计
// 用于验证 MTClaw 是否生效,效率提升了多少倍
this._mtclawStats = {
totalCalls: 0,
`
#### src/views/ProductList.vue(2284 行,摘录前 120 行)
`
📦 {{ t('product_title') }}
{{ t('product_subtitle') }}
| {{ t('product_code') }} | {{ t('product_name') }} | {{ t('label_version') }} | {{ t('label_status') }} | 质量评分 | 估值(元) | 治理状态 | {{ t('label_created_at') }} | {{ t('label_actions') }} | |
|---|---|---|---|---|---|---|---|---|---|
| {{ product.code }} | {{ product.name }} | {{ product.version }} | {{ product.status }} | {{ product._govQ ?? '-' }} | {{ product._govV ? '¥' + Number(product._govV).toLocaleString() : '-' }} | {{ govLabel(product._govS) }} | {{ product.createdAt }} | ||
| 暂无数据 | |||||||||
{{ t('action_page_info', { current: currentPage, total: totalPages }) }}
BossAgents