两个模块与「校园公告」同构(发布 → 阅读情况 → 回执闭环),原先只接了「读列表 + 我提交」 一层,价值最高的 发布/盯回执/催办/统计 全空。本轮补齐。 宿舍通知(9 → 35 个工具) - 发布闭环:dorm.publish(立即发布、默认发给全部宿舍)/ dorm.editNotice / dorm.sendList(改指 /api/notice/SendList,我发布的)/ dorm.readDetail / dorm.statistics; 字典:dorm.noticeTypeDic(type=noticeType)/ dorm.deptDic(type=dept)/ dorm.formTemplates。 - 回执闭环:dorm.receipts / dorm.receiptDetail / dorm.reviewReceipt / dorm.remind / dorm.expedite / dorm.remindStudent / dorm.markRead / dorm.pull / dorm.top; 家长侧补 dorm.initializeRed(一键已读)。 - 宿舍特有的床位台账(模块自带、此前完全没接):dorm.pendingStudents → dorm.assign → dorm.removeStudent / dorm.transfer / dorm.setMonitor,以及楼栋房间增改 (dorm.addBuilding / dorm.editBuilding / dorm.addRoom / dorm.editRoom)。 家校活动(7 → 22 个工具) - 发布闭环:activity.publish / activity.edit / activity.sent / activity.readDetail / activity.statistics;字典:activity.deptDic(type=1)/ activity.categoryDic(type=2)。 - 报名闭环:activity.signups / activity.signupDetail / activity.review / activity.remind / activity.expedite / activity.pull / activity.top; 家长侧补 activity.initializeRed。 裸意图直达(IntentShortcut) - 新增 DORM_PUBLISH(仅教职工)与 ACTIVITY_PUBLISH(仅教职工),学生落回模型如实说明。 - ★ 修跨模块歧义:「发通知 / 发布通知」不带限定时校园公告与宿舍通知都成立, 已从公告短语集移除,改由模型按上下文选;只认带「公告/校园」或「宿舍」「活动」限定的说法。 角色(RolePolicy) - 发布/编辑/阅读情况/回执处理/催办/统计/字典/床位台账 → STAFF_ONLY; 家长侧(通知箱、回执提交、活动广场、报名、一键已读)保持不限。 表单下拉复用请假的 optionCall + valueKeys + dependsOn 通道(模块 /api/* 只认浏览器会话, 服务端必然 302)。发布表单的接收对象固定为「全部」(receiveType/receiveList 用 fix 写死), 避免表单里出现难用的房间/班级 id 输入框。 测试:新增 DormActivityPublishIntentTest(10);IntentDirectFormTest +4(教师得表单且不过大模型、 学生落回模型);NoticeIntentFormTest 增加「发通知不再被公告劫持」; RolePermissionTest 补新工具的可见性断言。全量 86/86 通过。 README:4.2 能力划分更新 + 新增「宿舍通知/家校活动补全了哪些能力」;5.1.0 意图对照表补三行。
This commit is contained in:
@@ -1013,6 +1013,13 @@ public class AgentOrchestrator {
|
||||
.append("缺哪项就照常调用工具让系统弹表单,不要自己编造发文部门,也不要用文字反复追问。")
|
||||
.append("该工具只对教职工下发(学生身份看不到),学生要求发布公告时如实说明身份不够。\n");
|
||||
|
||||
sb.append("11. ★ 「发布宿舍通知」与「发布校园公告」是**两个不同模块**,不要混用:")
|
||||
.append("宿舍通知发给**家长**、可要求家长回执(回执方式:无需/确认/填报),发布时要填通知类型与发文部门;")
|
||||
.append("校园公告是全校范围的公告。用户说「发通知」而没指明模块时,先问清楚是校园公告还是宿舍通知。\n");
|
||||
|
||||
sb.append("12. ★ 「发布家校活动」要拿到标题、说明、活动分类、主办部门、活动地点与起止时间;")
|
||||
.append("活动默认要求家长报名。缺项就照常调用工具让系统弹表单,分类与主办部门必须来自字典,不要编造。\n");
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
@@ -11,7 +11,8 @@ import java.util.Set;
|
||||
|
||||
/**
|
||||
* 「裸意图」直达:把只有意图、没有任何细节的一句话(典型:<b>「我要请假」</b>、
|
||||
* <b>「发布校园公告」</b>)确定性地映射到对应表单,<b>不经过大模型决策</b>。
|
||||
* <b>「发布校园公告」</b>、<b>「发布宿舍通知」</b>、<b>「发布活动」</b>)
|
||||
* 确定性地映射到对应表单,<b>不经过大模型决策</b>。
|
||||
*
|
||||
* <h3>为什么需要它</h3>
|
||||
* 同一句「我要请假」,模型可能给出三种都不合预期的反应:
|
||||
@@ -122,6 +123,29 @@ public class IntentShortcut {
|
||||
"好的,下面是**发布校园公告**表单:填好公告标题和正文,选好发文部门,"
|
||||
+ "点「确认提交」我就直接发布(立即生效,全站可见)。");
|
||||
|
||||
/**
|
||||
* 发布宿舍通知意图:<b>仅教职工</b>(宿管 / 管理员)。
|
||||
*
|
||||
* <p>与公告不同,宿舍通知强调「给家长发、要回执」,所以表单里带「回执方式」;
|
||||
* 接收对象默认全部宿舍(房间级定向请到模块页面里勾选)。
|
||||
*/
|
||||
private static final Intent DORM_PUBLISH = new Intent("dorm.publish",
|
||||
null,
|
||||
"dorm.publish",
|
||||
"发布宿舍通知需要教师或管理员(宿管)身份;你可以先看看「我的宿舍通知箱」,或换个身份账号再来发布。",
|
||||
"好的,下面是**发布宿舍通知**表单:填好标题和正文,选好通知类型与发文部门,"
|
||||
+ "点「确认提交」我就发给全部宿舍的家长(要家长回执的话,在「回执方式」里选一种)。");
|
||||
|
||||
/**
|
||||
* 发布家校活动意图:<b>仅教职工</b>。活动需要地点与起止时间,故表单字段比公告多。
|
||||
*/
|
||||
private static final Intent ACTIVITY_PUBLISH = new Intent("activity.publish",
|
||||
null,
|
||||
"activity.publish",
|
||||
"发布家校活动需要教师或管理员身份;你可以先看看「活动广场」,或换个身份账号再来发布。",
|
||||
"好的,下面是**发布家校活动**表单:填好活动标题、说明、分类、地点和起止时间,"
|
||||
+ "点「确认提交」我就发给全部班级的家长(需要家长报名的话,报名方式保持默认即可)。");
|
||||
|
||||
/**
|
||||
* 请假的标准说法全集(已剥掉语气词与标点后的形态)。
|
||||
*/
|
||||
@@ -137,16 +161,33 @@ public class IntentShortcut {
|
||||
* (「公告」「通知」单独一句,用户多半是想看看有什么),误判成"发布"会很突兀。
|
||||
* 只认带「发/发布」动词的说法,与「读公告」明确区分开。
|
||||
*
|
||||
* <p>⚠️ 现在收「发通知」是安全的:本平台里 {@code campusnotice} 就是「校园公告(校园通知)」,
|
||||
* 而宿舍通知目前**没有**发布工具({@code dormnotice} 只有家长侧回执)。等将来接上
|
||||
* 宿舍通知发布后,「发通知」会变成跨模块歧义(猜错模块比不直达更糟)——
|
||||
* 届时要么把本组里的「通知」说法摘掉只留「公告」,要么交给模型按上下文选。
|
||||
* <p>★ 2026-10 起「发通知 / 发布通知」这类**不带模块限定**的说法已从本组移除:
|
||||
* 宿舍通知也接上了发布工具({@code dorm.publish}),同一句「发通知」会变成跨模块歧义
|
||||
* (猜错模块比不直达更糟)。现在只认带「公告」或「校园」限定的说法,其余交给模型按上下文选。
|
||||
*/
|
||||
private static final Set<String> NOTICE_PUBLISH_BARE = new HashSet<>(Arrays.asList(
|
||||
"发布公告", "发公告", "发个公告", "发布校园公告", "校园公告发布",
|
||||
"发布一条公告", "发一条公告", "发布一篇公告", "发一篇公告",
|
||||
"发布通知", "发通知", "发个通知", "发布校园通知", "校园通知发布",
|
||||
"发布一条通知", "发一条通知"
|
||||
"发布校园通知", "校园通知发布"
|
||||
));
|
||||
|
||||
/**
|
||||
* 发布宿舍通知的标准说法全集 —— 必须带「宿舍」限定(否则与校园公告混淆)。
|
||||
*/
|
||||
private static final Set<String> DORM_PUBLISH_BARE = new HashSet<>(Arrays.asList(
|
||||
"发布宿舍通知", "发宿舍通知", "发个宿舍通知", "发一条宿舍通知", "发布一条宿舍通知",
|
||||
"宿舍通知发布", "发布宿舍公告", "发宿舍公告", "宿舍公告发布", "给宿舍发通知"
|
||||
));
|
||||
|
||||
/**
|
||||
* 发布家校活动的标准说法全集。
|
||||
*
|
||||
* <p>⚠️ 不收「报名活动」—— 那是家长侧的另一件事({@code activity.signup}),不属发布意图。
|
||||
*/
|
||||
private static final Set<String> ACTIVITY_PUBLISH_BARE = new HashSet<>(Arrays.asList(
|
||||
"发布活动", "发活动", "发个活动", "发起活动", "活动发布",
|
||||
"发布一个活动", "发布一条活动", "发一条活动",
|
||||
"发布家校活动", "发家校活动", "发布校园活动", "发校园活动", "发布亲子活动"
|
||||
));
|
||||
|
||||
/**
|
||||
@@ -172,6 +213,8 @@ public class IntentShortcut {
|
||||
static {
|
||||
RULES.add(new Rule(LEAVE_BARE, LEAVE));
|
||||
RULES.add(new Rule(NOTICE_PUBLISH_BARE, NOTICE_PUBLISH));
|
||||
RULES.add(new Rule(DORM_PUBLISH_BARE, DORM_PUBLISH));
|
||||
RULES.add(new Rule(ACTIVITY_PUBLISH_BARE, ACTIVITY_PUBLISH));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user