文章
泛微 OA 二次开发、Java 技术实践与踩坑记录。 共 95 篇。
专栏
专栏 01
泛微 E9
泛微 E-cology 9 二次开发实践,覆盖 ecode 前端、流程建模、后端接口与踩坑记录。
进入专栏
专栏 02
泛微 E10
泛微 E-cology 10 二次开发实践,覆盖表单、接口与前端定制。
进入专栏
专栏 03
部署与自托管
Docker 部署、自建服务与云环境的实践记录,如 Doris、excalidraw、olmocr 等。
进入专栏
专栏 04
前端与脚本
前端开发、脚本工具、系统与效率技巧,如 JS、Next.js、Python、PS 等。
进入专栏
专栏 05
生活与随笔
日常生活、随想与站点运营记录的随笔。
进入专栏
全部归档
按主题浏览2026
2026-10-22
[泛微 Ecology10] E10 Helper Chrome 扩展插件,提升你的工作效率
E10 Helper 是一个面向泛微 E10 OA 的 Chrome 扩展(Manifest V3),开发初衷是解决多环境切换时的误操作风险和分散在多层的重复操作:在设置页登记多个 OA 地址(可分别标记开发/测试/预发布/生产)后,扩展会自动识别当前页面属于哪个环境,非生产环境叠加彩色全屏边框和右上角标签(开发/测试橙色、预发布紫色,生产不显示),扩展图标也会显示绿点表示当前页面已连接。popup 提供十个入口:环境边框开关、Show Console(给 OA 页面 URL 注入 wea_link_keep_show_console=1,兼容 SPA 路由,打开后即可调出平台自带控制台)、系统语言切换(含 Beta 语言标记)、人员查询(按姓名/工号/邮箱/手机/办公电话搜索通讯录,点击直达人员详情页)、LDAP 人员查询(按过滤器查目录条目)、人员信息记录(在人员详情页拉取该人员的字段变更历史,按字段聚合展示旧值→新值,支持搜索)、查看实例日志(在动作流设计器或日志页直接唤起平台原生的实例日志弹窗)、重新执行动作流(按当前应用和日志重新执行一次)、SQL 查询(走数据中心直连数据源的 SQL 预览接口,连接 ID 全局配置,默认 4,结果最多渲染 200 行)以及单点登录(用配置的 app_key/app_security 换取登录 Token,在无痕窗口打开 SSO 链接,用于以目标人员身份验证)。安装方式为 Chrome 111+ 下加载已解压的扩展程序;配置项包括每个环境的 OA 地址、LDAP ID、app_key/app_security,SQL 连接 ID 在 popup 内填写。所有请求都在 OA 页面中以用户当前登录会话发出(携带 Cookie),配置仅保存在本机 chrome.storage.local,不上传、无统计、无第三方服务;功能只在命中已配置 OA 地址时启用。项目为个人开发的非官方工具,与泛微网络无隶属关系,MIT 协议开源。已知限制:依赖 E10 前端结构与内部接口,版本升级可能需要适配;实例日志依赖页面中文按钮文案;人员信息记录单次最多拉取最近 100 条;扩展安装或更新前打开的页面需刷新;目前没有自动化功能测试。
泛微 E10
2026-10-21
[泛微 Ecology10] Ones 万能组件 V1:让表单组件变成任何你想要的样子
Ones 万能组件是 E10 表单组件,不是 EB 页面组件。它在表单设计器组件管理中创建,配置 4 项:单文件 HTML、运行 JS、调试、AI 生成(默认折叠)。运行态用 Shadow DOM 渲染,脚本只注入 ctx;ctx 统一封装 WeFormSDK 与 formStore,提供字段读写、只读/必填/隐藏、初始值、选项显示名映射、明细 rowId、字段变化/属性变化/保存前 hook。AI 面板用内置模板 + 需求 + 字段清单生成提示词,AI 返回的 HTML 粘回即可。V1 已实测渲染、字段读写、只读拦截、固定选项 valueKey 写值、明细写入、保存拦截、hook 去重;打印模板、整表单只读、真实移动端 H5、超大配置、多实例压力未完成。源码与示例在 GitHub:OnesZhang/e10-ones-ufc。
泛微 E10
2026-10-15
Touch-Up:让任何触摸屏在 macOS 上即插即用,以及我做的那些修改
Touch-Up(shueber/Touch-Up)是一个 macOS 用户态触摸屏驱动,由 Sebastian Hueber 开发:市面上绝大多数触摸屏都遵循 USB HID,在 Windows 上插上就能用,接到 Mac 上却毫无反应,Touch-Up 就是补这个缺口——读取 HID 原始数据、解析成触摸点、注入成系统级鼠标事件,不需要内核扩展,安装后授予辅助功能权限即可使用。它有两个形态:Touch Up 工具 App(默认交互借鉴 iPadOS:轻点=点击、拂动=滚动、手指稍作停留再移动=拖拽、双指捏合=缩放、双指点击=右键,还可以开启「触摸窗口把它带到前台」)和 TouchUpCore 框架(把多点触摸数据暴露给开发者,App 本身就是集成示例,可参考 DebugView)。兼容性方面官方说法是「任何在 Windows 上能用的触摸屏都应该能用」,并在 Iiyama TF3222MC、T2336MSC-B2 和 3M C4667PW 上做过测试,Releases 页面提供带公证的构建包。本文记录我在 Fork(OnesZhang/Touch-Up,分支 feature/multi-finger-swipes,commit d7f2933,8 个文件约 +933/−15)上提交的功能:给三指/四指手势增加可自定义的键盘快捷键映射。做法分两层:TouchUpCore 里扩展 12 种可映射手势(三/四指上、下、左、右滑动 8 种,轻点 2 种,长按 2 种),委托协议 TUCTouchDelegate 新增 performKeyboardShortcutForGesture:(滑动识别完成触发一次)与 beginKeyboardHoldForGesture:/endKeyboardHoldForGesture:(长按按下映射键、手指全部抬起才松开),一次手势会话互斥地只判定为滑动/轻点/长按之一,手指移动超过阈值默认 10mm 判为滑动、几乎没动就抬起判为轻点、停住不动默认 0.35s 判为长按;手指按在屏上的整个会话期间鼠标事件被抑制,所以手势不会顺带移动光标或误点击。App 层整理了 48 条 macOS 常用快捷键目录 ShortcutPreset.catalog(含 8 个媒体键,走 NX_KEYTYPE_*),按调度中心与空间、窗口管理、应用切换、导航编辑、系统、媒体与功能键分类,每个手势可在设置里绑定任意预设或设为 Off 保留原光标行为,默认值接近触控板经典体验:三/四指滑动映射调度中心与空间切换、长按映射 fn、轻点关闭;映射持久化在 UserDefaults,设置界面新增 Multi-Finger Shortcuts 分区并适配新旧两套 SwiftUI 布局。此外顺手修了三个 macOS 兼容性问题:缺少输入监控权限时 HID 注册对 NULL 队列无防护导致启动崩溃(现在优雅降级并在设置页顶部显示权限横幅,点 Grant Access 深链到系统隐私面板)、合成方向键缺少真实方向键的 numericPad 标志且控制类快捷键需要 SecondaryFn 标志否则会被调度中心与空间功能丢弃(参考 SO 61872579 / 45704155)、发送合成快捷键后修饰键状态残留会把后续普通点击变成右键(现在显式释放修饰键,fn 的按住状态用不带 SecondaryFn 的 flagsChanged 释放事件清除);并新增 GitHub Actions 工作流在 macOS runner 上自动构建 App,Fork 上还会把产物挂到滚动的 ci-build release 便于直接下载。
前端与脚本
2026-10-15
[泛微 Ecology10] 流程按钮说明浮标:绑定操作码而不是按钮名,改名和切语言都不失效
泛微 E10(e-cology10)流程页右上角有一排操作按钮(提交/保存/删除/更多),「更多」菜单里还有十几项操作,业务用户看不懂;而按钮名称既可以被管理员自定义、也会随界面语言变化,因此任何按名称匹配的说明方案都会失效。本文给出的做法是做一个悬浮的 i 入口 + 下拉面板,数据来自平台官方口子 window.weappWorkflow.getFlowPageSDK().baseStore.operMenus,其字段 menutype 是稳定操作码(SUBMIT、SAVE_DATA、DELETE、REMIND 等),istop===1 表示渲染在右上角、否则进「更多」菜单,title 是平台当前显示名。实现上:面板每行的名称取平台 title(改名后与屏幕一致),释义按 menutype 查一张中英对照表;语言用 window.weappUtils.getLang(),zh* 走中文、其余走英文,每 800ms 重读一次,因此切换界面语言无需刷新页面;入口 top 不写死,取动作条内按钮的真实 bottom+8px,因为带「第 N 条(共 M 条)」条幅的页面会把工具条从约 30px 撑到 54px(实测写死 52px 会压住「更多」),而贴容器底边又会偏下(实测容器底部比按钮低 13px)。页面判定同样不看 URL:同一流程可以是 /sp/workflow/flowpage/view/{id},也可以是 e-builder 流程卡片页 /sp/ebdfpage/card/0/{objId}/{requestId},因此改用平台注入的流程上下文 getFlowPageSDK().baseStore.baseParam.workflowId 作为判据;实测 getFlowPageSDK() 在任何页面都返回对象(连门户都是),而动作条 .ui-title-right-container 在 e-builder 设计器页也存在,两者都不能用来判断;发起流程页 /sp/workflow/newflow、流程列表 /workflow/list/mine 与 /workflow/list/center、设计器页、门户均无 workflowId,判定为 false。降级链:拿不到 getFlowPageSDK() 时退回读 DOM(动作条 button)与 __WEAPP_AGENT_BRIDGE__.describe(menuId) 按名称匹配;表里没有的操作不渲染;页面无流程上下文或无动作条则不注入任何节点;节点被平台整块替换时下次 tick 自愈重挂。实测环境 @weapp/ecodesdk 0.1.54、@weapp/ui 0.0.389-hotfix11、agent bridge 0.2.0,面板层级 1050/1040(高于平台下拉 999、低于平台弹窗)。
泛微 E10
2026-10-09
[泛微 Ecology10] 流程提交失败提示弹窗化:不改平台 DOM,只加一个类名
泛微 E10 流程详情页(PC /sp/workflow/flowpage/*)提交失败时,平台会在页面顶部渲染一条内联红色横幅 div.wffp-operate-msgTip.form-msgtip,页面 URL 带 operResultType=FAIL_SHOW_ERROR_MSG,同时占用表单顶部位置。文章给出的做法是复写官方二开插槽 weappWorkflow.FPDevBlockSlot:只在 blockType === 'Prompts' 且 slotPlace === 'after' 时挂载自定义组件,其余插槽原样透传 <Com {...props} ref={ref} />。组件不重写平台 DOM、不复制平台文案,只给平台已渲染的提示节点挂一个类名 wffp-submit-fail-modal-card,由 CSS 把它变成居中弹窗,因此平台原有文案、出口条件明细和「点击这里进行设置」跳转逻辑全部保留;平台若改了该类名,补丁只是静默失效退回内联提示,不会报错。文章还记录了 hidden/open/closed 状态机与 MutationObserver 同步、遮罩/×/Esc 关闭与右下角重开入口,以及两个取值细节:卡片需 position: fixed(实测祖先无 transform)、z-index 1100 要高于页面右侧悬浮工具(实测 998/999)。最容易踩的坑是平台「条件」悬浮提示 .ui-trigger-popupInner 为 z-index 999,会被卡片(1100)/遮罩(1050) 盖住而「悬停或点击没反应」,需在 body.wffp-submit-fail-modal-open 作用域下把它抬到 1200。实测环境 @weapp/ecodesdk 0.1.53、@weapp/ui 0.0.387-hotfix7,最终 JS 91 行 + CSS 109 行。
泛微 E10
2026-09-20
[泛微 Ecology10] e-builder「隐式传参」拆解:参数不进 URL,藏在 sessionStorage
泛微 E10 e-builder 设计器里按钮配置「打开页面」并选择隐式传参时,参数不会拼到 URL 上,而是以目标链接地址为 key 写入 sessionStorage.jumplinkParams,URL 只带一个 jumplinkParamKey。文章先给出平台「隐式传参」选项的三条官方原文(URL 不拼参数、非 EB 内部地址不支持隐式传参、URL 自定义拼接参数优先级高于参数设置),再基于线上实测与运行时 JS 源码验证拆解写入端与读取端逻辑。关键突破:尽管官方称目标地址非 EB 内部地址(页面、布局、报表、视图、多级填报等)时不支持隐式传参,但写入端并不区分目标类型,e-code 自定义页面(/sp/custom/...)可通过手动读取 sessionStorage 突破该限制,附可直接复用的读取工具函数与 URL 传参对比。
泛微 E10
2026-08-13
[泛微 Ecology9] CUS_FIELDDATA 自定义字段数据表解析
泛微 EC9 的 CUS_FIELDDATA 表用于跨模块存储自定义字段值,按 scope 区分归属:文档中心对应 DocCustomFieldBySecCategory,以目录 ID 和文档 ID 定位;人力资源对应 HrmCustomFieldByInfoType,以标签页和人员 ID 定位。文章提醒该表数据按需生成,无记录属正常,迁移组织架构和人员信息时必须同步此表,且默认禁止 DELETE,需修改配置文件加入白名单后方可删除。
泛微 E9
2026-08-07
[泛微 Ecology9] 自定义接口在线编辑java代码保存没反应解决方案
泛微 EC9 中自定义接口在线编辑 Java 代码保存无反应、接口报 404,是安全机制拦截非白名单 IP 所致。文章给出三步处理:在 WEB-INF/prop 放入放行标记文件,从安全日志中查到本机出口 IP,再将其写入白名单配置文件;随后用 sysadmin 访问 updateRules.jsp 刷新规则,无需重启,集群环境需逐节点访问。文中还说明在线编辑代码存于数据库,各节点无需重复编辑。
泛微 E9
2026-08-07
[泛微 Ecology9] 获取IP地址-服务器IP-访问IP
泛微 EC9 中获取 IP 的两段 JSP 代码:一段用 InetAddress 取本机服务器 IP,便于在集群环境下确认请求落在哪台节点;另一段在登录态下输出 x-forwarded-for、getRemoteAddr、Util.getIpAddr 等取值,并遍历全部请求头,用于排查 OA 获取用户 IP 不准确的问题。
泛微 E9
2026-07-05
[泛微 Ecology9] WorkflowToModeFormulaUtil 公式工具类使用指南
泛微 OA E9 的 WorkflowToModeFormulaUtil 是一个零外部依赖的纯 Java 公式工具类,可按包路径直接调用,用于脱离流程上下文完成日期、数值、文本三类字段的类型转换与计算。文章逐一说明 year、days、datedelta、sum、average、concatenate、replace 等方法的重载用法与返回 String 的特性,并给出合同到期提醒、费用汇总、编号生成等完整示例,还介绍了与 ExpressionEvaluator 组合做表达式计算的实践。使用时需注意 month 返回 1 至 12、replace 起始位置从 1 开始、average 可变参数分母异常等坑点。
泛微 E9