2026/11/2 19:35:34

Tiptop与Easyflow系统集成:XML+SOAP+状态机协同实战指南

Tiptop与Easyflow系统集成:XML+SOAP+状态机协同实战指南 简介本资源是一份面向企业级ERP与OA系统集成工程师的Tiptop与Easyflow单据电子签核专项技术指南聚焦制造业、供应链等场景中审批流程自动化落地的核心难点。文档系统梳理了从环境配置、数据表校验、Schema更新、AWS模块开发含公共服务与作业级抛转程序到集成测试的12个关键实施步骤并详解aws_efcfg等核心4GL文件作用及XML数据编组逻辑附有典型单据如TT_AO1、axmt620的端到端交互示意图与配置样例。资源为单个PDF文件大小1.94MB内容结构清晰涵盖概述、Tiptop/Easyflow双端配置、常见错误排查等完整章节。目前已有1517人学习下载适合具备Tiptop二次开发基础、需快速掌握跨系统单据签核集成方案的中高级实施顾问与系统集成开发者。1. Tiptop 与 Easyflow 集成不是“配个 URL 就能跑”的接口调用这是两套企业级系统在单据生命周期关键节点上的状态协同本质是「XML 抛转 SOAP 回写 状态机对齐」的闭环工程你可能刚接到任务“把 Tiptop 的工单、请购单、出货单接进 OA 审批流”第一反应是查文档、找 API、配 token——但现实会立刻给你一记重击Tiptop 没有 RESTful 接口Easyflow 不认 JSON双方不共享数据库连时间戳格式都不同。这不是两个微服务之间的 HTTP 调用而是一场横跨 4GL 编程、SQL Server 表结构、ASP 表单渲染、SOAP WSDL 解析和状态码语义对齐的系统级缝合手术。核心矛盾在于Tiptop 的「审核」动作在业务上要拆解为「送签S→ 审核中W/R→ 核准1→ 结案6」四阶段而 Easyflow 的审批流程只认「待办 → 处理中 → 已通过/已驳回」Tiptop 的ogaconfY和 Easyflow 的statusApproved必须严格映射否则单据就卡在黑匣子里。这份《TiptopEasyflow集成说明_新单据集成样例.pdf》不是操作手册而是给一线工程师的「状态同步作战地图」它告诉你在哪张表加字段、在哪段 4GL 里插CALL aws_efcli()、在哪份 XML 里埋xxxuser填单人、又在哪份 ASP 里改TT_WO1为TT_AO1。适合谁正在维护 Tiptop 制造/销售模块的 4GL 开发者、负责 OA 流程落地的实施顾问、以及被老板问“为什么工单送不出去”的系统管理员——如果你还在用 Postman 测 Tiptop 接口建议先合上电脑读完本篇再动手。2. Tiptop 端集成从环境变量到 4GL 函数每一步都在为 XML 抛转铺路2.1 Appserver 启动与.profile环境变量配置通信链路的物理层必须通Tiptop 与 Easyflow 的交互不走浏览器直连而是依赖 Tiptop for Browser 的后台 Appserver 进程作为代理。若startweb未运行所有aws_efcli()调用都会静默失败日志里只留一行Connection refused。更隐蔽的是环境变量配置——它不像 Web 应用的.env文件可热加载而是需要修改用户级 shell 配置并重启 Appserver 才生效# 编辑 $TIPTOP_HOME/.profile注意不是 /etc/profile也不是 root 用户的 profile # 在文件末尾追加以下三行IP 和端口按实际 Easyflow 服务器调整 EFSITEIP192.168.0.250; export EFSITEIP EFSITENAMEEF2KWeb; export EFSITENAME EFSOAPhttp://192.168.0.250/EF2KGateWay/EF2KGateWay.WSDL; export EFSOAP提示EFSOAP的 URL 必须精确匹配 Easyflow 服务器上部署的 WSDL 地址包括大小写和路径斜杠。曾有项目因EF2KGateWay.WSDL写成ef2kgateway.wsdl导致 SOAP 调用始终返回404 Not Found排查耗时两天。验证方法在 Tiptop 服务器上执行curl -I $EFSOAP应返回HTTP/1.1 200 OK。配置完成后必须执行以下操作使变更生效退出当前 Tiptop 会话exit或关闭终端重新登录 Tiptop确认环境变量已加载echo $EFSITEIP重启 Appserverstopweb startweb检查 Appserver 日志$TIPTOP_HOME/log/appserver.log确认无Failed to resolve host类错误2.2 数据表签核字段校验7 个栏位是状态同步的契约基础缺一不可Tiptop 单据能否进入签核流程不取决于作业代码而取决于其底层数据表是否具备状态跟踪能力。以采购请购单pmk_file为例必须存在以下 7 个字段名称可变但语义必须一致字段名是否关键作用典型取值注意事项pmkmksg✅ 关键是否启用电子签核Y/N必须为字符型长度 ≥1Y表示该单据走签核流pmk25✅ 关键当前签核状态S/1/6/9名称在各表中不同如oga_file中为ta_ogaefstat需统一映射pmksign⚠️ 非关键多级签核等级1/2/3简单单级签核可不填但字段必须存在pmkdays⚠️ 非关键签核完成天数数值用于统计不影响流程pmkprit⚠️ 非关键签核优先级H/M/L控制收件箱排序pmksseq⚠️ 非关键已签核顺序数值系统自动维护无需手动赋值pmksmax⚠️ 非关键应签核顺序数值系统自动维护无需手动赋值校验脚本SQL在 Tiptop 数据库中执行快速定位缺失字段的表-- 替换 pmk_file 为你的目标表名 SELECT column_name, data_type, character_maximum_length AS len FROM information_schema.columns WHERE table_name pmk_file AND column_name IN (pmkmksg, pmk25, pmksign, pmkdays, pmkprit, pmksseq, pmksmax) ORDER BY column_name;若结果行数 7则需用p_sql工具或 DBA 权限执行ALTER TABLE添加缺失字段。血泪经验某制造模块新增工单sfb_file时漏加sfb25签核状态导致所有工单送签后 Easyflow 收不到数据日志显示NULL pointer exception——因为aws_efcli()内部逻辑强制读取该字段空值直接崩溃。2.3aws_efcfg维护单头/单身栏位映射是 XML 生成的源头活水aws_efcfg是整个集成的配置中枢它决定哪些数据库字段会被拼进 XML、如何 JOIN 关联表、以及字段在 XML 中的标签名。其界面分为三部分单头栏位、单身栏位、程序生成。最易翻车的环节在“参照字段”设置场景oga_file销售订单主表中客户编码为oga04但 Easyflow 表单要求显示客户名称occ02来自occ_file表错误做法在单头栏位列表中直接填occ02——aws_efcli()会报错Table occ_file not found in SQL正确做法在“字段”列输入oga04在“参照字段”列输入occ02在“关联表”列输入occ_file在“关联条件”列输入oga04 occ04这样aws_xxx.4gl自动生成的 SQL 会包含LEFT JOIN occ_file ON oga_file.oga04 occ_file.occ04XML 中oga04标签的值自动替换为occ02的内容。关键参数说明字段数据库表中的原始字段名必填参照字段若需从关联表取值则填关联表字段名若直接取原字段值则留空关联表JOIN 的目标表名仅当参照字段非空时必填关联条件ON 子句条件如oga04 occ04注意字段前缀注意aws_efcfg中设置的字段名必须与后续aws_xxx.4gl中sr.xxx变量名、以及 EasyflowColumnSet.xml中column namexxx完全一致大小写敏感。曾有项目因oga04在配置中写成OGA04导致 XML 生成OGA04而 Easyflow 只认oga04单据在收件箱显示为空白。2.4aws_xxx.4gl抛转作业定制XML 拼接不是字符串累加而是状态驱动的数据编织aws_xxx.4gl的核心函数aws_efcli_cf()结构固定但 XML 内容需根据业务逻辑深度定制。默认生成的代码仅做字段直传而真实场景需处理三类典型转换① 码值翻译Code Translation销售订单状态oga00在数据库存1/2/3但 Easyflow 要求中文新单/已确认/已出货-- 原始字段sr.oga00 1 -- 需转换为l_oga00 新单 CASE WHEN sr.oga00 1 THEN LET l_oga00 新单 WHEN sr.oga00 2 THEN LET l_oga00 已确认 WHEN sr.oga00 3 THEN LET l_oga00 已出货 ELSE LET l_oga00 未知 END CASE② 地址拼接Address Composition客户地址分散在oga01(省)、oga02(市)、oga03(区)、oga04(详细地址)需合成单字段-- 调用内置地址处理函数假设存在 CALL s_addr(sr.oga01, sr.oga02, sr.oga03, sr.oga04) RETURNING l_addr1, l_addr2, l_addr3, l_addr4 LET sr.full_addr l_addr1 CLIPPED, , l_addr2 CLIPPED, , l_addr3 CLIPPED, , l_addr4 CLIPPED③ 复合字段构造Composite Field出货单中oga24仓库、oga211库位、oga212批次、oga213数量需合并为stock_infoLET l_stock_info sr.oga24 CLIPPED, , sr.oga211 CLIPPED, %, sr.oga212 CLIPPED, , sr.oga213 CLIPPED -- 后续 XML 拼接中使用 stock_info, l_stock_info CLIPPED, /stock_info, ASCII 10XML 拼接规范所有字段值必须用CLIPPED去除尾部空格避免 Easyflow 解析失败每行 XML 标签缩进 5 个空格 tag符合 Easyflow 解析器预期必须包含xxxuser字段如ogauseradmin/ogauserEasyflow 用此字段识别填单人并启动流程2.5 标准作业改造xxx_ef()函数是状态跃迁的开关不是可有可无的装饰在标准作业如axmt620出货单中xxx_ef()函数是整个签核流程的入口和状态控制器。它不只调用aws_efcli()更要完成三重职责状态预置 → 界面反馈 → 数据落库。以下是精简后的核心逻辑FUNCTION axmt620_ef() -- 1. 状态预置将单据标记为送签中 LET g_oga.ta_ogaefstat S -- 签核状态设为 S LET g_oga.ogaconf Y -- 审核状态设为 Y表示已触发送签 -- 2. 调用抛转传入单据标题、单号等关键信息 IF aws_efcli(l_title, g_oga.oga01[1,3], g_oga.oga01, , , , , ) THEN -- 3. 成功分支更新界面图标 提示 数据库 CALL cl_set_field_pic(g_oga.ogaconf, Y, g_oga.ogapost, N, N, ) -- 参数含义审核状态, 是否已核准, 邮寄状态, 是否结案, 是否作废, 空 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 -- 强制落库立即更新数据库确保 Easyflow 回写时有最新状态 UPDATE oga_file SET ta_ogaefstat g_oga.ta_ogaefstat, ogaconf g_oga.ogaconf WHERE oga01 g_oga.oga01 COMMIT WORK LET g_success Y ELSE -- 4. 失败分支回滚并提示 ROLLBACK WORK LET g_success N CALL cl_err(aws-999, 送签失败请检查网络及配置, 0) END IF END FUNCTION关键参数说明aws_efcli()第二参数g_oga.oga01[1,3]取单号前 3 位作为 Easyflow 表单 ID 前缀如SO1必须与ColumnSet.xml中program idSO1一致cl_set_field_pic()的第五参数N表示“是否作废”此处为N因送签中单据不可作废cs_ogasta()是客制函数需确保其能正确解析ta_ogaefstatS并返回送签中避坑 / 常见问题 / 排查现象 1点击“审核”按钮后无任何提示单据状态仍为N未审核原因xxx_ef()函数未在标准作业的per文件中注册为 Action或p_link中未添加 AWS 模块链接解决检查p_link确认aws模块已加入在per文件中添加ACTION ef_send CALL axmt620_ef现象 2Easyflow 收件箱出现单据但所有字段为空白原因aws_xxx.4gl中 XML 拼接时字段名大小写与ColumnSet.xml不一致或xxxuser字段未包含解决用curl抓取aws_efcli()发出的 XML需开启调试日志比对字段名确认ogauser存在且值非空现象 3单据送签成功但 Easyflow 审批后Tiptop 中ta_ogaefstat未更新为1原因Easyflow 回写调用的 Tiptop 服务如aws_efsrv.4gl未正确配置或p_ze中缺少对应错误码提示解决检查aws_efsrv.4gl的update_status()函数确认其 SQL 更新了正确表和字段在p_ze中添加aws-101: 状态更新成功现象 4同一张单据多次点击“审核”Easyflow 收到多份重复单据原因xxx_ef()中未做幂等性校验每次调用都生成新 XML解决在函数开头添加校验IF g_oga.ta_ogaefstat MATCHES [S1WR] THEN RETURN END IF仅当状态为0开立时才执行送签现象 5aws_efcli()返回TRUE但 Easyflow 日志显示Invalid XML format原因XML 中包含非法字符如,,未进行 HTML 实体转义解决在拼接前对字段值做转义LET l_val REPLACE(REPLACE(REPLACE(sr.oga01, , amp;), , lt;), , gt;)3. Easyflow 端集成从 ASP 表单到 SQL Server 表XML 是唯一真相3.1 Forms 目录克隆与 ASP 文件批量替换命名一致性是表单渲染的生命线Easyflow 的表单文件全部存放在Program Files\EF2Kweb\ASP\CHT\Forms\下每个单据一个子目录。严禁手动新建文件必须通过克隆现有单据目录实现# Windows CMD 示例将 TT_SO1 复制为 TT_AO1 xcopy C:\Program Files\EF2Kweb\ASP\CHT\Forms\TT_SO1 C:\Program Files\EF2Kweb\ASP\CHT\Forms\TT_AO1 /E /I克隆后需在4 个关键 ASP 文件中全局替换旧单据 ID文件名需替换内容替换为说明TT_SO1_Approve_Init.ASPTT_SO1TT_AO1审批初始化逻辑TT_SO1_Create_Init.ASPTT_SO1TT_AO1创建初始化逻辑TT_SO1_Display_Init.ASPTT_SO1TT_AO1查看初始化逻辑TT_SO1_Grid.ASPTT_SO1TT_AO1单身表格渲染逻辑验证要点打开TT_AO1_Create_Init.ASP搜索TT_AO1确认出现次数 ≥ 10 次覆盖变量名、函数名、URL 参数检查TT_AO1_Grid.ASP中GridID属性是否为TT_AO1_Grid致命错误若遗漏TT_AO1_Grid.ASP中的替换单身表格将无法加载页面显示空白3.2Forms.ASP表单设计控件 ID 命名规则是 XML 数据绑定的唯一契约Forms.ASP是表单的 HTML 骨架其控件 ID 必须严格遵循xxx_y规则否则 Easyflow 无法将 XML 数据注入对应位置标签控件 IDxxx_1如oga01_1显示字段名称如“客户编号”输入控件 IDxxx_2如oga01_2接收 XML 中oga01的值标准控件选择指南字段类型推荐控件ID 示例注意事项文本/数字input typetextoga01_2所有非日期字段均用此日期select下拉框oga10_2Easyflow 自动将YYYY-MM-DD解析为下拉选项单选/多选input typeradio/checkboxoga00_2XML 中值需与选项value完全匹配关键代码片段Forms.ASP!-- 客户编号标签 -- span idoga01_1客户编号/span !-- 客户编号输入框 -- input typetext idoga01_2 nameoga01 readonly !-- 订单日期标签 -- span idoga10_1订单日期/span !-- 订单日期下拉框Easyflow 自动填充 -- select idoga10_2 nameoga10/select !-- 审核状态标签只读由 Easyflow 根据 XML 设置 -- span idta_ogaefstat_1签核状态/span !-- 审核状态显示框 -- input typetext idta_ogaefstat_2 nameta_ogaefstat readonly提示input的name属性必须与 XML 字段名一致如nameoga01对应oga01id属性必须为xxx_2格式。Easyflow 渲染引擎会扫描所有idxxx_2的控件并从 XML 中查找同名标签赋值。3.3 SQL Server 表结构同步ColumnSet.xml是 XML 与数据库的双向翻译器Easyflow 不直接读 Tiptop 数据库而是将 XML 解析后存入自己的 SQL Server 表。因此必须创建与 XML 结构完全对应的表并配置ColumnSet.xml建立映射。步骤 1创建新表以TT_AO1为例-- 基于现有表如 TT_SO1创建 SELECT * INTO TT_AO1 FROM TT_SO1 WHERE 10 -- 添加必要字段必须包含 xxxuser ALTER TABLE TT_AO1 ADD ogauser VARCHAR(20) NOT NULL DEFAULT system -- 修改字段长度以匹配 XML如 oga01 原为 CHAR(10)XML 中可能达 20 位 ALTER TABLE TT_AO1 ALTER COLUMN oga01 VARCHAR(20)步骤 2配置ColumnSet.xml该文件位于EF2KwebPackages\tiptop\需在columnsets节点内添加columnset idTT_AO1 program idTT_AO1 / table nameTT_AO1 / column nameoga01 dbfieldoga01 typestring length20 / column nameoga02 dbfieldoga02 typestring length50 / column nameoga10 dbfieldoga10 typedate / column nameta_ogaefstat dbfieldta_ogaefstat typestring length2 / column nameogauser dbfieldogauser typestring length20 / !-- 其他字段... -- /columnset参数说明nameXML 中的字段名如oga01必须与aws_xxx.4gl中拼接的标签名完全一致dbfieldSQL Server 表中的字段名如oga01type数据类型string/date/number影响 Easyflow 解析逻辑length字符串长度必须 ≥ XML 中该字段最大长度否则截断注意ColumnSet.xml修改后必须重启 EF2Kweb 服务net stop EF2Kweb net start EF2Kweb否则更改不生效。3.4EF2Kweb.xml注册与表单权限开放没有这两步表单永远是灰色的EF2Kweb.xml是 Easyflow 的路由总线所有新单据必须在此注册才能被系统识别!-- 文件EF2KwebPackages\tiptop\EF2Kweb.xml -- package nametiptop form idTT_AO1 name销售订单审批 pathForms\TT_AO1\TT_AO1_Create_Init.ASP createtrue approvetrue displaytrue / /package关键属性id必须与ColumnSet.xml中columnset id一致pathASP 初始化文件的相对路径从ASP\CHT\开始create/approve/display控制表单在哪些场景可见创建/审批/查看表单权限开放步骤登录 Easyflow 管理后台 → “管理程序清单” → “流程基本数据” → “表单性质维护操作”查询TT_AO1点击进入编辑设置关键字段显示否勾选 ✔️否则左侧菜单不显示生效日设为今日或更早如2023-01-01失效日留空或设为远期如2099-12-31滚动到底部 → “新建权限文件” → 选择角色如审批员→ 勾选TT_AO1→ 保存验证以审批员身份登录 Easyflow左侧菜单应出现“销售订单审批”点击可进入。3.5 审批流程与表单关联易拓集成向导是打通 Tiptop 与 Easyflow 的最后一公里即使 Tiptop 能发 XML、Easyflow 能收 XML若未建立“哪支 Tiptop 作业 → 哪张 Easyflow 表单”的映射数据依然无法路由。步骤 1启动“易拓集成向导”Easyflow 管理后台 → “电子表单模块” → “管理程序清单” → “自动向导” → “易拓集成向导”步骤 2配置关联关系字段值说明Tiptop 程序代号asfi301从下拉列表选择Easyflow 自动扫描aws/4gl目录下的aws_asfi301.4glTiptop 工厂代号001选择工厂下方单据类别列表将动态刷新单据类别AO1从列表中选择已在 Tiptopasmi300中设置为“需签核”的类别Easyflow 表单代号TT_AO1选择已注册的表单 ID步骤 3验证关联在 Tiptop 中打开asfi301工单作业新建一张单别为AO1的工单点击“审核”观察 Easyflow 审批员收件箱是否出现TT_AO1表单若未出现检查EF2Kweb.log搜索TT_AO1常见错误No form mapping found for [asfi301][AO1]→ 易拓向导未保存关联User [439] not found in database→ 审批人 ID439在 Easyflow 用户表中不存在4. 集成测试全流程从单据开立到状态回写用真实数据验证每一个状态跃迁4.1 测试用例设计覆盖 4 个核心状态节点拒绝“能发就能用”的幻觉集成测试不是点一次“审核”看是否弹窗而是模拟完整业务流验证每个状态码的准确性。以销售订单oga_file为例设计如下测试用例用例编号操作步骤预期 Tiptop 状态预期 Easyflow 状态验证方式TC-01新建AO1单据 → 保存ogaconfN,ta_ogaefstat0无单据查询oga_file表TC-02点击“审核” → 确认ogaconfY,ta_ogaefstatSTT_AO1表单出现在审批人收件箱Easyflow 前台查看TC-03审批人登录 → 点击“核准”ogaconfY,ta_ogaefstat1表单状态变为“已通过”查询oga_file表 Easyflow 日志TC-04审批人登录 → 点击“驳回”ogaconfY,ta_ogaefstatR表单状态变为“已驳回”查询oga_file表 Easyflow 日志执行要点每个用例执行前清空 EasyflowTT_AO1表TRUNCATE TABLE TT_AO1避免历史数据干扰使用p_sql工具实时查询oga_file确认字段值更新及时性非缓存在 Easyflow 服务器上监控EF2Kweb.log搜索关键词TT_AO1,SUCCESS,ERROR4.2 日志分析法EF2Kweb.log与appserver.log是排错的黄金组合当测试失败时切忌盲目修改代码。先看日志它们会直接告诉你问题在哪一层EF2Kweb.log典型错误模式2023-10-05 14:22:31,123 ERROR [Thread-5] com.ef2k.service.XmlParser - Parse error at line 12: Element oga01 is not closed # 原因Tiptop 发来的 XML 格式错误缺少 /oga01 闭合标签 # 解决检查 aws_xxx.4gl 中 XML 拼接确认所有标签成对 2023-10-05 14:23:05,456 WARN [Thread-7] com.ef2k.dao.FormDao - Insert failed for TT_AO1: Column ogauser cannot be null # 原因XML 中缺失 ogauser 字段或值为空 # 解决在 aws_xxx.4gl 中强制赋值 LET sr.ogauser systemappserver.log典型错误模式[ERROR] aws_efcli.4gl:123 - SOAP call to http://192.168.0.250/EF2KGateWay/EF2KGateWay.WSDL failed: Connection timed out # 原因Tiptop 服务器无法访问 Easyflow IP检查防火墙或网络策略 # 解决在 Tiptop 服务器执行 telnet 192.168.0.250 80 [WARN] aws_efsrv.4gl:89 - Update status for oga01SO1001 failed: No rows affected # 原因Easyflow 回写时Tiptop 中该单据已被删除或单号不匹配 # 解决检查 aws_efsrv.4gl 中 UPDATE 语句的 WHERE 条件日志开启方法EF2Kweb.log修改EF2Kweb\config\log4j.properties将log4j.rootLogger设为DEBUGappserver.log在$TIPTOP_HOME/config/appserver.cfg中设置LOG_LEVEL34.3 状态码语义对齐表Tiptop 与 Easyflow 的“语言翻译官”双方状态码不一致是集成失败的隐形杀手。必须制作一张权威对照表贴在开发机旁Tiptopta_ogaefstatEasyflow 状态业务含义是否可操作0Draft单据开立未送签可取消、可作废SPending Approval已送签等待审批不可取消、不可作废1Approved已核准流程结束可执行后续业务如出货6Closed已结案只读9Cancelled已作废只读RRejected已驳回可重新送签WWithdrawn已抽单可重新送签强制规则本文还有配套的精品资源点击获取