Tiptop与Easyflow单据签核集成:从抛转到回写全流程实战
简介面向 Tiptop ERP 与 Easyflow 电子签核系统对接实施人员的技术说明文档聚焦单据签核环节的双向集成Tiptop 作业审核时将待签核单据以 XML 抛转至 Easyflow 生成电子表单签核结果再回写 Tiptop。内容覆盖环境配置、数据表签核栏位确认、Schema 更新、单据性质设置、抛转信息维护与源文件修改、PER 与 4GL 程序调整、AWS 模块公共与抛转程序说明以及集成测试与常见错误排查适合具备一定 Tiptop 开发基础的工程师按步骤落地。资源包共 1 个 PDF 文件约 1.94MB以图文步骤与界面说明呈现完整集成流程。已有 1515 人学习可帮助读者理清对接思路、减少配置与数据格式类问题。1. 单据签核打通Tiptop 与 Easyflow 集成到底要解决什么一张工单在 Tiptop 里点下“审核”签核人却在另一个系统里收不到单或者签核人在 OA 里批完了Tiptop 这边的状态还停在“送签中”——这类单据签核断链是很多使用 Tiptop 的团队在推进电子签核时最先撞上的墙。这套方案要解决的正是这件事把 Tiptop 作业里的待签核单据以 XML 字符串送到 Easyflow在签核人收件箱里以电子表单呈现签核结果再通过 Tiptop 提供的服务回写栏位。适合正在做 Tiptop OA 接口对接的开发者、需要交付一份集成方案的顾问以及拿它当课程设计或毕设参考的学生。整套流程围绕“单据抛转—表单呈现—结果回写”三段展开下面按 Tiptop 端、Easyflow 端、联调验收逐层拆开。2. 总体设计两端职责与数据流向的划分2.1 集成边界与前置沟通动手写代码之前有一件事比任何配置都重要和 Easyflow 顾问把流程对齐。需要确认三件事——Easyflow 侧的大致审批流程、Tiptop 单据在 Easyflow 中的位置、以及 Tiptop 作业在 Easyflow 中对应的单据名称。比如工单作业在 Tiptop 中的单据编号是 TT_WO1这个编号会贯穿后续表单目录、数据表、XML 配置的命名。命名没对齐后面每一步都会返工这是血泪经验。从数据流看两端的分工很清晰。Tiptop 端负责“抛”作业执行审核时把单据信息组装成 XML 字符串通过 Appserver 发往 Easyflow。Easyflow 端负责“收与批”把 XML 解析进电子表单走审批流程签核完成后调用 Tiptop 提供的服务回写栏位。所以 Tiptop 端的工作量集中在数据表栏位、抛转程序、标准作业改造Easyflow 端集中在表单目录、数据表、配置文件和流程设定。两端通过 XML 的栏位名称严格对应任何一侧改名另一侧必须同步。2.2 Tiptop 端模块划分Tiptop 里有一个专门的 AWS 模块存放集成程序目录结构与其他模块一致4gl 目录下的程序分两类。公共模块以函数形式封装底层操作包括aws_efcfg.4gl签核信息维护窗体、aws_efsrv.4gl、aws_efcli.4gl、aws_efstat.4gl、aws_xml.4gl、aws_efgw.4gl等负责配置、服务调用、状态查询和 XML 组装。抛转模块则与各支作业一一对应比如aws_asfi301.4gl对应 asfi301 工单作业aws_aapt110.4gl对应请购作业数量随需要签核的单据数量增长。这种划分的好处是公共逻辑只写一次。新增一张单据要签核只需要用aws_efcfg维护栏位、生成一支新的aws_xxx.4gl抛转程序再改对应的标准作业公共模块完全不用动。我一般会先把公共模块的接口签名过一遍确认aws_efcli的入参顺序再动手生成抛转程序避免生成出来的代码和实际调用对不上。2.3 Easyflow 端模块划分Easyflow 端围绕“表单”组织。表单文件放在Program Files\EF2Kweb\ASP\CHT\Forms下每张单据一个目录目录内是若干 ASP 文件表单数据存在 SQL Server 里每张表单一张数据表配置文件EF2Kweb.XML和ColumnSet.xml负责把表单 ID 和 XML 栏位映射起来流程设定向导负责配审批关卡和审批人易拓集成向导负责建立 Tiptop 程序代号与 Easyflow 表单代号的关联。这五块各管一段缺一块表单就显示不出来或者流程走不通。3. Tiptop 端落地从环境配置到标准作业改造3.1 环境设置与数据表栏位确认两端交互走 Appserver所以第一步是确认 Tiptop for Browser 版已安装并且已运行startweb启动 Appserver。接着改.profile把 Easyflow 相关的地址写进去# 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 服务器地址、服务器名和 SOAP 网关的 WSDL 位置IP 随实际服务器不同而变。同时要确认 Easyflow 服务器端已安装 TiptopEasyflow 集成包没装这个包后面的调用全部无从谈起。数据表这一关最容易漏。一张单据要签核其单头档必须包含 7 个签核相关栏位以请购单单头档 pmk_file 为例pmkmksg是否签核、pmk25签核状态这两个是每支作业都必须维护的关键栏位pmksign签核等级、pmkdays签核完成天数、pmkprit签核优先顺序、pmksseq已签核顺序、pmksmax应签核顺序这四个是非关键栏位简单签核可以不维护。检查时 7 个栏位要逐一确认存在缺的按客制规范补建。单身档一般不包含签核栏位。签核状态的取值要记牢0 开立、1 已核准、6 结案、9 作废、S 送签中、R 送签退回、W 抽单出现其他字符通常是作业内部特殊用途。3.2 单据性质与抛转程序生成同一支单据作业靠单据性质决定某张具体单据是否走电子签核。在各子系统的单据性质设置作业里都有“是否签核”选项以通用单据性质设置作业 asmi300 为例先选或新建“是否签核”为选中状态的单据别否则后续操作全部无效。这里有个坑单据性质档随子系统不同而不同制造模块用 smy_file销售子系统用 oay_file设置前一定要进具体子系统确认准确的资料表名和栏位名。抛转程序用aws_efcfg生成。这个维护窗体里先设界面栏位再维护单头和单身栏位。单头栏位维护时左边填要经 XML 传递的栏位右边“参照字段”填需要 JOIN 其他表来替换的字段——比如传客户信息通常传客户名称 occ02 而不是客户编码 oga04就在字段填 oga04、参照字段填 occ02生成的程序会自动 JOIN occ_file 表并用 occ02 的值替换 oga04 的位置。单身栏位操作相同。维护完点“产生范式程序”在 aws/4gl 目录下生成aws_xxx.4gl再在其基础上改。生成的抛转程序结构固定声明 RECORD sr 存中间信息组 l_sql 取数赋值到 sr循环按 sr 记录拼 XML 字符串。默认情况下 sr、sql、xml 三者一致需要改的情况有两类栏位不能直接从库里取、需要中间处理或者选取栏位与 XML 传递栏位数量有差异。下面这段是典型改法CASE WHEN sr.oga001 CALL cl_getmsg(aws-003,g_lang) RETURNING g_msg WHEN sr.oga002 CALL cl_getmsg(aws-004,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 CLIPPED LET g_strXMLInput g_strXMLInput CLIPPED, oga00, l_oga00 CLIPPED, /oga00, ASCII 10, oga04, sr.occ02 CLIPPED, /oga04, ASCII 10, addr, sr.addr CLIPPED, /addr, ASCII 10, /head, ASCII 10, body, ASCII 10代码里cl_getmsg把代码值翻成中文描述再进 XMLs_addr把地址拆成省市区拼接XML 合成语句里用中间变量l_oga00、sr.occ02、sr.addr替代原始栏位。注意ASCII 10是换行符每个栏位一行方便排查时肉眼比对。改完记得 XML 里的栏位名必须和 Easyflow 端 ColumnSet.xml 完全对应顺序可以不同名称不能错。3.3 标准作业改造与审核流程分流标准作业要增加对抛转的支持以 axmt620 出货单为例核心是新增一个xxx_ef()函数调用抛转函数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 # 审核状态置为已审核 IF g_oga.ogaconfX THEN LET g_chrY ELSE LET g_chrN END IF IF g_oga.ta_ogaefstat1 OR g_oga.ta_ogaefstat2 THEN LET g_chr2Y ELSE LET g_chr2N END IF IF g_oga.ta_ogaefstat6 THEN LET g_chr3Y ELSE LET g_chr3N END IF 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_successN END IF两个 LET 是手工维护的关键签核状态置 S送签中审核状态置 Y已审核。cl_set_field_pic按状态设界面图标确认未签核显示“确”签核通过显示“核”。cs_ogasta是客制作业放 CSUB 目录把状态码翻成中文提示如“送签中”。最后直接 UPDATE 并 COMMIT。更关键的是改原有审核函数在完成所有判断但未开始事务性操作的位置插入分流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这段的含义是需要签核且当前未确认时调xxx_ef()送签后直接 RETURN原审核代码不再往下走。也就是说需要电子签核的单据原审核操作退化成“送签”动作。原审核段里的事务性操作不能丢建议把被屏蔽的部分拷贝成新函数是拷贝不是移动新增一个 Action 比如confirm_ef只在签核完成且核准ta_ogaefstat1时允许执行不走签核的单据仍走原审核代码对程序影响最小。此外还要改“取消审核”“作废”等代码增加签核状态判断需签核的不允许作废和取消审核签核状态不为 1 的不能做事务性操作。改造时建议仿照一支标准签核作业apmt420 请购单作业是很好的参照。3.4 界面档与链接维护界面层要改 per 档增加签核栏位显示有客制栏位还要跑p_perlang维护栏位显示。p_link里增加对 aws 的链接新增作业还要维护p_zzp_ze里维护新增的提示信息。最后编译执行。这几步琐碎但漏一步就报错我一般按清单逐项打勾编译前再核对一遍 per 档和 4gl 档的栏位名是否一致。4. Easyflow 端落地表单、数据表与流程配置4.1 表单目录生成与样式设计在 Forms 目录下拷贝任一已有 Tiptop 单据目录为新目录名比如把 TT_SO1 复制为 TT_WO1。进入目录后把其中所有文件名按新单号改掉再进三个 Init 结尾的 ASP 文件TT_WO1_Approve_Init.ASP、TT_WO1_Create_Init.ASP、TT_WO1_Display_Init.ASP以及 Grid.ASP把里面所有旧单号替换成新单号。这一步是纯体力活但漏改一个文件表单加载就会报错。样式设计改 Forms.ASP建议用网页编辑工具操作。主要两件事一是调控件位置布局使之美观且与 Tiptop 表单尽量一致一般用多行文本框和选择框两种控件日期用选择框其余用文本框二是调控件 ID这里有两组 ID标签的命名规则是xxx_1如 sfb01_1控件的命名规则是xxx_2如 sfb01_2系统按 ID 从 XML 取栏位名和数据填充弄错就填不上值。单身表格用 OCX 嵌入不需要特别设置。4.2 数据表与配置文件在 SQL Server 里以原表单数据表为基础复制生成新表改对应栏位名建议用导入导出方法。然后改EF2KwebPackages\tiptop目录下的EF2Kweb.XML增加新单据 ID复制现有单据项目改即可。再改同目录的ColumnSet.xml增加 Program 段填充 XML 档内容格式必须与 Tiptop 端aws_xxx抛转模块的 XML 完全一致。栏位顺序不必相同名称必须完全对应。提示XML 里必须抛转一个资料所有者xxxuser栏位它不显示在电子表单上但 Easyflow 要靠它解析填单人、驱动流程。这个栏位漏了流程就找不到发起人。4.3 表单开放与审批流程设定开放新增单据走“管理程序清单 → 流程基本数据 → 表单性质维护操作”。查询后点相应表单在表单性质里按规范设置各项特别注意“显示否”和生效日、失效日没设或设错表单就显示不出来永久生效可忽略失效日。设完还要配权限属性否则表单依然不显示方法是将屏幕滚到最下面点新建权限文件保存退出后左侧清单就能看到新表单。审批流程走“电子表单模块 → 管理程序清单 → 自动向导 → 流程设定向导”选表单后新增审批关卡并设审批人比如设为 439从 Tiptop 抛来的单据就直接进 439 的收件夹439 批完流程结束回写 Tiptop。最后建立表单关联走“自动向导 → 易拓集成向导”点“新增表单关联”选 Tiptop 程序代号系统自动列出有抛转机制的作业、工厂代号选完自动列出已设签核的单据类别、Easyflow 表单代号点“新增关联”完成。5. 避坑与排查集成联调中最容易翻车的五处5.1 单据性质没选“是否签核”现象是点审核后毫无反应既不报错也不送签。原因是单据别在单据性质设置里没勾“是否签核”后续所有配置都成了摆设。解决方法是回到对应子系统的单据性质设置作业确认该单别“是否签核”为选中状态再重新测试。5.2 ColumnSet.xml 与抛转 XML 栏位名不一致现象是表单能打开但栏位空白或者流程找不到填单人。原因是 ColumnSet.xml 里的栏位名和aws_xxx.4gl拼出的 XML 标签对不上顺序不同没关系名称必须一字不差。解决方法是拿实际抛出的 XML 字符串和 ColumnSet.xml 逐项比对重点检查xxxuser是否抛转。5.3 表单显示否或权限没配现象是 Easyflow 左侧清单里看不到新表单。原因是表单性质里“显示否”设错或生效日失效日设置不当或权限属性没建。解决方法是逐项核对表单性质滚到页面底部确认权限文件已新建永久生效的把失效日留空。5.4 控件 ID 命名错位现象是表单上某些栏位显示成空白或串值。原因是标签 ID 应为xxx_1、控件 ID 应为xxx_2写反或写错系统就解析不到。解决方法是逐个核对 Forms.ASP 里的两组 ID与 XML 栏位名一一对应。5.5 审核流程分流后原事务操作丢失现象是签核通过后单据状态对了但原本审核时该做的库存、账务动作没执行。原因是改造审核函数时直接 RETURN把原事务性代码屏蔽了却没补回来。解决方法是将被屏蔽代码拷贝成新函数新增confirm_efAction限定签核核准后才允许执行不走签核的单据仍走原逻辑。6. 验收与答辩怎么证明这套集成真的跑通了验收这套集成我一般按一条完整链路走一遍而不是只看某个界面。第一步在 Tiptop 工单作业 asfi301 新增一张工单单别选需要签核的保存后确认审核状态为 N、签核状态为 0、提示“开立”。第二步点“审核”提示框选“是”观察是否弹出抛转成功提示同时去数据库确认签核状态已变 S、审核状态变 Y。第三步登录 Easyflow 对应审批人账号确认收件箱里出现该单据的电子表单且单头单身栏位值与 Tiptop 一致尤其核对参照字段替换后的客户名称、拼接后的地址。第四步在 Easyflow 完成签核回到 Tiptop 刷新确认签核状态回写为 1、界面图标变“核”再执行confirm_ef验证事务性操作正常。第五步反向测试对需签核单据点“作废”或“取消审核”应被拦截对签核状态非 1 的单据做事务操作也应被拦截。答辩时最容易被问的是“为什么改审核流程而不是加个按钮”。回答要点是电子签核的本质是把审核动作拆成送签和确认两段原审核代码若继续自动执行等于绕过了签核所以必须分流而原事务逻辑用拷贝成新函数的方式保留既保证签核场景下不丢功能又不影响不走签核的单据。把这条讲清楚比演示十个界面都有说服力。下面这张表可以当验收清单用验收项预期结果失败时先查工单保存审核状态 N、签核状态 0单据性质是否签核点审核送签状态变 S/Y提示成功Appserver、.profile 地址Easyflow 收件箱表单出现且栏位有值ColumnSet.xml、控件 ID签核回写状态变 1图标变“核”回写服务、栏位名对应事务操作confirm_ef 正常执行分流代码是否 RETURN 过早作废/取消审核需签核单据被拦截状态判断是否补全从那以后我每次做这类集成都会先把这张验收表打印出来每过一项打个勾全部勾完才敢说“能交付”。联调阶段最怕的就是只看界面不看数据表界面显示对了、库里状态没变这种假通过到上线才爆。希望这套流程和清单能帮到你少走几趟返工的弯路。本文还有配套的精品资源点击获取