liuhaijun e94826ce29 add server
Change-Id: I0760f17f6a01c0121b59fcbfafc666032dbc30af
2024-09-19 09:44:15 +00:00

343 lines
9.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package model
import (
"errors"
c "git.inspur.com/sbg-jszt/cfn/cfn-schedule/config"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/data"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/pkg/request"
"github.com/google/uuid"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"gorm.io/plugin/soft_delete"
"strings"
"time"
)
type BaseIdModel struct {
Handler ResultHandler `gorm:"-" json:"-"`
Id string `gorm:"column:id;not null;primarykey" json:"id"`
}
type ResultHandler interface {
FindResult(*gorm.DB) (interface{}, error)
}
func (b *BaseIdModel) Create(t schema.Tabler) (int64, error) {
b.GenerateId()
tx := DB().Table(t.TableName()).Create(t)
if tx.Error != nil {
return 0, tx.Error
}
return tx.RowsAffected, nil
}
func (b *BaseIdModel) Update(t schema.Tabler, column []string) (int64, error) {
if b.Id == "" {
return 0, errors.New("id cannot be null")
}
db := DB().Table(t.TableName())
if column != nil && len(column) > 0 {
db = db.Select(column)
}
tx := db.Updates(t)
return tx.RowsAffected, tx.Error
}
func (b *BaseIdModel) GetById(t schema.Tabler) error {
if b.Id == "" {
return errors.New("id cannot be null")
}
tx := DB().Table(t.TableName()).Take(t)
return tx.Error
}
func (b *BaseIdModel) Delete(t schema.Tabler) (int64, error) {
if b.Id == "" {
return 0, errors.New("id cannot be null")
}
tx := DB().Table(t.TableName()).Delete(t)
return tx.RowsAffected, tx.Error
}
func (b *BaseIdModel) GetAll(t schema.Tabler, fields map[string]interface{}, notFields map[string]interface{}) (interface{}, error) {
query := DB().Table(t.TableName())
if fields != nil {
for key := range fields {
value := fields[key]
switch value.(type) {
case []string, []int, []int64, []interface{}:
query = query.Where(key+" in (?)", value)
default:
query = query.Where(key+" = ?", value)
}
}
}
if notFields != nil {
for key := range notFields {
value := notFields[key]
if items, ok := value.([]interface{}); ok {
if len(items) > 0 {
query = query.Where(key+" not in (?)", items)
} else {
query = query.Where(key+" <> ?", items[0])
}
} else {
query = query.Where(key+" <> ?", value)
}
}
//query = query.Where(fields)
}
return b.Handler.FindResult(query)
}
// IN db.Where("name in (?)", []string{"jinzhu", "jinzhu 2"}).Find(&users)
func (b *BaseIdModel) Page(t schema.Tabler, page *PageConfig, fields map[string]interface{}) (interface{}, error) {
query := DB()
if fields != nil {
//query = query.Where(fields)
for key := range fields {
value := fields[key]
switch value.(type) {
case []string, []int, []int64, []interface{}:
query = query.Where(key+" in (?)", value)
default:
query = query.Where(key+" = ?", value)
}
}
}
return b.Handler.FindResult(page.SelectPages(t, query))
}
func (b *BaseIdModel) GenerateId() {
if b.Id == "" {
id, _ := uuid.NewUUID()
b.Id = strings.ReplaceAll(id.String(), "-", "")
}
}
type BaseDbModel struct {
BaseIdModel
CreateTimeMillis int64 `gorm:"column:create_time_millis" json:"createTimeMillis"` //type:timestamptz comment:数据创建时间 version:2024-02-12 14:22
ModifyTimeMillis int64 `gorm:"column:modify_time_millis" json:"modifyTimeMillis"` //type:timestamptz comment:数据修改时间 version:2024-02-12 14:22
}
func (b *BaseDbModel) Create(t schema.Tabler) (int64, error) {
b.GenerateTime()
return b.BaseIdModel.Create(t)
}
func (b *BaseDbModel) Update(t schema.Tabler, column []string) (int64, error) {
b.GenerateModifyTime()
return b.BaseIdModel.Update(t, column)
}
func (b *BaseDbModel) GenerateTime() {
t := time.Now().UnixMilli()
b.CreateTimeMillis = t
b.ModifyTimeMillis = t
}
func (b *BaseDbModel) GenerateModifyTime() {
b.ModifyTimeMillis = time.Now().UnixMilli()
}
type BaseUserModifyDbModel struct {
BaseDbModel
CreateUser string `gorm:"column:create_user" json:"createUser"`
ModifyUser string `gorm:"column:modify_user" json:"modifyUser"`
}
func (b *BaseUserModifyDbModel) SetUserName(userName string) {
b.CreateUser = userName
b.ModifyUser = userName
}
func (b *BaseUserModifyDbModel) SetModifyUserName(userName string) {
b.ModifyUser = userName
}
type BaseWorkspaceModel struct {
BaseUserModifyDbModel
WorkspaceId string `gorm:"column:workspace_id" json:"workspaceId"`
}
func (b *BaseWorkspaceModel) CountByWorkspaceId(t schema.Tabler) (int64, error) {
if b.WorkspaceId == "" {
return 0, errors.New("id cannot be null")
}
var count int64
tx := DB().Table(t.TableName()).Where("workspace_id = ?", b.WorkspaceId).Count(&count)
return count, tx.Error
}
func (b *BaseWorkspaceModel) Global() bool {
return strings.EqualFold(b.WorkspaceId, "GLOBAL")
}
type BaseNodeModel struct {
BaseWorkspaceModel
NodeId string `gorm:"column:node_id" json:"nodeId"`
NodeName string `gorm:"column:node_name" json:"nodeName"`
WorkspaceName string `gorm:"column:workspace_name" json:"workspaceName"`
}
type BaseGroupModel struct {
BaseWorkspaceModel
Group string `gorm:"column:group" json:"group"`
}
type BaseMachineModel struct {
BaseGroupModel
MachineId string `gorm:"column:machine_id" json:"machineId"`
}
type BaseModel struct {
ID string `gorm:"column:id;not null;primarykey" json:"id"`
CreateTime time.Time `gorm:"column:create_time;type:timestamp;<-:create" json:"createTime"`
UpdateTime time.Time `gorm:"column:update_time;type:timestamp" json:"updateTime"`
CreatorID string `gorm:"column:creator_id;type:varchar(64);not null;<-:create" json:"creatorID"`
Modifier string `gorm:"column:modifier;type:varchar(64);not null;" json:"modifier"`
}
func (model *BaseModel) DB() *gorm.DB {
return DB()
}
type ContainsDeleteBaseModel struct {
BaseModel
DeletedAt soft_delete.DeletedAt `gorm:"column:deleted_at;type:int(11) unsigned;not null;default:0;index" json:"-"`
}
func DB() *gorm.DB {
if c.Config.DatabaseConfig.Type == "sqlite" {
return data.SqliteDB
} else {
return data.PostgreSqlDB["data"]
}
}
//func DBAuth() *gorm.DB {
// return data.PostgreSqlDB["auth"]
//}
type Page[T any] struct {
CurrentPage int64 `json:"currentPage"`
PageSize int64 `json:"pageSize"`
Total int64 `json:"total"`
Pages int64 `json:"pages"`
Order string `json:"order"` //db.Order("name DESC")
Data []T `json:"data"`
}
func (page *Page[T]) SelectPages(query *gorm.DB) (e error) {
var model T
query.Model(&model).Count(&page.Total)
if page.Total == 0 {
page.Data = []T{}
return
}
e = query.Model(&model).Scopes(Paginate(page)).Find(&page.Data).Error
return
}
func (page *Page[T]) ScanPages(query *gorm.DB) (e error) {
var model T
query.Model(&model).Count(&page.Total)
if page.Total == 0 {
page.Data = []T{}
return
}
e = query.Model(&model).Scopes(Paginate(page)).Scan(&page.Data).Error
return
}
func Paginate[T any](page *Page[T]) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
if page.CurrentPage <= 0 {
page.CurrentPage = 1
}
switch {
case page.PageSize > 1000:
page.PageSize = 1000 // 限制一下分页大小
case page.PageSize <= 0:
page.PageSize = 10
}
page.Pages = page.Total / page.PageSize
if page.Total%page.PageSize != 0 {
page.Pages++
}
size := page.PageSize
offset := int((page.CurrentPage - 1) * size)
return db.Order(page.Order).Offset(offset).Limit(int(size))
}
}
func (page *Page[T]) Covert(pageInfo *request.PageInfo) {
if pageInfo.CurrentPage <= 0 {
pageInfo.CurrentPage = 1
}
switch {
case pageInfo.PageSize > 1000:
pageInfo.PageSize = 1000 // 限制一下分页大小
case pageInfo.PageSize <= 0:
pageInfo.PageSize = 10
}
page.CurrentPage = pageInfo.CurrentPage
page.PageSize = pageInfo.PageSize
page.Order = pageInfo.Order
}
// PageConfig 需要配套实现FindResultData需要回填。推荐使用Page[T any]
type PageConfig struct {
CurrentPage int64 `json:"currentPage"`
PageSize int64 `json:"pageSize"`
Total int64 `json:"total"`
Pages int64 `json:"pages"`
Order string `json:"order"` //db.Order("name DESC")
Data any `json:"data"` // 需要回填,不好用
}
func (page *PageConfig) SelectPages(t schema.Tabler, query *gorm.DB) *gorm.DB {
query.Table(t.TableName()).Count(&page.Total)
if page.Total == 0 {
return nil
}
return query.Table(t.TableName()).Scopes(PaginateConfig(page))
}
func PaginateConfig(page *PageConfig) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
if page.CurrentPage <= 0 {
page.CurrentPage = 1
}
switch {
case page.PageSize > 1000:
page.PageSize = 1000 // 限制一下分页大小
case page.PageSize <= 0:
page.PageSize = 10
}
page.Pages = page.Total / page.PageSize
if page.Total%page.PageSize != 0 {
page.Pages++
}
size := page.PageSize
offset := int((page.CurrentPage - 1) * size)
return db.Order(page.Order).Offset(offset).Limit(int(size))
}
}
func (page *PageConfig) Covert(pageInfo *request.PageInfo) {
if pageInfo.CurrentPage <= 0 {
pageInfo.CurrentPage = 1
}
switch {
case pageInfo.PageSize > 1000:
pageInfo.PageSize = 1000 // 限制一下分页大小
case pageInfo.PageSize <= 0:
pageInfo.PageSize = 10
}
page.CurrentPage = pageInfo.CurrentPage
page.PageSize = pageInfo.PageSize
page.Order = pageInfo.Order
}