hi-server/internal/logic/public/user/getDeviceListLogic.go
shanshanzhong 2442831cd7
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m28s
feat(设备管理): 添加设备在线记录查询功能并优化设备列表排序
添加FindLatestDeviceOnlineRecord接口用于查询设备最新在线记录
实现GetOnlineDeviceLoginTime方法获取设备登录时间
优化设备列表查询按最后活动时间排序
移除未使用的依赖项
2025-11-27 23:24:48 -08:00

68 lines
2.0 KiB
Go

package user
import (
"context"
"sort"
"time"
"github.com/perfect-panel/server/internal/model/user"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/internal/types"
"github.com/perfect-panel/server/pkg/constant"
"github.com/perfect-panel/server/pkg/logger"
"github.com/perfect-panel/server/pkg/tool"
)
type GetDeviceListLogic struct {
logger.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
// Get Device List
func NewGetDeviceListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetDeviceListLogic {
return &GetDeviceListLogic{
Logger: logger.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetDeviceListLogic) GetDeviceList() (resp *types.GetDeviceListResponse, err error) {
userInfo := l.ctx.Value(constant.CtxKeyUser).(*user.User)
list, count, err := l.svcCtx.UserModel.QueryDeviceList(l.ctx, userInfo.Id)
if err != nil {
return nil, err
}
type item struct {
dev *user.Device
when time.Time
}
items := make([]item, 0, len(list))
for _, d := range list {
t, ok := l.svcCtx.DeviceManager.GetOnlineDeviceLoginTime(userInfo.Id, d.Identifier)
if !ok {
rec, recErr := l.svcCtx.UserModel.FindLatestDeviceOnlineRecord(l.ctx, userInfo.Id, d.Identifier)
if recErr == nil && rec != nil {
t = rec.OnlineTime
} else {
if d.UpdatedAt.After(d.CreatedAt) {
t = d.UpdatedAt
} else {
t = d.CreatedAt
}
}
}
items = append(items, item{dev: d, when: t})
}
sort.Slice(items, func(i, j int) bool { return items[i].when.After(items[j].when) })
userRespList := make([]types.UserDevice, 0, len(items))
for _, it := range items {
var ud types.UserDevice
tool.DeepCopy(&ud, it.dev)
userRespList = append(userRespList, ud)
}
resp = &types.GetDeviceListResponse{Total: count, List: userRespList}
return
}