☰
Tiptop与Easyflow电子签核集成全链路实践指南
2026/11/2 7:17:32 网站建设 项目流程

简介:本资源是一份面向企业级ERP与OA系统集成工程师的Tiptop与Easyflow单据电子签核专项技术指南,聚焦制造业、供应链等场景中审批流程自动化落地的核心难点。文档系统梳理了从环境配置、数据表校验、Schema更新、AWS模块开发(含公共服务与作业级抛转程序)到集成测试的12个关键实施步骤,并详解aws_efcfg、aws_efsrv等核心4GL组件及XML数据编组逻辑,附有典型单据(如TT_AO1、axmt620)的端到端集成示意图与配置样例。资源为单文件PDF,共1个1.94MB文档,内容结构完整,涵盖概述、Tiptop/Easyflow双端配置、常见错误排查及AWS模块源码组织特点,便于开发者快速定位修改点并复用模板代码。目前已有1517人学习下载,适合具备Tiptop二次开发基础、正推进OA-ERP流程贯通的技术人员参考实施。

1. Tiptop 与 Easyflow 集成不是“接个 API”就完事:它是一套覆盖数据库、4GL 逻辑、XML 编组、SOAP 回调、表单渲染、审批流绑定的端到端签核闭环

你手头刚接到一个需求:“把 Tiptop 的工单、请购单、出货单,都走 OA 审批”。直觉上,这不就是调个接口、传个 JSON、等个回调?但现实是——当你在 Tiptop 里点下“审核”按钮,系统没弹窗、没报错、也没在 Easyflow 收件箱里看到单据时,你才真正意识到:这不是两个系统“连通”,而是两个异构生态在数据模型、状态机、权限体系、前端渲染规则上的一次精密咬合。这份《Tiptop&Easyflow集成说明_新单据集成样例.pdf》之所以被反复传阅、手写批注密布页边,正因为它不讲虚的“架构图”,而是一步一坑地拆解了「从 Tiptop 数据库字段建好,到 Easyflow 表单里正确显示客户名称,再到审批人点“核准”后 Tiptop 界面自动刷新为“已核准”」的全链路。它面向的是真正在产线环境改 4GL、调 SQL、配 XML、查 EF2Kweb.xml 的一线工程师,不是做 POC 演示的售前。如果你要集成的单据超过 3 类,或涉及多级签核、客制字段、地址拼接、状态联动(比如“送签中”禁用作废),那这份文档不是参考,是操作手册——漏掉第 7 步“修改标准作业的 per 档”,你的签核图标就永远不显示;跳过第 10 步“在 p_link 中加 AWS 链接”,Appserver 根本找不到抛转入口;而忽略 Easyflow 端 ColumnSet.xml 里xxxuser字段的强制存在,整张表单会在收件箱里“隐身”。这不是玄学,是 Tiptop/4GL 生态下,状态驱动型业务系统集成的硬性契约。

2. Tiptop 端集成:从数据库字段到 4GL 函数,12 步缺一不可的签核能力植入

Tiptop 端的改造不是“加个按钮”,而是把电子签核能力像血管一样嵌入到原有作业的毛细层级。它要求你同时懂数据库结构、4GL 语法、Tiptop 运行时机制(Appserver)、以及 AWS 模块的封装逻辑。下面按实际落地顺序,逐条拆解每一步的技术含义、必须做的动作、以及为什么不能跳过。

2.1 环境准备:Appserver 启动与 .profile 配置是通信的“电源开关”

Tiptop 与 Easyflow 的交互完全依赖 Appserver 提供的 HTTP/SOAP 通道。没有它,所有后续步骤都是空中楼阁。

提示:startweb启动后,务必用ps -ef | grep appserver确认进程存活,且监听端口(默认 8080)未被占用。仅靠浏览器能打开 Tiptop for Browser 不代表 Appserver 正常——那是 Web Server 在工作。

.profile的配置是硬编码的通信地址,必须与 Easyflow 实际部署严格一致:

#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 EFSOAP

参数说明:

  • EFSITEIP:Easyflow 应用服务器的内网 IP,非域名。若 Easyflow 部署在 DMZ 区,此处需填其对外映射 IP。
  • EFSITENAME:Easyflow Web 应用名,对应 IIS/Apache 的虚拟目录名,大小写敏感。
  • EFSOAP:WSDL 地址,必须能被 Tiptop 服务器curl -I访问通。路径/EF2KGateWay/EF2KGateWay.WSDL是固定约定,不可随意更改。

逻辑说明:这三行环境变量会被 AWS 公共模块(如aws_efsrv.4gl)读取,用于构造 SOAP 请求的 endpoint URL 和 header。如果 IP 写错,aws_efcli()函数会直接返回FALSE,且无详细错误日志——这是第一类静默失败。

2.2 数据库字段校验:7 个栏位是签核状态机的“DNA”,缺一不可

签核不是简单标记“Y/N”,而是一套状态驱动的业务流程。Tiptop 用 7 个特定字段承载这套状态机,它们必须存在于单据主表(如pmk_file、oga_file)中:

字段名是否关键作用说明典型值示例
pmkmksg✅ 关键“是否签核”开关。Y表示该单据启用电子签核,N则走传统审核。Y,N
pmk25✅ 关键“签核状态”。记录当前审批环节的实时状态,是回写和界面显示的核心依据。0(开立),S(送签中),1(已核准),6(结案),9(作废),R(退回),W(抽单)
pmksign⚠️ 非关键“签核等级”。用于多级审批(如部门经理→总监→VP),定义审批顺序层级。1,2,3
pmkdays⚠️ 非关键“签核完成天数”。记录从送签到最终核准耗时,用于 SLA 监控。3,7,15
pmkprit⚠️ 非关键“签核优先顺序”。高优单据可插队,影响收件箱排序。H(高),M(中),L(低)
pmksseq⚠️ 非关键“已签核顺序”。系统自动维护,记录当前已通过的审批节点序号。1,2(当有两级审批时)
pmksmax⚠️ 非关键“应签核顺序”。系统自动维护,表示该单据预设的总审批节点数。2,3

为什么必须检查并创建?
Tiptop 的签核逻辑(如aws_efcli_cf())在编组 XML 前,会先SELECT这些字段。若字段不存在,SQL 执行直接报错(-206: Column (xxx) not found),抛转中断。更隐蔽的坑是:字段存在但类型不符(如pmk25被建为CHAR(10)而非CHAR(1)),会导致 Easyflow 解析 XML 时状态码截断,S变成S(带空格),审批流无法匹配。

操作步骤:

  1. 进入 Tiptop 数据库管理工具(如dbaccess);
  2. DESCRIBE pmk_file;查看字段列表;
  3. 对缺失字段,执行ALTER TABLE pmk_file ADD (pmkmksg CHAR(1), pmk25 CHAR(1), ...);;
  4. 关键:为pmkmksg和pmk25添加NOT NULL约束,并设默认值N和0,避免新单据插入时因 NULL 导致逻辑异常。

2.3 aws_efcfg 维护:用图形化界面生成抛转骨架,但“单头/单身栏位”是核心命门

aws_efcfg是 Tiptop 端集成的“中央控制台”。它不写代码,却决定了 XML 的内容和结构。其核心价值在于自动生成aws_xxx.4gl抛转作业,但生成只是起点,维护才是关键。

单头栏位维护逻辑:
左侧输入数据库字段(如oga04客户编码),右侧输入“参照字段”(如occ02客户名称)。aws_efcfg会据此在生成的 SQL 中自动JOIN occ_file,并在 XML 中用occ02的值替换oga04。这是解决“传编码还是传名称”这一经典问题的官方方案。

单身栏位维护逻辑:
原理相同,但需注意:单身表(如ogb_file)通常不包含签核字段(pmkmksg,pmk25等),这些字段只存在于单头表。因此,在维护单身栏位时,JOIN的目标表必须是单头表(如oga_file),而非单身表自身,否则SELECT会因缺少关联条件而笛卡尔积爆炸。

避坑 / 常见问题 / 排查

  1. 现象:点击“产生范式程序”后,aws_xxx.4gl文件生成,但编译时报错Function 's_addr' not found。
    原因:s_addr()是客制函数,存放在CSUB目录,而aws_xxx.4gl默认只INCLUDE "aws_efcli.inc",未引入CSUB路径。
    解决:在生成的文件顶部添加INCLUDE "$CSUB/s_addr.4gl",或确保$CSUB已加入INCLPATH环境变量。

  2. 现象:XML 中oga04字段值为空,但数据库oga_file.oga04有值。
    原因:aws_efcfg中为oga04设置的参照字段occ02错误,应为occ02(客户名称),但误填为occ01(客户编码),导致JOIN occ_file ON oga.oga04 = occ.occ01失败。
    解决:检查aws_efcfg单头栏位设置,确认参照字段名与occ_file表结构一致;手动执行SELECT * FROM oga_file a JOIN occ_file c ON a.oga04 = c.occ01 WHERE a.oga01='XXX'验证 JOIN 逻辑。

  3. 现象:aws_xxx.4gl编译通过,运行时g_strXMLInput为空字符串。
    原因:aws_efcfg中“单据性质”未勾选“是否签核”,或l_sql查询语句中WHERE条件过滤过严(如AND pmkmksg = 'Y'但测试单据pmkmksg='N')。
    解决:在aws_xxx.4gl中临时添加DISPLAY "SQL: ", l_sql TO SYSDUMP;,运行后查看sydump文件确认 SQL 是否命中数据;检查单据性质设置(asmi300)是否为Y。

  4. 现象:aws_efcfg界面中“传送栏位资讯”按钮点击后,Easyflow 端ColumnSet.xml未更新。
    原因:该按钮仅生成ColumnSet.xml的<Column>节点,但 Easyflow 要求完整的<Program>结构,且需手动复制到EF2KwebPackages\tiptop\ColumnSet.xml并重启 IIS。
    解决:放弃此按钮,采用手工方式:将aws_xxx.4gl中g_strXMLInput的<head>和<body>内容,按 Easyflow 规则(字段名、顺序、必填项)写入ColumnSet.xml。

2.4 抛转作业aws_xxx.4gl:XML 编组不是拼字符串,是字段映射+业务逻辑的混合编排

aws_xxx.4gl的核心函数aws_efcli_cf()是 XML 生成引擎。其结构看似固定,但每一处LET都是业务规则的落地点。以下以aws_asfi301.4gl(工单抛转)为例,解析关键段落:

# 1. 声明中间记录,用于存放从 DB 取出的原始数据 DEFINE sr RECORD sfb01 CHAR(10), sfb02 CHAR(30), sfb03 DATE, sfb04 DECIMAL(10,2), ... END RECORD # 2. 构造 SQL,从 sfb_file 取数据,并 JOIN 其他表获取参照字段 LET l_sql = "SELECT s.sfb01, s.sfb02, s.sfb03, s.sfb04, c.sfc02 AS sfc02_name, -- 客户名称,来自 sfc_file m.sfm02 AS sfm02_name -- 物料名称,来自 sfm_file FROM sfb_file s LEFT JOIN sfc_file c ON s.sfb04 = c.sfc01 LEFT JOIN sfm_file m ON s.sfb05 = m.sfm01 WHERE s.sfb01 = '" || g_sfb.sfb01 || "'" # 3. 执行 SQL,填充 sr 记录 PREPARE stmt FROM l_sql; DECLARE cur CURSOR FOR stmt; OPEN cur; FETCH cur INTO sr; CLOSE cur; # 4. 开始编组 XML,此处体现业务逻辑处理 # 示例1:将数字状态码转为中文描述 CASE sr.sfb08 WHEN "1" LET l_sfb08 = "生产部" WHEN "2" LET l_sfb08 = "工程部" WHEN "3" LET l_sfb08 = "品保部" ELSE LET l_sfb08 = "未知部门" END CASE # 示例2:拼接地址字段(调用客制函数) CALL s_addr(sr.sfb01, sr.sfb04, sr.sfb044) RETURNING l_addr1, l_addr2, l_addr3 LET sr.addr = l_addr1 CLIPPED, " ", l_addr2 CLIPPED, " ", l_addr3 CLIPPED # 示例3:组合复杂字段(如规格+型号) LET l_sfb24 = sr.sfb24 CLIPPED, " ", sr.sfb211 CLIPPED, "%", sr.sfb212 CLIPPED, " ", sr.sfb213 CLIPPED # 5. 组装最终 XML 字符串 LET g_strXMLInput = "<head>" || ASCII 10 || " <sfb01>" || sr.sfb01 CLIPPED || "</sfb01>" || ASCII 10 || " <sfb02>" || sr.sfb02 CLIPPED || "</sfb02>" || ASCII 10 || " <sfb03>" || EXTEND(sr.sfb03, YEAR TO FRACTION) CLIPPED || "</sfb03>" || ASCII 10 || " <sfb04>" || sr.sfb04 CLIPPED || "</sfb04>" || ASCII 10 || " <sfc02_name>" || sr.sfc02_name CLIPPED || "</sfc02_name>" || ASCII 10 || " <sfm02_name>" || sr.sfm02_name CLIPPED || "</sfm02_name>" || ASCII 10 || " <sfb08>" || l_sfb08 CLIPPED || "</sfb08>" || ASCII 10 || " <addr>" || sr.addr CLIPPED || "</addr>" || ASCII 10 || " <sfb24>" || l_sfb24 CLIPPED || "</sfb24>" || ASCII 10 || " <sfbuser>" || USER CLIPPED || "</sfbuser>" || ASCII 10 || -- 必填!填单人 " </head>" || ASCII 10 || " <body>" || ASCII 10 || " </body>"

参数说明与逻辑说明:

  • sr记录:必须与 SQLSELECT的字段顺序、类型严格一致。sr.sfb03是DATE类型,XML 中需用EXTEND(..., YEAR TO FRACTION)转为YYYY-MM-DD格式,否则 Easyflow 解析失败。
  • sfc02_name:JOIN得到的参照字段,直接用于 XML,避免传递编码。
  • l_sfb08:状态码转义,提升 Easyflow 表单可读性。
  • s_addr():客制地址拼接函数,处理省市区三级地址的灵活组合。
  • sfbuser:绝对强制字段。Easyflow 用此字段识别填单人,决定审批流发起者。若缺失,单据无法进入任何人的收件箱。

3. Easyflow 端集成:从 ASP 表单到 SQL 表,XML 结构与数据库 Schema 的双向对齐

Easyflow 端的改造是“所见即所得”的逆向工程:Tiptop 发来的 XML 是“源数据”,Easyflow 的 ASP 表单和 SQL 表是“目标视图”。二者必须在字段名、数据类型、必填性上严丝合缝,否则 XML 解析失败或表单渲染空白。这不是配置,是 Schema 映射。

3.1 Forms 目录克隆与 ASP 文件批量替换:命名一致性是表单识别的“身份证”

Easyflow 通过文件名识别表单。TT_WO1是一个逻辑 ID,它贯穿于文件系统、数据库、XML 配置中。

操作步骤:

  1. 进入Program Files\EF2Kweb\ASP\CHT\Forms;
  2. 复制现有目录(如TT_SO1)为新目录TT_WO1;
  3. 进入TT_WO1目录,必须重命名以下 4 个文件:
    • TT_SO1_Approve_Init.ASP→TT_WO1_Approve_Init.ASP
    • TT_SO1_Create_Init.ASP→TT_WO1_Create_Init.ASP
    • TT_WO1_Display_Init.ASP→TT_WO1_Display_Init.ASP
    • TT_SO1_Grid.ASP→TT_WO1_Grid.ASP
  4. 用文本编辑器(如 Notepad++)打开这 4 个.ASP文件,全局替换所有TT_SO1为TT_WO1(区分大小写)。

为什么必须严格?
TT_WO1_Create_Init.ASP是表单创建入口,其文件名被EF2Kweb.xml中的<FormID>引用;TT_WO1_Display_Init.ASP是详情页,其内部Request.QueryString("FormID")也依赖此名。若文件名与内容不一致,Easyflow 会加载错误的初始化脚本,导致ColumnSet.xml加载失败或字段 ID 匹配错误。

3.2 Forms.ASP 表单设计:ID 命名规则是 XML 数据绑定的“神经突触”

Forms.ASP是表单的 HTML 骨架。Easyflow 的数据绑定引擎(EF2Kweb)通过<input>或<select>的id属性,将 XML 中的字段名与页面控件一一对应。

ID 命名铁律:

  • 标签 ID:xxx_1(如sfb01_1),用于显示字段名(“工单编号:”)。
  • 控件 ID:xxx_2(如sfb01_2),用于绑定字段值(“WO20230001”)。
  • xxx必须与 XML 中的字段名完全一致(大小写、下划线)。

典型 HTML 片段:

<!-- 工单编号标签 --> <span id="sfb01_1">工单编号:</span> <!-- 工单编号输入框,ID 必须为 sfb01_2 --> <input type="text" id="sfb01_2" name="sfb01" readonly /> <!-- 客户名称标签 --> <span id="sfc02_name_1">客户名称:</span> <!-- 客户名称输入框,ID 必须为 sfc02_name_2 --> <input type="text" id="sfc02_name_2" name="sfc02_name" readonly /> <!-- 审批意见(多行文本) --> <span id="ef_comment_1">审批意见:</span> <textarea id="ef_comment_2" name="ef_comment"></textarea>

逻辑说明:Easyflow 启动时,会解析ColumnSet.xml,提取所有<Column Name="sfb01"/>,然后在Forms.ASP中查找id="sfb01_2"的控件,将 XML 中<sfb01>WO20230001</sfb01>的值填入。若id写成sfb01(缺_2)或SFB01_2(大小写错),绑定失败,控件显示为空。

3.3 SQL Server 数据表创建:以 XML 为蓝本,字段类型必须“向下兼容”

Easyflow 的表单数据最终存入 SQL Server。新表的结构必须是ColumnSet.xml的“镜像”,但字段类型需考虑存储安全。

操作步骤(推荐导入导出向导):

  1. 在 SQL Server Management Studio 中,右键现有表(如TT_SO1),选择“任务” → “导出数据”;
  2. “选择源表和视图”:选择TT_SO1;
  3. “选择目标”:选择目标数据库,表名填TT_WO1;
  4. “编辑映射”:关键步骤!
    • 将TT_SO1的SO101字段映射到TT_WO1的WO101;
    • 将TT_SO1的SO102映射到TT_WO1的WO102;
    • 特别注意:sfbuser字段(填单人)在 XML 中是CHAR(30),但在 SQL 表中建议设为NVARCHAR(50),预留中文用户名空间;
    • sfb03(日期)字段,SQL 类型必须为DATETIME或DATE,不能是VARCHAR。

为什么不能直接CREATE TABLE TT_WO1 AS SELECT * FROM TT_SO1?
因为TT_SO1表可能包含 Easyflow 系统字段(如EF_ID,EF_STATUS),这些字段在TT_WO1中不需要,且ColumnSet.xml未定义,会导致 XML 解析时因字段冗余而失败。

3.4 EF2Kweb.xml 与 ColumnSet.xml:配置文件是 Easyflow 的“路由表”与“数据字典”

这两份 XML 是 Easyflow 的核心配置,决定了“哪个表单由哪个 ASP 加载”、“XML 中的哪个字段存入数据库哪个列”。

EF2Kweb.xml修改(位于EF2KwebPackages\tiptop\):

<!-- 在 <Forms> 节点内新增 --> <Form ID="TT_WO1" Name="工单审批" Type="Create" InitFile="TT_WO1_Create_Init.ASP" DisplayFile="TT_WO1_Display_Init.ASP" ApproveFile="TT_WO1_Approve_Init.ASP" GridFile="TT_WO1_Grid.ASP" />

参数说明:ID="TT_WO1"必须与 ASP 文件名、ColumnSet.xml中的<Program>ID 一致;Name是 Easyflow 管理界面显示的表单名称。

ColumnSet.xml修改(位于EF2KwebPackages\tiptop\):

<!-- 在 <ColumnSets> 节点内新增 --> <ColumnSet ID="TT_WO1"> <Program ID="TT_WO1" Table="TT_WO1" KeyField="WO101" /> <Column Name="WO101" Type="String" Length="10" Required="true" /> <Column Name="WO102" Type="String" Length="30" Required="false" /> <Column Name="WO103" Type="Date" Required="false" /> <Column Name="sfc02_name" Type="String" Length="50" Required="false" /> <Column Name="sfbuser" Type="String" Length="50" Required="true" /> <!-- 必填! --> <Column Name="ef_comment" Type="String" Length="200" Required="false" /> </ColumnSet>

参数说明:

  • <Program ID="TT_WO1">:必须与EF2Kweb.xml中的Form ID和 ASP 文件名一致。
  • <Column Name="...">:必须与 Tiptopaws_xxx.4gl中g_strXMLInput里的 XML 标签名完全一致(如<sfb01>对应Name="sfb01")。
  • Required="true":该字段在 XML 中必须存在,否则 Easyflow 解析报错。sfbuser必须设为true。

避坑 / 常见问题 / 排查

  1. 现象:Easyflow 收件箱中能看到单据,但点击打开后表单空白,F12 控制台报XML parsing error。
    原因:ColumnSet.xml中<Column Name="sfb01">的Name与 XML 中<sfb01>标签名大小写不一致(如 XML 是<SFB01>,配置是sfb01)。
    解决:用xmllint --format格式化g_strXMLInput输出,确认 XML 标签名;严格按 XML 名称修改ColumnSet.xml。

  2. 现象:表单能打开,但所有字段都显示“undefined”。
    原因:Forms.ASP中控件id为sfb01,但ColumnSet.xml中<Column Name="sfb01">的Name写成了sfb_01(多了下划线)。
    解决:统一ColumnSet.xml、Forms.ASP、aws_xxx.4gl三处的字段名,建议全部小写+下划线。

  3. 现象:审批提交后,Tiptop 端pmk25字段未更新为1,仍为S。
    原因:ColumnSet.xml中未定义pmk25字段,或EF2Kweb.xml中<Form>的ApproveFile指向了错误的 ASP(如TT_SO1_Approve_Init.ASP)。
    解决:检查ApproveFile是否为TT_WO1_Approve_Init.ASP;确认ColumnSet.xml包含<Column Name="pmk25" ... />。

4. 签核状态闭环:从 Tiptop 审核触发,到 Easyflow 审批,再到 Tiptop 状态回写,12 步中的 5 个关键函数

集成的价值不在“发出去”,而在“收回来”。Tiptop 的axmt620(出货单)作业中,xxx_ef()函数是状态闭环的枢纽。它串联了抛转、状态设置、界面刷新、数据库更新四个动作,任何一个环节断裂,签核就变成单向广播。

4.1xxx_ef()函数:签核触发器,核心是aws_efcli()调用与状态预置

以t600_ef()(出货单签核函数)为例,其精简逻辑如下:

FUNCTION t600_ef() DEFINE l_title CHAR(50) LET l_title = "出货单签核" # 关键1:调用 AWS 公共模块的抛转函数 # 参数:标题、工厂代号、单据号、4个空字符串(预留扩展) IF aws_efcli(l_title, g_oga.oga01[1, 3], # 工厂代号,取前3位 g_oga.oga01, # 单据号 '', '', '', '') # 预留参数 THEN # 关键2:预置签核状态,告诉 Tiptop "正在送签" LET g_oga.ta_ogaefstat = 'S' # 状态设为 'S'(送签中) LET g_oga.ogaconf = 'Y' # 审核状态设为 'Y'(已审核) # 关键3:更新界面显示图标(确/核/送) 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,"") # 关键4:显示中文状态 CALL cs_ogasta('oga',g_oga.ta_ogaefstat,g_oga.ogaconf,g_oga.ta_ogamksg) RETURNING g_sta DISPLAY g_sta TO FORMONLY.desc2 # 显示在界面上 # 关键5:立即更新数据库,持久化状态 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 LET g_success = 'N' CALL cl_err("aws_efcli failed", -1, 0) # 记录错误 END IF END FUNCTION

参数说明与逻辑说明:

  • aws_efcli():AWS 公共模块的核心函数,封装了 SOAP 调用、XML 发送、结果解析。返回TRUE表示 Easyflow 已成功接收。
  • ta_ogaefstat = 'S':这是状态机的关键跃迁。S告诉 Tiptop “已发起签核”,后续所有操作(如作废、取消审核)都会检查此状态。
  • cl_set_field_pic():根据g_chr,g_chr2,g_chr3三个标志,动态切换界面上的图标(如“确”、“核”、“送”),是用户最直观的状态反馈。
  • cs_ogasta():客制函数,将状态码S转为中文“送签中”,提升用户体验。
  • UPDATE ... COMMIT WORK:必须立即提交。若不提交,aws_efsrv.4gl中的回写回调(aws_efsrv_update_status())将查不到最新状态,导致 Easyflow 的回写失败。

4.2 原审核函数改造:用IF拦截,让签核成为审核的“前置闸门”

传统审核(confirm())是原子操作:判断 → 更新 → 提交。签核模式下,它必须降级为“送签触发器”。

改造前(伪代码):

FUNCTION confirm() IF valid_check() THEN UPDATE oga_file SET ogaconf='Y' WHERE oga01=g_oga.oga01 COMMIT WORK DISPLAY "审核成功" END IF END FUNCTION

改造后(关键段):

FUNCTION confirm() IF valid_check() 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 # 原审核逻辑(仅当不走签核时执行) UPDATE oga_file SET ogaconf='Y' WHERE oga01=g_oga.oga01 COMMIT WORK DISPLAY "审核成功" END IF END FUNCTION

逻辑说明:IF g_oga.ta_ogamksg = 'Y' AND g_oga.ogaconf = 'N'是双重保险。ta_ogamksg='Y'表示该单据性质启用了签核;ogaconf='N'表示当前尚未人工审核。两者同时满足,才进入签核流程。RETURN是关键,它阻止了原UPDATE语句的执行,确保数据变更只发生在t600_ef()中。

4.3 签核状态浏览 Action:aws_efstat()是状态同步的“心跳检测”

用户需要知道“我的单子审到哪了?”。i301_approval_status()函数通过aws_efstat()主动向 Easyflow 查询当前状态。

FUNCTION i301_approval_status() <p> <a href="https://download.csdn.net/download/wai631/12881706" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询