质量模块: - 11 张工艺执行书表:封面、试产、选剥茧(含混茧明细)、试缫与大样、煮茧(含分车间配温、副煮车间)、自动缫(含大样)、后缫 - 10 张样茧试缫表:原料小样/综合样主表 + 选茧、解舒、茧幅、切剖、清洁洁净、茧丝百回纤度 - 服务与接口、主控指针回写(列表 √ 标记)、封面编号自增、报表数据包 - 前端 8 张报表打印版式、7 类工艺单据与 6 类调查录入弹窗、字段驱动表单/表格组件 - 菜单种子新增「质量」目录,样茧子表增加 YjssType 判别列,避免原料小样与综合样自增 Id 重号串数据 报表中心: - 报表模板管理、锐浪 grhtml5 加载与预览、全屏设计面板、数据源 Provider(落丝记录、职工花名册) 其他:同步工作进度 1-11 文档、开发数据库快照、.gitignore 忽略运行日志目录
178 lines
8.8 KiB
Markdown
178 lines
8.8 KiB
Markdown
# 工作进度-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` 保留不动;本篇作为落丝记录报表的阶段成果留档
|
||
- 若某次改动比较关键、需要立刻留档,由用户明确说「记一下进度」后再生成
|