mcpField
N
n8n-workflow-automation

n8n-workflow-automation

github.com/datadrivenconstruction生产力377111 次安装2 周前更新
代码仓库

关于 n8n-workflow-automation

面向建筑行业的 n8n 工作流自动化技能,用于连接系统并自动执行重复流程。示例涵盖 Revit 到预算的流程、BIM 变更检测、工程量提取和项目报告。

主要功能

  1. 01使用 n8n 进行可视化工作流自动化
  2. 02Revit 导出到预算流程
  3. 03BIM 模型变更检测
  4. 04工程量提取与成本匹配
  5. 05定时生成项目报告

适用场景

  1. 01将 Revit 导出文件转换为预算数据
  2. 02检测 IFC 模型文件夹中的变更
  3. 03汇总每日项目状态报告
  4. 04将建筑构件与单价匹配

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/datadrivenconstruction/ddc_skills_for_ai_agents_in_construction --skill n8n-workflow-automation

安装后在 Claude Code 中输入/n8n-workflow-automation确认已加载。

附带文件claw.jsoninstructions.md

详细介绍

面向建筑行业的 n8n 工作流自动化

概述

此技能使用 n8n 实现建筑流程的可视化工作流自动化。自动处理重复任务、集成系统,并构建“从项目到预算”的流程,无需大量编程。

灵感源自 DDC 方法论——自动化 BIM 模型与成本估算之间的衔接。

“自动化‘从项目到预算’的流程,可将预算编制时间从数周缩短到数小时。” — DDC LinkedIn 帖子

快速入门

安装 n8n
# Using Docker (recommended)
docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  -v ~/.n8n:/home/node/.n8n \
  n8nio/n8n

# Using npm
npm install n8n -g
n8n start

# Access at: http://localhost:5678

建筑工作流示例

1. Revit 到预算的流程
{
  "name": "Revit to Budget Automation",
  "nodes": [
    {
      "name": "Watch Revit Export Folder",
      "type": "n8n-nodes-base.localFileTrigger",
      "parameters": {
        "path": "/data/revit_exports",
        "events": ["add"],
        "fileExtension": ".xlsx"
      }
    },
    {
      "name": "Read Excel Data",
      "type": "n8n-nodes-base.readWriteFile",
      "parameters": {
        "operation": "read",
        "filePath": "={{ $json.fileName }}"
      }
    },
    {
      "name": "Parse BIM Elements",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "language": "python",
        "code": "import pandas as pd\nimport json\n\ndf = pd.read_excel(items[0].binary.data)\n\nelements = df.to_dict('records')\n\nreturn [{'json': {'elements': elements, 'count': len(elements)}}]"
      }
    },
    {
      "name": "Match to Unit Prices",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "http://api.construction-prices.com/match",
        "method": "POST",
        "body": "={{ JSON.stringify($json.elements) }}"
      }
    },
    {
      "name": "Calculate Costs",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "language": "javascript",
        "code": "const elements = items[0].json.elements;\n\nlet totalCost = 0;\nconst costBreakdown = [];\n\nfor (const elem of elements) {\n  const cost = elem.quantity * elem.unit_price;\n  totalCost += cost;\n  costBreakdown.push({\n    category: elem.category,\n    quantity: elem.quantity,\n    unit_price: elem.unit_price,\n    total: cost\n  });\n}\n\nreturn [{\n  json: {\n    total_cost: totalCost,\n    breakdown: costBreakdown\n  }\n}];"
      }
    },
    {
      "name": "Generate Report",
      "type": "n8n-nodes-base.spreadsheetFile",
      "parameters": {
        "operation": "create",
        "fileName": "cost_estimate_{{ $now.format('yyyy-MM-dd') }}.xlsx"
      }
    },
    {
      "name": "Send Email Notification",
      "type": "n8n-nodes-base.emailSend",
      "parameters": {
        "to": "[email protected]",
        "subject": "New Cost Estimate Generated",
        "text": "Total estimate: ${{ $json.total_cost }}"
      }
    }
  ]
}
2. 每日项目报告自动化
{
  "name": "Daily Project Report",
  "nodes": [
    {
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.cron",
      "parameters": {
        "cronExpression": "0 6 * * 1-5"
      }
    },
    {
      "name": "Fetch Project Data",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "{{ $env.PROJECT_API }}/status",
        "method": "GET"
      }
    },
    {
      "name": "Fetch Weather Data",
      "type": "n8n-nodes-base.httpRequest",
      "parameters": {
        "url": "https://api.openweathermap.org/data/2.5/weather",
        "qs": {
          "q": "{{ $json.project_location }}",
          "appid": "{{ $env.WEATHER_API_KEY }}"
        }
      }
    },
    {
      "name": "Generate Report",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "language": "javascript",
        "code": "const project = items[0].json;\nconst weather = items[1].json;\n\nconst report = {\n  date: new Date().toISOString().split('T')[0],\n  project_name: project.name,\n  progress: project.progress_pct,\n  weather: {\n    condition: weather.weather[0].main,\n    temp: Math.round(weather.main.temp - 273.15)\n  },\n  tasks_today: project.scheduled_tasks,\n  blockers: project.blockers || []\n};\n\nreturn [{ json: report }];"
      }
    },
    {
      "name": "Post to Slack",
      "type": "n8n-nodes-base.slack",
      "parameters": {
        "channel": "#project-updates",
        "text": "📊 Daily Report - {{ $json.project_name }}\n\nProgress: {{ $json.progress }}%\n🌡️ Weather: {{ $json.weather.condition }} ({{ $json.weather.temp }}°C)\n\nToday's Tasks:\n{{ $json.tasks_today.join('\\n') }}"
      }
    }
  ]
}
3. BIM 模型变更检测
{
  "name": "BIM Change Detection",
  "nodes": [
    {
      "name": "Watch IFC Folder",
      "type": "n8n-nodes-base.localFileTrigger",
      "parameters": {
        "path": "/models",
        "events": ["change"],
        "fileExtension": ".ifc"
      }
    },
    {
      "name": "Extract Model Data",
      "type": "n8n-nodes-base.executeCommand",
      "parameters": {
        "command": "python /scripts/extract_ifc.py {{ $json.fileName }}"
      }
    },
    {
      "name": "Compare with Previous",
      "type": "n8n-nodes-base.code",
      "parameters": {
        "language": "python",
        "code": "import json\n\ncurrent = json.loads(items[0].json.output)\nprevious = load_previous_version()\n\nchanges = {\n  'added': [],\n  'modified': [],\n  'deleted': []\n}\n\n# Compare logic\nfor elem in current:\n  if elem['id'] not in previous:\n    changes['added'].append(elem)\n  elif elem != previous[elem['id']]:\n    changes['modified'].append(elem)\n\nfor elem_id in previous:\n  if elem_id not in [e['id'] for e in current]:\n    changes['deleted'].append(previous[elem_id])\n\nreturn [{'json': changes}]"
      }
    },
    {
      "name": "Update Database",
      "type": "n8n-nodes-base.postgres",
      "parameters": {
        "operation": "executeQuery",
        "query": "INSERT INTO model_changes (timestamp, changes) VALUES (NOW(), '{{ JSON.stringify($json) }}')"
      }
    },
    {
      "name": "Notify Team",
      "type": "n8n-nodes-base.microsoftTeams",
      "parameters": {
        "message": "🔔 Model Updated\n\n+{{ $json.added.length }} elements added\n📝 {{ $json.modified.length }} elements modified\n-{{ $json.deleted.length }} elements deleted"
      }
    }
  ]
}

常见工作流模式

数据提取模式
// n8n Code Node - Extract BIM Quantities
const xlsx = require('xlsx');

// Read uploaded file
const workbook = xlsx.read(items[0].binary.data, { type: 'buffer' });
const sheetName = workbook.SheetNames[0];
const data = xlsx.utils.sheet_to_json(workbook.Sheets[sheetName]);

// Process BIM elements
const quantities = {};
for (const row of data) {
  const category = row['Category'] || 'Unknown';
  const volume = parseFloat(row['Volume']) || 0;

  if (!quantities[category]) {
    quantities[category] = { count: 0, volume: 0 };
  }
  quantities[category].count++;
  quantities[category].volume += volume;
}

return [{ json: { quantities, total_elements: data.length } }];
成本匹配模式
// n8n Code Node - Match elements to unit prices
const elements = items[0].json.elements;
const priceDatabase = $env.PRICE_DATABASE;

const matched = [];

for (const elem of elements) {
  // Fuzzy match description to price items
  const match = await $http.post(`${priceDatabase}/search`, {
    query: elem.description,
    category: elem.category
  });

  matched.push({
    ...elem,
    matched_item: match.data.best_match,
    unit_price: match.data.unit_price,
    confidence: match.data.confidence
  });
}

return [{ json: { matched_elements: matched } }];
报告生成模式
// n8n Code Node - Generate PDF Report
const PDFDocument = require('pdfkit');

const doc = new PDFDocument();
const buffers = [];

doc.on('data', buffers.push.bind(buffers));

// Header
doc.fontSize(20).text('Cost Estimate Report', { align: 'center' });
doc.moveDown();

// Project Info
doc.fontSize(12).text(`Project: ${items[0].json.project_name}`);
doc.text(`Date: ${new Date().toLocaleDateString()}`);
doc.moveDown();

// Cost Summary
doc.fontSize(14).text('Cost Summary', { underline: true });
for (const [category, cost] of Object.entries(items[0].json.costs)) {
  doc.fontSize(10).text(`${category}: $${cost.toLocaleString()}`);
}

doc.end();

return new Promise(resolve => {
  doc.on('end', () => {
    resolve([{
      json: { success: true },
      binary: {
        data: Buffer.concat(buffers).toString('base64'),
        fileName: 'cost_report.pdf',
        mimeType: 'application/pdf'
      }
    }]);
  });
});

集成节点

适用于建筑行业的实用 n8n 节点
Data Sources:
  - Google Sheets: Project tracking, cost databases
  - Airtable: Element databases, issue tracking
  - PostgreSQL: BIM databases, project data
  - HTTP Request: API integrations

File Processing:
  - Read/Write File: Excel, CSV, JSON
  - Execute Command: Python scripts, CLI tools
  - Code: Custom processing logic

Communication:
  - Slack: Team notifications
  - Microsoft Teams: Project updates
  - Email: Reports, alerts
  - Telegram: Mobile notifications

Cloud Storage:
  - AWS S3: Model storage
  - Google Drive: Document sharing
  - Dropbox: File sync

工作流模板

模板:QTO 到 Excel
{
  "workflow": "QTO Extraction",
  "trigger": "Manual/Webhook",
  "steps": [
    "Receive IFC file",
    "Extract quantities (Python/IfcOpenShell)",
    "Group by category",
    "Add unit prices",
    "Calculate totals",
    "Generate Excel report",
    "Upload to cloud storage",
    "Send notification"
  ]
}
模板:每日状态收集
{
  "workflow": "Daily Status",
  "trigger": "Cron (6:00 AM)",
  "steps": [
    "Fetch project status from API",
    "Get weather forecast",
    "Check scheduled tasks",
    "Compile daily report",
    "Post to Slack/Teams",
    "Email to stakeholders"
  ]
}

最佳实践

1. **Error Handling**
   - Always add error branches
   - Log failures to database
   - Send alerts on critical failures

2. **Data Validation**
   - Validate input data format
   - Check for required fields
   - Handle missing values gracefully

3. **Performance**
   - Use batch processing for large datasets
   - Implement pagination for API calls
   - Cache frequently used data

4. **Security**
   - Store credentials in environment variables
   - Use encryption for sensitive data
   - Implement access controls

快速参考

工作流类型触发器常用节点
文件处理文件触发器Code、HTTP、Spreadsheet
定时报告CronHTTP、Code、Email
数据同步WebhookDatabase、API、Code
通知多种Slack、Teams、Email

资源

后续步骤

  • 有关基于代码的数据管道,请参阅 etl-pipeline
  • 有关 AI 驱动的自动化,请参阅 llm-data-automation
  • 有关智能文档搜索,请参阅 vector-search

评论

支持 Markdown