资讯详情 Tiptop与OA接口集成:从单据签核到Easyflow流程的完整链路
📅 2026/10/24 21:40:17
简介一份面向 Tiptop 实施顾问与 ERP/OA 集成开发人员的 PDF 技术文档聚焦 Tiptop 与 Easyflow 的单据签核集成场景。文档从环境准备、数据表检查、Schema 更新、单据性质设置、抛转信息维护到 4GL/PER 修改、AWS 链接配置梳理了 12 个关键集成步骤同时详解 AWS 公共模块与抛转模块的职责并给出集成测试及常见错误列表可作为新单据接入 Easyflow 签核流程的实操参考。资源为单个 PDF 文件大小约 1.94MB内容包含 XML 数据交互、SOAP 服务回写、栏位映射等关键说明已有 1515 人学习使用。对于需要完成类似单据签核对接的读者可从中获取环境配置方法、抛转作业源文件修改思路和 AWS 模块调用要点减少集成试错成本。1. Tiptop 与 OA 接口单据签核不是开一个开关就完事在某制造业 ERP 项目上线冲刺阶段操作员在生产订单作业点了“审核”订单状态纹丝不动OA 端收件箱也始终是空的。实施顾问查了一下午最后发现是数据表少了签核状态字段连“送签中”的 S 状态都写不进去。这个小场景基本代表了 Tiptop 与 OA 接口的真实形态它不是 ERP 里开一个“是否签核”开关就结束的配置项而是一条从 Tiptop 数据表、抛转作业、XML 生成到 Easyflow 表单、存储、流程、回写状态的完整链路。下面这份集成文档拆自 Tiptop 与 Easyflow 的新单据集成体例适合正在做 ERP 单据电子签核、二次开发或实施交付的人。按这条链路走新单据接入的每一步都有据可查。2. Tiptop 端改动签核栏位、AWS 抛转模块与 XML 生成的三层准备2.1 环境配置文件 .profile三个变量决定通信地址做 ERP 接口的人都有体会业务不顺的时候先查环境。Tiptop 和 Easyflow 的交互走的是 AppserverTiptop for Browser 版装好之后必须确认 startweb 已经把 Appserver 拉起来。这一步不满足后面做的抛转作业、表单关联都不会触发。确认 Appserver 存活后改 Tiptop 账号根目录下的 .profile。里面有一组 Easyflow 相关的环境变量核心是三个缺一不可EFSITEIP、EFSITENAME、EFSOAP。我一般会先在浏览器里打开 EFSOAP 地址能出现 WSDL 描述页再往下走这一步能排除一半的“抛转无响应”玄学问题。#EasyFlow Server IP EFSITEIP192.168.0.250; export EFSITEIP #EasyFlow Server Name EFSITENAMEEF2KWeb; export EFSITENAME #EasyFlow SOAP Location EFSOAPhttp://192.168.0.250/EF2KGateWay/EF2KGateWay.WSDL; export EFSOAP三个变量分别指向 Easyflow 服务器的 IP、站点名和 SOAP 网关地址具体值要跟实际服务器配置一致。IP 是内网地址WSDL 路径不能写错大小写。另一个容易漏的点是 Easyflow 服务器上必须安装过 TiptopEasyflow 集成包这个包没装Tiptop 调服务时连网关都找不到日志里只会报连接失败。环境准备完成后再进数据库层顺序不要乱。2.2 数据库七个栏位没有这七个字段后面全是坑接下来检查作业对应的数据表确认签核相关栏位是否齐全。这里不要凭记忆直接用数据库工具看表结构。以请购单单头档 pmk_file 为例需要的是七个栏位作用是否关键pmkmksg是否签核关键pmk25签核状态关键pmksign签核等级多级签核使用pmkdays签核完成天数非关键pmkprit签核优先顺序非关键pmksseq已签核顺序非关键pmksmax应签核顺序非关键这里有个很实际的坑前两个栏位每支作业都必须维护后四个非关键栏位在简单签核场景下可能用不到但表里仍要有。缺了任何一个aws 抛转作业组 SQL 时就会报错。单身档通常不含签核字段别去单身表里找这七个。创建缺失字段时按客制规范来写命名不要乱编。签核状态取值也要记牢0 开立1 已核准6 结案9 作废S 送签中R 送签退回W 抽单。如果出现其他字符一般是作业内部特殊选项比如 2 表示转采购单。判断一张单据走到哪一步看的就是这个字段的值。2.3 aws_efcfg 维护单头、单身与参照字段的选择逻辑Tiptop 里有一个专门做集成的 aws 模块目录结构与普通模块一样。4gl 目录下的程序分两类一类是公共模块以函数形式封装了与 Easyflow 集成所需的底层操作和服务包括 aws_efcfg、aws_efsrv、aws_efcli、aws_efstat、aws_xml、aws_efgw 等另一类是抛转模块与各支作业一一对应比如 aws_aapt110.4gl 对应 aapt110 请购作业aws_asfi301.4gl 对应 asfi301 工单作业数量跟需要签核的单据数一致。做新单据集成时先确认是否存在对应的 aws_xxx.4gl不存在就等 aws_efcfg 生成。aws_efcfg 是这个环节的入口它是一个维护窗体。操作顺序是先在界面上维护单据基本信息然后点按钮维护单头和单身栏位。单头界面左边输入要通过 XML 传递的单头表字段右边参照字段用来做 JOIN 替换。举例客户信息通常要传客户名称 occ02而不是客户编码 oga04。做法是左边填 oga04参照字段填 occ02生成抛转程序时自动 JOIN occ_file组 XML 时用 occ02 的值替代 oga04 的位置。单身栏位的维护逻辑相同界面操作方式也一样。维护完成后点“产生范式程序”aws/4gl 目录下会自动生成一支 aws_xxx.4gl预生成好框架代码在此基础改而不是从零写。界面上的“传送栏位资讯”按钮能把单头单身栏位自动生成 Easyflow 端的 Columnset.xml 文件但实际项目里我不建议用它会完全按 Tiptop 数据库设置重建文件而文件与实际数据表很难保证完全一致容易把原有表单配置覆盖坏Columnset.xml 宁可手工维护。这个小节很多人会踩先记住结论。2.4 抛转作业 aws_xxx.4glsr、SQL、XML 的对应与改写自动生成的 aws_xxx.4gl 描述了一个函数 aws_efcli_cf()各模块结构一致先声明一个 RECORD sr 存中间信息再组一条 SQL 取出抛转资料并赋值到 sr然后循环按 sr 记录拼 XML 字符串。默认情况下 sr、SQL、XML 三者保持一致但实际项目经常要改典型场景有两类一是字段需要加工后才能传原 SQL 取出的值不能直接放进 XML先定义中间变量转换再把中间变量写进 XML二是字段数量有差异某个栏位不需要传给 Easyflow或数据库取不到某个栏位这时 sr 与 XML 的对应关系就要拆开。下面这段是抛转作业里常见的加工逻辑客户状态码要转成文字提示地址栏位要把三行拼成一段。CASE WHEN sr.oga00 1 THEN CALL cl_getmsg(aws-003, g_lang) RETURNING g_msg WHEN sr.oga00 2 THEN CALL cl_getmsg(aws-004, g_lang) RETURNING g_msg WHEN sr.oga00 3 THEN CALL cl_getmsg(aws-005, g_lang) RETURNING g_msg END CASE LET l_oga00 g_msg CALL s_addr(sr.oga01, sr.oga04, sr.oga044) RETURNING l_oap.oap041, l_oap.oap042, l_oap.oap043 LET sr.addr l_oap.oap041 CLIPPED, , l_oap.oap042 CLIPPED, , l_oap.oap043 CLIPPEDl_oga00 是中间变量cl_getmsg 按代码取多语言消息s_addr 把地址栏位拼成一段文本然后回填 sr.addr。这种改动在 XML 组装段能看到对应位置。LET g_strXMLInput g_strXMLInput CLIPPED, oga00, l_oga00 CLIPPED, /oga00, ASCII 10, oaydesc, sr.oaydesc CLIPPED, /oaydesc, ASCII 10, oga04, sr.occ02 CLIPPED, /oga04, ASCII 10, oga08, l_oga08 CLIPPED, /oga08, ASCII 10, oga24, l_oga24 CLIPPED, /oga24, ASCII 10, addr, sr.addr CLIPPED, /addr, ASCII 10, /head, ASCII 10CLIPPED 去掉首尾空格ASCII 10 输出换行保证 XML 有可读结构。这里能看到前面为什么要用中间变量l_oga00 是转换后的文字sr.occ02 是参照字段替换后的客户名称sr.addr 是拼好的完整地址。改完这段要对照 Easyflow 端 ColumnSet.xml 的字段名逐一检查名字对不上回写必然失败。记住一个原则XML 栏位顺序可以与 Tiptop 抛转的字符串不完全相同但名称必须完全对应。2.5 标准作业 4GL 与 PER 档加函数、拦审核、补图标抛转作业只是服务端标准作业也要改否则审核按钮不会触发抛转。以 axmt620 出货单作业为例需要增加一个 xxx_ef() 函数核心代码可以直接从同类签核作业比如请购单 apmt420拷贝同名函数再按单据修改参数。下面是函数核心部分IF aws_efcli(l_title, g_oga.oga01[1,3], g_oga.oga01, , , , , ) THEN LET g_success Y LET g_oga.ta_ogaefstat S LET g_oga.ogaconf Y CALL cl_set_field_pic(g_oga.ogaconf, g_chr2, g_oga.ogapost, g_chr3, g_chr, ) DISPLAY BY NAME g_oga.ta_ogaefstat, g_oga.ogaconf CALL cs_ogasta(oga, g_oga.ta_ogaefstat, g_oga.ogaconf, g_oga.ta_ogamksg) RETURNING g_sta DISPLAY g_sta TO FORMONLY.desc2 UPDATE oga_file SET ta_ogaefstat g_oga.ta_ogaefstat, ogaconf g_oga.ogaconf WHERE oga01 g_oga.oga01 COMMIT WORK ELSE LET g_success N END IFaws_efcli 是公共模块中负责实际发送和接收的调用传界面单据信息成功就把 g_success 置 Y签核状态设成 S 送签中审核状态设成 Y 已审核。cl_set_field_pic 根据状态设置界面图标一个“确”一个“核”cs_ogasta 生成中文状态提示S 返回“送签中”。只有抛转成功的分支才更新数据表并提交。然后改原有审核函数在最关键的位置插拦截逻辑在完成所有判断但未开始事务性更新之前。IF g_success Y THEN IF g_oga.ta_ogamksg Y AND g_oga.ogaconf N THEN CALL t600_ef() IF g_success N THEN ROLLBACK WORK END IF RETURN END IF END IF这里判断单据需要签核且审核状态未确认时调用新函数把单据送签然后 RETURN不再执行原审核代码。这是会明显改变用户操作流程的改动原审核代码被绕过。最稳的做法是把原审核代码复制一份放到新 Action比如 confirm_ef里供签核完成后的确认操作使用而不是直接删掉。送签退回的单据要再走一次确认靠的就是这个动作。配套改动还包括PER 档增加签核状态栏位显示有客制栏位时运行 p_perlang 维护显示p_link 增加对 aws 的链接新增作业还要维护 p_zzp_ze 维护新增提示信息取消审核、作废和相关事务性操作都要增加签核状态判断需要签核且未核准的单据不允许作废。改作业时最省力的路径是仿照 apmt420 请购单作业它是一支标准的签核作业函数、Action、图标显示都能直接参照。3. Easyflow 端落地表单目录、ColumnSet 与流程关联的四个关键环节3.1 复制表单目录与批量改名TT_SO1 到 TT_WO1 的套路Tiptop 端准备完进入 Easyflow 端。Easyflow 的表单信息放在安装目录下的 ASP\CHT\Forms。新单据表单不要从零建找一个已有的 Tiptop 单据目录整份复制。比如把 TT_SO1 复制成 TT_WO1然后进入新目录把所有文件名里的 TT_SO1 替换成 TT_WO1。实际操作按三步走一是打开 3 个 Init 结尾的 ASP 文件TT_WO1_Approve_Init.ASP、TT_WO1_Create_Init.ASP、TT_WO1_Display_Init.ASP和 Grid.ASP二是做全局替换把字符串“TT_SO1”替换为“TT_WO1”三是核对表单文件名与单据代号是否完全一致大小写也不能含糊。常见做法是先用系统复制命令整目录复制再用文本编辑器做批量替换。注意不要漏掉 Grid.ASP单身表格靠它渲染漏了会出现表单打开后单身区域空白或直接报错。3.2 Forms.ASP 控件布局id 命名的两条规则不能乱表单外观在 Forms.ASP 里维护。建议使用可视化网页编辑工具操作但真正的关键不是美观是控件 ID。一组标签、一组控件两条命名规则必须遵守标签的 ID 命名规则是栏位名加 _1例如 sfb01_1控件的 ID 命名规则是栏位名加 _2例如 sfb01_2。Easyflow 解析 XML 时按栏位名自动匹配把数据填充到对应 _2 控件里。这两组 ID 千万不能弄反。弄反了标签控件拿到值、输入控件拿到空值表单在收件箱里打开就是一片空白。一般控件用多行文本框日期用选择框其他统一文本框。单身表格采用 OCX 嵌入方式不需要单独维护控件 ID数据表定义对了TT_WO1_Grid.ASP 会自动按 ColumnSet 渲染。布局调整时尽量与 Tiptop 表单字段顺序接近签核人打开表单找对应信息会快很多。3.3 SQL Server 数据表与 ColumnSet.xml与抛转 XML 完全对应Easyflow 端数据存在 SQL Server。以原有表单名对应的数据表为基础复制生成新表再修改栏位名称。我在项目里的做法是直接用 SQL Server 的导入导出功能复制表结构和少量测试数据然后按新单据字段重命名省去手工建表的时间。接下来改两个文件都在 EF2Kweb\Packages\tiptop 目录下。第一个是 EF2Kweb.XML增加新单据 ID复制一个现有单据项目改第二个是 ColumnSet.xml增加 Program 段里面填写的 XML 内容必须与 Tiptop 抛转作业 aws_xxx.4gl 输出的 XML 字段完全对应。检查点要求字段名称与 aws_xxx.4gl 中的 XML 标签一致字段顺序可不同但名称必须完全对应资料所有者必须抛转 xxxuser 栏位栏位类型日期用选择框文本用文本框xxxuser 这条是血泪经验它不显示在电子表单上但 Easyflow 需要用它解析填单人并启动流程。漏了这个字段单据抛转成功但流程起不来或者收件人永远是错的。ColumnSet.xml 我建议手工维护不要用 aws_efcfg 里的“传送栏位资讯”按钮自动生成原因前面说过自动重建会拿数据库结构覆盖现有文件改动范围不可控容易把其他表单一起搞坏。3.4 表单开放、审批流程与集成向导的最后三步文件配好后再回 Easyflow 界面。路径是电子表单模块 → 管理程序清单 → 流程基本数据 → 表单性质维护操作。查询到新表单后进入表单性质设置重点看两项显示否要设成 N生效日不要漏设如果表单永久生效失效日留空即可。这两项没设对表单在权限树里根本不会出现。然后滚动到表单最下方新建权限文件并给相关人员授权不加权限表单依旧无法显示。完成保存后左侧清单里就能看到新增的表单。接着设置审批流程电子表单模块 → 管理程序清单 → 自动向导 → 流程设定向导选择刚建的表单新增一关审批并设置审批人。审批人设置后从 Tiptop 抛转过来的单据会进入该审批人的收件箱该审批人完成后流程结束回写 Tiptop。最后建立表单关联自动向导 → 易拓集成向导 → 新增表单关联。选择 Tiptop 程序代号系统会自动列出有抛转机制的所有作业代号再选工厂代号之后会自动列出该作业下已在单据性质设置中勾选需签核的单据类别最后选对应的 Easyflow 表单代号新增关联。到这一步Tiptop 的单据类别和 Easyflow 表单才在逻辑上对接起来。前面任何一环漏了审核时都不会有反应。4. 集成测试与排查状态回写失败、表单不显示的五个高频坑4.1 测试路径从开立到送签中的完整走单配置完成后的验证路径建议按顺序走一遍确认每个状态点。以工单作业 asfi301 为例新增一张工单单别选在单据性质设置中已勾选签核的单别保存后检查审核状态为 N签核状态为 0提示信息“开立”。点审核按钮提示是否确认选是。抛转成功后界面会显示送签状态。测试状态流转顺序整理下来就是签核状态 0 开立点审核后签核状态 S 送签中审批人在 Easyflow 收件箱看到表单核准后 Tiptop 签核状态变 1若流程退签状态 R 送签退回单据作废后状态 9。我一般会用两套环境做测试一套配置干净的测试库一套跟正式一致的环境用干净库能避免历史脏数据掩盖问题。抛转成功的信息会给出单据号和 XML 摘要确认这些信息里没有空字段再进 Easyflow 查表单。4.2 五个高频问题现象、原因、解决问题一Easyflow 左侧表单清单里看不到新表单现象Tiptop 端审核已提示抛转成功但 Easyflow 管理界面左侧找不到新单据表单。原因最常在表单性质维护时没正确设“显示否”或生效日也可能是没有新建权限文件并授权。解决进入表单性质维护操作确认“显示否”为 N生效日设为当天或更早表单若永久生效失效日留空。保存后再到表单最下方新建权限文件并勾选授权范围。权限树有时有缓存退出管理程序重新登录一次再看。问题二单据抛转成功但审批人收件箱为空现象Tiptop 审核后提示抛转成功指定的审批人收件箱里没有表单。原因多数是 ColumnSet.xml 里漏了 xxxuser 栏位或者易拓集成向导里表单关联未建立还有一种情况是表单关联里选了错误的工厂或单别。解决先打开 ColumnSet.xml 检查 Program 段是否包含 xxxuser 字段再到易拓集成向导确认新增关联里 Tiptop 程序代号、工厂代号、单据类别、Easyflow 表单代号四项全部对应。关联错了Easyflow 接收后分发不到正确填单人。问题三Easyflow 签核完成后 Tiptop 状态不更新现象审批人在 Easyflow 核准流程显示已结束但 Tiptop 作业里签核状态仍是 S。原因回写链路断了。常见是 EFSOAP 地址不通或 WSDL 路径错误也可能是 Tiptop 端 Appserver 未启动还有情况是 XML 字段名与 ColumnSet.xml 不完全一致回写时找不到目标栏位。解决先在浏览器打开的确认 EFSOAP 地址可达再确认 .profile 中 EFSITEIP、EFSITENAME、EFSOAP 三个变量与实际环境匹配最后对比 aws_xxx.4gl 拼出的 XML 字段和 ColumnSet.xml 字段逐一对齐不要只看个数名字差一个字符都会回写失败。问题四客户名称显示出客户编码现象Easyflow 表单上客户栏位显示的是代码不是名称。原因Tiptop 抛转作业组 XML 时没有按参照字段处理直接把 oga04 客户编码传过去了。解决回到 aws_efcfg在单头栏位维护里左边填 oga04参照字段填 occ02重新生成 aws_xxx.4gl 并编译。如果项目里不想重新生成也可以直接改抛转作业的 SQL把客户资料表 JOIN 进来再用 occ02 替代 oga04 的值。参照字段替换在单据集成里是常用操作不止客户栏位供应商、品名、仓库名称都可以这样处理。问题五审核后原审核代码不执行现象单据走了 Easyflow 签核但原来审核时该做的业务处理没有执行比如库存没更新、相关记录没生成。原因审核函数里插入拦截代码后一旦需要签核就直接 RETURN跳过了原有事务逻辑。解决不要把原有审核代码移动到被拦截的位置。正确做法是把原有审核代码复制一份到新 Action如 confirm_ef在签核状态为核准 1 时才允许执行不走签核流程的单据仍走原审核代码。这样两条路径都保留退回的单据也能重新走确认动作对程序本身影响最小。5. 一个实用技巧把抛转 XML 抓下来等于拿到了排错的后悔药前面几条链路走完最后说一个排错技巧抛转的 XML 怎么抓。很多集成问题到最后双方扯皮Tiptop 说发了Easyflow 说没收到最后发现是字段名对不上或者多了一个空白字符。所以我在做新单据集成时习惯先在 aws_efcli_cf() 函数里临时加一段日志代码把生成的 XML 写到应用服务器的一个文本文件里。# 临时调试用上线前删除 CALL cl_write_log(/tmp/aws_send_ || sr.oga01 || .xml, g_strXMLInput)把 g_strXMLInput 完整写盘然后拿文件内容跟 ColumnSet.xml 做一个纯文本对比。字段名、大小写、顺序有没有问题一眼就能看出来。生产环境不需要保留这段日志正式上线前删掉避免日志文件堆积。如果项目用的 Tiptop 版本已经提供 aws_eflog.4gl也可以直接调用它来写日志不必自己造轮子。抓 XML 不是只做一次单据字段只要有增删就要重新抓一次对比。我的习惯是每次改完 aws_xxx.4gl编译后先跑一笔测试单把 XML 落盘再跟 ColumnSet.xml 逐字段核对核对完才交给 Easyflow 顾问联调。从第一次做 Tiptop 与 OA 接口被字段字符折腾到半夜之后我每次集成新单据都强制走一遍这个动作省下来的排查时间远超写日志那几行代码的功夫。希望帮到你。本文还有配套的精品资源点击获取