License Pre-Audit - 进出口许可文档智能预审系统
进出口许可文档智能预审系统,支持:
- CLI 命令行:直接指定目标文件夹或压缩包路径执行命令。
- 对话交互:在聊天界面输入触发词(如"审核"/"审核许可证"/"许可证"),然后上传文件夹或压缩包。
系统将自动解压、提取 PDF、图片 文件目标字段,根据审核规则 执行审核、检测公章,并生成结构化 JSON 报告和 Markdown 表格。
系统结构
license-pre-audit/
├── SKILL.md # 技能说明
├── references/ # 配置文件
│ ├── audit-rules.json # 审核规则配置
│ ├── doc-types.json # 文档类型配置
│ ├── settings.json # 上传格式、路径、输出路径、触发指令、缓存配置
│ └── demo/ # 示例数据
│ ├── test/ # 示例文件夹
│ └── test.zip # 示例压缩包
├── assets/ # 运行时数据
│ ├── files/ # 解压文件目录
│ └── reports/ # 报告输出目录
└── src/
├── index.js # 主流程(整合 CLI+ 压缩包 + 表格)
├── prompts/ # Prompt 文件(MD 格式)
│ ├── extract-fields.md # 字段提取 Prompt
│ └── audit-rules.md # 审核规则 Prompt
├── utils/ # 工具函数
│ ├── pdf-ocr.js # PDF/图片文本提取
│ ├── stamp-detect.js # 盖章检测
│ ├── field-normalize.js # 字段标准化
│ ├── extract-archive.js # 压缩包解压
│ ├── generate-table.js # 表格生成
│ └── check-deps.js # 依赖检测与自动安装(新增)
└── rules/ # 11 条审核规则
├── index.js # 规则总入口
├── rule-stamp.js # 规则 1: 盖章检查
├── rule-contract-no.js # 规则 2: 合同号
├── rule-exporter.js # 规则 3: 出口国
├── rule-importer.js # 规则 4: 进口商
├── rule-amount.js # 规则 5: 金额检查
├── rule-quantity.js # 规则 6: 数量检查
├── rule-weight.js # 规则 7: 重量检查
├── rule-mtc-no.js # 规则 8: 合格证编号
├── rule-manufacturer.js # 规则 9: 生产商
├── rule-customs.js # 规则 10: 报关口岸
└── rule-summary.js # 规则 11: 审核摘要
🚀 快速开始
首次使用 - 自动检测依赖
技能首次运行时会自动检测依赖,如果缺少依赖会提示并询问是否自动安装:
# 首次运行会自动检测并安装缺失的依赖
node <技能路径>/src/index.js <路径>
# 输出示例:
🚀 License Pre-Audit - 依赖检测
═══════════════════════════════════════════
🖥️ 检测到操作系统:MACOS
────────────────────────────────────────────────────────────
✅ python - Python 3.x 运行时 - 已安装
✅ poppler - PDF 转图片工具 - 已安装
❌ tesseract - OCR 引擎(支持中英文) - 未安装
❌ pdfplumber - Python PDF 文本提取库 - 未安装
────────────────────────────────────────────────────────────
📊 结果:2 个已安装,2 个缺失
🔍 发现缺失的依赖,准备自动安装...
是否继续自动安装缺失的依赖?(y/n): y
🚀 开始自动安装缺失的依赖...
📦 正在安装 tesseract...
命令:brew install tesseract tesseract-lang
安装进度:
────────────────────────────────────────────────────────────
... (安装过程)
────────────────────────────────────────────────────────────
✅ tesseract 安装成功!
跨平台支持:
- ✅ macOS: 使用
brew 自动安装
- ✅ Linux (Ubuntu/Debian): 使用
apt-get 自动安装(需要 sudo)
- ✅ Windows: 尝试使用
choco (Chocolatey) 自动安装,失败时提供手动安装指引
方式 1: CLI 命令行(文件夹)
# 审核文件夹中的所有文档
node <技能路径>/src/index.js <许可证文件夹路径>
# 示例(使用内置 demo 文件夹)
node ./src/index.js ../references/demo/test
方式 2: CLI 命令行(压缩包)
# 审核压缩包(zip/rar/tar.gz)
node <技能路径>/src/index.js <许可证压缩包路径>
# 示例(使用内置 demo 压缩包)
node ./src/index.js ../references/demo/test.zip
方式 3: 对话交互(推荐)
使用步骤:
- 在对话界面输入触发词,如:
审核/ 审核许可证 / 许可证( 触发词可在 references/settings.json 中配置 )
- 上传许可证压缩包(zip/rar/tar.gz)或 许可证文件夹(也可发送压缩包或文件夹的路径)
- 系统自动解压、提取、审核、生成报告
- 返回 Markdown 表格和 JSON 报告下载链接
输出:
- JSON 报告:
audit-result-<timestamp>.json
- Markdown 表格:
audit-result-<timestamp>.md
支持的输入格式
压缩包格式
- ZIP:
.zip
- RAR:
.rar
- TAR:
.tar, .tar.gz, .tgz
文档格式
- PDF:
.pdf
- 图片:
.jpg, .jpeg, .png, .webp
支持的文档类型
- 合同 (contract) - 包含"Contract"、"合同"等关键词
- 合格证 (certificate) - 包含"Quality Certificate"、"质量合格证书"等
- 许可证表单 (permitform) - 包含"Import/Export"、"许可证"等
字段提取
| 字段 | 说明 | 文档类型 |
|---|
| contractNo | 合同编号 | contract, form |
| exportCountry | 出口国家 | contract, form |
| importerEn | 进口商英文 | contract, form |
| importerCn | 进口商中文 | contract, form |
| customsPort | 报关口岸 | form |
| mtcNo | 合格证编号 | certificate, form |
| manufacturer | 生产厂商 | certificate, form |
| bussDetial | 货物详情数组 | contract, form |
| totalAmount | 总金额 | contract, form |
| totalQuantity | 总数量 | contract, form |
| totalWeight | 总重量 | contract, form |
| hasStamp | 是否盖章 | certificate |
审核规则(11 条)
- 盖章检查
- 合同号提取验证
- 出口国检查
- 进口商检查
- 金额检查(±5% 容忍度)
- 数量检查(±5% 容忍度)
- 重量检查
- 合格证编号检查
- 生产商检查
- 报关口岸检查
- 整体结果
输出格式
⚠️ 重要:Markdown 表格发送方式(企业微信/飞书/所有聊天平台)
核心要求:在对话交互模式(压缩包/文件夹上传)下,必须执行以下流程:
- 脚本生成报告:
index.js 生成 JSON 和 MD 报告文件
- 助手读取 MD 文件:脚本执行完成后,助手必须直接读取生成的
.md 文件内容
- 直接发送 Markdown:助手将 MD 文件内容原样作为 Markdown 发送到聊天界面(企业微信/飞书/其他平台)
- 不要通过
console.log 或 console.error 输出表格
- 不要只返回文件路径
- 必须读取文件内容并作为 Markdown 消息发送
- 平台兼容性:此方式适用于所有聊天平台(企业微信、飞书、Telegram、Discord 等),确保 Markdown 表格正确渲染
原因:
console.log/error 输出的内容会被当作纯文本处理,Markdown 格式丢失
- 只返回文件路径,聊天界面无法自动渲染
- 只有直接发送 Markdown 内容,各平台才能正确渲染为表格
实现方式:
# 脚本执行后,助手执行:
md_file=$(ls -t assets/reports/audit-result-*.md | head -1)
cat "$md_file" # 读取并发送内容
1. Markdown 表格(压缩包模式)
在聊天界面或控制台直接显示二维表格:
| 检查项 | 申请表 | 合同/合格证 | 预审结果 |
|---|
| 合同编号 | AFT250890 | AFT250890 | ✅ 通过 |
| 出口国 | 中国 | 中国 | ✅ 通过 |
| 进口商(英文) | Stock Company | Stock Company | ✅ 通过 |
| 总金额 | 47060 | ¥47,060.00 | ✅ 通过 |
| 总数量 | 180千克 | 1 lot | ❌不通过 |
| 合格证编号 | 2025032601,028119877 | 2025032601 | ✅ 通过 |
| 生产商 | 江苏国强镀锌实业有限公司 | 江苏国强镀锌实业有限公司 | ✅ 通过 |
| 盖章情况 | 已盖章 | 已盖章 | ✅ 通过 |
横向: 申请表 | 合同/合格证 | 预审结果
纵向: 9 个检查项(合同编号、出口国、进口商、总金额、总数量、合格证编号、生产商、报关口岸、盖章情况)
上面是表格,表格下面是 整体结果 和 详细审核说明。
2. JSON 报告(完整详细信息)
{
"timestamp": "2026-04-13T06:01:19.853Z",
"folder": "../references/demo/test",
"totalFiles": 3,
"processedFiles": 3,
"auditResults": [
{
"filename": "SC NO.JYIE-2025-137.pdf",
"docType": "合同",
"extractedFields": {
"contractNo": "JYIE-2025-137",
"exportCountry": "中国",
"importerEn": "RAMATEX TEXTILES INDUSTRIAL SDN,BHD",
"importerCn": "马来西亚利玛纺织有限公司",
"totalAmount": "CNY980,000.00",
"totalQuantity": "1 lot",
"totalWeight": "",
"bussDetial": [
{
"commodity": "Air condition system 空调系统",
"quantity": "1 lot",
"weight": "",
"unitPrice": "980000 CNY",
"amount": "980000 CNY"
}
]
},
"hasStamp": true
},
{
"filename": "angle bar.jpg",
"docType": "合格证",
"extractedFields": {
"mtcNo": "2025032601",
"manufacturer": "江苏国强镀锌实业有限公司"
},
"hasStamp": true
},
{
"filename": "b699b609-cfa3-4de1-bc16-65a65d6f2ab8.png",
"docType": "申请表",
"extractedFields": {
"contracNo": "JYIE-2025-137",
"exportCountry": "中国",
"importerCn": "马来西亚利玛纺织有限公司",
"importerEn": "RAMATEX TEXTILES INDUSTRIAL SDN BHD",
"customsPort": "上海海关",
"bussDetial": [
{
"commodity": "角钢(除名加工外未经进一步加工)",
"quantity": "180 千克",
"unitPrice": "55 人民币元",
"amount": "990 人民币元"
}
],
"totalAmount": "980000 人民币元",
"totalQuantity": "180 千克",
"mtcNo": "2025032601,028119877",
"manufacturer": "江苏国强镀锌实业有限公司"
},
"hasStamp": true
}
],
"auditSummary": {
"reviewResult": "整体审核结果:建议不通过",
"reviewDetail": "1. 合同编号一致:JYIE-2025-137\n2. 出口国一致:中国\n3. 进口商英文名称一致:RAMATEX TEXTILES INDUSTRIAL SDN,BHD\n5. 合格证编号一致:2025032601\n6. 生产商信息一致:江苏国强镀锌实业有限公司\n7. 货物详情不一致\n8. 价格总计高度相似:CNY980,000.00 vs 980000 人民币元\n9. 货物总量不一致\n\n不通过项共 2 项。",
"sign": {
"reviewResult": "通过",
"reviewDetail": "合同已盖章。合格证已盖章"
},
"contracNo": {
"reviewResult": "通过",
"reviewDetail": {
"formdata": "JYIE-2025-137",
"attachdata": "JYIE-2025-137"
}
},
"exporter": {
"reviewResult": "建议通过,需人工复审",
"reviewDetail": {
"formdata": "中国",
"customsPort": "上海海关",
"attachdata": "中国"
},
"note": "出口国为中国,报关口岸非保税区,需复核。"
},
"importerEn": {
"reviewResult": "通过",
"reviewDetail": {
"formdata": "RAMATEX TEXTILES INDUSTRIAL SDN BHD",
"attachdata": "RAMATEX TEXTILES INDUSTRIAL SDN,BHD"
},
"note": "进口商名称高度相似(空格/后缀差异),视为一致"
},
"bussDetial": {
"reviewResult": "不通过",
"reviewDetail": {
"formdata": "未匹配",
"attachdata": "未匹配"
}
},
"totalAmount": {
"reviewResult": "建议通过,需人工复审",
"reviewDetail": {
"formdata": "980000 人民币元",
"attachdata": "CNY980,000.00"
},
"note": "金额高度相似,建议通过但需人工确认"
},
"totalQuantity": {
"reviewResult": "不通过",
"reviewDetail": {
"formdata": "180 千克",
"attachdata": "1 lot"
},
"note": "数量不一致"
},
"mtcNo": {
"reviewResult": "通过",
"reviewDetail": {
"formdata": "2025032601,028119877",
"attachdata": "2025032601"
},
"note": "申请表包含多个合格证编号"
},
"manufacturer": {
"reviewResult": "通过",
"reviewDetail": {
"formdata": "江苏国强镀锌实业有限公司",
"attachdata": "江苏国强镀锌实业有限公司"
}
}
}
}
技能特性
- ✅ 智能依赖安装:自动检测操作系统,自动安装缺失依赖(poppler、tesseract、pdfplumber),同事无需手动安装
- ✅ 混合模式盖章检测:LLM 优先 + OCR 关键词校准
- ✅ 智能金额识别:自动识别 "CNY980,000.00" 与 "980000 人民币元",美元、日元等类似 金额中英文单元前后判断
- ✅ 相似性检测增强:数据比对相似值识别,酌情判定:"建议通过,需人工复审"
- ✅ 印章识别增强:支持圆形、半圆形、长方形、正方形、红色、蓝色印章,LLM 优先 + OCR + 正则 多重识别
- ✅ 编号易混字符标准化:合格证编号: 易混淆字符标准化(8-B, 0-O, 1-I, 3-E, 5-S, 2-Z, 7-T)
- ✅ 压缩包支持:自动解压 zip/rar/tar.gz,验证文件类型
- ✅ 二维表格输出:Markdown 表格直观展示审核结果
- ✅ 多模式触发:CLI 命令行 + 对话交互(输入触发词后上传文件)
- ✅ 触发词可配置:在
references/settings.json 中自定义触发词(跨平台通用)
- ✅ 安全配置:LLM 敏感信息自动从 OpenClaw 配置读取,加密存储,内存缓存