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

23 KiB
Raw Blame History

如何描述清楚功能,是个大事情

现状描述: 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, 必填): 工单号
  • 响应:
    {
      "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): 每页数量
  • 响应:
    {
      "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
  • 入参:
    {
      "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: 分类(可选)
  • 响应:
    {
      "code": 0,
      "msg": "success",
      "data": {
        "id": 2
      }
    }
    

接口 4:获取工单号下拉列表(可选,用于工单查询时的选择)

  • 路径:GET /api/v1/work-order/list
  • 入参:
    • keyword (string, 可选): 工单号关键词
    • limit (int, 默认 20): 返回数量
  • 响应:
    {
      "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)实际实现的接口,与文档中定义的接口有差异,千分尺项目需按此调整调用:

差异 1API 路径前缀统一收拢

文档中接口分散在不同路径下,实际实现统一收拢到 /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 字段:

{ "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
  • 分页参数使用项目通用 PageReqpage 从 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 字段与千分尺工件类型映射关系:

  • SQUAREsquare(方形)
  • GENERALcircle(圆形)

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