工作流引擎全攻略:AOD 模板设计、Handler 链与复杂审批流
Teamcenter 的工作流引擎是企业业务流程自动化的核心。从工程变更审批、图纸签审到发布流程,工作流贯穿了产品生命周期管理的每一个关键环节。本文将深入解析工作流的设计原理、AOD 模板开发、
工作流引擎全攻略:AOD 模板设计、Handler 链与复杂审批流
本文参考 IMA Teamcenter 知识库中的《Teamcenter工作流.ppt》《13 工作流设计器.ppt》《11 查看和发起工作流.ppt》等培训资料,结合实战经验编写。
Teamcenter 的工作流引擎是企业业务流程自动化的核心。从工程变更审批、图纸签审到发布流程,工作流贯穿了产品生命周期管理的每一个关键环节。本文将深入解析工作流的设计原理、AOD 模板开发、Handler 链机制以及复杂审批流的构建方法。
一、工作流基础概念
1.1 工作流的核心对象模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
┌─────────────────────┐
│ Workflow Process │ ← 流程实例(运行中的工作流)
│ (EPMWorkflow) │
├─────────────────────┤
│ Workflow Template │ ← 流程模板(AOD 文件定义)
│ (EPMProcessTempl) │
├─────────────────────┤
│ Workflow Stage │ ← 阶段/步骤组
│ (EPMStage) │
├─────────────────────┤
│ Workflow Task │ ← 具体任务
│ (EPMTask) │
├─────────────────────┤
│ Workflow Handler │ ← 处理程序(逻辑执行单元)
│ (EPMHandler) │
└─────────────────────┘
|
1.2 工作流的状态流转
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
┌──────────┐
│ Not Ready │
└─────┬─────┘
│ 启动
┌─────▼─────┐
│ Running │◄──────────┐
└─────┬─────┘ │
│ 完成 │ 退回
┌─────▼─────┐ ┌──────┴──────┐
│ Complete │ │ In Progress│
└───────────┘ └─────────────┘
│
┌─────▼─────┐
│ Cancelled │ ← 手动取消
└───────────┘
|
二、AOD 工作流模板设计
2.1 什么是 AOD?
AOD(Authoring Object Diagram)是 Teamcenter 工作流模板的图形化表示文件。通过 Workflow Designer(工作流设计器),用户可以在图形界面上设计流程,然后导出为 .aod 文件。
2.2 工作流设计器界面
Workflow Designer 提供了可视化的拖拽式设计环境:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
┌──────────────────────────────────────────────────────────┐
│ Workflow Designer │
├─────────────┬────────────────────────────────────────────┤
│ 工具箱 │ 设计画布 │
│ │ │
│ ■ Start │ ┌──────┐ ┌──────────┐ │
│ ■ End │ │Start ├───►│ Review │ │
│ ■ Task │ └──────┘ └────┬─────┘ │
│ ■ Review │ │ │
│ ■ Branch │ ┌────▼─────┐ │
│ ■ Junction │ ┌───────►│ Approve │ │
│ ■ Handler │ │ └────┬─────┘ │
│ │ │ │ │
│ │ ┌────▼─────┐ ┌────▼─────┐ │
│ │ │ Reject │ │ Complete │ │
│ │ └──────────┘ └──────────┘ │
├─────────────┴────────────────────────────────────────────┤
│ 属性面板:Task Name | Handler | 条件 | 参与者 │
└──────────────────────────────────────────────────────────┘
|
2.3 核心元素详解
2.3.1 Start / End 节点
1
2
3
4
5
6
7
8
9
10
11
|
<!-- AOD 中的 Start 节点 -->
<node id="start1" type="start">
<property name="name" value="流程开始" />
<property name="description" value="启动变更审批流程" />
</node>
<!-- End 节点 -->
<node id="end1" type="end">
<property name="name" value="流程结束" />
<property name="auto_complete" value="true" />
</node>
|
2.3.2 Task 节点
Task 是工作流中的核心执行单元,每个 Task 可以关联 Handler 执行自定义逻辑:
1
2
3
4
5
6
7
|
<node id="task1" type="task">
<property name="name" value="工程审核" />
<property name="description" value="工程师审核变更内容" />
<property name="task_type" value="Review" />
<property name="handler" value="EPM-set-reviewer" />
<property name="timeout" value="72" /> <!-- 超时时间(小时) -->
</node>
|
2.3.3 Review 节点
Review 节点专门用于审批场景,支持多种审批模式:
| 审批模式 |
说明 |
示例场景 |
| Serial(串行) |
按顺序逐个审批 |
部门经理 → 总监 → VP |
| Parallel(并行) |
所有审批人同时收到任务 |
多部门会签 |
| Vote(投票) |
投票决定是否通过 |
技术委员会评审 |
| Any(任意) |
任意一人审批即可 |
值班审批 |
1
2
3
4
5
6
7
|
<!-- 并行审批配置 -->
<node id="review1" type="review">
<property name="name" value="多部门会签" />
<property name="review_type" value="Parallel" />
<property name="reviewers" value="group:engineering,group:quality,group:manufacturing" />
<property name="all_must_approve" value="true" />
</node>
|
2.3.4 Branch 分支节点
Branch 用于实现条件分支,根据运行时的变量值决定流程走向:
1
2
3
4
5
6
7
|
<node id="branch1" type="branch">
<property name="name" value="审批结果判断" />
<property name="branch_type" value="conditional" />
<transition name="approved" condition="review_status == 'approved'" target="notify_all" />
<transition name="rejected" condition="review_status == 'rejected'" target="return_to_originator" />
<transition name="default" target="escalate" />
</node>
|
2.3.5 Junction 汇合节点
Junction 用于将多个分支路径合并:
1
2
3
4
|
<node id="junction1" type="junction">
<property name="name" value="合并路径" />
<property name="join_type" value="and" /> <!-- and=等待所有, or=任一到达 -->
</node>
|
三、Handler 机制深度解析
3.1 Handler 是什么?
Handler 是工作流中执行具体业务逻辑的处理程序。每个 Handler 可以是:
- 内置 Handler:Teamcenter 预定义的通用处理逻辑
- 自定义 Handler:通过 ITK 二次开发实现的自定义逻辑
3.2 Handler 类型分类
| Handler 类型 |
执行时机 |
常见用途 |
| EPM-start-flow |
流程启动时 |
初始化变量、创建附件 |
| EPM-set-reviewer |
任务创建时 |
动态指定审批人 |
| EPM-execute-action |
任务完成时 |
执行数据更新 |
| EPM-assign-task |
任务分配时 |
动态分配任务 |
| EPM-conditional-branch |
分支判断时 |
条件评估 |
| IMAN-send-email |
任意时机 |
发送邮件通知 |
| IMAN-create-attachment |
任意时机 |
创建流程附件 |
3.3 常用内置 Handler 详解
EPM-set-reviewer
动态指定 Review 任务的审批人:
1
2
3
4
5
6
|
Handler: EPM-set-reviewer
属性:
- user: 指定具体用户(如 "zhangsan")
- group: 指定用户组(如 "engineering")
- role: 指定角色(如 "manager")
- expression: EPE 表达式动态计算
|
1
2
3
4
5
6
|
// 通过 EPE 表达式动态指定审批人
// 根据提交者的部门,自动选择对应部门经理
String reviewerExpr = "EPM_find_users_by_role( submitter.get_department(), 'manager' )";
// 在 AOD 中配置:
// handler: EPM-set-reviewer
// arg0: user_name = ${reviewerExpr}
|
EPM-execute-action
在任务完成时执行特定操作:
1
2
3
4
|
Handler: EPM-execute-action
属性:
- action: 要执行的动作(如 "release", "checkin")
- target: 操作目标对象
|
IMAN-send-email
发送邮件通知:
1
2
3
4
5
6
|
Handler: IMAN-send-email
属性:
- recipient: 收件人(支持变量,如 ${task.owner})
- subject: 邮件主题
- body: 邮件正文(支持 HTML)
- attachment: 附件(可选)
|
3.4 自定义 Handler 开发
3.4.1 Handler 接口规范
自定义 Handler 需要实现 EPM_custom_handler 函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
#include <tc/tc.h>
#include <epm/epm.h>
#include <epm/epm_custom.h>
/**
* 自定义 Handler 入口函数
* @param n_args 参数个数
* @param args 参数数组
* @return int 0=成功, 非0=失败
*/
int EPM_custom_my_handler(int n_args, char *args[])
{
int ifail = ITK_ok;
tag_t workflow = NULLTAG;
tag_t task = NULLTAG;
// 参数解析
// args[0] = handler 名称
// args[1] = 流程 tag (字符串形式)
// args[2] = 任务 tag (字符串形式)
if (n_args < 3) {
EMH_store_error(EMH_severity_error, ITK_error,
"EPM_custom_my_handler: 参数不足");
return ITK_error;
}
// 转换为 tag
ITKCALL(COMP_translate_tag(args[1], &workflow));
ITKCALL(COMP_translate_tag(args[2], &task));
// 获取任务信息
char *task_name = NULL;
EPM_ask_name(task, &task_name);
printf("执行自定义 Handler,任务名称: %s\n", task_name);
// 执行业务逻辑
// ...
// 清理
if (task_name) MEM_free(task_name);
return ifail;
}
|
3.4.2 Handler 注册
1
2
3
4
5
6
7
8
9
|
# 在 tc_profilevars.bat/sh 中注册自定义 Handler
export TC_CUSTOM_EPMS="EPM_custom_my_handler"
# 编译链接
gcc -shared -o libmyhandler.so myhandler.c \
-I$TC_ROOT/include -L$TC_ROOT/lib -ltc -lepm
# 将库文件放到 $TC_ROOT/lib 目录下
cp libmyhandler.so $TC_ROOT/lib/
|
3.4.3 在 AOD 中使用自定义 Handler
1
2
3
4
5
6
7
8
|
<node id="task_custom" type="task">
<property name="name" value="自定义处理" />
<handler id="handler1" type="execute">
<property name="handler_name" value="EPM_custom_my_handler" />
<property name="arg0" value="custom_param_1" />
<property name="arg1" value="custom_param_2" />
</handler>
</node>
|
3.5 Handler 链(Handler Chain)
一个 Task 可以关联多个 Handler,按顺序执行形成 Handler 链:
1
2
3
4
5
6
|
Task: "工程审核"
│
├──► Handler 1: EPM-set-reviewer (设置审批人)
├──► Handler 2: IMAN-send-email (发送通知邮件)
├──► Handler 3: EPM_custom_validate (自定义校验)
└──► Handler 4: EPM-execute-action (执行后续动作)
|
执行顺序:Handler 按定义的顺序依次执行,任一 Handler 失败可配置是否中断整个链。
1
2
3
4
5
6
7
|
<!-- Handler 链配置 -->
<handler_chain id="chain1">
<handler sequence="1" name="EPM-set-reviewer" on_error="continue" />
<handler sequence="2" name="IMAN-send-email" on_error="continue" />
<handler sequence="3" name="EPM_custom_validate" on_error="abort" />
<handler sequence="4" name="EPM-execute-action" on_error="abort" />
</handler_chain>
|
四、复杂审批流实战
4.1 工程变更审批流(ECR/ECN)
这是最经典的 Teamcenter 工作流场景:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
┌──────────┐
│ 发现问题 │
└─────┬────┘
│
┌─────▼────┐
│ 提交 PR │ ProblemReport
└─────┬────┘
│
┌─────▼────┐
│ 提交 ECR │ ChangeRequest
└─────┬────┘
│
┌───────────▼───────────┐
│ ECR 审批流程 │
│ ┌──────────────────┐ │
│ │ 工程经理审核 │ │
│ └───────┬──────────┘ │
│ │ │
│ ┌─────▼─────┐ │
│ │ 分支判断 │ │
│ └─┬─────┬───┘ │
│ 通过│ │驳回 │
│ ▼ ▼ │
│ 创建ECN 退回修改 │
└───────────────────────┘
│
┌───────────▼───────────┐
│ ECN 审批流程 │
│ ┌──────────────────┐ │
│ │ 影响分析 │ │
│ │ 多部门会签 │ │
│ │ 有效性设置 │ │
│ └──────────────────┘ │
└───────────────────────┘
│
┌─────▼────┐
│ 发放生效 │
└──────────┘
|
4.2 AOD 模板完整示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
<?xml version="1.0" encoding="UTF-8"?>
<process_template name="ECR审批流程" version="1.0">
<description>工程变更请求标准审批流程</description>
<!-- Start 节点 -->
<node id="start" type="start">
<property name="name" value="流程开始" />
<transition target="create_review" />
</node>
<!-- 设置审核人 -->
<node id="create_review" type="task">
<property name="name" value="工程审核" />
<property name="description" value="由工程经理审核变更请求" />
<handler name="EPM-set-reviewer">
<arg name="user" value="${ecr.owner.manager}" />
</handler>
<handler name="IMAN-send-email">
<arg name="recipient" value="${reviewer.email}" />
<arg name="subject" value="ECR ${ecr.id} 等待审核" />
<arg name="body" value="您有一条变更请求需要审核..." />
</handler>
<transition name="approved" target="branch_check" />
<transition name="rejected" target="return_to_originator" />
</node>
<!-- 分支判断 -->
<node id="branch_check" type="branch">
<property name="name" value="金额判断" />
<transition name="high_cost" condition="ecr.cost_impact > 10000" target="vp_review" />
<transition name="low_cost" target="create_ecn" />
</node>
<!-- VP 审批(高成本变更) -->
<node id="vp_review" type="review">
<property name="name" value="VP 审批" />
<property name="review_type" value="Serial" />
<handler name="EPM-set-reviewer">
<arg name="user" value="vp_engineering" />
</handler>
<transition name="approved" target="create_ecn" />
<transition name="rejected" target="return_to_originator" />
</node>
<!-- 创建 ECN -->
<node id="create_ecn" type="task">
<property name="name" value="创建变更通知" />
<handler name="EPM_custom_create_eccn">
<arg name="source_ecr" value="${ecr.id}" />
</handler>
<transition target="end" />
</node>
<!-- 退回 -->
<node id="return_to_originator" type="task">
<property name="name" value="退回修改" />
<property name="description" value="退回给发起人进行修改" />
<transition target="create_review" />
</node>
<!-- End 节点 -->
<node id="end" type="end">
<property name="name" value="流程完成" />
</node>
</process_template>
|
4.3 动态审批人策略
在实际业务中,审批人往往不是固定的,需要根据业务数据动态计算:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
// 自定义 Handler:根据变更类型和部门动态选择审批人
int EPM_custom_dynamic_reviewer(int n_args, char *args[])
{
tag_t task = NULLTAG;
COMP_translate_tag(args[2], &task);
// 获取关联的 ECR 对象
tag_t ecr = NULLTAG;
EPM_get_primary_attachments(task, 1, &ecr);
// 获取变更类型
char *change_type = NULL;
AOM_ask_value_string(ecr, "change_type", &change_type);
// 根据变更类型选择审批人
char *reviewer = NULL;
if (strcmp(change_type, "design") == 0) {
reviewer = "design_manager";
} else if (strcmp(change_type, "process") == 0) {
reviewer = "process_manager";
} else {
reviewer = "engineering_director";
}
// 设置审批人
EPM_set_reviewers(task, 1, &reviewer);
MEM_free(change_type);
return ITK_ok;
}
|
五、工作流监控与跟踪
5.1 工作流查看器
Teamcenter 提供了多种工作流监控工具:
| 工具 |
功能 |
| My Teamcenter > 我的工作流 |
查看我参与的所有流程 |
| Workflow Viewer |
图形化查看流程状态 |
| Workflow Monitor |
管理员监控所有流程 |
| EPM-ask-status |
ITK API 查询流程状态 |
5.2 工作流数据审计
1
2
3
4
5
6
7
|
# 通过命令行查询工作流状态
em_execute -u=infodba -p=*** -g=dba \
"EPM-list-workflows -type=ChangeRequest"
# 查询特定对象关联的工作流
em_execute -u=infodba -p=*** \
"EPM-list-related-workflows -item=0000123 -rev=A"
|
六、常见问题与最佳实践
6.1 工作流卡住排查
1
2
3
4
5
6
7
8
9
10
11
12
|
# 1. 检查任务状态
em_execute -u=infodba -p=*** \
"EPM-ask-task-status -workflow=<workflow_tag>"
# 2. 检查 Handler 日志
tail -f $TC_DATA/logs/workflow.log
# 3. 检查数据库锁
# Oracle
SELECT * FROM v$lock WHERE sid IN (
SELECT sid FROM v$session WHERE username = 'TCUSER'
);
|
6.2 最佳实践
- 模板版本管理:每次修改 AOD 模板时递增版本号
- Handler 异常处理:每个自定义 Handler 必须有完善的错误处理
- 超时设置:为每个 Task 设置合理的超时时间,避免流程永久挂起
- 审批人冗余:设置备选审批人,防止人员离职导致流程停滞
- 流程测试:在开发环境充分测试后再导入生产环境
- 文档记录:为每个 AOD 模板编写使用说明
七、总结
Teamcenter 工作流引擎是一个功能强大的业务流程管理工具。掌握以下关键能力:
| 能力域 |
核心要点 |
| AOD 设计 |
熟练使用 Workflow Designer 设计图形化流程 |
| Handler 开发 |
理解内置 Handler + 掌握自定义 Handler 开发 |
| 动态审批 |
利用 EPE 表达式和自定义 Handler 实现智能路由 |
| 流程监控 |
熟练使用各类监控工具跟踪流程状态 |
| 最佳实践 |
版本管理、异常处理、超时设置、文档记录 |
参考资料:IMA Teamcenter 知识库 —《Teamcenter工作流.ppt》《13 工作流设计器.ppt》《11 查看和发起工作流.ppt》《12 审阅和跟踪工作流数据.ppt》