v1.0.1: 奖助学金评定逻辑防伪校验 - 初版骨架

基于匠厂 skill-template 主仓 v1.0.108 派生的业务技能。

核心业务:
- 辅导员在汇总表中批量勾选候选人后自动触发
- 多源数据一致性校验(自报家庭年收入 vs 一卡通消费 vs 生源地 GDP)
- 横向排名可疑检测(综测 vs 成绩排名差值过大)
- 历史重复资助排查(本学年累计金额超限)

输出形态:
- 《奖助评定复核建议清单》HTML 报告
- 高风险个案推送至辅导员工作台
- 复核结果留痕(核查说明 + 终审结论)

预期提效:资助中心抽查工作量减少 80%;因认定不公引发的学生投诉事件下降 60%。

业务行生命周期:待审 → 已标注 → 已复核(保留 / 取消 / 调减)/ 已驳回 / 已撤回

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-09-14 12:19:13 +08:00
commit 3f87f223f9
21 changed files with 1548 additions and 0 deletions

153
assets/actions.json Normal file
View File

@@ -0,0 +1,153 @@
{
"schemaVersion": 1,
"skill": "verify-scholarship-fraud-sas",
"actions": [
{
"id": "health",
"label": "运行检查",
"description": "检查技能运行环境、学生工作部 / 一卡通中心 / 教务系统 API 连通性、生源地 GDP 库完整性。",
"placements": ["skill-detail", "agent"],
"executionProfile": "sync",
"entrypoint": {
"type": "cli",
"command": "health",
"args": []
}
},
{
"id": "version",
"label": "查看版本",
"description": "返回技能版本和机器标识。",
"placements": ["skill-detail"],
"executionProfile": "sync",
"entrypoint": {
"type": "cli",
"command": "version",
"args": []
}
},
{
"id": "config-path",
"label": "查看配置位置",
"description": "返回技能配置文件位置。",
"placements": ["skill-detail"],
"executionProfile": "sync",
"entrypoint": {
"type": "cli",
"command": "config-path",
"args": []
}
},
{
"id": "verify-candidate",
"label": "AI 校验",
"description": "对一位候选人执行四类异常检测(多源数据一致性 + 横向排名 + 历史重复资助),返回异常标签与详情。",
"placements": ["row", "agent"],
"executionProfile": "sync",
"bind": {
"tables": ["候选人汇总表"],
"selectionMode": "required",
"labelColumn": "学生姓名"
},
"entrypoint": {
"type": "cli",
"command": "verify-candidate",
"args": ["--candidate-id", "{row.候选人ID}"]
}
},
{
"id": "batch-verify-class",
"label": "批量校验",
"description": "批量校验某班级或某专业下所有候选人,按顺序逐位执行并汇总结果。",
"placements": ["batch", "agent"],
"executionProfile": "async",
"bind": {
"tables": ["候选人汇总表"],
"selectionMode": "optional"
},
"entrypoint": {
"type": "cli",
"command": "batch-verify-class",
"args": ["--class-id", "{form.class_id}"]
}
},
{
"id": "mark-needs-review",
"label": "标记为待复核",
"description": "手动将候选人标记为待复核,推送通知给辅导员工作台。",
"placements": ["row"],
"executionProfile": "sync",
"bind": {
"tables": ["候选人汇总表"],
"selectionMode": "required",
"labelColumn": "学生姓名"
},
"entrypoint": {
"type": "cli",
"command": "mark-needs-review",
"args": ["--candidate-id", "{row.候选人ID}", "--reason", "{form.reason}"]
}
},
{
"id": "submit-review-result",
"label": "提交复核结果",
"description": "辅导员填写核查说明后提交复核结果(含最终结论:保留 / 取消 / 调减资助)。",
"placements": ["row"],
"executionProfile": "sync",
"bind": {
"tables": ["复核建议清单"],
"selectionMode": "required",
"labelColumn": "学生姓名"
},
"entrypoint": {
"type": "cli",
"command": "submit-review-result",
"args": ["--candidate-id", "{row.候选人ID}", "--conclusion", "{form.conclusion}", "--review-note", "{form.review_note}"]
}
},
{
"id": "render-html",
"label": "查看复核清单",
"description": "渲染指定复核清单的 HTML 页面,宿主 iframe 预览。",
"placements": ["row", "skill-detail", "agent"],
"executionProfile": "sync",
"bind": {
"tables": ["复核建议清单"],
"selectionMode": "required",
"labelColumn": "批次名称"
},
"entrypoint": {
"type": "cli",
"command": "render-html",
"args": ["--list-id", "{row.清单ID}"]
}
},
{
"id": "sync-card-data",
"label": "同步一卡通数据",
"description": "从一卡通中心重新拉取消费数据。占位 Action,cron 启用后由定时调度。",
"placements": ["cron", "agent", "toolbar"],
"executionProfile": "async",
"bind": {
"tables": ["一卡通消费"]
},
"entrypoint": {
"type": "cli",
"command": "sync-card-data",
"args": []
}
},
{
"id": "sync-gdp-data",
"label": "同步生源地 GDP 数据",
"description": "从公开统计来源拉取最新生源地人均 GDP 数据。占位 Action,cron 启用后由定时调度。",
"placements": ["cron", "agent"],
"executionProfile": "async",
"entrypoint": {
"type": "cli",
"command": "sync-gdp-data",
"args": []
}
}
]
}

View File

@@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>{{TITLE}}</title>
<style>
/* 数据管理 iframe 预览布局基线 */
html, body {
margin: 0;
padding: 16px;
font-family: -apple-system, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
color: #1f2329;
background: #fafbfc;
line-height: 1.6;
}
.report { max-width: 100%; }
.header {
padding: 20px;
background: linear-gradient(135deg, #b45309 0%, #f59e0b 100%);
color: #fff;
border-radius: 8px;
margin-bottom: 16px;
}
.header h1 { margin: 0 0 8px; font-size: 22px; }
.header .meta { color: #fef3c7; font-size: 13px; }
.summary {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 12px;
margin-bottom: 16px;
}
.stat {
padding: 14px 18px;
background: #fff;
border: 1px solid #e5e6eb;
border-radius: 8px;
}
.stat .label { color: #8c959f; font-size: 12px; }
.stat .value { font-size: 24px; font-weight: 700; margin-top: 4px; color: #92400e; }
.stat.danger .value { color: #c53030; }
.stat.warning .value { color: #d97706; }
.stat.success .value { color: #059669; }
.section {
padding: 16px 20px;
background: #fff;
border: 1px solid #e5e6eb;
border-radius: 8px;
margin-bottom: 16px;
}
.section h2 { margin: 0 0 12px; font-size: 16px; color: #92400e; }
table {
width: 100%;
border-collapse: collapse;
table-layout: fixed;
word-break: break-word;
}
th, td { padding: 10px 14px; text-align: left; border-bottom: 1px solid #f0f1f3; font-size: 14px; }
th { background: #fffbeb; color: #92400e; font-weight: 600; }
tr:last-child td { border-bottom: 0; }
.pill {
display: inline-block;
padding: 2px 8px;
border-radius: 10px;
font-size: 12px;
font-weight: 500;
}
.pill.red { background: #fef2f2; color: #c53030; }
.pill.yellow { background: #fffbeb; color: #d97706; }
.pill.green { background: #ecfdf5; color: #059669; }
.privacy-note {
padding: 10px 14px;
background: #f8fafc;
border-left: 3px solid #94a3b8;
border-radius: 4px;
color: #475569;
font-size: 13px;
margin-bottom: 12px;
}
.footer { margin-top: 16px; color: #8c959f; font-size: 12px; text-align: right; }
</style>
</head>
<body>
<div class="report">
<div class="header">
<h1>{{TITLE}}</h1>
<div class="meta">清单编号:{{LIST_ID}} · 批次:{{BATCH_NAME}} · 评定项目:{{AWARD_NAME}}</div>
<div class="meta">辅导员:{{COUNSELOR_NAME}} · 生成时间:{{GENERATED_AT}}</div>
</div>
<div class="privacy-note">
🔒 本报告含学生家庭隐私数据,已脱敏处理(学号 / 姓名末位)。请按学校保密规定保管,不得外传。
</div>
<div class="summary">
<div class="stat"><div class="label">校验候选人总数</div><div class="value">{{TOTAL_COUNT}}</div></div>
<div class="stat danger"><div class="label">🔴 高风险个案</div><div class="value">{{HIGH_RISK_COUNT}}</div></div>
<div class="stat warning"><div class="label">🟡 边缘个案</div><div class="value">{{EDGE_COUNT}}</div></div>
<div class="stat success"><div class="label">🟢 无异常</div><div class="value">{{CLEAN_COUNT}}</div></div>
</div>
<div class="section">
<h2>高风险个案复核清单</h2>
<table>
<thead>
<tr>
<th style="width: 18%">学生(脱敏)</th>
<th style="width: 16%">异常类型</th>
<th style="width: 30%">异常详情</th>
<th style="width: 16%">建议处理</th>
<th style="width: 20%">复核状态</th>
</tr>
</thead>
<tbody>
{{BODY}}
</tbody>
</table>
</div>
<div class="footer">本报告由「奖助学金评定逻辑防伪校验」技能自动生成 · 最终认定权归辅导员与学生处资助中心</div>
</div>
</body>
</html>