# 工作进度-7:报表参数与查询条件分离(概念校准 + 参数区修复) > 时间:2026-10-20(承接工作进度-6) > 触发:用户指出「`Parameter_Data` 里的这些才是参数,`Config.Parms` 的 q_* 是查询条件,不是报表参数」 --- ## 一、问题 之前的模板生成把 **查询条件**(`Config.Parms` 的 `q_date_start` / `q_dep`…)直接写进了模板的 `Parameter` 节点与报表头,导致: - 模板参数变成 `q_date_start, q_date_end, q_dep`(业务上毫无意义的内部键) - 报表头显示的是"查询条件的名字",不是"本次查询的统计口径" - 日期参数空值被默认成"今天",报表默认只查当天 正确的分层: | 概念 | 代码位置 | 用途 | 示例 | |---|---|---|---| | **查询条件** | `Config.Parms`(`q_*`) | 渲染查询面板,值随请求传给后端 | `q_date_start` / `q_dep` / `q_like` | | **报表参数** | 后端 `DataSource.Parameter_Data` | 查询执行后返回,供模板头/合计区展示 | `开始日期` / `车间` / `记录数` / `查询时间` | --- ## 二、后端 ### 2.1 探测结果带回报表参数(数据驱动,不是硬编码) `ReportScaffoldDtos.cs` 新增: ```csharp public class ReportParamValueDto { public string Name; public string Value; } // ReportProbeResultDto 增加 List Parameters ``` `ReportService.FillFromProviderAsync`: ```csharp var paramDatum = dataSource.Report_Data.FirstOrDefault(kv => kv.Value?.Parameter_Data != null); result.Parameters = ToNameValueDict(paramDatum.Value.Parameter_Data) .Select(kv => new ReportParamValueDto { Name = kv.Key, Value = kv.Value?.ToString() ?? "" }) .ToList(); ``` > 仍然遵守进度-6 的结论:Provider 不声明元数据,参数与列**都从查询结果里取**。 ### 2.2 内置模板 `lsjl.grf` - 参数绑定由 `"Parameter": "开始日期"` 改为文本标记 `"Text": "开始日期:[#{开始日期}#]"` - 控件类型必须是 **MemoBox**(实测见第五节) - 顶层 `Parameter` 声明为 7 个报表参数:开始日期 / 结束日期 / 车间 / 机组 / 庄口 / 记录数 / 查询时间 ### 2.3 种子自愈(`DbSeeder.SeedLsjlReport`) 旧库里的模板/配置会被自动升级,且**不会覆盖用户手工配置**: | 判定 | 行为 | |---|---| | `Config.Parms` 为空,或所有 `Label` 都为空(程序生成的占位配置) | 重写为规范的 6 个查询条件(中文标签、日期默认值「不限」) | | 模板是我们生成的(`Author = F9 报表中心`)且含 `"Parameter": "开始日期"` | 替换为内置模板 | | 模板是我们生成的且 `Parameter` 里出现 `q_*`(查询条件混入) | 替换为内置模板 | | 模板是我们生成的且存在 `StaticBox` + `[#{...}#]`(渲染不解析) | 替换为内置模板 | 用户自己设计/上传的模板(`_WR7_` 或 Author 不是我们)一律不动。 --- ## 三、前端(`ReportEditor.vue`) ### 3.1 左栏 tab 拆分 从「配置 / 参数 / 明细字段」改为: | tab | 内容 | |---|---| | 配置 | 编号、名称、分组、数据源、数据 SQL、备注 | | **查询条件 (n)** | `Config.Parms`:参数名 / 标签 / 控件类型 / 默认值 / 提示,附说明"不进入模板" | | **报表参数 (n)** | 只读列表:后端 `Parameter_Data` 的键与当前值,附说明"来自后端 Parameter_Data" | | 明细字段 (n) | 列名 / 列标题 / 列宽,可生成模板 | ### 3.2 模板生成改用报表参数 ```js // 之前:parms.value(查询条件)→ 模板 Parameter + Parameter 属性绑定 // 现在:reportParams.value(报表参数)→ 模板 Parameter + MemoBox 文本 [#{名称}#] Parameter: reportParams.value.map((p) => ({ Name: p.name, DataType: 'String' })) Text: `${p.name}:[#{${p.name}}#]` // 控件 Type = MemoBox ``` - 识别数据源时(`/scaffold`)同步填充报表参数 - 点「刷新预览」后用 `/preview` 返回的 `Parameter` 覆盖一次,保证与真实查询口径一致 - 编辑已有报表时从模板 `Parameter` 节点反解(`_WR7_` 无法反解,显示提示) --- ## 四、验证记录 ### 4.1 接口 ``` POST /sys/report/scaffold { dsName: RepDt_Prod_Lsjl } FIELDS=13 PARAMS=7 开始日期 = "" 结束日期 = "" 车间 = (全部) 机组 = (全部) 庄口 = (全部) 记录数 = 3 查询时间 = 2026-10-20 15:52:47 ``` ### 4.2 报表中心渲染(GR7 HTML5) ``` 落丝记录 开始日期: 结束日期: 车间:(全部) 机组:(全部) 庄口:(全部) 记录数:3 查询时间:2026-10-20 15:52:47 日期 车间 机组 庄口 回数 颜色 半车 落丝时间 缫丝桶数 2026-09-09 前缫车间 1 … 16:21:32 20 2026-10-20 前缫车间 1 … 14:16:35 20 2026-10-20 前缫一车间 2 … 14:30:06 20 ``` ### 4.3 报表管理页(新建 → 识别 → 生成模板) ``` TABS=配置, 查询条件 (0), 报表参数 (7), 明细字段 (13) 报表参数 = 开始日期— / 结束日期— / 车间(全部) / 机组(全部) / 庄口(全部) / 记录数3 / 查询时间… 生成模板后入库: TPL_PARAMS=开始日期,结束日期,车间,机组,庄口,记录数,查询时间 HEADER_TEXT=开始日期:[#{开始日期}#] | … | 查询时间:[#{查询时间}#] ``` ### 4.4 关键实测:`[#{参数名}#]` 只在 MemoBox 生效 用两张最小模板对照渲染(同一份数据 `{ Parameter: [{ 车间: "(全部)" }] }`): | 模板 | 控件 | 写法 | 渲染结果 | |---|---|---|---| | A1 | StaticBox | `[#{车间}#]` | `A1-[#{车间}#]`(**原样,未替换**) | | A2 | MemoBox | `[#{车间}#]` | `A2-(全部)` ✅ | | B1 | StaticBox | `[#车间#]`(无花括号) | `B1-[#车间#]`(不替换) | | B2 | StaticBox | `Parameter` 属性 | `(全部)` ✅(旧方式仍可用) | 结论:**参数显示控件必须用 MemoBox + `[#{参数名}#]`**;StaticBox 只认 `Parameter` 属性。 --- ## 五、当前状态 | 项 | 状态 | |---|---| | 「查询条件」与「报表参数」在 UI/模板/接口上彻底分开 | ✅ | | 模板 `Parameter` 只包含报表参数(中文口径) | ✅ | | 报表头参数区正确显示值(含空日期、记录数、查询时间) | ✅ | | 查询条件不再进入模板,也不参与模板参数渲染 | ✅ | | 旧库模板/配置自动升级(限于我们生成的模板) | ✅ | | 日期范围参数默认「不限」,不再默认当天 | ✅ | --- ## 六、遗留 1. **`_WR7_` 模板无法反解参数**:设计器模板的「报表参数」页为空,需点「识别明细列与报表参数」重新获取。 2. **报表参数目前只读**:如需要"某些参数不打印""参数排序",可在报表参数页加勾选/拖动。 3. **合计/小计**:`Parameter_Data` 已能承载汇总口径,但模板还没有 `Groups` + `SummaryBox` 合计区,下一步可加。 4. **报表中心参数默认值语义**:`DefaultValue="不限"` 是约定字符串,后续应改为显式的 `DefaultValueType` 字段。