关于 workflow-creation
用于通过 ServiceNow API 或 MCP 以代码方式创建完整工作流的技能,面向需要自动化部署、批量生成或迁移工作流的管理员。它涵盖工作流版本、活动、条件、转换和发布流程。
主要功能
- 01创建工作流及其版本
- 02添加带脚本的活动
- 03设置分支条件与转换
- 04发布并验证工作流
适用场景
- 01在 CI/CD 部署中创建工作流
- 02按模板批量生成相似工作流
- 03将工作流定义纳入 Git 版本控制
- 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 字段中。这使得完全以编程方式创建工作流成为可能,步骤如下:
- 创建工作流结构(wf_workflow、wf_workflow_version)
- 创建包含嵌入脚本的活动(wf_activity)
- 使用转换连接活动(wf_transition、wf_condition)
- 发布工作流版本
前置条件
- 角色:
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)
测试工作流
发布前测试
- 验证结构:
Tool: SN-Query-Table
Parameters:
table_name: wf_activity
query: workflow_version=[version_sys_id]
fields: name,x,y
- 验证转换:
Tool: SN-Query-Table
Parameters:
table_name: wf_transition
query: from.workflow_version=[version_sys_id]
fields: from.name,to.name,condition.name
- 使用未发布版本进行测试:
测试期间保持
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_workflow | POST | 创建工作流 |
/api/now/table/wf_workflow_version | POST | 创建版本 |
/api/now/table/wf_activity | POST | 创建活动 |
/api/now/table/wf_transition | POST | 创建转换 |
/api/now/table/wf_condition | POST | 创建条件 |
/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 中
- 纳入更新集: 始终在有活动更新集时创建工作流
故障排除
工作流未触发
症状: 工作流已创建但未执行 原因: 触发条件缺失或不正确,或者工作流未激活/发布 解决方案:
- 验证工作流版本上的
active: true - 验证工作流版本上的
published: true - 检查触发条件是否符合记录条件
- 验证
after_business_rules设置 - 检查工作流是否分配给了正确的表
活动未执行
症状: 工作流已启动,但跳过了特定活动 原因: 缺少转换或条件不正确 解决方案:
- 查询转换:
from=[activity_sys_id] - 验证条件是否与上一个活动的
answer值匹配 - 检查活动的
input字段中是否有有效脚本
工作流卡住
症状: 工作流上下文一直处于“executing”状态 原因: 活动脚本错误或无限循环 解决方案:
- 检查 System Logs 中的脚本错误
- 查询 wf_history,查看活动执行详情
- 检查活动脚本中的错误
- 如有需要,取消卡住的上下文:
Tool: SN-Update-Record
Parameters:
table_name: wf_context
sys_id: [context_sys_id]
data:
state: cancelled
转换条件不匹配
症状: 工作流走错路径 原因: 条件语法或 answer 值不匹配 解决方案:
- 验证条件格式:
answer=value(不加引号) - 检查活动脚本是否正确设置了
answer变量 - 检查条件顺序(order 越小,优先级越高)
- 为默认/回退路径使用
else_flag: true
活动中的脚本错误
症状: 活动因脚本错误而失败 原因: JavaScript 或 API 用法无效 解决方案:
- 先在后台脚本中测试脚本
- 检查变量作用域(
current、workflow可用) - 验证 GlideRecord 查询是否返回结果
- 添加错误处理:
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- 事件处理工作流