通道数据模型(`core/repositories/models/channels`)

2 阅读4分钟

通道数据模型(core/repositories/models/channels

本文说明 通道(目录节点与摄像头通道) core/repositories/models/channels 包中的职责、与项目各层的对接方式,以及字段含义与 API/库形态对应关系。

项目地址 github.com/openskeye/g…

姊妹篇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.gochannels.Channels 执行 AutoMigrateServiceContext 注入 ChannelsModel
RPC / db 服务core/app/sev/db/internal/logic/deviceservice/channel_* 系列逻辑(列表、创建、更新、删除、Upsert、按条件删通道等)操作 ChannelsModelchannels.Item
HTTP / backendcore/app/sev/backend/internal/handler/device/channels 与路由中的 /device/channel 等接口,经 RPC 访问 db 服务。
配置 / 编号MaxIdLogictype == "cascadeChannel" 时,基于 cascadeChannelUniqueId 生成下一级联通道编号(条件构建复用 ChannelsModel.CaseNumberCondition)。
与其它模型deviceUniqueId 归属某台设备;depIds 为部门 id 数组(库内 JSON 字符串);初始化/同步逻辑(如 svc/proc.go)会按通道的 depIds 聚合回写设备的部门归属。

通道是 设备之下的监控资源单元parental / parentID 表达国标目录树中的父子关系;uniqueIddeviceUniqueId 组成业务唯一约束(索引 device_channel_UniqueId)。


2. 表与字段:数据库列 ↔ Go ↔ JSON

实体 Channels 映射表 sk-channelsTableName() 返回值)。下列「说明」中概括库类型与典型 JSON 形态。

字段含义说明
id主键自增。
deviceUniqueId所属设备 IDCHAR(70),与设备表 deviceUniqueId 对应;与 uniqueId 组成复合唯一索引。
uniqueId通道业务 IDCHAR(70);同一设备下通道/目录唯一。
originalChannelUniqueId平台原始通道 IDvarchar,对接设备/国标侧原始编码。
name通道名称展示名。
label自定义标签varchar。
cascadeChannelUniqueId级联通道编号可空、唯一;MaxIdcascadeChannel 类型用于生成。
cascadeDepUniqueId级联父级编号分组/设备/平台侧父级标识(注释语义)。
isCascade是否本机级联设备1 表示是。
ptzType云台类型variables.PTXTypes 注释一致(球机/枪机等)。
streamUrl接入码流地址ONVIF/流媒体源等场景。
cdnState / cdnUrlCDN 开关与地址开关 + 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.Originalmap[string]interface{}
videos已保存录像信息库内 JSON 数组字符串;Item.Videos[]*VideoItem(含 date 区间与 path)。CorrectionMap 会校验 pathdate
screenshots截图路径列表库内 JSON 数组字符串;Item[]string
snapshot快照单 URL 或路径字符串。
depIds部门 ID 集合库内 JSON 数组字符串Item.DepIds[]uint64,与 departments.id 对应。
createdAt / updatedAt创建 / 更新时间毫秒时间戳;Correction / CorrectionMap 维护 updatedAt

3. ItemChannels 的字段对应

Itemdata.go 中定义:

  • 内嵌 *Channels:标量字段的 JSON 与 Channels 一致。
  • Original:API 为对象;落库为 original 字符串。
  • Videos:API 为 []*VideoItem;落库为 videos 字符串。
  • Screenshots:API 为 []string;落库为 screenshots 字符串。
  • DepIds:API 为 []uint64;落库为 depIds JSON 字符串。
  • UseDBCachejson:"-"

更新场景下,CheckMap 校验列名属于 variables.Columns,并对 original / videos / screenshots / depIds 做类型转换后序列化为字符串写入 map。


4. 列名常量(variables.go

常量数据库列
ColumnIDid
ColumnUniqueIduniqueId
ColumnDeviceUniqueIddeviceUniqueId
ColumnOriginalChannelUniqueIdoriginalChannelUniqueId
ColumnCascadeChannelUniqueIdcascadeChannelUniqueId
ColumnCascadeDepUniqueIdcascadeDepUniqueId
ColumnIsCascadeisCascade
ColumnNamename
ColumnLabellabel
ColumnPtzTypeptzType
ColumnStreamUrlstreamUrl
ColumnCdnStatecdnState
ColumnCdnUrlcdnUrl
ColumnLongitudelongitude
ColumnLatitudelatitude
ColumnOnDemandLiveStateonDemandLiveState
ColumnAudioStateaudioState
ColumnTransCodedStatetransCodedState
ColumnRecordingStaterecordingState
ColumnOnlineonline
ColumnOnlineAtonlineAt
ColumnStreamStatestreamState
ColumnStreamMSIdstreamMSId
ColumnOriginaloriginal
ColumnVideosvideos
ColumnScreenshotsscreenshots
ColumnSnapshotsnapshot
ColumnDepIdsdepIds
ColumnParentalparental
ColumnParentIDparentID
ColumnCreatedAtcreatedAt
ColumnUpdatedAtupdatedAt

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.goservice_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.gocascadeChannel
  • 与设备部门同步:core/app/sev/db/internal/svc/proc.go