@@ -364,27 +364,54 @@ NOW() / TODAY() / ROW() 当前时间 / 日期 / 行号</pre>
364364 </el-dialog >
365365
366366 <!-- 查询参数配置 -->
367- <el-dialog v-model =" paramDialogVisible" title =" 查询参数配置" width =" 820px" append-to-body >
368- <div v-for =" (p, i) in previewParams" :key =" i" style =" display :flex ;gap :6px ;margin-bottom :6px ;align-items :center " >
369- <el-input v-model =" p.name" placeholder =" 参数名(如 beginDate)" size =" small" style =" width :150px ;flex-shrink :0 " />
370- <el-input v-model =" p.label" placeholder =" 显示名" size =" small" style =" width :110px ;flex-shrink :0 " />
371- <el-select v-model =" p.type" size =" small" style =" width :90px ;flex-shrink :0 " >
372- <el-option value =" text" label =" 文本" />
373- <el-option value =" number" label =" 数字" />
374- <el-option value =" date" label =" 日期" />
375- <el-option value =" switch" label =" 开关" />
376- <el-option value =" select" label =" 下拉" />
377- </el-select >
378- <el-input v-if =" p.type==='select'" v-model =" p.options" placeholder =" 选项,逗号/换行分隔" size =" small" style =" width :180px ;flex-shrink :0 " />
379- <el-input v-else-if =" p.type!=='switch'" v-model =" p.default" placeholder =" 默认值" size =" small" style =" width :110px ;flex-shrink :0 " />
380- <el-switch v-else v-model =" p.default" size =" small" />
381- <span v-if =" p.type==='switch'" style =" font-size :11px ;color :#888 ;width :70px ;flex-shrink :0 " >{{ p.default ? '默认开' : '默认关' }}</span >
382- <el-button size =" small" type =" danger" link @click =" previewParams.splice(i, 1)" >删</el-button >
367+ <el-dialog v-model =" paramDialogVisible" title =" 查询参数配置" width =" 960px" append-to-body >
368+ <div v-for =" (p, i) in previewParams" :key =" i" style =" border :1px solid #eee ;border-radius :6px ;padding :8px ;margin-bottom :8px " >
369+ <div style =" display :flex ;gap :6px ;align-items :center ;flex-wrap :wrap " >
370+ <el-input v-model =" p.name" placeholder =" 参数名(如 beginDate)" size =" small" style =" width :150px ;flex-shrink :0 " />
371+ <el-input v-model =" p.label" placeholder =" 显示名" size =" small" style =" width :110px ;flex-shrink :0 " />
372+ <el-select v-model =" p.type" size =" small" style =" width :100px ;flex-shrink :0 " >
373+ <el-option value =" text" label =" 文本" />
374+ <el-option value =" number" label =" 数字" />
375+ <el-option value =" date" label =" 日期" />
376+ <el-option value =" switch" label =" 开关" />
377+ <el-option value =" select" label =" 下拉" />
378+ <el-option value =" radio" label =" 单选组" />
379+ <el-option value =" checkgroup" label =" 筛选组" />
380+ </el-select >
381+ <template v-if =" p .type === ' switch' " >
382+ <el-switch v-model =" p.default" size =" small" />
383+ <span style =" font-size :11px ;color :#888 " >{{ p.default ? '默认开' : '默认关' }}</span >
384+ </template >
385+ <template v-else-if =" [' select' ,' radio' ,' checkgroup' ].includes (p .type ) " >
386+ <el-select v-model =" p.optionsSource" size =" small" style =" width :90px ;flex-shrink :0 " >
387+ <el-option value =" fixed" label =" 固定选项" />
388+ <el-option value =" dataset" label =" 数据集" />
389+ </el-select >
390+ <template v-if =" p .optionsSource !== ' dataset' " >
391+ <el-input v-model =" p.options" placeholder =" 选项,逗号/换行分隔" size =" small" style =" width :220px ;flex-shrink :0 " />
392+ </template >
393+ <template v-else >
394+ <el-select v-model =" p.optionsDataset" placeholder =" 绑定数据集" size =" small" style =" width :140px ;flex-shrink :0 " >
395+ <el-option v-for =" ds in datasets" :key =" ds.id" :label =" ds.name" :value =" ds.id" />
396+ </el-select >
397+ <el-input v-model =" p.optionsValueField" placeholder =" 值字段" size =" small" style =" width :90px ;flex-shrink :0 " />
398+ <el-input v-model =" p.optionsLabelField" placeholder =" 显示字段" size =" small" style =" width :100px ;flex-shrink :0 " />
399+ </template >
400+ <template v-if =" p .type === ' select' " >
401+ <el-checkbox v-model =" p.multiple" size =" small" style =" margin-right :0 " >多选</el-checkbox >
402+ <el-checkbox v-model =" p.filterable" size =" small" style =" margin-right :0 " >模糊</el-checkbox >
403+ </template >
404+ <el-input v-model =" p.default" :placeholder =" p.type==='checkgroup' ? '默认值(逗号分隔)' : '默认值'" size =" small" style =" width :110px ;flex-shrink :0 " />
405+ </template >
406+ <el-input v-else v-model =" p.default" placeholder =" 默认值" size =" small" style =" width :110px ;flex-shrink :0 " />
407+ <el-button size =" small" type =" danger" link @click =" previewParams.splice(i, 1)" >删</el-button >
408+ </div >
383409 </div >
384- <el-button size =" small" @click =" previewParams.push({ name:'', label:'', type:'text', default:'' })" >+添加参数</el-button >
410+ <el-button size =" small" @click =" previewParams.push({ name:'', label:'', type:'text', default:'', optionsSource:'fixed', options:'', optionsDataset:'', optionsValueField:'', optionsLabelField:'', multiple:false, filterable:false })" >+添加参数</el-button >
385411 <div style =" margin-top :8px ;color :#909399 ;font-size :12px " >
386- 参数类型:文本/数字/日期/开关/下拉(下拉需填选项,逗号或换行分隔)。默认值在正式访问页生效;访问 URL 带同参数名(如 ?beginDate=2026-01-01)时以 URL 值为准。<br >
387- 数据集 SQL 中用 <code >@参数名</code > 引用即可按查询条件过滤,推荐写成 <code >(@参数名 IS NULL OR 字段 = @参数名)</code > / <code >(@kw IS NULL OR 字段 LIKE '%' || @kw || '%')</code > — 未填值时该条件自动失效(不过滤)。
412+ 参数类型:文本/数字/日期/开关/下拉/单选组/筛选组。下拉支持单选/多选/模糊查询;下拉、单选组、筛选组的选项可用<b >固定选项</b >(逗号或换行分隔)或<b >绑定数据集</b >(选数据集+值字段+显示字段);筛选组与下拉多选的值以逗号拼接传给 SQL。<br >
413+ 默认值在正式访问页生效;访问 URL 带同参数名(如 ?beginDate=2026-01-01)时以 URL 值为准。<br >
414+ 数据集 SQL 中用 <code >@参数名</code > 引用即可按查询条件过滤,推荐 <code >(@参数名 IS NULL OR 字段 = @参数名)</code > — 未填值时该条件自动失效(不过滤)。
388415 </div >
389416 <template #footer >
390417 <el-button @click =" paramDialogVisible=false" >关闭</el-button >
@@ -394,7 +421,7 @@ NOW() / TODAY() / ROW() 当前时间 / 日期 / 行号</pre>
394421 <!-- 预览 -->
395422 <el-dialog v-model =" showPreview" title =" 预览" width =" 90%" top =" 5vh" >
396423 <div style =" display :flex ;gap :8px ;margin-bottom :12px ;flex-wrap :wrap ;align-items :flex-end " >
397- <ReportParams :params =" previewParams " :values =" previewValues " />
424+ <ReportParams :params =" previewParams " :values =" previewValues " : report-id = " form . id " />
398425 <el-button size =" small" type =" primary" @click =" doRender" >查询</el-button >
399426 <el-button size =" small" @click =" doPrint" >打印</el-button >
400427 </div >
@@ -715,7 +742,9 @@ function loadLayoutJson() {
715742 pageHeader .value = layout .page ?.header || ' ' ; pageFooter .value = layout .page ?.footer || ' '
716743 pageBgImage .value = layout .page ?.bgImage || ' '
717744 cells .value = {}; if (layout .cells ) for (const c of layout .cells ) cells .value [` ${c .r },${c .c } ` ] = c
718- previewParams .value = layout .params || []
745+ previewParams .value = layout .params && layout .params .length > 0
746+ ? layout .params
747+ : (() => { try { return JSON .parse (form .paramsConfig || ' []' ) } catch { return [] } })()
719748 if (layout .datasets ) datasets .value = layout .datasets .map ((d : any )=> ({... d ,expanded:true ,loading:false }))
720749 } catch {}
721750}
@@ -1071,6 +1100,8 @@ function onCellDrop(e:DragEvent, r:number, c:number) { const field = e.dataTrans
10711100function onGridScroll() {}
10721101
10731102function saveLayoutJson() {
1103+ // 同步查询参数到 paramsConfig 列(正式访问页读取该字段)
1104+ form .paramsConfig = JSON .stringify (previewParams .value )
10741105 const rows= []; for (let r= 0 ;r < maxRows .value ;r ++ ) rows .push ({
10751106 height:typeof rowHeights .value [r ]=== ' string' ? 25 : (rowHeights .value [r ]|| 25 ),
10761107 type:rowTypes .value [r ] || (rowHeights .value [r ]=== ' data' ? ' data' : ' header' ),
0 commit comments