彻底对齐各模块「新建 / 发布」页里的两类控件(此前只有通知公告搬到位): 正文 → wangEditor(widget=richtext) · 校园公告 content、宿舍通知 content(发布 + 编辑)、家校活动 content(发布 + 编辑)、 作业 description · 教师专业发展 remark:只声明形态、**不声明** .richText(...) —— 该模块 file 域只有 Upload/Preview/Down(没有 UploadImage),模块页 RecordEdit.vue 也没配 uploadImage, 所以下发空地址,前端据此把工具栏的「图片」组整组摘掉(模块页就是这个形态) 接收对象 → 自绘控件(widget=scopepicker / roompicker) · 校园公告 pushScopes:换成 ClassScopeInput 同款(全部班级 / 指定班级 + 弹窗班级树); 提交口径不变,仍是 [{scopeType,scopeId,scopeName}] · 宿舍通知 receiveList:换成模块页「选择接收宿舍」弹窗同款(左楼栋 / 右按楼层分组的房间); v-model 是字符串(房间 id 逗号串或 ALL 哨兵),与模块 receiveList 的真实契约一致 基建 · ToolParam 新增 richText(upload,preview) / scopePicker(type) / roomPicker() / pickerSource(页签名, 模块内相对路径);对应 FormField 四个字段 · AgentOrchestrator:新增 resolveModulePath 通用形态,richtext 与 pickerSources 的地址 一律只写模块内相对路径、前缀在这里拼;richtext **没有兜底**(不声明就是空) · 带 optionCall 的字段会被改写成 select 的白名单改用 isSelfDrawnPicker() (原先是硬编码 userpicker),并放开为 public 供契约测试复用生产口径 测试(139 tests, 0 failures) · ModuleFormParityTest 新增两条通用不变量:正文图片地址与弹窗数据源都必须带模块前缀、 不许自己带前缀、不许双斜杠;另加「专业发展不得拿到兜底上传地址」 · FormFieldWidgetTest 新增 richtext(含「不声明 = 空」反向断言)与自绘控件透传两条 · IntentDirectFormTest / DormActivityPublishIntentTest 同步改成新控件口径
- ToolParam / FormField 新增控件能力: radio(单选按钮组)、switch(勾选框+开关值映射)、quickPeriods(快捷时段)、 dailyExpand(按天展开)、autoPickFirst(默认选中第一项)、 hideIfSingleOption(单选项隐藏)、placeholder(照搬模块页原文案) - LeaveTools: * leave.submit / leave.register 的 leaveType 改单选按钮组并默认选中第一个 * 请假时间补齐快捷时段与「连续请假」勾选框(勾上展开连续天数 + 逐天时段) * 事由 / 附件对齐模块页文案;学生端 classId 单班隐藏、教师端恒显示 - ToolExecutor.expandDailyArgs 认前端显式发来的 continuousLeaveTime (用户在逐天时段里做过微调就以他改的为准,不再按基准覆盖) - 只读查询因下游 302 失败时也回传 landingPath,让「去业务系统查看」按钮有着落
- com.yunhai.agent,端口 8093,context-path /agent,制品 target/agent.jar;与 NoticeService 同构 - CAS 单点登录 + 三层角色权限(学生/教师/管理员/访客)+ 会话与工具调用审计落库 - DeepSeek 大模型编排 + 7 个业务模块工具(请假/公告/宿舍/活动/作业/资源库/教师发展) - 浏览器代执行协议(服务端挂起 → 前端用登录态代调 → toolResult 续跑)+ 调用失败深链兜底 - 登出修复:服务端真正 session.invalidate() + 前端两步登出 + logout-guard - 保留 projman 注入的 .gitea/workflows/build.yml 与 docker/Dockerfile;docker/application-prod.yml、run-app.sh 随工程入库