package com.yunhai.agent.tool; import lombok.Data; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 表单里的一个字段:由 {@link ToolParam} 生成,前端据此选择控件(下拉 / 日期时间 / 多行文本…)。 */ @Data public class FormField { /** 提交时的参数名(与业务接口一致) */ private String name; /** 中文标签,如「开始时间」 */ private String label; /** 控件类型:text / textarea / number / date / datetime / select / multiselect / file */ private String widget; /** 数据类型:string / integer / number / boolean / array */ private String type; /** * 数组值的序列化分隔符(仅 POST_JSON 有意义)。 *

前端展示时不需要它(用户看到的是多选),但下发给前端便于「提交前预览」如实呈现最终值。 */ private String joinSeparator; /** * {@code widget=file} 时的上传地址(相对站点根),如 {@code /dormnotice/api/base/FileUpload}。 *

模块的附件上传只认浏览器 CAS 会话,必须由前端带用户登录态 POST(multipart), * 拿到 {@code data.fileid} 后作为 fileIds 提交。 */ private String uploadPath; /** {@code widget=file} 时是否允许多个附件 */ private boolean multiple; /** * 「全部」哨兵值(如 {@code ALL})与其显示名(如「全部宿舍」)。 *

前端把它作为多选的第一个选项;用户只勾它 → 提交 {@code ["ALL"]}; * 同时勾了具体项 → 提交时折叠掉它,以具体项为准。 */ private String allToken; /** 「全部」选项的显示名 */ private String allTokenLabel; /** * {@code widget=scopes} 时的节点类型(校园公告 pushScopes): * 1 全校 / 2 学部 / 3 年级 / 4 班级 / 5 训练队 / 6 指定学员。 *

前端把多选结果拼成 {@code [{scopeType,scopeId,scopeName}]}。 */ private Integer scopeType; private boolean required; /** 说明(来自工具定义,写清格式与含义) */ private String description; /** 格式示例,前端用作 placeholder,如 2026-10-11 08:00:00 */ private String example; private String defaultValue; /** * 下拉选项的动态来源(字典工具名,如 leave.types)。 *

有值但 {@link #options} 为空 ⇒ 字典接口没取到(多半是下游 302/超时), * 前端据此提示用户「可先手填编号」,而不是干瞪眼。 */ private String optionsFrom; /** * 当前 {@link #options} 是否来自内置兜底(而非学校实时字典)。 *

为 true 时前端提示「用的是标准类型,自定义类型暂时没取到」,而不是静默当成权威值。 */ private boolean optionsFallback; /** 下拉选项 [{value,label}] */ private List> options = new ArrayList<>(); /* ==================== 动态选项(浏览器代取 + 联动) ==================== */ /** * 「浏览器代取选项」的调用描述:业务模块的字典接口(班级、学生名单…)只认浏览器 CAS 会话, * 服务端代取必然 302,所以把地址下发前端,由前端用**用户自己的登录态**取回原始字典再渲染下拉。 * *

地址串里可能含 {@code {{字段名}}} 占位符(见 {@link #dependsOn}), * 前端在依赖字段有值时做替换(值需 URL 编码)后才发起请求。 */ private com.yunhai.agent.model.BrowserToolRequest.BrowserCall optionCall; /** 本字段选项依赖的先序字段名(如「学生」依赖「班级」);依赖未填时前端应清空并提示先选 */ private List dependsOn = new ArrayList<>(); /** 从字典返回对象里取哪个字段作为选项「值」(如 classId / stuId) */ private String valueKey; /** 从字典返回对象里取哪个字段作为选项「显示名」(如 className / stuName) */ private String labelKey; }