# 报表查询配置完整指南 ## 1. 报表参数配置 ### 参数语法 | 语法 | 类型 | 说明 | 示例 | |------|------|------|------| | `${paramName}` | 用户参数 | 需要在报表参数中声明,用户可查询输入 | `${id}` `${name}` | | `#{sysVar}` | 系统变量 | 无需声明,自动解析 | `#{sysUserCode}` `#{sysDate}` | **注意:** `$` 或 `#` 与 `{` 之间不能有空格。 ### SQL 参数示例 ```sql select * from sys_user where id='${id}' and sex='${sex}' and create_by='#{sysUserCode}' ``` ### API 参数示例 ``` http://192.168.1.116/jmreport/test/getMessage?name='${name}'&createBy='#{sysUserCode}' ``` ### 系统变量列表 | 变量 | 说明 | |------|------| | `#{sysUserCode}` | 当前登录用户名 | | `#{sysDate}` | 当前系统日期 | | `#{sysDateTime}` | 当前系统日期时间 | | `#{domainURL}` | 系统域名地址 | ### 参数优先级(高→低) 1. **查询条件值**(用户在查询栏输入的) 2. **URL参数**(通过URL传递的) 3. **默认值**(配置的默认值) ### 参数合并规则 - 多个数据集中**同名参数**会合并为一个查询控件 - 同名**数据集字段**不会合并 - URL参数会传递给所有匹配的数据集参数 ## 2. 查询控件类型 在数据集字段详情中勾选"查询"复选框,即可生成查询控件。 | 控件类型 | 查询模式值 | 说明 | |---------|-----------|------| | 文本输入 | 空或"输入框" | 默认类型 | | 下拉单选 | "下拉单选" | 可搜索,默认显示10条 | | 下拉多选 | "下拉多选" | 可搜索,默认显示10条 | | 范围查询 | "范围查询" | 日期/数值范围;**报表参数不支持** | | 模糊查询 | "模糊查询" | **报表参数不支持** | | 下拉树 | 通过配置实现 | 层级树形结构 | | 自定义下拉 | JS增强实现 | 数据需含 `value` 和 `text` 字段 | ### 下拉数据源配置 **方式一:系统字典** - 配置字典编码(如 `sex`) **方式二:SQL字典** ```sql SELECT username AS value, realname AS text FROM sys_user ``` 必须别名为 `value` 和 `text`。 **方式三:API** - 相对路径:`/jmreport/test/getDictSex?createBy=#{sysUserCode}` - 绝对路径:`http://127.0.0.1:8080/jeecg-boot/jmreport/test/getDictSex` - 返回格式:`[{"text":"男","value":"1"},{"text":"女","value":"2"}]` **方式四:JS增强** ```javascript this.updateSelectOptions('dbCode', 'fieldName', options) ``` ### 下拉显示条数配置 在字段的配置设置中: ```json {"selectSearchPageSize": 20} ``` 默认显示10条。 ## 3. 查询控件默认值 三种方式: | 方式 | 示例 | |------|------| | 静态值 | 直接输入字符串 | | 动态表达式 | `=dateStr('yyyy-MM-dd')` | | 系统变量 | `#{sysUserCode}` | ## 4. 时间控件 ### 支持的日期格式 | 格式 | 示例 | |------|------| | `yyyy-MM-dd HH:mm:ss` | 2021-07-29 12:11:10 | | `yyyy-MM-dd` | 2021-07-29 | | `yyyy-MM` | 2021-07 | | `yyyy` | 2021 | | `MM` | 07 | | `HH:mm:ss` | 12:11:10 | | `HH:mm` | 12:11 | **重要:** 日期控件传递的值始终为字符串类型。 ### 数据库日期转换 不同数据库需要用对应的日期转换函数作为查询条件字段: | 数据库 | 转换函数 | 示例 | |--------|---------|------| | MySQL | `DATE_FORMAT(field, '%Y')` | `DATE_FORMAT(birthday, '%Y') nian` | | Oracle | `to_char(field, 'yyyy')` | `to_char(birthday, 'yyyy') nian` | | SQL Server | `year(field)` | `year(birthday) nian` | **SQL示例(MySQL):** ```sql SELECT name, birthday, DATE_FORMAT(birthday, '%Y') nian FROM demo ``` 将转换后的列 `nian` 配置为查询条件,而非原始日期字段。 ### 时间默认值函数 #### dateStr(date, format, offset)(v1.3.79+) | 参数 | 说明 | |------|------| | date | 时间字符串(可选,默认当前时间) | | format | 格式化模式(默认 `yyyy-MM-dd HH:mm:ss`) | | offset | 数值偏移量 | **示例(当前时间 2020-08-11 12:00:01):** | 表达式 | 结果 | |--------|------| | `=dateStr()` | 2020-08-11 12:00:01 | | `=dateStr('yyyy-MM-dd')` | 2020-08-11 | | `=dateStr('MM', 2)` | 10 | | `=dateStr('dd', -1)` | 10 | | `=dateStr('2020-08-15 12:00:01', 'yyyy-MM-dd', 1)` | 2020-08-16 | | `=dateStr('yyyy-MM', -1)` | 2020-07(v1.4.0+) | #### date2Str(date, format, offset)(v1.7.5+) 与 `dateStr()` 相同但保留前导零(如 `01` 而非 `1`)。 ## 5. SQL条件表达式(FreeMarker语法) v1.3.79+ 支持动态SQL条件,使用 FreeMarker 模板语法。 ### isNotEmpty() 函数 对 `null` 和空字符串 `""` 都返回 `false`。 ### 基础示例 ```sql select id, name, age from demo where create_by = '#{sysUserCode}' <#if isNotEmpty(age)> and age = '${age}' <#if isNotEmpty(name)> and name = '${name}' ``` ### LIKE模糊查询 ```sql select * from demo where 1=1 <#if name?? && name?length gt 0> and name like concat('%', '${name}', '%') ``` ### 多数据集共享参数 ```sql -- 数据集1 select username, sex, phone, create_time from user where 1=1 <#if isNotEmpty(begin_date)> and DATE_FORMAT(create_time, '%Y-%m-%d') >= '${begin_date}' <#if isNotEmpty(end_date)> and DATE_FORMAT(create_time, '%Y-%m-%d') <= '${end_date}' -- 数据集2(共享 begin_date 和 end_date 参数) select count(1) as value, DATE_FORMAT(create_time, '%Y-%m-%d') as name from user where 1=1 <#if isNotEmpty(begin_date)> and DATE_FORMAT(create_time, '%Y-%m-%d') >= '${begin_date}' <#if isNotEmpty(end_date)> and DATE_FORMAT(create_time, '%Y-%m-%d') <= '${end_date}' GROUP BY name ``` ## 6. SQL表达式函数(DaoFormat) v1.6.2+ 支持在SQL中使用 `DaoFormat` 函数。 ### DaoFormat.in() — 字符串IN查询 输入:`male,female` → 输出:`'male','female'` ```sql select * from demo where sex in(${DaoFormat.in('${sex}')}) ``` ### DaoFormat.inNumber() — 数字IN查询 输入:`21,22` → 输出:`21,22` ```sql select * from demo where age in(${DaoFormat.inNumber('${age}')}) ``` ### DaoFormat.concat() — 字符串拼接 ```sql select * from demo where create_time between '${DaoFormat.concat('${beginTime}', ' 00:00:00')}' and '${DaoFormat.concat('${endTime}', ' 23:59:59')}' ``` ## 7. 下拉树控件 v1.3.79+ 支持层级树形下拉。 ### 配置格式 ```json {"loadTree": "{{ domainURL }}/sys/user/treeTest"} ``` 或绝对路径: ```json {"loadTree": "https://api.jeecg.com/mock/26/queryTree"} ``` ### 接口返回格式 ```json [ {"id": "001", "pid": "", "value": "A01", "title": "节点1", "izLeaf": 0}, {"id": "002", "pid": "001", "value": "A02", "title": "子节点1", "izLeaf": 1} ] ``` | 字段 | 说明 | |------|------| | `id` | 节点标识 | | `pid` | 父节点ID,空=根节点 | | `value` | 实际查询值 | | `title` | 显示文本 | | `izLeaf` | 1=叶子节点(无展开图标),0=父节点 | ### 穿透场景(v1.5.0+) ```json { "loadTree": ".../treeTest", "loadTreeByValue": ".../loadTreeByValue" } ``` **限制:** 下拉树不支持默认值配置。 ## 8. 范围查询默认值 使用管道符 `|` 分隔起止值。 | 场景 | 默认值表达式 | |------|------------| | 数字范围 | `16\|22` | | 固定日期 | `2021-11-01\|2021-11-30` | | 本月1日到今天 | `=concat(string.substring(dateStr('yyyy-MM-dd'),0,8),'01')\|=dateStr('yyyy-MM-dd')` | | 最近10天 | `=concat(dateStr('yyyy-MM-dd',-10),' 00:00:00')\|=dateStr('yyyy-MM-dd HH:mm:ss')` | | 最近3个月 | `=concat(dateStr('yyyy',-1),'-',dateStr('MM',-3),'-',dateStr('dd'))\|=dateStr('yyyy-MM-dd')` | ## 9. JS增强与CSS增强 v1.3.79+ 支持。 ### JS API方法 | 方法 | 参数 | 用途 | |------|------|------| | `updateSelectOptions(dbCode, fieldName, options)` | 数据集编码, 字段名, 选项数组 | 动态更新下拉选项 | | `onSearchFormChange(dbCode, fieldName, callback)` | 数据集编码, 字段名, 回调函数 | 监听控件值变化 | | `updateSearchFormValue(dbCode, fieldName, value)` | 数据集编码, 字段名, 值 | 设置控件初始值 | | `getSelectOptions(dbCode, fieldName)` | 数据集编码, 字段名 | 获取当前下拉选项 | | `notLoadDataWhenShow()` | 无 | 预览时不自动加载数据(v1.6.7+) | ### 三级联动下拉示例 ```javascript function init(){ // 加载省份 $http.metaGet('http://localhost:8080/jeecg-boot/ces/ai/customSelect') .then(res => { this.updateSelectOptions('pca', 'pro', res.data) }) // 省→市联动 this.onSearchFormChange('pca', 'pro', (value) => { $http.metaGet('http://localhost:8080/jeecg-boot/ces/ai/customSelect', {pid: value}) .then(res => { this.updateSelectOptions('pca', 'city', res.data) }) }) // 市→区联动 this.onSearchFormChange('pca', 'city', (value) => { $http.metaGet('http://localhost:8080/jeecg-boot/ces/ai/customSelect', {pid: value}) .then(res => { this.updateSelectOptions('pca', 'area', res.data) }) }) } ``` ### 设置下拉默认选中第一项(v1.4.0+) ```javascript function init(){ let ops = this.getSelectOptions('de', 'sex'); if(ops && ops.length > 0){ this.updateSearchFormValue('de', 'sex', ops[0].value) } } ``` ### CSS增强示例 ```css .jm-query-form .ivu-btn-primary { background-color: red; border-color: red; } ``` ## 10. 参数配置设置 | 配置项 | 用途 | 适用控件 | |--------|------|---------| | `loadTree` | 树结构加载URL | 下拉树 | | `loadTreeByValue` | 按值检索树URL | 下拉树 | | `dictSplit` | 字典分隔符(仅英文字符) | 下拉单选/多选 | | `selectSearchPageSize` | 每页显示条数(默认10) | 下拉单选/多选 | | `order` | SQL排序 | 数据集字段详情(非报表参数) | | `required` | 必填标记(v1.7.9+) | 所有类型 | 必填配置:`{"required": true}`,默认 `false`。v1.9.6+ 支持可视化配置界面。 ## 11. 查询设置(querySetting) ```json "querySetting": { "izOpenQueryBar": false, "izDefaultQuery": true } ``` | 设置 | 默认值 | 说明 | |------|--------|------| | `izDefaultQuery` | true | 是否自动执行查询(关闭后需手动点击查询按钮) | | `izOpenQueryBar` | false | 是否默认展开查询栏 |