
IntePLM 集成插件
IntePLM 集成插件
pengcheng1291inteplm-integration 技术文档
1. 项目概述
inteplm-integration 是一个专为 嘉立创EDA / EasyEDA 专业版 V3 开发的扩展(当前版本 1.3.2)。同一 .eext 可用于 网页版 与 V3 客户端(在线 / 半离线 / 全离线)。主要功能是实现 EDA 与 IntePLM 的集成:登录、检出、撤销检出、检入、查询与打开。不支持专业版 V2(.epro)。

2. 项目架构分析
本项目采用了典型的 "客户端扩展架构(Client-Extension Architecture)",整体分为两层:
- 宿主环境层(Extension Logic):运行在 EDA 客户端的扩展进程中,负责与 EDA 客户端的底层 API(如系统消息、存储、菜单栏注册、IFrame 创建)进行交互。
- UI 展现层(IFrame Views):基于 HTML/CSS/JS 构筑的独立页面,通过 EDA 提供的 IFrame 容器进行渲染。页面负责收集用户输入,并与宿主环境或外部 PLM 系统进行数据通信。
核心工作流
- 用户在 EDA 顶部菜单栏点击
IntePLM相关菜单。 - 触发
src/index.ts中注册的命令函数(如menuCheckIn)。 - 扩展程序调用
eda.sys_IFrame.openIFrame打开对应的本地 HTML 页面(位于iframe/目录)。 - IFrame / 宿主通过
eda.sys_ClientUrl访问 IntePLM(见iframe/eda-runtime.js),打开工程由宿主src/index.ts下载.epro2并调用importProjectByProjectFile。
3. 核心技术栈
- 编程语言:TypeScript(宿主扩展逻辑)、JavaScript/HTML/CSS(前端 UI 页面)
- UI 框架:原生 DOM 配合 CSS(未使用重量级框架如 Vue/React,以保证扩展轻量化)
- 构建工具:
esbuild(负责极速编译 TS),ts-node(执行打包脚本) - 类型定义:
@jlceda/pro-api-types(嘉立创 EDA 专业版扩展 API 类型声明) - 代码规范:
eslint+eslint-config-alloy,prettier,husky+lint-staged - 其他依赖:
jszip(用于处理本地设计文件的压缩与解压)
4. 模块依赖关系 (目录结构)
inteplm-integration/
├── src/
│ ├── index.ts # 扩展入口、菜单命令、打开/导入
│ └── operate/ # 检出 / 撤销检出 / HTTP 工具
├── iframe/
│ ├── eda-runtime.js # 环境探测 + sys_ClientUrl PLM 请求
│ ├── login.html/js # 登录
│ ├── checkin.html/js # 检入
│ ├── logout.js # 登录态与注销
│ └── queryAndOpen.html/js # 查询与打开
├── config/
├── build/
├── locales/
├── extension.json
├── plmConfig.json
└── package.json
核心模块说明
src/index.ts:activate、菜单回调、工程下载与导入(网页/客户端团队降级;半离线按云端同名覆盖)。iframe/eda-runtime.js:isWeb/isClient/ 离线模式探测,统一 PLM HTTP。iframe/login.html:多账号记忆、服务器地址、密码存储(Web Crypto 不可用时降级)。iframe/checkin.html:检入;工程文件显式导出.epro2。iframe/queryAndOpen.html:查询列表,经 MessageBus 通知宿主打开。src/operate/:检出、撤销检出及requestPlmApi。
5. 功能模块详解
5.1 登录模块

功能说明:
- 支持用户名/密码登录验证
- 多账号历史记录记忆(最多10条)
- 服务器地址配置与缓存
- 密码加密存储(AES-CBC)
- 登录状态持久化
交互流程:
- 用户输入用户名、密码、PLM服务器地址
- 调用
/rest/userService/v1/user/userLogin接口验证 - 登录成功后缓存
authorizationToken、USER_OID等用户信息 - 支持自动填充最近登录账号
5.2 查询与打开模块

功能说明:
- 支持关键词搜索(名称、标识)
- 分页展示 PLM 工程列表
- 支持列宽拖拽调整
- 显示工程状态(c/i-检入、c/o-检出、wrk-工作中)
- 支持直接打开或检出并打开
交互流程:
- 调用
queryProjectByParam接口获取工程列表 - 支持分页加载(10/20/50/100条每页)
- 选中工程后可执行"打开"或"检出并打开"。检出并打开会先完成检出并提示「检出成功」,再询问是否覆盖打开;取消覆盖时提示「检出已完成,已取消打开」,查询窗保持打开
- 打开时自动下载文件并导入 EDA。若当前工作区没有同名工程,会继续查其他团队和其他工作区(半离线下的云端工程);命中则覆盖云端同名工程,并单独提示这是云端同步工程而不是本地工程,避免新建时报「工程名称已存在」。云端同名工程当时不在当前窗口时无法先清文档树,由宿主按已有工程导入。有同名时先弹覆盖确认(查询窗仍开着),确认后再关查询窗并下载;取消覆盖可继续选其它图纸。
5.3 检入模块

功能说明:
- 批量录入配置
- 支持关联关系选择(主控关联等)
- 文档类型配置(CAD文档等)
- 零部件类型与位置选择
- 零部件分类树选择
- 检入提交会带上
partClassificationOid(与分类树按字符串匹配;拉树失败保留回填,树上找不到则清空)
交互流程:
- 获取当前工程信息
- 查询默认工作区(支持缓存)
- 加载关联关系、文档类型、零部件类型等元数据
- 用户配置检入参数后提交
- 调用
importProject接口完成检入
5.4 检出模块
功能说明:
- 从 PLM 系统检出工程
- 自动下载工程文件
- 支持覆盖本地已有工程;半离线下也会覆盖云端同名工程
- 覆盖前会等待目标工程文档树加载完成再清理;从另一张已打开图纸覆盖时,避免残留 PCB 被导入成根目录
原名_1
交互流程:
- 查询用户默认工作区
- 调用
batchCheckoutCadDocs接口执行检出 - 检出成功后自动下载文件
- 导入到 EDA 当前工作区
5.5 撤销检出模块
功能说明:
- 撤销已检出的工程
- 释放 PLM 系统锁定状态
交互流程:
- 获取当前工程信息
- 调用撤销检出接口
- 更新本地工程状态
6. 关键配置文件说明
extension.json
EDA 扩展的清单文件(Manifest),决定了扩展在 EDA 软件中的表现形态:
{
"name": "inteplm-integration",
"version": "1.3.2",
"engines": {
"eda": "^3.2.0"
},
"entry": "./dist/index",
"headerMenus": [
{
"id": "inteplm",
"name": "IntePLM",
"target": "home,sch",
"submenu": [
{ "name": "登录", "registerFn": "menuLogin" },
{ "name": "检入", "registerFn": "menuCheckIn" },
{ "name": "检出", "registerFn": "menuCheckOut" },
{ "name": "撤销检出", "registerFn": "menuCancelCheckOut" },
{ "name": "查询并打开", "registerFn": "menuQueryAndOpen" },
{ "name": "登出", "registerFn": "menuLogout" }
]
}
]
}
plmConfig.json
存储了 IntePLM 系统的接口路由映射关系:
{
"url": {
"login": "/rest/userService/v1/user/userLogin",
"logout": "/rest/userService/v1/user/userLogout",
"queryProjectByParam": "/rest/ecadService/v1/ecad/queryProjectByParam",
"batchCheckoutCadDocs": "/rest/ecadService/v1/ecad/batchCheckoutCadDocs",
"importProject": "/rest/ecadService/v1/ecad/importProject",
"queryDefaultWorkspaceOrCreate": "/rest/ecadService/v1/ecad/queryDefaultWorkspaceOrCreate",
"downFileByFileId": "/rest/ecadService/v1/ecad/downFileByFileId"
}
}
package.json
定义了项目名称和构建脚本:
compile: 使用esbuild将 TS 代码编译到dist/build: 运行编译后,调用packaged.ts将所有资源打包为.eext格式的插件包
7. API 接口文档
7.1 用户认证接口
| 接口名称 | HTTP 方法 | 接口路径 | 作用描述 |
|---|---|---|---|
| 用户登录 | POST | /rest/userService/v1/user/userLogin | 验证凭据并获取 Token |
| 用户注销 | GET | /rest/userService/v1/user/userLogout | 清除服务端 Token |
7.2 ECAD 工程接口
| 接口名称 | HTTP 方法 | 接口路径 | 作用描述 |
|---|---|---|---|
| 查询工程列表 | POST | /rest/ecadService/v1/ecad/queryProjectByParam | 获取 PLM 系统中的工程列表 |
| 检出工程 | POST | /rest/ecadService/v1/ecad/batchCheckoutCadDocs | 将 PLM 工程锁定并下载到本地 |
| 检入工程 | POST | /rest/ecadService/v1/ecad/importProject | 将本地工程上传至 PLM |
| 查询默认工作区 | GET | /rest/ecadService/v1/ecad/queryDefaultWorkspaceOrCreate | 获取用户默认工作区 |
| 下载文件 | GET | /rest/ecadService/v1/ecad/downFileByFileId | 根据文件 ID 下载工程文件 |
| 查询 ECAD 信息 | POST | /rest/ecadService/v1/ecad/queryECadByMainFileName | 根据主文件名查询 ECAD 文档 |
7.3 宿主与 IFrame 协作
| 方式 | 说明 |
|---|---|
eda.sys_MessageBus 主题 iframe-query-result | 查询页请求打开工程 |
eda.sys_MessageBus.rpcServicePublic('openIframeCheckinSetting') | 检出等场景下载并打开 .epro2 |
eda.sys_ClientUrl.request | 访问 IntePLM(需外部交互权限) |
8. 部署与打包流程
8.1 环境准备
确保本地安装 Node.js (>=20.5.0) 及包管理器(npm/pnpm)。
8.2 安装依赖
npm install
8.3 执行打包
npm run build
打包流程:
- 自动清理
dist目录 - 使用
esbuild将 TS 编译为 JS - 运行
build/packaged.ts将dist/、iframe/、images/、locales/及相关配置文件打包
8.4 输出产物
在 build/dist/ 目录下生成 inteplm-integration_v1.3.2.eext 扩展安装包。
8.5 安装(网页版与 V3 客户端)
网页版与嘉立创 EDA 专业版 V3 客户端(在线 / 半离线 / 全离线)安装同一 .eext。在「扩展管理」中选择本地安装即可。
客户端请开启本扩展权限:
- 外部交互(访问 IntePLM)
- 工程管理 > 下载工程(检入导出
.epro2) - 工程设计图 > 文件导出(PCB/原理图 PDF、BOM)
IntePLM 服务端 CORS 不要只放行 pro.lceda.cn,客户端请求 Origin 与网页不同。半/全离线客户端仍需能访问 IntePLM 地址。工程主文件统一为 .epro2,不兼容 V2 .epro。
9. 数据持久化说明
本项目作为纯客户端扩展,不存在独立的后端关系型数据库。数据持久化主要依赖 EDA 客户端提供的系统存储 API(eda.sys_Storage):
| 存储键 | 数据类型 | 说明 |
|---|---|---|
USERNAME | string | 登录用户名 |
authorization | string | 认证 Token |
PLMServerUrl | string | PLM 服务器地址 |
USER_OID | string | 用户唯一标识 |
DEFAULT_WORKSPACE_ID | string | 默认工作区 ID(运行时查询缓存) |
plmConfig | object | PLM 接口配置 |
文档版本: 1.3.2 最后更新: 2026-09-07
1.3.2
变更
- 心跳连续 3 次 5xx 或网络失败时清本地登录态并 toast,不弹登录窗,避免 PLM 未启动时每秒重试
- 查询页检出成功后刷新当前网格;按新迭代 oid / master / 文件匹配选中,避免取消覆盖后再点「检出并打开」因状态未更新而失败
- 探测接口失败时:5xx/超时/连不上不登录,404 及无法识别的宿主错误(如「请求无法被正确处理」)按 V12 登录
1.3.1
新增
- 支持嘉立创 EDA 专业版 V3 客户端(在线 / 半离线 / 全离线),与网页版共用同一
.eext - 新增
iframe/eda-runtime.js:运行环境探测,以及统一的sys_ClientUrlPLM HTTP 封装(含权限错误提示)
变更
- 登录、检入、查询、注销、文件下载改为走
eda.sys_ClientUrl,不再依赖 IFrame 内裸fetch - 打开/导入不再强依赖「当前团队」:依次回退到个人团队,离线无团队时
createProject后再导入。半离线会扫描其他工作区/团队的同名云端工程并走覆盖导入,避免「工程名称已存在」。仅云端有同名时会单独提示「覆盖云端同步工程」,与本地覆盖提示区分 - 检入工程包显式导出
.epro2,打开导入固定JLCEDA Pro;不兼容 V2.epro - 登录态检查改为异步读取扩展存储,避免客户端把 Promise 误判为已登录
- 登录页背景改为 HTML 直接引用图片,避免客户端 IFrame 无法加载 CSS
url() - 查询页移除不存在的
/iframe/operate-utils.js引用 - 覆盖本地工程时同步清理 Panel(客户端有面板数据,网页版原先没有)
- 打开工程加锁防止连点重复导入;扫描同名时跳过失败的 UUID;新建若报「工程名称已存在」则改为覆盖或明确失败,不再二次新建
- 覆盖导入前先删 Board 再清 PCB,并去掉导入产生的
原名_1同名冲突副本 - 覆盖前等待当前工程文档树加载完成再清理;先打开其他图纸再覆盖时,避免旧 PCB 尚未列出就被导入成根目录
原名_1 - 查询打开:有同名时先弹覆盖确认,确认后再关查询窗并下载;取消覆盖则查询窗保持打开。注销请求头统一为
authorization;本地覆盖等待文档树的轮次加长 - 查询「检出并打开」在检出接口成功后立即提示「检出成功」;随后若取消覆盖则提示「检出已完成,已取消打开」
- 菜单「检出 / 撤销检出」在用户确认后使用官方
sys_LoadingAndProgressBar遮罩,接口与覆盖打开完成前阻断继续操作 - 检出 / 撤销检出:拿不到当前工程时提示「未获取到当前工程,请先打开工程后再试」;PLM 查无此工程时提示「当前工程在 IntePLM 中不存在」
- PLM HTTP 遇 4xx/5xx 或 HTML 错误页时提示「IntePLM 服务异常(状态码)」等,不再把
Unexpected token '<'展示给用户 - PLM 接口返回 401 时清除本地登录态并打开登录页;登录/注销接口的 401 不按会话失效处理
- 登录不再换取 72 小时长效 token,改用登录响应头 token,并由宿主每 10 分钟 POST
/rest/v1/system/config/heartbeat刷新 - 登录
appID改为短英文,例如JLCEDA-Pro-Client(3.2.174)、JLCEDA-Pro-Web(3.2.174) - 查询打开在登录失效后重新登录成功时自动刷新列表,避免空窗残留
- 查询打开因登录失效弹出登录窗后若取消登录,关闭空的查询窗口
- 查询打开网格横向滚动时表头与行内容同步对齐
- 查询打开标识列缩窄时保留状态图标,仅文字省略
- 查询打开各列缩窄时文字统一省略显示
- 查询打开用 grid 列模板按权重铺满整行,标识列约 3 份;拖过的列宽缓存改为 v2
- 查询打开数据列最小宽固定 60px,拖宽其它列时前面列不再被挤没
- 拖列时先锁定各列当前像素宽,只改当前列,超出后横向滚动,其它列宽度不变
- 扩展
engines.eda改为^3.2.0,与专业版 V3.2 产品版本对齐 - 心跳改由宿主启动并立即请求一次;登录成功走公共消息总线,避免登录窗关闭后定时器丢失
- 登录成功后通过公共 RPC 通知宿主启动心跳,关闭登录窗也会再检查一次;心跳路径有默认值,token 未就绪会短重试
- 登录成功后不再等待心跳 RPC,立刻关窗;心跳在后台启动
- 心跳改由宿主每秒检测登录态:登录后约 1 秒内 POST 心跳,之后每 10 分钟一次,不再依赖登录窗 RPC
- 宿主模块加载时即挂心跳检测,Timer 未就绪会重试,客户端重启后不必再点一次登录
- 登录失效自动弹出登录窗时先关闭查询打开窗,避免两个窗口叠在一起
- 未打开工程时点检入不再打开检入窗,提示与检出一致:请先打开工程后再试
- 检入错误提示改为短句:不再套「初始化/请求失败」前缀;401 同时关闭检入窗;下拉加载失败会提示;提交前再次确认当前工程
- 打开检入窗时用遮罩提示「正在加载检入信息」,默认信息和选项加载完成后再允许操作
- 登录成功不再刷新查询列表,避免客户端缓存的查询 iframe 被同步广播连打
queryProjectByParam - 注销前先停心跳检测;注销过程中 401 不再弹出登录窗
- 注销结束后不再立刻心跳;残留的过期 token 不会当成刚登录去刷新,避免再弹登录窗
- 已登录后再点「登录」只提示用户名,不再立刻请求 heartbeat
- 心跳只在「从未登录变为已登录」或满 10 分钟时请求;点菜单/重新加载扩展时已有 token 不会立刻心跳
- 注销残留 token 只抑制心跳 401 弹窗,其它业务 401 仍打开登录;注销接口非 2xx 不再打印注销成功;仅实际发出心跳后才记录心跳时间
- 每次点登录先空 POST 探测
probeApiEndpoint:仅响应 200 走 V21(url21),超时/5xx 提示后不登录,其余按 V12(url)登录;后续接口按存储的PLMVersion选 path - 登录页语言按钮已从 HTML 去掉时不再绑
langBtn事件,避免打开登录窗控制台报addEventListener空引用 - 确认覆盖本地/云端工程后先等待约 300ms,再关查询窗并清理文档树,减轻宿主对话框卸载时的
removeChild报错 - 查询页打开 / 覆盖打开在确认后使用与检出相同的官方无进度遮罩,取消覆盖不弹出遮罩
- 点「打开」后立刻出遮罩(含在线扫描同名工程);弹覆盖确认前关掉,确认后再盖上
- 覆盖打开等待工程就绪时用同步占位,避免 1 秒定时器在导入未完成时再进一次导致重复导入
- 打开锁、requestId 去重与覆盖导入占位改到
globalThis,避免客户端多次加载扩展入口后同一点击被多份宿主同时导入 - 检入导出图纸后切回检入前选中的标签页
- 约定每次功能修改后插件补丁号加 1(
extension.json/ 变更日志)
说明
- 仅支持专业版 V3;未进菜单的
setting.html/upload.html/download.html本轮未改 - 客户端需开启:外部交互、工程管理 > 下载工程、工程设计图 > 文件导出
1.2.1
变更
- 【重构】修复 IFrame 内打开工程提示“未启用扩展和独立脚本的外部交互权限”的问题:
- 引入
iframe/api-proxy.js进行 API 请求代理。 src/index.ts增加基于postMessage的安全交互方法。queryAndOpen.js、checkout.js、uncheckout.js现统一通过callExtensionApi调用受限接口(支持超时 10s 与 2 次重试)。- 增加 API 超时或调用失败时返回的标准化错误码
EXT_API_FORBIDDEN。 - 提供 100% 覆盖率的 API 代理单元测试。
- 引入
1.2.0
变更
- 使用纯 ESLint 的代码格式化方式
- 打包时额外进行压缩,可以获得更小的扩展包
1.1.1
变更
- 为了符合隐私政策,禁止在 extension.json、README.md、CHANGELOG.md、LICENSE 内添加电子邮箱地址作为联系方式
1.1.0
新增
- 新增扩展注册头部菜单的多语言翻译支持
- 新增更新日志(CHANGELOG.md)
变更
- 替换已弃用的方法(SYS_Dialog.showInformationMessage)
1.0.0
初始版本

类型
关键词
扩展信息
| 版本 | v1.3.2 |
| 发布者 | TIANYU SOFT |
| 发布时间 | 2026-09-17 09:40:13 |
| 名称 | inteplm-integration |
| UUID | e089d388285a4d6a9afaeb982a1d3d6d |
| 适用EDA版本: | ^3.2.0 |
| 报告 | 报告滥用 |
评论