DK客户端开发进度:PaaS底座主体完工,正在填具体组件和逻辑关系

0 阅读11分钟

一个人 + AI,22小时重构4万行代码后,配置驱动引擎骨架已搭好,现在在打磨PaaS的“最后一公里”


写在前面

先纠正一个说法:我做的不是ERP,不是MES。

我做的是一套 PaaS(Platform as a Service) ——别人可以在上面搭建自己业务系统的底层平台。

我用这套PaaS搭了一个工单管理模块,不代表它只能做工单。换一套配置,它就是进销存;再换一套,它就是设备管理系统;换个行业模板,它就是玻璃厂的生产追溯系统。

这篇文章不讲大道理,只讲现在做到哪了、PaaS底座怎么设计的、还差什么


一、定位澄清:这不是ERP,这是PaaS

很多人看到“工单”、“入库”、“出库”就觉得是ERP。不是。

维度传统ERP/MESDKERP PaaS
业务逻辑写死在代码里写在JSON配置里
界面固定布局,千人一面用户拖拽自定义,千人千面
新加模块改代码、编译、发版,周期以周计加配置、重启、生效,周期以秒计
新加字段改数据库、改API、改前端改一个JSON,三端自动同步
目标用户终端工厂集成商、服务商
交付什么一个固定的软件一个“能造软件的底座”

本质区别:  传统软件卖的是“写好的功能”,我卖的是“能长出功能的土壤”。

服务商拿到这套底座,不需要懂C++,只需要会改JSON,就能在客户现场快速搭出一套完整的业务系统。


二、整体进度:发动机已装好,正在接线

模块状态说明
配置驱动引擎✅ 完成JSON解析 → 控件创建 → 事件绑定,完整链路已通
WidgetFactory✅ 完成30行代码,20+种控件,字符串→原生控件
EventExecutor✅ 完成信号→配置→动作,支持事件链、条件判断
DynamicFormEngine✅ 完成动态表单创建、布局序列化、用户布局保存/恢复
表格核心控件✅ 完成分页、筛选、排序、列宽记忆、数据自动加载
列点击动作✅ 完成点击表格列可配置弹窗/调API/显示提示,支持变量插值
属性编辑器✅ 完成可视化配置控件ID、文本、尺寸、样式、事件绑定
事件绑定编辑器✅ 完成JSON可视化编辑,支持事件链拖拽配置
ControlHandle✅ 完成编辑模式下控件拖拽移动、缩放
控件树面板✅ 完成可视化查看页面控件层级结构
AI主题生成✅ 完成DeepSeek生成QSS,一键换肤
业务组件配置🔥 进行中用PaaS底座搭工单、BOM、入库等具体页面
事件链逻辑关系🔥 进行中按钮→API→表格刷新、条件分支等链路梳理
表单控件完善🔥 进行中输入框、下拉框、日期选择器的属性配置完善
端到端集成测试⏳ 待开始完整业务流程跑一遍
服务商试点部署⏳ 待开始让合作方用这套PaaS搭自己的业务

一句话总结:  发动机装好了,车架搭完了,所有核心控件都有了,现在在接具体的线路和仪表盘。


三、PaaS底座的核心架构

3.1 四层解耦设计

┌─────────────────────────────────────────────────────────────┐
│                    第一层:配置文件层                        │
│  current_config.json  +  event_triggers/*.json              │
│  (业务逻辑、界面定义、事件绑定,全部在这里)                  │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    第二层:引擎层                            │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐ │
│  │ConfigManager│  │EventExecutor│  │DynamicFormEngine   │ │
│  │配置加载/解析 │  │事件链执行   │  │动态表单/布局序列化   │ │
│  └─────────────┘  └─────────────┘  └─────────────────────┘ │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐ │
│  │WidgetFactory│  │ HttpManager │  │FormValidator       │ │
│  │控件工厂     │  │网络请求封装  │  │表单验证             │ │
│  └─────────────┘  └─────────────┘  └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    第三层:控件层                            │
│  QPushButton、QTableWidget、QLineEdit、QComboBox...        │
│  PaginatedTableWidget、FilterBar、ControlHandle...         │
│  (100% Qt原生控件 + 轻量级包装,不改变原生行为)            │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                    第四层:用户界面层                        │
│  正常模式:做业务(查询、录入、审核)                        │
│  编辑模式:调界面(拖拽控件、调整布局、AI换主题)             │
└─────────────────────────────────────────────────────────────┘

3.2 为什么这能叫PaaS?

传统开发模式:

客户提需求 → 我写代码 → 编译 → 发版 → 客户更新
周期:几天到几周,每个客户一个分支

PaaS模式:

服务商打开ConfigServer → 改JSON配置 → 客户端自动拉取 → 实时生效
周期:几分钟到几小时,一套代码覆盖所有客户

服务商不需要懂C++,不需要重新编译,不需要发版。配置即代码,配置即产品。


四、已完成的控件清单

4.1 基础控件(20+种)

控件类型Qt原生类PaaS中的名称状态
按钮QPushButtonButton / DKButton
标签QLabelLabel
单行文本框QLineEditTextBox / LineEdit
多行文本框QTextEditTextArea / TextEdit
下拉框QComboBoxComboBox / DKComboBox
复选框QCheckBoxCheckBox
单选框QRadioButtonRadioButton
分组框QGroupBoxGroupBox
标签页QTabWidgetTabWidget / DKTabWidget
整数输入框QSpinBoxSpinBox
小数输入框QDoubleSpinBoxDoubleSpinBox
日期选择器QDateEditDateEdit
日期时间选择器QDateTimeEditDateTimeEdit
时间选择器QTimeEditTimeEdit
滑动条QSliderSlider
进度条QProgressBarProgressBar
容器QWidgetContainer / DKContainer

4.2 复合控件(PaaS核心能力)

控件说明状态
PaginatedTableWidget分页表格(服务端分页、筛选、排序、列宽记忆)
FilterBar过滤栏,支持文本/下拉框/日期筛选
SubTableWidget子表格,支持主从关系、修改追踪、批量保存
ControlHandle编辑模式下的控件拖拽手柄
ControlPalette控件工具箱,拖拽添加控件
ControlPropertyEditor属性编辑器,可视化配置控件
EventBindingDialog事件绑定编辑器,JSON可视化编辑
DetailDialog详情弹窗,支持数据编辑和API调用
AIChatWidgetAI对话控件,主题生成、UI生成

五、最硬的一块骨头:表格 + 列点击动作

这是PaaS底座中最复杂、也最有价值的控件,值得单独讲讲。

5.1 表格能力一览

PaginatedTableWidget现在支持:

功能实现方式状态
服务端分页自动拼接page/pageSize参数
表头点击筛选弹窗输入筛选值,拼接到API请求
筛选图标指示已筛选的列显示🔍图标
重置筛选一键清除所有筛选条件
列拖拽排序Qt原生支持,布局保存时自动记录顺序
列宽调整用户拖拽后自动保存,重启恢复
数据自动加载页面打开自动调API填表
复选框选择第一列复选框,支持多选
获取选中行数据供事件链使用
双击行事件可配置打开详情弹窗
列点击动作点击不同列执行不同动作

5.2 列点击动作——PaaS能力的典型体现

业务场景:

  • 点击“工单号”→ 弹详情弹窗,用户可以查看/修改
  • 点击“状态”→ 只显示一个提示“当前状态:xxx”
  • 点击“产品”→ 调用API,把产品信息填到另一个表格

传统做法:  在代码里if (columnName == "工单号")写死逻辑。

PaaS做法:  JSON配置:

{
  "column_actions": {
    "gongdan_table": [
      {
        "columnName": "工单号",
        "actionType": "show_dialog",
        "title": "工单详情"
      },
      {
        "columnName": "状态",
        "actionType": "show_toast",
        "message": "当前状态: ${value}"
      },
      {
        "columnName": "产品",
        "actionType": "call_api",
        "apiCode": "get_product_detail",
        "targetTable": "product_table"
      }
    ]
  }
}

变量插值支持:

  • ${value} → 当前单元格的值
  • ${column} → 当前列名
  • ${rowData.xxx} → 当前行数据的某字段

支持的动件类型:

actionType说明配置参数
show_dialog弹详情弹窗title
call_api调用API,结果填到目标表格apiCodetargetTable
show_toast显示提示消息message(支持变量)

5.3 属性编辑器:让服务商能可视化配置

![属性编辑器示意]

服务商在客户端右键点击控件 → 打开属性编辑器,可以:

  • 基本属性页:修改控件ID、文本、坐标、尺寸、样式表、启用状态
  • 事件绑定页:打开事件绑定编辑器
  • 数据绑定页(表格专用):配置API业务码、数据路径、字段映射
  • 列点击动作页(表格专用):配置每列点击时的动作

不需要写一行C++代码。


六、事件系统:让PaaS真正“活”起来

配置驱动只是静态的,事件系统才是PaaS的“神经系统”。

6.1 事件链配置示例

{
  "control_id": "query_btn",
  "event_type": "clicked",
  "actions": [
    {"event_id": "call_api", "api_code": "gongdan_list"},
    {"event_id": "set_table_data", "source": "${api_response.data.items}", "target": "gongdan_table"},
    {"event_id": "show_toast", "message": "查询完成", "duration": 1500}
  ]
}

点击按钮 → 调API → 填表格 → 弹提示,一条配置完成

6.2 支持的事件类型

控件支持的事件
QPushButtonclicked, pressed, released
QLineEdittextChanged, returnPressed, editingFinished
QComboBoxcurrentIndexChanged, currentTextChanged
QTableWidgetcellClicked, cellDoubleClicked, cellChanged
其他控件持续扩展中

6.3 支持的动作类型

event_id说明
call_api调用后端API
set_table_data将API返回数据填入表格
show_toast显示提示消息
set_control_property动态设置控件属性
open_dialog打开弹窗
condition条件判断(if/else)
chain事件链(多个动作按顺序执行)

七、服务商的工作流(PaaS的最终价值)

7.1 部署一个业务系统的完整流程

步骤1:服务商打开ConfigServer配置界面
       ↓
步骤2:定义表格列(字段名、显示名、宽度)
       ↓
步骤3:配置API绑定(哪个API、数据路径是什么)
       ↓
步骤4:配置列点击动作(哪一列 → 弹窗/调API/显示提示)
       ↓
步骤5:配置按钮事件(哪个按钮 → 调哪个API → 刷哪个表)
       ↓
步骤6:导出JSON配置文件
       ↓
步骤7:发给终端客户
       ↓
步骤8:客户打开DKERP客户端,自动加载配置
       ↓
步骤9:如需调整界面,客户进入编辑模式拖拽布局
       ↓
步骤10:客户用AI生成自己喜欢的主题风格

全程零C++代码。

7.2 与传统开发模式的对比

维度传统模式DKERP PaaS模式
新做一个业务模块写代码、编译、发版改JSON、重启
修改一个字段改数据库、改API、改前端三处改一个JSON
调整界面布局改UI代码、重新编译编辑模式拖拽
改主题风格重写样式表AI一句话生成
维护多个客户每个客户一个代码分支一套代码,配置隔离
新服务商上手需要懂C++/Qt只需要懂业务+JSON

八、还差什么:PaaS的“最后一公里”

核心引擎已经完成,控件已经齐全,但离“服务商开箱即用”还有一段距离:

8.1 短期(1-2周)

任务优先级预计时间
完善表单控件的属性配置P02-3天
用PaaS底座搭工单、BOM、入库等业务页面P03-5天
梳理按钮→API→表格刷新的完整事件链P02天
编写服务商使用文档(JSON配置规范)P12天

8.2 中期(2-4周)

任务优先级预计时间
ConfigServer可视化配置界面完善P13-5天
配置模板库积累(工单、进销存、设备管理等)P1持续
端到端集成测试P13天
服务商试点部署P11-2周

8.3 长期

方向说明
配置模板市场服务商可分享/售卖自己的配置模板
AI配置助手说需求,AI生成配置JSON
更多行业模板玻璃、五金、包装、电子等
WebAssembly版本浏览器也能跑

九、一个真实的使用场景

假设你是某行业的服务商,你的客户需要一套备品备件管理系统

传统方式:

  • 找开发团队报价(5-10万)
  • 等2-4周开发
  • 反复修改需求
  • 上线后维护成本高

用DKERP PaaS:

  1. 打开ConfigServer
  2. 定义表格:备件编码、备件名称、规格型号、库存数量、安全库存、存放位置
  3. 配置API:/api/spare_part/list
  4. 配置列点击动作:点击“备件编码”→弹详情,点击“库存数量”→调库存明细
  5. 配置按钮:查询、导出、新增
  6. 导出JSON → 发给客户
  7. 客户打开客户端,系统就绪

1-2天搞定,不需要写一行代码。

这就是PaaS的价值——它不是帮你做一个业务系统,它是让你自己能做业务系统。


十、写在最后

22小时重构4万行代码,只是起点。

PaaS底座的主体完工,才是真正的里程碑。

我做的不是一个ERP,不是一个MES,是一个能让集成商、服务商自己搭建业务系统的底层平台

代码不值钱,代码里沉淀的架构和配置驱动能力才值钱。

PaaS底座的核心能力已经全部完成:

  • 配置驱动引擎 ✅
  • 20+种原生控件 ✅
  • 表格(分页/筛选/排序/列宽记忆)✅
  • 列点击动作 ✅
  • 事件绑定系统 ✅
  • 属性编辑器 ✅
  • 拖拽布局 ✅
  • AI主题生成 ✅

现在在做的是:用这套PaaS底座,把具体的业务页面搭出来,梳理清楚事件链逻辑关系,写服务商使用文档。

等这些完成后,我会再写一篇,放个视频,让你看看不用写一行C++代码,怎么在10分钟内搭出一个完整的业务系统

项目启动:2026-04-30
PaaS主体完工:2026-05-17
当前状态:业务组件配置 + 逻辑关系梳理
下一步:服务商试点部署

加个关注,后续更新不会停~


如果你也在做工业软件PaaS,或者你是行业服务商想了解这套底座能否帮你交付客户项目,欢迎交流。