关于 approval-summarization
此技能帮助审批人员汇总 ServiceNow 待审批请求及相关上下文,以支持决策。它结合申请内容、申请人资料和历史审批信息,并整理成本、风险及合规因素。
主要功能
- 01检索待审批请求及条目详情
- 02提取申请表变量值
- 03补充申请人资料和组织信息
- 04分析相似请求的历史审批
- 05生成审批摘要与风险提示
- 06批量生成审批摘要
适用场景
- 01快速审阅待处理审批
- 02为审批人员生成定期摘要
- 03构建带上下文的审批仪表板
- 04识别高成本或异常申请
MCP 相关
说明使用 ServiceNow MCP 工具检索审批、请求、表单变量和用户资料,分析历史数据,并将摘要写入审批或请求记录。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill approval-summarization安装后在 Claude Code 中输入/approval-summarization确认已加载。
详细介绍
审批摘要
概述
此技能可生成全面的审批摘要,为审批者提供做出明智决策所需的背景信息。涵盖以下内容:
- 从
sysapproval_approver获取审批请求及其完整请求和项目背景 - 从
sys_user获取请求者的个人资料数据,包括角色、部门和经理,以丰富审批信息 - 从
sc_req_item提取变量值(表单答复),准确显示请求内容 - 分析
sc_request中类似请求的历史审批模式 - 生成包含建议信号的结构化审批摘要
- 识别每项审批的成本、风险和合规性注意事项
适用场景: 审批者需要快速获取待审批事项的全面摘要、构建审批摘要通知,或创建包含背景信息的审批仪表板时。
价值主张: 通过在单一视图中呈现所有相关背景信息,缩短审批决策时间、减少审批瓶颈,并通过呈现历史先例和风险因素提升决策质量。
前提条件
- 角色:
approver_user、itil或admin - 访问权限: 对
sysapproval_approver、sc_request、sc_req_item、sc_cat_item、item_option_new和sys_user具有读取权限 - 知识: 了解组织的审批政策和委派规则
流程
步骤 1:获取待审批事项
查询特定审批者或群组所有等待处理的审批。
使用 MCP(Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_approver
query: approver=[approver_sys_id]^state=requested
fields: sys_id,sysapproval,sysapproval.number,sysapproval.short_description,sysapproval.sys_class_name,state,approver,group,sys_created_on,due_date,expected_start,comments
limit: 25
order_by: sys_created_on
使用 REST API:
GET /api/now/table/sysapproval_approver?sysparm_query=approver=[approver_sys_id]^state=requested&sysparm_fields=sys_id,sysapproval,sysapproval.number,sysapproval.short_description,sysapproval.sys_class_name,state,approver,group,sys_created_on,due_date,comments&sysparm_limit=25&sysparm_display_value=true
获取群组审批:
Tool: SN-Query-Table
Parameters:
table_name: sysapproval_approver
query: group=[group_sys_id]^state=requested
fields: sys_id,sysapproval.number,sysapproval.short_description,state,group,sys_created_on,due_date
limit: 25
步骤 2:获取请求和请求项目的详细信息
针对每项审批,获取完整的请求和项目背景信息。
获取请求项目的详细信息:
Tool: SN-Query-Table
Parameters:
table_name: sc_req_item
query: request=[request_sys_id]
fields: sys_id,number,cat_item,cat_item.name,cat_item.short_description,cat_item.price,quantity,requested_for,requested_for.name,requested_for.department,requested_for.manager,opened_by,opened_by.name,stage,state,price,description
limit: 10
使用 REST API:
GET /api/now/table/sc_req_item?sysparm_query=request=[request_sys_id]&sysparm_fields=sys_id,number,cat_item,cat_item.name,cat_item.short_description,cat_item.price,quantity,requested_for,requested_for.name,requested_for.department,requested_for.manager,opened_by,opened_by.name,stage,state,price,description&sysparm_limit=10&sysparm_display_value=true
步骤 3:提取变量值(表单答复)
获取请求者在目录项目表单中提供的具体答复。
使用 MCP:
Tool: SN-Query-Table
Parameters:
table_name: sc_item_option_mtom
query: request_item=[ritm_sys_id]
fields: sc_item_option.item_option_new.question_text,sc_item_option.value,sc_item_option.item_option_new.name,sc_item_option.item_option_new.type
limit: 30
使用后台脚本提取清晰的变量数据:
Tool: SN-Execute-Background-Script
Parameters:
description: Extract catalog variable values for RITM
script: |
var ritmId = '[ritm_sys_id]';
var ritm = new GlideRecord('sc_req_item');
ritm.get(ritmId);
var variables = [];
var opts = new GlideRecord('sc_item_option_mtom');
opts.addQuery('request_item', ritmId);
opts.query();
while (opts.next()) {
var option = opts.sc_item_option;
var varDef = option.item_option_new;
if (varDef) {
variables.push({
question: varDef.question_text.toString(),
answer: option.value.getDisplayValue(),
variable_name: varDef.name.toString(),
mandatory: varDef.mandatory.toString() === 'true'
});
}
}
var result = {
ritm_number: ritm.number.toString(),
item_name: ritm.cat_item.getDisplayValue(),
requested_for: ritm.requested_for.getDisplayValue(),
department: ritm.requested_for.department.getDisplayValue(),
variables: variables
};
gs.info(JSON.stringify(result, null, 2));
步骤 4:获取请求者背景信息
收集有关请求者的相关信息。
使用 MCP:
Tool: SN-Query-Table
Parameters:
table_name: sys_user
query: sys_id=[requested_for_sys_id]
fields: sys_id,name,user_name,email,title,department,manager,location,cost_center,company,vip,active
limit: 1
使用 REST API:
GET /api/now/table/sys_user/[requested_for_sys_id]?sysparm_fields=sys_id,name,user_name,email,title,department,manager,location,cost_center,company,vip,active&sysparm_display_value=true
步骤 5:分析历史审批模式
查找类似的过往审批,为审批者的决策提供先例参考。
使用 MCP:
Tool: SN-Execute-Background-Script
Parameters:
description: Analyze historical approval patterns for similar requests
script: |
var catItemId = '[cat_item_sys_id]';
var departmentId = '[department_sys_id]';
var history = {
same_item_total: 0,
same_item_approved: 0,
same_item_rejected: 0,
same_dept_total: 0,
avg_approval_time_hours: 0,
recent_approvals: []
};
// Same item across all departments (last 6 months)
var ga = new GlideAggregate('sysapproval_approver');
ga.addQuery('sysapproval.sys_class_name', 'sc_req_item');
ga.addQuery('sys_created_on', '>=', gs.monthsAgoStart(6));
ga.addJoinQuery('sc_req_item', 'sysapproval', 'sys_id')
.addCondition('cat_item', catItemId);
ga.addAggregate('COUNT');
ga.addAggregate('COUNT', 'state');
ga.groupBy('state');
ga.query();
while (ga.next()) {
var state = ga.state.toString();
var count = parseInt(ga.getAggregate('COUNT'));
history.same_item_total += count;
if (state === 'approved') history.same_item_approved = count;
if (state === 'rejected') history.same_item_rejected = count;
}
// Recent approvals for same item
var recent = new GlideRecord('sysapproval_approver');
recent.addQuery('sysapproval.sys_class_name', 'sc_req_item');
recent.addQuery('state', 'approved');
recent.addQuery('sys_created_on', '>=', gs.monthsAgoStart(3));
recent.addJoinQuery('sc_req_item', 'sysapproval', 'sys_id')
.addCondition('cat_item', catItemId);
recent.orderByDesc('sys_updated_on');
recent.setLimit(5);
recent.query();
while (recent.next()) {
history.recent_approvals.push({
approved_by: recent.approver.getDisplayValue(),
date: recent.sys_updated_on.getDisplayValue(),
request: recent.sysapproval.getDisplayValue()
});
}
history.approval_rate = history.same_item_total > 0
? Math.round((history.same_item_approved / history.same_item_total) * 100) + '%'
: 'N/A';
gs.info(JSON.stringify(history, null, 2));
步骤 6:生成审批摘要
汇总所有收集到的背景信息,生成结构化摘要。
使用 MCP:
Tool: SN-Add-Work-Notes
Parameters:
table_name: sysapproval_approver
sys_id: [approval_sys_id]
work_notes: |
=== APPROVAL SUMMARY ===
REQUEST: REQ0045123 / RITM0067890
ITEM: New Laptop Request - Performance Model (Dell Latitude 7640)
PRICE: $1,800.00
REQUESTER:
- Name: John Smith ([email protected])
- Title: Senior Software Engineer
- Department: Engineering
- Manager: Jane Doe
- Location: Building A, Floor 3
- VIP: No
WHAT'S BEING REQUESTED:
- Laptop Model: Performance (Dell Latitude 7640)
- RAM: 32GB
- Storage: 1TB SSD
- Additional Software: Docker Desktop, IntelliJ IDEA
- Business Justification: "Current laptop is 4 years old and unable to run containerized development environments. Build times exceed 30 minutes affecting productivity."
- Replacing Existing: Yes (Asset Tag: LAP-2022-0456)
HISTORICAL CONTEXT:
- Same item ordered 47 times in last 6 months
- Approval rate: 94% (44 approved, 3 rejected)
- Engineering department: 18 orders (all approved)
- Recent approvals: 3 in last 30 days by IT Director
RISK ASSESSMENT:
- Cost: Within standard budget threshold ($2,500)
- Justification: Strong (productivity impact documented)
- Precedent: Consistent with approval history
- Compliance: Asset replacement documented
RECOMMENDATION SIGNAL: Approve
步骤 7:批量汇总多项审批
为有多项待审批事项的审批者生成摘要。
使用 MCP:
Tool: SN-Execute-Background-Script
Parameters:
description: Generate approval digest for approver
script: |
var approverId = '[approver_sys_id]';
var digest = { approver: '', pending_count: 0, total_value: 0, approvals: [] };
var approver = new GlideRecord('sys_user');
approver.get(approverId);
digest.approver = approver.name.toString();
var ga = new GlideRecord('sysapproval_approver');
ga.addQuery('approver', approverId);
ga.addQuery('state', 'requested');
ga.orderBy('sys_created_on');
ga.query();
while (ga.next()) {
digest.pending_count++;
var ritm = new GlideRecord('sc_req_item');
if (ritm.get(ga.sysapproval.toString())) {
var price = parseFloat(ritm.price) || 0;
digest.total_value += price;
digest.approvals.push({
approval_id: ga.sys_id.toString(),
request_number: ritm.request.getDisplayValue(),
ritm_number: ritm.number.toString(),
item: ritm.cat_item.getDisplayValue(),
requested_for: ritm.requested_for.getDisplayValue(),
department: ritm.requested_for.department.getDisplayValue(),
price: price,
waiting_since: ga.sys_created_on.getDisplayValue()
});
}
}
digest.total_value = '$' + digest.total_value.toFixed(2);
gs.info(JSON.stringify(digest, null, 2));
工具用法
MCP 工具参考
| 工具 | 使用场景 |
|---|---|
SN-Query-Table | 查询审批、请求、项目、变量和用户个人资料 |
SN-Get-Record | 获取单条审批或请求记录 |
SN-Natural-Language-Search | 根据描述关键词查找请求或项目 |
SN-Execute-Background-Script | 批量分析、历史模式分析和摘要生成 |
SN-Add-Work-Notes | 将审批摘要发布到审批或请求记录 |
REST API 参考
| 端点 | 方法 | 用途 |
|---|---|---|
/api/now/table/sysapproval_approver | GET | 查询待审批事项 |
/api/now/table/sc_request | GET | 获取父请求的详细信息 |
/api/now/table/sc_req_item | GET | 获取请求项目的详细信息和变量 |
/api/now/table/sc_cat_item | GET | 查找目录项目定义 |
/api/now/table/sc_item_option_mtom | GET | 从请求中提取变量值 |
/api/now/table/sys_user | GET | 获取请求者的个人资料信息 |
最佳实践
- 醒目展示业务依据: 依据变量对审批人来说是最重要的字段;始终将其放在最前面
- 清晰展示总成本: 包含单价、数量、经常性费用以及任何基于变量的定价
- 提供历史背景: 审批通过率和先例数据能显著降低决策的不确定性
- 标记异常情况: 请求异常时(首次申请的项目、超出常规成本、VIP 请求人),应予以突出显示
- 计算等待时间: 显示审批已挂起多久,以提高紧迫感
- 按优先级分组: 审批摘要应按等待时长、成本或业务重要性排序,而非按创建日期排序
- 遵守数据访问权限: 仅包含审批人有权查看的信息
- 自动生成摘要: 为审批量较大的经理安排每日或每日两次生成审批摘要
故障排除
未找到变量值
原因: sc_item_option_mtom 联接未返回预期的变量值
解决方案: 部分项目直接使用 sc_item_option。请尝试使用 request_item=[ritm_sys_id] 查询 sc_item_option。对于较早的请求,变量的存储方式可能有所不同。
审批记录显示了错误的请求
原因: 审批记录上的 sysapproval 字段可能引用的是请求(REQ),而非请求项目(RITM)
解决方案: 检查 sysapproval.sys_class_name,确定审批关联的是 sc_request 还是 sc_req_item,并据此调整联接。
历史数据不完整
原因: 旧的审批记录可能已归档或清除
解决方案: 调整历史查询中的日期范围。检查实例是否对 sysapproval_approver 使用了表轮换或归档。
未填充请求人部门
原因: 用户记录上的 department 字段为空
解决方案: 使用 company 或 cost_center 作为组织背景信息。检查用户的经理层级是否能提供部门信息。
示例
示例 1:单项审批摘要
输入:“总结审批 SYSAPPR0012345”
**输出:**结构化摘要,包含请求详情、请求人档案、变量值、同一项目的历史审批通过率,以及基于先例和策略合规性的建议信号。
示例 2:每日审批摘要
输入:“为经理 Jane Doe 生成审批摘要”
输出:
APPROVAL DIGEST - Jane Doe
Date: 2026-03-19
Pending Approvals: 4
Total Value: $7,450.00
1. REQ0045123 / RITM0067890 - New Laptop ($1,800) - John Smith, Engineering - 2 days pending
2. REQ0045130 / RITM0067897 - Software License x5 ($2,500) - Lisa Park, Marketing - 1 day pending
3. REQ0045135 / RITM0067902 - Conference Travel ($2,400) - Mike Johnson, Sales - 4 hours pending
4. REQ0045138 / RITM0067905 - Desk Phone ($750) - Sarah Kim, HR - 1 hour pending
示例 3:带风险标记的高价值审批
Tool: SN-Get-Record
Parameters:
table_name: sysapproval_approver
sys_id: [approval_sys_id]
# Result analysis flags:
# - Cost exceeds $5,000 threshold (requires VP approval)
# - First time this item has been ordered by this department
# - Requester is a contractor (non-FTE)
# - No business justification provided (mandatory field bypass)
相关技能
catalog/approval-workflows- 配置审批路由规则catalog/request-fulfillment- 审批后的履行处理catalog/item-creation- 配置目录项目catalog/catalog-item-generation- 根据描述生成项目admin/workflow-creation- 构建审批工作流逻辑