← 返回 Skills 市场
2656255594

BOM与SOP校对

作者 2656255594 · GitHub ↗ · v2.1.2 · MIT-0
cross-platform ⚠ suspicious
166
总下载
1
收藏
0
当前安装
12
版本数
在 OpenClaw 中安装
/install bom-sop-check
功能描述
BOM与SOP对比校对技能。支持多个BOM文件合并后与SOP对比,检测名称规格、位号、数量差异,在SOP文件中标注差异、追加BOM数据并生成报告。校对报告包含:SOP独有物料、BOM独有物料、数量差异明细三个表格。触发场景:用户发送BOM和SOP文件要求对比校对。
使用说明 (SKILL.md)

BOM 与 SOP 校对技能

功能说明

  1. 解析 BOM 表提取物料信息(编码、名称、规格、数量、位号)
  2. 解析 SOP 表 AN-BQ 列范围提取物料信息
  3. 按物料编码匹配,对比名称规格、位号、数量
  4. 在 SOP 文件中标注差异单元格(红色/黄色)
  5. 将 BOM 数据追加到 SOP 新列(BS/BT/BU)
  6. 新增:生成校对报告工作表
  7. 生成差异报告并发送标注后的文件

v1.10.0 功能特性

核心功能

  • BOM 数据追加:将 BOM 的名称规格、数量、位号写入 SOP 新列
    • BS 列:BOM 名称规格
    • BT 列:BOM 数量
    • BU 列:BOM 位号

表头样式

  • 第154行添加 BOM 表头
  • 表头样式:加粗 + 浅蓝背景 + 边框
  • 数据单元格:细边框表格效果

合并单元格支持

  • 自动识别 SOP 中的合并单元格
  • BOM 数据列与 SOP 格式保持一致
  • 仅给有差异的物料添加 BOM 信息

校对报告工作表(v1.10 新增)

  • 新增"校对报告"工作表
  • 包含 BOM 独有物料列表(BOM有但SOP没有)
  • 包含 SOP 独有物料列表(SOP有但BOM没有)
  • 表格格式:类型、物料编码、物料名称、名称规格、数量、位号

版本历史

  • v1.0:核心对比功能 + 简单标注(红/黄)
  • v1.9:新增 BS/BT/BU 列、表头样式、边框、合并单元格支持
  • v1.10:新增校对报告工作表

稳定性保障

文件验证

  • ✅ 文件存在性检查
  • ✅ 文件格式验证(必须是 .xlsx)
  • ✅ 文件大小限制(≤100MB)
  • ✅ Excel 格式有效性验证(ZIP 结构检查)

数据处理

  • ✅ 最大行数限制(10000 行)
  • ✅ 字符串长度限制(500 字符)
  • ✅ 物料编码格式验证(\d{5}-\d{3}-\d{3}
  • ✅ 空值保护(None → 空字符串)
  • ✅ 除零保护(分母为 0 时默认为 1)

对比逻辑

  • ✅ 规范化比较(去除多余空格)
  • ✅ 数量浮点误差容忍(±0.001)
  • ✅ 位号分隔符兼容(逗号、中文逗号、空格)

错误处理

  • ✅ 异常捕获与日志记录
  • ✅ 友好错误消息
  • ✅ 详细模式(--verbose

文件格式支持

  • .xlsx - 直接处理
  • .zip - 自动解压后处理(支持多个文件或单个文件压缩)

压缩文件处理

当用户发送 .zip 文件时:

  1. 自动解压到临时目录
  2. 识别其中的 BOM 和 SOP 文件(根据文件名和内容)
  3. 执行对比校对
  4. 清理临时文件

文件识别规则

BOM 文件特征:

  • 文件名包含 "BOM" 或 "物料清单"
  • 列 I 含物料编码格式 XXXXX-XXX-XXX
  • 有父项/子项结构

SOP 文件特征:

  • 文件名包含 "SOP" 或 "作业指导书"
  • AN-BQ 列范围存在物料编码

文件接收处理

文件缓存目录

  • 缓存路径: /root/.openclaw/workspace-text-1-feishu-6/skills/bom-sop-check/cache/
  • 状态文件: cache/status.json - 记录已接收的文件信息

场景处理流程

场景1:同时发送多个文件

  1. 接收所有文件,保存到缓存目录
  2. 逐一识别文件类型(BOM/SOP)
  3. 全部识别完成后开始对比
  4. 完成后清理缓存

场景2:先后发送文件

  1. 接收第一个文件,识别类型并保存到缓存
  2. 更新 status.json 记录已接收文件
  3. 告知用户已接收 X 文件,等待 Y 文件
  4. 接收到第二个文件后自动开始对比
  5. 完成后清理缓存

场景3:单个文件包含多个工作表

  1. 解析所有工作表
  2. 自动识别哪个 sheet 是 BOM,哪个是 SOP
  3. 开始对比
  4. 完成后清理缓存

文件类型识别规则

BOM 文件特征:

  • 列 I 含 "物料编码" 或数据格式为 XXXXX-XXX-XXX
  • 列 J 含 "物料名称" 或 "子项物料名称"
  • 列 K 含 "规格型号" 或 "子项规格型号"
  • 有父项/子项结构(列 D 有父项物料编码)

SOP 文件特征:

  • AN-BQ 列范围存在数据
  • 列 AQ (或对应列) 含物料编码格式 XXXXX-XXX-XXX
  • 通常是作业指导书格式

文件格式

BOM 文件

字段 说明
I 物料编码 格式:XXXXX-XXX-XXX
J 物料名称 子项物料名称
K 规格型号 子项规格型号
N 用量分子 用于计算数量
O 用量分母 用于计算数量
P 备注 包含位号信息

数量计算:实际用量 = 分子(N) ÷ 分母(O),分母为空或0时默认为1

SOP 文件(作业指导书)

提取物料信息(按用户指定映射):

列范围 字段 实际取值
AQ-AW 物料编码 AQ 列
AX-BH 名称规格 AX 列
BI-BN 位号 BI 列
BO-BQ 数量 BO 列

校对逻辑

对比流程

  1. 物料编码匹配:BOM 列 I ↔ SOP 列 AQ
  2. 名称规格对比:BOM 列 J+K ↔ SOP 列 AX
  3. 位号对比:BOM 列 P ↔ SOP 列 BI
  4. 数量对比:BOM 列 N÷O ↔ SOP 列 BO

差异定义

  • 名称规格差异:名称或规格型号不一致
  • 位号差异:位号信息不匹配
  • 数量差异:数量值不一致

输出说明

1. 差异报告

物料编码 名称 差异类型 BOM内容 SOP内容

差异类型:名称规格、位号、数量

2. 标注文件

标注颜色

颜色 含义 应用列
🔴 红色 名称规格/位号/数量差异 AX, BI, BO
🟡 黄色 仅 SOP 中存在的物料 AX, BI, BO

注意:物料编码列(AQ)不标注颜色

3. BOM 数据追加(v1.1 新增)

在 SOP 文件右侧新增三列,写入对应的 BOM 数据:

新列 内容 说明
BS BOM 名称规格 方便对比名称差异
BT BOM 数量 方便对比数量差异
BU BOM 位号 方便对比位号差异

标注样式

  • 差异物料的 BS/BT/BU 列会标注为红色
  • 仅 SOP 存在的物料不追加 BOM 数据

使用方法

步骤1:接收文件并缓存

检查 cache/status.json 状态
保存文件到 cache/ 目录
更新 status.json

步骤2:识别文件类型

根据"文件类型识别规则"判断每个文件是 BOM 还是 SOP。

步骤3:判断是否可以开始对比

情况A:单个 BOM + 单个 SOP

  • BOM 和 SOP 都已收到 → 直接开始对比

情况B:多个 BOM + 单个 SOP(多 BOM 合并)

  • 收到多个 BOM 文件时,先询问用户确认
    检测到多个 BOM 文件:
    1. bom1.xlsx
    2. bom2.xlsx
    3. bom3.xlsx
    
    是否要将这些 BOM 文件合并后与 SOP 进行校对?
    - 合并规则:同一物料编码累加数量、合并位号
    - 请回复"确认"开始校对,或告诉我如何处理
    
  • 用户确认后再执行合并校对
  • 防止误上传:不自动合并,必须用户明确确认

步骤4:执行对比校对

  1. 解析 BOM 提取 I/J/K/N/O/P 列
  2. 解析 SOP 提取 AN-BQ 范围内的 AQ/AX/BI/BO 列
  3. 按物料编码匹配并对比各字段
  4. 在 SOP 文件 AN-BQ 列范围内标注差异单元格
  5. 生成差异报告
  6. 发送报告和标注后的 SOP 文件

步骤5:清理缓存

  • SOP 物料数据:对比完成后立即删除 sop_materials.json,不保留
  • BOM 物料数据:保留在 bom_materials.json,每周提醒用户手动清理一次
  • status.json:对比完成后重置

缓存清理策略

文件 清理时机
sop_materials.json 对比完成后立即删除
bom_materials.json 每周提醒用户清理
compare_result.json 对比完成后保留(作为历史记录)
status.json 对比完成后重置

文件发送方案

优先方案:使用飞书 API 直接发送

message 工具或 lightclaw_upload_file 不可用时,使用飞书 API:

# 1. 获取 tenant_access_token
TENANT_TOKEN=$(curl -s -X POST "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" \
  -H "Content-Type: application/json" \
  -d '{"app_id":"\x3CAPP_ID>","app_secret":"\x3CAPP_SECRET>"}' | jq -r '.tenant_access_token')

# 2. 上传文件
FILE_KEY=$(curl -s -X POST "https://open.feishu.cn/open-apis/im/v1/files" \
  -H "Authorization: Bearer $TENANT_TOKEN" \
  -F "file_type=xlsx" \
  -F "file_name=\x3C文件名>.xlsx" \
  -F "file=@\x3C本地文件路径>" | jq -r '.data.file_key')

# 3. 发送文件消息
curl -X POST "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id" \
  -H "Authorization: Bearer $TENANT_TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"receive_id\":\"\x3C用户open_id>\",\"msg_type\":\"file\",\"content\":\"{\\\"file_key\\\":\\\"$FILE_KEY\\\"}\"}"

备用方案:使用 message 工具

{
  "action": "send",
  "channel": "feishu",
  "filePath": "/path/to/file.xlsx",
  "message": "文件说明"
}

并发处理方案(v1.11 新增)

问题背景

当多个用户同时请求校对时,单进程会导致排队等待。

解决方案:Sub-Agent 并行处理

使用 sessions_spawn 为每个校对任务启动独立子代理:

用户A请求 ──► spawn sub-agent A ──► 独立进程处理 ──► 完成通知
用户B请求 ──► spawn sub-agent B ──► 独立进程处理 ──► 完成通知
用户C请求 ──► spawn sub-agent C ──► 独立进程处理 ──► 完成通知

使用方法

当收到用户的 BOM 和 SOP 文件后,使用以下流程:

  1. 保存文件到缓存目录
  2. 启动 sub-agent 处理
# 使用 sessions_spawn 启动后台任务
sessions_spawn(
    task=f"执行 BOM/SOP 校对任务。BOM文件: {bom_path}, SOP文件: {sop_path}。运行命令: python3 {script_dir}/background_compare.py {bom_path} {sop_path}",
    runtime="subagent",
    mode="run",
    timeout_seconds=300  # 5分钟超时
)
  1. 立即回复用户:"任务已提交,正在后台处理,完成后会通知您"
  2. sub-agent 完成后:自动发送结果给用户

并发能力

用户数 处理方式 预期效果
1-2 人 主进程处理 即时响应
3-5 人 Sub-Agent 并行 每人独立处理,互不阻塞
5+ 人 Sub-Agent + 任务队列 建议增加任务队列管理

后台处理脚本

scripts/background_compare.py - 独立运行的校对脚本,无需依赖主进程上下文。


注意事项

  1. 标注范围限制:仅在 AN-BQ 列范围内标注,不影响其他列
  2. 数量精度:分子÷分母结果为整数显示整数,否则保留两位小数
  3. 防除零:分母为空或0时默认为1
  4. 文件名保持:输出文件名与原始 SOP 文件名一致
  5. 大文件上传:超过 20MB 的文件可能上传超时,需设置足够超时时间(--max-time 120)
  6. 并发处理:多用户同时使用时,自动使用 Sub-Agent 并行处理

v1.15.0 脚本精简

删除的脚本

  • sop_xml_marker.py - 字符级标注版本(已删除)
  • sop_char_marker*.py - 测试版本(已删除)
  • char_diff_marker.py - 测试版本(已删除)

保留的脚本

  • compare_bom_sop.py - 主对比脚本(单元格颜色标注)
  • background_compare.py - 后台处理脚本
  • task_queue.py - 任务队列管理

技术实现

  1. 使用 difflib.SequenceMatcher 进行字符级对比
  2. 生成 Excel 富文本 XML(\x3Cr> + \x3CrPr> 标签)
  3. 直接操作 xlsx 内部 XML,避免文件膨胀

v1.16.0 更新说明

  • 忽略名称规格中冒号差异(全角、半角:、竖线|视为等价)
  • 减少因分隔符不同导致的误报

v1.17.0 更新说明

  • 忽略空格差异:名称规格比较时移除所有空格
  • 智能工作表检测:自动检测包含物料数据的 sheet
    • 支持物料编码直接在单元格中
    • 支持物料编码在共享字符串中
  • 修复不同 SOP 文件格式兼容性问题

v1.18.0 更新说明

  • 修复样式索引问题:原 styles.xml 中 cellXfs count 属性与实际 xf 标签数不一致,导致颜色标注无法显示
  • 改进样式索引计算:通过遍历查找 fillId 匹配的样式索引,而不是依赖 count 属性
  • 修复工作表选择:改为自动选择包含最多物料编码的工作表(之前硬编码优先选择 sheet2.xml)
  • 复用已有填充:检测并复用文件中已有的红色/黄色填充(Fill 7/8),避免重复添加

v1.18.1 更新说明

  • 修复自闭合标签处理:正确处理 \x3Cc r="XX"/> 自闭合标签的样式添加
  • 完整遍历校对:确保所有物料信息遍历完成后再进行对比校对

v1.19.0 更新说明

  • 修复 quotePrefix 问题:新添加的 BS/BT/BU 列不再显示单引号前缀
  • 修复样式索引计算:使用实际 xf 标签数量而非 count 属性
  • 数量累加和位号合并:同一物料编码在多行时,自动累加数量、合并位号后再对比
  • 忽略标点符号:对比时忽略所有标点符号(中英文)、全角半角差异
  • 智能对比:仅对比实质内容差异,减少误报

v1.19.1 更新说明

  • 位号排序比较:位号分割后排序再比较,忽略顺序差异
  • 忽略括号内容:位号对比时忽略括号内的备注信息(如 (V06及以上版本PCB...)

v1.19.2 更新说明

  • 校对报告增强:新增"数量差异明细"表格
    • 显示数量差异的物料编码
    • 显示 BOM 数量和 SOP 数量
    • 计算并显示差异数量(正数表示 BOM 多,负数表示 SOP 多)

v1.19.3 更新说明

  • 位号去重:位号对比时先去重再排序,避免 SOP 中同一物料编码多行导致位号重复而误报

v2.1.0 更新说明

  • 多 BOM 文件合并:支持多个 BOM 文件作为标准校对一个 SOP
    • 命令行语法:compare_bom_sop.py bom1.xlsx bom2.xlsx --sop sop.xlsx
    • 合并规则:同一物料编码累加数量、合并位号(去重)
    • 用途:多个产品的 BOM 表合并后校对一个 SOP

v2.1.1 更新说明

  • 用户确认流程:多个 BOM 文件时需用户确认才执行合并
    • 防止误上传导致意外合并
    • 明确告知用户合并规则
    • 用户回复"确认"后才执行
安全使用建议
要不要安装/运行前请考虑: 1) 凭据与声明不一致:SKILL.md 示范直接调用飞书 API(curl)需要 app_id/app_secret,但注册信息列出“无需要的环境变量”。如果你会让该技能直接发送文件,要求作者明确声明需要哪些凭据并在安装界面提示用户输入;不要把凭据放在聊天中。 2) 数据保留与隐私:技能会在 /root/.openclaw/.../cache/ 下写入缓存并保留 bom_materials.json 与 compare_result.json(作为历史),可能含公司物料信息。若这些信息敏感,请要求作者改为临时存储并支持可配置的自动清理策略或在使用后立即删除。 3) 审计与子代理:技能建议使用 sessions_spawn 启动 sub-agent 并行处理。确认你的平台或实例允许创建子代理并能审计其网络/文件活动;如无审计或隔离,应在受控沙箱中运行。 4) 网络与外发风险:检查 scripts/feishu_send.py 与 SKILL.md 中的发送实现(未完全列出在注册元数据中)。如果不希望文件被主动推送到外部服务,可禁用飞书备用路径或只使用平台内置安全的文件上传工具。 5) 代码审计建议:如果你打算在生产环境中使用,先审查仓内脚本(scripts/*.py、backups/*)中是否有任意外部网络调用、命令执行(例如 os.system/ subprocess)、或者把文件内容上传到任意未列明域名的逻辑。确认没有硬编码的外部主机或 URL。 总结建议:该技能功能上是合逻辑的,但存在“未声明凭据、缓存/持久化策略不明确、以及后台/并发处理可能扩大执行边界”的不一致和隐私风险。若要使用,要求作者或发布方补充:明确的 requires.env(如 FEISHU_APP_ID/FEISHU_APP_SECRET)、可配置的缓存保留策略、以及对子代理和外部发送操作的安全承诺;或先在隔离环境中运行并手动审计代码。
功能分析
Type: OpenClaw Skill Name: bom-sop-check Version: 2.1.2 The skill bundle contains logic for comparing Excel files and sending results via the Feishu API, but it exhibits high-risk patterns. Specifically, 'scripts/feishu_send.py' is designed to read the sensitive platform configuration file '/root/.openclaw/openclaw.json' to extract 'appId' and 'appSecret' for authentication. Furthermore, 'SKILL.md' instructs the AI agent to execute shell commands via 'sessions_spawn' using user-provided file paths without visible sanitization, which presents a significant risk for Remote Code Execution (RCE). While these capabilities appear intended for the stated purpose of the tool, the direct access to system secrets and the execution of constructed shell strings meet the criteria for a suspicious classification.
能力评估
Purpose & Capability
技能名称与描述(BOM 与 SOP 对比、标注、生成报告)与仓内脚本(compare_bom_sop、background_compare 等)在逻辑和实现上基本一致:脚本解析 xlsx(解压 xml)、对比字段、生成标注文件和报告。包含并发/后台任务处理的实现(sessions_spawn、background_compare.py)也与描述相符。
Instruction Scope
SKILL.md 明确描述了文件缓存路径 (/root/.openclaw/.../cache/)、状态文件 (status.json)、解压临时目录 (/tmp/...)、以及将 BOM 数据保留为 bom_materials.json 并周期性提醒清理。它还建议在主工具不可用时直接用飞书 API 上传/发送文件(需要 app_id/app_secret),并演示了 curl 请求。说明要求写磁盘、解压并读取多个内部路径、启动子代理并将结果发送到外部 API —— 这些均超出仅“读取用户上传 XLSX 并返回对比结果”的最小范围,且没有在元数据里声明对应的凭据或权限。
Install Mechanism
没有安装规范(instruction-only / 包含脚本),因此不会在安装阶段从不受信任的 URL 下载或执行远程代码;所有逻辑仅来自包内代码文件。总体安装路径风险较低。
Credentials
registry metadata 显示“Required env vars: none”,但 SKILL.md 中的文件发送备用方案明示需要飞书应用凭据(app_id、app_secret)以换取 tenant_access_token 并调用飞书接口。这一点未在 requires.env 中声明,是明显不一致。另有对 open_id、文件上传权限、以及 sessions_spawn(平台能力/凭据)等依赖未说明。请求或使用凭据的行为应被显式列出并限制,但这里没有。
Persistence & Privilege
技能不会被标记为 always:true(无强制常驻),但会在本地缓存和保留部分数据:sop_materials.json 在完成后会删除,bom_materials.json 会长期保留并每周提醒清理,compare_result.json 会保留作为历史。保留 BOM 数据(可能包含敏感或商业机密)需要明确同意与保留期限策略;当前文档没有详细的用户可选项或自动清理策略,值得注意。技能还建议通过 sessions_spawn 启动子代理并在后台并行处理,这在权限边界上扩大了运行时行为,应确认平台对 sub-agent 的限制与审计。
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install bom-sop-check
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /bom-sop-check 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v2.1.2
版本更新
v2.1.1
v2.1.1: 多BOM合并需用户确认,防止误上传
v2.1.0
v2.1.0: 支持多个BOM文件合并后校对SOP,同一物料编码自动累加数量、合并位号
v2.0.0
v2.0.0 正式版: 修复quotePrefix问题,数量累加和位号合并,智能对比忽略标点符号和顺序差异,校对报告新增数量差异明细表格
v1.19.3
v1.19.3: 位号对比时去重,避免重复位号误报
v1.19.2
v1.19.2: 校对报告新增数量差异明细表格,显示差异数量;v1.19.1: 位号排序比较忽略顺序差异
v1.19.0
v1.19.0: 修复quotePrefix问题,数量累加和位号合并,忽略标点符号等非关键差异
v1.18.1
修复样式索引问题,颜色标注现在可以正确显示。改进工作表自动选择逻辑。修复自闭合标签处理。
v1.18.0
v1.18.0: 恢复正确版本;v1.17.0: 忽略空格差异、智能工作表检测
v1.13.0
v1.13.0: 优化对比逻辑、增强稳定性、支持并发处理
v1.17.0
忽略空格差异; 智能检测工作表; 修复SOP格式兼容性
v1.15.0
v1.15.0: 修复SOP解析、工作表顺序、文件名乱码; 精简脚本
元数据
Slug bom-sop-check
版本 2.1.2
许可证 MIT-0
累计安装 0
当前安装数 0
历史版本数 12
常见问题

BOM与SOP校对 是什么?

BOM与SOP对比校对技能。支持多个BOM文件合并后与SOP对比,检测名称规格、位号、数量差异,在SOP文件中标注差异、追加BOM数据并生成报告。校对报告包含:SOP独有物料、BOM独有物料、数量差异明细三个表格。触发场景:用户发送BOM和SOP文件要求对比校对。 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 166 次。

如何安装 BOM与SOP校对?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install bom-sop-check」即可一键安装,无需额外配置。

BOM与SOP校对 是免费的吗?

是的,BOM与SOP校对 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

BOM与SOP校对 支持哪些平台?

BOM与SOP校对 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 BOM与SOP校对?

由 2656255594(@2656255594)开发并维护,当前版本 v2.1.2。

💬 留言讨论