From 8578cc4ea248efc34b68c04adda6a75849b46cb2 Mon Sep 17 00:00:00 2001 From: George Date: Mon, 25 May 2026 20:44:59 +0800 Subject: [PATCH] =?UTF-8?q?20260525:=E6=96=B0=E5=BB=BA=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/DCP接口文档(轴力计).pdf | Bin 0 -> 180417 bytes docs/knowledge-base/01-architecture.md | 95 +++ docs/knowledge-base/02-runtime-flows.md | 127 ++++ docs/knowledge-base/03-data-model.md | 280 +++++++ docs/knowledge-base/04-er-diagrams.md | 703 ++++++++++++++++++ .../05-data-bridge-integration.md | 663 +++++++++++++++++ docs/knowledge-base/README.md | 25 + .../platform/dcp/DcpOpenApiController.java | 23 + .../service/impl/OtaUpgradeServiceImpl.java | 0 9 files changed, 1916 insertions(+) create mode 100644 docs/DCP接口文档(轴力计).pdf create mode 100644 docs/knowledge-base/01-architecture.md create mode 100644 docs/knowledge-base/02-runtime-flows.md create mode 100644 docs/knowledge-base/03-data-model.md create mode 100644 docs/knowledge-base/04-er-diagrams.md create mode 100644 docs/knowledge-base/05-data-bridge-integration.md create mode 100644 docs/knowledge-base/README.md create mode 100644 fastbee-open-api/src/main/java/com/fastbee/controller/platform/dcp/DcpOpenApiController.java delete mode 100644 fastbee-open-api/src/main/java/com/fastbee/data/service/impl/OtaUpgradeServiceImpl.java diff --git a/docs/DCP接口文档(轴力计).pdf b/docs/DCP接口文档(轴力计).pdf new file mode 100644 index 0000000000000000000000000000000000000000..abc9a2bcdcce6e375e42e43c2fb503b16614b957 GIT binary patch literal 180417 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 SR6rO48DnsnnI)B_aQ_Ed?o)#R literal 0 HcmV?d00001 diff --git a/docs/knowledge-base/01-architecture.md b/docs/knowledge-base/01-architecture.md new file mode 100644 index 00000000..7465bdeb --- /dev/null +++ b/docs/knowledge-base/01-architecture.md @@ -0,0 +1,95 @@ +# 整体架构 + +## 项目定位 + +FastBee 是基于若依 v3.8.5 改造的物联网平台,覆盖设备接入、产品/物模型管理、数据采集、规则引擎、通知、视频监控、SCADA/GoView 可视化和移动端。 + +## 技术栈 + +| 层 | 技术 | +| --- | --- | +| 后端框架 | Spring Boot 2.5.14, Spring Security, JWT | +| ORM/数据访问 | MyBatis Plus, MyBatis XML Mapper, PageHelper | +| 数据源 | MySQL 主库,动态数据源,可选 TDengine | +| 缓存/锁 | Redis, Redisson, Lock4j | +| 协议接入 | Netty MQTT/TCP/UDP/HTTP/CoAP, SIP GB28181 | +| 规则引擎 | LiteFlow, Groovy 脚本 | +| 消息通道 | 本地 `LinkedBlockingQueue` 队列族,MQTT/EMQX 或内嵌 Broker | +| 前端 | Vue 2 + Element UI, Vue 3 + Vite + Naive UI, UniApp + uView | + +## 后端模块分层 + +```text +fastbee-admin + -> fastbee-framework + -> fastbee-open-api + -> fastbee-server/boot-strap + -> fastbee-service/* + -> fastbee-iot-data + -> fastbee-mq + -> fastbee-notify/* + -> fastbee-plugs/* + -> fastbee-common +``` + +| 模块 | 职责 | +| --- | --- | +| `fastbee-admin` | Spring Boot 主入口,端口默认 8080,聚合 Web/API/协议/插件依赖。 | +| `fastbee-framework` | 若依框架层:安全、鉴权、Web 配置、数据源、拦截器、通用基础设施。 | +| `fastbee-common` | 公共 DTO、枚举、工具、注解、Redis Key、MQ 消息模型、协议通用模型。 | +| `fastbee-open-api` | 对外 REST Controller,覆盖设备、产品、物模型、规则、视频、通知等业务 API。 | +| `fastbee-service/fastbee-system-service` | 系统管理服务:用户、角色、菜单、部门、字典、参数、日志。 | +| `fastbee-service/fastbee-iot-service` | IoT 核心业务:产品、设备、物模型、场景、规则、告警、Modbus、网关、固件。 | +| `fastbee-server` | Netty/SIP 协议服务集合:基础 Server、MQTT Broker、TCP/UDP/HTTP/CoAP/SIP、启动装配。 | +| `fastbee-protocol` | 协议抽象和具体编解码实现,如 Modbus、JSON、自定义采集协议、OTA 包。 | +| `fastbee-iot-data` | 设备数据处理层:上报处理、下发处理、规则触发、TDengine 日志、OTA、设备消息发布。 | +| `fastbee-mq` | 设备消息通道封装,当前核心是 JVM 内本地阻塞队列和消息生产入口。 | +| `fastbee-notify` | 通知配置、模板、日志和发送通道实现,包含邮件、短信、微信、钉钉等。 | +| `fastbee-plugs` | 插件能力:Quartz、代码生成、OSS、Forest HTTP、OAuth、MQTT Client、LiteFlow 扩展、支付。 | +| `fastbee-record` | 独立视频录像/回调服务,入口 `ZlmRecordApplication`,与 ZLMediaKit 配合使用。 | + +## 启动入口与条件装配 + +- 主应用入口:`fastbee-admin/src/main/java/com/fastbee/FastBeeApplication.java`。 +- `@SpringBootApplication` 扫描 `com.fastbee` 包下所有模块 Bean。 +- `@ForestScan(basePackages = "com.fastbee")` 扫描 Forest HTTP 客户端。 +- 协议服务由 `fastbee-server/boot-strap` 按配置条件创建 Netty `Server` Bean: + - `server.broker.enabled=true`:启动内嵌 MQTT Broker 和 WebSocket MQTT。 + - `server.tcp.enabled=true`:启动 TCP 服务,默认 8888。 + - `server.http.enabled=true`:启动 HTTP 设备接入服务,默认 8081。 + - `server.coap.enabled=true`:启动 CoAP 服务,默认 5683。 + - `sip.enabled=true`:启动 GB28181 视频接入。 + +## 前端组成 + +| 应用 | 目录 | 技术 | 角色 | +| --- | --- | --- | --- | +| 管理后台 | `yack-web` | Vue 2, Element UI, Vuex | 运维/管理端,覆盖系统、设备、产品、规则、告警等后台功能。 | +| 低代码可视化 | `yack-view` | Vue 3, TypeScript, Vite, Naive UI, Pinia | GoView 风格大屏和项目可视化编辑器。 | +| 移动端 | `yack-app` | UniApp, uView 2.0, MQTT.js | App/小程序/H5 设备查看、控制和移动操作。 | + +## 配置中心 + +| 文件 | 重点 | +| --- | --- | +| `fastbee-admin/src/main/resources/application.yml` | 端口、协议服务开关、JWT、MyBatis Plus、Redisson、Forest、LiteFlow SQL 规则源。 | +| `fastbee-admin/src/main/resources/application-dev.yml` | 本地 MySQL、Redis、MQTT、EMQX、SIP、Swagger 配置。 | +| `fastbee-admin/src/main/resources/application-prod.yml` | 生产环境覆盖配置。 | +| `fastbee-admin/src/main/resources/application-sql.yml` | SQL 相关配置。 | + +## 数据与依赖边界 + +```text +Controller(open-api/admin/plugs) + -> Service(fastbee-iot-service/system-service/notify/sip/oss) + -> Mapper XML + -> MySQL / TDengine + +Protocol Server(Netty/SIP/MQTT) + -> fastbee-mq queue + -> fastbee-iot-data handler + -> IoT Service + Rule Engine + Log Service + -> MQTT/WebSocket/DB/Notify +``` + +`fastbee-common` 不应反向依赖业务模块;`fastbee-framework` 提供框架装配;业务 Controller 优先调用 Service 接口,不直接写复杂 SQL。 diff --git a/docs/knowledge-base/02-runtime-flows.md b/docs/knowledge-base/02-runtime-flows.md new file mode 100644 index 00000000..92af861b --- /dev/null +++ b/docs/knowledge-base/02-runtime-flows.md @@ -0,0 +1,127 @@ +# 核心运行链路 + +## 应用启动 + +1. `FastBeeApplication` 启动 Spring Boot。 +2. `application.yml` 激活 profile,默认是 `prod`,本地开发通常改为 `dev`。 +3. 动态数据源初始化 `master`,可选初始化 `taos`。 +4. MyBatis Plus 扫描 `com.fastbee.**.domain` 和 `classpath*:mapper/**/*Mapper.xml`。 +5. `boot-strap` 模块按配置启动协议服务。 +6. LiteFlow 从数据库加载规则链和脚本: + - 规则链表:`iot_scene` + - 脚本表:`iot_script` + - 应用名字段:`application_name` + +## 设备上报链路 + +```text +设备 + -> MQTT/TCP/HTTP/CoAP/SIP 协议接入 + -> 协议解码 / Topic 解析 / Session 管理 + -> MessageProducer.sendPublishMsg 或其他队列入口 + -> fastbee-mq 本地队列 + -> fastbee-iot-data DataHandlerImpl + -> 设备物模型值更新 + -> 设备日志/事件日志/TDengine + -> 规则引擎/场景联动/条件触发 + -> WebSocket/MQTT 推送到前端 +``` + +关键代码位置: + +| 环节 | 位置 | +| --- | --- | +| MQTT Broker 启动 | `fastbee-server/boot-strap/.../MQTTBootStrap.java` | +| TCP 服务启动 | `fastbee-server/boot-strap/.../TCPBootStrap.java` | +| 消息生产入口 | `fastbee-mq/.../MessageProducer.java` | +| 上报队列 | `fastbee-mq/.../DeviceReportQueue.java` | +| 上报处理 | `fastbee-iot-data/.../DataHandlerImpl.java` | +| 物模型更新 | `fastbee-service/fastbee-iot-service` 下 `IDeviceService` 实现 | +| 规则匹配 | `fastbee-iot-data` 的 `IRuleEngine` 和 `fastbee-iot-service` 的 `RuleProcess` | + +## 服务/指令下发链路 + +```text +前端/API + -> DeviceMessageServiceImpl.messagePost / MqttMessagePublishImpl.funcSend + -> 查询设备产品、协议、物模型和传输方式 + -> MQTT: 发布到设备 Topic + -> TCP: 组包后通过 SessionManager/MessageManager 写回连接 + -> GB28181: 调用 SIP Gateway + -> FunctionLog 记录下发结果 + -> WebSocket/MQTT 推送调试消息到前端 +``` + +下发时的重要分支: + +| 分支 | 处理 | +| --- | --- | +| MQTT 设备 | 使用 `PubMqttClient.publish` 发布到 `TopicsUtils.buildTopic(...)` 生成的 Topic。 | +| TCP 设备 | 将指令转为协议字节,交给 `MessageManager.requestR` 对对应 Session 写出。 | +| 子设备 | 先解析网关设备关系,把子设备指令映射到网关产品/设备,再设置 slave 地址。 | +| 影子模式 | 不真实下发,直接构造上报数据并走 `dataHandler.reportData` 更新影子值。 | +| 离线延迟下发 | `deferIfOffline=true` 时写入 `iot_device_deferred_command`,等待设备上线后补发。 | + +## 规则引擎链路 + +规则体系有两层: + +| 类型 | 入口 | 数据表 | +| --- | --- | --- | +| 场景联动 | `IRuleEngine.ruleMatch(...)` | `iot_scene`, `iot_scene_device`, `iot_scene_script`, `iot_device_job` | +| 数据桥接/脚本 | `RuleProcess.processRuleScript(...)` | `iot_script`, `bridge`, `iot_script_bridge` | + +LiteFlow SQL 规则源配置在 `application.yml`: + +```text +chainTableName: iot_scene +scriptTableName: iot_script +chainEnableField: enable +scriptEnableField: enable +``` + +设备 TCP 属性上报后,如果启用规则引擎,会额外以 `tcp/property/post` 作为桥接 Topic 调用 `RuleProcess`,用于 HTTP/MQTT/数据库桥接。 + +## 数据持久化链路 + +| 数据 | 主要表 | +| --- | --- | +| 产品、分类、协议 | `iot_product`, `iot_category`, `iot_protocol` | +| 设备与绑定 | `iot_device`, `iot_device_user`, `iot_device_group`, `iot_sub_gateway` | +| 物模型 | `iot_things_model`, `iot_things_model_template`, 翻译表 | +| 上报日志 | `iot_device_log`, `iot_event_log`, `iot_function_log`, `iot_alert_log` | +| 固件升级 | `iot_firmware`, `iot_firmware_task`, `iot_firmware_task_detail` | +| 规则/桥接 | `iot_scene`, `iot_script`, `bridge`, `iot_script_bridge` | +| 通知 | `notify_channel`, `notify_template`, `notify_log` | +| 视频 | `sip_device`, `sip_device_channel`, `media_server`, `iot_sip_relation` | + +TDengine 可选数据源 `taos` 默认禁用,相关日志服务在 `fastbee-iot-service` 的 `tdengine` 包和 `fastbee-iot-data` 中被调用。 + +## 视频监控链路 + +```text +GB28181 设备/NVR + -> SIP Server + -> sip_device / sip_device_channel + -> ZLMediaKit media_server + -> 播放、PTZ、录像、回放 API + -> fastbee-record 可独立承接录像相关回调/下载 +``` + +视频相关 Controller 分布在 `fastbee-open-api/src/main/java/com/fastbee/controller/media` 和 `fastbee-record`。 + +## 通知链路 + +```text +业务事件/告警/推送配置 + -> notify_template + -> notify_channel + -> fastbee-notify-core 具体渠道 + -> notify_log +``` + +物模型推送扩展表: + +- `iot_things_model_push_config`:某设备的物模型推送配置。 +- `iot_push_model_item`:配置下需要推送的物模型项和阈值。 +- `iot_push_user`:配置下的接收用户。 diff --git a/docs/knowledge-base/03-data-model.md b/docs/knowledge-base/03-data-model.md new file mode 100644 index 00000000..b06d94e4 --- /dev/null +++ b/docs/knowledge-base/03-data-model.md @@ -0,0 +1,280 @@ +# 数据库与表关系 + +## 数据库来源 + +主初始化脚本:`sql/yack-20260316.sql`。 + +补充脚本: + +- `sql/iot_device_deferred_command.sql` +- `sql/iot_things_model_push.sql` +- `sql/yack.sql` + +`yack-20260316.sql` 中包含约 100+ 张核心表,并带有大量初始化数据。业务表普遍不使用数据库外键;关系主要由字段命名、联合主键、索引和业务代码保证。Quartz 表保留真实外键。 + +## 通用字段约定 + +| 字段 | 含义 | +| --- | --- | +| `tenant_id`, `tenant_name` | 多租户归属,IoT/通知/可视化等表常见。 | +| `user_id`, `user_name` | 用户归属或操作者。 | +| `create_by`, `create_time`, `update_by`, `update_time` | 若依通用审计字段。 | +| `del_flag` | 软删除标记,常见取值 0 正常、2 删除。 | +| `status` | 业务状态,不同表含义不同,需结合枚举/字典。 | +| `serial_number` | 设备唯一编号,是设备日志、Topic、指令和网关关系中的高频关联键。 | + +## 核心业务 ER 概览 + +```mermaid +erDiagram + SYS_USER ||--o{ IOT_DEVICE_USER : owns + SYS_USER ||--o{ IOT_GROUP : creates + SYS_USER ||--o{ IOT_DEVICE_SHARE : shared_to + IOT_CATEGORY ||--o{ IOT_PRODUCT : classifies + IOT_PRODUCT ||--o{ IOT_DEVICE : has + IOT_PRODUCT ||--o{ IOT_THINGS_MODEL : defines + IOT_DEVICE ||--o{ IOT_THINGS_MODEL : overrides + IOT_DEVICE ||--o{ IOT_DEVICE_LOG : reports + IOT_DEVICE ||--o{ IOT_EVENT_LOG : emits + IOT_DEVICE ||--o{ IOT_FUNCTION_LOG : receives + IOT_PRODUCT ||--o{ IOT_FIRMWARE : owns + IOT_FIRMWARE ||--o{ IOT_FIRMWARE_TASK : upgrades + IOT_FIRMWARE_TASK ||--o{ IOT_FIRMWARE_TASK_DETAIL : tracks + IOT_SCENE ||--o{ IOT_SCENE_DEVICE : triggers + IOT_SCENE ||--o{ IOT_SCENE_SCRIPT : actions + IOT_SCRIPT ||--o{ IOT_SCRIPT_BRIDGE : uses + BRIDGE ||--o{ IOT_SCRIPT_BRIDGE : bound +``` + +上图是业务约定关系,不代表 SQL 外键。 + +## 产品、设备、物模型 + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `iot_category` | `category_id` | 产品分类,支持 `parent_id` 层级。 | `iot_product.category_id` 关联分类。 | +| `iot_product` | `product_id` | 产品定义,包含分类、租户、协议、设备类型等。 | 一对多关联设备、物模型、固件、Modbus 配置。 | +| `iot_protocol` | `id` | 协议定义,`protocol_code` 唯一。 | 产品通过协议编码/配置选择编解码实现。 | +| `iot_device` | `device_id` | 设备注册表,`serial_number` 唯一。 | 关联产品、租户、用户、日志、网关、物模型覆盖。 | +| `iot_things_model` | `model_id` | 产品级/设备级物模型。 | `product_id` 关联产品;`device_id=0` 通常表示产品级,`device_id>0` 表示设备级覆盖或计算物模型。 | +| `iot_things_model_template` | `template_id` | 物模型模板。 | 可用于产品物模型复用。 | +| `iot_device_template` | `id` | 产品和采集点模板关系。 | `product_id` + `template_id`。 | +| `iot_things_model_translate` | `id` | 物模型翻译。 | 通过 `product_id`、标识符等业务字段关联。 | +| `iot_things_model_template_translate` | `id` | 物模型模板翻译。 | 通过模板标识业务关联。 | + +关键约束/索引: + +- `iot_device.serial_number` 是唯一索引。 +- `iot_product.category_id`、`iot_product.tenant_id` 有普通索引。 +- `iot_things_model.product_id`、`tenant_id`、`model_order` 有普通索引。 +- `iot_things_model` 还有 `idx_calculated_serial(is_calculated, serial_number)`,用于计算物模型按设备检索。 + +## 设备归属、共享和分组 + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `iot_device_user` | `device_id`, `user_id` | 设备与用户归属关系。 | 关联 `iot_device` 和 `sys_user`。 | +| `iot_device_share` | `device_id`, `user_id` | 设备共享关系和权限。 | 关联设备与被共享用户。 | +| `iot_device_group` | `device_id`, `group_id` | 设备加入分组。 | 关联 `iot_device` 和 `iot_group`。 | +| `iot_group` | `group_id` | 用户创建的设备分组。 | `user_id` 关联 `sys_user`。 | +| `iot_device_alert_user` | `device_id`, `user_id` | 设备告警接收用户。 | 关联设备与告警接收用户。 | +| `order_control` | `id` | 指令权限控制。 | `user_id` + `device_id` 限制控制权限。 | +| `command_preferences` | `id` | 指令偏好模板。 | `product_id` 和 `serial_number` 关联设备/产品。 | + +## 网关、子设备和 Modbus + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `iot_sub_gateway` | `id` | 网关设备与子设备关系。 | `gw_device_id`、`sub_device_id` 均约定关联 `iot_device.device_id`。 | +| `iot_product_sub_gateway` | `id` | 网关产品与子产品关系。 | `gw_product_id`、`sub_product_id` 约定关联 `iot_product.product_id`。 | +| `iot_modbus_config` | `id` | 产品物模型的 Modbus 点位配置。 | `product_id` 关联产品。 | +| `iot_modbus_params` | `id` | 产品级 Modbus 默认参数。 | `product_id` 关联产品,`slave_id` 表示默认从机。 | +| `iot_modbus_job` | `task_id` | 设备轮询任务。 | `sub_device_id`、`job_id` 是业务关联字段。 | +| `iot_product_modbus_job` | `task_id` | 产品轮询任务模板。 | `product_id` 关联产品。 | +| `iot_var_temp` | `template_id` | 采集变量模板。 | `user_id` 关联模板所属用户。 | +| `iot_var_temp_salve` | `id` | 模板下从机/点位配置。 | `device_temp_id` 关联 `iot_var_temp.template_id`。 | + +## 数据日志 + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `iot_device_log` | `log_id` | 设备属性/监测日志。 | `device_id`、`serial_number`、`tenant_id`、`user_id`。 | +| `iot_event_log` | `log_id` | 设备事件日志。 | 关联设备、租户和用户。 | +| `iot_function_log` | `id` | 服务/指令下发日志。 | `serial_number`、`message_id`、`user_id`。 | +| `iot_alert_log` | `alert_log_id` | 告警历史。 | `serial_number`、`product_id`、`user_id`。 | +| `iot_simulate_log` | `log_id` | 模拟设备日志。 | `device_id`、`serial_number`。 | +| `iot_device_air_log` | `id` | Air780 上报记录。 | `product_id`、`device_id`。 | + +高频查询索引: + +- `iot_device_log(serial_number, create_time)` +- `iot_device_log(serial_number, is_monitor, create_time)` +- `iot_alert_log(serial_number)` +- `iot_alert_log(product_id)` +- `iot_device_log(device_id)` + +## 规则、场景、桥接和告警 + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `iot_scene` | `scene_id` | 场景联动/LiteFlow 规则链。 | `user_id`,`recover_id` 可指向恢复场景。 | +| `iot_scene_device` | `scene_device_id` | 场景触发设备/产品。 | `scene_id`、`product_id`、`serial_number`、`script_id`。 | +| `iot_scene_script` | `script_id` | 场景动作/条件脚本。 | `scene_id`、`product_id`、`job_id`、`parent_id`。 | +| `iot_script` | `script_id` | 规则引擎脚本组件。 | `scene_id`、`product_id`、`user_id`。 | +| `bridge` | `id` | 数据桥接端点配置。 | HTTP/MQTT/数据库桥接配置主体。 | +| `iot_script_bridge` | `script_id`, `bridge_id` | 脚本与桥接端点关系。 | 多对多关联 `iot_script` 和 `bridge`。 | +| `iot_alert` | `alert_id` | 告警定义。 | 租户维度定义告警。 | +| `iot_alert_scene` | `alert_id`, `scene_id` | 告警与场景关系。 | 多对多关联告警和场景。 | +| `iot_alert_notify_template` | `alert_id`, `notify_template_id` | 告警与通知模板关系。 | 多对多关联告警和通知模板。 | +| `iot_device_job` | `job_id`, `job_name`, `job_group` | 设备定时任务。 | 可关联设备、产品、场景、告警。 | + +LiteFlow SQL 源直接读取: + +- `iot_scene.chain_name` +- `iot_scene.el_data` +- `iot_scene.enable` +- `iot_script.script_id` +- `iot_script.script_data` +- `iot_script.script_language` +- `iot_script.enable` + +## 场景模型、SCADA 和可视化 + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `scene_model` | `scene_model_id` | 业务场景管理。 | 租户维度。 | +| `scene_model_device` | `id` | 场景关联设备/虚拟数据源。 | `scene_model_id`、`cus_device_id`。 | +| `scene_model_data` | `id` | 场景数据源绑定。 | `scene_model_id`、`scene_model_device_id`、`datasource_id`。 | +| `scene_model_tag` | `id` | 场景录入型变量/计算变量。 | `scene_model_id`。 | +| `scene_tag_points` | `id` | 运算型变量点。 | `tag_id` 关联变量,`scene_model_data_id` 关联数据源。 | +| `iot_goview_project` | `id` | GoView 项目。 | 租户维度。 | +| `iot_goview_project_data` | `id` | GoView 项目数据。 | `project_id` 关联项目。 | +| `scada` | `id` | 组态页面。 | 租户维度。 | +| `scada_component` | `id` | 组态组件。 | `tenant_id`、`user_id`。 | +| `scada_device_bind` | `id` | 组态组件设备绑定。 | `serial_number` 关联设备。 | +| `scada_echart` | `id` | 图表管理。 | 租户维度。 | +| `scada_gallery` | `id` | 组态图库。 | 租户维度。 | +| `scada_model` | `id` | 三维模型配置。 | 租户维度。 | + +## 固件和 OTA + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `iot_firmware` | `firmware_id` | 产品固件版本。 | `product_id` 关联产品,`tenant_id` 关联租户。 | +| `iot_firmware_task` | `id` | 固件升级任务。 | `firmware_id` 关联固件。 | +| `iot_firmware_task_detail` | `id` | 任务下设备升级状态。 | `task_id` 关联任务,`serial_number` 关联设备。 | + +## 视频监控和媒体 + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `sip_config` | `id` | SIP 系统配置。 | 可关联 `product_id`。 | +| `sip_device` | `device_id` | GB28181 监控设备/NVR。 | `product_id`,`device_sip_id`。 | +| `sip_device_channel` | `id`, `device_sip_id` | 摄像头通道。 | `device_sip_id` 关联 SIP 设备编号,`channel_sip_id` 是通道编号。 | +| `media_server` | `id` | ZLMediaKit 流媒体服务器配置。 | `server_id` 是媒体服务标识。 | +| `iot_sip_relation` | `id` | IoT 设备/场景与 SIP 通道关系。 | `channel_id`、`re_device_id`、`re_scene_model_id`。 | + +## 通知和推送 + +| 表 | 主键 | 说明 | 关键关系 | +| --- | --- | --- | --- | +| `notify_channel` | `id` | 通知渠道账号。 | 租户维度。 | +| `notify_template` | `id` | 通知模板。 | `channel_id` 关联通知渠道。 | +| `notify_log` | `id` | 通知发送日志。 | `channel_id`、`notify_template_id`。 | +| `iot_things_model_push_config` | `id` | 物模型数据推送配置。 | `device_id`、`template_id`、`user_id`。 | +| `iot_push_model_item` | `id` | 推送配置下的物模型项和阈值。 | `config_id` 关联推送配置,`model_id` 关联物模型。 | +| `iot_push_user` | `id` | 推送接收用户。 | `config_id` 关联推送配置,`user_id` 关联系统用户。 | + +## 系统 RBAC 和基础表 + +```mermaid +erDiagram + SYS_DEPT ||--o{ SYS_USER : contains + SYS_USER ||--o{ SYS_USER_ROLE : has + SYS_ROLE ||--o{ SYS_USER_ROLE : assigned + SYS_ROLE ||--o{ SYS_ROLE_MENU : grants + SYS_MENU ||--o{ SYS_ROLE_MENU : included + SYS_ROLE ||--o{ SYS_ROLE_DEPT : scopes + SYS_DEPT ||--o{ SYS_ROLE_DEPT : scoped + SYS_USER ||--o{ SYS_USER_POST : holds + SYS_POST ||--o{ SYS_USER_POST : assigned +``` + +| 表 | 主键 | 说明 | +| --- | --- | --- | +| `sys_user` | `user_id` | 用户。 | +| `sys_dept` | `dept_id` | 部门/机构,`parent_id` 形成树。 | +| `sys_role` | `role_id` | 角色。 | +| `sys_menu` | `menu_id` | 菜单和权限,`parent_id` 形成树。 | +| `sys_post` | `post_id` | 岗位。 | +| `sys_user_role` | `user_id`, `role_id` | 用户角色关系。 | +| `sys_role_menu` | `role_id`, `menu_id` | 角色菜单权限。 | +| `sys_role_dept` | `role_id`, `dept_id` | 角色数据权限。 | +| `sys_user_post` | `user_id`, `post_id` | 用户岗位关系。 | +| `sys_config` | `config_id` | 系统参数。 | +| `sys_dict_type` | `dict_id` | 字典类型,`dict_type` 唯一。 | +| `sys_dict_data` | `dict_code` | 字典数据,通过 `dict_type` 关联字典类型。 | +| `sys_notice` | `notice_id` | 通知公告。 | +| `sys_oper_log` | `oper_id` | 操作日志。 | +| `sys_logininfor` | `info_id` | 登录日志。 | +| `sys_client` | `id` | 系统授权客户端。 | +| `sys_auth_user` | `auth_id` | 第三方授权用户。 | +| `sys_user_relation` | `root_id` | 用户关系和层级深度缓存。 | + +翻译表: + +- `sys_menu_translate` +- `sys_dict_type_translate` +- `sys_dict_data_translate` + +## OAuth、第三方登录和内容 + +| 表 | 说明 | +| --- | --- | +| `oauth_client_details` | OAuth 客户端配置。 | +| `oauth_access_token`, `oauth_refresh_token`, `oauth_client_token`, `oauth_code`, `oauth_approvals` | Spring OAuth Token/授权数据。 | +| `iot_social_platform` | 第三方登录平台配置。 | +| `iot_social_user` | 第三方用户和系统用户绑定。 | +| `app_language` | App 语言配置。 | +| `app_preferences` | 用户 App 偏好,`user_id + language` 唯一。 | +| `news`, `news_category` | 新闻资讯和分类。 | + +## OSS、代码生成和任务 + +| 表 | 说明 | +| --- | --- | +| `oss_config` | 对象存储配置。 | +| `oss_detail` | 上传文件记录。 | +| `gen_table`, `gen_table_column` | 代码生成器元数据。 | +| `sys_job`, `sys_job_log` | 若依定时任务配置和日志。 | + +## Quartz 强约束关系 + +这些是 SQL 中真实存在的外键: + +```text +qrtz_triggers(sched_name, job_name, job_group) + -> qrtz_job_details(sched_name, job_name, job_group) + +qrtz_blob_triggers(sched_name, trigger_name, trigger_group) + -> qrtz_triggers(sched_name, trigger_name, trigger_group) + +qrtz_cron_triggers(sched_name, trigger_name, trigger_group) + -> qrtz_triggers(sched_name, trigger_name, trigger_group) + +qrtz_simple_triggers(sched_name, trigger_name, trigger_group) + -> qrtz_triggers(sched_name, trigger_name, trigger_group) + +qrtz_simprop_triggers(sched_name, trigger_name, trigger_group) + -> qrtz_triggers(sched_name, trigger_name, trigger_group) +``` + +其他 Quartz 表如 `qrtz_calendars`、`qrtz_fired_triggers`、`qrtz_locks`、`qrtz_scheduler_state` 由 Quartz 框架维护。 + +## 关系梳理原则 + +- 优先看 SQL 主键、联合主键、唯一索引和普通索引。 +- 再看 Java Domain、Mapper XML、Service 查询条件。 +- 对无外键的业务表,文档只标记为“业务约定关联”。 +- `serial_number` 是很多运行时链路的核心关联键,但真正的设备主键仍是 `iot_device.device_id`。 +- `product_id`、`device_id`、`user_id`、`tenant_id` 等字段在不同表中含义一致,但删除/更新一致性由业务代码维护。 diff --git a/docs/knowledge-base/04-er-diagrams.md b/docs/knowledge-base/04-er-diagrams.md new file mode 100644 index 00000000..ffd96a37 --- /dev/null +++ b/docs/knowledge-base/04-er-diagrams.md @@ -0,0 +1,703 @@ +# 数据库关系图 + +本文件用 Mermaid ER 图描述 FastBee 数据库关系。除 Quartz 表外,大部分业务表没有 SQL 外键,图中的连线表示业务约定关联,主要依据字段命名、联合主键、索引和代码查询关系整理。 + +## 总览 + +```mermaid +flowchart LR + System["系统 RBAC
sys_*"] --> IoT["IoT 核心
产品/设备/物模型"] + IoT --> DataLog["数据日志
上报/事件/下发/告警日志"] + IoT --> Gateway["网关与 Modbus
子设备/轮询/点位"] + IoT --> Rule["规则与告警
场景/LiteFlow/桥接"] + IoT --> Firmware["固件 OTA
任务/明细"] + IoT --> Visual["可视化
SceneModel/SCADA/GoView"] + IoT --> Video["视频 GB28181
SIP/ZLM"] + Rule --> Notify["通知
渠道/模板/日志"] + System --> OAuth[OAuth/第三方登录] + System --> Gen[代码生成/OSS/Quartz] +``` + +## 产品、设备、物模型 + +```mermaid +erDiagram + IOT_CATEGORY ||--o{ IOT_CATEGORY : parent + IOT_CATEGORY ||--o{ IOT_PRODUCT : classifies + IOT_PRODUCT ||--o{ IOT_DEVICE : owns + IOT_PRODUCT ||--o{ IOT_THINGS_MODEL : defines + IOT_PRODUCT ||--o{ IOT_THINGS_MODEL_TEMPLATE : uses + IOT_PRODUCT ||--o{ IOT_DEVICE_TEMPLATE : maps_template + IOT_THINGS_MODEL_TEMPLATE ||--o{ IOT_DEVICE_TEMPLATE : assigned + IOT_THINGS_MODEL ||--o{ IOT_THINGS_MODEL_TRANSLATE : translated + IOT_THINGS_MODEL_TEMPLATE ||--o{ IOT_THINGS_MODEL_TEMPLATE_TRANSLATE : translated + IOT_PROTOCOL ||--o{ IOT_PRODUCT : selected_by + SYS_USER ||--o{ IOT_PRODUCT : tenant_or_owner + SYS_USER ||--o{ IOT_DEVICE : tenant_or_owner + + IOT_CATEGORY { + bigint category_id PK + bigint parent_id + bigint tenant_id + } + IOT_PRODUCT { + bigint product_id PK + bigint category_id + bigint tenant_id + } + IOT_DEVICE { + bigint device_id PK + bigint product_id + varchar serial_number UK + bigint tenant_id + bigint user_id + } + IOT_THINGS_MODEL { + bigint model_id PK + bigint product_id + bigint device_id + varchar serial_number + bigint tenant_id + } + IOT_THINGS_MODEL_TEMPLATE { + bigint template_id PK + bigint tenant_id + } + IOT_DEVICE_TEMPLATE { + bigint id PK + bigint product_id + bigint template_id + } + IOT_PROTOCOL { + bigint id PK + varchar protocol_code UK + } +``` + +## 设备归属、共享、分组 + +```mermaid +erDiagram + SYS_USER ||--o{ IOT_DEVICE_USER : owns + IOT_DEVICE ||--o{ IOT_DEVICE_USER : owned_by + SYS_USER ||--o{ IOT_DEVICE_SHARE : shared_to + IOT_DEVICE ||--o{ IOT_DEVICE_SHARE : shared + SYS_USER ||--o{ IOT_GROUP : creates + IOT_GROUP ||--o{ IOT_DEVICE_GROUP : contains + IOT_DEVICE ||--o{ IOT_DEVICE_GROUP : grouped + SYS_USER ||--o{ IOT_DEVICE_ALERT_USER : receives_alert + IOT_DEVICE ||--o{ IOT_DEVICE_ALERT_USER : alert_users + SYS_USER ||--o{ ORDER_CONTROL : restricted + IOT_DEVICE ||--o{ ORDER_CONTROL : command_acl + IOT_PRODUCT ||--o{ COMMAND_PREFERENCES : command_template + IOT_DEVICE ||--o{ COMMAND_PREFERENCES : device_command_template + + IOT_DEVICE_USER { + bigint device_id PK + bigint user_id PK + } + IOT_DEVICE_SHARE { + bigint device_id PK + bigint user_id PK + } + IOT_GROUP { + bigint group_id PK + bigint user_id + } + IOT_DEVICE_GROUP { + bigint device_id PK + bigint group_id PK + } + IOT_DEVICE_ALERT_USER { + bigint device_id PK + bigint user_id PK + } + ORDER_CONTROL { + bigint id PK + bigint user_id + bigint device_id + bigint tenant_id + } + COMMAND_PREFERENCES { + bigint id PK + bigint product_id + varchar serial_number + } +``` + +## 网关、子设备、Modbus + +```mermaid +erDiagram + IOT_DEVICE ||--o{ IOT_SUB_GATEWAY : gateway + IOT_DEVICE ||--o{ IOT_SUB_GATEWAY : sub_device + IOT_PRODUCT ||--o{ IOT_PRODUCT_SUB_GATEWAY : gateway_product + IOT_PRODUCT ||--o{ IOT_PRODUCT_SUB_GATEWAY : sub_product + IOT_PRODUCT ||--o{ IOT_MODBUS_CONFIG : point_config + IOT_PRODUCT ||--o{ IOT_MODBUS_PARAMS : params + IOT_PRODUCT ||--o{ IOT_PRODUCT_MODBUS_JOB : poll_template + IOT_DEVICE ||--o{ IOT_MODBUS_JOB : poll_task + IOT_VAR_TEMP ||--o{ IOT_VAR_TEMP_SALVE : slave_points + SYS_USER ||--o{ IOT_VAR_TEMP : owns + + IOT_SUB_GATEWAY { + bigint id PK + bigint gw_device_id + bigint sub_device_id + int slave_id + } + IOT_PRODUCT_SUB_GATEWAY { + bigint id PK + bigint gw_product_id + bigint sub_product_id + int slave_id + } + IOT_MODBUS_CONFIG { + bigint id PK + bigint product_id + } + IOT_MODBUS_PARAMS { + bigint id PK + bigint product_id + int slave_id + } + IOT_MODBUS_JOB { + bigint task_id PK + bigint sub_device_id + bigint job_id + } + IOT_PRODUCT_MODBUS_JOB { + bigint task_id PK + bigint product_id + } + IOT_VAR_TEMP { + bigint template_id PK + bigint user_id + } + IOT_VAR_TEMP_SALVE { + bigint id PK + bigint device_temp_id + } +``` + +## 设备数据日志 + +```mermaid +erDiagram + IOT_PRODUCT ||--o{ IOT_ALERT_LOG : product_alerts + IOT_DEVICE ||--o{ IOT_DEVICE_LOG : property_logs + IOT_DEVICE ||--o{ IOT_EVENT_LOG : event_logs + IOT_DEVICE ||--o{ IOT_FUNCTION_LOG : function_logs + IOT_DEVICE ||--o{ IOT_ALERT_LOG : alert_logs + IOT_DEVICE ||--o{ IOT_SIMULATE_LOG : simulate_logs + IOT_DEVICE ||--o{ IOT_DEVICE_AIR_LOG : air_logs + SYS_USER ||--o{ IOT_DEVICE_LOG : user_scope + SYS_USER ||--o{ IOT_EVENT_LOG : user_scope + SYS_USER ||--o{ IOT_FUNCTION_LOG : operator + + IOT_DEVICE_LOG { + bigint log_id PK + bigint device_id + varchar serial_number + bigint user_id + bigint tenant_id + datetime create_time + } + IOT_EVENT_LOG { + bigint log_id PK + bigint device_id + varchar serial_number + bigint user_id + bigint tenant_id + } + IOT_FUNCTION_LOG { + bigint id PK + varchar message_id + varchar serial_number + bigint user_id + } + IOT_ALERT_LOG { + bigint alert_log_id PK + varchar serial_number + bigint product_id + bigint user_id + } + IOT_SIMULATE_LOG { + bigint log_id PK + bigint device_id + varchar serial_number + } + IOT_DEVICE_AIR_LOG { + bigint id PK + bigint product_id + bigint device_id + } +``` + +## 规则、场景、告警、桥接 + +```mermaid +erDiagram + SYS_USER ||--o{ IOT_SCENE : owns + IOT_SCENE ||--o{ IOT_SCENE_DEVICE : has_trigger + IOT_SCENE ||--o{ IOT_SCENE_SCRIPT : has_action + IOT_PRODUCT ||--o{ IOT_SCENE_DEVICE : trigger_product + IOT_PRODUCT ||--o{ IOT_SCENE_SCRIPT : action_product + IOT_SCRIPT ||--o{ IOT_SCRIPT_BRIDGE : uses + BRIDGE ||--o{ IOT_SCRIPT_BRIDGE : endpoint + IOT_SCENE ||--o{ IOT_SCRIPT : liteflow_script + IOT_ALERT ||--o{ IOT_ALERT_SCENE : triggers_scene + IOT_SCENE ||--o{ IOT_ALERT_SCENE : alert_bound + IOT_ALERT ||--o{ IOT_ALERT_NOTIFY_TEMPLATE : notifies + NOTIFY_TEMPLATE ||--o{ IOT_ALERT_NOTIFY_TEMPLATE : used_by_alert + IOT_DEVICE ||--o{ IOT_DEVICE_JOB : scheduled + IOT_PRODUCT ||--o{ IOT_DEVICE_JOB : scheduled + IOT_SCENE ||--o{ IOT_DEVICE_JOB : scheduled + IOT_ALERT ||--o{ IOT_DEVICE_JOB : scheduled + + IOT_SCENE { + bigint scene_id PK + bigint user_id + varchar chain_name + text el_data + int enable + } + IOT_SCENE_DEVICE { + bigint scene_device_id PK + bigint scene_id + bigint product_id + varchar serial_number + bigint script_id + } + IOT_SCENE_SCRIPT { + bigint script_id PK + bigint scene_id + bigint product_id + bigint job_id + bigint parent_id + } + IOT_SCRIPT { + bigint script_id PK + bigint scene_id + bigint product_id + bigint user_id + int enable + } + BRIDGE { + bigint id PK + } + IOT_SCRIPT_BRIDGE { + bigint script_id PK + bigint bridge_id PK + } + IOT_ALERT { + bigint alert_id PK + bigint tenant_id + } + IOT_ALERT_SCENE { + bigint alert_id PK + bigint scene_id PK + } + IOT_ALERT_NOTIFY_TEMPLATE { + bigint alert_id PK + bigint notify_template_id PK + } + IOT_DEVICE_JOB { + bigint job_id PK + bigint device_id + bigint product_id + bigint scene_id + bigint alert_id + } +``` + +## 通知与物模型推送 + +```mermaid +erDiagram + NOTIFY_CHANNEL ||--o{ NOTIFY_TEMPLATE : has + NOTIFY_CHANNEL ||--o{ NOTIFY_LOG : sends + NOTIFY_TEMPLATE ||--o{ NOTIFY_LOG : produces + IOT_DEVICE ||--o{ IOT_THINGS_MODEL_PUSH_CONFIG : push_config + IOT_PRODUCT ||--o{ IOT_THINGS_MODEL_PUSH_CONFIG : product_scope + NOTIFY_TEMPLATE ||--o{ IOT_THINGS_MODEL_PUSH_CONFIG : template + SYS_USER ||--o{ IOT_THINGS_MODEL_PUSH_CONFIG : owner + IOT_THINGS_MODEL_PUSH_CONFIG ||--o{ IOT_PUSH_MODEL_ITEM : includes + IOT_THINGS_MODEL ||--o{ IOT_PUSH_MODEL_ITEM : model_item + IOT_THINGS_MODEL_PUSH_CONFIG ||--o{ IOT_PUSH_USER : receivers + SYS_USER ||--o{ IOT_PUSH_USER : receiver + + NOTIFY_CHANNEL { + bigint id PK + bigint tenant_id + } + NOTIFY_TEMPLATE { + bigint id PK + bigint channel_id + bigint tenant_id + } + NOTIFY_LOG { + bigint id PK + bigint channel_id + bigint notify_template_id + bigint tenant_id + } + IOT_THINGS_MODEL_PUSH_CONFIG { + bigint id PK + bigint product_id + bigint device_id + varchar serial_number + bigint template_id + bigint user_id + } + IOT_PUSH_MODEL_ITEM { + bigint id PK + bigint config_id + bigint model_id + } + IOT_PUSH_USER { + bigint id PK + bigint config_id + bigint user_id + } +``` + +## 固件 OTA + +```mermaid +erDiagram + IOT_PRODUCT ||--o{ IOT_FIRMWARE : owns + IOT_FIRMWARE ||--o{ IOT_FIRMWARE_TASK : creates + IOT_FIRMWARE_TASK ||--o{ IOT_FIRMWARE_TASK_DETAIL : tracks + IOT_DEVICE ||--o{ IOT_FIRMWARE_TASK_DETAIL : target + + IOT_FIRMWARE { + bigint firmware_id PK + bigint product_id + bigint tenant_id + } + IOT_FIRMWARE_TASK { + bigint id PK + bigint firmware_id + } + IOT_FIRMWARE_TASK_DETAIL { + bigint id PK + bigint task_id + varchar serial_number + varchar message_id + } +``` + +## SceneModel、SCADA、GoView + +```mermaid +erDiagram + SCENE_MODEL ||--o{ SCENE_MODEL_DEVICE : has + SCENE_MODEL ||--o{ SCENE_MODEL_DATA : has_data + SCENE_MODEL_DEVICE ||--o{ SCENE_MODEL_DATA : source + SCENE_MODEL ||--o{ SCENE_MODEL_TAG : has_tag + SCENE_MODEL_TAG ||--o{ SCENE_TAG_POINTS : calculated_from + SCENE_MODEL_DATA ||--o{ SCENE_TAG_POINTS : point_source + IOT_GOVIEW_PROJECT ||--o{ IOT_GOVIEW_PROJECT_DATA : has_data + SCADA ||--o{ SCADA_DEVICE_BIND : binds_by_guid + IOT_DEVICE ||--o{ SCADA_DEVICE_BIND : bound + SYS_USER ||--o{ SCADA_COMPONENT : owns + + SCENE_MODEL { + bigint scene_model_id PK + bigint tenant_id + } + SCENE_MODEL_DEVICE { + bigint id PK + bigint scene_model_id + bigint cus_device_id + } + SCENE_MODEL_DATA { + bigint id PK + bigint scene_model_id + bigint scene_model_device_id + bigint datasource_id + } + SCENE_MODEL_TAG { + bigint id PK + bigint scene_model_id + } + SCENE_TAG_POINTS { + bigint id PK + bigint tag_id + bigint scene_model_data_id + } + IOT_GOVIEW_PROJECT { + bigint id PK + bigint tenant_id + } + IOT_GOVIEW_PROJECT_DATA { + bigint id PK + bigint project_id + } + SCADA { + bigint id PK + bigint tenant_id + } + SCADA_COMPONENT { + bigint id PK + bigint tenant_id + bigint user_id + } + SCADA_DEVICE_BIND { + bigint id PK + varchar serial_number + varchar scada_guid + } + SCADA_ECHART { + bigint id PK + bigint tenant_id + } + SCADA_GALLERY { + bigint id PK + bigint tenant_id + } + SCADA_MODEL { + bigint id PK + bigint tenant_id + } +``` + +## 视频 GB28181 与媒体 + +```mermaid +erDiagram + IOT_PRODUCT ||--o{ SIP_CONFIG : config_for + IOT_PRODUCT ||--o{ SIP_DEVICE : product_device + SIP_DEVICE ||--o{ SIP_DEVICE_CHANNEL : has_channel + SIP_DEVICE_CHANNEL ||--o{ IOT_SIP_RELATION : bind_channel + IOT_DEVICE ||--o{ IOT_SIP_RELATION : bind_iot_device + SCENE_MODEL ||--o{ IOT_SIP_RELATION : bind_scene + MEDIA_SERVER ||--o{ SIP_DEVICE_CHANNEL : streams + + SIP_CONFIG { + bigint id PK + bigint product_id + } + SIP_DEVICE { + bigint device_id PK + bigint product_id + varchar device_sip_id + } + SIP_DEVICE_CHANNEL { + bigint id PK + varchar device_sip_id PK + varchar channel_sip_id + bigint product_id + bigint user_id + } + MEDIA_SERVER { + bigint id PK + varchar server_id + bigint tenant_id + } + IOT_SIP_RELATION { + bigint id PK + varchar channel_id + bigint re_device_id + bigint re_scene_model_id + } +``` + +## 系统 RBAC + +```mermaid +erDiagram + SYS_DEPT ||--o{ SYS_DEPT : parent + SYS_DEPT ||--o{ SYS_USER : contains + SYS_USER ||--o{ SYS_USER_ROLE : has + SYS_ROLE ||--o{ SYS_USER_ROLE : assigned + SYS_ROLE ||--o{ SYS_ROLE_MENU : grants + SYS_MENU ||--o{ SYS_ROLE_MENU : granted + SYS_MENU ||--o{ SYS_MENU : parent + SYS_ROLE ||--o{ SYS_ROLE_DEPT : data_scope + SYS_DEPT ||--o{ SYS_ROLE_DEPT : scoped + SYS_USER ||--o{ SYS_USER_POST : holds + SYS_POST ||--o{ SYS_USER_POST : assigned + SYS_USER ||--o{ SYS_USER_RELATION : hierarchy + SYS_DICT_TYPE ||--o{ SYS_DICT_DATA : has + SYS_DICT_TYPE ||--o{ SYS_DICT_TYPE_TRANSLATE : translated + SYS_DICT_DATA ||--o{ SYS_DICT_DATA_TRANSLATE : translated + SYS_MENU ||--o{ SYS_MENU_TRANSLATE : translated + + SYS_USER { + bigint user_id PK + bigint dept_id + } + SYS_DEPT { + bigint dept_id PK + bigint parent_id + } + SYS_ROLE { + bigint role_id PK + } + SYS_MENU { + bigint menu_id PK + bigint parent_id + } + SYS_POST { + bigint post_id PK + } + SYS_USER_ROLE { + bigint user_id PK + bigint role_id PK + } + SYS_ROLE_MENU { + bigint role_id PK + bigint menu_id PK + } + SYS_ROLE_DEPT { + bigint role_id PK + bigint dept_id PK + } + SYS_USER_POST { + bigint user_id PK + bigint post_id PK + } + SYS_DICT_TYPE { + bigint dict_id PK + varchar dict_type UK + } + SYS_DICT_DATA { + bigint dict_code PK + varchar dict_type + } +``` + +## OAuth、第三方登录、App 偏好 + +```mermaid +erDiagram + SYS_USER ||--o{ SYS_AUTH_USER : auth_binding + SYS_USER ||--o{ IOT_SOCIAL_USER : social_binding + IOT_SOCIAL_PLATFORM ||--o{ IOT_SOCIAL_USER : platform + OAUTH_CLIENT_DETAILS ||--o{ OAUTH_ACCESS_TOKEN : issues + OAUTH_CLIENT_DETAILS ||--o{ OAUTH_REFRESH_TOKEN : refreshes + OAUTH_CLIENT_DETAILS ||--o{ OAUTH_CLIENT_TOKEN : client_token + SYS_USER ||--o{ OAUTH_ACCESS_TOKEN : token_user + SYS_USER ||--o{ APP_PREFERENCES : preferences + APP_LANGUAGE ||--o{ APP_PREFERENCES : selected_language + + SYS_AUTH_USER { + bigint auth_id PK + bigint user_id + } + IOT_SOCIAL_PLATFORM { + bigint social_platform_id PK + varchar platform UK + } + IOT_SOCIAL_USER { + bigint social_user_id PK + bigint sys_user_id + varchar open_id + varchar union_id + } + OAUTH_CLIENT_DETAILS { + bigint id PK + varchar client_id + bigint tenant_id + } + OAUTH_ACCESS_TOKEN { + varchar token_id + varchar client_id + varchar user_id + } + APP_LANGUAGE { + bigint id PK + } + APP_PREFERENCES { + bigint id PK + bigint user_id + varchar language + } +``` + +## 内容、OSS、代码生成 + +```mermaid +erDiagram + NEWS_CATEGORY ||--o{ NEWS : contains + OSS_CONFIG ||--o{ OSS_DETAIL : stores + GEN_TABLE ||--o{ GEN_TABLE_COLUMN : has_column + SYS_DICT_TYPE ||--o{ GEN_TABLE_COLUMN : dict + + NEWS_CATEGORY { + bigint category_id PK + } + NEWS { + bigint news_id PK + bigint category_id + } + OSS_CONFIG { + bigint id PK + bigint tenant_id + } + OSS_DETAIL { + bigint id PK + bigint tenant_id + } + GEN_TABLE { + bigint table_id PK + } + GEN_TABLE_COLUMN { + bigint column_id PK + bigint table_id + varchar dict_type + } +``` + +## Quartz 真实外键图 + +```mermaid +erDiagram + QRTZ_JOB_DETAILS ||--o{ QRTZ_TRIGGERS : has + QRTZ_TRIGGERS ||--o| QRTZ_BLOB_TRIGGERS : blob + QRTZ_TRIGGERS ||--o| QRTZ_CRON_TRIGGERS : cron + QRTZ_TRIGGERS ||--o| QRTZ_SIMPLE_TRIGGERS : simple + QRTZ_TRIGGERS ||--o| QRTZ_SIMPROP_TRIGGERS : simprop + + QRTZ_JOB_DETAILS { + varchar sched_name PK + varchar job_name PK + varchar job_group PK + } + QRTZ_TRIGGERS { + varchar sched_name PK + varchar trigger_name PK + varchar trigger_group PK + varchar job_name FK + varchar job_group FK + } + QRTZ_BLOB_TRIGGERS { + varchar sched_name PK + varchar trigger_name PK + varchar trigger_group PK + } + QRTZ_CRON_TRIGGERS { + varchar sched_name PK + varchar trigger_name PK + varchar trigger_group PK + } + QRTZ_SIMPLE_TRIGGERS { + varchar sched_name PK + varchar trigger_name PK + varchar trigger_group PK + } + QRTZ_SIMPROP_TRIGGERS { + varchar sched_name PK + varchar trigger_name PK + varchar trigger_group PK + } +``` + +## 读图说明 + +- `||--o{` 表示一对多业务关系。 +- `||--o|` 表示一对零或一的扩展关系。 +- 图中 `PK`、`UK`、`FK` 是阅读标注;除 Quartz 图外,`FK` 不代表数据库中存在外键约束。 +- 对于 `serial_number` 关联,运行时经常直接使用设备编号查找数据,但数据建模上仍应优先理解 `iot_device.device_id` 是设备主键。 diff --git a/docs/knowledge-base/05-data-bridge-integration.md b/docs/knowledge-base/05-data-bridge-integration.md new file mode 100644 index 00000000..b9f6a1c2 --- /dev/null +++ b/docs/knowledge-base/05-data-bridge-integration.md @@ -0,0 +1,663 @@ +# 数据桥接对接文档 + +本文面向需要和 岩安测控 对接的第三方系统,覆盖两类能力: + +1. 第三方系统查询设备及其物模型。 +2. 第三方系统获取设备上报数据,包括 岩安测控 主动推送和第三方主动查询。 + +本文基于当前仓库已有接口和数据桥接实现整理。默认服务根地址记为 `{BASE_URL}`,例如 `http://1.116.124.85:8080`。 + +## 对接方式总览 + +```mermaid +flowchart LR + Device[设备] --> Protocol[MQTT/TCP/HTTP/CoAP 等接入] + Protocol --> 岩安测控[岩安测控 数据处理] + 岩安测控 --> Store[(MySQL/TDengine)] + 岩安测控 --> Rule[数据流脚本/规则引擎] + Rule --> PushHTTP[主动推送 HTTP] + Rule --> PushMQTT[主动桥接 MQTT] + Rule --> PushDB[写入第三方数据库] + Third[第三方系统] --> API[REST API 主动查询] + API --> 岩安测控 +``` + +| 场景 | 推荐方式 | 说明 | +| --- | --- | --- | +| 获取设备清单 | REST API 主动查询 | 查询 `iot_device` 设备列表或按设备编号查询详情。 | +| 获取设备物模型 | REST API 主动查询 | 查询产品级/设备级物模型,包含属性、事件、服务、计算模型。 | +| 获取实时值 | REST API 主动查询 | 查询设备运行时缓存值。 | +| 获取历史上报数据 | REST API 主动查询 | 查询数据中心历史接口,支持按设备、时间范围、物模型标识符过滤。 | +| 上报数据实时同步给第三方 | 数据桥接主动推送 | 通过数据流脚本触发 HTTP、MQTT 或数据库桥接。 | +| 第三方系统周期同步 | REST API 定时拉取 | 第三方按时间窗口分页/分段查询历史数据。 | + +## 认证 + +除安全配置中明确放行的匿名接口外,REST API 默认需要登录 Token。 + +### 登录获取 Token + +```http +POST {BASE_URL}/login +Content-Type: application/json + +{ + "username": "admin", + "password": "admin123", + "code": "验证码", + "uuid": "验证码uuid" +} +``` + +成功响应: + +```json +{ + "code": 200, + "msg": "操作成功", + "token": "eyJhbGciOiJIUzUxMiJ9..." +} +``` + +后续请求头: + +```http +Authorization: Bearer {token} +``` + +如果系统关闭验证码或使用内部服务账号,可按部署配置调整登录参数。第三方生产对接建议单独创建服务账号,并只授予以下最小权限: + +| 能力 | 权限标识 | +| --- | --- | +| 设备查询 | `iot:device:list`, `iot:device:query` | +| 物模型查询 | `iot:model:list`, `iot:model:query` | +| 历史数据查询 | `dataCenter:history:list` | +| 数据分析查询 | `dataCenter:analysis:list` | +| 数据桥接配置 | `iot:bridge:list`, `iot:bridge:add`, `iot:bridge:edit`, `iot:bridge:query` | +| 数据流脚本配置 | `iot:script:list`, `iot:script:add`, `iot:script:edit`, `iot:script:query` | + +## 通用响应 + +普通接口返回 `AjaxResult`: + +```json +{ + "code": 200, + "msg": "操作成功", + "data": {} +} +``` + +分页接口返回 `TableDataInfo`: + +```json +{ + "code": 200, + "msg": "查询成功", + "total": 100, + "rows": [] +} +``` + +常见约定: + +- `code=200` 表示成功。 +- 设备编号 `serialNumber` 在上报和查询中通常会转为大写处理,第三方建议统一传大写。 +- 时间字段建议使用 `yyyy-MM-dd HH:mm:ss`。 + +## 查询设备 + +### 设备分页列表 + +```http +GET {BASE_URL}/iot/device/list?pageNum=1&pageSize=20&deviceName=xxx&serialNumber=ABC001&productId=1 +Authorization: Bearer {token} +``` + +说明: + +- Controller:`DeviceController.list` +- 权限:`iot:device:list` +- 返回:分页设备列表。 +- 常用过滤字段来自 `Device` 对象,实际可用字段包括 `deviceId`、`deviceName`、`serialNumber`、`productId`、`tenantId`、`deptId`、`status` 等。 + +### 设备简短列表 + +适合第三方做设备下拉或轻量同步。 + +```http +GET {BASE_URL}/iot/device/shortList?pageNum=1&pageSize=100&productId=1 +Authorization: Bearer {token} +``` + +### 查询所有设备简短列表 + +```http +GET {BASE_URL}/iot/device/all +Authorization: Bearer {token} +``` + +### 按设备 ID 查询详情 + +```http +GET {BASE_URL}/iot/device/{deviceId} +Authorization: Bearer {token} +``` + +### 按设备编号查询详情 + +```http +GET {BASE_URL}/iot/device/getDeviceBySerialNumber/{serialNumber} +Authorization: Bearer {token} +``` + +示例: + +```http +GET {BASE_URL}/iot/device/getDeviceBySerialNumber/ABC001 +Authorization: Bearer {token} +``` + +## 查询设备物模型 + +岩安测控 的物模型主要由 `productId + identifier` 定义。设备级计算物模型或特殊覆盖会结合 `serialNumber` 处理。 + +### 按产品 ID 和设备编号查询物模型 + +推荐第三方使用该接口,它会从缓存中合并产品级物模型和设备级处理结果。 + +```http +GET {BASE_URL}/iot/model/listByProductIdAndSerialNumber?productId=1&serialNumber=ABC001 +Authorization: Bearer {token} +``` + +说明: + +- Controller:`ThingsModelController.listByProductIdAndSerialNumber` +- 权限:`iot:model:list` +- 返回:`ThingsModelDTO` 列表。 + +典型返回项字段: + +| 字段 | 含义 | +| --- | --- | +| `modelId` | 物模型 ID。 | +| `identifier` | 物模型标识符,历史数据查询和推送数据中使用该字段作为变量名。 | +| `modelName` | 物模型名称。 | +| `type` | 物模型类型,通常表示属性/功能/事件等。 | +| `datatype` | 数据类型定义,例如 number、string、bool、enum 等。 | +| `specs` | 枚举、单位、取值范围等扩展规格。 | +| `modelOrder` | 排序。 | + +### 查询设备变量概况 + +```http +GET {BASE_URL}/iot/device/listThingsModel?deviceId=100&pageNum=1&pageSize=50 +Authorization: Bearer {token} +``` + +可选过滤: + +- `modelName`:按物模型名称模糊过滤。 +- `type`:按物模型类型过滤。 + +### 查询产品物模型列表 + +```http +GET {BASE_URL}/iot/model/list?pageNum=1&pageSize=100&productId=1 +Authorization: Bearer {token} +``` + +### 获取缓存 JSON 物模型 + +```http +GET {BASE_URL}/iot/model/cache/{productId} +Authorization: Bearer {token} +``` + +适用于需要拿完整 TSL JSON 的场景。 + +## 查询实时数据 + +### 查询设备运行时状态 + +```http +GET {BASE_URL}/iot/runtime/running?serialNumber=ABC001 +Authorization: Bearer {token} +``` + +说明: + +- Controller:`DeviceRuntimeController.runState` +- 返回:物模型当前值列表。 +- 数据来源:运行时缓存/物模型缓存,不适合替代历史审计。 + +典型返回: + +```json +{ + "code": 200, + "msg": "操作成功", + "data": [ + { + "id": "temperature", + "name": "温度", + "value": "26.5", + "type": 1, + "datatype": { + "type": "decimal", + "unit": "℃" + } + } + ] +} +``` + +## 第三方主动查询设备上报数据 + +### 推荐接口:数据中心历史查询 + +```http +POST {BASE_URL}/data/center/deviceHistory +Authorization: Bearer {token} +Content-Type: application/json + +{ + "deviceId": 100, + "serialNumber": "ABC001", + "beginTime": "2026-05-24 00:00:00", + "endTime": "2026-05-24 23:59:59", + "identifierList": [ + { "identifier": "temperature", "type": 1 }, + { "identifier": "humidity", "type": 1 } + ] +} +``` + +说明: + +- Controller:`DataCenterController.deviceHistory` +- 权限:`dataCenter:history:list` +- `serialNumber` 必填。 +- `identifierList` 建议传入,避免一次拉取全部变量导致响应过大。 +- `type` 与物模型类型保持一致,常见属性数据为 `1`,以实际物模型返回值为准。 + +典型返回结构: + +```json +{ + "code": 200, + "msg": "操作成功", + "data": [ + { + "2026-05-24 10:00:00": [ + { "temperature": "26.5" }, + { "humidity": "60" } + ] + }, + { + "2026-05-24 10:01:00": [ + { "temperature": "26.7" }, + { "humidity": "59" } + ] + } + ] +} +``` + +### 设备日志列表 + +适合按原始日志粒度查询。 + +```http +GET {BASE_URL}/iot/deviceLog/list?pageNum=1&pageSize=50&serialNumber=ABC001&beginTime=2026-05-24 00:00:00&endTime=2026-05-24 23:59:59 +Authorization: Bearer {token} +``` + +说明: + +- Controller:`DeviceLogController.list` +- 权限:`iot:device:list` +- 返回:分页日志行,字段来自 `DeviceLog`。 + +### 设备历史数据 GET 查询 + +```http +GET {BASE_URL}/iot/deviceLog/history?serialNumber=ABC001&beginTime=2026-05-24 00:00:00&endTime=2026-05-24 23:59:59 +Authorization: Bearer {token} +``` + +返回按 `identifier` 分组的历史数据,适合较简单的查询场景。 + +### 按时间聚合的历史数据 + +```http +GET {BASE_URL}/iot/deviceLog/historyGroupByCreateTime?pageNum=1&pageSize=100&serialNumber=ABC001&beginTime=2026-05-24 00:00:00&endTime=2026-05-24 23:59:59 +Authorization: Bearer {token} +``` + +### 网关计算物模型历史 + +```http +POST {BASE_URL}/data/center/deviceHistoryCalculated +Authorization: Bearer {token} +Content-Type: application/json + +{ + "deviceId": 100, + "serialNumber": "GW001", + "beginTime": "2026-05-24 00:00:00", + "endTime": "2026-05-24 23:59:59", + "identifierList": [ + { "identifier": "avg_temperature", "type": 1 } + ] +} +``` + +### 周期拉取建议 + +第三方主动查询历史数据时,建议使用滑动时间窗口: + +1. 首次同步:按小时或天分段拉取。 +2. 增量同步:每 1 至 5 分钟拉取一次 `[lastSyncTime, now - 10s]`。 +3. 去重键:`serialNumber + identifier + time`。 +4. 重试:失败窗口不要丢弃,下次继续从 `lastSuccessEndTime` 拉取。 +5. 大设备量:先同步设备列表,再按设备分批拉取,避免单次请求过大。 + +## 岩安测控 主动推送给第三方系统 + +岩安测控 当前主动推送走“数据流脚本 + 数据桥接”机制。设备上报后,`RuleProcess.processRuleScript(...)` 会按产品和事件类型找到启用的数据流脚本,然后执行脚本动作: + +| 脚本动作 | `scriptAction` | 桥接组件 | 用途 | +| --- | ---: | --- | --- | +| HTTP 推送 | 3 | `httpBridge` | 调用第三方 HTTP 接口。 | +| MQTT 桥接 | 4 | `mqttBridge` | 发布到第三方 MQTT Broker。 | +| 数据库存储 | 5 | `databaseBridge` | 写入第三方数据库。 | + +设备上报事件类型: + +| 事件 | `scriptEvent` | 说明 | +| --- | ---: | --- | +| 设备上报 | 1 | 设备属性/数据上报后触发。 | +| 平台下发 | 2 | 平台服务/指令下发前后触发。 | +| 设备上线 | 3 | 设备上线触发。 | +| 设备离线 | 4 | 设备离线触发。 | +| HTTP 桥接入口数据 | 5 | 第三方调用 `/bridge/get|post|put` 后触发。 | +| MQTT 桥接入口数据 | 6 | MQTT 输入桥接触发,按脚本配置处理。 | + +### 主动 HTTP 推送配置 + +1. 新增数据桥接。 + +```http +POST {BASE_URL}/iot/bridge +Authorization: Bearer {token} +Content-Type: application/json + +{ + "name": "推送到第三方业务系统", + "enable": "1", + "type": 3, + "direction": 2, + "route": "https://third.example.com/iot/report", + "configJson": "{\"method\":\"POST\",\"hostUrl\":\"https://third.example.com/iot/report\",\"requestHeaders\":\"{\\\"Authorization\\\":\\\"Bearer xxx\\\"}\",\"requestQuerys\":\"{}\",\"requestConfig\":\"\",\"requestBody\":\"\"}" +} +``` + +字段说明: + +| 字段 | 说明 | +| --- | --- | +| `type=3` | HTTP 推送。 | +| `direction=2` | 输出方向。 | +| `route` | 展示/路由字段,实际 HTTP 地址以 `configJson.hostUrl` 为准。 | +| `configJson.method` | HTTP 方法,如 `POST`。 | +| `configJson.hostUrl` | 第三方接收地址。 | +| `configJson.requestHeaders` | 请求头 JSON 字符串。 | +| `configJson.requestQuerys` | Query 参数 JSON 字符串。 | +| `configJson.requestBody` | 自定义请求体模板;为空时默认使用脚本上下文 payload。 | + +2. 新增数据流脚本。 + +下面脚本展示的是核心意图:取得 `MsgContext`,设置桥接 ID,必要时重写 `payload/topic`。不同 LiteFlow 脚本语言的上下文变量写法可能不同,落地时以当前环境脚本校验结果为准。 + +```http +POST {BASE_URL}/iot/script +Authorization: Bearer {token} +Content-Type: application/json + +{ + "applicationName": "岩安测控", + "scriptName": "设备上报转第三方HTTP", + "scriptType": "script", + "scriptLanguage": "groovy", + "scriptPurpose": 1, + "scriptEvent": 1, + "scriptAction": 3, + "productId": 1, + "enable": 1, + "bridgeId": 10, + "scriptData": "def cxt = _meta.getContextBean(com.岩安测控.ruleEngine.context.MsgContext.class); cxt.setPayload(cxt.getPayload()); cxt.setData('httpBridgeID', 10);" +} +``` + +脚本关键点: + +- `scriptPurpose=1` 表示数据流。 +- `scriptEvent=1` 表示设备上报触发。 +- `scriptAction=3` 表示执行 HTTP 推送组件。 +- `productId` 表示该产品下设备上报时触发。 +- 脚本必须向上下文写入 `httpBridgeID`,值为桥接配置 `bridge.id`;HTTP 桥接组件会从上下文读取该 ID。 +- 脚本可改写 `payload`,从而控制推送给第三方的报文。 + +### 推荐 HTTP 推送报文 + +如果第三方希望使用稳定格式,建议脚本把 payload 改造成如下 JSON: + +```json +{ + "event": "property.post", + "productId": 1, + "serialNumber": "ABC001", + "protocolCode": "ModbusRtu", + "reportTime": "2026-05-24 10:00:00", + "data": [ + { + "identifier": "temperature", + "value": "26.5" + }, + { + "identifier": "humidity", + "value": "60" + } + ], + "rawPayload": "[{\"id\":\"temperature\",\"value\":\"26.5\"}]" +} +``` + +当前默认上下文 payload 通常是设备上报解析后的物模型数据 JSON,字段形态可能随协议解析结果变化。生产对接建议在脚本中统一出站格式,避免第三方直接依赖内部 payload。 + +### 主动 MQTT 桥接配置 + +1. 新增 MQTT 桥接。 + +```http +POST {BASE_URL}/iot/bridge +Authorization: Bearer {token} +Content-Type: application/json + +{ + "name": "第三方MQTT桥接", + "enable": "1", + "type": 4, + "direction": 2, + "route": "third/iot/report", + "configJson": "{\"name\":\"third-mqtt\",\"hostUrl\":\"broker.example.com:1883\",\"username\":\"user\",\"password\":\"pass\",\"clientId\":\"岩安测控-bridge\"}" +} +``` + +2. 新增脚本。 + +```json +{ + "applicationName": "岩安测控", + "scriptName": "设备上报转第三方MQTT", + "scriptType": "script", + "scriptLanguage": "groovy", + "scriptPurpose": 1, + "scriptEvent": 1, + "scriptAction": 4, + "productId": 1, + "enable": 1, + "bridgeId": 11, + "scriptData": "def cxt = _meta.getContextBean(com.岩安测控.ruleEngine.context.MsgContext.class); cxt.setTopic('third/iot/' + cxt.getSerialNumber() + '/property/post'); cxt.setData('mqttBridgeID', 11);" +} +``` + +说明: + +- MQTT 桥接组件使用 `cxt.getTopic()` 作为发布主题。 +- 脚本必须写入 `mqttBridgeID`;MQTT 桥接组件会从上下文读取该 ID。 +- `payload` 默认透传,建议按第三方格式重写。 + +### 写入第三方数据库 + +1. 配置数据库桥接数据源。 + +数据库桥接组件读取 `MultipleDataSource`,字段包括: + +| 字段 | 说明 | +| --- | --- | +| `databaseSource` | 数据库类型,支持 MySQL、SQLServer、Oracle、PostgreSQL、H2。 | +| `host` | 地址,包含主机和端口。 | +| `dataBaseName` | 数据库名。 | +| `userName` | 用户名。 | +| `password` | 密码。 | +| `sql` | 要执行的 SQL,可使用上下文占位符替换。 | + +2. 新增数据流脚本,写入 `databaseBridgeID`。 + +```json +{ + "scriptPurpose": 1, + "scriptEvent": 1, + "scriptAction": 5, + "productId": 1, + "enable": 1, + "scriptData": "def cxt = _meta.getContextBean(com.岩安测控.ruleEngine.context.MsgContext.class); cxt.setData('databaseBridgeID', 20);" +} +``` + +注意:数据库桥接当前通过拼接后的 SQL 执行,生产环境必须控制 SQL 模板来源和字段转义,避免把不可信 payload 直接拼入 SQL。 + +## 第三方调用 岩安测控 桥接入口 + +岩安测控 也提供了桥接入口,第三方可以把数据送入 岩安测控 的数据流脚本: + +| 方法 | 地址 | 说明 | +| --- | --- | --- | +| GET | `{BASE_URL}/bridge/get` | Query/Header 进入上下文。 | +| POST | `{BASE_URL}/bridge/post` | Body 进入上下文 payload。 | +| PUT | `{BASE_URL}/bridge/put` | Body 进入上下文 payload。 | + +这些入口会以: + +```text +scriptPurpose=1 +scriptEvent=5 +route=/bridge/get|/bridge/post|/bridge/put +``` + +查询并执行数据流脚本。 + +安全注意:当前安全配置未默认放行 `/bridge/**`,因此仍需要 Token,除非部署侧自行放开。 + +## 推荐对接方案 + +### 方案 A:实时同步优先 + +适用:第三方需要尽快拿到设备上报数据。 + +1. 第三方提供 HTTP 接收地址或 MQTT Broker。 +2. 岩安测控 配置 `bridge`。 +3. 岩安测控 为对应产品配置数据流脚本。 +4. 第三方收到推送后按 `serialNumber + identifier + reportTime` 入库去重。 +5. 第三方定时调用历史查询接口补偿漏推窗口。 + +推荐组合: + +- 实时:HTTP 推送或 MQTT 桥接。 +- 补偿:`POST /data/center/deviceHistory`。 + +### 方案 B:第三方定时拉取 + +适用:第三方不开放公网回调地址,或只需要分钟级/小时级同步。 + +1. 调用 `/iot/device/list` 或 `/iot/device/shortList` 同步设备。 +2. 调用 `/iot/model/listByProductIdAndSerialNumber` 同步物模型。 +3. 按设备调用 `/data/center/deviceHistory` 拉取上报数据。 +4. 使用滑动窗口和去重键保证幂等。 + +### 方案 C:第三方数据库落库 + +适用:第三方只提供数据库账号,不提供 API。 + +1. 配置数据库连接。 +2. 为产品配置数据流脚本。 +3. 数据库桥接执行 SQL 写入第三方库。 + +不建议把该方案作为首选,原因是数据库账号权限、SQL 模板安全和网络连通性风险更高。 + +## 字段映射建议 + +第三方侧建议建立如下最小模型。 + +### 设备表 + +| 字段 | 来源 | +| --- | --- | +| `device_id` | `iot_device.deviceId` | +| `serial_number` | `iot_device.serialNumber` | +| `device_name` | `iot_device.deviceName` | +| `product_id` | `iot_device.productId` | +| `status` | `iot_device.status` | +| `tenant_id` | `iot_device.tenantId` | + +### 物模型表 + +| 字段 | 来源 | +| --- | --- | +| `model_id` | `ThingsModelDTO.modelId` | +| `product_id` | 查询入参或返回字段 | +| `identifier` | `ThingsModelDTO.identifier` | +| `name` | `ThingsModelDTO.modelName` | +| `type` | `ThingsModelDTO.type` | +| `datatype` | `ThingsModelDTO.datatype` | + +### 设备数据表 + +| 字段 | 来源 | +| --- | --- | +| `serial_number` | 设备编号 | +| `product_id` | 设备所属产品 | +| `identifier` | 物模型标识符 | +| `value` | 上报值 | +| `report_time` | 历史接口返回的时间或推送报文时间 | +| `source` | `pull` 或 `push` | +| `raw_payload` | 原始推送/查询报文 | + +## 幂等、重试和安全 + +- 推送接口必须幂等,建议第三方以 `serialNumber + identifier + reportTime` 去重。 +- 岩安测控 主动推送失败当前主要依赖组件日志排查,建议第三方同时做主动拉取补偿。 +- 第三方主动查询必须按时间窗口限制范围,避免一次拉取全量历史。 +- HTTP 推送建议使用 HTTPS、固定 Token 或签名头。 +- MQTT 桥接建议使用独立账号和最小 Topic 权限。 +- 数据库桥接建议只授予 INSERT 权限,避免执行 DDL 或高危 SQL。 + +## 当前实现注意点 + +- `岩安测控-mq` 当前核心是 JVM 内本地阻塞队列,不是外部 RocketMQ 的强持久化链路。 +- 主动 HTTP 推送的默认 payload 由规则脚本上下文决定,生产对接应在脚本中统一出站报文。 +- 数据桥接脚本查询按 `productId + scriptPurpose + scriptEvent + enable` 等条件筛选;产品维度必须配置正确。 +- 业务表关系大多没有数据库外键,第三方不要依赖数据库外键判断关联,应以 API 返回和业务字段为准。 diff --git a/docs/knowledge-base/README.md b/docs/knowledge-base/README.md new file mode 100644 index 00000000..5d145ec5 --- /dev/null +++ b/docs/knowledge-base/README.md @@ -0,0 +1,25 @@ +# FastBee 项目知识库 + +本知识库用于快速理解 FastBee 当前仓库的整体架构、运行链路、模块职责和数据库关系。内容基于本仓库代码、Maven 配置、`application*.yml` 和 `sql/yack-20260316.sql` 梳理。 + +## 阅读路径 + +1. [整体架构](./01-architecture.md):项目分层、模块边界、依赖入口、前后端组成。 +2. [核心运行链路](./02-runtime-flows.md):启动、设备接入、上报、下发、规则引擎、视频和通知链路。 +3. [数据库与表关系](./03-data-model.md):表分组、核心实体、业务关联、真实外键和约定关联。 +4. [数据库关系图](./04-er-diagrams.md):按业务域拆分的 Mermaid ER 图。 +5. [数据桥接对接文档](./05-data-bridge-integration.md):设备/物模型查询、设备上报数据推送和第三方主动查询。 + +## 当前结论 + +- 后端是 Java 8 + Spring Boot 2.5.14 的 Maven 多模块工程,主入口是 `fastbee-admin`。 +- 前端包含三个独立应用:`yack-web` 管理后台、`yack-view` 低代码可视化、`yack-app` UniApp 移动端。 +- IoT 接入由 `fastbee-server` 下的 Netty 协议服务承载,协议编解码在 `fastbee-protocol`,业务处理集中在 `fastbee-iot-data` 和 `fastbee-service/fastbee-iot-service`。 +- 设备消息队列当前主要是 JVM 内本地 `LinkedBlockingQueue` 队列族,`fastbee-mq` 模块名称虽为 MQ,但核心代码不是外部 RocketMQ Consumer 模式。 +- 主库初始化脚本为 `sql/yack-20260316.sql`。脚本中大部分业务表没有数据库外键,关系依靠字段命名、联合主键、索引和业务代码约定;Quartz 表保留了真实外键约束。 + +## 维护约定 + +- 业务逻辑、表关系和配置变化后,同步更新本目录对应文档。 +- 表关系文档中用“强约束”表示 SQL 外键,用“业务约定”表示代码和字段约定形成的关系。 +- 不把推断关系写成数据库强约束,除非 SQL 中确实存在 `FOREIGN KEY`。 diff --git a/fastbee-open-api/src/main/java/com/fastbee/controller/platform/dcp/DcpOpenApiController.java b/fastbee-open-api/src/main/java/com/fastbee/controller/platform/dcp/DcpOpenApiController.java new file mode 100644 index 00000000..58aefefc --- /dev/null +++ b/fastbee-open-api/src/main/java/com/fastbee/controller/platform/dcp/DcpOpenApiController.java @@ -0,0 +1,23 @@ +package com.fastbee.controller.platform.dcp;/** + * @description: + * @author Sumuxi + * @date 2026/5/25 + */ + +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @description: + * + * @author Sumuxi + * @date 2026/5/25 + */ +@Api(tags = "DCP开发平台") +@RestController +@RequestMapping("/open/dcp") +public class DcpOpenApiController { + + +} diff --git a/fastbee-open-api/src/main/java/com/fastbee/data/service/impl/OtaUpgradeServiceImpl.java b/fastbee-open-api/src/main/java/com/fastbee/data/service/impl/OtaUpgradeServiceImpl.java deleted file mode 100644 index e69de29b..00000000