简介:这份PDF面向Tiptop ERP与Easyflow电子签核系统的实施人员与二次开发工程师,聚焦两系统在单据签核环节的对接问题。内容围绕Tiptop作业审核时将单据信息以XML抛转至Easyflow、签核结果再回写Tiptop的双向流程展开,涵盖环境配置、数据表签核字段确认、Schema更新、单据性质设置、抛转信息维护、PER与4GL档修改、AWS模块公共与抛转程序说明,以及集成测试与常见错误排查等环节,并附有集成示意图与操作界面说明。资源包共1个PDF文件,约1.94MB,适合作为实施前的流程参照与开发时的步骤清单。目前已有1515人学习下载,读者可据此理清集成脉络、对照检查配置项,减少联调阶段的反复试错。
1. 从一张工单卡在“送签中”说起:Tiptop 与 Easyflow 单据签核集成环境怎么搭
去年帮一家制造企业排查一个怪问题:工单在 Tiptop 里点了审核,界面提示“送签中”,可签核人的收件箱里死活刷不出这张单。查了半天,最后发现是.profile里EFSOAP那行地址还指着测试机的旧 IP,Appserver 重启后压根没读到新配置。这种坑在 tiptop oa 接口集成里太常见了——Tiptop 和 Easyflow 之间的单据签核,本质是 Tiptop 审核时把单据拼成 XML 字符串推给 Easyflow,签核人处理完再由 Easyflow 回调 Tiptop 的服务回写栏位。链路上一环没配好,单据就悬在半空。这篇笔记按我实际部署的顺序,把环境、数据表、抛转程序、Easyflow 表单、联调验证一路写下来,新手能照着走通,熟手能对照着看版本和参数取舍。
2. 环境与数据表准备:先把 Appserver 和 7 个签核栏位钉死
集成能不能跑起来,八成取决于这一步有没有做扎实。Tiptop 端和 Easyflow 端的交互全部走 Appserver,所以第一件事不是急着改程序,而是确认 Tiptop for Browser 版已经装好、startweb已经把 Appserver 拉起来了。我一般会先开一个终端跑ps看一眼进程,再确认.profile里的三个 Easyflow 相关变量,因为这三个值写错一个,后面所有抛转都是白费功夫。
2.1 确认 Appserver 与 .profile 里的三个地址
Tiptop 端通过 Appserver 与 Easyflow 通信,.profile里需要维护 Easyflow 服务器 IP、服务器名和 SOAP 接口位置。具体 IP 随服务器而异,下面是我在一套模拟环境里的写法:
# EasyFlow Server IP EFSITEIP=192.168.0.250; export EFSITEIP # EasyFlow Server Name EFSITENAME=EF2KWeb; export EFSITENAME # EasyFlow SOAP Location EFSOAP=http://192.168.0.250/EF2KGateWay/EF2KGateWay.WSDL; export EFSOAPEFSITEIP是 Easyflow 服务器的地址,EFSITENAME是服务器名,EFSOAP指向网关的 WSDL 描述文件。改完.profile必须重新登录或source一次,再重启 Appserver,否则进程读的还是旧值——前面那个“送签中”卡死的案例就是这么来的。另外要确认 Easyflow 服务器端已经装好 Tiptop&Easyflow 集成包,这个包没装,后面 ColumnSet.xml 和集成向导都无从谈起。
提示:改
.profile前先cp .profile .profile.bak,改错了能立刻回滚,这是我在生产机上养成的习惯。
2.2 检查数据表里的 7 个签核栏位
一张单据要走电子签核,它对应的数据表必须包含 7 个签核相关栏位。以请购单单头档pmk_file为例,对照表如下:
| 栏位 | 含义 | 是否关键 |
|---|---|---|
| pmkmksg | 是否签核 | 关键 |
| pmk25 | 签核状态 | 关键 |
| pmksign | 签核等级(多级签核用) | 非关键 |
| pmkdays | 签核完成天数 | 非关键 |
| pmkprit | 签核优先顺序 | 非关键 |
| pmksseq | 已签核顺序(系统维护) | 非关键 |
| pmksmax | 应签核顺序(系统维护) | 非关键 |
前两个是每支作业都必须维护的关键栏位,其中“签核状态”在各表里名字可能不同,比如出货单里叫ta_ogaefstat。后四个简单签核一般用不上,但检查时 7 个都要确认存在,缺的按客制规范补建。单身档通常不放签核栏位。签核状态的取值也要心里有数:0开立、1已核准、6结案、9作废、S送签中、R送签退回、W抽单,出现别的字符多半是作业内部特殊用途,比如2表示转采购单。
2.3 更新 schema 与单据性质设置
栏位确认完,跑r.s2 dsx更新 schema 资料,让系统认识这些栏位。接着进各子系统的单据性质设置作业,把要签核的单别勾上“是否签核”。制造模块看smy_file,销售子系统看oay_file,通用单据性质设置作业是asmi300。这里有个容易忽略的点:同一支作业可以按单别决定某张具体单据走不走签核,所以必须先选或新建一个“是否签核”为选中状态的单别,否则后面抛转程序生成了也白搭。我见过有人程序全改完,测试时单据死活不抛转,最后就是单别没勾。
3. 抛转程序与标准作业改造:aws 模块怎么配、4gl 怎么改
Tiptop 端的核心是 aws 模块。它和其他模块目录结构一样,4gl下分两类程序:一类是公共模块,把与 Easyflow 交互的底层操作封装成函数,比如aws_efcfg.4gl、aws_efsrv.4gl、aws_efcli.4gl、aws_efstat.4gl、aws_xml.4gl、aws_efgw.4gl、aws_eflog.4gl等;另一类是抛转模块,与各支作业一一对应,比如aws_aapt110.4gl对应aapt110.4gl,aws_asfi301.4gl对应asfi301.4gl,数量随需要签核的单据增减。
3.1 用 aws_efcfg 维护签核信息并生成范式程序
aws_efcfg是一支维护窗体,定义签核作业时用它维护 Tiptop 端单据的签核信息。操作顺序是:先在界面上把各个栏位设好,然后务必点按钮维护单头和单身栏位,最后点“产生范式程序”,系统会在aws/4gl目录下按设置预生成一支aws_xxx.4gl,你在这个基础上改,不用从零写。
单头栏位维护界面左边填要通过 XML 传递的单头档栏位,右边“参照字段”填需要从其他表 JOIN 过来替代原栏位的字段。典型场景是传客户信息时想传客户名称occ02而不是客户编码oga04:左边填oga04,参照字段填occ02,生成的程序组 SQL 时会自动 JOINocc_file,组 XML 时用occ02的值顶替oga04的位置。单身栏位维护界面和操作方式相同。
注意:界面上那个“传送栏位资讯”按钮会按 Tiptop 资料库设置完全重建 Easyflow 端的 Columnset.xml,但实际文件和数据表资料未必一致,我不建议用它自动更新,Columnset.xml 一律手工维护,后面 Easyflow 部分会讲。
3.2 抛转作业 aws_xxx.4gl 的结构与三种改法
抛转作业整个文件描述一个函数aws_efcli_cf(),各模块结构一致:声明一个 RECORDsr存中间信息,组一个l_sql从库里取抛转资料赋给sr,再循环按sr记录生成 XML 字符串。默认情况下sr、sql、xml三者完全一致,需要动的地方就三种:栏位不能直接从库里取、要先处理,就定义中间变量再赋给 XML;选取栏位和 XML 传递栏位数量有差异,某个不传或取不到;以及状态码要翻译成中文提示。下面这段是典型改法:
CASE WHEN sr.oga00='1' CALL cl_getmsg('aws-003',g_lang) RETURNING g_msg WHEN sr.oga00='2' CALL cl_getmsg('aws-004',g_lang) RETURNING g_msg WHEN sr.oga00='3' 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 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 10cl_getmsg按语言取提示信息,s_addr把地址拆成三段再拼回一个字符串,ASCII 10是换行符,保证 XML 可读。注意<oga04>里塞的是sr.occ02,这就是前面参照字段 JOIN 进来的客户名称。改完这段,XML 的栏位名必须和 Easyflow 端 Columnset.xml 完全对应,顺序可以不同,名字错一个就解析不出来。
3.3 标准作业里加 xxx_ef() 函数和审核分支
标准作业要加对抛转的支持,以出货单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' # 审核状态置为已审核 IF g_oga.ogaconf='X' THEN LET g_chr='Y' ELSE LET g_chr='N' END IF IF g_oga.ta_ogaefstat='1' OR g_oga.ta_ogaefstat='2' THEN LET g_chr2='Y' ELSE LET g_chr2='N' END IF IF g_oga.ta_ogaefstat='6' THEN LET g_chr3='Y' ELSE LET g_chr3='N' 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_success='N' END IF两个LET是手工维护的重点:签核状态设S(送签中),审核状态设Y(已审核)。cl_set_field_pic按状态设界面图标,确认未签核显示“确”,签核通过显示“核”。cs_ogasta是放在 CSUB 目录下的客制作业,把状态码翻成中文提示,比如S传出“送签中”。最后直接 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这里判断是否需要电子签核(ta_ogamksg)且当前未确认(ogaconf),符合就调xxx_ef()后直接 RETURN。这意味着单据一旦走签核,原有审核代码基本作废,审核只起送签作用。所以原审核段里的事务性操作要另想办法:把被屏蔽的代码拷贝成一个新函数(是拷贝不是移动),新增一个 Action 比如confirm_ef供用户在签核核准后执行,条件是ta_ogaefstat = '1';不走签核的单据仍走原审核代码,对程序影响最小。
3.4 收尾:per 档、p_perlang、p_link、p_ze 与编译
剩下几件收尾活别漏。改标准作业的 per 档增加签核栏位显示;有客制栏位就跑p_perlang维护栏位显示;在p_link里加对 aws 的链接,新增作业还要维护p_zz;在p_ze里维护程序新增的提示信息。另外要改所有涉及显示标志图片的地方,判别方法是定位所有cl_set_field_pic调用,按上面第一段的样子改。取消审核、作废这些事务性操作也要加签核状态判断:需要签核的不允许作废和取消审核,签核状态不为1的不能做事务性操作。最后加一个浏览签核状态的 Action,代码可以拷贝现成的:
FUNCTION i301_approval_status() IF g_aza.aza23 MATCHES '[ Nn]' THEN # 未设定与 EasyFlow 签核 CALL cl_err('aza23','mfg3551',0) RETURN END IF IF g_sfb.sfb01 IS NULL OR g_sfb.sfb01 = ' ' THEN # 尚未查询资料 CALL cl_err('', -400, 0) RETURN END IF IF g_sfb.ta_sfbefstat NOT MATCHES "[S1WR]" THEN RETURN END IF CALL aws_efstat(g_sfb.sfb01) END FUNCTION粗体位置按各支作业改:单据号码(这里是sfb01)和签核状态(ta_sfbefstat)。全部改完编译执行,Tiptop 端才算就绪。
4. Easyflow 端配置:表单目录、ColumnSet.xml 与审批流程
Tiptop 端把 XML 推过来,Easyflow 端得接得住。这一侧的工作量不比 Tiptop 小,顺序是:建表单目录、设计表单样式、建数据表、改 EF2Kweb.xml 和 ColumnSet.xml、开放单据、设审批流程、建表单关联。
4.1 复制表单目录并批量改名
Easyflow 存放表单信息的目录是Program Files\EF2Kweb\ASP\CHT\Forms。在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,把里面所有旧单号TT_SO1替换成TT_WO1。这一步用编辑器的全局替换最快,但替换完要逐个文件搜一遍旧单号,确认没有漏网的。
4.2 设计电子表单:控件 ID 命名规则别弄错
改Forms.ASP编辑表单外观,用网页编辑工具调整控件位置和布局,尽量和 Tiptop 表单一致。控件一般两种就够:多行文本框和选择框,日期用选择框,其余用文本框。关键是控件 ID 有两组:标签的按xxx_1命名(如sfb01_1),控件的按xxx_2命名(如sfb01_2),系统按栏位名从 XML 取数据再解析 ID 填充。这里弄错,表单上就是一片空白,而且不报错,排查起来很费劲。单身表格用 OCX 嵌入,不需要特别设置。
4.3 建数据表、改 EF2Kweb.xml 与 ColumnSet.xml
在 SQL Server 里以原有表单对应的数据表为基础复制一张新表,改对应栏位名,建议用导入导出。然后到EF2KwebPackages\tiptop目录改EF2Kweb.XML,复制现有单据项目的方式增加新单据 ID。再改同目录的ColumnSet.xml,增加 Program 段,内容必须和 Tiptop 端aws_xxx抛转模块的 XML 格式完全相同——栏位顺序不必一致,名称必须完全对应。
注意:XML 里必须抛转一个资料所有者
xxxuser栏位,它不显示在电子表单上,但 Easyflow 要靠它解析填单人、驱动流程。这个栏位漏了,流程走不起来,而且现象很隐蔽。
4.4 开放单据、设审批流程、建表单关联
进 Easyflow 左边“管理程序清单”→“流程基本数据”→“表单性质维护操作”,查询后点开对应表单,按界面设置各项。显示否、生效日失效日这几项要特别注意,没设或设错表单就显示不出来,永久生效可忽略失效日。设完还要滚到屏幕最下面新建权限文件,不设权限表单照样不显示。
审批流程走“电子表单模块”→“管理程序清单”→“自动向导”→“流程设定向导”,选表单新增一关审批并指定审批人,比如设为 439,Tiptop 抛过来的单据就直接进 439 的收件夹,审批完流程结束回写 Tiptop。最后建表单关联:同一路径下“易拓集成向导”,点“新增表单关联”,选 Tiptop 程序代号(向导会自动列出有抛转机制的作业)、工厂代号,下面会列出单据性质里勾了签核的单别,再选 Easyflow 对应表单代号,点“新增关联”。
5. 避坑排查:集成联调里最常见的 5 个翻车点
联调阶段的问题大多有规律,下面 5 条是我踩过或帮人救过的,按“现象 → 原因 → 解决”记下来。
现象一:点审核提示送签成功,签核人收件箱没有单据。原因通常是.profile里EFSOAP地址不对或 Appserver 没重启,进程读的还是旧配置;也可能是 Easyflow 端表单性质里“显示否”没设或权限文件没建。解决:先source .profile重启 Appserver,再核对表单性质和权限。
现象二:表单能打开,但栏位全是空的。多半是控件 ID 命名错了,标签没按xxx_1、控件没按xxx_2,或者 ColumnSet.xml 里栏位名和 Tiptop 抛转的 XML 对不上。解决:拿一条实际抛转的 XML 字符串逐栏位比对 ColumnSet.xml,再检查 Forms.ASP 里的 ID。
现象三:签核完 Tiptop 栏位没回写。检查 Easyflow 端是否装了 Tiptop&Easyflow 集成包,以及 Tiptop 提供的回写服务是否可达。另外xxxuser栏位没抛转也会导致流程解析不到填单人,回写链路断掉。
现象四:单据性质勾了签核,审核时却不走签核流程。常见是单别选错,或者数据表里 7 个栏位没建全,尤其“是否签核”和“签核状态”两个关键栏位缺失。解决:回数据表核对栏位,再进单据性质设置确认单别状态。
现象五:签核状态显示乱码或显示成数字。p_ze里提示信息没维护,或者cs_ogasta没按本作业状态码改。解决:补p_ze提示信息,核对cs_ogasta传入的状态值。
6. 装完怎么验证:从开单到回写的完整走查
环境搭完别急着交付,按一条完整链路走一遍才算数。我一般用asfi301工单作业做验证:新增一张工单,单别选勾了签核的那个,保存后确认审核状态为N、签核状态为0、提示“开立”;点“审核”,提示框选“是”,抛转成功会给出成功提示,此时签核状态应变成S(送签中)。
接着切到 Easyflow,用指定审批人登录,收件夹里应出现这张单,打开表单核对栏位值和 Tiptop 一致,尤其客户名称、地址这些经过 JOIN 和特殊拼装的栏位。执行核准后回 Tiptop 刷新,签核状态应为1,审核状态为Y,界面图标显示“核”。再试一次退回(R)和抽单(W),确认状态流转和提示信息都对。最后验证反向操作:需要签核的单据在未核准前点作废或取消审核,应该被拦住。
验证清单可以按这个表逐项打勾:
| 验证项 | 预期结果 |
|---|---|
| 开单保存 | 审核状态 N,签核状态 0,提示“开立” |
| 点审核抛转 | 签核状态变 S,提示送签成功 |
| Easyflow 收件箱 | 出现对应单据,栏位值与 Tiptop 一致 |
| 核准回写 | 签核状态 1,审核状态 Y,图标“核” |
| 退回/抽单 | 状态变 R/W,提示正确 |
| 未核准作废 | 被拦截,不允许操作 |
有一次我图省事,只测了核准没测退回,结果上线后签核人一退回,Tiptop 那边状态没刷新,单据卡在送签中出不来,又得临时补程序。从那以后我每次集成完都强制把核准、退回、抽单、作废拦截四条路径全走一遍,一条不落。希望这套走查清单能帮到你,少熬几个联调的夜。
本文还有配套的精品资源,点击获取