package core import ( "context" "fmt" "gitlink.org.cn/JointCloud/pcm-coordinator/pkg/models" "gorm.io/gorm" "gitlink.org.cn/JointCloud/pcm-coordinator/internal/svc" "gitlink.org.cn/JointCloud/pcm-coordinator/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type PageResourceRangeLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewPageResourceRangeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PageResourceRangeLogic { return &PageResourceRangeLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *PageResourceRangeLogic) PageResourceRange(req *types.ResourceSpecReq) (resp *types.PageResult, err error) { if req.PageNum <= 0 || req.PageSize <= 0 { return nil, fmt.Errorf("invalid pagination parameters: PageNum=%d, PageSize=%d", req.PageNum, req.PageSize) } result := &types.PageResult{ PageNum: req.PageNum, PageSize: req.PageSize, } query := l.buildBaseQuery(req) if err := query.Count(&result.Total).Error; err != nil { return nil, fmt.Errorf("failed to count records: %w", err) } var specs []*models.TResourceSpec if err := query.Model(models.TResourceSpec{}).Preload("BaseResourceSpecs"). Scopes(paginate(req.PageNum, req.PageSize)). Find(&specs).Error; err != nil { return nil, fmt.Errorf("failed to query resources: %w", err) } result.List = specs return result, nil } func (l *PageResourceRangeLogic) buildBaseQuery(req *types.ResourceSpecReq) *gorm.DB { query := l.svcCtx.DbEngin.Model(&models.TResourceSpec{}). Where("deleted_at IS NULL") if req.ClusterId != "" { query = query.Where("cluster_id = ?", req.ClusterId) } if req.Tag != "" { query = query.Where("tag = ?", req.Tag) } if req.Status != "" { query = query.Where("status = ?", req.Status) } if req.ChangeType != "" { query = query.Where("change_type = ?", req.ChangeType) } if req.Type != "" { query = query.Where("type = ?", req.Type) } if req.Name != "" { query = query.Where("name LIKE ?", "%"+req.Name+"%") } return query } func paginate(pageNum, pageSize int) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { offset := (pageNum - 1) * pageSize return db.Offset(offset).Limit(pageSize).Order("create_time DESC") } }