新增质量模块(工艺执行书 / 样茧试缫)与报表中心
质量模块: - 11 张工艺执行书表:封面、试产、选剥茧(含混茧明细)、试缫与大样、煮茧(含分车间配温、副煮车间)、自动缫(含大样)、后缫 - 10 张样茧试缫表:原料小样/综合样主表 + 选茧、解舒、茧幅、切剖、清洁洁净、茧丝百回纤度 - 服务与接口、主控指针回写(列表 √ 标记)、封面编号自增、报表数据包 - 前端 8 张报表打印版式、7 类工艺单据与 6 类调查录入弹窗、字段驱动表单/表格组件 - 菜单种子新增「质量」目录,样茧子表增加 YjssType 判别列,避免原料小样与综合样自增 Id 重号串数据 报表中心: - 报表模板管理、锐浪 grhtml5 加载与预览、全屏设计面板、数据源 Provider(落丝记录、职工花名册) 其他:同步工作进度 1-11 文档、开发数据库快照、.gitignore 忽略运行日志目录
This commit is contained in:
+167
@@ -0,0 +1,167 @@
|
||||
# 工作进度-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` 字段。
|
||||
Reference in New Issue
Block a user