SkeyeVSS开发笔记-国标设备通道数据模型
通道数据模型(core/repositories/models/channels)
本文说明 通道(目录节点与摄像头通道) core/repositories/models/channels 包中的职责、与项目各层的对接方式,以及字段含义与 API/库形态对应关系。
项目地址 https://github.com/openskeye/go-vss
姊妹篇:7.1 设备数据模型(devices)、7.0 组织部门数据模型(departments,与本文 depIds 对应)。
1. 在项目中承担的作用
该模型描述 国标/接入侧通道与目录 的核心实体:数据落在表 sk-channels,通过统一 ORM 接入 db 服务;通道与 设备 通过 deviceUniqueId 逻辑关联(与 sk-devices.deviceUniqueId 对应);与 部门 通过 depIds 多选关联。通道还承担 在线/拉流/录制/地理位置/级联编号 等运行时状态与业务字段的持久化。
| 层级 | 作用 |
|---|---|
| 数据层 | core/app/sev/db/internal/svc/init_database.go 对 channels.Channels 执行 AutoMigrate;ServiceContext 注入 ChannelsModel。 |
| RPC / db 服务 | core/app/sev/db/internal/logic/deviceservice/ 下 channel_* 系列逻辑(列表、创建、更新、删除、Upsert、按条件删通道等)操作 ChannelsModel 与 channels.Item。 |
| HTTP / backend | core/app/sev/backend/internal/handler/device/channels 与路由中的 /device/channel 等接口,经 RPC 访问 db 服务。 |
| 配置 / 编号 | MaxIdLogic 在 type == "cascadeChannel" 时,基于 cascadeChannelUniqueId 生成下一级联通道编号(条件构建复用 ChannelsModel.CaseNumberCondition)。 |
| 与其它模型 | deviceUniqueId 归属某台设备;depIds 为部门 id 数组(库内 JSON 字符串);初始化/同步逻辑(如 svc/proc.go)会按通道的 depIds 聚合回写设备的部门归属。 |
通道是 设备之下的监控资源单元:parental / parentID 表达国标目录树中的父子关系;uniqueId 与 deviceUniqueId 组成业务唯一约束(索引 device_channel_UniqueId)。
2. 表与字段:数据库列 ↔ Go ↔ JSON
实体 Channels 映射表 sk-channels(TableName() 返回值)。下列「说明」中概括库类型与典型 JSON 形态。
| 字段 | 含义 | 说明 |
|---|---|---|
id |
主键 | 自增。 |
deviceUniqueId |
所属设备 ID | CHAR(70),与设备表 deviceUniqueId 对应;与 uniqueId 组成复合唯一索引。 |
uniqueId |
通道业务 ID | CHAR(70);同一设备下通道/目录唯一。 |
originalChannelUniqueId |
平台原始通道 ID | varchar,对接设备/国标侧原始编码。 |
name |
通道名称 | 展示名。 |
label |
自定义标签 | varchar。 |
cascadeChannelUniqueId |
级联通道编号 | 可空、唯一;MaxId 的 cascadeChannel 类型用于生成。 |
cascadeDepUniqueId |
级联父级编号 | 分组/设备/平台侧父级标识(注释语义)。 |
isCascade |
是否本机级联设备 | 1 表示是。 |
ptzType |
云台类型 | 与 variables.PTXTypes 注释一致(球机/枪机等)。 |
streamUrl |
接入码流地址 | ONVIF/流媒体源等场景。 |
cdnState / cdnUrl |
CDN 开关与地址 | 开关 + URL。 |
longitude / latitude |
经纬度 | decimal 映射为 float64。 |
onDemandLiveState |
按需直播 | 0/1。 |
audioState |
是否开启音频 | 0/1。 |
transCodedState |
是否转码 | 0/1。 |
onlineAt |
上线时间 | 毫秒时间戳。 |
online |
在线状态 | 0 不在线,1 在线。 |
streamState |
流状态 | 是否在推/拉流等(见字段注释)。 |
recordingState |
是否录制中 | 见字段注释。 |
streamMSId |
当前媒体服务 ID | 关联流媒体实例。 |
parentID |
父目录 ID | 国标目录树上级的 uniqueId 类标识(CHAR(70))。 |
parental |
是否有子节点 | 1 目录/组织节点,0 叶子通道。 |
original |
原始 Catalog 数据 | 库内 JSON 字符串;Item.Original 为 map[string]interface{}。 |
videos |
已保存录像信息 | 库内 JSON 数组字符串;Item.Videos 为 []*VideoItem(含 date 区间与 path)。CorrectionMap 会校验 path 与 date。 |
screenshots |
截图路径列表 | 库内 JSON 数组字符串;Item 为 []string。 |
snapshot |
快照 | 单 URL 或路径字符串。 |
depIds |
部门 ID 集合 | 库内 JSON 数组字符串;Item.DepIds 为 []uint64,与 departments.id 对应。 |
createdAt / updatedAt |
创建 / 更新时间 | 毫秒时间戳;Correction / CorrectionMap 维护 updatedAt。 |
3. Item 与 Channels 的字段对应
Item 在 data.go 中定义:
- 内嵌
*Channels:标量字段的 JSON 与Channels一致。 Original:API 为对象;落库为original字符串。Videos:API 为[]*VideoItem;落库为videos字符串。Screenshots:API 为[]string;落库为screenshots字符串。DepIds:API 为[]uint64;落库为depIdsJSON 字符串。UseDBCache:json:"-"。
更新场景下,CheckMap 校验列名属于 variables.Columns,并对 original / videos / screenshots / depIds 做类型转换后序列化为字符串写入 map。
4. 列名常量(variables.go)
| 常量 | 数据库列 |
|---|---|
ColumnID |
id |
ColumnUniqueId |
uniqueId |
ColumnDeviceUniqueId |
deviceUniqueId |
ColumnOriginalChannelUniqueId |
originalChannelUniqueId |
ColumnCascadeChannelUniqueId |
cascadeChannelUniqueId |
ColumnCascadeDepUniqueId |
cascadeDepUniqueId |
ColumnIsCascade |
isCascade |
ColumnName |
name |
ColumnLabel |
label |
ColumnPtzType |
ptzType |
ColumnStreamUrl |
streamUrl |
ColumnCdnState |
cdnState |
ColumnCdnUrl |
cdnUrl |
ColumnLongitude |
longitude |
ColumnLatitude |
latitude |
ColumnOnDemandLiveState |
onDemandLiveState |
ColumnAudioState |
audioState |
ColumnTransCodedState |
transCodedState |
ColumnRecordingState |
recordingState |
ColumnOnline |
online |
ColumnOnlineAt |
onlineAt |
ColumnStreamState |
streamState |
ColumnStreamMSId |
streamMSId |
ColumnOriginal |
original |
ColumnVideos |
videos |
ColumnScreenshots |
screenshots |
ColumnSnapshot |
snapshot |
ColumnDepIds |
depIds |
ColumnParental |
parental |
ColumnParentID |
parentID |
ColumnCreatedAt |
createdAt |
ColumnUpdatedAt |
updatedAt |
PrimaryId 为 "id"。
5. 行为与联调注意点
- 缓存:
Channels.UseCache()开启内存缓存(前缀为表名,约 60 秒),且包含UpdateDelete等选项;排障时注意缓存滞后。 - 唯一性:业务上以
deviceUniqueId+uniqueId唯一定位一条通道记录(与前端/国标目录同步约定一致)。 - 精简列表:
DB.XList仅 SELECT 部分列并单独解析depIds,用于高性能列表或关联场景。 - 与设备、部门:删除设备时往往联动删除通道;部门与通道、设备的
depIds在部分初始化流程中会保持一致性处理。
6. 相关代码路径
- 模型包:
core/repositories/models/channels/ - DB 迁移与模型注入:
core/app/sev/db/internal/svc/init_database.go、service_context.go - 通道 RPC 逻辑:
core/app/sev/db/internal/logic/deviceservice/channel_*.go - HTTP 处理器:
core/app/sev/backend/internal/handler/device/channels/ - 级联通道编号:
core/app/sev/db/internal/logic/configservice/max_id_logic.go(cascadeChannel) - 与设备部门同步:
core/app/sev/db/internal/svc/proc.go
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)