质量模块: - 11 张工艺执行书表:封面、试产、选剥茧(含混茧明细)、试缫与大样、煮茧(含分车间配温、副煮车间)、自动缫(含大样)、后缫 - 10 张样茧试缫表:原料小样/综合样主表 + 选茧、解舒、茧幅、切剖、清洁洁净、茧丝百回纤度 - 服务与接口、主控指针回写(列表 √ 标记)、封面编号自增、报表数据包 - 前端 8 张报表打印版式、7 类工艺单据与 6 类调查录入弹窗、字段驱动表单/表格组件 - 菜单种子新增「质量」目录,样茧子表增加 YjssType 判别列,避免原料小样与综合样自增 Id 重号串数据 报表中心: - 报表模板管理、锐浪 grhtml5 加载与预览、全屏设计面板、数据源 Provider(落丝记录、职工花名册) 其他:同步工作进度 1-11 文档、开发数据库快照、.gitignore 忽略运行日志目录
7.5 KiB
7.5 KiB
工作进度-9:报表设计页(可视化画布 + 官方设计器入口 + 本系统保存)
时间:2026-10-20(承接工作进度-8) 触发:用户希望「做一个页面,嵌入 Grid++Report 7 的设计页面,并加上本系统的保存按钮」
一、结论:官方设计器无法嵌入网页
先确认事实,避免做出错误承诺:
| 检查项 | 结果 |
|---|---|
web/public/grlib/grhtml5-7-min.js 是否含设计器 API(insertReportDesigner 等) |
❌ 无,只有 insertReportViewer |
D:\GridReport7 安装目录 |
只有查看器库、gr7designer64.exe(Win32 桌面程序)、gr7webapp64.exe(打印客户端)、server\gr7svr*.dll(服务端生成 DLL) |
D:\GridReport7\Samples\Web(html / vue / asp.net / jsp) |
只有 HTML5 查看器示例,无网页设计器 |
原因:GR7 的设计器是 WinForms/Win32 程序,浏览器无法 iframe 内嵌,也没有 ActiveX/JS 设计器接口。
因此本页提供两条可用的设计路径,并在同一页面里放了本系统的「保存模板」按钮:
| 路径 | 排版能力 | 产物格式 | 本页能力 |
|---|---|---|---|
| A. 页面内可视化画布(自研) | 中(页眉/标题/参数行/明细列/页脚/边距/列宽) | JSON(6.8.5.0) |
直接编辑 + 保存 |
| B. 唤起本机锐浪 7 设计器 | 强(官方全功能:分组/合计/图表/条码/套打) | _WR7_ 压缩文本 |
关闭设计器自动回传,本页自动重载 |
关键取舍:用官方设计器保存后模板变成
_WR7_压缩文本,网页画布无法再解析(只能看真实预览、原样保存、继续用设计器)。页面在唤起设计器前会明确提示这一点。
二、页面
2.1 路由(静态注册,不依赖菜单权限)
web/src/router/index.js:
{ path: 'report/design/:id', name: 'ReportDesign',
component: () => import('../views/report/design/index.vue'),
meta: { title: '报表设计', icon: 'Edit' } }
入口:
- 报表管理页列表行「设计」
- 报表编辑器顶栏「设计页」
新增文件:web/src/views/report/design/index.vue。
2.2 页面结构
┌ 返回管理 | 报表名 编号 [JSON/_WR7_] [未保存] 撤销 重新载入 真实预览 上传 下载 [锐浪7设计器] [保存模板] ┐
├ 左(画布,自适应缩放 + 10% 档位缩放) │ 右(属性面板) │
│ A4 白纸:页眉 → 报表头(标题/参数行)→ 明细网格 → 页脚 │ 明细列 / 报表标题 / │
│ 表头单元格可点选,右边缘拖拽改列宽(cm 实时写回模板) │ 页眉页脚 / 行高边距 │
└────────────────────────────────────────────────────────────────────┴──────────────────────────┘
2.3 画布渲染(只读近似 + 真实数据)
- 单位:模板里的
Left/Top/Width/Height是 cm,Font.Size是 1/10000 pt;画布按1cm = 37.795px换算,再用transform: scale()适配容器 - 版块顺序与 GR 一致:
PageHeader→ReportHeader[](逐节)→DetailGrid(表头 + 数据行)→PageFooter - 文本替换:
[#{报表参数}#]→/sys/report/{id}/preview返回的Parameter[0]实际值[#SystemVar(PageNumber)#] / PageCount / CurrentDateTime→ 示例值
- 明细行取
preview.data.recordset前 8 行;无数据时渲染 3 行空行占位,保证排版可见 - 画布上的控件 hover 有虚线框,方便确认位置;真正的字体/边距是否精确以「真实预览」为准
2.4 可编辑项(写回模板 JSON)
| 面板 | 修改的节点 | 说明 |
|---|---|---|
| 明细列 · 列标题 | DetailGrid.ColumnTitle.ColumnTitleCell[].Text |
缺节点时自动补 |
| 明细列 · 列宽 | DetailGrid.Column[].Width |
数字框或画布拖拽,0.4–14cm |
| 明细列 · 添加/删除 | Recordset.Field / Column / ColumnContentCell / ColumnTitleCell |
四处同步增删,避免结构不一致 |
| 报表标题 | 报表头第一节里字号最大的文本控件 Text + 顶层 Title |
找不到控件时给出提示 |
| 标题字号 | 该控件 Font.Size |
6–36pt |
| 页眉/页脚 | PageHeader/PageFooter.Control[].Text |
逐控件文本框 |
| 页眉/页脚高度 | PageHeader/PageFooter.Height |
0–10cm |
| 行高 / 表头高 | ColumnContent.Height / ColumnTitle.Height |
0.3–4cm |
| 上下边距 | Printer.TopMargin / BottomMargin |
0–6cm |
只改已知且我们已在用、能被 GR 正确识别的键,不写未知属性(例如单元格对齐、合并、边框),避免模板被 GR 判为损坏。分组、合计、图表、条码等请用官方设计器。
2.5 保存
复用工作进度-8 新增的接口,不改后端:
PUT /api/sys/report/{id}/template/content { "content": "<JSON 文本>" }
- 保存前序列化
JSON.stringify(doc, null, '\t');服务端做 JSON 语法校验后落库 - 有未保存修改时顶栏显示红色「未保存」,离开页面会二次确认
撤销修改= 重新解析已入库文本
2.6 真实预览 / 上传下载 / 官方设计器
- 真实预览:全屏弹窗内用官方
rubylong.grhtml5.insertReportViewer渲染(模板 URL 带_t时间戳防缓存);有未保存修改时提示「预览的是已保存模板」 - 上传 .grf / 下载 .grf:复用既有接口
- 锐浪 7 设计器:
由
f9designer://open?base=<origin>&rid=<id>&token=<jwt>&code=<报表编号>tools/report-designer/F9ReportDesignerHandler.ps1处理:下载模板 → 启动gr7designer64.exe→ 关闭后自动POST /{id}/template回传 本页在window.focus后延迟 2s 自动重新载入模板(也有「重新载入」按钮兜底)
2.7 _WR7_ / 非 JSON 模板兜底
- 检测到
_WR前缀:不渲染画布,显示说明和三个入口(真实预览 / 用设计器修改 / 去模板源码页) - JSON 解析失败:显示错误 + 引导上传或去源码页修复
三、验证
| 项 | 结果 |
|---|---|
Vite 编译 views/report/design/index.vue(请求 http://localhost:5173/src/views/report/design/index.vue) |
✅ HTTP 200(SFC 编译通过) |
同法验证 ReportEditor.vue / manage/index.vue / router/index.js |
✅ HTTP 200 |
| IDE 诊断(4 个改动文件) | ✅ 0 |
| 后端 | 未改动(复用 PUT /template/content),无需重新编译 |
| 浏览器实操(登录点一遍) | ⚠ 未执行:当前环境无 node / playwright-cli,无法自动化;Vite 已确认可编译,建议人工点一遍 |
保存模板需要后端已重启(工作进度-8 的接口)。
四、遗留
_WR7_无解码器:用过官方设计器后画布失效,这是格式决定的;若要两者兼得,需要锐浪的decodeWR算法或官方提供 JSON 导出。- 画布不是 100% 像素级还原:字体度量、单元格对齐、自动行高与 GR 有差异,最终以「真实预览」为准。
- 未支持控件级拖拽/属性编辑:位置
Left/Top、边框、颜色、对齐暂不开放,避免写入未经验证的键。 - 样本数据依赖
/preview:需要参数才能出数的报表会显示空行占位;后续可加「手工填参数再取样本」。 - 无模板版本历史:画布改坏后只能重新生成模板或用设计器重排。