From b2b511d7555cd9bc95a87f9f01af2c7ee2dbfc84 Mon Sep 17 00:00:00 2001 From: pggiroro Date: Sun, 15 Jun 2025 22:18:06 +0800 Subject: [PATCH] fix: user.LastLogin set gorm type:timestamp, gb28181 api GetGroupChannels modify --- pkg/db/user.go | 2 +- plugin/gb28181/api.go | 33 ++++++++++++++------------------- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/pkg/db/user.go b/pkg/db/user.go index 46e3f8c..284ca05 100644 --- a/pkg/db/user.go +++ b/pkg/db/user.go @@ -13,7 +13,7 @@ type User struct { Username string `gorm:"uniqueIndex;size:64"` Password string `gorm:"size:60"` // bcrypt hash Role string `gorm:"size:20;default:'user'"` // admin or user - LastLogin time.Time `gorm:"default:CURRENT_TIMESTAMP"` + LastLogin time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP"` } // BeforeCreate hook to hash password before saving diff --git a/plugin/gb28181/api.go b/plugin/gb28181/api.go index f33348c..e608f22 100644 --- a/plugin/gb28181/api.go +++ b/plugin/gb28181/api.go @@ -1873,8 +1873,8 @@ func (gb *GB28181Plugin) GetGroupChannels(ctx context.Context, req *pb.GetGroupC Select(` IFNULL(gc.id, 0) AS id, dc.channel_id, + dc.device_id, dc.name AS channel_name, - d.device_id AS device_id, d.name AS device_name, dc.status AS status, CASE @@ -1883,11 +1883,11 @@ func (gb *GB28181Plugin) GetGroupChannels(ctx context.Context, req *pb.GetGroupC END AS in_group `). Joins("LEFT JOIN "+deviceTable+" AS d ON dc.device_id = d.device_id"). - Joins("LEFT JOIN "+groupsChannelTable+" AS gc ON dc.channel_id = gc.channel_id AND gc.group_id = ?", req.GroupId) + Joins("LEFT JOIN "+groupsChannelTable+" AS gc ON dc.channel_id = gc.channel_id AND dc.device_id = gc.device_id AND gc.group_id = ?", req.GroupId) // 如果有设备ID过滤条件 if req.DeviceId != "" { - baseQuery = baseQuery.Where("d.device_id = ?", req.DeviceId) + baseQuery = baseQuery.Where("dc.device_id = ?", req.DeviceId) } // 统计符合条件的通道总数 @@ -1903,7 +1903,7 @@ func (gb *GB28181Plugin) GetGroupChannels(ctx context.Context, req *pb.GetGroupC query := baseQuery // 添加排序 - query = query.Order("channel_id ASC") + query = query.Order("dc.device_id ASC, dc.channel_id ASC") // 如果指定了分页参数,则应用分页 if req.Page > 0 && req.Count > 0 { @@ -1922,12 +1922,14 @@ func (gb *GB28181Plugin) GetGroupChannels(ctx context.Context, req *pb.GetGroupC var pbGroupChannels []*pb.GroupChannel for _, result := range results { channelInfo := &pb.GroupChannel{ + Id: int32(result.ID), + GroupId: req.GroupId, ChannelId: result.ChannelID, DeviceId: result.DeviceID, ChannelName: result.ChannelName, DeviceName: result.DeviceName, Status: result.Status, - InGroup: result.InGroup, // 设置inGroup字段 + InGroup: result.InGroup, } // 从内存中获取设备信息以获取传输协议 @@ -1935,13 +1937,6 @@ func (gb *GB28181Plugin) GetGroupChannels(ctx context.Context, req *pb.GetGroupC channelInfo.StreamMode = device.StreamMode } - if result.InGroup { - channelInfo.Id = int32(result.ID) - channelInfo.GroupId = int32(req.GroupId) - } else { - channelInfo.Id = 0 - } - pbGroupChannels = append(pbGroupChannels, channelInfo) } @@ -2082,19 +2077,19 @@ func (gb *GB28181Plugin) getGroupChannels(groupId int32) ([]*pb.GroupChannel, er InGroup bool `gorm:"column:in_group"` } - // 构建查询 + // 构建优化后的查询 query := gb.DB.Table(groupsChannelTable+" AS gc"). Select(` gc.id AS id, gc.channel_id AS channel_id, gc.device_id AS device_id, - dc.name AS channel_name, - d.name AS device_name, - dc.status AS status, + ch.name AS channel_name, + dev.name AS device_name, + ch.status AS status, true AS in_group `). - Joins("LEFT JOIN "+deviceChannelTable+" AS dc ON gc.channel_id = dc.channel_id"). - Joins("LEFT JOIN "+deviceTable+" AS d ON gc.device_id = d.device_id"). + Joins("LEFT JOIN "+deviceChannelTable+" AS ch ON gc.device_id = ch.device_id AND gc.channel_id = ch.channel_id"). + Joins("LEFT JOIN "+deviceTable+" AS dev ON ch.device_id = dev.device_id"). Where("gc.group_id = ?", groupId) var results []Result @@ -2107,7 +2102,7 @@ func (gb *GB28181Plugin) getGroupChannels(groupId int32) ([]*pb.GroupChannel, er for _, result := range results { channelInfo := &pb.GroupChannel{ Id: int32(result.ID), - GroupId: groupId, + GroupId: groupId, // 使用函数参数 groupId ChannelId: result.ChannelID, DeviceId: result.DeviceID, ChannelName: result.ChannelName,