The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "\u4fe1\u606f\u63d0\u53d6\u9898\u76ee\u51fa\u9898\u5de5\u4f5c\u6d41",
"nodes": [
{
"parameters": {},
"id": "node-trigger",
"name": "\u5f00\u59cb\u51fa\u9898",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
300
]
},
{
"parameters": {
"text": "# \u4fe1\u606f\u63d0\u53d6\u9898\u76ee\u51fa\u9898\u5de5\u4f5c\u6d41\n\u6309\u516d\u6b65\u6cd5\u987a\u5e8f\u51fa\u9898\uff0c\u6bcf\u6b65\u5b8c\u6210\u540e\u9700\u4eba\u5de5\u5ba1\u6838\u3002\n\u5ba1\u6838\u4e0d\u901a\u8fc7\u81ea\u52a8\u9000\u56de\u91cd\u505a\uff08\u4e0a\u9650 3 \u6b21\uff09\u3002\n\n## \u516d\u6b65 + \u6e05\u5355\n1. \u9009\u5b9a\u7d20\u6750\u4e0e\u5b57\u6bb5\n2. \u5b9a\u7edf\u4e00\u5199\u6cd5\n3. \u6536\u96c6\u7d20\u6750\n4. \u5236\u4f5c\u6807\u51c6\u7b54\u6848\n5. \u5199\u9898\u76ee\u8981\u6c42\n6. \u6807\u51c6\u7b54\u6848 + \u6253\u5206\u8bf4\u660e\n7. \u63d0\u4ea4\u524d\u68c0\u67e5\u6e05\u5355"
},
"id": "node-sticky-intro",
"name": "\u6d41\u7a0b\u8bf4\u660e",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
200,
80
]
},
{
"parameters": {
"values": {
"string": [
{
"name": "step",
"value": "1"
},
{
"name": "retryCount",
"value": "0"
},
{
"name": "maxRetries",
"value": "3"
}
]
},
"options": {}
},
"id": "node-init",
"name": "\u521d\u59cb\u5316\u9898\u76ee\u6570\u636e",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
400,
300
]
},
{
"parameters": {
"jsCode": "const step = $input.first().json.step;\nconst retryCount = $input.first().json.retryCount || 0;\n\nconst stepNames = {\n '1': '\u9009\u5b9a\u7d20\u6750\u4e0e\u5b57\u6bb5',\n '2': '\u5b9a\u7edf\u4e00\u5199\u6cd5',\n '3': '\u6536\u96c6\u7d20\u6750',\n '4': '\u5236\u4f5c\u6807\u51c6\u7b54\u6848',\n '5': '\u5199\u9898\u76ee\u8981\u6c42',\n '6': '\u6807\u51c6\u7b54\u6848+\u6253\u5206\u8bf4\u660e',\n '7': '\u63d0\u4ea4\u524d\u68c0\u67e5\u6e05\u5355'\n};\n\nconst stepDescriptions = {\n '1': '\u9009\u4e00\u7c7b\u5e26\u56fa\u5b9a\u5185\u5bb9\u7684\u7d20\u6750\uff08\u53d1\u7968/\u540d\u7247/\u5feb\u9012\u5355\u7b49\uff09\uff0c\u5b9a3-7\u4e2a\u8981\u63d0\u53d6\u7684\u5b57\u6bb5\u3002\u8981\u6c42\uff1a\u660e\u786e\u3001\u770b\u5f97\u5230\u3001\u6570\u91cf\u9002\u4e2d\u3001\u6709\u7edf\u4e00\u5199\u6cd5\u3002',\n '2': '\u4e3a\u6bcf\u4e2a\u5b57\u6bb5\u5b9a\u7edf\u4e00\u5199\u6cd5\uff1a\u65e5\u671f\u2192YYYY-MM-DD\uff0c\u91d1\u989d\u2192\u7eaf\u6570\u5b57\u4e0d\u542b\u5355\u4f4d\uff0c\u7535\u8bdd\u2192\u53bb\u7a7a\u683c\u7eaf\u6570\u5b57\uff0c\u6587\u672c\u2192\u53bb\u524d\u540e\u7a7a\u683c\uff0c\u56fe\u91cc\u6ca1\u6709\u2192\u7559\u7a7a\u4e0d\u7f16\u9020\u3002\u628a\u8fd9\u4e9b\u5199\u4e0b\u6765\u3002',\n '3': '\u6309\u5b9a\u597d\u7684\u5b57\u6bb5\u6536\u96c6\u7d20\u6750\u3002\u7b80\u535515-20\u5f20/\u4e2d\u7b4920-40\u5f20/\u56f0\u96be40+\u5f20\u3002\u8986\u76d6\u4e0d\u540c\u6837\u5f0f\uff0c\u542b\u5c0f\u5b57/\u624b\u5199/\u906e\u6321/\u7f3a\u9879\u7b49\u96be\u4f8b\u3002\u7edf\u4e00\u547d\u540d\u4e3aimg_001.png...\u6ce8\u610f\u5408\u89c4\u3002',\n '4': '\u9010\u5f20\u8bfb\u56fe\uff0c\u6309\u7edf\u4e00\u5199\u6cd5\u9010\u9879\u586b\u6807\u51c6\u7b54\u6848\u3002\u56fe\u91cc\u6ca1\u6709\u7684\u7559\u7a7a\u3002\u5b57\u7cca/\u906e\u6321\u8981\u653e\u5927\u786e\u8ba4\uff0c\u8bfb\u4e0d\u51fa\u5c31\u7559\u7a7a\u5e76\u8bb0\u5f55\u3002\u91cd\u8981\u9898\u627e\u7b2c\u4e8c\u4eba\u6838\u5bf9\u3002',\n '5': '\u5199\u6e05\u4e94\u4ef6\u4e8b\uff1a\u505a\u4ec0\u4e48\u3001\u8bfb\u54ea\u51e0\u9879\u3001\u7edf\u4e00\u5199\u6cd5\u3001\u5904\u7406\u54ea\u4e9b\u56fe\u3001\u7b54\u6848\u683c\u5f0f\u3002\u9644\u6a21\u677f\u5f00\u5934\uff0c\u660e\u786e\u8981\u6c42\"\u5904\u7406\u5168\u90e8\u56fe\u7247\u3001\u627e\u4e0d\u5230\u7559\u7a7a\u4e0d\u8981\u7f16\u9020\"\u3002',\n '6': '\u786e\u8ba4\u6807\u51c6\u7b54\u6848\u8986\u76d6\u5168\u90e8\u56fe\u7247\u5168\u90e8\u5b57\u6bb5\u3002\u5199\u6253\u5206\u8bf4\u660e\uff1a\u9010\u9879\u7edf\u4e00\u5199\u6cd5\u6bd4\u5bf9\uff0c\u51c6\u786e\u7387=\u7b54\u5bf9\u00f7\u603b\u6570\u3002\u53ca\u683c\u7ebf\u5efa\u8bae\u7b80\u53550.95/\u4e2d\u7b490.9/\u56f0\u96be0.85\u3002',\n '7': '\u9010\u6761\u6253\u52fe\uff1a\u5b57\u6bb5\u660e\u786e\u2713 \u7edf\u4e00\u5199\u6cd5\u5df2\u5b9a\u4e14\u5199\u5165\u8981\u6c42\u2713 \u56fe\u7247\u8986\u76d6\u591a\u6837\u542b\u96be\u4f8b\u2713 \u56fe\u7247\u540d\u7edf\u4e00\u2713 \u6807\u51c6\u7b54\u6848\u9010\u5f20\u9010\u9879\u6838\u5bf9\u2713 \u9898\u76ee\u8981\u6c42\u5199\u6e05\u4e94\u4ef6\u4e8b\u2713 \u6253\u5206\u8bf4\u660e\u542b\u89c4\u5219\u548c\u53ca\u683c\u7ebf\u2713'\n};\n\nconst stepTasks = {\n '1': '\u2022 \u9009\u5b9a\u7d20\u6750\u7c7b\u578b\uff08\u53d1\u7968/\u540d\u7247/\u5feb\u9012\u5355/\u8425\u4e1a\u6267\u7167/\u5546\u54c1\u6807\u7b7e\u2026\uff09\\n\u2022 \u5217\u51fa3-7\u4e2a\u8981\u63d0\u53d6\u7684\u5b57\u6bb5\\n\u2022 \u786e\u8ba4\u6bcf\u4e2a\u5b57\u6bb5\u90fd\u80fd\u4ece\u56fe\u4e2d\u8bfb\u5230\\n\u2022 \u786e\u8ba4\u5b57\u6bb5\u65e0\u6b67\u4e49',\n '2': '\u2022 \u65e5\u671f\u683c\u5f0f\u7edf\u4e00\uff08YYYY-MM-DD / YYYY\u5e74MM\u6708DD\u65e5\uff09\\n\u2022 \u91d1\u989d\u683c\u5f0f\u7edf\u4e00\uff08\u7eaf\u6570\u5b57 / \u542b\u5355\u4f4d / \u5c0f\u6570\u4f4d\uff09\\n\u2022 \u7535\u8bdd\u683c\u5f0f\u7edf\u4e00\uff08\u53bb\u7a7a\u683c / \u4fdd\u7559\u5206\u9694\u7b26\uff09\\n\u2022 \u660e\u786e\"\u56fe\u91cc\u6ca1\u6709\u5c31\u7559\u7a7a\uff0c\u4e0d\u7f16\u9020\"\\n\u2022 \u628a\u7edf\u4e00\u5199\u6cd5\u8bb0\u5f55\u4e0b\u6765\uff0c\u540e\u7eed\u5199\u5165\u9898\u76ee\u8981\u6c42',\n '3': '\u2022 \u6309\u5b57\u6bb5\u6536\u96c6\u56fe\u7247\\n\u2022 \u786e\u5b9a\u96be\u5ea6\uff1a\u7b80\u535515-20\u5f20 / \u4e2d\u7b4920-40\u5f20 / \u56f0\u96be40+\u5f20\\n\u2022 \u8986\u76d6\u4e0d\u540c\u6837\u5f0f\u548c\u6765\u6e90\\n\u2022 \u542b\u5c0f\u5b57\u3001\u624b\u5199\u3001\u906e\u6321\u3001\u7f3a\u9879\u7b49\u96be\u4f8b\\n\u2022 \u7edf\u4e00\u547d\u540d img_001.png, img_002.png \u2026\\n\u2022 \u5408\u89c4\uff1a\u4e0d\u7528\u771f\u5b9e\u9690\u79c1/\u672a\u6388\u6743\u56fe\u7247',\n '4': '\u2022 \u9010\u5f20\u6253\u5f00\u56fe\u7247\\n\u2022 \u6309\u7edf\u4e00\u5199\u6cd5\u9010\u9879\u8bfb\u51fa\u5185\u5bb9\\n\u2022 \u586b\u5165\u7ed3\u6784\u5316\u8868\u683c\\n\u2022 \u56fe\u91cc\u6ca1\u6709\u7684\u9879\u7559\u7a7a\\n\u2022 \u5b57\u7cca/\u88ab\u906e\u6321 \u2192 \u653e\u5927\u786e\u8ba4 \u2192 \u8bfb\u4e0d\u51fa\u5c31\u7559\u7a7a\u5e76\u8bb0\u5f55\\n\u2022 \u91cd\u8981\u9898\u76ee\u627e\u7b2c\u4e8c\u4eba\u6838\u5bf9',\n '5': '\u2022 \u5199\u573a\u666f\u8bf4\u660e\uff08\"\u4f60\u662f\u4e00\u540dXX\u52a9\u624b\"\uff09\\n\u2022 \u5199\u56fe\u7247\u8def\u5f84\uff08/workspace/inputs/\uff09\\n\u2022 \u9010\u9879\u5217\u51fa\u8981\u63d0\u53d6\u7684\u5b57\u6bb5\u53ca\u683c\u5f0f\u8981\u6c42\\n\u2022 \u5199\u6e05\"\u5904\u7406\u5168\u90e8\u56fe\u7247\uff0c\u4e0d\u8981\u9057\u6f0f\"\\n\u2022 \u5199\u6e05\"\u627e\u4e0d\u5230\u7559\u7a7a\uff0c\u4e0d\u8981\u7f16\u9020\"\\n\u2022 \u5bf9\u7167\u7b2c2\u6b65\u7edf\u4e00\u5199\u6cd5\uff0c\u786e\u4fdd\u4e00\u81f4',\n '6': '\u2022 \u786e\u8ba4\u6807\u51c6\u7b54\u6848\u8986\u76d6\u5168\u90e8\u56fe\u7247\u3001\u5168\u90e8\u5b57\u6bb5\\n\u2022 \u786e\u8ba4\u7edf\u4e00\u5199\u6cd5\u4e0e\u6807\u51c6\u7b54\u6848\u4e00\u81f4\\n\u2022 \u5199\u6253\u5206\u8bf4\u660e\uff1a\u9010\u9879\u6bd4\u5bf9\u89c4\u5219\\n\u2022 \u8bbe\u53ca\u683c\u7ebf\uff1a\u7b80\u53550.95 / \u4e2d\u7b490.9 / \u56f0\u96be0.85\\n\u2022 \u6709\u7279\u6b8a\u89c4\u5219\uff08\u5982\u00b10.01\u8bef\u5dee\uff09\u4e00\u5e76\u5199\u6e05',\n '7': '\u2610 \u5b57\u6bb5\u660e\u786e\u3001\u6bcf\u9879\u90fd\u80fd\u5728\u56fe\u91cc\u8bfb\u5230\\n\u2610 \u7edf\u4e00\u5199\u6cd5\u5df2\u5b9a\u5e76\u5199\u5165\u9898\u76ee\u8981\u6c42\\n\u2610 \u56fe\u7247\u8986\u76d6\u4e0d\u540c\u6837\u5f0f\uff0c\u542b\u82e5\u5e72\u96be\u4f8b\\n\u2610 \u56fe\u7247\u540d\u7edf\u4e00\uff0c\u4e0e\u6807\u51c6\u7b54\u6848\u5bf9\u5f97\u4e0a\\n\u2610 \u6807\u51c6\u7b54\u6848\u9010\u5f20\u9010\u9879\u6838\u5bf9\uff0c\u7f3a\u9879\u7559\u7a7a\\n\u2610 \u9898\u76ee\u8981\u6c42\u5199\u6e05\u4e94\u4ef6\u4e8b\\n\u2610 \u6807\u51c6\u7b54\u6848\u586b\u5168\uff0c\u6253\u5206\u8bf4\u660e\u542b\u89c4\u5219\u548c\u53ca\u683c\u7ebf'\n};\n\nreturn [{\n json: {\n step: step,\n retryCount: retryCount,\n stepName: stepNames[step] || '\u5168\u90e8\u5b8c\u6210',\n stepDescription: stepDescriptions[step] || '',\n stepTasks: stepTasks[step] || ''\n }\n}];"
},
"id": "node-prepare-step",
"name": "\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
600,
300
]
},
{
"parameters": {
"text": "={{ $json.step === '8' ? '## \ud83c\udf89 \u5168\u90e8\u6b65\u9aa4\u5b8c\u6210\uff01\n\u9898\u76ee\u5df2\u901a\u8fc7\u5168\u90e8\u5ba1\u6838\u548c\u68c0\u67e5\u6e05\u5355\uff0c\u53ef\u4ee5\u63d0\u4ea4\u4e86\u3002\n\n**\u63d0\u4ea4\u786e\u8ba4\uff1a**\n\u2022 \u9898\u76eeID\u5df2\u5b9a \u2022 \u540d\u79f0\u5df2\u5b9a \u2022 \u6807\u7b7e\u5df2\u9009\n\u2022 \u4efb\u52a1\u6307\u4ee4\u5df2\u5199 \u2022 \u9644\u4ef6\u5df2\u4e0a\u4f20\n\u2022 \u6807\u51c6\u7b54\u6848\u5df2\u586b \u2022 \u6253\u5206\u8bf4\u660e\u5df2\u5199' : '## \ud83d\udccb \u7b2c' + $json.step + '\u6b65\uff1a' + $json.stepName + '\n\n**\u672c\u6b65\u76ee\u6807\uff1a**\n' + $json.stepDescription + '\n\n**\u5177\u4f53\u4efb\u52a1\uff1a**\n' + $json.stepTasks + '\n\n---\n### \u5b8c\u6210\u540e\u901a\u8fc7 Webhook \u63d0\u4ea4\u5ba1\u6838\n```\nPOST <\u672c\u5de5\u4f5c\u6d41Webhook URL>\n{\n \"step\": \"' + $json.step + '\",\n \"action\": \"approve\",\n \"comment\": \"\u901a\u8fc7\u7406\u7531\uff08\u53ef\u9009\uff09\"\n}\n```\n\u4e0d\u901a\u8fc7\u65f6\u5c06 action \u6539\u4e3a \"reject\" \u5e76\u9644\u539f\u56e0\u3002' }}"
},
"id": "node-sticky-step-info",
"name": "\u5f53\u524d\u6b65\u9aa4\u8be6\u60c5",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
600,
80
]
},
{
"parameters": {
"webhookPath": "review-step",
"httpMethod": "POST",
"responseMode": "responseNode",
"options": {}
},
"id": "node-webhook",
"name": "\u7b49\u5f85\u4eba\u5de5\u5ba1\u6838",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
800,
300
]
},
{
"parameters": {
"jsCode": "const body = $input.first().json.body || $input.first().json;\nconst prevStep = $('\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f').first().json.step;\n\nreturn [{\n json: {\n step: body.step || prevStep,\n action: body.action || 'reject',\n comment: body.comment || '',\n reviewedAt: new Date().toISOString()\n }\n}];"
},
"id": "node-parse-review",
"name": "\u89e3\u6790\u5ba1\u6838\u7ed3\u679c",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1000,
300
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={\n \"status\": \"{{ $json.action }}\",\n \"step\": \"{{ $json.step }}\",\n \"message\": \"{{ $json.action === 'approve' ? '\u2705 \u901a\u8fc7\uff0c\u8fdb\u5165\u4e0b\u4e00\u6b65' : '\u274c \u4e0d\u901a\u8fc7\uff0c\u8bf7\u4fee\u6539\u540e\u91cd\u65b0\u63d0\u4ea4' }}\",\n \"comment\": \"{{ $json.comment }}\"\n}"
},
"id": "node-respond",
"name": "\u8fd4\u56de\u5ba1\u6838\u7ed3\u679c",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1,
"position": [
1200,
500
]
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"leftValue": "={{ $json.action }}",
"rightValue": "approve",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKeyName": "\u901a\u8fc7"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"leftValue": "={{ $json.action }}",
"rightValue": "reject",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKeyName": "\u4e0d\u901a\u8fc7"
}
]
},
"options": {}
},
"id": "node-switch-review",
"name": "\u5ba1\u6838\u7ed3\u679c\u5206\u6d41",
"type": "n8n-nodes-base.switch",
"typeVersion": 3,
"position": [
1200,
300
]
},
{
"parameters": {
"values": {
"string": [
{
"name": "step",
"value": "={{ String(parseInt($json.step) + 1) }}"
},
{
"name": "retryCount",
"value": "0"
}
]
},
"options": {}
},
"id": "node-set-approved",
"name": "\u901a\u8fc7-\u524d\u8fdb\u5230\u4e0b\u4e00\u6b65",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
1400,
200
]
},
{
"parameters": {
"method": "POST",
"url": "={{ $env.NOTIFY_WEBHOOK_URL }}",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "=\u2705 \u7b2c{{ $('\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f').first().json.step }}\u6b65\u300c{{ $('\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f').first().json.stepName }}\u300d\u5ba1\u6838\u901a\u8fc7 \u27a1\ufe0f \u8fdb\u5165\u7b2c{{ String(parseInt($('\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f').first().json.step) + 1) }}\u6b65"
}
]
},
"options": {}
},
"id": "node-notify-approve",
"name": "\u901a\u77e5\u5ba1\u6838\u901a\u8fc7",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
1600,
120
]
},
{
"parameters": {
"jsCode": "const step = $input.first().json.step;\n\nif (step === '8') {\n return [{ json: { done: true, step: step, message: '\u5168\u90e8\u6b65\u9aa4\u5df2\u5b8c\u6210\uff08\u542b\u68c0\u67e5\u6e05\u5355\uff09\uff0c\u9898\u76ee\u53ef\u4ee5\u63d0\u4ea4' } }];\n}\n\nreturn [{ json: { done: false, step: step } }];"
},
"id": "node-check-done",
"name": "\u68c0\u67e5\u662f\u5426\u5168\u90e8\u5b8c\u6210",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1600,
280
]
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"leftValue": "={{ $json.done }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKeyName": "\u5df2\u5b8c\u6210"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": []
},
"renameOutput": true,
"outputKeyName": "\u672a\u5b8c\u6210"
}
]
},
"options": {}
},
"id": "node-switch-final",
"name": "\u5168\u90e8\u5b8c\u6210\u68c0\u67e5",
"type": "n8n-nodes-base.switch",
"typeVersion": 3,
"position": [
1800,
280
]
},
{
"parameters": {
"method": "POST",
"url": "={{ $env.NOTIFY_WEBHOOK_URL }}",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "=\ud83c\udf89 **\u4fe1\u606f\u63d0\u53d6\u9898\u76ee\u51fa\u9898\u5b8c\u6210\uff01**\n\n\u6240\u6709\u6b65\u9aa4\uff081-6\uff09\u53ca\u63d0\u4ea4\u524d\u68c0\u67e5\u6e05\u5355\u5df2\u5168\u90e8\u901a\u8fc7\u5ba1\u6838\u3002\n\u9898\u76ee\u53ef\u4ee5\u63d0\u4ea4\u5230\u5e73\u53f0\u4e86\u3002\n\n\u6700\u7ec8\u786e\u8ba4\u9879\uff1a\n\u2022 \u9898\u76eeID / \u540d\u79f0 / \u6807\u7b7e \u2713\n\u2022 \u4efb\u52a1\u6307\u4ee4\uff08\u542b\u7edf\u4e00\u5199\u6cd5\uff09 \u2713\n\u2022 \u9644\u4ef6\u4e0a\u4f20 \u2713\n\u2022 \u6807\u51c6\u7b54\u6848 \u2713\n\u2022 \u6253\u5206\u8bf4\u660e\uff08\u542b\u53ca\u683c\u7ebf\uff09 \u2713"
}
]
},
"options": {}
},
"id": "node-notify-complete",
"name": "\u901a\u77e5\u5168\u90e8\u5b8c\u6210",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
2000,
200
]
},
{
"parameters": {
"values": {
"string": [
{
"name": "step",
"value": "={{ $json.step }}"
},
{
"name": "retryCount",
"value": "={{ String(parseInt($json.retryCount || '0') + 1) }}"
},
{
"name": "rejectReason",
"value": "={{ $('\u89e3\u6790\u5ba1\u6838\u7ed3\u679c').first().json.comment || '\u672a\u63d0\u4f9b' }}"
}
]
},
"options": {}
},
"id": "node-set-rejected",
"name": "\u4e0d\u901a\u8fc7-\u9000\u56de\u91cd\u505a",
"type": "n8n-nodes-base.set",
"typeVersion": 2,
"position": [
1400,
420
]
},
{
"parameters": {
"method": "POST",
"url": "={{ $env.NOTIFY_WEBHOOK_URL }}",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "=\u274c \u7b2c{{ $json.step }}\u6b65\u300c{{ $('\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f').first().json.stepName }}\u300d\u5ba1\u6838**\u4e0d\u901a\u8fc7**\n\n\u539f\u56e0\uff1a{{ $('\u89e3\u6790\u5ba1\u6838\u7ed3\u679c').first().json.comment || '\u672a\u63d0\u4f9b' }}\n\u91cd\u8bd5\u6b21\u6570\uff1a{{ String(parseInt($json.retryCount || '0') + 1) }}/{{ $('\u521d\u59cb\u5316\u9898\u76ee\u6570\u636e').first().json.maxRetries || '3' }}\n\n\u8bf7\u6839\u636e\u539f\u56e0\u4fee\u6539\u540e\u91cd\u65b0\u63d0\u4ea4\u5ba1\u6838\u3002"
}
]
},
"options": {}
},
"id": "node-notify-reject",
"name": "\u901a\u77e5\u4e0d\u901a\u8fc7\u539f\u56e0",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
1600,
420
]
},
{
"parameters": {
"jsCode": "const data = $input.first().json;\nconst retryCount = parseInt(data.retryCount || '0');\nconst maxRetries = parseInt($('\u521d\u59cb\u5316\u9898\u76ee\u6570\u636e').first().json.maxRetries || '3');\n\nreturn [{\n json: {\n step: data.step,\n retryCount: retryCount,\n maxRetries: maxRetries,\n exceeded: retryCount >= maxRetries,\n rejectReason: data.rejectReason\n }\n}];"
},
"id": "node-retry-logic",
"name": "\u5904\u7406\u91cd\u8bd5\u903b\u8f91",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1800,
420
]
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"leftValue": "={{ $json.exceeded }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "equals"
}
}
]
},
"renameOutput": true,
"outputKeyName": "\u5df2\u8fbe\u4e0a\u9650"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": []
},
"renameOutput": true,
"outputKeyName": "\u672a\u8fbe\u4e0a\u9650"
}
]
},
"options": {}
},
"id": "node-switch-retry",
"name": "\u91cd\u8bd5\u4e0a\u9650\u68c0\u67e5",
"type": "n8n-nodes-base.switch",
"typeVersion": 3,
"position": [
2000,
420
]
},
{
"parameters": {
"method": "POST",
"url": "={{ $env.NOTIFY_WEBHOOK_URL }}",
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "text",
"value": "=\ud83d\udea8 **\u91cd\u8bd5\u6b21\u6570\u5df2\u8fbe\u4e0a\u9650\uff01**\n\n\u7b2c{{ $json.step }}\u6b65\u5df2\u91cd\u8bd5 {{ $json.retryCount }} \u6b21\uff08\u4e0a\u9650 {{ $json.maxRetries }} \u6b21\uff09\uff0c\u4ecd\u672a\u901a\u8fc7\u3002\n\u9700\u4eba\u5de5\u4ecb\u5165\u5904\u7406\u3002\n\n\u62d2\u7edd\u539f\u56e0\uff1a{{ $json.rejectReason }}"
}
]
},
"options": {}
},
"id": "node-notify-max",
"name": "\u901a\u77e5\u91cd\u8bd5\u4e0a\u9650\u544a\u8b66",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [
2200,
380
]
},
{
"parameters": {
"text": "## \u5ba1\u6838 Webhook\n\n### \u8bf7\u6c42\n```\nPOST <\u672c\u5de5\u4f5c\u6d41\u7684 Webhook URL>\nContent-Type: application/json\n\n{\n \"step\": \"1\",\n \"action\": \"approve\", // \u6216 \"reject\"\n \"comment\": \"\u5907\u6ce8\uff08\u53ef\u9009\uff09\"\n}\n```\n\n### \u54cd\u5e94\n```json\n{\"status\":\"approve\",\"step\":\"1\",\"message\":\"\u2705 \u901a\u8fc7\"}\n```\n\n### \u6b65\u9aa4\u7f16\u53f7\n1 \u9009\u5b9a\u7d20\u6750\u4e0e\u5b57\u6bb5\n2 \u5b9a\u7edf\u4e00\u5199\u6cd5\n3 \u6536\u96c6\u7d20\u6750\n4 \u5236\u4f5c\u6807\u51c6\u7b54\u6848\n5 \u5199\u9898\u76ee\u8981\u6c42\n6 \u6807\u51c6\u7b54\u6848+\u6253\u5206\u8bf4\u660e\n7 \u63d0\u4ea4\u524d\u68c0\u67e5\u6e05\u5355"
},
"id": "node-sticky-webhook-doc",
"name": "Webhook \u63a5\u53e3\u8bf4\u660e",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
800,
520
]
},
{
"parameters": {
"text": "## \u73af\u5883\u53d8\u91cf\n\n| \u53d8\u91cf | \u8bf4\u660e | \u793a\u4f8b |\n|------|------|------|\n| `NOTIFY_WEBHOOK_URL` | \u901a\u77e5\u6d88\u606f\u63a8\u9001\u5730\u5740 | Slack/\u4f01\u5fae/\u9489\u9489/\u98de\u4e66 Webhook URL |\n\n\u5982\u4f7f\u7528 Email \u901a\u77e5\uff0c\u5c06 HTTP Request \u8282\u70b9\u66ff\u6362\u4e3a Email Send \u8282\u70b9\u5e76\u914d\u7f6e SMTP \u51ed\u8bc1\u3002"
},
"id": "node-sticky-env",
"name": "\u73af\u5883\u53d8\u91cf\u8bf4\u660e",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
0,
550
]
},
{
"parameters": {
"text": "## \u9000\u56de\u91cd\u505a\u673a\u5236\n\n1. \u5ba1\u6838\u4e0d\u901a\u8fc7 \u2192 \u901a\u77e5\u539f\u56e0 \u2192 retryCount +1\n2. \u672a\u8fbe\u4e0a\u9650 \u2192 \u56de\u5230\u300c\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f\u300d\u2192 \u540c\u4e00\u6b65\u91cd\u505a\n3. \u8fbe\u5230\u4e0a\u9650\uff08\u9ed8\u8ba43\u6b21\uff09\u2192 \u53d1\u544a\u8b66 \u2192 \u6d41\u7a0b\u7ec8\u6b62\n\n\u26a0\ufe0f n8n \u4e0d\u652f\u6301\u539f\u751f\u5faa\u73af\u8fb9\u3002\u5bfc\u5165\u540e\u8bf7\u786e\u8ba4\uff1a\n\u300c\u672a\u8fbe\u4e0a\u9650\u300d\u2192\u300c\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f\u300d\u7684\u8fde\u7ebf\u6709\u6548\u3002\n\u5982\u65ad\u88c2\uff0c\u624b\u52a8\u4ece\u300c\u91cd\u8bd5\u4e0a\u9650\u68c0\u67e5\u300d\u7684\u300c\u672a\u8fbe\u4e0a\u9650\u300d\u8f93\u51fa\n\u62d6\u7ebf\u8fde\u5230\u300c\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f\u300d\u7684\u8f93\u5165\u3002"
},
"id": "node-sticky-loop",
"name": "\u9000\u56de\u91cd\u505a\u673a\u5236",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2000,
560
]
}
],
"connections": {
"\u5f00\u59cb\u51fa\u9898": {
"main": [
[
{
"node": "\u521d\u59cb\u5316\u9898\u76ee\u6570\u636e",
"type": "main",
"index": 0
}
]
]
},
"\u521d\u59cb\u5316\u9898\u76ee\u6570\u636e": {
"main": [
[
{
"node": "\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f",
"type": "main",
"index": 0
}
]
]
},
"\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f": {
"main": [
[
{
"node": "\u7b49\u5f85\u4eba\u5de5\u5ba1\u6838",
"type": "main",
"index": 0
}
]
]
},
"\u7b49\u5f85\u4eba\u5de5\u5ba1\u6838": {
"main": [
[
{
"node": "\u89e3\u6790\u5ba1\u6838\u7ed3\u679c",
"type": "main",
"index": 0
}
]
]
},
"\u89e3\u6790\u5ba1\u6838\u7ed3\u679c": {
"main": [
[
{
"node": "\u5ba1\u6838\u7ed3\u679c\u5206\u6d41",
"type": "main",
"index": 0
}
]
]
},
"\u5ba1\u6838\u7ed3\u679c\u5206\u6d41": {
"main": [
[
{
"node": "\u901a\u8fc7-\u524d\u8fdb\u5230\u4e0b\u4e00\u6b65",
"type": "main",
"index": 0
},
{
"node": "\u8fd4\u56de\u5ba1\u6838\u7ed3\u679c",
"type": "main",
"index": 0
}
],
[
{
"node": "\u4e0d\u901a\u8fc7-\u9000\u56de\u91cd\u505a",
"type": "main",
"index": 0
},
{
"node": "\u8fd4\u56de\u5ba1\u6838\u7ed3\u679c",
"type": "main",
"index": 0
}
]
]
},
"\u901a\u8fc7-\u524d\u8fdb\u5230\u4e0b\u4e00\u6b65": {
"main": [
[
{
"node": "\u901a\u77e5\u5ba1\u6838\u901a\u8fc7",
"type": "main",
"index": 0
},
{
"node": "\u68c0\u67e5\u662f\u5426\u5168\u90e8\u5b8c\u6210",
"type": "main",
"index": 0
}
]
]
},
"\u68c0\u67e5\u662f\u5426\u5168\u90e8\u5b8c\u6210": {
"main": [
[
{
"node": "\u5168\u90e8\u5b8c\u6210\u68c0\u67e5",
"type": "main",
"index": 0
}
]
]
},
"\u5168\u90e8\u5b8c\u6210\u68c0\u67e5": {
"main": [
[
{
"node": "\u901a\u77e5\u5168\u90e8\u5b8c\u6210",
"type": "main",
"index": 0
}
],
[
{
"node": "\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f",
"type": "main",
"index": 0
}
]
]
},
"\u4e0d\u901a\u8fc7-\u9000\u56de\u91cd\u505a": {
"main": [
[
{
"node": "\u901a\u77e5\u4e0d\u901a\u8fc7\u539f\u56e0",
"type": "main",
"index": 0
}
]
]
},
"\u901a\u77e5\u4e0d\u901a\u8fc7\u539f\u56e0": {
"main": [
[
{
"node": "\u5904\u7406\u91cd\u8bd5\u903b\u8f91",
"type": "main",
"index": 0
}
]
]
},
"\u5904\u7406\u91cd\u8bd5\u903b\u8f91": {
"main": [
[
{
"node": "\u91cd\u8bd5\u4e0a\u9650\u68c0\u67e5",
"type": "main",
"index": 0
}
]
]
},
"\u91cd\u8bd5\u4e0a\u9650\u68c0\u67e5": {
"main": [
[
{
"node": "\u901a\u77e5\u91cd\u8bd5\u4e0a\u9650\u544a\u8b66",
"type": "main",
"index": 0
}
],
[
{
"node": "\u51c6\u5907\u5f53\u524d\u6b65\u9aa4\u4fe1\u606f",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"callerPolicy": "workflowsFromSameOwner",
"executionOrder": "v1",
"saveDataErrorExecution": "all",
"saveDataSuccessExecution": "all",
"saveManualExecutions": true,
"timezone": "Asia/Shanghai"
},
"staticData": null,
"versionId": "1.0.0"
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
信息提取题目出题工作流. Uses httpRequest. Event-driven trigger; 22 nodes.
Source: https://github.com/00103-a/workflow-builder-skill/blob/03ba81580b39e7d4912ea6d6ae88041d9e6b1225/examples/info-extraction-workflow.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t
[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.
[](https://youtu.be/c7yCZhmMjtI)
This automation organizes your n8n workflows files into categorizes (Active, Template, Done, Archived) and uploads them directly to a categorized Google Drive folders. It is designed to help users man
Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.