工作流引擎全攻略:AOD 模板设计、Handler 链与复杂审批流

Teamcenter 的工作流引擎是企业业务流程自动化的核心。从工程变更审批、图纸签审到发布流程,工作流贯穿了产品生命周期管理的每一个关键环节。本文将深入解析工作流的设计原理、AOD 模板开发、

2

工作流引擎全攻略: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 最佳实践

  1. 模板版本管理:每次修改 AOD 模板时递增版本号
  2. Handler 异常处理:每个自定义 Handler 必须有完善的错误处理
  3. 超时设置:为每个 Task 设置合理的超时时间,避免流程永久挂起
  4. 审批人冗余:设置备选审批人,防止人员离职导致流程停滞
  5. 流程测试:在开发环境充分测试后再导入生产环境
  6. 文档记录:为每个 AOD 模板编写使用说明

七、总结

Teamcenter 工作流引擎是一个功能强大的业务流程管理工具。掌握以下关键能力:

能力域 核心要点
AOD 设计 熟练使用 Workflow Designer 设计图形化流程
Handler 开发 理解内置 Handler + 掌握自定义 Handler 开发
动态审批 利用 EPE 表达式和自定义 Handler 实现智能路由
流程监控 熟练使用各类监控工具跟踪流程状态
最佳实践 版本管理、异常处理、超时设置、文档记录

参考资料:IMA Teamcenter 知识库 —《Teamcenter工作流.ppt》《13 工作流设计器.ppt》《11 查看和发起工作流.ppt》《12 审阅和跟踪工作流数据.ppt》

广告
广告位预留中 (728x90)