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

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

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

一、工作流基础概念

1.1 工作流的核心对象模型


┌─────────────────────┐
│   Workflow Process  │  ← 流程实例(运行中的工作流)
│   (EPMWorkflow)     │
├─────────────────────┤
│   Workflow Template │  ← 流程模板(AOD 文件定义)
│   (EPMProcessTempl) │
├─────────────────────┤
│   Workflow Stage    │  ← 阶段/步骤组
│   (EPMStage)        │
├─────────────────────┤
│   Workflow Task     │  ← 具体任务
│   (EPMTask)         │
├─────────────────────┤
│   Workflow Handler  │  ← 处理程序(逻辑执行单元)
│   (EPMHandler)      │
└─────────────────────┘

1.2 工作流的状态流转


              ┌──────────┐
              │  Not Ready │
              └─────┬─────┘
                    │ 启动
              ┌─────▼─────┐
              │   Running  │◄──────────┐
              └─────┬─────┘           │
                    │ 完成             │ 退回
              ┌─────▼─────┐    ┌──────┴──────┐
              │  Complete  │    │  In Progress│
              └───────────┘    └─────────────┘
                    │
              ┌─────▼─────┐
              │  Cancelled │  ← 手动取消
              └───────────┘

二、AOD 工作流模板设计

2.1 什么是 AOD?

AOD(Authoring Object Diagram)是 Teamcenter 工作流模板的图形化表示文件。通过 Workflow Designer(工作流设计器),用户可以在图形界面上设计流程,然后导出为 .aod 文件。

2.2 工作流设计器界面

Workflow Designer 提供了可视化的拖拽式设计环境:


┌──────────────────────────────────────────────────────────┐
│  Workflow Designer                                       │
├─────────────┬────────────────────────────────────────────┤
│  工具箱      │              设计画布                       │
│             │                                            │
│  ■ Start    │      ┌──────┐    ┌──────────┐             │
│  ■ End      │      │Start ├───►│ Review   │             │
│  ■ Task     │      └──────┘    └────┬─────┘             │
│  ■ Review   │                       │                    │
│  ■ Branch   │                  ┌────▼─────┐             │
│  ■ Junction │         ┌───────►│ Approve  │             │
│  ■ Handler  │         │        └────┬─────┘             │
│             │         │             │                    │
│             │    ┌────▼─────┐  ┌────▼─────┐             │
│             │    │ Reject   │  │ Complete │             │
│             │    └──────────┘  └──────────┘             │
├─────────────┴────────────────────────────────────────────┤
│  属性面板:Task Name | Handler | 条件 | 参与者            │
└──────────────────────────────────────────────────────────┘

2.3 核心元素详解

#### 2.3.1 Start / End 节点


<!-- 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 执行自定义逻辑:


<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(任意) | 任意一人审批即可 | 值班审批 |


<!-- 并行审批配置 -->
<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 用于实现条件分支,根据运行时的变量值决定流程走向:


<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 用于将多个分支路径合并:


<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 任务的审批人:

    
    Handler: EPM-set-reviewer
    属性:
      - user: 指定具体用户(如 "zhangsan")
      - group: 指定用户组(如 "engineering")
      - role: 指定角色(如 "manager")
      - expression: EPE 表达式动态计算
    
    
    // 通过 EPE 表达式动态指定审批人
    // 根据提交者的部门,自动选择对应部门经理
    String reviewerExpr = "EPM_find_users_by_role( submitter.get_department(), 'manager' )";
    // 在 AOD 中配置:
    // handler: EPM-set-reviewer
    // arg0: user_name = ${reviewerExpr}
    

    #### EPM-execute-action

    在任务完成时执行特定操作:

    
    Handler: EPM-execute-action
    属性:
      - action: 要执行的动作(如 "release", "checkin")
      - target: 操作目标对象
    

    #### IMAN-send-email

    发送邮件通知:

    
    Handler: IMAN-send-email
    属性:
      - recipient: 收件人(支持变量,如 ${task.owner})
      - subject: 邮件主题
      - body: 邮件正文(支持 HTML)
      - attachment: 附件(可选)
    

    3.4 自定义 Handler 开发

    #### 3.4.1 Handler 接口规范

    自定义 Handler 需要实现 EPM_custom_handler 函数:

    
    #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 注册

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

    
    <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 链:

    
    Task: "工程审核"
      │
      ├──► Handler 1: EPM-set-reviewer    (设置审批人)
      ├──► Handler 2: IMAN-send-email     (发送通知邮件)
      ├──► Handler 3: EPM_custom_validate (自定义校验)
      └──► Handler 4: EPM-execute-action  (执行后续动作)
    

    执行顺序:Handler 按定义的顺序依次执行,任一 Handler 失败可配置是否中断整个链。

    
    <!-- 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 工作流场景:

    
                        ┌──────────┐
                        │  发现问题 │
                        └─────┬────┘
                              │
                        ┌─────▼────┐
                        │ 提交 PR   │  ProblemReport
                        └─────┬────┘
                              │
                        ┌─────▼────┐
                        │ 提交 ECR  │  ChangeRequest
                        └─────┬────┘
                              │
                  ┌───────────▼───────────┐
                  │    ECR 审批流程        │
                  │  ┌──────────────────┐ │
                  │  │ 工程经理审核      │ │
                  │  └───────┬──────────┘ │
                  │          │             │
                  │    ┌─────▼─────┐       │
                  │    │ 分支判断   │       │
                  │    └─┬─────┬───┘       │
                  │  通过│     │驳回       │
                  │      ▼     ▼           │
                  │  创建ECN  退回修改      │
                  └───────────────────────┘
                              │
                  ┌───────────▼───────────┐
                  │    ECN 审批流程        │
                  │  ┌──────────────────┐ │
                  │  │ 影响分析          │ │
                  │  │ 多部门会签        │ │
                  │  │ 有效性设置        │ │
                  │  └──────────────────┘ │
                  └───────────────────────┘
                              │
                        ┌─────▼────┐
                        │ 发放生效  │
                        └──────────┘
    

    4.2 AOD 模板完整示例

    
    <?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 动态审批人策略

    在实际业务中,审批人往往不是固定的,需要根据业务数据动态计算:

    
    // 自定义 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 工作流数据审计

    
    # 通过命令行查询工作流状态
    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. 检查任务状态
    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 实现智能路由 |

    | 流程监控 | 熟练使用各类监控工具跟踪流程状态 |

    | 最佳实践 | 版本管理、异常处理、超时设置、文档记录 |


    原文链接:https://wenyiblog.top/2026/06/tc-12-workflow-engine/

    首发于文艺技术笔记(wenyiblog.top),转载请注明出处。

    posted @ 2026-06-22 19:32  软件工程师文艺  阅读(2)  评论(0)    收藏  举报