Files
bj_power/bj_power_workstation/临时文件.md
T

520 lines
23 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.
如何描述清楚功能,是个大事情
现状描述:
1、现在代码是,完全复制的https://bjhardman.cn/bjhardman/hougai_insize_micrometer.git ,目的仅仅是为了 阅读,实际将来我要引用这个git,因为它封装了千分尺的通讯(即:监控Windows,采集千分尺测量的数据)。
2、hougai_insize_micrometer.git,还有一些对我有用的内容,比如他的页面风格。govcl写的。
下面描述是 真正的 需求,根据具体需求,仅保留hougai_insize_micrometer.git有用内容,例如:技术架构
说明:下文中 原git 就是指的 hougai_insize_micrometer.git
要求:
1、引用 hougai_insize_micrometer.git,它里面已经包含 千分尺的采集模块。
2、生产环境部署在 window ,要求用govcl、 有托盘、有桌面图标、开机自启、自动全屏显示、桌面快捷图标、固定开始屏幕、点击输入框自动弹出系统软键盘输入法
3、没有数据库,用8888接口请求,模仿 原git 代码写法。(8888没有开发呢,你先写着,定义好 url、出入参)
4、8888 是/Users/syf/space/hardman/spherical 这个服务器 启动地址
页面和功能描述(参考图片样式,图片是 原git,下面统称 jpg):
************************************************************************************************
************************************************************************************************
在原git 页面基础上,我对页面进行了布局 重新描述。(我把原页面让ai转成 布局描述)
布局描述 如下:
核心策略:结构化 + 控件化(govcl / Lazarus LCL 风格)
不要写长篇大论的散文,要用配置表格式描述每个控件的位置、属性和样式。
1. 全局设置 (Global Config)
基准窗口:1280 x 720PoScreenCenter 居中,Caption = "7315-2 千分尺采集"。
配色风格(govcl 体系):
面板底色:colors.ClBtnFace(系统默认灰,约 #F0F0F0
选中高亮:types.TColor(0x00FFE0C0)(浅暖橙,与现有项目一致)
状态绿:colors.ClGreen
状态红:colors.ClRed
字体:默认微软雅黑(系统默认),数字 label 不做额外等宽处理(govcl 对 Consolas 不敏感)。
布局方式:绝对定位(Left / Top / Width / Height),间距常量 gapX=8, gapY=10。
缩放机制:基于 baseW=1280 / baseH=720relayout() 中按 sx/sy 等比缩放,字号、宽高均 clamp 下限。
2. 区域拆解 (Area Breakdown)
三模块:顶部控制栏 / 仪表盘显示区 / 操作与数据区。
模块 A:顶部控制栏
位置:top0 = 8,从左到右水平排列,垂直居中对齐。
控件列表(按 Left 递增):
控件 | 类型 | Left | Top | Width | Height | 关键属性
[portLab] | TLabel | 12 | 13 | Auto | Auto | Caption="串口:"FontSize=12
[portCombo] | TComboBox | 56 | 8 | 110 | 28 | Style=CsDropDownList,默认选中第一项(COM7 优先)
[statusLabel] | TLabel | 172 | 12 | 120 | 24 | Caption="●已连接"=ClGreen / "●未连接"=ClBtnFace / "●已断开"=ClRedFontSize=12
[connectBtn] | TButton | 296 | 8 | 60 | 28 | Caption 切换 "连接"/"断开"
[refreshBtn] | TButton | 360 | 8 | 60 | 28 | Caption="刷新"
[labU] | TLabel | 440 | 12 | Auto | Auto | Caption="单位:"FontSize=12
[rbMM] | TRadioButton | 490 | 10 | Auto | Auto | Caption="mm"Checked(同 Form 下自动互斥)
[rbInch] | TRadioButton | 550 | 10 | Auto | Auto | Caption="inch"
[autoStartChk]| TCheckBox | 610 | 12 | Auto | Auto | Caption="开机启动"Checked 同步注册表
模块 B:仪表盘显示区(4 卡片面板)
容器:TPanelBevelOuter=BvRaised(凸起卡片效果),4 个水平排列。
位置:top0 = 50Left = 16 + i*(panelW + gapX),其中 panelW = (cw - 5*gapX)/4(响应式等分)。
面板内部:父 = 对应 TPanel,3 行 TLabel 垂直居中。
卡片 n 内部控件(以卡片 1 为例):
控件 | 类型 | Align | Alignment | FontSize | 说明
row.name | TLabel | alTop | taCenter | nameSize=13 | Caption="① 左侧底孔 B"
row.value | TLabel | alTop | taCenter | valSize=24 | Caption="----"Layout=tlCenter,点击弹 NumKeypad;范围 clamp(20,96)
row.unit | TLabel | alTop | taCenter | unitSize=14 | Caption="mm"(随 rbMM/rbInch 切换)
四卡片内容:
卡片 | name Caption | value 示例
1 | "① 左侧底孔 B" | "425.282"
2 | "② 变量活塞孔大孔 D" | "425.282"
3 | "③ 变量活塞孔小孔 E" | "423.151"
4 | "④ 右侧变量活塞孔 M" | "423.151"
高亮状态:当前选中面板 → panel.Color = TColor(0x00FFE0C0);未选中 → colors.ClBtnFace。
govcl TPanel 无圆角/border 颜色能力,用 BevelOuter + Color 区分即可。)
模块 C:操作与数据区
中间行:
控件 | 类型 | 定位 | FontSize | 说明
[bottomLabel] | TLabel | Left=16, Top=panelH+top0+12 | 11 | Caption="序列号: XXXXX 末帧 seq=XX HH:MM:SS"(动态更新)
[clearBtn] | TButton | 右下区域,动态计算 | 22 | Caption="清除",宽高基准 200x70,随 sx/sy 缩放
[submitBtn] | TButton | 右下区域,clearBtn 左侧 | 22 | Caption="提交",宽高基准 200x70
底部表格:
容器:TListViewViewStyle=VsReportReadOnly=trueRowSelect=trueGridLines=true。
FontSize=12(范围 10-20)。
9 列定义(列宽随 sx 缩放,末列占剩余宽度):
序号 | Caption | 基准 Width
1 | 时间 | 130
2 | 工件号 | 110
3 | 工单号 | 110
4 | 托盘码 | 100
5 | 分类 | 90
6 | 左侧底孔 B | 120
7 | 活塞孔大 D | 120
8 | 活塞孔小 E | 120
9 | 活塞孔右 M | 剩余 cw - 前8列(min=100
govcl TListView 不支持斑马纹,通过 GridLines 保证可读性即可。)
************************************************************************************************
************************************************************************************************
按需求修改 后 的 布局描述 如下:
核心策略:结构化 + 控件化(govcl / Lazarus LCL 风格)
不要写长篇大论的散文,要用配置表格式描述每个控件的位置、属性和样式。
1. 全局设置 (Global Config)
基准窗口:1280 x 720PoScreenCenter 居中,Caption = "7315-2 千分尺采集"。
配色风格(govcl 体系):
面板底色:colors.ClBtnFace(系统默认灰,约 #F0F0F0
选中高亮:types.TColor(0x00FFE0C0)(浅暖橙,与现有项目一致)
状态绿:colors.ClGreen
状态红:colors.ClRed
字体:默认微软雅黑(系统默认),数字 label 不做额外等宽处理(govcl 对 Consolas 不敏感)。
布局方式:绝对定位(Left / Top / Width / Height),间距常量 gapX=8, gapY=10。
缩放机制:基于 baseW=1280 / baseH=720relayout() 中按 sx/sy 等比缩放,字号、宽高均 clamp 下限。
2. 区域拆解 (Area Breakdown)
三模块:顶部控制栏 / 工单信息 / 仪表盘显示区 / 操作与数据区。
模块 A:顶部控制栏
位置:top0 = 8,从左到右水平排列,垂直居中对齐。
控件列表(按 Left 递增):
控件 | 类型 | Left | Top | Width | Height | 关键属性
[portLab] | TLabel | 12 | 13 | Auto | Auto | Caption="串口:"FontSize=12
[portCombo] | TComboBox | 56 | 8 | 110 | 28 | Style=CsDropDownList,默认选中第一项(COM7 优先)
[statusLabel] | TLabel | 172 | 12 | 120 | 24 | Caption="●已连接"=ClGreen / "●未连接"=ClBtnFace / "●已断开"=ClRedFontSize=12
[connectBtn] | TButton | 296 | 8 | 60 | 28 | Caption 切换 "连接"/"断开"
[refreshBtn] | TButton | 360 | 8 | 60 | 28 | Caption="刷新"
[labU] | TLabel | 440 | 12 | Auto | Auto | Caption="单位:"FontSize=12
[rbMM] | TRadioButton | 490 | 10 | Auto | Auto | Caption="mm"Checked(同 Form 下自动互斥)
[rbInch] | TRadioButton | 550 | 10 | Auto | Auto | Caption="inch"
[autoStartChk]| TCheckBox | 610 | 12 | Auto | Auto | Caption="开机启动"Checked 同步注册表
模块 B:工单信息
来源说明:输入工单号,查询出来的,包括工件数量、工件类型、工单状态、创建时间。
位置:top0 = 48,从左到右水平排列,垂直居中对齐。
控件列表(按 Left 递增):
控件 | 类型 | Left | Top | Width | Height | 关键属性
[workOrderNoLabel]| TLabel | 12 | 53 | Auto | Auto | Caption="工单号:"FontSize=12
[workOrderNoEdit] | TEdit | 72 | 48 | 200 | 28 | Text=""Placeholder="请输入工单号"
[queryBtn] | TButton | 278 | 48 | 70 | 28 | Caption="查询"
[typeLabel] | TLabel | 356 | 53 | Auto | Auto | Caption="工件类型:"FontSize=12
[typeCombo] | TComboBox | 426 | 48 | 120 | 28 | Style=CsDropDownListReadOnly=true
[countLabel] | TLabel | 554 | 53 | Auto | Auto | Caption="工件数量:"FontSize=12
[countValue] | TLabel | 626 | 53 | 60 | Auto | Caption="--"FontSize=12
[statusLabel] | TLabel | 694 | 53 | Auto | Auto | Caption="工单状态:"FontSize=12
[statusValue] | TLabel | 766 | 53 | 80 | Auto | Caption="--"FontSize=12
[timeLabel] | TLabel | 854 | 53 | Auto | Auto | Caption="创建时间:"FontSize=12
[timeValue] | TLabel | 934 | 53 | 220 | Auto | Caption="--"FontSize=12
模块 C:仪表盘显示区(动态面板)(工件类型是“方形” 对应1 卡片面板)(工件类型是“圆形” 对应3 卡片面板)
容器:TPanelBevelOuter=BvRaised(凸起卡片效果),水平排列。
位置:top0 = 84Left = 16 + i*(panelW + gapX),其中:
- 方形(1卡片):panelW = cw - 32(左右边距各16
- 圆形(3卡片):panelW = (cw - 4*gapX - 32)/3(响应式等分)
面板内部:父 = 对应 TPanel,3 行 TLabel 垂直居中。
卡片 n 内部控件(以卡片 1 为例):
控件 | 类型 | Align | Alignment | FontSize | 说明
row.name | TLabel | alTop | taCenter | nameSize=13 | Caption="① 弧面半径 B"(方形)/ "① 球面直径 A"(圆形)
row.value | TLabel | alTop | taCenter | valSize=24 | Caption="----"Layout=tlCenter,点击弹 NumKeypad;范围 clamp(20,96)
row.unit | TLabel | alTop | taCenter | unitSize=14 | Caption="mm"(随 rbMM/rbInch 切换)
方形(1卡片)内容:
卡片 | name Caption | value 示例
1 | "① 弧面半径 B" | "425.282"
圆形(3卡片)内容:
卡片 | name Caption | value 示例
1 | "① 球面直径 A" | "425.282"
2 | "② 球面轮廓度 B" | "425.282"
3 | "③ 球面位置 C" | "423.151"
高亮状态:当前选中面板 → panel.Color = TColor(0x00FFE0C0);未选中 → colors.ClBtnFace。
govcl TPanel 无圆角/border 颜色能力,用 BevelOuter + Color 区分即可。)
模块 D:操作与数据区
中间行:
控件 | 类型 | 定位 | FontSize | 说明
[bottomLabel] | TLabel | Left=16, Top=panelH+top0+12 | 11 | Caption="序列号: XXXXX 末帧 seq=XX HH:MM:SS"(动态更新)
[workpieceNoLabel]| TLabel | Left=16, Top=panelH+top0+40 | 12 | Caption="工件号:"
[workpieceNoEdit] | TEdit | Left=80, Top=panelH+top0+36, Width=150| 12 | Text=""Placeholder="请输入工件号"
[filterBtn] | TButton | Left=238, Top=panelH+top0+36, Width=60| 12 | Caption="筛选"
[clearBtn] | TButton | 右下区域,动态计算 | 22 | Caption="清除",宽高基准 200x70,随 sx/sy 缩放
[submitBtn] | TButton | 右下区域,clearBtn 左侧 | 22 | Caption="提交",宽高基准 200x70
底部表格:
容器:TListViewViewStyle=VsReportReadOnly=trueRowSelect=trueGridLines=true。
FontSize=12(范围 10-20)。
列定义(列宽随 sx 缩放,末列占剩余宽度,根据工件类型动态显示测量列):
方形(5列):
序号 | Caption | 基准 Width
1 | 时间 | 130
2 | 工单号 | 130
3 | 工件号 | 110
4 | 分类 | 90
5 | 弧面半径 B | 剩余 cw - 前4列(min=120
圆形(7列):
序号 | Caption | 基准 Width
1 | 时间 | 130
2 | 工单号 | 130
3 | 工件号 | 110
4 | 分类 | 90
5 | 球面直径 A | 120
6 | 球面轮廓度 B | 120
7 | 球面位置 C | 剩余 cw - 前6列(min=100
govcl TListView 不支持斑马纹,通过 GridLines 保证可读性即可。)
功能交互描写:
1、模块 B:工单信息:输入工单号,点击"查询"按钮,调用 8888 查询工单信息,并展示工件类型、工件数量、工单状态、创建时间。
2、根据查询返回的工件类型,动态切换仪表盘显示区:方形 → 1卡片面板,圆形 → 3卡片面板。
3、工件号输入框:输入工件号后点击"筛选"按钮,调用8888查询对应工件的测量记录,填充底部表格。
4、提交按钮:点击提交前检查工单号是否填写,未填写则提示;提交成功后自动刷新底部表格。
---
8888 后端 API 接口定义(服务地址:http://localhost:8888
接口 1:查询工单信息
- 路径:GET /api/v1/work-order/query
- 入参:
- work_order_no (string, 必填): 工单号
- 响应:
```json
{
"code": 0,
"msg": "success",
"data": {
"work_order_no": "WO-2024001-001",
"workpiece_type": "square",
"workpiece_type_name": "方形",
"workpiece_count": 100,
"status": "processing",
"status_name": "处理中",
"created_at": "2024-01-15 10:30:00"
}
}
```
- 字段说明:
- workpiece_type: "square"(方形)/ "circle"(圆形)
- status: 参考 public.work_order.status 枚举值
接口 2:查询工件测量记录列表
- 路径:GET /api/v1/measurement/list
- 入参:
- work_order_no (string, 必填): 工单号
- workpiece_no (string, 可选): 工件号(过滤条件)
- page (int, 默认 1): 页码
- limit (int, 默认 20): 每页数量
- 响应:
```json
{
"code": 0,
"msg": "success",
"data": {
"list": [
{
"id": 1,
"work_order_no": "WO-2024001-001",
"workpiece_no": "WP-001",
"category": "A类",
"workpiece_type": "circle",
"value_a": 425.282,
"value_b": 425.282,
"value_c": 423.151,
"unit": "mm",
"created_at": "2024-01-15 11:00:00"
}
],
"total": 150,
"page": 1,
"limit": 20
}
}
```
- 字段说明:
- value_a: 球面直径 A(圆形)/ 弧面半径 B(方形)
- value_b: 球面轮廓度 B(圆形)
- value_c: 球面位置 C(圆形)
- category: 分类
- 方形工件仅返回 value_a
接口 3:提交测量数据
- 路径:POST /api/v1/measurement/upload
- 入参:
```json
{
"work_order_no": "WO-2024001-001",
"workpiece_no": "WP-002",
"category": "A类",
"workpiece_type": "circle",
"value_a": 425.282,
"value_b": 425.282,
"value_c": 423.151,
"unit": "mm",
"serial": "COM7",
"timestamp": "2024-01-15 11:30:00"
}
```
- 字段说明:
- workpiece_type: "square"(方形)/ "circle"(圆形)
- value_a: 必填
- value_b: 圆形必填,方形不传
- value_c: 圆形必填,方形不传
- category: 分类(可选)
- 响应:
```json
{
"code": 0,
"msg": "success",
"data": {
"id": 2
}
}
```
接口 4:获取工单号下拉列表(可选,用于工单查询时的选择)
- 路径:GET /api/v1/work-order/list
- 入参:
- keyword (string, 可选): 工单号关键词
- limit (int, 默认 20): 返回数量
- 响应:
```json
{
"code": 0,
"msg": "success",
"data": [
{
"work_order_no": "WO-2024001-001",
"description": "工单描述"
}
]
}
```
---
待决策事项:
1. **工件类型扩展**:除了"方形"和"圆形",是否还有其他工件类型?如果有,需要补充对应的数据字段和卡片布局。
答:没了
2. **表格列动态显示**:当前设计表格列根据工件类型动态显示(方形5列,圆形7列),是否需要额外的"分类"列?
答:需要,在托盘码后面
3. **提交按钮数据**:点击"提交"按钮时,需要提交哪些数据?目前设计包含订单号、工单号、工件号、托盘码、测量值,是否还有其他必填字段(如操作员ID)?
答:不需要了。 说明:1、把“托盘码”全删除吧,没有这个数据。2、订单号,就是顶部那个订单号,如果没填,页面提示先填写再提交
4. **订单号与工单号关系**:订单号和工单号是什么关系?一个订单对应多个工单?查询工单时是否需要同时输入两个字段?
答:我描述错了,请全部修改:订单就是工单,全部改成工单号。一个工单号,对应多个 工件号
5. **筛选按钮行为**:工件号输入框旁的"筛选"按钮是前端本地过滤表格数据,还是重新调用8888接口查询?
答: 8888查询
6. **工件号清除按钮**:工件号输入框的"小X杠"清除按钮,govcl TEdit不原生支持,需要自定义实现(如在输入框右侧叠加小按钮),是否确认需要此功能?
答:不必实现,不要 "小X杠" 啦
7. **测量数据来源**:仪表盘卡片的测量值是千分尺自动采集填入,还是手动输入?如果是自动采集,是否需要实时显示采集值?
答:自动显示。参考”原git“,本项目要把 “原git” 作为公共库,引入
8. **8888接口鉴权**:8888后端接口是否需要鉴权(如Token验证)?如果需要,客户端如何获取和携带Token?
答:不需要鉴权
9. **托盘码来源**:托盘码字段如何获取?是手动输入还是从工单信息中关联获取?
答:没有这个字段了,删除吧
10. **提交后表格刷新**:提交测量数据成功后,是否需要自动刷新底部表格数据?
答:刷新
---
## 8888 后端实际实现与文档差异(千分尺项目需同步修改)
以下是 8888(当前项目 spherical)实际实现的接口,与文档中定义的接口有差异,千分尺项目需按此调整调用:
### 差异 1:API 路径前缀统一收拢
文档中接口分散在不同路径下,实际实现统一收拢到 `/api/v1/micrometer/` 前缀下:
| 文档路径 | 实际路径 |
|---------|---------|
| `GET /api/v1/work-order/query` | `GET /api/v1/micrometer/work-order/query` |
| `GET /api/v1/measurement/list` | `GET /api/v1/micrometer/measurements` |
| `POST /api/v1/measurement/upload` | `POST /api/v1/micrometer/measurements` |
| `GET /api/v1/work-order/list` | `GET /api/v1/micrometer/work-orders` |
### 差异 2:响应格式
文档使用 `msg` 字段,实际项目统一使用 `message` 字段:
```json
{ "code": 0, "message": "success", "data": {...} }
```
### 差异 3:接口 1 查询工单信息 - 入参字段名
文档使用 `work_order_no`(下划线),实际使用 `workOrderNo`(驼峰):
```
GET /api/v1/micrometer/work-order/query?workOrderNo=WO-2024001-001
```
### 差异 4:接口 2 查询测量记录 - 路径和入参名
- 路径:`GET /api/v1/micrometer/measurements`
- 入参使用驼峰:`workOrderNo`, `workpieceNo`, `page`, `limit`
- 分页参数使用项目通用 PageReq(`page` 从 1 开始,`limit` 默认 10
示例:
```
GET /api/v1/micrometer/measurements?workOrderNo=WO-2024001-001&workpieceNo=WP-001&page=1&limit=20
```
### 差异 5:接口 3 提交测量数据 - 路径和字段名
- 路径:`POST /api/v1/micrometer/measurements`
- 请求体字段使用驼峰命名(`workOrderNo`, `workpieceNo`, `workpieceType`, `valueA`, `valueB`, `valueC`
- 响应使用 `message` 而非 `msg`
### 差异 6:接口 4 工单列表 - 路径
- 路径:`GET /api/v1/micrometer/work-orders?keyword=xxx&limit=20`
- `description` 字段当前返回工单号(后续可扩展)
### 差异 7:数据存储
测量数据存储在独立的 `micrometer_measurement` 表中,而非复用现有 `job` 表。工件号(`workpiece_no`)是手动录入的唯一编码,不设唯一约束,同一工件号可多次录入测量数据。
### 差异 8:无需鉴权
所有千分尺接口无需 JWT Token 鉴权,可直接调用。
### 差异 9:工件类型映射
8888 项目的 `product_type.category` 字段与千分尺工件类型映射关系:
- `SQUARE` → `square`(方形)
- `GENERAL` → `circle`(圆形)
---
## UI 优化修改记录(需 8888 同步调整)
### 修改 1:默认全屏显示
- 窗口启动时自动最大化(`WsMaximized`
### 修改 2:输入框点击弹出软键盘
- Windows 系统下通过系统输入法自动弹出软键盘
- 输入框已设置 `TextHint` 提示
### 修改 3:卡片样式优化
- 增大卡片高度(180px
- 增大字号:名称16px,数值28px,单位16px
- 使用 `BvRaised` 凸起效果
### 修改 4:工件号输入框调整
- 移到清除按钮同行,左侧位置
- 尺寸与按钮一致(高44px),字体14px
- 失去焦点时自动查询下方列表(`OnExit` 事件)
- 仍作为过滤条件传给 8888
### 修改 5:提交按钮提示增强
- 工单号为空:提示"请先输入工单号"
- 未查询工单:提示"请先查询工单"
- 工件号为空:提示"请输入工件号"
### 修改 6:工单查询失败提示
- 查询不到工单时提示:"未查询到工单信息,请检查工单号是否正确"
- 清空当前工单信息显示
### 修改 7:触控屏优化
- 增大模块A/B行高(44px
- 增大字号(14px
- 增大按钮宽度和输入框宽度
### 修改 8:关闭窗口二次确认
- 点击右上角关闭时弹出确认对话框
- "确定要退出程序吗?"
### 修改 9:列表默认显示全部数据
- 未填写工单号/工件号时,调用查询接口传入空参数
- 8888 需支持无参数时返回全部记录
- 要求按时间倒序排列(最新录入在第一条)
### 修改 10:新增导出功能
- 在"工件号"输入框右侧新增"导出"按钮
- 按钮尺寸:宽120px,高44px
- 导出格式:CSV(可直接用Excel打开)
- 文件名格式:`20060102_150405.csv`(年月日时分秒)
- 导出内容:当前表格所有行数据
### 修改 11:工件类型映射
- 后端返回 `GENERAL` → 前端显示为"圆形"circle
- 后端返回 `SQUARE` → 前端显示为"方形"square