数字员工系统审计问题清单 (2026-06-14)

数字员工系统审计问题清单 (2026-06-14)

🔴 CRITICAL (3)

P1: boss-scheduler/index.js 模块级提前调用 ensureTables()

  • 文件: server/boss-scheduler/index.js 第13-16行
  • 代码在模块作用域调用 staffManager.ensureTables(),此时 sqlite-compat.init() 尚未完成
  • 第一次调用 getDb() 抛 "sql.js 未初始化"→_db 永远为 null
  • 即使加载流程后续 loadSqliteRoutes() 重新调用了 ensureTables() 并成功设置了 _db

但如果旧 zombie 进程或异步重入先抢到,API 永远返回空

  • 修复方案: 将模块级的 ensureTables() 移到 _loadProfile()_ensureInit() 内部,

或直接删除(server.jsloadSqliteRoutes() 已经调了一次)

P2: procurement.js Phase 2 硬编码超时 1 分钟

  • 文件: server/boss-scheduler/workers/procurement.js 第159行
  • waitTimeout: 1, confirmTimeout: 1 硬编码为测试值
  • 应该从 staff.params.waitTimeout 读取(local.yaml 中的 waitTimeout: 30,单位秒)
  • 导致用户来不及确认采购就超时
  • 修复方案: { ...(staff.params || {}), ...(parameters || {}) } 取完整 merged 配置,传参时确保覆盖

P3: cost-optimizer.js 使用硬编码模拟数据

  • 文件: server/boss-scheduler/workers/cost-optimizer.js
  • 整个 worker 不连真实 SCSAI/BOM 数据
  • mockComponentsrecommendations 全写死
  • 与之前决策"禁止模拟数据"矛盾
  • 修复方案: 至少添加注释 TODO,API 调用失败时改用日志 fallback 而非 mock,或直接报错

🟠 ARCHITECTURE (3)

P4: staff-manager 和 lite-scheduler 数据库状态不一致

  • staff-managersciot_import.dbdigital_staff
  • lite-schedulerlocal.yaml 加载 + syncStaffToDb() 写入 DB
  • YAML 覆盖 DB 变更:用户通过前端编辑员工的配置会被 syncStaffToDb() 覆盖
  • 修复方案: syncStaffToDb() 用合并策略,保留 DB 中已修改的字段

P5: procurement.js 每次请求都 new ArasClient

  • 文件: server/boss-scheduler/workers/procurement.js 第107-113行
  • Phase 1 每次执行都 new ArasClient,无连接池复用
  • 从环境变量读取相同参数重复 new
  • 修复方案: 在模块顶部创建一次 ArasClient 实例

P6: procurement.js 默认参数双重硬编码

  • local.yaml 中 params.waitTimeout: 30 已定义
  • procurement.js 第159行又硬编码了 waitTimeout: 1
  • 数据流:staff.params → merged (覆盖 params) → runProcurementWorkflowV3({ waitTimeout: 1, ... })
  • params 的值在 merged 中被人为覆盖为 1

🟡 BUGS (6)

P7: cost-optimizer.js HTTP API 调用使用 httprequire('http') 可能不存在

  • 文件: server/boss-scheduler/workers/cost-optimizer.js 第62行
  • 未处理 API 调用超时(默认是无限等待)
  • 如果服务器自己调用自己(localhost:3006/api/demo/bom-cost-optimize),

当 worker 持有 mutex 时可能死锁

P8: execution-context.js 日志高并发使用 JSON 文件

  • 1秒防抖,多个异步操作同时写入同一文件
  • 虽用了 tmp+rename,但 JSON.stringify 在 500 条日志(约 2MB)时可能 OOM
  • 修复: 考虑限制每行大小或限流

P9: data-caretaker.js poDir 重复声明

  • 文件: server/boss-scheduler/workers/data-caretaker.js 第80行
  • const poDir 声明了两次(第68行和80行),运行时抛 SyntaxError
  • 修复: 删除重复声明

P10: staff-registry.js 和 lite-scheduler.js 的能力字段不一致

  • toRuntimeStaff() 给 staff 设置 capabilities 数组
  • _resolveStaff() 从 DB 加载员工时没设 capabilities
  • 前端编辑的员工不含 capabilities,插件无法使用能力

P11: staff-manager.js queryLogs 用 ISO 字符串,execution-context.js 用时间戳

  • staff-manager.queryLogssince 参数用 ISO 日期字符串比较
  • execution-context.getStaffLogssince 参数用 timestampUnix(数字)
  • 两套查询 API 格式不一致

P12: lite-scheduler.js 构建 ArasClient 时配置硬编码

  • 文件: lite-scheduler.js 第87-93行
  • SCSAI 配置从 process.env.ARAS_* 或硬编码后备获取
  • server.js 加载的 ArasClient 是两条不同路径,配置可能不同

⚪ CODE QUALITY (5)

P13: digital-staff/index.js 95KB 遗留旧代码

  • 仍被 execution-context.js 引用(pushLogToSSEClients)
  • 但已被 lite-scheduler 体系取代
  • 建议清理无用导出

P14: server.js routing 中有大量空行调试日志

  • [DEBUG][router] dispatch 进入 产生噪音

P15: procurement.js Phase 1 的 staffLog 调用缺失 result 参数

  • 文件第155行 staffLog(staff.id, '采购助手启动', ...) 只传了 3 个参数
  • ctx.staffLog 签名是 (staffId, action, detail, result, meta)

P16: system-health.js 大量空行

  • 第84-88行有大量空行

P17: consistency-check.js 中 getSciotDb 可能未正确 export

  • system-health.js 第10行 const { runConsistencyCheck, getSciotDb } = require('../lib/consistency-check');
  • 如果 getSciotDb 未导出,会返回 undefined
← 返回案例列表
分享:
🤖 Try Now →
🤖
🎁