把 5 个模块「新建/发布」页的字段与提交体逐个核对后,补齐此前缺失或形态不符的部分: - 部门名镜像:公告/宿舍/活动三处在模块页是「字典 id + 反查名称」一起提交。 新增 mirrorLabelOf 机制 —— 该字段不渲染控件、不进模型 schema,提交时按源字段 选中项的显示名填充(deptName) - 公告审批流:新增 flow 控件(widget=flow)+ 教师组织树字典 notice.teaTree, 提交 flow:[{name,vote,approverTeaIds}];publishType 值域修正为 direct/approve; 存草稿改用模块自己的独立接口 notice.saveDraft(POST /api/notice/SaveDraft) - 活动分类:category 提交的是**分类名称**(模块页 :value="String(c.v)"), optionsKeys 由 ("k","v") 改为 ("v","v") - 请假附件:fileIds 在 HomeLeave 是 number[](JSON 数组),去掉逗号串拼接; 连续请假按 continuousLeaveNum 逐天展开成 continuousLeaveTime[](服务端/浏览器同源) - 作业发布(整块新增):homework.publish / schedule / published / drafts / teachingSubjects / classTree。模块没有一步发布的接口,用 ToolDef.then 声明两步提交 (Create 落草稿 → Publish | Schedule);附件是对象数组 attachments:[{fileId,fileUrl,fileType,fileName,sort}],上传走 file 域 /coursehomework/api/file/Upload - 执行器:新增 followUp 两步提交(浏览器侧同源)、数组参数给标量时包成单元素数组、 首步响应 data 取资源 id(对象形态取 .id,避免拼出 /homeworks/{"id":1}/publish) - 新增 ModuleFormParityTest(13 项)逐条锁住上述契约 回归:mvn clean package → Tests run: 103, Failures: 0, Errors: 0, BUILD SUCCESS 真机:headless Chrome 走「表单 → 浏览器代执行 → 模块接口」,50 项断言全绿