---
title: "ERP 没有 API 如何集成：方案与可行性评估"
canonical: https://wavect.io/zh/blog/legacy-erp-integration-without-api/
language: zh
description: "旧 ERP 没有 API，应该如何集成？比较受支持的文件交换、经批准的只读数据库访问、中间件、RPA 与系统替换，明确故障恢复、对账、停止条件及付费可行性评估应交付的证据。"
image: "https://wavect.io/img/blog/headers/header_legacy-erp-integration-without-api.png"
---

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

15 分钟 阅读 · 2026年9月29日 最近审核 2026年9月29日

[**下一篇**](/zh/blog/odoo-erp-api-integration-limits-2026/)

# ERP 没有 API，如何集成？文件交换、数据库读取、RPA 还是替换系统

要点速览

先评估业务操作，再选择技术。受支持的文件交换可用于批处理，获批只读访问可用于报表。中间件协调真实接口，但不能凭空创造安全的 ERP 写入。界面自动化需要受支持的会话模式和可验证结果。如果未知结果无法安全查明，应停止无人值守提交。付费可行性评估应记录访问、数据含义、代表性测试、恢复、运营成本以及通过、有条件通过或不实施的结论。

**没有现代 API，并不代表旧 ERP 的所有流程都无法集成。**应先核查厂商支持的文件导入导出、可购买的集成模块，以及经过批准的只读数据访问。中间件负责协调这些接口。只有实际部署环境和故障恢复可行时，才考虑界面自动化；如果必要的业务结果无法以可支持的方式安全实现，再评估系统替换。

关键不是能否成功搬运一次数据，而是企业能否区分已接受、已拒绝、重复以及结果仍然未知的业务操作，并在 ERP 升级或夜间任务失败后继续保持这种能力。

本文讨论**没有 API 的旧 ERP 如何集成**，不做连接器报价比较，也不是通用 ERP 选型指南。产品文档核查日期为 2026 年 9 月 29 日。文中产品仅用于说明具体接口边界，不表示这些产品本身没有 API，也不表示您的已安装版本具有相同功能。建议和场景属于我们的评估框架，并非实际 ERP 产品横评结果。

## “ERP 没有 API”究竟意味着什么？

选择技术前，先记录产品、版本档次、准确版本号、托管方式及支持服务商。所谓“没有 API”，究竟是没有 REST 端点、没有访问许可、找不到文档、网络无法连接，还是缺少某个业务操作的接口？这些问题需要不同的可行性判断。

向厂商询问是否有受支持的 SDK、SOAP 服务、EDI 接口、定时报表、命令行导入器或有文档的暂存机制。购买一个模块可能比操控屏幕更合适。确认它覆盖的业务对象和持续使用权，不能把宣传材料或合作伙伴演示直接视为验证结果。

分开定义**读取**、**写入**以及**过账或审批**。读取库存用于仪表盘，不等于预留库存；创建订单草稿，不等于批准放行；导出发票明细，也不能证明付款已经分配。应明确可验收的最终业务状态，以及谁有权触发它。

对于已经提供 API 的系统，我们的 [Odoo API 集成限制指南](/zh/blog/odoo-erp-api-integration-limits-2026/) 讨论另一类问题：如何围绕现有 API 的约束设计架构。本文的第一项交付物应是有证据支持的可用接口清单，而不是新建一个后端。

## 文件、数据库、中间件、RPA，还是替换系统？

应按操作选择访问方式，而不是为全公司强行选择一种技术。合理方案可能同时包含只读报表数据流、受支持的订单导入，以及由人工处理的异常队列。

| 方式 | 合理适用条件 | 实施前必须取得的证据 |
| --- | --- | --- |
| 受支持的文件交换 | 所需对象有文档明确的导入导出方式，批处理时效符合业务要求。 | 逐对象结果、字段规则、重复提交行为、调度能力，以及受支持的恢复方式。 |
| 经批准的只读数据库访问 | 目标是通过获批的数据访问面进行提取或报表分析。 | 数据含义、权限、一致性、查询负载、删除检测和可接受的数据时效。 |
| 中间件 | 已有可用接口，但缺少映射、调度、状态记录或异常处理。 | 两端实际使用的端点或文件协议。中间件本身不会赋予 ERP 新的写入能力。 |
| 界面自动化 / RPA | 一个范围明确的流程必须使用界面，且可通过获批身份运行并验证结果。 | 真实会话测试、稳定的控件定位、业务状态核查、处理能力及人工恢复。 |
| 替换或渐进式现代化 | 关键需求没有可支持的实现路径，或长期维持变通方案不可接受。 | 数据权威归属、迁移和切换范围、业务连续性、对账以及目标系统的运营预算。 |

这个决策比一般的 [定制软件与现成软件比较](/zh/software-development-guide/custom-software-vs-off-the-shelf/) 更具体。评估完全可以建议保留 ERP、购买已有模块，或继续保留一个人工步骤。

## 什么情况下，受支持的文件交换已经足够？

不要因为传输方式看起来较旧，就排除 CSV 或 XML。Microsoft 在 Business Central 数据交换框架中记录了字段映射、转换和验证机制。 [Microsoft：文件映射与验证](https://learn.microsoft.com/en-us/dynamics365/business-central/across-how-to-set-up-data-exchange-definitions) 这证明产品具有结构化文件处理能力，不代表每一种单据和部署都具备无人值守导入功能。

取得实际规范，以及成功和失败的示例文件。确认字符编码、日期和小数格式、币种、单位、前导零、空值、公司标识及主数据前置条件。核实多行单据是整体接受，还是可能留下部分状态。银行文件功能不自动等于销售订单接口。

明确交接协议：不可变的批次标识、逐对象来源编号、模式版本、记录数、完整性校验，以及明确的上传完成信号。消费端不能处理尚未完成的上传。WinSCP 对二进制 SFTP 传输记录了先使用临时文件名、完成后再重命名的机制。 [WinSCP：完整上传交接](https://winscp.net/eng/docs/resume) 应测试所选服务器的行为，并让导入器忽略临时文件；不能假设任意 FTP 或共享目录都有相同语义。

还要区分“收到文件”和“接受业务对象”。NetSuite 文档指出，`afterSubmit` 报错时记录可能已经创建或更新，此时不应重跑整个导入。 [Oracle：NetSuite 导入结果](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_N350581.html) 因此，单凭一个“错误”标签无法决定是否重试。

可投入运营的文件流程应显示：每个来源对象对应哪个 ERP 单据，哪些未通过验证，哪些仍需调查。约定源文件和证据的保留周期，尽量减少敏感字段。将调度器、凭据、存储、监控和人工异常处理计入运营成本。在无人值守执行得到实际支持并经过测试之前，每天手动上传文件的员工仍是流程的一部分。

## 经批准的只读访问能解决什么，不能解决什么？

应先申请有文档的报表视图、受支持的查询服务或获批副本，而不是直接索取生产数据库的无限制凭据。例如，NetSuite 的 SuiteAnalytics Connect 明确是只读服务，不能更新 NetSuite 数据。 [Oracle：Connect 的只读边界](https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_3963845427.html) 受支持的查询访问面，与直接访问应用物理表不是同一回事。

**不要把只读项目悄悄变成对 ERP 交易表的非文档化写入。**SAP Business One SDK 的 Recordset 文档允许对用户表执行 DML，但警告系统表写入不受支持并存在数据损坏风险。 [SAP：Recordset 支持边界](https://help.sap.com/doc/089315d8d0f8475a9fc84fb919b501a3/10.0/en-US/SDKHelp/SAPbobsCOM~Recordset.html) 这是该 SAP 接口的具体规则，不是对所有 ERP 合同的笼统判断。厂商批准的暂存表或有文档的业务对象接口，应另行评估。

对于数据提取，请 ERP 负责人解释每个字段的业务含义。“数量”是实物库存、可用库存，还是已分配库存？金额是否含税？这一行属于哪个公司和哪种单据状态？连接键和源时间戳本身还不是完整的数据契约。

只读不等于对运行没有影响，也不自动保证一致性。Microsoft 警告，SQL Server 的 `NOLOCK`/`READUNCOMMITTED` 可能读到未提交数据，以及重复或遗漏的记录。 [Microsoft：SQL 读取一致性警告](https://learn.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver17) 不能把这种提示当作解决集成负载的通用办法。应由 DBA 批准一致性策略、超时、查询计划及运行时段，并在有代表性的 ERP 活动下测试。

增量提取还要证明如何发现更新、删除和更正。SQL Server Change Tracking 要求核查仍保留的最低版本；过期的同步位置需要重新初始化。 [Microsoft：变更跟踪恢复](https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/work-with-change-tracking-sql-server?view=sql-server-ver17) 开启 Change Tracking 或 CDC 是独立的管理与支持决策，不是获得读取权限后自动拥有的权利。按修改时间筛选，并不能证明删除或延迟更正都会被捕获。

定义初始快照、可恢复的同步位置，以及与权威 ERP 视图的定期核对。还要定义数据过期时下游用户能看到什么提示。报表副本不能在无人察觉的情况下变成库存预留或财务过账的权威数据源。

## 中间件能补充什么，不能凭空创造什么？

中间件可以负责映射、调度、队列、凭据、标识和异常分派。它可以对新门户提供 API，而内部使用文件或获批查询接口。此时门户 API 是您自己定义的集成契约，不是 ERP 内部突然增加了新的交易 API。

网络连通性也是独立问题。Microsoft 的本地数据网关使用出站连接，无需为此开放入站端口。 [Microsoft：网关连接模型](https://learn.microsoft.com/en-us/data-integration/gateway/service-gateway-onprem) 这种部署方式不会授予数据库权限，也不会增加缺失的业务操作。应核查所选网关支持的数据源、运维负责人及升级责任。

为每个业务对象保留持久记录：来源系统和公司、来源标识、操作、载荷版本或哈希、ERP 标识、已观察状态以及下一项允许的动作。区分已接收、已验证、已提交、已确认、已拒绝和结果未知。不能仅因文件已上传或任务已入队，就显示“已同步”。

AWS 的幂等性指南区分请求身份与相同内容，并解释去重记录和业务修改为何需要原子处理。 [AWS：请求身份与安全重试](https://aws.amazon.com/builders-library/making-retries-safe-with-idempotent-APIs/) 我们将其应用于旧 ERP 时的结论是有限的：中间件日志本身无法保证 ERP 业务效果恰好发生一次。ERP 提交成功后、日志记录成功前，仍可能发生崩溃。

重试前，必须证明可通过受支持的方式按稳定参考编号查找结果，或使用其他可靠确认机制。在目标系统具有相应能力时，应测试并发提交下的唯一性。用相同标识提交不同内容，必须触发明确冲突或获批更新流程，而不能静默创建第二张订单。缺乏确定性时，应暂停调查，而不是把未知结果变成重复业务。

## 何时可以合理采用界面自动化？

把界面自动化视为某个具体流程的候选方案，而不是“ERP 没有 API”的默认答案。UiPath 记录了基于元素属性、而非仅依赖坐标的选择器；变化的布局或动态属性仍需要处理。 [UiPath：选择器行为](https://docs.uipath.com/activities/other/latest/ui-automation/about-selectors) 应测试实际旧客户端，而不是现代演示应用。

部署形态会影响可行性。Power Automate 无人值守文档说明了会话限制，并提醒无人值守运行的显示分辨率可能与开发会话不同。 [Microsoft：无人值守会话限制](https://learn.microsoft.com/en-us/power-automate/desktop-flows/run-unattended-desktop-flows) 开发者在旁观察时执行成功，不能证明夜间运营模式成立。

虚拟桌面需要单独核查。Microsoft 要求在受支持的远程自动化中使用 Power Automate 虚拟桌面代理，并列出了平台限制。 [Microsoft：虚拟桌面要求](https://learn.microsoft.com/en-us/power-automate/desktop-flows/virtual-desktops) 确认准确的 RDP 或 Citrix 配置、安装许可及版本兼容性；能看到远程屏幕，不表示能够使用与本地安装相同的控件能力。

我们建议的上线条件包括明确的输入验证、获批凭据、允许的会话模式、对当前公司和记录的核查，以及权威结果验证。业务影响需要时，保留人工审批。不要为了让机器人持续运行而关闭 MFA、终端防护或补丁更新。

测量代表性吞吐量时，应包括登录、等待、校验对话框和异常处理。测试人工并发使用、超时、凭据过期、标签变更、记录锁定和机器重启。明确失败运行的负责人，以及可接受的最大积压。

Computer-use 模型不会消除这些验收条件。模型生成的一次点击，仍需要权限、受限输入，以及对最终业务状态的证明。对于敏感过账或付款，看似成功的截图不足以支持自动重试或放行。有价值的方案可以是有人监督的单据准备，最终决定仍由员工作出。

## 故障处理：120 次提交不等于 120 笔业务完成

**以下为假设场景，不是客户项目结果：**一个批次包含 120 张来源订单。集成确认了 117 张 ERP 单据，得到两项明确的验证拒绝，另有一次提交的响应丢失。对账应为 **120 = 117 已确认 + 2 已拒绝 + 1 结果未知**，而不是“有三个失败需要重试”。

保留 117 项已确认的来源与 ERP 映射。更正两张被拒订单，并在确定没有业务单据提交成功后才重新发送。对于未知结果，通过获批接口按稳定参考编号查找并检查相关状态。不要盲目重放整个批次。如果没有可靠方法查明未知结果，无人值守提交就没有通过一项重要的可行性门槛。

记录数只是第一层核对。还要比较业务标识、公司、单据状态、明细数量、币种及相关总额。测试修订、取消和乱序到达。总额相同仍可能掩盖错误的单据分配，因此应保留逐对象证据，而不仅是仪表盘上的绿色数字。

恢复并不总是技术回滚。Microsoft 将补偿描述为与业务相关、且可能需要人工介入的处理过程。 [Microsoft：业务特定的补偿](https://learn.microsoft.com/en-us/azure/architecture/patterns/compensating-transaction) 对于 ERP 集成，应与业务负责人约定受支持的取消、更正或冲销路径。不能为了撤销一个重复操作而删除交易表行，或恢复整个生产数据库。

明确谁调查未知结果、谁批准更正、如何暂停后续业务，以及何时升级处理。用失败案例演练运行手册。没有业务责任人的重试计数器，不构成恢复流程。

## 付费集成可行性评估应该回答什么？

先购买一个有依据的决策，再购买实施。以一个有代表性的流程及其成功标准为起点，优先验证影响最大的不确定性。提供脱敏样本、接口文档、部署细节、相关许可条款，以及有授权的 ERP 联系人。通过批准的流程授予访问，不要在邮件附件中发送密码。

| 交付物 | 应要求的证据 | 支持的决策 |
| --- | --- | --- |
| 接口与支持清单 | 特定版本的文档、必要模块、获批访问，以及有明确负责方的支持边界。 | 现有受支持路径是否已经足够。 |
| 业务数据契约 | 对象、字段含义、公司边界、标识、方向及可接受的最终状态。 | 所选接口是否覆盖真正的业务操作。 |
| 代表性技术验证 | 脱敏输入、观察结果、环境说明和仍未解决的限制。 | 最关键的假设是否通过有限验证。 |
| 故障与对账设计 | 部分成功、未知结果、去重、更正责任及恢复证据。 | 自动化能否避免无声破坏业务状态。 |
| 运营与成本模型 | 实施任务、许可、托管或执行机器、监控、支持、变更测试和退出责任。 | 企业能否在交付后持续维护方案。 |
| 通过、有条件通过或不通过 | 记录在案的条件、排除范围、替代路径及明确范围的后续提案。 | 应配置、扩展、局部自动化、替换，还是停止。 |

诚实标注证据状态：厂商文档支持、已在被评估环境确认、仅在测试中演示、方案建议、受阻或未测试。原型只能证明在所述条件下实际观察到的内容，不能单独证明生产可靠性、升级兼容性或持续峰值吞吐量。

评估无法消除仍未解决的厂商依赖。缺少文档或访问可能使最终实施估算无法成立。有价值的付费结论可以指出这一阻碍及重新评估所需的具体证据，而不是基于假设承诺固定开发价格。

## 采购方应坚持测试哪些失败场景？

以下可作为建议验收包。演示前约定通过标准和负责人，并保存每项相关测试的证据。“不适用”需要理由；“未测试”不能视为通过。

| 测试 | 引入的条件 | 必须观察到的结果 |
| --- | --- | --- |
| 1. 范围与权限 | 访问另一公司或执行超出集成角色的操作。 | 访问被拒且责任可追溯，获批操作仍能正常运行。 |
| 2. 无效业务输入 | 未知产品、错误币种、无效单位或缺失前置条件。 | 没有意外过账，被拒对象及更正路径可见。 |
| 3. 不完整文件 | 中断上传或提供截断批次。 | 不会提前处理，完整性或完整程度检查阻止放行。 |
| 4. 重复投递 | 再次提交相同业务操作，也测试并发提交。 | 只有一次被接受的业务效果，或在无法保证唯一性时受控停止。 |
| 5. 内容变化的重复请求 | 用相同参考编号提交不同明细或金额。 | 明确冲突或经批准更新，而非静默覆盖或重复创建。 |
| 6. 部分接受 | 同一批次混合有效和无效单据。 | 已确认、已拒绝及未知对象分别记录并对账。 |
| 7. 确认丢失 | 在提交可能已经生效后断开连接。 | 再次提交前，通过查询或人工调查查明结果。 |
| 8. 修订与顺序 | 在更正或取消后送达旧更新。 | 过期数据不会静默覆盖权威状态。 |
| 9. 提取位置过期 | 暂停增量流，超过其支持的恢复窗口。 | 缺口可检测，并能受控重建基线。 |
| 10. 负载与时效 | 在 ERP 同时运行时执行代表性峰值工作量。 | 符合约定时延和负载限制，过期结果有明确提示。 |
| 11. 身份与会话丢失 | 撤销凭据、使会话过期或重启执行机器。 | 安全停止及恢复，不绕过控制。 |
| 12. 界面或接口变化 | 修改字段、对话框、选择器或支持的模式版本。 | 回归检查在意外业务写入前发现不兼容。 |
| 13. 集成状态恢复 | 恢复集成存储，或在中断后重放队列。 | 先核对已存在的 ERP 效果再重放，证据仍可追溯。 |
| 14. 运营交接 | 在原开发者不参与时，把失败案例交给指定操作人员。 | 操作人员能识别对象、暂停处理并遵循获批运行手册。 |

## 三个假设场景，三种不同的合理结论

### 需要次日早晨完成同步的分销商

假设已安装 ERP 支持订单导入、定时库存导出和逐对象结果，业务接受夜间延迟。应从这些文件能力出发，只增加验证、安全传输和异常处理所需的协调逻辑。REST 看起来更现代，并不足以证明全面替换或 UI 机器人合理。先验证重复提交和部分接受的行为。

### 需要报表，而不是交易录入的制造商

假设获批报表视图覆盖所需实体，DBA 也接受提取负载。可以采用带有明确时效标识和对账的只读提取，库存预留及过账仍留在 ERP。之后若要求即时库存承诺，这是范围变化，需要受支持的写入路径，不是报表数据流的小幅增强。

### 低业务量、只能通过屏幕操作的流程

假设厂商允许该访问方式，实际界面可自动化，且最终单据必须由员工批准。有人监督的准备流程可能已足够。如果改为要求无人值守、不可逆的过账，却没有可靠结果查询或受支持会话模型，就不能按原设计继续。应评估厂商模块、受控的人工边界或系统替换。

这些是虚构的决策场景，不是项目估算。它们不说明哪种方案普遍最便宜，也不承诺交付时间或投资回报。应以真实现状为基线，为通过验收的流程及其持续责任定价，包括业务异常处理工作。

## 何时应该替换、推迟或作出不实施结论？

如果设计依赖未经批准的访问、不受支持的交易写入、绕过安全控制，或重复执行无法查明结果的不可逆操作，应停止该设计。若要求的数据新鲜度超过来源可观察的更新能力，或无人接受运营责任，也应停止。

停止一个设计，不等于替换整个 ERP。可以缩小到只读报表、保留有人监督的导入、购买获批模块，或等支持条件改善后再推进。需要区分“不方便的限制”和“无法满足关键业务需求”。

Microsoft 的 Strangler Fig 指南介绍渐进式迁移，同时指出无法拦截请求或无法修改旧系统源码时可能不适用。 [Microsoft：渐进式迁移限制](https://learn.microsoft.com/en-us/azure/architecture/patterns/strangler-fig) 不能假设给封闭的桌面 ERP 套上透明 API 外观，就能让旧系统逐步消失。

应证明业务边界可以拆分，确定新旧并行期间哪个系统拥有权威数据，并规划历史数据访问、对账、切换和支持。分阶段迁移是一种候选架构，不是“零中断”承诺。在真正移除依赖之前，新旧两套运营成本可能同时存在。

## 明确付费集成可行性评估的范围

准备一个流程、ERP 及版本、脱敏样本、已有接口文档、时效要求和典型异常。评估范围应明确包含访问批准、故障处理、可支持性，以及是否继续的建议。评估费用和交付物应与后续实施分别约定。

Wavect 的 [定制软件开发服务](/zh/services/software-development/) 是讨论明确范围集成项目的商业入口。 [MyMerch 流程自动化案例](/zh/case-studies/mymerch/) 提供相关交付背景，但不能证明该项目实施过无 API ERP 集成，也不证明与您的系统兼容。

在委托完整解决方案前， [申请付费 ERP 集成可行性评估](/zh/contact/) 。后续提案应服从证据：配置、轻量适配器、有人监督的自动化，或不实施。

独立性与商标声明

本页由 Wavect 发布，Wavect 自身也是服务商，因此我们对本页存在商业利益。我们与本页提及的其他公司没有关联，未获得其背书，也不是其合作伙伴；所有第三方公司名称、品牌与商标均归各自所有者所有。关于其他服务商的陈述来自公开可查的来源，主要是其自己发布的页面，以本页标注的核查日期为准，此后可能已经发生变化。做决定前请自行直接核实。本页依据我们所知的情况撰写，并力求保持客观。如果你认为其中有不准确或不公平之处，请写信告诉我们，我们会更正： [office@wavect.io](mailto:office@wavect.io)

## 无 API ERP 集成常见问题

### 旧 ERP 没有 API，还能集成吗？

部分流程可以。先确认受支持的导入、导出、集成模块、SDK 或获批查询面是否覆盖具体操作。读取信息不等于创建、预留或过账业务单据。评估必须核查已安装版本、访问权限和可观察的结果。

### CSV 足够可靠，可以用于 ERP 集成吗？

如果处理时效符合业务要求，且导入器提供可用结果，文件方案可以合适。需定义模式和标识，防止处理不完整文件，并证明部分接受、安全重复提交和对账可行。上传成功不等于业务完成。

### 可以直接写 ERP 数据库吗？

不能假设技术访问就意味着交易写入获得授权或支持。应核查厂商文档规则。获批暂存接口不同于任意修改应用表。只读集成应保持只读，除非另行建立经过批准的业务操作路径。

### 中间件能为没有 API 的 ERP 创建 API 吗？

它可以对其他应用提供 API，内部使用获批文件、查询或界面流程。但这不会创造缺失的 ERP 操作或交易保证。实际接口、授权和恢复限制，仍决定新 API 能承诺什么。

### 什么时候使用 RPA 合理？

对于范围明确，且实际客户端、身份、会话模式、业务量及结果验证均已测试的流程，可以考虑 RPA。有人监督的单据准备可能足够。无法在避免重复风险的前提下查明未知结果时，不应按该设计执行无人值守不可逆操作。

### 没有 API 的 ERP 能做实时集成吗？

取决于获批访问路径，以及业务对实时的定义。频繁轮询报表副本不能预留库存，也不能保证权威过账。应测量端到端时效并验证操作；否则应降低要求或选择其他受支持路径。

### 付费集成可行性评估交付什么？

交付特定版本接口清单、业务数据契约、代表性技术证据、故障与对账设计、运营责任，以及通过、有条件通过或不实施的建议。费用和范围需单独约定。原型不证明生产可靠性或所有升级路径。

### 什么时候应该替换 ERP 或停止集成？

当设计依赖未经批准的访问、不受支持的写入、绕过控制或对未知结果进行不安全重试时，应停止。先考虑缩小范围、厂商模块或有人监督步骤。替换需要独立的迁移、数据权威、对账和运营计划。

## 最终思考

选择能够满足业务操作并安全恢复的最小受支持方案。文件、只读提取和有人监督的界面操作都可能合理。在购买连接器、定制中间件或替换 ERP 前，先取得关于访问、结果和运营责任的证据。

## 你可能也喜欢..

[**ERP 已有 API，但存在限制时如何设计** 针对 Odoo 可用接口与架构约束的独立指南。](/zh/blog/odoo-erp-api-integration-limits-2026/) [**定制软件与现成软件** 明确可行的集成边界后，再作更广泛的采购决策。](/zh/software-development-guide/custom-software-vs-off-the-shelf/)

架构与平台

## 继续浏览此集群

对长期交付产生影响的框架、平台与系统设计选择。

[从核心文章开始**智慧城市软件架构：MQTT、LoRaWAN、Kubernetes 与 Terraform**](/zh/blog/smart-city-architecture-best-practices-2026/)

- [Shopify B2B 订单审批：原生功能、应用还是定制买方门户？](/zh/blog/shopify-b2b-order-approval-workflow/)
- [Shopify–ERP 退货与退款：标准连接器何时不够用？](/zh/blog/shopify-erp-returns-refunds-integration/)
- [管理多个 Shopify 店铺：报表应用还是定制运营看板？](/zh/blog/shopify-multi-store-operations-dashboard/)
- [Apple Container 与 Docker：Compose、网络及迁移指南](/zh/blog/apple-container-vs-docker-compose-migration/)
- [Pake 网页转桌面应用：体积、PWA 对比与登录限制](/zh/blog/pake-website-to-desktop-app/)

[**返回**](/zh/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/zh/team/kevin-riedl/)

[Kevin Riedl](/zh/team/kevin-riedl/) https://linkedin.com/in/wsdt

15 分钟 阅读 · 2026年9月29日 最近审核 2026年9月29日

[**下一篇**](/zh/blog/odoo-erp-api-integration-limits-2026/)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/zh/blog/legacy-erp-integration-without-api/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-09-29",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-09-29",
      "url": "https://wavect.io/zh/blog/legacy-erp-integration-without-api/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "先评估业务操作，再选择技术。受支持的文件交换可用于批处理，获批只读访问可用于报表。中间件协调真实接口，但不能凭空创造安全的 ERP 写入。界面自动化需要受支持的会话模式和可验证结果。如果未知结果无法安全查明，应停止无人值守提交。付费可行性评估应记录访问、数据含义、代表性测试、恢复、运营成本以及通过、有条件通过或不实施的结论。",
  "articleBody": " 博客概览/交付与 QA/架构与平台 ERP 没有 API，如何集成？文件交换、数据库读取、RPA 还是替换系统 要点速览 先评估业务操作，再选择技术。受支持的文件交换可用于批处理，获批只读访问可用于报表。中间件协调真实接口，但不能凭空创造安全的 ERP 写入。界面自动化需要受支持的会话模式和可验证结果。如果未知结果无法安全查明，应停止无人值守提交。付费可行性评估应记录访问、数据含义、代表性测试、恢复、运营成本以及通过、有条件通过或不实施的结论。 没有现代 API，并不代表旧 ERP 的所有流程都无法集成。应先核查厂商支持的文件导入导出、可购买的集成模块，以及经过批准的只读数据访问。中间件负责协调这些接口。只有实际部署环境和故障恢复可行时，才考虑界面自动化；如果必要的业务结果无法以可支持的方式安全实现，再评估系统替换。 关键不是能否成功搬运一次数据，而是企业能否区分已接受、已拒绝、重复以及结果仍然未知的业务操作，并在 ERP 升级或夜间任务失败后继续保持这种能力。 本文讨论没有 API 的旧 ERP 如何集成，不做连接器报价比较，也不是通用 ERP 选型指南。产品文档核查日期为 2026 年 9 月 29 日。文中产品仅用于说明具体接口边界，不表示这些产品本身没有 API，也不表示您的已安装版本具有相同功能。建议和场景属于我们的评估框架，并非实际 ERP 产品横评结果。 “ERP 没有 API”究竟意味着什么？ 选择技术前，先记录产品、版本档次、准确版本号、托管方式及支持服务商。所谓“没有 API”，究竟是没有 REST 端点、没有访问许可、找不到文档、网络无法连接，还是缺少某个业务操作的接口？这些问题需要不同的可行性判断。 向厂商询问是否有受支持的 SDK、SOAP 服务、EDI 接口、定时报表、命令行导入器或有文档的暂存机制。购买一个模块可能比操控屏幕更合适。确认它覆盖的业务对象和持续使用权，不能把宣传材料或合作伙伴演示直接视为验证结果。 分开定义读取、写入以及过账或审批。读取库存用于仪表盘，不等于预留库存；创建订单草稿，不等于批准放行；导出发票明细，也不能证明付款已经分配。应明确可验收的最终业务状态，以及谁有权触发它。 对于已经提供 API 的系统，我们的 Odoo API 集成限制指南讨论另一类问题：如何围绕现有 API 的约束设计架构。本文的第一项交付物应是有证据支持的可用接口清单，而不是新建一个后端。 文件、数据库、中间件、RPA，还是替换系统？ 应按操作选择访问方式，而不是为全公司强行选择一种技术。合理方案可能同时包含只读报表数据流、受支持的订单导入，以及由人工处理的异常队列。 建议采用的选择标准，并非各种集成技术的通用排名 方式合理适用条件实施前必须取得的证据 受支持的文件交换所需对象有文档明确的导入导出方式，批处理时效符合业务要求。逐对象结果、字段规则、重复提交行为、调度能力，以及受支持的恢复方式。 经批准的只读数据库访问目标是通过获批的数据访问面进行提取或报表分析。数据含义、权限、一致性、查询负载、删除检测和可接受的数据时效。 中间件已有可用接口，但缺少映射、调度、状态记录或异常处理。两端实际使用的端点或文件协议。中间件本身不会赋予 ERP 新的写入能力。 界面自动化 / RPA一个范围明确的流程必须使用界面，且可通过获批身份运行并验证结果。真实会话测试、稳定的控件定位、业务状态核查、处理能力及人工恢复。 替换或渐进式现代化关键需求没有可支持的实现路径，或长期维持变通方案不可接受。数据权威归属、迁移和切换范围、业务连续性、对账以及目标系统的运营预算。 这个决策比一般的定制软件与现成软件比较更具体。评估完全可以建议保留 ERP、购买已有模块，或继续保留一个人工步骤。 什么情况下，受支持的文件交换已经足够？ 不要因为传输方式看起来较旧，就排除 CSV 或 XML。Microsoft 在 Business Central 数据交换框架中记录了字段映射、转换和验证机制。Microsoft：文件映射与验证这证明产品具有结构化文件处理能力，不代表每一种单据和部署都具备无人值守导入功能。 取得实际规范，以及成功和失败的示例文件。确认字符编码、日期和小数格式、币种、单位、前导零、空值、公司标识及主数据前置条件。核实多行单据是整体接受，还是可能留下部分状态。银行文件功能不自动等于销售订单接口。 明确交接协议：不可变的批次标识、逐对象来源编号、模式版本、记录数、完整性校验，以及明确的上传完成信号。消费端不能处理尚未完成的上传。WinSCP 对二进制 SFTP 传输记录了先使用临时文件名、完成后再重命名的机制。WinSCP：完整上传交接应测试所选服务器的行为，并让导入器忽略临时文件；不能假设任意 FTP 或共享目录都有相同语义。 还要区分“收到文件”和“接受业务对象”。NetSuite 文档指出，afterSubmit 报错时记录可能已经创建或更新，此时不应重跑整个导入。Oracle：NetSuite 导入结果因此，单凭一个“错误”标签无法决定是否重试。 可投入运营的文件流程应显示：每个来源对象对应哪个 ERP 单据，哪些未通过验证，哪些仍需调查。约定源文件和证据的保留周期，尽量减少敏感字段。将调度器、凭据、存储、监控和人工异常处理计入运营成本。在无人值守执行得到实际支持并经过测试之前，每天手动上传文件的员工仍是流程的一部分。 经批准的只读访问能解决什么，不能解决什么？ 应先申请有文档的报表视图、受支持的查询服务或获批副本，而不是直接索取生产数据库的无限制凭据。例如，NetSuite 的 SuiteAnalytics Connect 明确是只读服务，不能更新 NetSuite 数据。Oracle：Connect 的只读边界受支持的查询访问面，与直接访问应用物理表不是同一回事。 不要把只读项目悄悄变成对 ERP 交易表的非文档化写入。SAP Business One SDK 的 Recordset 文档允许对用户表执行 DML，但警告系统表写入不受支持并存在数据损坏风险。SAP：Recordset 支持边界这是该 SAP 接口的具体规则，不是对所有 ERP 合同的笼统判断。厂商批准的暂存表或有文档的业务对象接口，应另行评估。 对于数据提取，请 ERP 负责人解释每个字段的业务含义。“数量”是实物库存、可用库存，还是已分配库存？金额是否含税？这一行属于哪个公司和哪种单据状态？连接键和源时间戳本身还不是完整的数据契约。 只读不等于对运行没有影响，也不自动保证一致性。Microsoft 警告，SQL Server 的 NOLOCK/READUNCOMMITTED 可能读到未提交数据，以及重复或遗漏的记录。Microsoft：SQL 读取一致性警告不能把这种提示当作解决集成负载的通用办法。应由 DBA 批准一致性策略、超时、查询计划及运行时段，并在有代表性的 ERP 活动下测试。 增量提取还要证明如何发现更新、删除和更正。SQL Server Change Tracking 要求核查仍保留的最低版本；过期的同步位置需要重新初始化。Microsoft：变更跟踪恢复开启 Change Tracking 或 CDC 是独立的管理与支持决策，不是获得读取权限后自动拥有的权利。按修改时间筛选，并不能证明删除或延迟更正都会被捕获。 定义初始快照、可恢复的同步位置，以及与权威 ERP 视图的定期核对。还要定义数据过期时下游用户能看到什么提示。报表副本不能在无人察觉的情况下变成库存预留或财务过账的权威数据源。 中间件能补充什么，不能凭空创造什么？ 中间件可以负责映射、调度、队列、凭据、标识和异常分派。它可以对新门户提供 API，而内部使用文件或获批查询接口。此时门户 API 是您自己定义的集成契约，不是 ERP 内部突然增加了新的交易 API。 网络连通性也是独立问题。Microsoft 的本地数据网关使用出站连接，无需为此开放入站端口。Microsoft：网关连接模型这种部署方式不会授予数据库权限，也不会增加缺失的业务操作。应核查所选网关支持的数据源、运维负责人及升级责任。 为每个业务对象保留持久记录：来源系统和公司、来源标识、操作、载荷版本或哈希、ERP 标识、已观察状态以及下一项允许的动作。区分已接收、已验证、已提交、已确认、已拒绝和结果未知。不能仅因文件已上传或任务已入队，就显示“已同步”。 AWS 的幂等性指南区分请求身份与相同内容，并解释去重记录和业务修改为何需要原子处理。AWS：请求身份与安全重试我们将其应用于旧 ERP 时的结论是有限的：中间件日志本身无法保证 ERP 业务效果恰好发生一次。ERP 提交成功后、日志记录成功前，仍可能发生崩溃。 重试前，必须证明可通过受支持的方式按稳定参考编号查找结果，或使用其他可靠确认机制。在目标系统具有相应能力时，应测试并发提交下的唯一性。用相同标识提交不同内容，必须触发明确冲突或获批更新流程，而不能静默创建第二张订单。缺乏确定性时，应暂停调查，而不是把未知结果变成重复业务。 何时可以合理采用界面自动化？ 把界面自动化视为某个具体流程的候选方案，而不是“ERP 没有 API”的默认答案。UiPath 记录了基于元素属性、而非仅依赖坐标的选择器；变化的布局或动态属性仍需要处理。UiPath：选择器行为应测试实际旧客户端，而不是现代演示应用。 部署形态会影响可行性。Power Automate 无人值守文档说明了会话限制，并提醒无人值守运行的显示分辨率可能与开发会话不同。Microsoft：无人值守会话限制开发者在旁观察时执行成功，不能证明夜间运营模式成立。 虚拟桌面需要单独核查。Microsoft 要求在受支持的远程自动化中使用 Power Automate 虚拟桌面代理，并列出了平台限制。Microsoft：虚拟桌面要求确认准确的 RDP 或 Citrix 配置、安装许可及版本兼容性；能看到远程屏幕，不表示能够使用与本地安装相同的控件能力。 我们建议的上线条件包括明确的输入验证、获批凭据、允许的会话模式、对当前公司和记录的核查，以及权威结果验证。业务影响需要时，保留人工审批。不要为了让机器人持续运行而关闭 MFA、终端防护或补丁更新。 测量代表性吞吐量时，应包括登录、等待、校验对话框和异常处理。测试人工并发使用、超时、凭据过期、标签变更、记录锁定和机器重启。明确失败运行的负责人，以及可接受的最大积压。 Computer-use 模型不会消除这些验收条件。模型生成的一次点击，仍需要权限、受限输入，以及对最终业务状态的证明。对于敏感过账或付款，看似成功的截图不足以支持自动重试或放行。有价值的方案可以是有人监督的单据准备，最终决定仍由员工作出。 故障处理：120 次提交不等于 120 笔业务完成 以下为假设场景，不是客户项目结果：一个批次包含 120 张来源订单。集成确认了 117 张 ERP 单据，得到两项明确的验证拒绝，另有一次提交的响应丢失。对账应为 120 = 117 已确认 + 2 已拒绝 + 1 结果未知，而不是“有三个失败需要重试”。 保留 117 项已确认的来源与 ERP 映射。更正两张被拒订单，并在确定没有业务单据提交成功后才重新发送。对于未知结果，通过获批接口按稳定参考编号查找并检查相关状态。不要盲目重放整个批次。如果没有可靠方法查明未知结果，无人值守提交就没有通过一项重要的可行性门槛。 记录数只是第一层核对。还要比较业务标识、公司、单据状态、明细数量、币种及相关总额。测试修订、取消和乱序到达。总额相同仍可能掩盖错误的单据分配，因此应保留逐对象证据，而不仅是仪表盘上的绿色数字。 恢复并不总是技术回滚。Microsoft 将补偿描述为与业务相关、且可能需要人工介入的处理过程。Microsoft：业务特定的补偿对于 ERP 集成，应与业务负责人约定受支持的取消、更正或冲销路径。不能为了撤销一个重复操作而删除交易表行，或恢复整个生产数据库。 明确谁调查未知结果、谁批准更正、如何",
  "articleSection": "工程",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "citation": [
    {
      "@type": "WebPage",
      "name": "Microsoft：文件映射与验证",
      "url": "https://learn.microsoft.com/en-us/dynamics365/business-central/across-how-to-set-up-data-exchange-definitions"
    },
    {
      "@type": "WebPage",
      "name": "WinSCP：完整上传交接",
      "url": "https://winscp.net/eng/docs/resume"
    },
    {
      "@type": "WebPage",
      "name": "Oracle：NetSuite 导入结果",
      "url": "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/section_N350581.html"
    },
    {
      "@type": "WebPage",
      "name": "Oracle：Connect 的只读边界",
      "url": "https://docs.oracle.com/en/cloud/saas/netsuite/ns-online-help/chapter_3963845427.html"
    },
    {
      "@type": "WebPage",
      "name": "SAP：Recordset 支持边界",
      "url": "https://help.sap.com/doc/089315d8d0f8475a9fc84fb919b501a3/10.0/en-US/SDKHelp/SAPbobsCOM~Recordset.html"
    },
    {
      "@type": "WebPage",
      "name": "Microsoft：SQL 读取一致性警告",
      "url": "https://learn.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-ver17"
    },
    {
      "@type": "WebPage",
      "name": "Microsoft：变更跟踪恢复",
      "url": "https://learn.microsoft.com/en-us/sql/relational-databases/track-changes/work-with-change-tracking-sql-server?view=sql-server-ver17"
    },
    {
      "@type": "WebPage",
      "name": "Microsoft：网关连接模型",
      "url": "https://learn.microsoft.com/en-us/data-integration/gateway/service-gateway-onprem"
    },
    {
      "@type": "WebPage",
      "name": "AWS：请求身份与安全重试",
      "url": "https://aws.amazon.com/builders-library/making-retries-safe-with-idempotent-APIs/"
    },
    {
      "@type": "WebPage",
      "name": "UiPath：选择器行为",
      "url": "https://docs.uipath.com/activities/other/latest/ui-automation/about-selectors"
    },
    {
      "@type": "WebPage",
      "name": "Microsoft：无人值守会话限制",
      "url": "https://learn.microsoft.com/en-us/power-automate/desktop-flows/run-unattended-desktop-flows"
    },
    {
      "@type": "WebPage",
      "name": "Microsoft：虚拟桌面要求",
      "url": "https://learn.microsoft.com/en-us/power-automate/desktop-flows/virtual-desktops"
    },
    {
      "@type": "WebPage",
      "name": "Microsoft：业务特定的补偿",
      "url": "https://learn.microsoft.com/en-us/azure/architecture/patterns/compensating-transaction"
    },
    {
      "@type": "WebPage",
      "name": "Microsoft：渐进式迁移限制",
      "url": "https://learn.microsoft.com/en-us/azure/architecture/patterns/strangler-fig"
    }
  ],
  "dateModified": "2026-09-29",
  "datePublished": "2026-09-29",
  "description": "先评估业务操作，再选择技术。受支持的文件交换可用于批处理，获批只读访问可用于报表。中间件协调真实接口，但不能凭空创造安全的 ERP 写入。界面自动化需要受支持的会话模式和可验证结果。如果未知结果无法安全查明，应停止无人值守提交。付费可行性评估应记录访问、数据含义、代表性测试、恢复、运营成本以及通过、有条件通过或不实施的结论。",
  "headline": "ERP 没有 API，如何集成？文件交换、数据库读取、RPA 还是替换系统",
  "image": "https://wavect.io/img/blog/headers/header_legacy-erp-integration-without-api.svg",
  "inLanguage": "zh",
  "keywords": "ERP 集成, 遗留系统, 架构",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/zh/blog/legacy-erp-integration-without-api/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/zh/blog/legacy-erp-integration-without-api/",
  "wordCount": 438
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/overview/",
      "name": "博客概览",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/topics/delivery-qa/",
      "name": "交付与 QA",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/clusters/architecture-platforms/",
      "name": "架构与平台",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/blog/legacy-erp-integration-without-api/",
      "name": "ERP 没有 API 如何集成：方案与可行性评估",
      "position": 5
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "部分流程可以。先确认受支持的导入、导出、集成模块、SDK 或获批查询面是否覆盖具体操作。读取信息不等于创建、预留或过账业务单据。评估必须核查已安装版本、访问权限和可观察的结果。"
      },
      "name": "旧 ERP 没有 API，还能集成吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "如果处理时效符合业务要求，且导入器提供可用结果，文件方案可以合适。需定义模式和标识，防止处理不完整文件，并证明部分接受、安全重复提交和对账可行。上传成功不等于业务完成。"
      },
      "name": "CSV 足够可靠，可以用于 ERP 集成吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "不能假设技术访问就意味着交易写入获得授权或支持。应核查厂商文档规则。获批暂存接口不同于任意修改应用表。只读集成应保持只读，除非另行建立经过批准的业务操作路径。"
      },
      "name": "可以直接写 ERP 数据库吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "它可以对其他应用提供 API，内部使用获批文件、查询或界面流程。但这不会创造缺失的 ERP 操作或交易保证。实际接口、授权和恢复限制，仍决定新 API 能承诺什么。"
      },
      "name": "中间件能为没有 API 的 ERP 创建 API 吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "对于范围明确，且实际客户端、身份、会话模式、业务量及结果验证均已测试的流程，可以考虑 RPA。有人监督的单据准备可能足够。无法在避免重复风险的前提下查明未知结果时，不应按该设计执行无人值守不可逆操作。"
      },
      "name": "什么时候使用 RPA 合理？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "取决于获批访问路径，以及业务对实时的定义。频繁轮询报表副本不能预留库存，也不能保证权威过账。应测量端到端时效并验证操作；否则应降低要求或选择其他受支持路径。"
      },
      "name": "没有 API 的 ERP 能做实时集成吗？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "交付特定版本接口清单、业务数据契约、代表性技术证据、故障与对账设计、运营责任，以及通过、有条件通过或不实施的建议。费用和范围需单独约定。原型不证明生产可靠性或所有升级路径。"
      },
      "name": "付费集成可行性评估交付什么？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "当设计依赖未经批准的访问、不受支持的写入、绕过控制或对未知结果进行不安全重试时，应停止。先考虑缩小范围、厂商模块或有人监督步骤。替换需要独立的迁移、数据权威、对账和运营计划。"
      },
      "name": "什么时候应该替换 ERP 或停止集成？"
    }
  ]
}
```
