BOM与SOP对比校对技能。对比物料清单与作业指导书的物料信息,检测名称规格、位号、数量差异,在SOP文件中标注差异、追加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-XXX |
| J | 物料名称 | 子项物料名称 |
| 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 数据:
| 新列 | 内容 | 说明 |
|---|---|---|
| BS | BOM 名称规格 | 方便对比名称差异 |
| BT | BOM 数量 | 方便对比数量差异 |
| BU | BOM 位号 | 方便对比位号差异 |
标注样式:
检查 cache/status.json 状态
保存文件到 cache/ 目录
更新 status.json
根据"文件类型识别规则"判断每个文件是 BOM 还是 SOP。
sop_materials.json,不保留bom_materials.json,每周提醒用户手动清理一次| 文件 | 清理时机 |
|---|---|
| sop_materials.json | 对比完成后立即删除 |
| bom_materials.json | 每周提醒用户清理 |
| compare_result.json | 对比完成后保留(作为历史记录) |
| status.json | 对比完成后重置 |
当 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":"<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\\\"}\"}"
{
"action": "send",
"channel": "feishu",
"filePath": "/path/to/file.xlsx",
"message": "文件说明"
}
当多个用户同时请求校对时,单进程会导致排队等待。
使用 sessions_spawn 为每个校对任务启动独立子代理:
用户A请求 ──► spawn sub-agent A ──► 独立进程处理 ──► 完成通知
用户B请求 ──► spawn sub-agent B ──► 独立进程处理 ──► 完成通知
用户C请求 ──► spawn sub-agent C ──► 独立进程处理 ──► 完成通知
当收到用户的 BOM 和 SOP 文件后,使用以下流程:
# 使用 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 - 独立运行的校对脚本,无需依赖主进程上下文。