Files
f9-web-ai-test/工作进度/工作进度-7.md
T
yanpeng200212 a8890c81e9 新增质量模块(工艺执行书 / 样茧试缫)与报表中心
质量模块:
- 11 张工艺执行书表:封面、试产、选剥茧(含混茧明细)、试缫与大样、煮茧(含分车间配温、副煮车间)、自动缫(含大样)、后缫
- 10 张样茧试缫表:原料小样/综合样主表 + 选茧、解舒、茧幅、切剖、清洁洁净、茧丝百回纤度
- 服务与接口、主控指针回写(列表 √ 标记)、封面编号自增、报表数据包
- 前端 8 张报表打印版式、7 类工艺单据与 6 类调查录入弹窗、字段驱动表单/表格组件
- 菜单种子新增「质量」目录,样茧子表增加 YjssType 判别列,避免原料小样与综合样自增 Id 重号串数据

报表中心:
- 报表模板管理、锐浪 grhtml5 加载与预览、全屏设计面板、数据源 Provider(落丝记录、职工花名册)

其他:同步工作进度 1-11 文档、开发数据库快照、.gitignore 忽略运行日志目录
2026-10-22 10:30:37 +08:00

168 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 工作进度-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<ReportParamValueDto> 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` 字段。