简介:本资源是一份面向企业级ERP与OA系统集成工程师的实战技术文档,聚焦Tiptop与Easyflow在单据电子签核场景下的深度对接方案。文档系统梳理了从环境配置、数据表校验、Schema更新、AWS模块开发(含公共服务与作业级抛转程序)、XML数据编组到双向状态回写等12个关键实施步骤,并详解AWS模块中aws_efcfg、aws_efsrv等核心4GL组件及aws_aapt110等业务作业的协同逻辑,附有集成示意图与常见错误排查提示。资源为单文件PDF,大小1.94MB,内容结构完整,涵盖概述、Tiptop/Easyflow双端配置、测试要点及模块目录说明,便于快速定位开发规范与调试依据。目前已有1517人学习下载,适合具备Tiptop二次开发经验、熟悉SOAP/XML交互及OA流程引擎的技术人员用于项目落地参考与集成问题攻坚。
1. 这不是“接个API”就能跑通的OA集成:Tiptop与Easyflow单据签核落地,本质是两套企业级系统在事务生命周期上的深度耦合
很多人拿到「Tiptop对接OA」这个需求时,第一反应是:“不就是调个HTTP接口、传个JSON?”——结果在第3天就被卡死在.profile环境变量里,第5天发现aws_efcli()返回空字符串却查不到日志,第7天对着ColumnSet.xml和aws_xxx.4gl里27个字段的XML拼接顺序反复比对,怀疑人生。这不是接口调用问题,而是两个强事务、多状态、带业务规则引擎的老牌ERP(Tiptop)与BPM(Easyflow)系统,在「单据审核」这一关键业务节点上,必须实现状态同步、权限映射、数据保真、异常回滚、人机协同五重严苛对齐。本方案不讲抽象架构图,只呈现某制造企业真实落地的12步Tiptop侧改造清单、7类Easyflow端配置陷阱、3轮集成测试必验项,以及我带过的3个同类项目中,92%新人首次翻车的5个血泪节点。适合正在做Tiptop-OA集成毕设/课设的同学,也适用于接手遗留系统的实施工程师——它不是理论手册,而是一份可逐行执行、带错误定位路径、含验收Checklist的交付物说明书。
2. Tiptop端集成设计:从环境准备到作业级签核支持的12步闭环
Tiptop端不是被动发包方,而是整个签核流程的发起者、状态维护者与事务协调者。其改造不是零散打补丁,而是一套覆盖环境层、数据层、逻辑层、界面层的完整闭环。下面按实际交付顺序展开,每一步都标注了为什么必须做、不做会怎样、验证方式是什么。
2.1 环境层:Appserver启动与.profile硬编码配置是所有通信的前提
Tiptop与Easyflow的交互完全依赖Appserver作为中间代理。很多同学跳过这步直接写4GL,结果aws_efsrv.4gl里CALL soap_call(...)永远超时——因为根本没走通网络通道。
首先确认Appserver已启动:
# 登录Tiptop服务器,检查进程 ps -ef | grep startweb # 正常应看到类似输出 tiptop 12345 1 0 10:23 ? 00:00:01 /opt/tiptop/bin/startweb -d提示:
startweb必须以tiptop用户身份运行,且不能在screen或tmux中后台挂起后断开SSH,否则Appserver会随终端退出而终止。
接着修改$TIPTOP_HOME/.profile(注意:不是/etc/profile,也不是用户家目录下的.profile):
# 在文件末尾追加(IP、端口、服务名需按实际Easyflow部署调整) # EasyFlow Server IP EFSITEIP=192.168.0.250; export EFSITEIP # EasyFlow Server Name(必须与EF2Kweb.xml中<ServerName>一致) EFSITENAME=EF2KWeb; export EFSITENAME # EasyFlow SOAP Gateway WSDL地址(注意路径大小写、.WSDL后缀不可省略) EFSOAP=http://192.168.0.250/EF2KGateWay/EF2KGateWay.WSDL; export EFSOAP # 强制重载环境(避免重启终端) source $TIPTOP_HOME/.profile验证是否生效:
# 检查环境变量 echo $EFSITEIP $EFSITENAME $EFSOAP # 应输出:192.168.0.250 EF2KWeb http://192.168.0.250/EF2KGateWay/EF2KGateWay.WSDL # 测试网络连通性(关键!) curl -I http://192.168.0.250/EF2KGateWay/EF2KGateWay.WSDL 2>/dev/null | head -1 # 正常返回:HTTP/1.1 200 OK设计说明:
EFSITEIP用于底层socket连接,EFSITENAME用于SOAP Header中的<tns:ServerName>字段,EFSOAP是WSDL元数据地址,三者缺一不可;- WSDL地址必须能被Tiptop服务器直接访问(禁用localhost/127.0.0.1),且路径中
EF2KGateWay为固定上下文根,不可自定义; - 若
curl返回Connection refused或timeout,90%是Easyflow GateWay服务未启动,需登录Easyflow服务器执行netstat -tuln | grep :80确认端口监听状态。
2.2 数据层:7个签核字段的强制存在性校验与语义对齐
Tiptop将单据是否进入签核流程、当前处于哪个环节,全部编码在数据库字段中。这些字段不是可选配置,而是AWS模块读取状态、生成XML、控制UI显示的唯一依据。
以请购单(pmk_file)为例,必须存在的7个字段及其业务含义:
| 字段名 | 类型 | 必填 | 说明 | 典型值示例 |
|---|---|---|---|---|
pmkmksg | CHAR(1) | ✓ | 是否启用电子签核(开关字段) | 'Y'(启用)、'N'(不启用) |
pmk25 | CHAR(1) | ✓ | 签核主状态(核心状态机) | '0'(开立),'S'(送签中),'1'(已核准),'6'(结案),'9'(作废),'R'(送签退回),'W'(抽单) |
pmksign | CHAR(2) | ✗ | 多级签核等级(如A/B/C级) | 'A','B1','C2' |
pmkdays | INTEGER | ✗ | 签核完成耗时(天) | 3,0 |
pmkprit | CHAR(1) | ✗ | 签核优先级(影响收件箱排序) | 'H'(高),'M'(中),'L'(低) |
pmksseq | INTEGER | ✗ | 已签核顺序(系统自动维护) | 1,2 |
pmksmax | INTEGER | ✗ | 应签核总顺序(系统自动维护) | 2,3 |
验证脚本(SQL):
-- 检查pmk_file表是否存在全部7字段(替换为你实际的单据表名) SELECT CASE WHEN COUNT(*) = 7 THEN 'PASS' ELSE 'FAIL' END AS check_result, LIST(colname, ', ') AS missing_fields FROM systables t, syscolumns c WHERE t.tabname = 'pmk_file' AND t.tabid = c.tabid AND c.colname IN ('pmkmksg','pmk25','pmksign','pmkdays','pmkprit','pmksseq','pmksmax'); -- 若返回FAIL,需用dbaccess执行ADD COLUMN语句(严格遵循客制规范)关键设计点:
pmkmksg和pmk25是绝对关键字段,缺失则aws_efcli()直接返回false,且无任何错误日志;pmk25的取值必须严格限定在文档定义的字符集内(0,S,1,6,9,R,W),若业务需要扩展(如'2'表示转采购),必须同步修改aws_efstat.4gl中的状态解析逻辑;- 单身表(如
pmd_file)通常不需添加这些字段,所有状态由单头表统一管理,这是Tiptop签核模型的设计约束。
2.3 逻辑层:AWS模块的双轨结构与aws_efcfg配置驱动机制
AWS(Application Workflow Service)模块是Tiptop侧集成的中枢。它不是一堆独立脚本,而是分为公共能力层与作业适配层的双轨结构,通过aws_efcfg作业实现配置驱动,避免硬编码。
公共能力层(aws/4gl/下核心文件)
| 文件名 | 作用 | 调用关系 | 注意事项 |
|---|---|---|---|
aws_efcfg.4gl | 签核配置维护窗体(GUI) | 手动执行,配置单据级参数 | 必须先运行此作业才能生成抛转程序 |
aws_efsrv.4gl | 封装SOAP调用,对接Easyflow Gateway | 被aws_efcli()调用 | 内部有重试机制(默认3次),超时时间在aws_efgw.inc中定义 |
aws_efcli.4gl | 抛转入口函数,生成XML并调用aws_efsrv | 被标准作业(如axmt620)调用 | 函数名固定为aws_efcli_cf(),参数顺序不可变 |
aws_xml.4gl | XML生成工具,含xml_start_tag(),xml_add_field()等 | 被aws_xxx.4gl调用 | 支持CDATA包裹、特殊字符转义(如&→&) |
aws_efgw.inc | 全局常量定义(超时、重试、命名空间) | 被多个.4gl包含 | 修改前务必备份,编译失败常因此处语法错误 |
作业适配层(aws/4gl/下aws_*.4gl文件)
每个需签核的Tiptop作业(如asfi301工单)对应一个aws_asfi301.4gl,其结构高度模板化:
-- aws_asfi301.4gl 核心结构(自动生成+人工修改) FUNCTION aws_efcli_cf( p_title STRING, -- 单据标题(如"工单TT_WO1") p_key1 STRING, -- 主键1(如工厂代号) p_key2 STRING, -- 主键2(如单据编号) p_key3 STRING, -- 主键3(预留) p_key4 STRING, -- 主键4(预留) p_key5 STRING, -- 主键5(预留) p_key6 STRING, -- 主键6(预留) p_key7 STRING -- 主键7(预留) ) DEFINE sr RECORD LIKE sfb_file.* -- 关联单头表结构 DEFINE l_sql STRING DEFINE g_strXMLInput STRING -- Step 1: 构建SQL查询(JOIN多表获取完整数据) LET l_sql = "SELECT s.*, o.occ02 AS occ02 FROM sfb_file s " || "LEFT JOIN occ_file o ON s.sfb04 = o.oga04 " || "WHERE s.sfb01 = '" || p_key2 || "'" -- Step 2: 执行SQL,填充sr记录 PREPARE stmt FROM l_sql; DECLARE cur CURSOR FOR stmt; OPEN cur; FETCH cur INTO sr; CLOSE cur; -- Step 3: 组装XML(关键!字段顺序、值处理、CDATA) LET g_strXMLInput = "<head>" || ASCII 10 LET g_strXMLInput = g_strXMLInput CLIPPED, " <sfb01>", sr.sfb01 CLIPPED, "</sfb01>", ASCII 10, " <sfb02>", sr.sfb02 CLIPPED, "</sfb02>", ASCII 10, " <sfb04>", sr.occ02 CLIPPED, "</sfb04>", ASCII 10, -- 客户名称(非编码) " <sfbuser>", sr.sfbuser CLIPPED, "</sfbuser>", ASCII 10, -- 填单人(必填!) " <sfb25>", sr.sfb25 CLIPPED, "</sfb25>", ASCII 10, -- 状态字段(必填!) " <sfbmksg>", sr.sfbmksg CLIPPED, "</sfbmksg>", ASCII 10 -- 启用开关(必填!) LET g_strXMLInput = g_strXMLInput CLIPPED, "</head>" || ASCII 10 -- Step 4: 调用公共服务发送 RETURN aws_efsrv(g_strXMLInput, "TT_WO1") -- 第二参数为Easyflow表单ID END FUNCTION设计说明:
aws_efcfg是唯一配置入口:在Tiptop GUI中运行aws_efcfg,选择作业asfi301→ 设置单据IDTT_WO1→ 维护单头/单身字段 → 点击“产生范式程序”,自动生成aws_asfi301.4gl;sfbuser字段是硬性要求:Easyflow用此字段识别填单人并触发审批流,若未传递或为空,单据将无法进入任何人收件箱;sfb25和sfbmksg必须出现在XML中,且值与数据库实时一致,否则Easyflow回写时状态错乱;sr.occ02这类非原始字段,需在aws_efcfg的“参照字段”中显式声明JOIN逻辑,否则自动生成的SQL不含LEFT JOIN。
2.4 界面层:标准作业的4GL改造与状态驱动UI刷新
Tiptop标准作业(如axmt620出货单)本身不感知签核,需通过4GL代码注入签核逻辑,并确保UI实时反映状态变化。改造不是增加按钮,而是重构审核流程。
步骤1:新增xxx_ef()函数(以axmt620为例)
-- 在axmt620.4gl中新增函数(位置:所有DEFINE之后,MAIN之前) FUNCTION axmt620_ef() DEFINE l_title STRING LET l_title = "出货单" || g_oga.oga01 -- 调用AWS抛转(参数:标题、工厂、单号、4个预留) IF aws_efcli(l_title, g_oga.oga01[1,3], g_oga.oga01, '', '', '', '', '') THEN -- 抛转成功:更新状态字段 LET g_oga.ta_ogaefstat = 'S' -- 设为"送签中" LET g_oga.ogaconf = 'Y' -- 设为"已审核"(仅表示送签动作完成) -- 更新UI图标(cl_set_field_pic参数:审核状态、签核状态、填单人、结案状态、作废状态) CALL cl_set_field_pic(g_oga.ogaconf, g_oga.ta_ogaefstat, g_oga.ogapost, 'N', 'N', "") -- 显示状态文字(cs_ogasta为客制函数,返回"S"→"送签中") 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 -- 抛转失败:弹窗提示,不更新状态 CALL cl_err("aws-999", "签核抛转失败,请检查网络及Easyflow服务", 0) END IF END FUNCTION步骤2:改造原审核函数(confirm())
-- 在原有confirm()函数中,找到所有UPDATE/INSERT前的最后判断点 IF g_success = 'Y' THEN -- 新增签核拦截逻辑(核心!) IF g_oga.ta_ogamksg = 'Y' AND g_oga.ogaconf = 'N' THEN CALL axmt620_ef() -- 执行送签 IF g_success = 'N' THEN ROLLBACK WORK -- 抛转失败则回滚 END IF RETURN -- 送签成功则退出,不再执行原审核逻辑 END IF END IF -- 原审核逻辑(仅当不走签核时执行) IF g_success = 'Y' THEN UPDATE oga_file SET ... -- 原有业务更新 COMMIT WORK END IF设计说明:
g_oga.ta_ogamksg = 'Y'判断是否启用签核(来自单据性质设置),g_oga.ogaconf = 'N'判断是否尚未审核,双重条件确保只对新单触发;RETURN语句是流程分叉点:走签核则只更新状态字段并退出;不走签核则继续原逻辑,实现“一套代码,两种模式”;cl_set_field_pic()的5个参数必须按顺序传入:审核状态、签核状态、填单人、结案状态、作废状态,顺序错一位会导致图标显示错乱;cs_ogasta()必须返回中文状态描述,否则DISPLAY显示乱码,该函数需在CSUB/目录下存在且已编译。
3. Easyflow端集成设计:从表单生成到审批流绑定的7步配置链
Easyflow端不是被动接收方,而是签核流程的执行引擎、状态反馈中心与权限控制网关。其配置不是简单“新建表单”,而是一条环环相扣的7步配置链,任一环节断裂,单据即消失于收件箱。
3.1 表单文件体系:基于TT_SO1模板的精准克隆与命名规范
Easyflow表单文件存放在Program Files\EF2Kweb\ASP\CHT\Forms\目录下,每个单据对应一个子目录。严禁手动创建空目录,必须克隆现有单据(如TT_SO1)并严格遵循命名规范。
克隆步骤:
- 进入
Forms\目录,复制TT_SO1\为TT_WO1\(单据ID必须全大写,下划线分隔); - 进入
TT_WO1\目录,重命名所有文件(共7个):TT_SO1_Approve_Init.ASP→TT_WO1_Approve_Init.ASPTT_SO1_Create_Init.ASP→TT_WO1_Create_Init.ASPTT_SO1_Display_Init.ASP→TT_WO1_Display_Init.ASPTT_SO1_Grid.ASP→TT_WO1_Grid.ASPTT_SO1_Forms.ASP→TT_WO1_Forms.ASPTT_SO1_Script.ASP→TT_WO1_Script.ASPTT_SO1_Style.CSS→TT_WO1_Style.CSS
文件内字符串替换(3个Init文件 + Grid.ASP):
# 查找并替换(区分大小写!) 查找:TT_SO1 替换:TT_WO1 # 替换后保存,确保无残留TT_SO1验证方法:
- 在Easyflow管理界面 → “电子表单模块” → “表单性质维护”,搜索
TT_WO1,应能列出新表单; - 若搜索不到,90%是文件名未改全或
Forms.ASP中仍有TT_SO1硬编码。
3.2 表单样式设计:Forms.ASP的控件ID双命名规则与布局原则
Forms.ASP是表单HTML骨架,其控件ID命名直接决定Tiptop字段如何映射到Easyflow界面。ID错误是Easyflow端最高频错误。
控件ID命名规则(必须严格遵守):
- 标签控件(Label):
字段名_1(如<span id="sfb01_1">单据编号</span>) - 输入控件(Input/Select):
字段名_2(如<input id="sfb01_2" type="text">) - 单身表格(Grid):使用OCX控件,无需ID,由
Grid.ASP自动绑定
布局设计原则:
- 字段顺序与Tiptop一致:
sfb01(单号)→sfb02(日期)→sfb04(客户)... 保持业务阅读习惯; - 控件类型匹配:
- 日期字段 →
<select id="sfb02_2">(下拉年月日) - 文本/数值 →
<input id="sfb01_2" type="text"> - 状态字段(如
sfb25)→<select id="sfb25_2">(选项:0,S,1,6,9,R,W)
- 日期字段 →
- 隐藏字段处理:
sfbuser(填单人)必须存在但不可见:<!-- 在Forms.ASP底部添加 --> <input type="hidden" id="sfbuser_2" value="">
设计说明:
- Easyflow通过
id="xxx_1"读取标签名,通过id="xxx_2"读取值并写回Tiptop,两者必须成对出现且字段名一致; sfbuser_2是强制隐藏字段,若缺失,Easyflow无法识别填单人,审批流无法启动;sfb25_2的<select>选项必须包含所有可能状态值,否则回写时因值不匹配导致Tiptop更新失败。
3.3 数据库层:SQL Server中表单数据表的结构继承与主键约束
Easyflow将每张电子表单的数据存入SQL Server独立数据表(如TT_SO1表)。新表单TT_WO1必须继承原表结构,但主键字段名必须与Tiptop单据主键一致。
创建步骤(使用SQL Server Management Studio):
- 右键
TT_SO1表 → “脚本表为” → “CREATE到” → “新查询编辑器窗口”; - 将生成的
CREATE TABLE TT_SO1 (...)语句中:- 表名
TT_SO1→TT_WO1 - 主键字段(如
SO101)→WO101(与Tiptop单据编号字段sfb01对应) - 所有字段名按Tiptop XML中字段名映射(如
SO104→WO104,对应sfb04)
- 表名
- 执行CREATE语句;
- 为新表添加主键约束:
ALTER TABLE TT_WO1 ADD CONSTRAINT PK_TT_WO1 PRIMARY KEY (WO101)
关键约束:
WO101(单据编号)必须为VARCHAR(20)或与Tiptopsfb01类型一致,否则回写时截断;- 表中必须包含
WO1USER字段(对应sfbuser),类型VARCHAR(20),允许NULL; WO125字段(对应sfb25)必须为CHAR(1),且CHECK约束IN ('0','S','1','6','9','R','W')。
3.4 配置文件层:EF2Kweb.xml与ColumnSet.xml的双文件联动
Easyflow通过两个XML文件定位表单与解析XML:EF2Kweb.xml是路由表,ColumnSet.xml是字段字典。二者必须严格同步,否则aws_efcli()返回"Invalid Form ID"。
EF2Kweb.xml修改(路径:EF2KwebPackages\tiptop\):
<!-- 在<Forms>节点内添加 --> <Form> <FormID>TT_WO1</FormID> <FormName>工单TT_WO1</FormName> <FormPath>Forms\TT_WO1\TT_WO1_Forms.ASP</FormPath> <ServerName>EF2KWeb</ServerName> <IsEnabled>true</IsEnabled> </Form>ColumnSet.xml修改(路径:EF2KwebPackages\tiptop\):
<!-- 在<ColumnSets>节点内添加 --> <ColumnSet> <FormID>TT_WO1</FormID> <Columns> <Column> <FieldName>sfb01</FieldName> <!-- Tiptop字段名 --> <DBFieldName>WO101</DBFieldName> <!-- 数据库字段名 --> <DataType>String</DataType> <Length>20</Length> <IsRequired>true</IsRequired> </Column> <Column> <FieldName>sfb02</FieldName> <DBFieldName>WO102</DBFieldName> <DataType>Date</DataType> <IsRequired>false</IsRequired> </Column> <!-- ... 其他字段,必须与aws_asfi301.4gl中XML字段完全一致 --> <Column> <FieldName>sfbuser</FieldName> <DBFieldName>WO1USER</DBFieldName> <DataType>String</DataType> <IsRequired>true</IsRequired> <IsHidden>true</IsHidden> <!-- 隐藏字段标记 --> </Column> </Columns> </ColumnSet>设计说明:
FormID在EF2Kweb.xml和ColumnSet.xml中必须完全相同(大小写、下划线);FieldName必须与Tiptopaws_xxx.4gl中XML标签名逐字匹配(如<sfb01>→sfb01),多一个空格即失败;IsHidden=true仅对sfbuser等系统字段设置,业务字段必须为false;- 修改后必须重启EF2Kweb服务(Windows服务管理器中重启
EF2Kweb服务),否则配置不生效。
3.5 权限与流程层:表单开放、审批流绑定、Tiptop-Easyflow关联的三重授权
配置完技术层,还需完成业务层授权,否则表单对用户不可见、审批流不触发、Tiptop无法调用。
步骤1:开放表单(管理程序清单 → 流程基本数据 → 表单性质维护)
- 查询条件输入
TT_WO1→ 点击结果行; - 设置:
显示否:Y(否则用户看不到)生效日:填写当日日期(格式YYYY/MM/DD)失效日:留空或填远期日期(如2099/12/31)
- 滚动到底部 → “新建权限文件” → 选择角色(如
Approver)→ 勾选Create、Approve、Display→ 保存。
步骤2:设置审批流程(电子表单模块 → 自动向导 → 流程设定向导)
- 选择表单
TT_WO1→ “新增流程”; - 添加审批节点:
审批人:选择用户(如439)或角色(如DeptManager)审批方式:单人审批(最常用)超时处理:自动跳过(避免流程卡死)
- 保存后,该流程即绑定到
TT_WO1。
步骤3:建立Tiptop-Easyflow关联(电子表单模块 → 自动向导 → 易拓集成向导)
- 点击“新增表单关联”;
- 填写:
Tiptop程序代号:从下拉框选择asfi301(工单作业)Tiptop工厂代号:输入工厂码(如F01)Tiptop单据类别:选择在asmi300中设置为签核的单别(如WO1)Easyflow表单代号:选择TT_WO1
- 点击“新增关联”。
验证方法:
- 登录Tiptop,打开
asfi301→ 新建单据 → 选择单别WO1→ 保存 → 点击“审核”; - 若弹出“送签成功”,且Easyflow中
439用户收件箱出现TT_WO1单据,则关联成功。
4. 集成避坑指南:Tiptop-OA集成中92%新人首次翻车的5个致命点
集成不是线性过程,而是充满隐性依赖的网状工程。以下5个点,是我带过的3个项目中,新人在首次调试时平均耗时超过8小时、且92%概率踩中的致命坑。每个点都按“现象→原因→解决”给出可立即执行的排查路径。
4.1 现象:aws_efcli()返回false,但$TIPTOP_HOME/log/appserver.log中无任何错误日志
原因:.profile中EFSOAP地址错误,或Appserver未加载aws_efgw.inc中的超时配置,导致SOAP调用在底层socket层失败,未进入应用日志。
解决:
- 在Tiptop服务器执行
curl -v $EFSOAP(替换为实际值),确认返回HTTP 200及WSDL内容; - 检查
aws_efgw.inc中DEFINE AWS_TIMEOUT INTEGER值(默认30),若网络延迟高,临时改为60; - 重启Appserver:
kill -9 $(ps -ef | grep startweb | awk '{print $2}') && $TIPTOP_HOME/bin/startweb -d。
4.2 现象:Easyflow收件箱无单据,但Tiptop提示“送签成功”
原因:aws_xxx.4gl中未传递sfbuser字段,或Forms.ASP中<input id="sfbuser_2">缺失/ID错误,导致Easyflow无法识别填单人,审批流无法触发。
解决:
- 在
aws_asfi301.4gl的XML生成段,确认存在<sfbuser>xxx</sfbuser>; - 在
TT_WO1_Forms.ASP中搜索sfbuser_2,确认存在且为<input>类型; - 在Easyflow数据库
TT_WO1表中,查最新记录的WO1USER字段值是否为空。
4.3 现象:单据在Easyflow中显示,但所有字段为空(全是空白)
原因:ColumnSet.xml中FieldName与Tiptop XML标签名不一致(如大小写、下划线、空格),或DBFieldName与SQL Server表字段名不匹配。
解决:
- 在Tiptop中执行
aws_asfi301.4gl,将生成的XML字符串复制出来(在g_strXMLInput赋值后加DISPLAY g_strXMLInput TO SCREEN); - 对比
ColumnSet.xml中<FieldName>列表,确保每个标签名(如sfb01)都在其中; - 对比SQL Server中
TT_WO1表字段名(如WO101),确保<DBFieldName>完全匹配。
4.4 现象:Easyflow审批后,Tiptop单据状态仍为S(送签中),未更新为1(已核准)
原因:aws_efsrv.4gl中SOAP回调URL错误,或Easyflow GateWay未正确配置Tiptop回写服务地址,导致回写请求未到达Tiptop。
解决:
- 检查Easyflow服务器
EF2KwebPackages\tiptop\EF2Kweb.xml中<CallbackURL>节点,应为http://[Tiptop_IP]:[Port]/tiptop/soap/; - 在Tiptop服务器检查
$TIPTOP_HOME/web/soap/目录是否存在,且tiptop.wsdl可访问; - 在Easyflow日志
EF2Kweb\Logs\中搜索Callback failed,定位具体错误。
4.5 现象:Tiptop作业编译通过,但运行时报Function not found: aws_efcli_cf
原因:aws_asfi301.4gl未编译进aws模块,或编译时未指定-m aws参数,导致函数未注册到运行时环境。
解决:
- 进入
$TIPTOP_HOME/aws/4gl/目录; - 执行编译命令:
4glc -m aws aws_asfi301.4gl(必须带-m aws); - 检查编译输出是否有
aws_efcli_cf函数注册信息,如无则重新编译。
5. 集成验收与答辩:用3
本文还有配套的精品资源,点击获取