Files

465 lines
12 KiB
Go
Raw Normal View History

2021-09-28 11:47:19 +08:00
package model
import (
"SciencesServer/serve/orm"
2021-10-09 11:55:54 +08:00
"SciencesServer/utils"
2021-09-28 11:47:19 +08:00
"fmt"
"strings"
"time"
"gorm.io/gorm"
)
// IModel
type IModel interface {
2021-11-01 11:19:49 +08:00
SetID(uint64)
2021-09-28 11:47:19 +08:00
GetID() uint64
2021-10-09 11:55:54 +08:00
GetEncodeID() string
2021-09-28 11:47:19 +08:00
TableName() string
SetDatabase(database string, key ...string)
}
// Model
type Model struct {
2022-01-20 17:22:05 +08:00
ID uint64 `gorm:"column:id;primaryKey;autoIncrement;comment:主键" json:"-" form:"id"` // 主键
2021-09-28 11:47:19 +08:00
Database string `json:"-" gorm:"-"`
}
// ModelTenant
type ModelTenant struct {
TenantID uint64 `gorm:"column:tenant_id;index:idx_sys_tenant_id;type:int(11);default:0;comment:租户ID" json:"-"`
}
// ModelDeleted
type ModelDeleted struct {
IsDeleted DeleteStatus `gorm:"column:is_deleted;type:tinyint(1);default:0;comment:删除状态(0未删除1已删除)" json:"-" form:"is_deleted"`
}
// ModelAt
type ModelAt struct {
CreatedAt time.Time `gorm:"column:created_at;type:datetime;not null;comment:创建时间" json:"created_at" form:"created_at"`
UpdatedAt time.Time `gorm:"column:updated_at;type:datetime;not null;comment:更新时间" json:"updated_at" form:"updated_at"`
}
// DeleteStatus 删除状态
type DeleteStatus int
const (
// DeleteStatusForNot 未删除
DeleteStatusForNot DeleteStatus = iota
// DeleteStatusForAlready 已删除
DeleteStatusForAlready
)
const (
// FieldsForID 主键ID
FieldsForID string = "id"
// FieldsForUpdatedAt 更新时间
FieldsForUpdatedAt string = "updated_at"
// FieldsForDeleted 删除字段名
FieldsForDeleted string = "is_deleted"
)
const (
SubDatabase string = "tenant"
)
2021-11-01 11:19:49 +08:00
func (m *Model) SetID(id uint64) {
m.ID = id
}
2021-09-28 11:47:19 +08:00
func (m *Model) GetID() uint64 {
return m.ID
}
2021-10-09 11:55:54 +08:00
func (m *Model) GetEncodeID() string {
2022-01-06 17:11:57 +08:00
if m.ID <= 0 {
return ""
}
2021-10-09 11:55:54 +08:00
return utils.HASHIDEncode(int(m.ID))
}
2022-01-11 14:54:20 +08:00
func (m *ModelTenant) GetEncodeTenantID() string {
if m.TenantID <= 0 {
return ""
}
return utils.HASHIDEncode(int(m.TenantID))
}
2021-09-28 11:47:19 +08:00
func (m *Model) SetDatabase(database string, key ...string) {
m.Database = database + "_" + strings.Join(key, "_")
}
func (m *Model) NewTableName(tableName string) string {
if m.Database == "" {
return tableName
}
return m.Database + "." + tableName
}
func (m *ModelAt) BeforeCreate(db *gorm.DB) error {
m.CreatedAt = time.Now()
return nil
}
func (m *ModelAt) BeforeUpdate(db *gorm.DB) error {
m.UpdatedAt = time.Now()
return nil
}
func (m *ModelDeleted) IsDelete() bool {
return m.IsDeleted == DeleteStatusForAlready
}
func Create(model IModel, session ...*gorm.DB) error {
if len(session) > 0 {
return session[0].Table(model.TableName()).Create(model).Error
}
return orm.GetDB().Table(model.TableName()).Create(model).Error
}
func Creates(model IModel, objs interface{}, session ...*gorm.DB) error {
if len(session) > 0 {
return session[0].Table(model.TableName()).Create(objs).Error
}
return orm.GetDB().Table(model.TableName()).Create(objs).Error
}
func Save(model IModel, session ...*gorm.DB) error {
if len(session) > 0 {
return session[0].Table(model.TableName()).Save(model).Error
}
return orm.GetDB().Table(model.TableName()).Save(model).Error
}
func Updates(model IModel, value interface{}, session ...*gorm.DB) error {
if len(session) > 0 {
return session[0].Table(model.TableName()).Where(fmt.Sprintf("%s = %d", FieldsForID, model.GetID())).Updates(value).Error
}
return orm.GetDB().Table(model.TableName()).Where(fmt.Sprintf("%s = %d", FieldsForID, model.GetID())).Updates(value).Error
}
func UpdatesWhere(model IModel, value interface{}, where []*ModelWhere, session ...*gorm.DB) error {
db := orm.GetDB()
if len(session) > 0 {
db = session[0]
}
db = db.Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
}
return db.Updates(value).Error
}
func Delete(model IModel, session ...*gorm.DB) error {
db := orm.GetDB()
if len(session) > 0 {
db = session[0]
}
db = db.Table(model.TableName()).Where(fmt.Sprintf("%s = %d", FieldsForID, model.GetID()))
if db.Migrator().HasColumn(model, FieldsForDeleted) {
return db.Updates(map[string]interface{}{FieldsForDeleted: DeleteStatusForAlready, FieldsForUpdatedAt: time.Now()}).Error
}
return db.Delete(model).Error
}
func DeleteWhere(model IModel, where []*ModelWhere, session ...*gorm.DB) error {
db := orm.GetDB()
if len(session) > 0 {
db = session[0]
}
db = db.Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
return db.Updates(map[string]interface{}{FieldsForDeleted: DeleteStatusForAlready, FieldsForUpdatedAt: time.Now()}).Error
}
return db.Delete(model).Error
}
func Count(model IModel, count *int64, where ...*ModelWhere) error {
db := orm.GetDB().Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
return db.Count(count).Error
}
func First(model IModel) (bool, error) {
db := orm.GetDB().Table(model.TableName())
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
if err := db.First(model).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return false, nil
}
return false, err
}
return true, nil
}
func FirstWhere(model IModel, where ...*ModelWhere) (bool, error) {
db := orm.GetDB().Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
2022-01-14 17:09:06 +08:00
} else {
db = db.Where(fmt.Sprintf("%s = %d", FieldsForID, model.GetID()))
2021-09-28 11:47:19 +08:00
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
if err := db.First(model).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return false, nil
}
return false, err
}
return true, nil
}
2021-12-03 14:18:06 +08:00
func FirstField(model IModel, fields []string, where ...*ModelWhere) (bool, error) {
db := orm.GetDB().Table(model.TableName()).Select(fields)
2021-09-28 11:47:19 +08:00
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
2022-01-14 17:09:06 +08:00
} else {
db = db.Where(fmt.Sprintf("%s = %d", FieldsForID, model.GetID()))
2021-09-28 11:47:19 +08:00
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
2021-12-03 14:18:06 +08:00
if err := db.First(model).Error; err != nil {
2021-09-28 11:47:19 +08:00
if err == gorm.ErrRecordNotFound {
return false, nil
}
return false, err
}
return true, nil
}
func Last(model IModel) (bool, error) {
db := orm.GetDB().Table(model.TableName())
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
if err := db.Order("id " + OrderModeToDesc).First(model).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return false, nil
}
return false, err
}
return true, nil
}
2022-01-27 17:12:41 +08:00
func LastWhere(model IModel, fields []string, where ...*ModelWhere) (bool, error) {
2021-09-28 11:47:19 +08:00
db := orm.GetDB().Table(model.TableName())
2022-01-27 17:12:41 +08:00
if len(fields) > 0 {
db = db.Select(fields)
}
2021-09-28 11:47:19 +08:00
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
} else {
db = db.Where(fmt.Sprintf("%s = %d", FieldsForID, model.GetID()))
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
2022-01-27 17:12:41 +08:00
if err := db.Order(FieldsForID + " " + OrderModeToDesc).First(model).Error; err != nil {
2021-09-28 11:47:19 +08:00
if err == gorm.ErrRecordNotFound {
return false, nil
}
return false, err
}
return true, nil
}
func LastWhereOrder(model IModel, where ...*ModelWhereOrder) (bool, error) {
db := orm.GetDB().Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
if wo.Where != nil {
db = db.Where(wo.Where.Condition, wo.Where.Value)
}
if wo.Order != nil {
db = db.Order(fmt.Sprintf("%s %s", wo.Order.Field, wo.Order.Mode))
}
}
} else {
db = db.Where(fmt.Sprintf("%s = %d", FieldsForID, model.GetID()))
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
if err := db.Limit(1).First(model).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return false, nil
}
return false, err
}
return true, nil
}
func Find(model IModel, out interface{}, where ...*ModelWhereOrder) error {
db := orm.GetDB().Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
if wo.Where != nil {
db = db.Where(wo.Where.Condition, wo.Where.Value)
}
if wo.Order != nil {
db = db.Order(fmt.Sprintf("%s %s", wo.Order.Field, wo.Order.Mode))
}
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
return db.Find(out).Error
}
func Scan(model IModel, out interface{}, where ...*ModelWhereOrder) error {
db := orm.GetDB().Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
if wo.Where != nil {
db = db.Where(wo.Where.Condition, wo.Where.Value)
}
if wo.Order != nil {
db = db.Order(fmt.Sprintf("%s %s", wo.Order.Field, wo.Order.Mode))
}
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
return db.Scan(out).Error
}
func ScanFields(model IModel, out interface{}, fields []string, where ...*ModelWhereOrder) error {
db := orm.GetDB().Table(model.TableName()).Select(fields)
if len(where) > 0 {
for _, wo := range where {
if wo.Where != nil {
db = db.Where(wo.Where.Condition, wo.Where.Value)
}
if wo.Order != nil {
db = db.Order(fmt.Sprintf("%s %s", wo.Order.Field, wo.Order.Mode))
}
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
return db.Scan(out).Error
}
2021-11-26 17:26:01 +08:00
func ScanLimitFields(model IModel, out interface{}, fields []string, limit int, where ...*ModelWhereOrder) error {
db := orm.GetDB().Table(model.TableName()).Select(fields)
if len(where) > 0 {
for _, wo := range where {
if wo.Where != nil {
db = db.Where(wo.Where.Condition, wo.Where.Value)
}
if wo.Order != nil {
db = db.Order(fmt.Sprintf("%s %s", wo.Order.Field, wo.Order.Mode))
}
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
return db.Offset(0).Limit(limit).Scan(out).Error
}
2021-09-28 11:47:19 +08:00
func Pluck(model IModel, field string, out interface{}, where ...*ModelWhere) error {
db := orm.GetDB().Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
db = db.Where(wo.Condition, wo.Value)
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
return db.Pluck(field, out).Error
}
func Pages(model IModel, out interface{}, page, pageSize int, count *int64, where ...*ModelWhereOrder) error {
db := orm.GetDB().Table(model.TableName())
if len(where) > 0 {
for _, wo := range where {
if wo.Where != nil {
db = db.Where(wo.Where.Condition, wo.Where.Value)
}
if wo.Order != nil {
db = db.Order(fmt.Sprintf("%s %s", wo.Order.Field, wo.Order.Mode))
}
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
if err := db.Count(count).Error; err != nil {
return err
}
return db.Offset((page - 1) * pageSize).Limit(pageSize).Scan(out).Error
}
func PagesFields(model IModel, out interface{}, fields []string, page, pageSize int, count *int64, where ...*ModelWhereOrder) error {
db := orm.GetDB().Table(model.TableName()).Select(fields)
if len(where) > 0 {
for _, wo := range where {
if wo.Where != nil {
db = db.Where(wo.Where.Condition, wo.Where.Value)
}
if wo.Order != nil {
db = db.Order(fmt.Sprintf("%s %s", wo.Order.Field, wo.Order.Mode))
}
}
}
if db.Migrator().HasColumn(model, FieldsForDeleted) {
db = db.Where(FieldsForDeleted, DeleteStatusForNot)
}
if err := db.Count(count).Error; err != nil {
return err
}
return db.Offset((page - 1) * pageSize).Limit(pageSize).Scan(out).Error
}