简介《通达OA二次开发手册》是一份面向有编程基础的技术人员的PDF文档聚焦Office Anywhere通达OA网络智能办公系统的二次开发帮助读者掌握环境搭建、参数配置、文件结构与数据库管理从而支撑企业个性化功能定制。资源包共1个PDF文件大小仅188KB轻量易携带适合随查随用。手册内容详实从1.3节参数配置切入细致说明OfficeFPM、OfficWeb、PHP、MySQL四者的协同关系并逐一解读auth.inc.php、header.inc.php、common.inc.php、conn.php等核心文件的实际用途例如auth.inc.php负责用户认证与权限控制conn.php管理数据库连接。第二章数据库管理则涵盖phpMyAdmin的安装与使用让读者掌握数据表分析、备份恢复等操作为功能扩展打好数据基础。除此之外文档还展示了从建立模块目录、创建菜单到分配权限、编码测试的完整开发流程。目前已有88人学习下载是一份既能系统入门、又能回到实际编码场景查漏补缺的实用指南。1. 通达OA二次开发手册先搞懂这本手册到底能帮你解决什么做通达OA二次开发的人手里大概率都有一本《通达OA二次开发手册.pdf》但真正把它读完、读透、照着做成功的并不多。原因是这本手册不是一本“编程教程”它更像一张地图告诉你通达OA的目录结构、数据字典、接口约定和扩展边界。你拿着它能少走很多弯路——比如不用再去猜某个表字段是干什么的不用为了挂一个菜单折腾一下午。通达OA本身是PHP MySQL架构的老牌B/S办公系统二次开发的核心不是在框架外另起炉灶而是顺着它的“表单 工作流 门户 数据源”这套体系做增量扩展。适合谁读OA管理员、PHP工程师、做系统集成的实施人员都能从里面找到自己需要的那一块。这篇笔记我按“先建立技术地图再落地最小开发最后避开常见坑”的顺序把手册里最有用的东西拆给你。2. 读手册前先建立技术地图通达OA的框架约定与应用入口2.1 通达OA为什么适合二次开发PHPMySQL的扩展边界通达OA的技术栈是PHP MySQL前端用传统HTML JavaScriptjQuery居多整体是B/S架构。这套组合在今天的互联网圈看起来不算新但在企业内网办公场景里它的优势非常明显部署简单、依赖少、PHP上手门槛低企业内部IT人员哪怕没受过正规训练也能在短时间内看懂一段OA源码。二次开发的“边界”也由此而来你能碰的部分是webroot下的PHP脚本、MySQL数据库表、OA自带的后台菜单配置、工作流设计器以及少量需要改写的JS前端逻辑。不能碰或最好不要碰的部分是OA系统内核文件比如inc目录下的核心类库升级时会被覆盖、系统自带的官方流程引擎底层以及数据库里以td_开头的系统表结构。很多人二次开发翻车就是因为在“不能碰”的区域硬改了代码结果OA一升级改动全部丢失甚至导致系统崩溃。手册里通常会用“系统架构与目录规范”这一章把这两类区域讲清楚这也是我建议你第一遍读手册时先看的内容。二次开发的价值不在于重新发明轮子而在于把OA已经有的能力组合起来。比如你不需要自己写一套考勤算法只需要在OA的考勤数据表上做一层报表统计不需要从头做一个审批流引擎只要用工作流设计器把表单和流程节点串起来再挂一段PHP后置动作处理业务逻辑。手册的作用就是告诉你这些“现成能力”的入口在哪里以及它们的接口长什么样。2.2 手册里最值得先啃的几章数据字典与接口约定拿到《通达OA二次开发手册.pdf》很多人习惯从头翻到尾结果前几章全是系统安装和架构介绍翻到后面才发现自己真正需要的只有那几节。我一般会建议按下面的顺序跳着读而不是线性读手册章节常见划分核心内容落地价值系统架构与目录结构webroot目录划分、inc核心类库、module扩展目录知道代码放哪里、不能改哪里数据字典用户表、部门表、流程表、公文表、考勤表等字段说明写SQL、做报表、同步数据的基本依据开发规范PHP编码规范、命名约定、Session处理方式避免写出“跑一次就废”的脚本菜单挂载与权限后台菜单管理、URL参数格式、权限控制把开发好的功能嵌入OA现有界面工作流接口流程表单数据读取、流转条件、后置动作触发审批流的二次开发核心外部数据源数据源配置、HTTP接口调用、数据同步机制对接ERP、HR、MES等外部系统发布与部署文件放置位置、缓存清理、升级注意避免上线后“改了没生效”数据字典是整本手册里信息密度最高的一章。通达OA的数据库表前缀一般是td_用户表、部门表、角色表、流程实例表、流程日志表、附件表、公文表都有固定的命名规则。你不需要背下来但要知道查哪个表能拿到什么数据以及哪些表之间有外键关联。常见的坑是你以为某个字段在A表实际在B表——比如用户手机号可能在td_user里也可能需要JOIN部门扩展信息表才能拿到。接口约定那块同样重要它不等于RESTful API通达OA更多是“PHP页面 GET/POST参数”的传参约定外加一些内部封装的数据库操作类。读懂接口约定你就知道外部系统怎么通过URL或POST请求调用OA页面也明白为什么有些页面必须带isessionid参数才能访问。2.3 开发环境怎么搭一份可复现的本地调试清单二次开发最忌讳在正式服务器上边改边试。手册里的“开发规范”章节通常会提醒你搭建独立的开发环境但不会给你一份具体的操作清单。我根据自己的习惯整理了一份本地调试环境的搭建步骤照着做基本不会出问题。第一步准备一台干净的Windows机器或者虚拟机安装PHP集成环境比如phpStudy或XAMPP。注意PHP版本通达OA历史上对PHP 5.x兼容最好部分新版支持PHP 7.x如果你手头的OA版本较老千万别用PHP 8.x否则直接白屏。第二步把OA的完整源码放到Web根目录导入OA自带的数据库备份文件修改webroot下的数据库配置文件一般是inc/config.php或inc/oa_config.php把数据库连接指向本地MySQL。第三步开启PHP错误显示。改php.inidisplay_errors On error_reporting E_ALL ~E_DEPRECATED ~E_NOTICE log_errors On这样做的原因是OA源码里很多老代码会触发Deprecated和Notice级别提示全开会让页面顶部全是警告干扰调试但E_ALL级别错误必须显示否则你连“哪里写错了”都看不到。第四步在浏览器里用http://localhost/访问OA登录页用管理员账号登录然后找一个不影响业务的功能页面试试修改一个PHP文件加一行echo test;确认能实时生效。到这里本地开发环境就通了。这套环境的核心逻辑是“隔离 可回滚”。源码和数据库都在本地改坏了直接从服务器再拉一份数据库随便造数据流程随便跑不用怕影响真实业务。很多熟手还会用版本管理工具给webroot目录做快照回滚时一条命令搞定相当于给自己的开发过程上了后悔药。3. 照着手册做第一个能跑的开发从数据字典到表单功能3.1 最小案例在module目录新增一个PHP页面第一个二次开发案例不要设计得太复杂。我建议做一个“部门人员列表”页面读取OA里的部门信息按部门展示人员名单。这个案例能帮你跑通三件事目录放置、数据库读取、页面渲染。在通达OA的webroot下扩展模块的存放目录一般是module你新建一个文件夹比如module/mydemo/在里面创建一个PHP文件index.php内容如下?php // 引入OA的核心初始化文件处理session与权限 include_once(inc/auth.php); // 用OA封装的数据库操作类执行查询这里以部门表为例 $query SELECT DEPT_ID, DEPT_NAME FROM td_department ORDER BY DEPT_ID ASC; $cursor exequery(TD::conn(), $query); // 以表格形式输出部门列表 echo table border1 cellpadding5 cellspacing0; echo trtd部门ID/tdtd部门名称/td/tr; while ($row mysql_fetch_array($cursor)) { echo trtd . $row[DEPT_ID] . /tdtd . $row[DEPT_NAME] . /td/tr; } echo /table; ?这段代码的逻辑说明inc/auth.php是通达OA几乎所有PHP页面都要引入的初始化文件它会检查用户是否已登录并初始化全局变量TD::conn()是OA封装好的数据库连接对象不要自己用new mysqli去建立连接exequery是OA的查询封装函数参数是连接对象和SQL语句mysql_fetch_array是PHP老版本惯用的取行函数如果本地跑起来报函数不存在说明PHP版本太新需要在兼容性设置里切回PHP 5.x。这段代码里没有写死数据库账号密码也没有处理复杂的权限逻辑目的就是让你先看到“哦页面在OA里能跑起来了”。跑通之后你再往回看手册里的“数据库操作类”和“session处理”章节理解会更深一层。读代码和照抄代码最大的区别在于你知道每一行的作用也知道删掉哪一行会引发什么问题。3.2 把功能挂到OA菜单上菜单管理里的关键设置页面文件写好了但用户在OA里看不见它等于白做。下一步是把页面挂到后台菜单上。通达OA的菜单挂载不需要改代码在后台的“系统管理” - “菜单管理”里操作即可。常见步骤如下新增菜单项菜单类型选“模块菜单”或“自定义菜单”菜单名称填“部门人员列表”菜单URL填你刚才写的PHP文件的访问路径比如/module/mydemo/index.php。保存后为该菜单设置权限范围勾选允许访问的角色比如“办公室”“IT部”然后退出管理员账号用普通用户账号登录在左侧菜单里找到并打开这个页面。参数说明菜单名称会显示在OA左侧导航栏建议用中文便于用户识别菜单URL的路径必须以/开头相对路径容易在OA内部跳转时404权限设置如果不做默认只有系统管理员能看到这个菜单普通用户登录后看不到——这也是很多新手“功能开发完了但用户说看不到”的原因。这里还要注意一个细节菜单缓存。通达OA的菜单配置有时候不会立即生效需要在系统管理里清理一下菜单缓存或者重新登录账号。如果你在手册里看到“菜单管理”相关章节重点看它提到的那几个设置项别一上来就试那些复杂的“门户菜单”“导航菜单”先把这个基础菜单搞定再说。3.3 数据字典怎么用查表、写SQL、避免直接改表开发和调试过程中最常用的不是PHP代码而是SQL查询。数据字典的价值就在这里它告诉你表名和字段名。比如你可以执行下面这条SQL查看最近创建的用户SELECT USER_ID, USER_NAME, DEPT_ID, USER_SEX, TEL_NUM, MOBILE_NUM FROM td_user ORDER BY USER_ID DESC LIMIT 20;这条SQL从td_user用户主表里取出最近20条用户记录选了用户ID、姓名、部门ID、性别、电话、手机号这几个字段。你会看到用户主表里其实没有冗余的部门名称只有DEPT_ID外键要显示部门名必须关联td_department表SELECT u.USER_NAME, d.DEPT_NAME FROM td_user u LEFT JOIN td_department d ON u.DEPT_ID d.DEPT_ID WHERE d.DEPT_NAME LIKE %研发% LIMIT 50;这种关联查询在实际开发里非常常见。数据字典还能帮你规避一个高风险操作直接修改OA系统表的数据。比如你想批量调整部门排序号千万别写UPDATE td_department SET DEPT_NO XX除非你完全理解这个字段在OA内部逻辑里的作用。正确做法是通过OA后台界面的部门管理功能批量调整或者写一个PHP脚本调用OA的部门操作接口。你改数据字典的表结构或数据OA的缓存、索引、统计逻辑很可能不会跟着变最终导致界面显示与数据库不一致。所以在做任何涉及系统表的操作前先翻手册的数据字典确认字段用途再写SQL。拿不准的就只做SELECT查询UPDATE和DELETE操作能不用就不用确保业务数据的安全。4. 从手册里挖出来的三段高频二次开发工作流、外部接口与门户4.1 工作流表单二次开发字段联动与流转后置动作工作流是通达OA的拳头功能也是二次开发需求最集中的地方。常见的需求有两类一类是表单字段联动比如选择了“请假类型”后自动填充“可休假天数”另一类是流程流转到某个节点后自动执行一段业务逻辑比如审批通过后把数据写入外部系统。字段联动的实现核心是找到表单控件的ID和触发事件。通达OA的工作流表单在设计器里生成的字段最终会在HTML中渲染为input、select、textarea等元素。你可以直接在表单中添加JavaScript脚本来实现联动下面是一个非常简单的请假天数自动计算示例script languagejavascript function calcLeaveDays(){ // 获取表单中开始日期和结束日期的值 var startDate document.getElementById(start_date).value; var endDate document.getElementById(end_date).value; if (startDate.length 0 || endDate.length 0) { return; } // 按天计算两个日期之间的差值 var start new Date(startDate); var end new Date(endDate); var diffDays (end - start) / (1000 * 60 * 60 * 24); // 把计算结果写回“请假天数”字段 document.getElementById(leave_days).value diffDays; } /script这段脚本在日期字段的onchange事件里调用字段ID是你在表单设计器里定义的。需要注意通达OA的表单字段ID一般不能包含特殊字符命名建议只用字母和下划线否则document.getElementById会取不到值日期控件在OA里往往会被自带的日历组件包裹标准input元素绑定onchange事件即可生效但如果你用的是OA的自定义控件需要去控件配置里找到“事件绑定”入口。流转后置动作的实现逻辑略微不同。你需要在工作流设计器里找到目标节点在节点的“处理人动作”或“流转条件”里配置触发脚本。这些脚本通常被放到module目录下一个专门的文件夹里由OA在工作流流转时自动调用。手册里的“工作流接口”章节会给出函数签名和回调时机照着抄就不会错。这个场景下代码不是重点关键是搞清楚“什么时候触发”和“能拿到哪些参数”。4.2 外部系统数据同步用OA的接口而不是直连数据库企业里最常见的二次开发需求就是“把OA里的审批结果同步到ERP”或者“把HR系统的新员工信息同步到OA”。很多新手的第一反应是写一个定时任务直接连接两个系统的数据库把数据搬过去。短期看是能跑但长期看隐患巨大一旦其中一个系统的表结构升级你的同步代码就废了而且直连数据库容易造成锁表和数据不一致。更可靠的路径是由OA提供数据源接口外部系统通过HTTP调用或者反过来OA定时去调用外部系统的接口拉数据。通达OA手册的“数据源与接口”章节会告诉你如何配置一个数据源以及如何通过OA内建的HTTP类发送请求。下面是一个在OA模块里用td_http类请求外部ERP接口的示意?php include_once(inc/auth.php); // 构造一个外部系统的POST请求地址 $url http://192.168.10.20:8080/api/sync_leave; // 准备要提交的数据 $postData array( user_id 1001, user_name 张三, days 3, type 事假 ); // 调用OA封装的HTTP请求函数发送数据 $response td_http::post($url, $postData); // 输出外部系统返回的结果便于调试 echo $response; ?这个过程里td_http::post是OA封装好的HTTP请求方法你也可以直接用原生的curl但既然OA自带封装就没必要引入额外依赖。需要注意的地方外部系统返回的响应时间如果太长会导致OA页面卡住所以这类同步功能建议结合定时任务使用而不是在用户点击“提交审批”时同步调用外部系统地址如果走的是内网要确保OA服务器和ERP服务器网络互通这个网络层问题不在手册里但在实际环境里经常出现。如果你的外部系统还没有接口可调用那就要和对方沟通让他们先暴露一个接口出来。二次开发最怕的不是写代码而是和别的系统做集成时对方不配合。这时候手册能帮你的就是让你明确告诉对方“我只需要一个这样的HTTP接口参数和返回格式如下。”你手里有数据字典和接口约定谈对接的时候就有底气。4.3 门户与移动端挂载上下游配合的发布路径功能开发完成最后一步是让它出现在用户面前。除了前面说的菜单挂载还有两个常见出口OA门户和移动端OA。门户页面上你可以通过后台的“门户管理”添加一个“应用”模块将刚才开发的功能页面以iframe或链接形式嵌入移动端OA则需要在企业微信或钉钉里配置应用链接指向OA页面。这里有一个发布路径是固定的开发环境调试通过 - 测试环境走通全流程 - 生产环境部署文件 - 清理缓存 - 用户验证。每一步都有具体的验证点比如测试环境要验证权限是否生效生产环境要验证附件上传目录权限。很多时候功能本身没毛病但发布时漏了一步“清理缓存”导致用户看到的是旧页面于是产生“开发没做出来”的误解。移动端挂载还要注意页面适配问题。老版本的OA页面是为PC浏览器设计的在手机屏幕上会出现按钮错位、表格横向滚动等问题。最常见也最省事的做法是单独做一个移动端适配页面或者直接让用户通过移动端OA里的“表单中心”发起流程而不是强行把PC页面塞进手机浏览器。这一点手册里不一定有专门章节但你要有这个意识办公场景里移动端使用频率非常高确保你二次开发出来的东西在手机上能用比在PC上做得花哨更重要。5. 通达OA二次开发避坑与常见问题5个让新手翻车的真实现场5.1 PHP版本与语法兼容新版PHP语法在OA里直接报错现象在本地用PHP 7.x甚至8.x写了一段很正常的代码比如用了??运算符或者list()的简写放到OA里跑页面直接白屏或显示500错误。原因通达OA的官方运行环境长期停留在PHP 5.x部分新版本开始支持PHP 7.x但老版本OA核心代码和新版PHP的兼容性很差你自己写的新代码也可能因为语法太新而无法在老版本PHP里解析。解决在开发环境里把PHP版本切到OA支持的版本通常在OA的“系统信息”页面能看到当前PHP版本数据字典里也会标注兼容版本号。写代码时尽量用老语法比如用mysql_fetch_array替代mysqli_fetch_arrayOA自带封装不要用新特性等确认OA环境支持再引入。5.2 编码混乱UTF-8与GBK字段的乱码现场现象从数据库里查出来的中文用户名显示为“???”或者写入数据后OA界面里看到的是一串乱码符号。原因通达OA的数据库连接字符集通常设置为GBK或UTF-8取决于版本。如果你的PHP页面文件是UTF-8编码但数据库连接用的是GBK查询结果就会乱码反过来也一样。解决写开发页面时先查OA的数据库配置文件确认字符集然后在页面头部统一设置编码。PHP里可以在连接数据库后执行一句SET NAMES utf8或SET NAMES gbk来统一连接字符集前提是数据库和页面的存储编码一致。做外部接口对接时传输JSON数据要明确约定编码格式接收方和发送方都用UTF-8能规避大半乱码问题。5.3 Session与登录态失效直接访问PHP页面提示未登录现象在浏览器里直接打开开发好的模块页面系统跳转到登录页或者提示“会话超时”。原因通达OA的PHP页面必须经过inc/auth.php初始化它通过读取Session来判断用户是否登录。如果你在页面里没有引入这个文件或者引入顺序不对Session尚未生效就执行了业务代码就会丢登录态。解决所有需要登录后才能访问的页面第一行必须是include_once(inc/auth.php)不要在引入之前输出任何HTML或空白字符。另外本地调试时如果直接用http://localhost/module/mydemo/访问而OA是通过IP或域名访问的Session Cookie的域名不同也会导致登录失败。建议用OA配置里的实际访问地址来调试。5.4 附件与上传目录权限功能部署后附件不可见现象开发了带附件上传的功能本地测试正常部署到服务器后用户上传的附件看不到、下载不了点击下载提示文件不存在。原因服务器的上传目录没有写权限或者附件路径配置和本地不一致。通达OA的附件默认存放在attachment目录下这个目录必须允许PHP进程写入如果服务器用Nginx通常还需要确认PHP-FPM的运行用户对目录有写权限。解决部署完成后手动给attachment目录及其子目录赋写权限并检查OA后台的附件配置路径。用命令行测试最直接在服务器上创建一个测试文件看看能否写入附件目录能写就说明权限到位不能写就去查目录属主和SELinux策略。5.5 数据缓存与菜单不生效改完配置没反应现象后台菜单里新增了菜单保存后前端看不到或者修改了某个PHP文件页面刷新后还是旧内容。原因菜单配置和模板文件被OA缓存了。通达OA为了性能会把菜单、语言包、一些通用配置缓存到磁盘或数据库中你修改的配置没有穿透缓存层。解决到系统管理中清理菜单缓存和系统缓存必要时重启Web服务。修改PHP文件不生效的另一种可能是PHP开启了Opcode缓存新代码不会被立即加载需要等缓存过期或手动清理。这个问题在开发环境和生产环境都可能遇到放平心态先清缓存再排查代码不要怀疑自己写错了。6. 把手册用到进阶工作流触发器的调试技巧与版本边界工作流后置动作是最难调试的一类二次开发因为它不像普通PHP页面那样直接在浏览器里看结果而是在流程流转的瞬间被触发的。我曾经被这种“黑匣子”式的触发机制卡了整整一个下午写了代码提交了流程节点结果就是不执行也没报错。后来我按照一条笨但管用的路径调试通了——先说结论这可能是整本手册之外最有价值的一条经验在触发脚本里加入日志写入用文件日志代替页面输出。?php // 调试工作流后置动作时先把执行过程写进文件 function writeDebugLog($msg) { $logFile D:/oa_debug/workflow_ . date(Ymd) . .log; $content [ . date(Y-m-d H:i:s) . ] . $msg . \n; file_put_contents($logFile, $content, FILE_APPEND); } writeDebugLog(后置动作开始执行); // 手动接收参数并记录 writeDebugLog(当前流程ID . $flowId . 表单ID . $formId); // 在这里执行你的业务逻辑 writeDebugLog(业务逻辑执行完成); ?这段代码的巧妙之处在于完全不依赖页面输出即使脚本在执行过程中报错只要前面的日志已经写入你就能判断“代码走到哪一步”。把writeDebugLog调用穿插在业务逻辑的关键位置跑一次流程看一次日志逐段缩小排查范围比瞪着眼睛读代码高效得多。等你确认逻辑没问题再把这几个调试日志删掉代码就可以交付了。调试只是进阶的一部分版本边界同样重要。通达OA会不定期发升级补丁你的二次开发代码如果大量依赖某个版本的内部类库升级后很可能不可用。所以维护二次开发代码时我会尽量避免直接修改OA核心目录文件而是把扩展模块都放在module目录下独立维护升级前检查变更说明确认影响后再做升级。这个习惯帮我躲过了好几次“升级后功能消失”的翻车事故。做完一个完整的二次开发项目后我最大的感受是手册只是地图真正的路还是要自己走。地图能帮你少走弯路但路上的坑比如PHP版本、编码问题、权限配置、缓存机制只有自己踩一遍才有深刻印象。希望这本手册能成为你开发路上趁手的工具也希望这篇笔记里的思路能帮你把手册里的知识变成能落地的功能少踩几个坑。希望帮到你。本文还有配套的精品资源点击获取