BOM与SOP对比校对技能:支持多BOM文件合并后与SOP对比,检测名称规格、位号、数量差异,在SOP文件中标注差异、追加BOM数据并生成报告。报告包括:SOP独有物料、BOM独有物料、数量差异明细三张表。触发场景:用户上传BOM和SOP文件进行对比校对。
BOM 数据追加:将 BOM 的名称规格、数量、位号写入 SOP 新列
\d{5}-\d{3}-\d{3})--verbose).xlsx - 直接处理.zip - 自动解压后处理(支持多个文件或单个文件压缩)当用户发送 .zip 文件时:
BOM 文件特征:
XXXXX-XXX-XXXSOP 文件特征:
/root/.openclaw/workspace-text-1-feishu-6/skills/bom-sop-check/cache/cache/status.json - 记录已接收的文件信息BOM 文件特征:
SOP 文件特征:
列字段说明I物料编码格式:XXXXX-XXX-XXXJ物料名称子项物料名称K规格型号子项规格型号N用量分子用于计算数量O用量分母用于计算数量P备注包含位号信息
数量计算:实际用量 = 分子(N) ÷ 分母(O),分母为空或0时默认为1
提取物料信息(按用户指定映射):
列范围字段实际取值AQ-AW物料编码AQ 列AX-BH名称规格AX 列BI-BN位号BI 列BO-BQ数量BO 列
物料编码名称差异类型BOM内容SOP内容
差异类型:名称规格、位号、数量
标注颜色:
颜色含义应用列🔴 红色名称规格/位号/数量差异AX, BI, BO🟡 黄色仅 SOP 中存在的物料AX, BI, BO
注意:物料编码列(AQ)不标注颜色
在 SOP 文件右侧新增三列,写入对应的 BOM 数据:
新列内容说明BSBOM 名称规格方便对比名称差异BTBOM 数量方便对比数量差异BUBOM 位号方便对比位号差异
标注样式:
text
检查 cache/status.json 状态
保存文件到 cache/ 目录
更新 status.json
根据"文件类型识别规则"判断每个文件是 BOM 还是 SOP。
情况A:单个 BOM + 单个 SOP
情况B:多个 BOM + 单个 SOP(多 BOM 合并)
收到多个 BOM 文件时, 先询问用户确认: text
检测到多个 BOM 文件:
是否要将这些 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:
bash
```bash
# 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":"<APP_ID>","app_secret":"<APP_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=<文件名>.xlsx" \
-F "file=@<本地文件路径>" | 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\":\"<用户open_id>\",\"msg_type\":\"file\",\"content\":\"{\\\"file_key\\\":\\\"$FILE_KEY\\\"}\"}"
json
{
"action": "send",
"channel": "feishu",
"filePath": "/path/to/file.xlsx",
"message": "文件说明"
}
当多个用户同时请求校对时,单进程会导致排队等待。
使用 sessions_spawn 为每个校对任务启动独立子代理:
text
用户A请求 ──► spawn sub-agent A ──► 独立进程处理 ──► 完成通知
用户B请求 ──► spawn sub-agent B ──► 独立进程处理 ──► 完成通知
用户C请求 ──► spawn sub-agent C ──► 独立进程处理 ──► 完成通知
当收到用户的 BOM 和 SOP 文件后,使用以下流程:
python
# 使用 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 人主进程处理即时响应3-5 人Sub-Agent 并行每人独立处理,互不阻塞5+ 人Sub-Agent + 任务队列建议增加任务队列管理
scripts/background_compare.py - 独立运行的校对脚本,无需依赖主进程上下文。
sop_xml_marker.py - 字符级标注版本(已删除)sop_char_marker*.py - 测试版本(已删除)char_diff_marker.py - 测试版本(已删除)compare_bom_sop.py - 主对比脚本(单元格颜色标注)background_compare.py - 后台处理脚本task_queue.py - 任务队列管理difflib.SequenceMatcher 进行字符级对比<r> + <rPr> 标签):、半角 :、竖线 | 视为等价)忽略空格差异:名称规格比较时移除所有空格
智能工作表检测:自动检测包含物料数据的 sheet
修复不同 SOP 文件格式兼容性问题
<c r="XX"/> 自闭合标签的样式添加(V06及以上版本PCB...))校对报告增强:新增"数量差异明细"表格
多 BOM 文件合并:支持多个 BOM 文件作为标准校对一个 SOP
compare_bom_sop.py bom1.xlsx bom2.xlsx --sop sop.xlsx用户确认流程:多个 BOM 文件时需用户确认才执行合并