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

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

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

178 lines
8.8 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.
# 工作进度-6:落丝记录报表(生产-前缫)落地实现
> 时间:2026-10-20(承接工作进度-5)
> 环境:后端 .NET 8 + FreeSql + MediatR(Windows/SQLite),前端 Vue3 + Element Plus + Vite
> 目标:把「落丝记录」从占位报表补成**可查询、可打印的正式报表**(DsName + 参数 + 明细列 + 模板全链路)
---
## 一、改造前的状态(问题定位)
数据库里已有报表 `PROD_QS_1 / 落丝记录`,但只是占位:
| 项 | 改造前 |
|---|---|
| `Config.DsName` | 空(`"DsName":""`) |
| `Config.Parms` | 仅 1 个 `q_date`,`Label` 为空、控件为 `AntdUI.DatePicker` |
| `DataSql` | `SELECT 1` |
| 模板 | 早期「上传测试」产物:`Title` 空、报表头标题为空文本、无参数区、9 列列宽全 2.5cm |
| 数据链路 | `DsName` 为空 → 落回 `SELECT 1` → 报表永远空 |
---
## 二、后端实现
### 2.1 新增文件
| 文件 | 说明 |
|---|---|
| `Application/CQRS/SYS/Reports/Queries/GetLsjlRepQuery.cs` | 报表查询:日期范围 / 车间(含子车间)/ 机组 / 庄口 / 关键字过滤,输出中文列名记录集 + 报表参数 |
| `Application/Services/Reports/Providers/RepDt_Prod_Lsjl.cs` | Provider(`ReportName = RepDt_Prod_Lsjl`),实现 `IReportDataProviderMeta`(6 个参数声明 + 13 个字段中文名) |
| `Infrastructure/Assets/ReportTemplates/lsjl.grf` | 内置模板(嵌入资源):标题 + 参数区 + 9 列明细网格 + 页码/打印时间页脚 |
| `DbSeeder.SeedLsjlReport(...)` | 幂等种子:报表定义 + 查询配置 + 权限单元 + 模板 |
### 2.2 查询参数
| 参数名 | 标签 | 控件 | 说明 |
|---|---|---|---|
| `q_date_start` | 开始日期 | `AntdUI.DatePicker` | 默认值 `不限`(不预填今天) |
| `q_date_end` | 结束日期 | `AntdUI.DatePicker` | 默认值 `不限` |
| `q_dep` | 车间 | `F9-DEP-QS-SELECT` | 前缫口径部门树,**含子车间** |
| `q_jizu` | 机组 | `AntdUI.Input` | 数字,留空为全部 |
| `q_zk` | 庄口 | `F9-GYZK-SELECT` | 打开工艺庄口选择页,取值 = 庄口 Id |
| `q_like` | 关键字 | `AntdUI.Input` | 匹配 庄口名 / 规格 / 颜色 |
### 2.3 明细列(键名与 F9 落丝记录模板一致,中文)
| 报表列 | 取值 |
|---|---|
| 日期 | `WorkDate.ToString("yyyy-MM-dd")` |
| 车间 | 部门名(DeptId → Department.Name) |
| 机组 | `Jizu` |
| 庄口 | 工艺庄口名(GyzkId → CraftZhuangKou.ZhuangKouName) |
| 回数 | `Huishu` |
| 颜色 | `Yanse` |
| 半车 | `Isbanche ? "半车" : "整车"` |
| 落丝时间 | `LuosiTime` |
| 缫丝桶数 | `Chetaishu`(车台数) |
| 规格 / 车台范围 / 缫丝时长 / 车速 | 备选列(模板未用不显示,自定义模板可用) |
报表参数(模板头展示):开始日期 / 结束日期 / 车间 / 机组 / 庄口 / 记录数 / 查询时间。
### 2.4 种子策略(幂等,不覆盖用户成果)
| 场景 | 行为 |
|---|---|
| 报表不存在 | 创建报表 + 写入内置模板 `lsjl.grf` + 创建权限单元并授权 admin |
| 已存在且 `Config` 不含 `RepDt_Prod_Lsjl` | 只补齐查询配置,`DataSql` 置空(避免与 DsName 混淆) |
| 已存在且模板是占位模板 | 替换为内置模板。判定:JSON 模板 + `Title` 为空 + 未声明任何 `Parameter`;`_WR7_` 压缩模板一律不覆盖 |
> 用户在设计器里做过正式模板(有标题/参数)后,重启不会被动覆盖。
---
## 三、顺带修掉的两个真缺陷
| # | 问题 | 根因 | 解决 |
|---|---|---|---|
| 1 | 0 行数据时报表参数区错位(`(全部)2(全部)` 跑到明细网格下方) | `ToGridReportJson` 只输出有数据的数据集,0 行时**连 `recordset` 键都不输出** → 渲染库找不到主记录集,参数绑定错乱 | 后端 0 行时输出 `"recordset": []`;前端报表中心 + 编辑器预览改走「当前查询条件没有数据」空态,不再交给渲染库 |
| 2 | 日期范围参数默认预填「今天」,落丝记录默认只查到当天 1 条 | `paramInitialValue` 对空 `DefaultValue` 的日期控件一律返回今天(为单日期参数设计) | 新增 `DefaultValue = "不限"` 约定(`不限/不填/none/null/empty` → 空值),仅日期范围参数使用;其他报表行为不变 |
---
## 四、验证记录
### 4.1 接口层(参数过滤矩阵)
```
全部 rows=2 dates=2026-09-09,2026-10-20
机组=1 rows=2 dates=2026-09-09,2026-10-20
机组=2 rows=0
开始日期≥2026-10-01 rows=1 dates=2026-10-20
结束日期≤2026-09-30 rows=1 dates=2026-09-09
关键字=蓝色 rows=2 dates=2026-09-09,2026-10-20
关键字=20/22 rows=2 dates=2026-09-09,2026-10-20
车间=前缫车间(26) rows=2 dates=2026-09-09,2026-10-20
车间=后缫(27) rows=0
日期范围 09-01~09-30 rows=1 dates=2026-09-09
PARAMETER={"开始日期":"","结束日期":"","车间":"(全部)","机组":"(全部)","庄口":"(全部)","记录数":2,"查询时间":"..."}
```
数据源探测(进度-5 的自动配置接口):
```
DS_LIST: 落丝记录 / RepDt_Prod_Lsjl / params=6
PROBE total=2 fields=13 parms=6
FIELDS=日期,车间,机组,庄口,回数,颜色,半车,落丝时间,缫丝桶数,规格,车台范围,缫丝时长,车速
```
### 4.2 报表中心(GR7 渲染)
```
TREE=生产 / 前缫 / 落丝记录 / 用户 / 职工花名册
QP_LABELS=开始日期,结束日期,车间,机组,庄口,关键字
QP_KINDS=date,date,select,input,picker,input
VIEWER_TEXT=落丝记录 开始日期: 结束日期: 车间:(全部) 机组:(全部) 庄口:(全部)
记录数:2 查询时间:2026-10-20 14:26:00
日期 车间 机组 庄口 回数 颜色 半车 落丝时间 缫丝桶数
2026-09-09 前缫车间 1 2026会东二类茧(7532)宁兴 1 蓝色 整车 16:21:32 20
2026-10-20 前缫车间 1 2026会东二类茧(7532)宁兴 1 蓝色 整车 14:16:35 20
```
界面交互(改控件 → 点查询):
```
INIT_ROWS=2 机组=1 → 2 机组=2 → 无数据(显示「当前查询条件没有数据」)
重置 → 2 关键字=宁兴 → 2
```
### 4.3 报表管理页(编辑器)
```
TOPBAR=编辑报表 · 落丝记录 TAG=模板已配置
LEFT_TABS=配置,参数 (6),明细字段 (9)
FIELD_NAMES=日期,车间,机组,庄口,回数,颜色,半车,落丝时间,缫丝桶数
VIEWER_TEXT=落丝记录 开始日期: 结束日期: 车间:(全部)… 2 行数据
```
### 4.4 编译 / 运行
- 后端 `dotnet build`:**0 错误**
- 前端无 lint 诊断
- 服务:后端 `http://localhost:3000`、前端 `http://localhost:5173` 运行中
---
## 五、当前状态
| 项 | 状态 |
|---|---|
| 落丝记录报表数据链路(DsName → Provider → CQRS) | ✅ |
| 6 个查询参数(日期范围 / 车间含子车间 / 机组 / 庄口 / 关键字) | ✅ 界面控件类型正确、过滤生效 |
| 明细 9 列(标题、列宽、中文数据) | ✅ |
| 报表头:标题 + 参数区(查询条件回显) | ✅ 内置模板 `lsjl.grf` |
| 0 行查询 | ✅ 显示「没有数据」,不再错位 |
| 报表中心 / 报表管理两个入口 | ✅ 均可正常渲染与打印导出 |
| 模板可继续设计器维护 | ✅ 下载 `.grf` → 改 → 上传;占位判定不会误覆盖正式模板 |
---
## 六、遗留与后续建议
1. **列宽与纸张**:内置模板 9 列合计约 17.3cm,横向内容紧张时会在 `ResizeToFit` 下缩放;若要更宽可改模板 `Printer` 或减少列。
2. **车间默认值**:`F9-DEP-QS-SELECT` 会默认选中登录用户部门(F9 口径),因此非 admin 用户打开默认只看本车间;如需默认全部,可把该参数控件换成 `F9-DEP-ALL-SELECT` 或清空 `defaultFromUser`。
3. **班组 / 班次维度**:落丝记录暂无班次字段,若后续按班次统计需在 `LsjlRecord` 补字段并同步报表。
4. **同类报表复用**:`纤度检验 / 黑板检验` 可按本轮的「Query + Provider + 内置模板 + 种子」模板照做,或直接用进度-5 的新增报表自动配置(选 DsName 即可识别参数与列)。
5. **进度-5 遗留仍在**:`_WR7_` 模板不能反解列、探测需真实执行查询、进度-3 的 `Number()` 精度隐患等。
---
## 七、工作进度文档约定(协作规则)
工作进度文档**不再每轮对话都生成**,按以下规则执行:
- **只在上下文即将结束**(或用户明确要求「记一下进度」)时,才把这一阶段的改动一次性汇总成当轮进度文档
- 中间过程只在对话里说明改动与验证结果,不落盘成文档
- 已产出的 `工作进度-1 ~ 6.md` 保留不动;本篇作为落丝记录报表的阶段成果留档
- 若某次改动比较关键、需要立刻留档,由用户明确说「记一下进度」后再生成