配合后端把 5 个模块「新建/发布」页的字段完整搬进助手表单: - FormCard 新增审批流控件(widget=flow):勾「走审批流程」后按步配置, 每步可选或签/会签并多选审批人(来自教师组织树),提交时拼 flow:[{name,vote,approverTeaIds}];发布方式选了「提交审批」却没配审批人则当场拦下 - 镜像字段(deptName)不渲染控件,提交时按源字段选中项反查显示名一起带上, 与模块页「字典 id + 反查名称」的提交口径一致 - 附件支持对象数组形态(作业 attachments:[{fileId,fileUrl,fileType,fileName,sort}]); 数组类字段在为空时也照常提交(模块页就是恒带 fileIds:"" / attachments:[]) - module-session:callModuleApi 支持 followUp —— 首步业务成功后用返回的资源 id 续跑第二步, 并带上「第一步成功但没拿回编号」的如实报错 - types:BrowserToolCall 增加 followUp;widget 联合类型补 scopes / flow 验证:npm run build 通过;headless Chrome 真机跑「表单 → 浏览器代执行 → 模块接口」, 公告(镜像 + 审批流 + pushScopes)/ 作业(Create→Publish、Create→Schedule)/ 宿舍(镜像 + 全部宿舍哨兵)/ 活动(分类存名称)共 50 项断言全绿
配合后端「发布表单与模块页对齐」:前端补齐三类控件与序列化。 - FormCard: 新增 multiselect 与 scopes 多选控件(「全部 XX」哨兵恒为首项, 选中后仍可叠加具体项;提交时若只有哨兵则按 scopeType 折成 [{scopeType:1,scopeId:0,scopeName}]);新增 file 附件控件(带登录态 POST multipart 到 uploadPath,遇登录跳转先预热模块会话再重试) - FormCard: allFields 的表单渲染全部字段(不再只渲染缺失必填);file 控件 显示已传文件名并可移除 - types: widget 联合加 multiselect/file,FormField 补 joinSeparator/uploadPath/ multiple/allToken/allTokenLabel/scopeType,FormRequest 补 allFields - module-session: parseOptionItems 支持 labelKey 用「+」拼多字段 (如 buildingName+roomNo →「1 号楼 101」),组织树自动拍平到叶子 验证:.scratch/verify-module-publish-form.mjs 真机断言三个发布表单 (notice 24/24、dorm 35/35、activity 33/33 通过),npm run build 通过
- 说「我要请假」这类只有意图的短句时,直接弹出表单不再过模型: 后端 IntentShortcut 在编排器入口做「去空白标点 + 剥前后缀后正好等于标准说法 且原句 ≤12 字」的窄匹配,命中即跳过 LLM 直接下发表单。 - 按身份分离:学生 → leave.submit(提交申请),教师/管理员 → leave.register (帮学生登记,必填 classId+stuId);RolePolicy 把两者分别归入 STUDENT_ONLY 与 STAFF_ONLY,模型视野里天然只有一个,不可能选错。 - 表单字段由各自必填参数推导;下拉选项改为后端下发 optionCall(含 {{占位符}}), 由前端带用户登录态代取后按 valueKey/labelKey 映射(模块 /api/* 服务端必然 302)。 stuId 依赖 classId,选完班级才解锁学生名单。 - 抽出 utils/module-session.ts(会话预热 / 带登录态调模块 / 字典项解析), Chat.vue 与 FormCard.vue 复用。 - 例句与提示改为「我要请假」「帮学生登记请假」。