{
  "name": "\u8bba\u6587\u89e3\u8bfb\u81ea\u52a8\u751f\u6210\u5fae\u4fe1\u63a8\u6587",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -3680,
        -384
      ],
      "id": "d141b22e-3929-4d56-9ca0-78cc56b9ce90",
      "name": "When clicking 'Execute workflow'"
    },
    {
      "parameters": {
        "fileSelector": "/files/pdfs/*.pdf"
      },
      "type": "n8n-nodes-base.readBinaryFiles",
      "typeVersion": 1,
      "position": [
        -3440,
        -384
      ],
      "id": "7062289e-0349-49d6-b57b-0653cea27cec",
      "name": "\u8bfb\u53d6\u6240\u6709PDF\u6587\u4ef6"
    },
    {
      "parameters": {
        "jsCode": "// \u63d0\u53d6\u6bcf\u4e2aPDF\u7684\u6587\u4ef6\u4fe1\u606f\u5e76\u751f\u6210\u52a8\u6001\u8def\u5f84\nconst items = [];\nconst batchId = Date.now();\n\nfor (const item of $input.all()) {\n  const fileName = item.binary.data.fileName;\n  const fileNameWithoutExt = fileName.replace('.pdf', '');\n  \n  items.push({\n    json: {\n      fileName: fileName,\n      articleName: fileNameWithoutExt,\n      pdfPath: `E:/code/n8n_workflow/pdfs/${fileName}`,\n      outputDir: `E:/code/n8n_workflow/temp/batch_${batchId}/${fileNameWithoutExt}`,\n      batchId: batchId\n    },\n    binary: item.binary\n  });\n}\n\nreturn items;"
      },
      "id": "c401ac97-1544-4d11-9466-a3331dbbc294",
      "name": "\u63d0\u53d6\u6587\u4ef6\u4fe1\u606f",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -3184,
        -384
      ]
    },
    {
      "parameters": {
        "options": {
          "reset": false
        }
      },
      "id": "7eba3d55-5829-4168-b30e-d42c6f4b76cf",
      "name": "\u9010\u4e2a\u5904\u7406PDF",
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        -2992,
        -384
      ]
    },
    {
      "parameters": {
        "operation": "pdf",
        "options": {}
      },
      "type": "n8n-nodes-base.extractFromFile",
      "typeVersion": 1,
      "position": [
        -2848,
        -368
      ],
      "id": "6a2ef7ca-2a2f-4107-ba38-9028e21f6150",
      "name": "\u63d0\u53d6PDF\u6587\u672c1"
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "default_session"
      },
      "id": "eb16e8c2-60d3-4c21-8405-a0bb93e24b18",
      "name": "\u5bf9\u8bdd\u8bb0\u5fc6",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.2,
      "position": [
        -2528,
        -160
      ],
      "disabled": true
    },
    {
      "parameters": {
        "name": "process_pdf",
        "description": "\u5904\u7406PDF\u6587\u4ef6\u5e76\u63d0\u53d6\u5185\u5bb9",
        "jsCode": "const pdfText = $input.first().json.text || '';\nif (!pdfText) {\n  return { success: false, error: '\u672a\u80fd\u63d0\u53d6PDF\u6587\u672c\u5185\u5bb9' };\n}\n\nreturn {\n  success: true,\n  pdfContent: pdfText,\n  message: `\u6210\u529f\u63d0\u53d6PDF\u5185\u5bb9\uff0c\u5171 ${pdfText.length} \u5b57\u7b26`\n};",
        "specifyInputSchema": true
      },
      "id": "67d84a35-9446-46ce-8c3d-a97e9a2e12bd",
      "name": "PDF\u5904\u7406\u5de5\u5177",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "typeVersion": 1,
      "position": [
        -2304,
        -160
      ]
    },
    {
      "parameters": {
        "name": "format_wechat_article",
        "description": "\u5c06Markdown\u683c\u5f0f\u7684\u6587\u7ae0\u8f6c\u6362\u4e3a\u5fae\u4fe1\u516c\u4f17\u53f7HTML\u683c\u5f0f\u3002\u8f93\u5165\u53c2\u6570: articleContent (Markdown\u6587\u7ae0\u5185\u5bb9)",
        "jsCode": "const articleContent = $input.articleContent;\n\nif (!articleContent) {\n  return { success: false, error: '\u672a\u63d0\u4f9b\u6587\u7ae0\u5185\u5bb9' };\n}\n\nlet wechatContent = articleContent;\nwechatContent = wechatContent.replace(/^### (.+)$/gm, '<h3>$1</h3>');\nwechatContent = wechatContent.replace(/^## (.+)$/gm, '<h2>$1</h2>');\nwechatContent = wechatContent.replace(/^# (.+)$/gm, '<h1>$1</h1>');\nwechatContent = wechatContent.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>');\nwechatContent = wechatContent.replace(/^> (.+)$/gm, '<blockquote>$1</blockquote>');\nwechatContent = wechatContent.replace(/^\\*\\*\\*$/gm, '<hr>');\n\nconst titleMatch = articleContent.match(/^# (.*?)(?=>)/);\nconst title = titleMatch ? titleMatch[1].trim() : '\u8bba\u6587\u89e3\u8bfb';\n\nconst summaryMatch = articleContent.match(/> (.*?)(?=\\*\\*\\*)/);\nconst summary = summaryMatch ? summaryMatch[1].trim() : '';\n\nreturn {\n  success: true,\n  title: title,\n  summary: summary,\n  content: wechatContent,\n  originalMarkdown: articleContent\n};",
        "specifyInputSchema": true
      },
      "id": "d59a8640-8c5b-40df-9789-4423729763e5",
      "name": "\u683c\u5f0f\u5316\u5de5\u5177",
      "type": "@n8n/n8n-nodes-langchain.toolCode",
      "typeVersion": 1,
      "position": [
        -2416,
        -160
      ]
    },
    {
      "parameters": {
        "jsCode": "// \u5408\u5e76\u8282\u70b9\u63d0\u4f9b\u7684 mdnice \u8f93\u51fa\u4e0e\u56fe\u7247\u6570\u636e\nconst mergedData = $input.all()[0].json;\nconst mdniceOutput = mergedData;\n\nlet wechatContent = '';\nif (mdniceOutput.html) {\n  wechatContent = mdniceOutput.html;\n} else if (mdniceOutput.stdout) {\n  wechatContent = mdniceOutput.stdout;\n} else if (mdniceOutput.output) {\n  wechatContent = mdniceOutput.output;\n} else {\n  throw new Error('\u672a\u80fd\u83b7\u53d6 mdnice \u8f6c\u6362\u540e\u7684 HTML \u5185\u5bb9\u3002HTTP \u54cd\u5e94: ' + JSON.stringify(mdniceOutput).substring(0, 500));\n}\n\nif (!wechatContent || wechatContent.length < 100) {\n  throw new Error('mdnice \u8f6c\u6362\u7684 HTML \u5185\u5bb9\u5f02\u5e38\u77ed\uff0c\u53ef\u80fd\u8f6c\u6362\u5931\u8d25\u3002\u957f\u5ea6: ' + (wechatContent ? wechatContent.length : 0));\n}\n\nconst titleMatch = wechatContent.match(/<h1[^>]*>.*?<span class=\"content\"[^>]*>([^<]+)<\\/span>/i);\nconst title = titleMatch ? titleMatch[1].trim() : '\u8bba\u6587\u89e3\u8bfb';\nconst summaryMatch = wechatContent.match(/<blockquote[^>]*>.*?<p[^>]*>([^<]+)<\\/p>/is);\nconst summary = summaryMatch ? summaryMatch[1].trim() : '';\n\nconst imagePaths = Array.isArray(mergedData.imagePaths) ? mergedData.imagePaths : [];\nconst figures = Array.isArray(mergedData.figures) ? mergedData.figures : [];\n\nreturn {\n  title,\n  summary,\n  content: wechatContent,\n  imagePaths,\n  figures,\n  debug_content_length: wechatContent.length\n};\n"
      },
      "id": "a34739ef-8605-4736-a9de-700fadb5e6fa",
      "name": "AI Agent\u8f93\u51fa\u5904\u7406",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1712,
        -352
      ]
    },
    {
      "parameters": {
        "resource": "media",
        "operation": "media:uploadOther"
      },
      "id": "da200c4b-5c6a-4d93-87da-7913fcf5cd57",
      "name": "\u4e0a\u4f20\u5c01\u9762\u5230\u5fae\u4fe12",
      "type": "n8n-nodes-wechat-offiaccount.wechatOfficialAccountNode",
      "typeVersion": 1,
      "position": [
        -1856,
        208
      ],
      "credentials": {
        "wechatOfficialAccountCredentialsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "93b552b2-54f3-4392-802e-16c46a652027",
      "name": "\u5408\u5e76AI\u5185\u5bb9\u548c\u5c01\u9762",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2.1,
      "position": [
        -928,
        416
      ]
    },
    {
      "parameters": {
        "jsCode": "// \u4ece\u5408\u5e76\u540e\u7684\u6570\u636e\u4e2d\u63d0\u53d6\u4fe1\u606f\nconst items = $input.all();\n\n// \u7b2c\u4e00\u4e2a\u8f93\u5165\u5e94\u8be5\u662fAI Agent\u8f93\u51fa\u5904\u7406\u7684\u7ed3\u679c(\u5305\u542btitle, summary, content)\nconst articleData = items[0].json;\n\n// \u7b2c\u4e8c\u4e2a\u8f93\u5165\u5e94\u8be5\u662f\u4e0a\u4f20\u5c01\u9762\u5230\u5fae\u4fe1\u7684\u7ed3\u679c(\u5305\u542bmedia_id)\nconst coverData = items[1] ? items[1].json : items[0].json;\n\n// \u63d0\u53d6\u5c01\u9762 media_id\nconst mediaId = coverData.media_id;\nif (!mediaId) {\n  throw new Error('\u672a\u80fd\u83b7\u53d6\u5c01\u9762\u56fe media_id');\n}\n\n// \u63d0\u53d6\u6587\u7ae0\u5143\u6570\u636e\nconst title = articleData.title || \"\u8bba\u6587\u89e3\u8bfb\";\nconst summary = articleData.summary || \"\";\nconst content = articleData.content;\n\n// \u9a8c\u8bc1\u6587\u7ae0\u5185\u5bb9\nif (!content || content.length < 100) {\n  throw new Error('\u6587\u7ae0\u5185\u5bb9\u5f02\u5e38\u77ed\u6216\u4e3a\u7a7a\u3002\u957f\u5ea6: ' + (content ? content.length : 0));\n}\n\n// \u6784\u5efa\u5fae\u4fe1\u8349\u7a3f\u6587\u7ae0\u5bf9\u8c61\nconst article = {\n  \"title\": title,                    // \u6587\u7ae0\u6807\u9898(\u4eceHTML\u4e2d\u63d0\u53d6)\n  \"author\": \"\u8bba\u6587\u89e3\u8bfb\",              // \u4f5c\u8005\u540d\u79f0\n  \"digest\": summary,                 // \u6587\u7ae0\u6458\u8981(\u4eceHTML\u4e2d\u63d0\u53d6)\n  \"content\": content,                // \u6587\u7ae0\u5185\u5bb9(mdnice\u8f6c\u6362\u7684HTML)\n  \"content_source_url\": \"\",         // \u539f\u6587\u94fe\u63a5(\u53ef\u9009)\n  \"thumb_media_id\": mediaId,        // \u5c01\u9762\u56fe\u7247media_id\n  \"need_open_comment\": 0,           // \u662f\u5426\u6253\u5f00\u8bc4\u8bba\n  \"only_fans_can_comment\": 0        // \u662f\u5426\u4ec5\u7c89\u4e1d\u53ef\u8bc4\u8bba\n};\n\nreturn {\n  articles: JSON.stringify([article]),\n  // \u8c03\u8bd5\u4fe1\u606f\n  debug_media_id: mediaId,\n  debug_title: title,\n  debug_summary: summary,\n  debug_content_length: content.length\n};"
      },
      "id": "6fb9e21d-dc62-4229-a167-e9e7b65a4ed1",
      "name": "\u51c6\u5907AI\u5fae\u4fe1\u8349\u7a3f\u6570\u636e",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -736,
        416
      ]
    },
    {
      "parameters": {
        "resource": "draft",
        "operation": "draft:add",
        "articles": "={{ $json.articles }}"
      },
      "id": "f0d34396-7ec7-411b-a8ea-55c0afff9a0f",
      "name": "\u4fdd\u5b58AI\u5fae\u4fe1\u8349\u7a3f",
      "type": "n8n-nodes-wechat-offiaccount.wechatOfficialAccountNode",
      "typeVersion": 1,
      "position": [
        -544,
        416
      ],
      "credentials": {
        "wechatOfficialAccountCredentialsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.chatInput }}",
        "options": {}
      },
      "id": "ae950da2-e23a-4d17-b871-77e0aec8fbec",
      "name": "\u8bba\u6587\u89e3\u8bfbAI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        -2512,
        -368
      ]
    },
    {
      "parameters": {
        "jsCode": "const pdfText = $json.text || '';\n\nif (!pdfText) {\n  throw new Error('\u672a\u80fd\u63d0\u53d6PDF\u6587\u672c\u5185\u5bb9');\n}\n\nconst promptTemplate = `\u6211\u73b0\u5728\u60f3\u5199\u4e00\u7cfb\u5217\u516c\u4f17\u53f7\u6587\u7ae0\uff0c\u6211\u4f1a\u4e0a\u4f20\u7ed9\u60a8\u4e00\u4e2a\u5185\u5bb9\u683c\u5f0f\u6a21\u677f\uff0c\u662f\u7528markdown\u683c\u5f0f\u64b0\u5199\u7684\u4e00\u4e2a\u901a\u7528\u6a21\u677f\u3002\u4f60\u53ea\u9700\u53c2\u7167\u8fd9\u4e2a\u5185\u5bb9\u683c\u5f0f\u6a21\u677f\u5199\u516c\u4f17\u53f7\u6587\u7ae0\u5c31\u884c\u3002\u6211\u4f1a\u4e0a\u4f20\u7ed9\u60a8pdf\u6587\u7ae0\uff0c\u4f60\u57fa\u4e8epdf\u6587\u7ae0\u64b0\u5199\u516c\u4f17\u53f7\u6587\u7ae0\u5373\u53ef\u3002\n\n**\u6587\u7ae0\u957f\u5ea6\u8981\u6c42\uff1a**\n- \u6bcf\u4e2a\u7ae0\u8282\u81f3\u5c11\u5305\u542b 3-5 \u4e2a\u8be6\u7ec6\u7684\u5b50\u7ae0\u8282\n- \u5168\u6587\u603b\u5b57\u6570\u5e94\u5728 10000 \u5b57\u4ee5\u4e0a\n- \u6ce8\u610f\u4e0d\u8981\u8bf4\u5176\u4ed6\u7684\u4f8b\u5982\"\u597d\u7684\"\u7b49\u7b49\u7684\u8bdd\uff0c\u76f4\u63a5\u6309\u7167\u683c\u5f0f\u5199\u5c31\u884c\n- \u8981\u5408\u7406\u5206\u6bb5\uff0c\u589e\u5f3a\u6587\u7ae0\u7684\u53ef\u8bfb\u6027\n- \u786e\u4fdd\u5bf9\u8bba\u6587\u7684\u6838\u5fc3\u65b9\u6cd5\u3001\u5b9e\u9a8c\u7ed3\u679c\u3001\u521b\u65b0\u70b9\u8fdb\u884c\u6df1\u5165\u9610\u8ff0\n\n**\u6a21\u677f\u683c\u5f0f\u5185\u5bb9\uff1a**\n\uff08\u8fd9\u91cc\u4e0d\u8981\u6709\u7a7a\u884c\uff09\n# \u6a21\u4eff\u6db2\u6ef4\u8868\u9762\u5f20\u529b\uff01\u8fd9\u6b3e\u53ef\u53d8\u521a\u5ea6\u8f66\u8f6e\uff0c\u5b9e\u73b0\"\u8f6f\u786c\"\u72b6\u6001\u7684\u5b9e\u65f6\u5207\u6362\n> Science Robotics\u6700\u65b0\u6210\u679c\uff1a\u901a\u8fc7\u8c03\u8282\u8f6e\u5185\"\u667a\u80fd\u94fe\"\u7684\u5f20\u529b\uff0c\u5728\u521a\u6027\u6eda\u8f6c\u4e0e\u67d4\u6027\u8d8a\u969c\u4e4b\u95f4\u5b9e\u73b0\u65e0\u7f1d\u8fc7\u6e21\n***\n\n## \u5168\u6587\u901f\u89c8\n\u4f20\u7edf\u8f66\u8f6e\u5728\u5e73\u5766\u5730\u9762\u4e0a\u9ad8\u6548\u7a33\u5b9a\uff0c\u4f46\u5728\u5d0e\u5c96\u5730\u5f62\u4e0a\u5374\u4e3e\u6b65\u7ef4\u8270\uff0c\u8fd9\u6784\u6210\u4e86\u79fb\u52a8\u673a\u5668\u4eba\u9886\u57df\u7684\u4e00\u4e2a\u7ecf\u5178\u6743\u8861\u3002\u4e3a\u4e86\u7834\u89e3\u8fd9\u4e00\u96be\u9898\uff0c\u6765\u81ea\u97e9\u56fd\u673a\u68b0\u4e0e\u6750\u6599\u7814\u7a76\u9662\uff08KIMM\uff09\u7b49\u673a\u6784\u7684\u56e2\u961f\uff0c\u4ece**\u6db2\u6ef4\u7684\u8868\u9762\u5f20\u529b**\u73b0\u8c61\u4e2d\u6c72\u53d6\u7075\u611f\uff0c\u5f00\u53d1\u4e86\u4e00\u6b3e\u5168\u65b0\u7684**\u53ef\u53d8\u521a\u5ea6\u53d8\u5f62\u8f66\u8f6e**\u3002\u8be5\u8f66\u8f6e\u7684\u6838\u5fc3\uff0c\u662f\u4e00\u4e2a\u4f4d\u4e8e\u8f6e\u5b50\u5916\u7f18\u7684**\u201c\u667a\u80fd\u94fe\u201d**\u7ed3\u6784\uff0c\u5176\u201c\u8868\u9762\u5f20\u529b\u201d\u53ef\u4ee5\u901a\u8fc7\u5185\u90e8\u7684**\u94a2\u4e1d\u8f90\u6761**\u8fdb\u884c\u5b9e\u65f6\u8c03\u8282\u3002\u5f53\u5f20\u529b\u589e\u5927\u65f6\uff0c\u8f66\u8f6e\u4f1a\u6536\u7f29\u6210\u4e00\u4e2a\u575a\u786c\u7684\u5706\u5f62\uff0c\u9002\u5408\u5728\u5e73\u5730\u4e0a\u9ad8\u901f\u884c\u9a76\uff1b\u5f53\u5f20\u529b\u51cf\u5c0f\u65f6\uff0c\u8f66\u8f6e\u5219\u4f1a\u53d8\u5f97\u67d4\u8f6f\uff0c\u80fd\u591f\u50cf\u5c65\u5e26\u4e00\u6837\u201c\u5305\u88f9\u201d\u4f4f\u969c\u788d\u7269\u5e76\u5e73\u7a33\u8d8a\u8fc7\u3002\u8fd9\u9879\u6280\u672f\u6210\u529f\u5730\u88ab\u5e94\u7528\u5230\u4e86\u4e00\u53f0\u91cd\u8fbe$120$\u516c\u65a4\u7684\u53cc\u8f6e\u8f6e\u6905\u4e0a\uff0c\u5e76\u5b9e\u73b0\u4e86\u5728\u6237\u5916\u73af\u5883\u4e2d\u7684\u5b9e\u65f6\u201c\u8f6f\u786c\u201d\u72b6\u6001\u5207\u6362\u548c\u8d8a\u969c\u3002\n\n## 01 \u7814\u7a76\u80cc\u666f\n\u8f6e\u5f0f\u3001\u5c65\u5e26\u5f0f\u548c\u817f\u5f0f\u662f\u79fb\u52a8\u673a\u5668\u4eba\u7684\u4e09\u79cd\u4e3b\u6d41\u8fd0\u52a8\u6a21\u5f0f\uff0c\u5b83\u4eec\u5728\u5e73\u5730\u6548\u7387\u548c\u8d8a\u969c\u80fd\u529b\u4e4b\u95f4\u5404\u6709\u53d6\u820d\u3002\u867d\u7136\u975e\u5145\u6c14\u8f6e\u80ce\u7b49\u67d4\u6027\u8f66\u8f6e\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u63d0\u5347\u4e86\u8d8a\u969c\u80fd\u529b\uff0c\u4f46\u5b83\u4eec\u7684\u6574\u4f53\u521a\u5ea6\u662f\u56fa\u5b9a\u7684\uff0c\u65e0\u6cd5\u540c\u65f6\u6ee1\u8db3\u201c\u9ad8\u901f\u5e73\u5730\u884c\u9a76\u201d\uff08\u9700\u8981\u9ad8\u521a\u5ea6\uff09\u548c\u201c\u6781\u9650\u8d8a\u969c\u201d\uff08\u9700\u8981\u4f4e\u521a\u5ea6\uff09\u8fd9\u4e24\u4e2a\u76f8\u4e92\u77db\u76fe\u7684\u9700\u6c42\u3002\u56e0\u6b64\uff0c\u5982\u4f55\u8bbe\u8ba1\u4e00\u6b3e\u80fd\u591f**\u5728\u7ebf\u3001\u5b9e\u65f6\u5730\u3001\u5927\u8303\u56f4\u5730\u8c03\u8282\u81ea\u8eab\u521a\u5ea6\u548c\u5f62\u6001**\u7684\u8f66\u8f6e\uff0c\u662f\u5b9e\u73b0\u771f\u6b63\u5168\u5730\u5f62\u79fb\u52a8\u7684\u5173\u952e\u3002\n\n## 02 \u7814\u7a76\u8d21\u732e\n\u672c\u6587\u63d0\u51fa\u7684\u6db2\u6ef4\u542f\u53d1\u5f0f\u8f66\u8f6e\uff0c\u901a\u8fc7\u4e00\u4e2a\u5de7\u5999\u7684\u4eff\u751f\u673a\u68b0\u8bbe\u8ba1\uff0c\u6210\u529f\u5730\u89e3\u51b3\u4e86\u4e0a\u8ff0\u6838\u5fc3\u6311\u6218\uff0c\u5176\u4e3b\u8981\u8d21\u732e\u5982\u4e0b\uff1a\n\n1.\u00a0 **\u5f00\u521b\u4e86\u201c\u8868\u9762\u5f20\u529b\u201d\u53ef\u53d8\u521a\u5ea6\u8303\u5f0f\uff1a** \u9996\u6b21\u5c06\u6db2\u6ef4\u8868\u9762\u5f20\u529b\u7684\u7269\u7406\u539f\u7406\uff0c\u7c7b\u6bd4\u5e76\u5e94\u7528\u5230\u8f66\u8f6e\u7684\u673a\u68b0\u8bbe\u8ba1\u4e2d\uff0c\u63d0\u51fa\u4e86\u4e00\u79cd\u901a\u8fc7\u8c03\u8282\u8f90\u6761\u5f20\u529b\u6765\u63a7\u5236\u8f6e\u7f18\u201c\u667a\u80fd\u94fe\u201d\u5b8f\u89c2\u521a\u5ea6\u7684\u5168\u65b0\u65b9\u6cd5\u3002\n2.\u00a0 **\u5b9e\u73b0\u4e86\u5927\u8303\u56f4\u3001\u5b9e\u65f6\u7684\u521a\u5ea6\u8c03\u8282\uff1a** \u8f66\u8f6e\u53ef\u4ee5\u5728\u575a\u786c\u7684\u201c\u5706\u5f62\u201d\u548c\u67d4\u8f6f\u7684\u201c\u53d8\u5f62\u201d\u4e24\u79cd\u72b6\u6001\u95f4\u65e0\u7f1d\u5207\u6362\uff0c\u5176\u53ef\u53d8\u5f62\u6df1\u5ea6\u9ad8\u8fbe\u81ea\u8eab\u534a\u5f84\u7684$40\\%$\u3002\n3.\u00a0 **\u6784\u5efa\u5e76\u9a8c\u8bc1\u4e86\u5927\u578b\u5e94\u7528\u5e73\u53f0\uff1a** \u6210\u529f\u5730\u5c06\u8be5\u6280\u672f\u4ece\u5c0f\u578b\u9a8c\u8bc1\u5e73\u53f0\uff0c\u6269\u5c55\u5e76\u5e94\u7528\u5230\u4e86\u4e00\u53f0$120$\u516c\u65a4\u7ea7\u7684\u5168\u5c3a\u5bf8\u53cc\u8f6e\u8f6e\u6905\u4e0a\uff0c\u5e76\u5728\u771f\u5b9e\u7684\u6237\u5916\u73af\u5883\u4e2d\uff0c\u9a8c\u8bc1\u4e86\u5176\u5728\u8d1f\u8f7d\u4e0b\u7684\u5b9e\u65f6\u8d8a\u969c\u80fd\u529b\u3002\n4.\u00a0 **\u5efa\u7acb\u4e86\u7cfb\u7edf\u7684\u529b\u5b66\u5206\u6790\u6a21\u578b\uff1a** \u4e3a\u8f66\u8f6e\u590d\u6742\u7684\u53d8\u5f62\u8fc7\u7a0b\u548c\u521a\u5ea6\u53d8\u5316\u673a\u7406\uff0c\u5efa\u7acb\u4e86\u8be6\u5c3d\u7684\u51e0\u4f55\u4e0e\u529b\u5b66\u5206\u6790\u6a21\u578b\uff0c\u4e3a\u672a\u6765\u7684\u8bbe\u8ba1\u4f18\u5316\u63d0\u4f9b\u4e86\u7406\u8bba\u57fa\u7840\u3002\n\n## 03 \u6574\u4f53\u8bbe\u8ba1\uff1a\u4e00\u4e2a\u4f1a\u201c\u53d8\u5f62\u201d\u7684\u8f6e\u5b50 (\u56fe1)\n\n\n\n\u56fe1\u662f\u6574\u4e2a\u8bbe\u8ba1\u7684\u201c\u603b\u7eb2\u201d\uff0c\u5b83\u6e05\u6670\u5730\u9610\u8ff0\u4e86\u8f66\u8f6e\u7684\u8bbe\u8ba1\u7406\u5ff5\u3001\u6838\u5fc3\u673a\u5236\u4ee5\u53ca\u4e0e\u6db2\u6ef4\u7684\u6df1\u523b\u7c7b\u6bd4\u3002\n\n\n\n1.\u00a0 **\u4e24\u79cd\u6838\u5fc3\u72b6\u6001 (\u56fe1A):**\n\n\u00a0 \u00a0 (1) **\u5706\u5f62\u9ad8\u521a\u5ea6\u72b6\u6001 (i):** \u9002\u7528\u4e8e\u5e73\u5730\uff0c\u5982\u540c\u4e00\u4e2a\u666e\u901a\u7684\u521a\u6027\u8f66\u8f6e\u3002\n\u00a0 \u00a0 (2) **\u53d8\u5f62\u4f4e\u521a\u5ea6\u72b6\u6001 (ii):** \u9002\u7528\u4e8e\u5d0e\u5c96\u5730\u5f62\uff0c\u8f66\u8f6e\u53ef\u4ee5\u4e3b\u52a8\u53d8\u201c\u8f6f\u201d\uff0c\u4ee5\u9002\u5e94\u969c\u788d\u7269\u7684\u5f62\u72b6\u3002\n    \n2.\u00a0 **\u6838\u5fc3\u9a71\u52a8\u673a\u5236 (\u56fe1B):** \u8f66\u8f6e\u7684\u201c\u8f6f\u786c\u201d\u7531**\u8f6e\u6bc2\u95f4\u8ddd\uff08Hub-gap distance\uff09**\u63a7\u5236\u3002\u8f6e\u7f18\u7684\u201c\u667a\u80fd\u94fe\u201d\u7531\u591a\u6839\u94a2\u4e1d\u8f90\u6761\u8fde\u63a5\u5230\u8f6e\u6bc2\u4e0a\u3002\u5f53\u8f6e\u6bc2\u95f4\u8ddd$l_h$\u53d8\u5927\u65f6\uff0c\u8f90\u6761\u88ab\u62c9\u7d27\uff0c\u5bf9\u667a\u80fd\u94fe\u4ea7\u751f\u4e00\u4e2a\u5f3a\u5927\u7684\u5411\u5185\u201c\u6536\u7f29\u529b\u201d\uff0c\u4f7f\u8f66\u8f6e\u53d8\u786c\u3001\u53d8\u5706\uff1b\u53cd\u4e4b\uff0c\u5f53$l_h$\u53d8\u5c0f\u65f6\uff0c\u8f90\u6761\u677e\u5f1b\uff0c\u8f66\u8f6e\u53d8\u8f6f\u3002\n\n3.\u00a0 **\u4e0e\u6db2\u6ef4\u7684\u7c7b\u6bd4 (\u56fe1D, E):**\n\u00a0 \u00a0 (1) **\u529b\u7684\u7c7b\u6bd4 (\u56fe1D):** \u8f90\u6761\u5bf9\u667a\u80fd\u94fe\u7684\u6536\u7f29\u529b\uff0c\u5728\u7269\u7406\u4e0a\u7b49\u6548\u4e8e\u6db2\u4f53\u5185\u90e8\u5206\u5b50\u95f4\u7684\u5185\u805a\u529b\u5bf9\u8868\u5c42\u5206\u5b50\u4ea7\u751f\u7684\u201c\u8868\u9762\u5f20\u529b\u201d\u3002\n\u00a0 \u00a0 (2) **\u5f62\u6001\u7684\u7c7b\u6bd4 (\u56fe1E):** \u8f66\u8f6e\u521a\u5ea6\u7684\u53d8\u5316\uff0c\u7c7b\u4f3c\u4e8e\u6db2\u6ef4\u901a\u8fc7\u6539\u53d8\u8868\u9762\u5f20\u529b\u6765\u6539\u53d8\u5176\u63a5\u89e6\u89d2$\\theta$\u3002\u9ad8\u8868\u9762\u5f20\u529b\u5bf9\u5e94\u9ad8\u521a\u5ea6\u7684\u5706\u5f62\u8f6e\u5ed3\uff0c\u4f4e\u8868\u9762\u5f20\u529b\u5bf9\u5e94\u4f4e\u521a\u5ea6\u7684\u53d8\u5f62\u8f6e\u5ed3\u3002\n![\u56fe1. \u53ef\u53d8\u521a\u5ea6\u53d8\u5f62\u8f66\u8f6e\u7684\u914d\u7f6e](https://i.imgur.com/your-placeholder-for-fig1.png)\n\n**\u56fe1. \u53ef\u53d8\u521a\u5ea6\u53d8\u5f62\u8f66\u8f6e\u7684\u914d\u7f6e\u3002**\n\n\n\n## 04 \u6838\u5fc3\u529b\u5b66\uff1a\u521a\u5ea6\u53d8\u5316\u7684\u79d8\u5bc6 (\u56fe2 & \u56fe4)\n\n1.\u00a0 **\u53d8\u5f62\u7684\u51e0\u4f55\u5b66 (\u56fe2):** \u7814\u7a76\u56e2\u961f\u4e3a\u8f66\u8f6e\u5728\u4e0e\u5730\u9762\u63a5\u89e6\u5e76\u53d1\u751f\u5f62\u53d8\u65f6\u7684\u590d\u6742\u51e0\u4f55\u53d8\u5316\uff0c\u5efa\u7acb\u4e86\u7cbe\u786e\u7684\u6570\u5b66\u6a21\u578b\u3002\n\u00a0 \u00a0 (1) **\u516c\u5f0f(1) - (5):** \u8fd9\u4e00\u7cfb\u5217\u516c\u5f0f\uff0c\u57fa\u4e8e\u4e0d\u540c\u7684\u5047\u8bbe\uff08\u5982\u667a\u80fd\u94fe\u5757\u7684\u65cb\u8f6c\u4e2d\u5fc3\u4f4d\u7f6e\uff09\uff0c\u7cbe\u786e\u5730\u8ba1\u7b97\u4e86\u5728\u7ed9\u5b9a\u7684\u4e0b\u538b\u6df1\u5ea6$d$\u4e0b\uff0c\u4e3a\u4e86\u7ef4\u6301\u8f6e\u5ed3\uff0c\u94a2\u4e1d\u8f90\u6761\u9700\u8981\u4f38\u957f\u7684\u957f\u5ea6$\\Delta R$\u3002\u8fd9\u4e3a\u63a7\u5236\u5668\u7684\u8bbe\u8ba1\u63d0\u4f9b\u4e86\u7406\u8bba\u57fa\u7840\u3002\n\n\n\n2.\u00a0 **\u521a\u5ea6\u7684\u5b9e\u9a8c\u9a8c\u8bc1 (\u56fe4):**\n\u00a0 \u00a0 (1) **\u5b9e\u9a8c\u8bbe\u7f6e (\u56fe4A):** \u901a\u8fc7\u4e00\u4e2a\u4e13\u95e8\u7684\u6d4b\u8bd5\u53f0\uff0c\u7814\u7a76\u8005\u7528\u4e0d\u540c\u5bbd\u5ea6\u7684\u538b\u5934\uff0c\u5728\u4e0d\u540c\u7684\u8f6e\u6bc2\u95f4\u8ddd\uff08\u5373\u4e0d\u540c\u201c\u8868\u9762\u5f20\u529b\u201d\uff09\u4e0b\uff0c\u5bf9\u8f66\u8f6e\u8fdb\u884c\u6309\u538b\uff0c\u5e76\u6d4b\u91cf\u5176\u529b-\u4f4d\u79fb\u66f2\u7ebf\u3002\n\u00a0 \u00a0 (2) **\u5e73\u5730\u6a21\u62df (\u56fe4B, C, D, E):** \u4f7f\u7528\u5bbd\u538b\u5934\u6a21\u62df\u5e73\u5730\u3002\u7ed3\u679c\u663e\u793a\uff0c\u5f53\u8f6e\u6bc2\u95f4\u8ddd\u6700\u5c0f\u65f6\uff08\u5f20\u529b\u6700\u5927\uff0c\u5982\u56fe4C\uff09\uff0c\u8f66\u8f6e\u8868\u73b0\u51fa\u6781\u9ad8\u7684\u521d\u59cb\u521a\u5ea6\uff08\u7b2c\u4e00\u533a\u57df\uff09\uff0c\u5982\u540c\u4e00\u4e2a\u786c\u8f6e\u3002\u800c\u5f53\u8f6e\u6bc2\u95f4\u8ddd\u589e\u5927\u65f6\uff08\u5f20\u529b\u51cf\u5c0f\uff0c\u5982\u56fe4D\uff09\uff0c\u5176\u521d\u59cb\u521a\u5ea6\u663e\u8457\u964d\u4f4e\uff0c\u53d8\u5f97\u975e\u5e38\u201c\u8f6f\u201d\u3002\n\u00a0 \u00a0 (3) **\u8d8a\u969c\u6a21\u62df (\u56fe4F, G, H):** \u4f7f\u7528\u7a84\u538b\u5934\u6a21\u62df\u969c\u788d\u7269\u3002\u7ed3\u679c\u540c\u6837\u663e\u793a\uff0c\u901a\u8fc7\u589e\u5927\u8f6e\u6bc2\u95f4\u8ddd\uff0c\u53ef\u4ee5\u663e\u8457\u964d\u4f4e\u8f66\u8f6e\u5728\u63a5\u89e6\u969c\u788d\u7269\u65f6\u7684\u201c\u8fc7\u6e21\u529b\u201d\uff08Transition force\uff09\uff0c\u4f7f\u5176\u66f4\u5bb9\u6613\u53d1\u751f\u53d8\u5f62\u3002\n\n\n**\u56fe2. \u57fa\u4e8e\u94a2\u4e1d\u8f90\u6761\u5f20\u529b\u7684\u521a\u5ea6\u53d8\u5316\u673a\u5236\u3002**\n\n**\u56fe4. \u57fa\u4e8e\u8868\u9762\u5f20\u529b\u7684\u8f66\u8f6e\u7279\u6027\u8bc4\u4f30\u3002**\n\n\n\n## 05 \u201c\u667a\u80fd\u94fe\u201d\u7684\u8bbe\u8ba1 (\u56fe3)\n\n\u4e3a\u4e86\u66f4\u597d\u5730\u6a21\u4eff\u6db2\u6ef4\u201c\u5728\u53d8\u5f62\u65f6\u8868\u9762\u79ef\u589e\u52a0\u201d\u7684\u7279\u6027\uff0c\u7814\u7a76\u56e2\u961f\u8fd8\u4e3a\u667a\u80fd\u94fe\u672c\u8eab\u8bbe\u8ba1\u4e86\u4e00\u5957\u5de7\u5999\u7684\u51e0\u4f55\u7ed3\u6784\u3002\n1.\u00a0 **\u66f2\u7387\u4f9d\u8d56\u7684\u8ddd\u79bb\u53d8\u5316 (\u56fe3A):** \u667a\u80fd\u94fe\u7684\u6bcf\u4e2a\u5355\u5143\u5757\u4e4b\u95f4\u7684\u8fde\u63a5\uff0c\u88ab\u8bbe\u8ba1\u4e3a\u5728**\u6b63\u5411\u5f2f\u66f2**\uff08\u8fdc\u79bb\u8f6e\u5fc3\uff09\u65f6\uff0c\u5355\u5143\u5757\u95f4\u8ddd\u4f1a**\u589e\u5927**\uff1b\u800c\u5728**\u53cd\u5411\u5f2f\u66f2**\uff08\u671d\u5411\u8f6e\u5fc3\uff09\u65f6\uff0c\u95f4\u8ddd\u4fdd\u6301**\u4e0d\u53d8**\u3002\n2.\u00a0 **\u80fd\u91cf\u6700\u5c0f\u5316\u539f\u7406:** \u8fd9\u610f\u5473\u7740\uff0c\u8f66\u8f6e\u7684**\u5468\u957f**\uff08\u603b\u52bf\u80fd\uff09\u5728**\u5706\u5f62**\u72b6\u6001\u4e0b\u662f\u6700\u5c0f\u7684\u3002\u4efb\u4f55\u504f\u79bb\u5706\u5f62\u7684\u53d8\u5f62\uff0c\u90fd\u4f1a\u56e0\u5355\u5143\u5757\u95f4\u8ddd\u7684\u589e\u5927\u800c\u5bfc\u81f4\u5468\u957f\u589e\u52a0\uff0c\u4ece\u800c\u589e\u52a0\u7cfb\u7edf\u7684\u603b\u52bf\u80fd\u3002\u8fd9\u5728\u7269\u7406\u4e0a\u786e\u4fdd\u4e86\u8f66\u8f6e\u5728\u4e0d\u53d7\u5916\u529b\u65f6\uff0c\u6709\u81ea\u52a8\u6062\u590d\u5230\u5706\u5f62\u7684\u8d8b\u52bf\u3002\n\n\n\n**\u56fe3. \u667a\u80fd\u94fe\u7ed3\u6784\u7684\u51e0\u4f55\u63cf\u8ff0\u3002**\n\n\n\n### 06 \u8d8a\u969c\u80fd\u529b\u8bc4\u4f30 (\u56fe5 & \u56fe6)\n\n\n\n1.\u00a0 **\u5b9e\u9a8c\u5ba4\u6d4b\u8bd5 (\u56fe5):**\n\u00a0 \u00a0 (1) **\u8f68\u8ff9\u5bf9\u6bd4:** **\u56fe5A, B**\u6e05\u6670\u5730\u663e\u793a\uff0c\u5728\u9762\u5bf9\u4e00\u4e2a\u53f0\u9636\u65f6\uff0c\u9ad8\u521a\u5ea6\uff08\u8f6e\u6bc2\u95f4\u8ddd\u5c0f\uff09\u7684\u8f66\u8f6e\u4f1a\u50cf\u666e\u901a\u8f6e\u5b50\u4e00\u6837\uff0c\u7ed5\u7740\u53f0\u9636\u8fb9\u7f18\u201c\u786c\u201d\u7ffb\u8fc7\u53bb\uff0c\u5bfc\u81f4\u8f66\u8eab\u5267\u70c8\u98a0\u7c38\u3002\u800c\u4f4e\u521a\u5ea6\uff08\u8f6e\u6bc2\u95f4g\u0101o\u8ddd\u5927\uff09\u7684\u8f66\u8f6e\uff0c\u5219\u4f1a\u5e73\u6ed1\u5730\u53d8\u5f62\uff0c\u201c\u5305\u88f9\u201d\u4f4f\u53f0\u9636\uff0c\u4f7f\u5f97\u8f66\u8eab\u7684\u5782\u76f4\u4f4d\u79fb\u5c0f\u5f97\u591a\uff0c\u8fc7\u7a0b\u975e\u5e38\u5e73\u7a33\u3002\n\u00a0 \u00a0 (2) **\u5b9e\u65f6\u6a21\u5f0f\u5207\u6362 (\u56fe5C):** \u5c55\u793a\u4e86\u673a\u5668\u4eba\u5728\u4e0b\u53f0\u9636\u65f6\uff0c\u901a\u8fc7\u5b9e\u65f6\u5730\u4ece\u9ad8\u521a\u5ea6\u5207\u6362\u5230\u4f4e\u521a\u5ea6\uff0c\u907f\u514d\u4e86\u5267\u70c8\u7684\u51b2\u51fb\u3002\n\n2.\u00a0 **\u4eff\u771f\u9a8c\u8bc1 (\u56fe6):**\n\u00a0 \u00a0 (1) **\u7a33\u5b9a\u6027\u5206\u6790 (\u56fe6A, B):** \u901a\u8fc7\u4eff\u771f\uff0c\u7814\u7a76\u56e2\u961f\u91cf\u5316\u4e86\u5728\u4e0d\u540c\u53f0\u9636\u9ad8\u5ea6\u548c\u8d1f\u8f7d\u4e0b\uff0c\u6210\u529f\u8d8a\u969c\u6240\u9700\u7684\u6700\u5c0f\u8f6e\u6bc2\u95f4\u8ddd\uff08\u5373\u6700\u5927\u201c\u67d4\u8f6f\u5ea6\u201d\uff09\u3002\n\u00a0 \u00a0 (2) **\u53d8\u5f62\u8fc7\u7a0b\u53ef\u89c6\u5316 (\u56fe6F):** \u4eff\u771f\u52a8\u753b\u6e05\u6670\u5730\u5c55\u793a\u4e86\u8f66\u8f6e\u5728\u8d8a\u969c\u8fc7\u7a0b\u4e2d\u7684\u8be6\u7ec6\u53d8\u5f62\u8fc7\u7a0b\uff0c\u4e0e\u771f\u5b9e\u4e16\u754c\u7684\u8868\u73b0\u9ad8\u5ea6\u4e00\u81f4\u3002\n\n\n\n\n\n**\u56fe5. \u8f66\u8f6e\u8f68\u8ff9\u8bc4\u4f30\u3002**\n\n**\u56fe6. \u8d8a\u969c\u80fd\u529b\u4e0e\u4eff\u771f\u7ed3\u679c\u8bc4\u4f30\u3002**\n\n\n\n## 07 \u771f\u5b9e\u4e16\u754c\u9a8c\u8bc1 (\u56fe7)\n\u8fd9\u662f\u5bf9\u6574\u4e2a\u7cfb\u7edf\u80fd\u529b\u7684\u6700\u7ec8\u3001\u6700\u5168\u9762\u7684\u5c55\u793a\u3002\n1.\u00a0 **\u56db\u8f6e\u5c0f\u8f66 (\u56fe7A, B):** \u4e00\u4e2a\u5c0f\u578b\u7684\u56db\u8f6e\u9a8c\u8bc1\u5e73\u53f0\uff0c\u6210\u529f\u5730\u5728\u5e03\u6ee1\u4e0d\u89c4\u5219\u77f3\u5757\u7684\u5730\u9762\uff08A\uff09\u548c\u9ad8\u8fbe$180$\u6beb\u7c73\u7684\u53f0\u9636\uff08B\uff0c\u4e3a\u8f66\u8f6e\u534a\u5f84\u7684$1.2$\u500d\uff09\u4e0a\uff0c\u901a\u8fc7\u5207\u6362\u8f66\u8f6e\u72b6\u6001\uff0c\u5b9e\u73b0\u4e86\u5e73\u7a33\u7a7f\u8d8a\u3002\n\n2.\u00a0 **\u53cc\u8f6e\u8f6e\u6905 (\u56fe7C, D):**\n\n\u00a0 \u00a0 (1) **\u786c\u4ef6:** \u4e00\u4e2a$120$\u516c\u65a4\u7ea7\u7684\u3001\u642d\u8f7d\u4e86\u4e24\u4e2a$560$\u6beb\u7c73\u76f4\u5f84\u53ef\u53d8\u521a\u5ea6\u8f66\u8f6e\u7684\u5168\u5c3a\u5bf8\u8f6e\u6905\u3002\n\n\u00a0 \u00a0 (2) **\u6237\u5916\u6d4b\u8bd5:** \u5728\u771f\u5b9e\u7684\u6237\u5916\u73af\u5883\u4e2d\uff0c\u8f6e\u6905\u6210\u529f\u5730\u5728\u4e00\u4e2a\u65b9\u5f62\u969c\u788d\u7269\uff08C\uff09\u548c\u4e0d\u89c4\u5219\u7684\u5ca9\u77f3\uff08D\uff09\u524d\uff0c**\u5b9e\u65f6\u5730\u5c06\u8f66\u8f6e\u4ece\u201c\u786c\u201d\u5207\u6362\u4e3a\u201c\u8f6f\u201d**\uff0c\u5e76\u5b89\u5168\u3001\u5e73\u7a33\u5730\u8d8a\u8fc7\u4e86\u969c\u788d\u3002\n\n\u00a0 \u00a0 (3) **\u63a7\u5236\u7b97\u6cd5 (\u516c\u5f0f7):** \u5176\u5e73\u8861\u4e0e\u8fd0\u52a8\u63a7\u5236\uff0c\u7531\u4e00\u4e2a\u57fa\u4e8e\u52a8\u529b\u5b66\u6a21\u578b\u7684\u63a7\u5236\u5668$\\tau(t) = \\tau_{fw}(t) + \\tau_{fbk}(t)$\u5b9e\u73b0\u3002\n\n\n\n\n**\u56fe7. \u57fa\u4e8e\u8868\u9762\u5f20\u529b\u7684\u8f66\u8f6e\u7279\u6027\u8bc4\u4f30\u3002**\n\n\n## 08 \u7ed3\u8bba\u4e0e\u5c55\u671b\n\n\u672c\u6587\u901a\u8fc7\u4e00\u4e2a\u6e90\u4e8e\u81ea\u7136\u3001\u8bbe\u8ba1\u7cbe\u5de7\u7684\u53ef\u53d8\u521a\u5ea6\u53d8\u5f62\u8f66\u8f6e\uff0c\u6210\u529f\u5730\u4e3a\u79fb\u52a8\u673a\u5668\u4eba\u514b\u670d\u4e86\u201c\u5e73\u5730\u6548\u7387\u201d\u4e0e\u201c\u8d8a\u969c\u80fd\u529b\u201d\u4e4b\u95f4\u7684\u7ecf\u5178\u77db\u76fe\u3002\u5b83\u4e0d\u4ec5\u5728\u6280\u672f\u4e0a\u5b9e\u73b0\u4e86\u91cc\u7a0b\u7891\u5f0f\u7684\u7a81\u7834\uff0c\u5176\u201c\u8f6f\u786c\u517c\u65bd\u3001\u5b9e\u65f6\u5207\u6362\u201d\u7684\u8bbe\u8ba1\u54f2\u5b66\uff0c\u4e5f\u4e3a\u672a\u6765\u6240\u6709\u9700\u8981\u5728\u590d\u6742\u3001\u975e\u7ed3\u6784\u5316\u73af\u5883\u4e2d\u4e0e\u7269\u7406\u4e16\u754c\u8fdb\u884c\u4ea4\u4e92\u7684\u673a\u5668\u4eba\uff0c\u63d0\u4f9b\u4e86\u6781\u5176\u5b9d\u8d35\u7684\u901a\u7528\u89e3\u51b3\u65b9\u6848\u3002\u8fd9\u9879\u5de5\u4f5c\u9884\u793a\u7740\uff0c\u672a\u6765\u7684\u8f6e\u5f0f\u673a\u5668\u4eba\uff0c\u6216\u8bb8\u771f\u7684\u80fd\u50cf\u6db2\u4f53\u4e00\u6837\uff0c\u65e0\u5f80\u4e0d\u81f3\u3002\n\n\u8bf7\u4e25\u683c\u6309\u7167\u4ee5\u4e0a\u6a21\u677f\u7684\u98ce\u683c\u548c\u7ed3\u6784\u6765\u64b0\u5199\u6587\u7ae0\u3002`;\n\nreturn {\n  chatInput: `${promptTemplate}\\n\\n\u4ee5\u4e0b\u662fPDF\u8bba\u6587\u5185\u5bb9\uff1a\\n\\n${pdfText}`\n};"
      },
      "id": "fe9af1d7-8995-4aa7-89e7-f9849cc76c54",
      "name": "\u51c6\u5907AI Prompt",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -2688,
        -368
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://host.docker.internal:3456/convert",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ { \"markdown\": $json.output || $json.text, \"imagePaths\": [] } }}",
        "options": {
          "timeout": 120000
        }
      },
      "id": "5f9f75a9-d4bc-421b-af19-9814f6f01d6c",
      "name": "Mdnice\u683c\u5f0f\u8f6c\u6362",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -1904,
        -352
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "http://host.docker.internal:3457/extract",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ { \"pdfPath\": $json.pdfPath, \"outputDir\": $json.outputDir } }}",
        "options": {
          "timeout": 600000
        }
      },
      "id": "b216adf4-dc56-4a1a-8d3d-7810b7de3350",
      "name": "\u63d0\u53d6PDF\u56fe\u7247",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -2880,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// \u4eceHTTP Request\u8282\u70b9\u83b7\u53d6\u56fe\u7247\u63d0\u53d6\u670d\u52a1\u7684\u54cd\u5e94\nconst response = $input.first().json;\n\n// \u68c0\u67e5\u63d0\u53d6\u662f\u5426\u6210\u529f\nif (!response.success) {\n  const errorMsg = response.error || '\u672a\u77e5\u9519\u8bef';\n  console.error('\u56fe\u7247\u63d0\u53d6\u5931\u8d25:', errorMsg);\n  return [];\n}\n\n// \u83b7\u53d6\u56fe\u8868\u4fe1\u606f\u548c\u7b2c\u4e00\u9875\nconst figures = response.figures || [];\nconst firstPage = response.first_page;\n\nif (figures.length === 0) {\n  console.log('\u672a\u63d0\u53d6\u5230\u4efb\u4f55\u56fe\u8868');\n}\n\nconsole.log(`\u6210\u529f\u63d0\u53d6 ${figures.length} \u4e2a\u56fe\u8868\uff0c\u8f6c\u6362\u4e3abinary\u683c\u5f0f...`);\n\n// \u5c06\u6bcf\u4e2a\u56fe\u7247\u7684base64\u6570\u636e\u8f6c\u6362\u4e3an8n\u7684binary\u683c\u5f0f\nconst results = [];\n\n// \u9996\u5148\u6dfb\u52a0\u7b2c\u4e00\u9875\uff08\u5982\u679c\u5b58\u5728\uff09\nif (firstPage && firstPage.base64_data) {\n  console.log(`\u6dfb\u52a0\u7b2c\u4e00\u9875: ${firstPage.filename} (${firstPage.base64_data.length} chars)`);\n  results.push({\n    json: {\n      type: 'first_page',\n      fileName: firstPage.filename,\n      page: firstPage.page,\n      // \u5c06\u56fe\u7247\u7d22\u5f15\u7f16\u7801\u5230\u6587\u4ef6\u540d\u4e2d\uff0c\u786e\u4fdd\u4e0d\u4f1a\u4e22\u5931\n      encodedFileName: `first_page_p${firstPage.page}.png`\n    },\n    binary: {\n      data: {\n        data: firstPage.base64_data,\n        mimeType: firstPage.mime_type || 'image/png',\n        fileName: `first_page_p${firstPage.page}.png`,\n        fileExtension: 'png'\n      }\n    }\n  });\n}\n\n// \u7136\u540e\u6dfb\u52a0\u6240\u6709\u56fe\u8868\nfor (let idx = 0; idx < figures.length; idx++) {\n  const fig = figures[idx];\n  \n  if (!fig.base64_data) {\n    console.error(`  [${idx + 1}/${figures.length}] \u7f3a\u5c11 base64_data`);\n    continue;\n  }\n  \n  // \u5c06 figureIndex \u7f16\u7801\u5230\u6587\u4ef6\u540d\u4e2d\uff0c\u683c\u5f0f\uff1afig_{figureIndex}_idx_{imageIndex}_p{page}.png\n  const figNum = fig.figure_index ?? idx;\n  const encodedFileName = `fig_${figNum}_idx_${idx}_p${fig.page}.png`;\n  \n  console.log(`  [${idx + 1}/${figures.length}] ${fig.filename} -> ${encodedFileName} (${fig.base64_data.length} chars)`);\n  \n  results.push({\n    json: {\n      type: 'figure',\n      imageIndex: idx,\n      fileName: fig.filename,\n      page: fig.page,\n      figureIndex: figNum,\n      caption: fig.caption,\n      // \u7f16\u7801\u540e\u7684\u6587\u4ef6\u540d\uff0c\u5305\u542b\u6240\u6709\u5173\u952e\u4fe1\u606f\n      encodedFileName: encodedFileName\n    },\n    binary: {\n      data: {\n        data: fig.base64_data,\n        mimeType: fig.mime_type || 'image/png',\n        // \u4f7f\u7528\u7f16\u7801\u540e\u7684\u6587\u4ef6\u540d\u4f5c\u4e3a\u4e0a\u4f20\u65f6\u7684\u6587\u4ef6\u540d\n        fileName: encodedFileName,\n        fileExtension: 'png'\n      }\n    }\n  });\n}\n\nconsole.log(`\u8f6c\u6362\u5b8c\u6210\uff0c\u6210\u529f ${results.length} \u4e2a\u56fe\u7247\uff08\u542b\u7b2c\u4e00\u9875\uff09`);\nreturn results;"
      },
      "id": "ddaadcb7-a741-4b47-9b0f-252ba5b2c110",
      "name": "\u5904\u7406\u56fe\u7247\u8def\u5f84",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -2720,
        0
      ]
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "9175b0e5-7f31-4d04-b227-86c541298bc3",
      "name": "\u5408\u5e76Markdown\u548c\u56fe\u7247",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2.1,
      "position": [
        -2096,
        -352
      ]
    },
    {
      "parameters": {
        "resource": "media",
        "operation": "media:uploadOther"
      },
      "name": "\u4e0a\u4f20\u6b63\u6587\u56fe\u7247",
      "type": "n8n-nodes-wechat-offiaccount.wechatOfficialAccountNode",
      "typeVersion": 1,
      "position": [
        -2176,
        -48
      ],
      "id": "593ace70-b761-44de-8a4e-6ea13c261fdd",
      "credentials": {
        "wechatOfficialAccountCredentialsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// \u4ece\u6240\u6709\u8f93\u5165\u4e2d\u6536\u96c6\u4e0a\u4f20\u7ed3\u679c\uff0c\u786e\u4fdd\u4fdd\u7559\u539f\u59cb\u7684\u5143\u6570\u636e\nconst allInputs = $input.all();\n\nconsole.log('=== \u6c47\u603b\u6b63\u6587\u56fe\u7247\u94fe\u63a5 ===');\nconsole.log('\u603b\u8f93\u5165\u6570\u91cf:', allInputs.length);\n\n// \u8f85\u52a9\u51fd\u6570\uff1a\u4ece\u7f16\u7801\u7684\u6587\u4ef6\u540d\u4e2d\u63d0\u53d6 figureIndex\nfunction extractFigureIndexFromFileName(fileName) {\n  if (!fileName) return null;\n\n  // \u683c\u5f0f\uff1afig_{figureIndex}_idx_{imageIndex}_p{page}.png\n  const match = fileName.match(/fig_(\\d+)_idx_(\\d+)_p(\\d+)\\.png/);\n  if (match) {\n    return {\n      figureIndex: parseInt(match[1], 10),\n      imageIndex: parseInt(match[2], 10),\n      page: parseInt(match[3], 10)\n    };\n  }\n\n  // \u683c\u5f0f\uff1afirst_page_p{page}.png\n  const firstPageMatch = fileName.match(/first_page_p(\\d+)\\.png/);\n  if (firstPageMatch) {\n    return {\n      figureIndex: null,\n      imageIndex: -1,\n      page: parseInt(firstPageMatch[1], 10),\n      isFirstPage: true\n    };\n  }\n\n  return null;\n}\n\nconst uploads = [];\n\nfor (let i = 0; i < allInputs.length; i++) {\n  const item = allInputs[i];\n  const jsonData = item.json;\n\n  console.log(`\\n\u5904\u7406\u56fe\u7247 ${i + 1}/${allInputs.length}:`);\n  console.log('  json keys:', Object.keys(jsonData));\n\n  // \u5fae\u4fe1\u4e0a\u4f20\u540e\u8fd4\u56de\u7684 url\n  const url = jsonData.url;\n\n  if (!url) {\n    console.log('  \u26a0\ufe0f \u7f3a\u5c11 url\uff0c\u8df3\u8fc7');\n    continue;\n  }\n\n  // \u5c1d\u8bd5\u83b7\u53d6\u5143\u6570\u636e\n  let figureIndex = jsonData.figureIndex;\n  let imageIndex = jsonData.imageIndex;\n  let fileName = jsonData.fileName || jsonData.filename;\n\n  // \u5982\u679c\u6ca1\u6709 figureIndex\uff0c\u5c1d\u8bd5\u4ece\u6587\u4ef6\u540d\u4e2d\u63d0\u53d6\n  if (figureIndex === undefined || figureIndex === null) {\n    // \u5c1d\u8bd5\u4ece\u591a\u4e2a\u53ef\u80fd\u7684\u5b57\u6bb5\u83b7\u53d6\u6587\u4ef6\u540d\n    const possibleFileNames = [\n      jsonData.encodedFileName,\n      jsonData.fileName,\n      jsonData.filename,\n      jsonData.name\n    ];\n\n    for (const fn of possibleFileNames) {\n      if (fn) {\n        const extracted = extractFigureIndexFromFileName(fn);\n        if (extracted) {\n          figureIndex = extracted.figureIndex;\n          imageIndex = extracted.imageIndex;\n          console.log(`  \u2713 \u4ece\u6587\u4ef6\u540d \"${fn}\" \u4e2d\u63d0\u53d6: figureIndex=${figureIndex}, imageIndex=${imageIndex}`);\n          break;\n        }\n      }\n    }\n  }\n\n  console.log(`  url: ${url.substring(0, 50)}...`);\n  console.log(`  figureIndex: ${figureIndex}`);\n  console.log(`  imageIndex: ${imageIndex}`);\n  console.log(`  fileName: ${fileName}`);\n\n  uploads.push({\n    url: url,\n    media_id: jsonData.media_id,\n    figureIndex: figureIndex,\n    imageIndex: imageIndex,\n    fileName: fileName,\n    type: jsonData.type || 'figure'\n  });\n}\n\n// \u6309 imageIndex \u6392\u5e8f\nuploads.sort((a, b) => (a.imageIndex ?? 0) - (b.imageIndex ?? 0));\n\nconsole.log(`\\n=== \u6c47\u603b\u5b8c\u6210: ${uploads.length} \u5f20\u56fe\u7247 ===`);\nuploads.forEach((img, idx) => {\n  console.log(`  [${idx + 1}] figureIndex=${img.figureIndex}, imageIndex=${img.imageIndex}, url=${img.url.substring(0, 40)}...`);\n});\n\nreturn [{ json: { uploadedImages: uploads } }];"
      },
      "name": "\u6c47\u603b\u6b63\u6587\u56fe\u7247\u94fe\u63a5",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1760,
        0
      ],
      "id": "c4808a93-4ac7-424c-b6c9-4942f609866b"
    },
    {
      "parameters": {
        "jsCode": "// \u5408\u5e76\u8282\u70b9\u5c06\u4e24\u4e2a\u8f93\u5165\u5408\u5e76\u6210\u4e00\u4e2aitem\uff0c\u6240\u6709\u5b57\u6bb5\u90fd\u5728\u540c\u4e00\u4e2a\u5bf9\u8c61\u91cc\nconst mergedData = $input.first().json;\n\n// \u4ece\u5408\u5e76\u540e\u7684\u6570\u636e\u4e2d\u63d0\u53d6\u6240\u6709\u5b57\u6bb5\nconst uploadedImages = Array.isArray(mergedData.uploadedImages) ? mergedData.uploadedImages : [];\nlet content = mergedData.content || '';\nconst firstPageUrl = mergedData.url || null;\n\nconsole.log('=== \u56fe\u7247\u63d2\u5165\uff08\u667a\u80fd\u5f15\u7528\u5339\u914d\u7248\u672c\uff09===');\nconsole.log('\u5408\u5e76\u540e\u7684\u6570\u636ekeys:', Object.keys(mergedData));\nconsole.log('\u7b2c\u4e00\u9875\u56fe\u7247URL:', firstPageUrl);\nconsole.log('\u6b63\u6587\u56fe\u7247\u6570\u91cf:', uploadedImages.length);\nif (uploadedImages.length > 0) {\n  console.log('\u4e0a\u4f20\u7684\u56fe\u7247\u8be6\u60c5:');\n  uploadedImages.forEach((img, idx) => {\n    console.log(`  \u56fe${idx + 1}: figureIndex=${img.figureIndex || 'N/A'}, url=${img.url || '(\u65e0URL)'}`);\n  });\n}\n\n// ==================== \u8f85\u52a9\u51fd\u6570 ====================\n\n// \u521b\u5efa\u56fe\u7247 HTML \u6807\u7b7e\nfunction createImageTag(url) {\n  return `<p data-tool=\"mdnice\u7f16\u8f91\u5668\" style=\"color: rgb(43, 43, 43); font-size: 14px; line-height: 1.8em; letter-spacing: 0.02em; text-align: center; text-indent: 0em; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; padding-top: 8px; padding-bottom: 8px; padding-left: 0px; padding-right: 0px;\"><img src=\"${url}\" data-src=\"${url}\" style=\"max-width: 100%; height: auto;\" /></p>`;\n}\n\n// \u65b0\u51fd\u6570: \u5728 HTML \u4e2d\u67e5\u627e\u6240\u6709\"\u56feX\"\u7684\u63d0\u53ca\nfunction findFigureReferencesInText(htmlContent) {\n  const figureReferences = new Map();\n\n  // \u5339\u914d\u5404\u79cd\u5f62\u5f0f\u7684\u56fe\u7247\u63d0\u53ca\uff1a\"\u56fe1\"\u3001\"\u5982\u56fe2\u6240\u793a\"\u3001\"\u53c2\u89c1\u56fe3\"\u7b49\n  const refPattern = /(?:\u5982\u56fe|\u53c2\u89c1\u56fe|\u89c1\u56fe|\u56fe\\s*)(\\d+)(?:\\s*(?:\u6240\u793a|\u663e\u793a|\u8868\u660e|\u5c55\u793a|\u4e2d))?/g;\n\n  // \u5339\u914d\u5757\u7ea7\u5143\u7d20\n  const elementPattern = /<(p|h2|h3|h4|li|div)([^>]*)>(.*?)<\\/\\1>/gs;\n\n  let elementMatch;\n  while ((elementMatch = elementPattern.exec(htmlContent)) !== null) {\n    const [fullElement, tagName, attributes, innerHTML] = elementMatch;\n    // \u63d0\u53d6\u7eaf\u6587\u672c\uff08\u53bb\u9664\u5185\u90e8 HTML \u6807\u7b7e\uff09\n    const textContent = innerHTML.replace(/<[^>]+>/g, '');\n\n    // \u5728\u6587\u672c\u4e2d\u641c\u7d22\u56fe\u7247\u63d0\u53ca\n    let refMatch;\n    refPattern.lastIndex = 0; // \u91cd\u7f6e\u6b63\u5219\u4f4d\u7f6e\n    while ((refMatch = refPattern.exec(textContent)) !== null) {\n      const figNum = parseInt(refMatch[1], 10);\n\n      // \u53ea\u8bb0\u5f55\u7b2c\u4e00\u6b21\u51fa\u73b0\u7684\u4f4d\u7f6e\n      if (!figureReferences.has(figNum)) {\n        figureReferences.set(figNum, {\n          figureNumber: figNum,\n          insertPosition: elementMatch.index + fullElement.length,\n          elementMatch: fullElement,\n          tagName: tagName,\n          context: textContent.substring(\n            Math.max(0, refMatch.index - 10),\n            Math.min(textContent.length, refMatch.index + 20)\n          )\n        });\n      }\n    }\n  }\n\n  return figureReferences;\n}\n\n// \u65b0\u51fd\u6570: \u6839\u636e\u5f15\u7528\u4f4d\u7f6e\u63d2\u5165\u56fe\u7247\nfunction insertAtReferences(htmlContent, images, references) {\n  const insertedFigures = new Set();\n  const insertionPlan = [];\n\n  // \u6784\u5efa\u63d2\u5165\u8ba1\u5212\n  images.forEach((upload, idx) => {\n    if (!upload || !upload.url) {\n      console.log(`  \u26a0\ufe0f \u56fe\u7247${idx + 1}\uff1aURL\u4e3a\u7a7a\uff0c\u8df3\u8fc7`);\n      return;\n    }\n\n    const figNum = upload.figureIndex;\n    if (figNum === undefined || figNum === null) {\n      console.log(`  \u26a0\ufe0f \u56fe\u7247${idx + 1}\uff1a\u7f3a\u5c11 figureIndex\uff0c\u8df3\u8fc7`);\n      return;\n    }\n\n    if (references.has(figNum)) {\n      const ref = references.get(figNum);\n      insertionPlan.push({\n        figNum: figNum,\n        imageUrl: upload.url,\n        position: ref.insertPosition,\n        element: ref.elementMatch,\n        context: ref.context\n      });\n      insertedFigures.add(figNum);\n    }\n  });\n\n  // \u6309\u4f4d\u7f6e\u5012\u5e8f\u6392\u5e8f\uff08\u4ece\u540e\u5f80\u524d\u63d2\u5165\uff0c\u907f\u514d\u4f4d\u7f6e\u504f\u79fb\uff09\n  insertionPlan.sort((a, b) => b.position - a.position);\n\n  // \u6267\u884c\u63d2\u5165\n  let modifiedContent = htmlContent;\n  insertionPlan.forEach(({figNum, imageUrl, element, context}) => {\n    const imgTag = createImageTag(imageUrl);\n    modifiedContent = modifiedContent.replace(element, element + '\\n' + imgTag);\n    console.log(`  \u2713 \u56fe${figNum} \u63d2\u5165\u5230\u5f15\u7528\u4f4d\u7f6e\u540e (\"${context}...\")`);\n  });\n\n  // \u6536\u96c6\u672a\u63d2\u5165\u7684\u56fe\u7247\n  const uninsertedImages = images.filter((img, idx) => {\n    const figNum = img.figureIndex;\n    return figNum !== undefined && figNum !== null && !insertedFigures.has(figNum);\n  });\n\n  return {\n    modifiedContent: modifiedContent,\n    insertedFigures: insertedFigures,\n    uninsertedImages: uninsertedImages\n  };\n}\n\n// \u6807\u51c6\u56fe\u6ce8\u63d2\u5165\uff08\u4fdd\u6301\u539f\u6709\u903b\u8f91\uff09\nfunction insertAtCaptions(htmlContent, images, captionMatches) {\n  // \u521b\u5efa\u56fe\u53f7\u5230\u56fe\u7247\u7684\u6620\u5c04\u8868\n  const figureMap = new Map();\n  images.forEach(img => {\n    if (img.figureIndex !== undefined && img.figureIndex !== null) {\n      figureMap.set(img.figureIndex, img);\n    }\n  });\n\n  console.log(`\u521b\u5efa\u56fe\u53f7\u6620\u5c04\u8868: ${figureMap.size} \u4e2a\u56fe\u7247`);\n  figureMap.forEach((img, figNum) => {\n    console.log(`  \u56fe${figNum} -> ${img.url}`);\n  });\n\n  // \u5728\u56fe\u7247\u6807\u8bb0\u524d\u63d2\u5165\u5bf9\u5e94\u7684\u5fae\u4fe1\u56fe\u7247\n  const figurePattern = /<strong[^>]*>\u56fe\\s*(\\d+)\\..*?<\\/strong>/g;\n  let insertedCount = 0;\n  let notFoundFigures = [];\n\n  htmlContent = htmlContent.replace(figurePattern, (match, figNum) => {\n    const figureIndex = parseInt(figNum, 10);\n    const upload = figureMap.get(figureIndex);\n\n    if (!upload || !upload.url) {\n      console.log(`  \u26a0\ufe0f \u56fe${figNum}\uff1a\u672a\u627e\u5230\u5bf9\u5e94\u7684\u4e0a\u4f20\u56fe\u7247\uff0c\u8df3\u8fc7`);\n      notFoundFigures.push(figNum);\n      return match;\n    }\n\n    console.log(`  \u2713 \u5728\"\u56fe${figNum}\"\u6807\u8bb0\u524d\u63d2\u5165\u5bf9\u5e94\u56fe\u7247: ${upload.url}`);\n    const imgTag = createImageTag(upload.url);\n    insertedCount++;\n    return imgTag + '\\n' + match;\n  });\n\n  console.log(`\u6807\u51c6\u56fe\u6ce8\u63d2\u5165\u5b8c\u6210\uff1a\u6210\u529f\u63d2\u5165 ${insertedCount} \u5f20\u56fe\u7247`);\n  if (notFoundFigures.length > 0) {\n    console.log(`  \u26a0\ufe0f \u672a\u627e\u5230\u5bf9\u5e94\u56fe\u7247\u7684\u56fe\u53f7: ${notFoundFigures.join(', ')}`);\n  }\n\n  return htmlContent;\n}\n\n// Fallback: \u5c06\u6240\u6709\u56fe\u7247\u63d2\u5165\u5230\u5f00\u5934\nfunction insertAllAtBeginning(htmlContent, images) {\n  console.log('\u26a0\ufe0f \u4f7f\u7528 fallback \u6a21\u5f0f\uff1a\u5c06\u6240\u6709\u56fe\u7247\u63d2\u5165\u5230\u6587\u7ae0\u5f00\u5934');\n\n  const allImagesHtml = images.map((upload, idx) => {\n    if (!upload || !upload.url) {\n      console.log(`  \u26a0\ufe0f \u56fe\u7247${idx + 1}\uff1aURL\u4e3a\u7a7a\uff0c\u8df3\u8fc7`);\n      return '';\n    }\n    console.log(`  \u2713 \u63d2\u5165\u56fe\u7247${idx + 1}: ${upload.url}`);\n    return createImageTag(upload.url);\n  }).filter(html => html).join('\\n');\n\n  // \u4f18\u5148\u5728\u7b2c\u4e00\u4e2ah2\u6807\u7b7e\u524d\u63d2\u5165\n  const h2Regex = /<h2[^>]*>/i;\n  if (h2Regex.test(htmlContent)) {\n    htmlContent = htmlContent.replace(h2Regex, `${allImagesHtml}\\n$&`);\n    console.log('  \u2713 \u5df2\u5728\u7b2c\u4e00\u4e2a<h2>\u6807\u7b7e\u524d\u63d2\u5165\u6240\u6709\u56fe\u7247');\n  } else {\n    // \u5982\u679c\u6ca1\u6709h2\uff0c\u5728\u7b2c\u4e00\u4e2a</blockquote>\u540e\u63d2\u5165\n    const blockquoteEndRegex = /<\\/blockquote>/i;\n    if (blockquoteEndRegex.test(htmlContent)) {\n      htmlContent = htmlContent.replace(blockquoteEndRegex, `$&\\n${allImagesHtml}`);\n      console.log('  \u2713 \u5df2\u5728</blockquote>\u540e\u63d2\u5165\u6240\u6709\u56fe\u7247');\n    } else {\n      // \u5982\u679c\u90fd\u6ca1\u6709\uff0c\u5728\u5185\u5bb9\u6700\u524d\u9762\u63d2\u5165\n      htmlContent = allImagesHtml + '\\n' + htmlContent;\n      console.log('  \u2713 \u5df2\u5728\u5185\u5bb9\u6700\u524d\u9762\u63d2\u5165\u6240\u6709\u56fe\u7247');\n    }\n  }\n\n  return htmlContent;\n}\n\n// ==================== \u4e3b\u903b\u8f91 ====================\n\nconsole.log('\\n\u6b65\u9aa41: \u68c0\u67e5\u6807\u51c6\u56fe\u6ce8...');\nconst figurePattern = /<strong[^>]*>\u56fe\\s*(\\d+)\\..*?<\\/strong>/g;\nconst captionMatches = [...content.matchAll(figurePattern)];\nconsole.log(`\u627e\u5230 ${captionMatches.length} \u4e2a\u6807\u51c6\u56fe\u6ce8\u6807\u8bb0`);\n\nif (captionMatches.length > 0 && uploadedImages.length > 0) {\n  console.log('\u2192 \u4f7f\u7528\u6807\u51c6\u56fe\u6ce8\u5339\u914d\u6a21\u5f0f');\n  content = insertAtCaptions(content, uploadedImages, captionMatches);\n  console.log('=== \u6807\u51c6\u56fe\u6ce8\u63d2\u5165\u5b8c\u6210 ===\\n');\n} else if (uploadedImages.length > 0) {\n  console.log('\\n\u6b65\u9aa42: \u641c\u7d22\u5168\u6587\u4e2d\u7684\u56fe\u7247\u63d0\u53ca...');\n  const figureReferences = findFigureReferencesInText(content);\n  console.log(`\u627e\u5230 ${figureReferences.size} \u4e2a\u56fe\u7247\u63d0\u53ca`);\n\n  if (figureReferences.size > 0) {\n    figureReferences.forEach((ref, figNum) => {\n      console.log(`  \u56fe${figNum}: \"${ref.context}\" \u5728 <${ref.tagName}> \u4e2d`);\n    });\n  }\n\n  if (figureReferences.size > 0) {\n    console.log('\\n\u6b65\u9aa43: \u6309\u5f15\u7528\u4f4d\u7f6e\u63d2\u5165\u56fe\u7247...');\n    const result = insertAtReferences(content, uploadedImages, figureReferences);\n    content = result.modifiedContent;\n\n    console.log(`\u6210\u529f\u63d2\u5165 ${result.insertedFigures.size} \u5f20\u56fe\u7247\u5230\u5f15\u7528\u4f4d\u7f6e`);\n\n    // \u5904\u7406\u672a\u63d0\u53ca\u7684\u56fe\u7247\n    if (result.uninsertedImages.length > 0) {\n      console.log(`\\n\u6b65\u9aa44: \u5904\u7406\u672a\u63d0\u53ca\u7684\u56fe\u7247 (${result.uninsertedImages.length} \u5f20)...`);\n      console.log('\u2192 \u5c06\u672a\u63d0\u53ca\u7684\u56fe\u7247\u8ffd\u52a0\u5230\u6587\u672b');\n      const uninsertedHtml = result.uninsertedImages\n        .map(img => {\n          console.log(`  \u8ffd\u52a0: \u56fe${img.figureIndex}`);\n          return createImageTag(img.url);\n        })\n        .join('\\n');\n      content = content + '\\n' + uninsertedHtml;\n    }\n\n    console.log(`\\n=== \u5b8c\u6210: ${result.insertedFigures.size} \u4e2a\u6309\u5f15\u7528\u63d2\u5165, ${result.uninsertedImages.length} \u4e2a\u8ffd\u52a0\u5230\u6587\u672b ===\\n`);\n  } else {\n    console.log('\\n\u6b65\u9aa44: \u5b8c\u5168\u6ca1\u6709\u56fe\u7247\u63d0\u53ca\uff0c\u4f7f\u7528 fallback \u6a21\u5f0f...');\n    content = insertAllAtBeginning(content, uploadedImages);\n    console.log('=== Fallback \u63d2\u5165\u5b8c\u6210 ===\\n');\n  }\n} else {\n  console.log('\u26a0\ufe0f \u6ca1\u6709\u4e0a\u4f20\u7684\u56fe\u7247');\n}\n\n// \u5728summary\uff08blockquote\uff09\u540e\u63d2\u5165\u7b2c\u4e00\u9875\u56fe\u7247\nif (firstPageUrl) {\n  console.log(`\u51c6\u5907\u63d2\u5165\u7b2c\u4e00\u9875\u56fe\u7247: ${firstPageUrl}`);\n  const blockquoteEndRegex = /<\\/blockquote>/i;\n  if (blockquoteEndRegex.test(content)) {\n    const firstPageImg = `<p style=\"text-align: center;\"><img src=\"${firstPageUrl}\" data-src=\"${firstPageUrl}\" style=\"max-width: 100%; height: auto;\" /></p>`;\n    content = content.replace(blockquoteEndRegex, `</blockquote>${firstPageImg}`);\n    console.log('\u2713 \u7b2c\u4e00\u9875\u56fe\u7247\u5df2\u6210\u529f\u63d2\u5165\u5230summary\u540e');\n  } else {\n    console.log('\u26a0\ufe0f \u672a\u627e\u5230blockquote\u6807\u7b7e');\n  }\n} else {\n  console.log('\u26a0\ufe0f \u672a\u627e\u5230\u7b2c\u4e00\u9875\u56fe\u7247URL');\n}\n\nreturn [{\n  json: {\n    title: mergedData.title,\n    summary: mergedData.summary,\n    content: content,\n    uploadedImages: uploadedImages,\n    debug_content_length: content.length,\n    debug_first_page_inserted: !!firstPageUrl,\n    debug_uploaded_images_count: uploadedImages.length\n  }\n}];"
      },
      "name": "\u66ff\u6362\u6b63\u6587\u56fe\u7247\u94fe\u63a5",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1104,
        192
      ],
      "id": "de78e307-4287-4e91-a472-ceeb8dbed438"
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "name": "\u5408\u5e76\u6b63\u6587\u5185\u5bb9\u548c\u94fe\u63a5",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2,
      "position": [
        -1536,
        -16
      ],
      "id": "ea1b4898-8e74-4d7f-ad4b-7cc1e1984b62"
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "98e16efb-3100-4aa5-aef3-c006b6919e37",
      "name": "\u5408\u5e76\u7b2c\u4e00\u9875\u548c\u6b63\u6587\u5185\u5bb9",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2.1,
      "position": [
        -1312,
        192
      ]
    },
    {
      "parameters": {
        "jsCode": "// \u8fc7\u6ee4\u51fa\u7c7b\u578b\u4e3a figure \u7684\u56fe\u7247\nconst items = $input.all();\nconst figureItems = items.filter(item => item.json.type === 'figure');\n\nif (figureItems.length === 0) {\n  console.log('\u672a\u627e\u5230\u4efb\u4f55\u56fe\u8868');\n  return [];\n}\n\nconsole.log(`\u627e\u5230 ${figureItems.length} \u4e2a\u56fe\u8868`);\nreturn figureItems;"
      },
      "id": "04978b12-1f19-4d2c-8c70-8d6ce2acd2b5",
      "name": "\u8fc7\u6ee4\u6b63\u6587\u56fe\u7247",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -2512,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// \u63d0\u53d6\u7b2c\u4e00\u5f20\u56fe\u4f5c\u4e3a\u5c01\u9762\nconst items = $input.all();\n\nif (!items || items.length === 0) {\n  throw new Error('\u6ca1\u6709\u53ef\u7528\u7684\u56fe\u7247\u6570\u636e');\n}\n\n// \u53ea\u8fd4\u56de\u7b2c\u4e00\u5f20\u56fe\u7247\u4f5c\u4e3a\u5c01\u9762\nreturn [items[0]];"
      },
      "id": "864b9083-3562-41dd-b7fa-34d3a9c71b7e",
      "name": "\u63d0\u53d6\u7b2c\u4e00\u5f20\u56fe\u4f5c\u4e3a\u5c01\u9762",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -2352,
        208
      ]
    },
    {
      "parameters": {
        "jsCode": "// \u8fc7\u6ee4\u51fa\u7c7b\u578b\u4e3a first_page \u7684\u56fe\u7247\nconst items = $input.all();\nconst firstPageItems = items.filter(item => item.json.type === 'first_page');\n\nif (firstPageItems.length === 0) {\n  console.log('\u672a\u627e\u5230\u7b2c\u4e00\u9875\u56fe\u7247');\n  return [];\n}\n\nconsole.log(`\u627e\u5230\u7b2c\u4e00\u9875\u56fe\u7247: ${firstPageItems[0].json.fileName}`);\nreturn firstPageItems;"
      },
      "id": "32228b57-a549-4092-9e88-aad2dd3209ef",
      "name": "\u8fc7\u6ee4\u7b2c\u4e00\u9875\u56fe\u7247",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -2352,
        400
      ]
    },
    {
      "parameters": {
        "resource": "media",
        "operation": "media:uploadOther"
      },
      "id": "f8363bfc-a6a3-4b40-a0f9-c5cd37defbd4",
      "name": "\u4e0a\u4f20\u7b2c\u4e00\u9875\u5230\u5fae\u4fe1",
      "type": "n8n-nodes-wechat-offiaccount.wechatOfficialAccountNode",
      "typeVersion": 1,
      "position": [
        -1856,
        400
      ],
      "credentials": {
        "wechatOfficialAccountCredentialsApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "gemini-3-pro-preview",
          "mode": "id"
        },
        "options": {
          "maxTokens": "={{ 65355 }}",
          "temperature": 0.7,
          "topP": 0.7
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.2,
      "position": [
        -2656,
        -160
      ],
      "id": "2d6eab9e-3008-4cfc-8d42-5597c34d3a6b",
      "name": "OpenAI Chat Model",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// \u4fdd\u5b58\u539f\u59cb\u5143\u6570\u636e\uff0c\u7528\u4e8e\u540e\u7eed\u4e0e\u4e0a\u4f20\u7ed3\u679c\u5408\u5e76\nconst items = $input.all();\nconst metadata = items.map((item, idx) => ({\n  json: {\n    originalIndex: idx,\n    figureIndex: item.json.figureIndex,\n    imageIndex: item.json.imageIndex,\n    fileName: item.json.fileName,\n    encodedFileName: item.json.encodedFileName,\n    caption: item.json.caption,\n    page: item.json.page,\n    type: item.json.type\n  }\n}));\n\nconsole.log('\u4fdd\u5b58\u5143\u6570\u636e:', metadata.length, '\u4e2a\u56fe\u7247');\nmetadata.forEach((m, i) => {\n  console.log(`  [${i}] figureIndex=${m.json.figureIndex}, encodedFileName=${m.json.encodedFileName}`);\n});\n\nreturn metadata;"
      },
      "id": "bbaf4f7e-34b6-44d1-90ce-ccbd0b7c2e30",
      "name": "\u4fdd\u5b58\u56fe\u7247\u5143\u6570\u636e",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -2176,
        96
      ]
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "d9906105-f43b-4a4f-a3aa-1425d3d88253",
      "name": "\u5408\u5e76\u4e0a\u4f20\u7ed3\u679c\u548c\u5143\u6570\u636e",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2.1,
      "position": [
        -1952,
        0
      ]
    }
  ],
  "connections": {
    "When clicking 'Execute workflow'": {
      "main": [
        [
          {
            "node": "\u8bfb\u53d6\u6240\u6709PDF\u6587\u4ef6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u8bfb\u53d6\u6240\u6709PDF\u6587\u4ef6": {
      "main": [
        [
          {
            "node": "\u63d0\u53d6\u6587\u4ef6\u4fe1\u606f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u63d0\u53d6\u6587\u4ef6\u4fe1\u606f": {
      "main": [
        [
          {
            "node": "\u9010\u4e2a\u5904\u7406PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u9010\u4e2a\u5904\u7406PDF": {
      "main": [
        [],
        [
          {
            "node": "\u63d0\u53d6PDF\u6587\u672c1",
            "type": "main",
            "index": 0
          },
          {
            "node": "\u63d0\u53d6PDF\u56fe\u7247",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u63d0\u53d6PDF\u6587\u672c1": {
      "main": [
        [
          {
            "node": "\u51c6\u5907AI Prompt",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u5bf9\u8bdd\u8bb0\u5fc6": {
      "ai_memory": [
        [
          {
            "node": "\u8bba\u6587\u89e3\u8bfbAI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "PDF\u5904\u7406\u5de5\u5177": {
      "ai_tool": [
        [
          {
            "node": "\u8bba\u6587\u89e3\u8bfbAI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "\u683c\u5f0f\u5316\u5de5\u5177": {
      "ai_tool": [
        [
          {
            "node": "\u8bba\u6587\u89e3\u8bfbAI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent\u8f93\u51fa\u5904\u7406": {
      "main": [
        [
          {
            "node": "\u5408\u5e76\u6b63\u6587\u5185\u5bb9\u548c\u94fe\u63a5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u4e0a\u4f20\u5c01\u9762\u5230\u5fae\u4fe12": {
      "main": [
        [
          {
            "node": "\u5408\u5e76AI\u5185\u5bb9\u548c\u5c01\u9762",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "\u5408\u5e76AI\u5185\u5bb9\u548c\u5c01\u9762": {
      "main": [
        [
          {
            "node": "\u51c6\u5907AI\u5fae\u4fe1\u8349\u7a3f\u6570\u636e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u51c6\u5907AI\u5fae\u4fe1\u8349\u7a3f\u6570\u636e": {
      "main": [
        [
          {
            "node": "\u4fdd\u5b58AI\u5fae\u4fe1\u8349\u7a3f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u4fdd\u5b58AI\u5fae\u4fe1\u8349\u7a3f": {
      "main": [
        [
          {
            "node": "\u9010\u4e2a\u5904\u7406PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u8bba\u6587\u89e3\u8bfbAI Agent": {
      "main": [
        [
          {
            "node": "\u5408\u5e76Markdown\u548c\u56fe\u7247",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u51c6\u5907AI Prompt": {
      "main": [
        [
          {
            "node": "\u8bba\u6587\u89e3\u8bfbAI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mdnice\u683c\u5f0f\u8f6c\u6362": {
      "main": [
        [
          {
            "node": "AI Agent\u8f93\u51fa\u5904\u7406",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u63d0\u53d6PDF\u56fe\u7247": {
      "main": [
        [
          {
            "node": "\u5904\u7406\u56fe\u7247\u8def\u5f84",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u5408\u5e76Markdown\u548c\u56fe\u7247": {
      "main": [
        [
          {
            "node": "Mdnice\u683c\u5f0f\u8f6c\u6362",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u5904\u7406\u56fe\u7247\u8def\u5f84": {
      "main": [
        [
          {
            "node": "\u8fc7\u6ee4\u6b63\u6587\u56fe\u7247",
            "type": "main",
            "index": 0
          },
          {
            "node": "\u8fc7\u6ee4\u7b2c\u4e00\u9875\u56fe\u7247",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u8fc7\u6ee4\u6b63\u6587\u56fe\u7247": {
      "main": [
        [
          {
            "node": "\u4e0a\u4f20\u6b63\u6587\u56fe\u7247",
            "type": "main",
            "index": 0
          },
          {
            "node": "\u63d0\u53d6\u7b2c\u4e00\u5f20\u56fe\u4f5c\u4e3a\u5c01\u9762",
            "type": "main",
            "index": 0
          },
          {
            "node": "\u4fdd\u5b58\u56fe\u7247\u5143\u6570\u636e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u4e0a\u4f20\u6b63\u6587\u56fe\u7247": {
      "main": [
        [
          {
            "node": "\u5408\u5e76\u4e0a\u4f20\u7ed3\u679c\u548c\u5143\u6570\u636e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u6c47\u603b\u6b63\u6587\u56fe\u7247\u94fe\u63a5": {
      "main": [
        [
          {
            "node": "\u5408\u5e76\u6b63\u6587\u5185\u5bb9\u548c\u94fe\u63a5",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "\u66ff\u6362\u6b63\u6587\u56fe\u7247\u94fe\u63a5": {
      "main": [
        [
          {
            "node": "\u5408\u5e76AI\u5185\u5bb9\u548c\u5c01\u9762",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u5408\u5e76\u6b63\u6587\u5185\u5bb9\u548c\u94fe\u63a5": {
      "main": [
        [
          {
            "node": "\u5408\u5e76\u7b2c\u4e00\u9875\u548c\u6b63\u6587\u5185\u5bb9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u63d0\u53d6\u7b2c\u4e00\u5f20\u56fe\u4f5c\u4e3a\u5c01\u9762": {
      "main": [
        [
          {
            "node": "\u4e0a\u4f20\u5c01\u9762\u5230\u5fae\u4fe12",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u8fc7\u6ee4\u7b2c\u4e00\u9875\u56fe\u7247": {
      "main": [
        [
          {
            "node": "\u4e0a\u4f20\u7b2c\u4e00\u9875\u5230\u5fae\u4fe1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u4e0a\u4f20\u7b2c\u4e00\u9875\u5230\u5fae\u4fe1": {
      "main": [
        [
          {
            "node": "\u5408\u5e76\u7b2c\u4e00\u9875\u548c\u6b63\u6587\u5185\u5bb9",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "\u5408\u5e76\u7b2c\u4e00\u9875\u548c\u6b63\u6587\u5185\u5bb9": {
      "main": [
        [
          {
            "node": "\u66ff\u6362\u6b63\u6587\u56fe\u7247\u94fe\u63a5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "\u8bba\u6587\u89e3\u8bfbAI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "\u4fdd\u5b58\u56fe\u7247\u5143\u6570\u636e": {
      "main": [
        [
          {
            "node": "\u5408\u5e76\u4e0a\u4f20\u7ed3\u679c\u548c\u5143\u6570\u636e",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "\u5408\u5e76\u4e0a\u4f20\u7ed3\u679c\u548c\u5143\u6570\u636e": {
      "main": [
        [
          {
            "node": "\u6c47\u603b\u6b63\u6587\u56fe\u7247\u94fe\u63a5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "258be669-3ec2-41c8-aee6-922a23d580b5",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "e1aSb0wo844W55KM",
  "tags": []
}