如何描述清楚功能,是个大事情 现状描述: 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 720,PoScreenCenter 居中,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=720,relayout() 中按 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 / "●已断开"=ClRed,FontSize=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 卡片面板) 容器:TPanel,BevelOuter=BvRaised(凸起卡片效果),4 个水平排列。 位置:top0 = 50,Left = 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 底部表格: 容器:TListView,ViewStyle=VsReport,ReadOnly=true,RowSelect=true,GridLines=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 720,PoScreenCenter 居中,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=720,relayout() 中按 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 / "●已断开"=ClRed,FontSize=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=CsDropDownList,ReadOnly=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 卡片面板) 容器:TPanel,BevelOuter=BvRaised(凸起卡片效果),水平排列。 位置:top0 = 84,Left = 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 底部表格: 容器:TListView,ViewStyle=VsReport,ReadOnly=true,RowSelect=true,GridLines=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)