mcpField
W
workflow-creation

workflow-creation

github.com/happy-technologies-llc开发4143 次安装4 天前更新
代码仓库

关于 workflow-creation

用于通过 ServiceNow API 或 MCP 以代码方式创建完整工作流的技能,面向需要自动化部署、批量生成或迁移工作流的管理员。它涵盖工作流版本、活动、条件、转换和发布流程。

主要功能

  1. 01创建工作流及其版本
  2. 02添加带脚本的活动
  3. 03设置分支条件与转换
  4. 04发布并验证工作流

适用场景

  1. 01在 CI/CD 部署中创建工作流
  2. 02按模板批量生成相似工作流
  3. 03将工作流定义纳入 Git 版本控制
  4. 04在不同实例间重建工作流

MCP 相关

说明如何使用 ServiceNow MCP 工具查询活动类型、创建工作流和活动、建立转换并发布工作流。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill workflow-creation

安装后在 Claude Code 中输入/workflow-creation确认已加载。

详细介绍

以编程方式创建工作流

概述

此技能可让你完全通过 API/MCP 创建完整的 ServiceNow 工作流,无需使用可视化 Workflow Editor。这对于以下场景至关重要:

  • 自动化流水线 - 在 CI/CD 部署过程中创建工作流
  • 模板化解决方案 - 从模板生成标准化工作流
  • 批量创建 - 以编程方式构建多个相似的工作流
  • 版本控制 - 将工作流定义作为代码存储在 Git 中
  • 环境迁移 - 在不同实例中重新创建工作流

关键发现: 活动将其逻辑作为 JavaScript 代码存储在 input 字段中。这使得完全以编程方式创建工作流成为可能,步骤如下:

  1. 创建工作流结构(wf_workflow、wf_workflow_version)
  2. 创建包含嵌入脚本的活动(wf_activity)
  3. 使用转换连接活动(wf_transition、wf_condition)
  4. 发布工作流版本

前置条件

  • 角色: admin 或 workflow_admin
  • 权限: 对工作流表(wf_*)拥有写入权限
  • 知识: 基本了解工作流概念
  • 环境: 开发或测试实例(切勿先在生产环境中创建工作流)
  • 相关技能: admin/update-set-management - 在更新集中捕获工作流

表架构

了解工作流表对于以编程方式创建工作流至关重要。

核心表
wf_workflow (base definition)
    |
    +-- wf_workflow_version (published versions)
            |
            +-- wf_activity (activities with scripts)
            |       |
            |       +-- wf_element_definition (activity types)
            |       +-- wf_stage (optional stages)
            |
            +-- wf_transition (connects activities)
            |       |
            |       +-- wf_condition (transition logic)
            |
            +-- wf_condition (workflow-level conditions)
关键关系
表用途关键字段
wf_workflow基础工作流定义name、table、description
wf_workflow_version带版本的工作流workflow、table、start、published
wf_activity单个活动workflow_version、input、x、y
wf_transition活动连接from、to、condition
wf_condition转换条件activity、condition、else_flag
wf_element_definition活动类型定义name、default_input

操作步骤

步骤 1:发现活动类型

首先,识别可用的活动类型(wf_element_definition)。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: wf_element_definition
  query: active=true
  fields: sys_id,name,category,description
  limit: 50

常见活动类型:

sys_id名称用例
0a6c97790a0a0b2756919eb960284334通知发送电子邮件/短信
1ca8d7cf0a0a0b265e9a000c2c08248c设置值设置字段值
35433da80a0a029a0028c639a1e51eb4审批 - 用户用户审批
354e911f0a0a029a00e6a0e6ad74206f审批 - 组组审批
283e8bb80a2581021d036a052ffc3433审批协调器多重审批容器
38891b6f0a0a0b1e00efdfdd77602027目录任务创建目录任务
3961a1da0a0a0b5c00ecd84822f70d85计时器等待/延迟
396807940a0a0b5c00afd9f67d9fd7a2日志消息调试日志
5994b389c0a80011000e64de81b1864c子流程调用另一个工作流
7c9a2ba9c0a801650021ada408de0ebd汇合等待多条路径
7a8ea386c0a80066179bc1f5186e1d2b回滚返回到较早的活动

注意: 自定义脚本活动可以完全省略 activity_definition。

步骤 2:创建基础工作流

创建工作流容器记录。

使用 MCP(推荐):

Tool: SN-Create-Workflow
Parameters:
  name: "P1 Incident Auto-Assignment"
  table: "incident"
  description: "Auto-assign P1 incidents to on-call engineer"
  condition: "priority=1^state=1"

使用 SN-Create-Record:

Tool: SN-Create-Record
Parameters:
  table_name: wf_workflow
  data:
    name: "P1 Incident Auto-Assignment"
    description: "Auto-assign P1 incidents to on-call engineer"
    template: false
    access: "public"

重要: 创建后,name 和 table 字段将变为只读。请谨慎选择。

保存 sys_id: workflow_sys_id

步骤 3:创建工作流版本

创建一个用于存放实际工作流逻辑的版本。

使用 MCP:

Tool: SN-Create-Record
Parameters:
  table_name: wf_workflow_version
  data:
    name: "P1 Incident Auto-Assignment"
    workflow: [workflow_sys_id]
    table: "incident"
    condition: "priority=1^state=1"
    active: true
    published: false
    order: 100
    run_multiple: false
    after_business_rules: true

关键字段:

字段用途说明
table目标表必填 - 用于触发此工作流的记录
condition触发条件编码查询格式
active是否启用设置为 true 以运行工作流
published是否已发布初始设置为 false,测试后再发布
run_multiple是否允许并发实例通常为 false
after_business_rules运行时机通常为 true

保存 sys_id: version_sys_id

步骤 4:创建活动

创建每个活动,并嵌入其脚本。

活动 1:开始活动

使用 MCP(推荐):

Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Check On-Call Engineer"
  x: 100
  y: 100
  script: |
    // Find on-call engineer
    var oncall = new GlideRecord('on_call_rotation');
    oncall.addQuery('active', true);
    oncall.addQuery('group', current.assignment_group);
    oncall.query();
    if (oncall.next()) {
      workflow.scratchpad.oncall_engineer = oncall.user.toString();
      gs.info('Found on-call: ' + oncall.user.name);
    } else {
      workflow.scratchpad.oncall_engineer = '';
      gs.warn('No on-call engineer found');
    }

使用 SN-Create-Record:

Tool: SN-Create-Record
Parameters:
  table_name: wf_activity
  data:
    name: "Check On-Call Engineer"
    workflow_version: [version_sys_id]
    x: 100
    y: 100
    width: 150
    height: 80
    input: |
      // Script content here...

保存 sys_id: activity_start_id

活动 2:决策/分支活动

Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Assign to On-Call"
  x: 250
  y: 100
  script: |
    // Assign incident based on on-call lookup
    if (workflow.scratchpad.oncall_engineer) {
      current.assigned_to = workflow.scratchpad.oncall_engineer;
      current.state = 2;  // In Progress
      current.work_notes = 'Auto-assigned to on-call engineer by workflow';
      current.update();
      answer = 'assigned';
      gs.info('Assigned to: ' + current.assigned_to.name);
    } else {
      answer = 'no_oncall';
      gs.warn('Could not assign - no on-call engineer');
    }

保存 sys_id: activity_assign_id

活动 3:通知活动

Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Send Notification"
  x: 400
  y: 100
  type: "notification"
  script: |
    // Send email notification
    var email = new GlideEmailOutbound();
    email.setSubject('P1 Incident Assigned: ' + current.number);
    email.setFrom('[email protected]');
    email.addAddress(current.assigned_to.email);
    email.setBody('You have been assigned P1 incident: ' + current.number + '\n' +
                  'Priority: 1\n' +
                  'Short Description: ' + current.short_description);
    email.send();
    gs.info('Notification sent to: ' + current.assigned_to.email);

保存 sys_id: activity_notify_id

活动 4:升级活动(分支路径)

Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Escalate to Manager"
  x: 250
  y: 250
  script: |
    // Escalate to manager
    var manager = current.assignment_group.manager;
    if (manager) {
      current.assigned_to = manager;
      current.escalation = 1;
      current.work_notes = 'Escalated to manager - no on-call engineer available';
      current.update();
      gs.info('Escalated to manager: ' + manager.name);
    }

保存 sys_id: activity_escalate_id

步骤 5:创建转换条件

为分支路径定义条件。

条件 1:“已分配”路径

Tool: SN-Create-Record
Parameters:
  table_name: wf_condition
  data:
    activity: [activity_assign_id]
    name: "Assigned Successfully"
    short_description: "On-call engineer found and assigned"
    condition: "answer=assigned"
    order: 1

保存 sys_id: condition_assigned_id

条件 2:“无值班人员”路径

Tool: SN-Create-Record
Parameters:
  table_name: wf_condition
  data:
    activity: [activity_assign_id]
    name: "No On-Call"
    short_description: "No on-call engineer found"
    condition: "answer=no_oncall"
    order: 2

其他条件(默认路径):

Tool: SN-Create-Record
Parameters:
  table_name: wf_condition
  data:
    activity: [activity_assign_id]
    name: "Default"
    short_description: "Default path"
    else_flag: true
    order: 99
步骤 6:创建转换

使用转换将活动连接起来。

使用 MCP(推荐):

Tool: SN-Create-Transition
Parameters:
  from_activity_id: [activity_start_id]
  to_activity_id: [activity_assign_id]

转换 1:开始到分配

Tool: SN-Create-Record
Parameters:
  table_name: wf_transition
  data:
    from: [activity_start_id]
    to: [activity_assign_id]
    order: 1

转换 2:分配到通知(有条件)

Tool: SN-Create-Record
Parameters:
  table_name: wf_transition
  data:
    from: [activity_assign_id]
    to: [activity_notify_id]
    condition: [condition_assigned_id]
    order: 1

转换 3:分配到升级(有条件)

Tool: SN-Create-Record
Parameters:
  table_name: wf_transition
  data:
    from: [activity_assign_id]
    to: [activity_escalate_id]
    condition: [condition_no_oncall_id]
    order: 2

转换 4:升级到通知(升级后)

Tool: SN-Create-Record
Parameters:
  table_name: wf_transition
  data:
    from: [activity_escalate_id]
    to: [activity_notify_id]
    order: 1
步骤 7:设置开始活动并发布

使用开始活动更新工作流版本并发布。

使用 MCP(推荐):

Tool: SN-Publish-Workflow
Parameters:
  workflow_version_id: [version_sys_id]
  start_activity_id: [activity_start_id]

使用 SN-Update-Record:

Tool: SN-Update-Record
Parameters:
  table_name: wf_workflow_version
  sys_id: [version_sys_id]
  data:
    start: [activity_start_id]
    published: true
步骤 8:验证工作流

查询以验证工作流结构。

检查活动:

Tool: SN-Query-Table
Parameters:
  table_name: wf_activity
  query: workflow_version=[version_sys_id]
  fields: sys_id,name,x,y

检查转换:

Tool: SN-Query-Table
Parameters:
  table_name: wf_transition
  query: from.workflow_version=[version_sys_id]
  fields: sys_id,from.name,to.name,condition.name

检查工作流版本:

Tool: SN-Query-Table
Parameters:
  table_name: wf_workflow_version
  query: sys_id=[version_sys_id]
  fields: name,table,start.name,published,active

工作流上下文与脚本编写

活动脚本中的可用变量
// The current record being processed
current

// Workflow scratchpad - share data between activities
workflow.scratchpad.your_variable = 'value';

// Activity result - determines which transition to follow
answer = 'approved';  // String that matches condition

// Current activity object
activity

// Workflow context
workflow.name
workflow.context.sys_id
常见脚本模式

在活动之间传递数据:

// Activity 1: Store data
workflow.scratchpad.user_tier = current.u_tier;
workflow.scratchpad.requires_approval = true;
workflow.scratchpad.approval_reasons = [];

// Activity 2: Use stored data
if (workflow.scratchpad.requires_approval) {
  var reasons = workflow.scratchpad.approval_reasons;
  // Process reasons...
}

使用 Answer 变量的分支逻辑:

// Set answer to determine which transition fires
if (current.priority == 1) {
  answer = 'high_priority';
} else if (current.priority == 2) {
  answer = 'medium_priority';
} else {
  answer = 'low_priority';
}
// Create transitions with conditions: answer=high_priority, etc.

错误处理:

try {
  var gr = new GlideRecord('incident');
  gr.get(current.sys_id);
  // Processing...
  answer = 'success';
} catch(e) {
  gs.error('Workflow error in ' + activity.name + ': ' + e.message);
  workflow.scratchpad.error_message = e.message;
  answer = 'error';
}

用于调试的日志记录:

gs.info('[Workflow: ' + workflow.name + '] Activity: ' + activity.name);
gs.info('[Workflow] Processing incident: ' + current.number);
gs.info('[Workflow] Scratchpad data: ' + JSON.stringify(workflow.scratchpad));

活动类型示例

审批 - 用户
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Manager Approval"
  x: 300
  y: 150
  type: "35433da80a0a029a0028c639a1e51eb4"
  script: |
    // Create approval request for manager
    var approval = new GlideRecord('sysapproval_approver');
    approval.initialize();
    approval.document_id = current.sys_id;
    approval.source_table = current.getTableName();
    approval.approver = current.opened_by.manager;
    approval.state = 'requested';
    approval.insert();
    gs.info('Approval created for: ' + current.opened_by.manager.name);
审批 - 组
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "CAB Approval"
  x: 300
  y: 150
  type: "354e911f0a0a029a00e6a0e6ad74206f"
  script: |
    // Create group approval request
    var approval = new GlideRecord('sysapproval_group');
    approval.initialize();
    approval.document_id = current.sys_id;
    approval.source_table = current.getTableName();
    approval.assignment_group = 'CAB';  // sys_id or name
    approval.state = 'requested';
    approval.insert();
目录任务
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Create Fulfillment Task"
  x: 350
  y: 150
  type: "38891b6f0a0a0b1e00efdfdd77602027"
  script: |
    // Create catalog task
    var task = new GlideRecord('sc_task');
    task.initialize();
    task.request_item = current.sys_id;
    task.short_description = 'Fulfill: ' + current.short_description;
    task.assignment_group = current.assignment_group;
    task.state = 1;  // Open
    var taskId = task.insert();
    workflow.scratchpad.task_sys_id = taskId;
    gs.info('Created task: ' + task.number);
计时器/等待
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Wait 24 Hours"
  x: 400
  y: 150
  type: "3961a1da0a0a0b5c00ecd84822f70d85"
  script: |
    // Timer configuration is typically in vars field
    // This activity waits before proceeding
    gs.info('Timer started - will continue in 24 hours');
通知
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Send Email"
  x: 450
  y: 150
  type: "0a6c97790a0a0b2756919eb960284334"
  script: |
    // Send notification
    var email = new GlideEmailOutbound();
    email.setSubject('Request Update: ' + current.number);
    email.setFrom('[email protected]');
    email.addAddress(current.opened_by.email);
    email.setBody('Your request ' + current.number + ' has been processed.\n\n' +
                  'Status: ' + current.state.getDisplayValue());
    email.send();
设置值
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Update Record Status"
  x: 500
  y: 150
  type: "1ca8d7cf0a0a0b265e9a000c2c08248c"
  script: |
    // Set field values
    current.state = 3;  // Closed
    current.close_code = 'Resolved';
    current.close_notes = 'Completed via workflow';
    current.closed_at = gs.nowDateTime();
    current.update();
汇合(等待多个路径)
Tool: SN-Create-Activity
Parameters:
  workflow_version_id: [version_sys_id]
  name: "Wait for All Approvals"
  x: 400
  y: 200
  type: "7c9a2ba9c0a801650021ada408de0ebd"
  script: |
    // Join waits for all incoming transitions to complete
    gs.info('All paths completed - continuing workflow');

画布布局最佳实践

坐标系
Origin (0,0)
    +-----------------------------------------> X (horizontal)
    |
    |   [Start]       [Process]      [End]
    |   (100,100)     (250,100)      (400,100)
    |
    |                 [Branch A]
    |                 (250,200)
    |
    |                 [Branch B]
    |                 (250,300)
    |
    v
    Y (vertical)
建议间距
  • 开始位置: x=100,y=100
  • 水平间距: 顺序活动之间相隔 150-200 像素
  • 垂直间距: 分支路径之间相隔 100-150 像素
  • 标准尺寸: width=150,height=80
布局模式

线性流程:

[Start] ---> [Process] ---> [End]
(100,100)    (250,100)      (400,100)

决策分支:

                +---> [Yes Path] --+
               /     (250,100)      \
[Decision] ---+                      +---> [Join]
(100,150)      \                    /     (400,150)
                +---> [No Path] ---+
                     (250,200)

并行路径:

           +---> [Task 1] ---+
          /     (200,100)     \
[Start] -+                     +---> [Join] ---> [End]
(100,150) \                   /     (400,150)    (550,150)
           +---> [Task 2] ---+
                (200,200)

测试工作流

发布前测试
  1. 验证结构:
Tool: SN-Query-Table
Parameters:
  table_name: wf_activity
  query: workflow_version=[version_sys_id]
  fields: name,x,y
  1. 验证转换:
Tool: SN-Query-Table
Parameters:
  table_name: wf_transition
  query: from.workflow_version=[version_sys_id]
  fields: from.name,to.name,condition.name
  1. 使用未发布版本进行测试: 测试期间保持 published: false。工作流仍可用于手动测试。
运行时调试

启用工作流日志记录:

// Add to activities for debugging
gs.info('[WF-DEBUG] Activity: ' + activity.name);
gs.info('[WF-DEBUG] Current: ' + current.number);
gs.info('[WF-DEBUG] Scratchpad: ' + JSON.stringify(workflow.scratchpad));

查看工作流上下文:

Tool: SN-Query-Table
Parameters:
  table_name: wf_context
  query: workflow_version=[version_sys_id]^state=executing
  fields: sys_id,state,started,scratchpad

查看活动历史记录:

Tool: SN-Query-Table
Parameters:
  table_name: wf_history
  query: context.workflow_version=[version_sys_id]
  fields: activity.name,state,started,ended,output
  orderBy: started
常见调试查询

查找失败的上下文:

Tool: SN-Query-Table
Parameters:
  table_name: wf_context
  query: workflow_version=[version_sys_id]^state=cancelled
  fields: sys_id,state,result,scratchpad

查找卡住的活动:

Tool: SN-Query-Table
Parameters:
  table_name: wf_executing
  query: context.workflow_version=[version_sys_id]
  fields: activity.name,state,started

版本控制与发布

工作流版本控制

创建新版本:

Tool: SN-Create-Record
Parameters:
  table_name: wf_workflow_version
  data:
    name: "P1 Incident Auto-Assignment v2"
    workflow: [workflow_sys_id]
    table: "incident"
    condition: "priority=1^state=1"
    active: true
    published: false

然后为新版本重新创建活动和转换。

停用旧版本
Tool: SN-Update-Record
Parameters:
  table_name: wf_workflow_version
  sys_id: [old_version_sys_id]
  data:
    active: false
发布新版本
Tool: SN-Update-Record
Parameters:
  table_name: wf_workflow_version
  sys_id: [new_version_sys_id]
  data:
    published: true

工具用法摘要

MCP 工具(推荐)
工具用途
SN-Create-Workflow一次调用即可创建包含活动的工作流
SN-Create-Activity添加单个活动
SN-Create-Transition将活动连接起来
SN-Publish-Workflow设置开始活动并发布
SN-Create-Record创建通用记录
SN-Update-Record更新现有记录
SN-Query-Table查询工作流表
REST API(替代方案)
端点方法用途
/api/now/table/wf_workflowPOST创建工作流
/api/now/table/wf_workflow_versionPOST创建版本
/api/now/table/wf_activityPOST创建活动
/api/now/table/wf_transitionPOST创建转换
/api/now/table/wf_conditionPOST创建条件
/api/now/table/wf_workflow_version/{id}PATCH更新/发布

最佳实践

  • 命名规范: 使用 [Process] - [Trigger] 格式(例如,“Approval - High Priority Change”)
  • 活动名称: 使用动词 + 名词格式(例如,“Check Approval Status”“Send Notification”)
  • 从简单开始: 先创建 2-3 个活动,再逐步增加复杂度
  • 尽早测试: 发布前使用 published: false 进行测试
  • 添加日志: 加入 gs.info() 语句以便调试
  • 错误处理: 使用 try-catch 块包装脚本
  • 使用 Scratchpad: 通过 workflow.scratchpad 传递数据,而非使用全局变量
  • 记录条件: 为转换条件使用描述性名称
  • 版本控制: 将工作流定义以 JSON/代码形式存储在 Git 中
  • 纳入更新集: 始终在有活动更新集时创建工作流

故障排除

工作流未触发

症状: 工作流已创建但未执行 原因: 触发条件缺失或不正确,或者工作流未激活/发布 解决方案:

  1. 验证工作流版本上的 active: true
  2. 验证工作流版本上的 published: true
  3. 检查触发条件是否符合记录条件
  4. 验证 after_business_rules 设置
  5. 检查工作流是否分配给了正确的表
活动未执行

症状: 工作流已启动,但跳过了特定活动 原因: 缺少转换或条件不正确 解决方案:

  1. 查询转换:from=[activity_sys_id]
  2. 验证条件是否与上一个活动的 answer 值匹配
  3. 检查活动的 input 字段中是否有有效脚本
工作流卡住

症状: 工作流上下文一直处于“executing”状态 原因: 活动脚本错误或无限循环 解决方案:

  1. 检查 System Logs 中的脚本错误
  2. 查询 wf_history,查看活动执行详情
  3. 检查活动脚本中的错误
  4. 如有需要,取消卡住的上下文:
Tool: SN-Update-Record
Parameters:
  table_name: wf_context
  sys_id: [context_sys_id]
  data:
    state: cancelled
转换条件不匹配

症状: 工作流走错路径 原因: 条件语法或 answer 值不匹配 解决方案:

  1. 验证条件格式:answer=value(不加引号)
  2. 检查活动脚本是否正确设置了 answer 变量
  3. 检查条件顺序(order 越小,优先级越高)
  4. 为默认/回退路径使用 else_flag: true
活动中的脚本错误

症状: 活动因脚本错误而失败 原因: JavaScript 或 API 用法无效 解决方案:

  1. 先在后台脚本中测试脚本
  2. 检查变量作用域(current、workflow 可用)
  3. 验证 GlideRecord 查询是否返回结果
  4. 添加错误处理:
try {
  // Script logic
} catch(e) {
  gs.error('Activity error: ' + e.message);
  answer = 'error';
}

示例

示例 1:简单审批工作流
Tool: SN-Create-Workflow
Parameters:
  name: "Simple Approval"
  table: "change_request"
  description: "Basic change approval workflow"
  condition: "type=normal"
  activities:
    - name: "Request Approval"
      x: 100
      y: 100
      script: |
        var approval = new GlideRecord('sysapproval_approver');
        approval.initialize();
        approval.document_id = current.sys_id;
        approval.source_table = 'change_request';
        approval.approver = current.assignment_group.manager;
        approval.state = 'requested';
        approval.insert();
        workflow.scratchpad.approval_id = approval.sys_id;
    - name: "Check Approval Status"
      x: 250
      y: 100
      script: |
        var approval = new GlideRecord('sysapproval_approver');
        approval.get(workflow.scratchpad.approval_id);
        answer = approval.state.toString();
    - name: "Approved Actions"
      x: 400
      y: 50
      script: |
        current.state = 'authorize';
        current.work_notes = 'Change approved by workflow';
        current.update();
    - name: "Rejected Actions"
      x: 400
      y: 150
      script: |
        current.state = 'cancelled';
        current.work_notes = 'Change rejected by workflow';
        current.update();
  transitions:
    - from: 0
      to: 1
    - from: 1
      to: 2
      condition: "answer=approved"
    - from: 1
      to: 3
      condition: "answer=rejected"
示例 2:多级审批

创建一个并行审批工作流,并在完成前汇合。

步骤 1:创建基础结构

Tool: SN-Create-Record
Parameters:
  table_name: wf_workflow
  data:
    name: "Multi-Level Approval"
    description: "Requires both manager and director approval"

步骤 2:创建活动 (创建 6 个活动:Start、Manager Approval、Director Approval、Join、Approved、Rejected)

步骤 3:创建并行转换

// Start -> Manager Approval
// Start -> Director Approval (parallel path)
// Manager Approval -> Join
// Director Approval -> Join
// Join -> Approved (if all approved)
// Join -> Rejected (if any rejected)
示例 3:事件自动路由
// Complete workflow for routing incidents based on category

// 1. Create workflow
SN-Create-Record: wf_workflow
  name: "Incident Auto-Router"
  description: "Route incidents to appropriate team"

// 2. Create version
SN-Create-Record: wf_workflow_version
  table: "incident"
  condition: "active=true^assignment_groupISEMPTY"

// 3. Create routing activity
SN-Create-Activity:
  name: "Route by Category"
  script: |
    var category = current.category.toString();
    var routing = {
      'network': 'Network Support',
      'hardware': 'Hardware Support',
      'software': 'Software Support',
      'database': 'Database Team'
    };
    var group = routing[category] || 'Service Desk';
    var gr = new GlideRecord('sys_user_group');
    gr.addQuery('name', group);
    gr.query();
    if (gr.next()) {
      current.assignment_group = gr.sys_id;
      current.work_notes = 'Auto-routed to ' + group;
      current.update();
      answer = 'routed';
    } else {
      answer = 'no_group';
    }

相关技能

  • admin/update-set-management - 将工作流纳入更新集
  • admin/application-scope - 受限范围应用中的工作流
  • itsm/change-management - 变更请求工作流
  • itsm/incident-lifecycle - 事件处理工作流

参考资料

评论

支持 Markdown