// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.

package query

import (
	"context"

	"gorm.io/gorm"
	"gorm.io/gorm/clause"
	"gorm.io/gorm/schema"

	"gorm.io/gen"
	"gorm.io/gen/field"

	"gorm.io/plugin/dbresolver"

	"wechat-api/database/dao/wechat/model"
)

func newBatchMsg(db *gorm.DB, opts ...gen.DOOption) batchMsg {
	_batchMsg := batchMsg{}

	_batchMsg.batchMsgDo.UseDB(db, opts...)
	_batchMsg.batchMsgDo.UseModel(&model.BatchMsg{})

	tableName := _batchMsg.batchMsgDo.TableName()
	_batchMsg.ALL = field.NewAsterisk(tableName)
	_batchMsg.ID = field.NewInt64(tableName, "id")
	_batchMsg.CreatedAt = field.NewTime(tableName, "created_at")
	_batchMsg.UpdatedAt = field.NewTime(tableName, "updated_at")
	_batchMsg.DeletedAt = field.NewField(tableName, "deleted_at")
	_batchMsg.TaskName = field.NewString(tableName, "task_name")
	_batchMsg.Status = field.NewInt64(tableName, "status")
	_batchMsg.BatchNo = field.NewString(tableName, "batch_no")
	_batchMsg.Fromwxid = field.NewString(tableName, "fromwxid")
	_batchMsg.Msg = field.NewString(tableName, "msg")
	_batchMsg.Tagids = field.NewString(tableName, "tagids")
	_batchMsg.Tag = field.NewString(tableName, "tag")
	_batchMsg.Total = field.NewInt64(tableName, "total")
	_batchMsg.Success = field.NewInt64(tableName, "success")
	_batchMsg.Fail = field.NewInt64(tableName, "fail")
	_batchMsg.StartTime = field.NewTime(tableName, "start_time")
	_batchMsg.StopTime = field.NewTime(tableName, "stop_time")
	_batchMsg.SendTime = field.NewTime(tableName, "send_time")
	_batchMsg.Type = field.NewInt64(tableName, "type")
	_batchMsg.OrganizationID = field.NewInt64(tableName, "organization_id")
	_batchMsg.Ctype = field.NewInt64(tableName, "ctype")
	_batchMsg.Cc = field.NewString(tableName, "cc")
	_batchMsg.Phone = field.NewString(tableName, "phone")
	_batchMsg.TemplateName = field.NewString(tableName, "template_name")
	_batchMsg.TemplateCode = field.NewString(tableName, "template_code")
	_batchMsg.Lang = field.NewString(tableName, "lang")

	_batchMsg.fillFieldMap()

	return _batchMsg
}

// batchMsg 批量消息表
type batchMsg struct {
	batchMsgDo

	ALL            field.Asterisk
	ID             field.Int64
	CreatedAt      field.Time   // Create Time | 创建日期
	UpdatedAt      field.Time   // Update Time | 修改日期
	DeletedAt      field.Field  // Delete Time | 删除日期
	TaskName       field.String // 群发任务名称
	Status         field.Int64  // 状态 0 未开始 1 发送中 2 发送完成 3 发送中止
	BatchNo        field.String // 批次号
	Fromwxid       field.String // 发送方微信ID
	Msg            field.String // 内容
	Tagids         field.String // 需要发送的tagids
	Tag            field.String // 发送规则 all 全部 tag1,tag2 按tag发送
	Total          field.Int64  // 总数
	Success        field.Int64  // 成功数量
	Fail           field.Int64  // 失败数量
	StartTime      field.Time   // 开始时间
	StopTime       field.Time   // 结束时间
	SendTime       field.Time   // 发送时间
	Type           field.Int64  // 1-群发消息 2-群发朋友圈
	OrganizationID field.Int64  // 机构ID
	Ctype          field.Int64  // 内容类型：1-微信 2-whatsapp 3-企微
	Cc             field.String // 国家区号
	Phone          field.String // 手机号
	TemplateName   field.String // 模板名
	TemplateCode   field.String // 模板code
	Lang           field.String // 模板语言

	fieldMap map[string]field.Expr
}

func (b batchMsg) Table(newTableName string) *batchMsg {
	b.batchMsgDo.UseTable(newTableName)
	return b.updateTableName(newTableName)
}

func (b batchMsg) As(alias string) *batchMsg {
	b.batchMsgDo.DO = *(b.batchMsgDo.As(alias).(*gen.DO))
	return b.updateTableName(alias)
}

func (b *batchMsg) updateTableName(table string) *batchMsg {
	b.ALL = field.NewAsterisk(table)
	b.ID = field.NewInt64(table, "id")
	b.CreatedAt = field.NewTime(table, "created_at")
	b.UpdatedAt = field.NewTime(table, "updated_at")
	b.DeletedAt = field.NewField(table, "deleted_at")
	b.TaskName = field.NewString(table, "task_name")
	b.Status = field.NewInt64(table, "status")
	b.BatchNo = field.NewString(table, "batch_no")
	b.Fromwxid = field.NewString(table, "fromwxid")
	b.Msg = field.NewString(table, "msg")
	b.Tagids = field.NewString(table, "tagids")
	b.Tag = field.NewString(table, "tag")
	b.Total = field.NewInt64(table, "total")
	b.Success = field.NewInt64(table, "success")
	b.Fail = field.NewInt64(table, "fail")
	b.StartTime = field.NewTime(table, "start_time")
	b.StopTime = field.NewTime(table, "stop_time")
	b.SendTime = field.NewTime(table, "send_time")
	b.Type = field.NewInt64(table, "type")
	b.OrganizationID = field.NewInt64(table, "organization_id")
	b.Ctype = field.NewInt64(table, "ctype")
	b.Cc = field.NewString(table, "cc")
	b.Phone = field.NewString(table, "phone")
	b.TemplateName = field.NewString(table, "template_name")
	b.TemplateCode = field.NewString(table, "template_code")
	b.Lang = field.NewString(table, "lang")

	b.fillFieldMap()

	return b
}

func (b *batchMsg) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
	_f, ok := b.fieldMap[fieldName]
	if !ok || _f == nil {
		return nil, false
	}
	_oe, ok := _f.(field.OrderExpr)
	return _oe, ok
}

func (b *batchMsg) fillFieldMap() {
	b.fieldMap = make(map[string]field.Expr, 25)
	b.fieldMap["id"] = b.ID
	b.fieldMap["created_at"] = b.CreatedAt
	b.fieldMap["updated_at"] = b.UpdatedAt
	b.fieldMap["deleted_at"] = b.DeletedAt
	b.fieldMap["task_name"] = b.TaskName
	b.fieldMap["status"] = b.Status
	b.fieldMap["batch_no"] = b.BatchNo
	b.fieldMap["fromwxid"] = b.Fromwxid
	b.fieldMap["msg"] = b.Msg
	b.fieldMap["tagids"] = b.Tagids
	b.fieldMap["tag"] = b.Tag
	b.fieldMap["total"] = b.Total
	b.fieldMap["success"] = b.Success
	b.fieldMap["fail"] = b.Fail
	b.fieldMap["start_time"] = b.StartTime
	b.fieldMap["stop_time"] = b.StopTime
	b.fieldMap["send_time"] = b.SendTime
	b.fieldMap["type"] = b.Type
	b.fieldMap["organization_id"] = b.OrganizationID
	b.fieldMap["ctype"] = b.Ctype
	b.fieldMap["cc"] = b.Cc
	b.fieldMap["phone"] = b.Phone
	b.fieldMap["template_name"] = b.TemplateName
	b.fieldMap["template_code"] = b.TemplateCode
	b.fieldMap["lang"] = b.Lang
}

func (b batchMsg) clone(db *gorm.DB) batchMsg {
	b.batchMsgDo.ReplaceConnPool(db.Statement.ConnPool)
	return b
}

func (b batchMsg) replaceDB(db *gorm.DB) batchMsg {
	b.batchMsgDo.ReplaceDB(db)
	return b
}

type batchMsgDo struct{ gen.DO }

type IBatchMsgDo interface {
	gen.SubQuery
	Debug() IBatchMsgDo
	WithContext(ctx context.Context) IBatchMsgDo
	WithResult(fc func(tx gen.Dao)) gen.ResultInfo
	ReplaceDB(db *gorm.DB)
	ReadDB() IBatchMsgDo
	WriteDB() IBatchMsgDo
	As(alias string) gen.Dao
	Session(config *gorm.Session) IBatchMsgDo
	Columns(cols ...field.Expr) gen.Columns
	Clauses(conds ...clause.Expression) IBatchMsgDo
	Not(conds ...gen.Condition) IBatchMsgDo
	Or(conds ...gen.Condition) IBatchMsgDo
	Select(conds ...field.Expr) IBatchMsgDo
	Where(conds ...gen.Condition) IBatchMsgDo
	Order(conds ...field.Expr) IBatchMsgDo
	Distinct(cols ...field.Expr) IBatchMsgDo
	Omit(cols ...field.Expr) IBatchMsgDo
	Join(table schema.Tabler, on ...field.Expr) IBatchMsgDo
	LeftJoin(table schema.Tabler, on ...field.Expr) IBatchMsgDo
	RightJoin(table schema.Tabler, on ...field.Expr) IBatchMsgDo
	Group(cols ...field.Expr) IBatchMsgDo
	Having(conds ...gen.Condition) IBatchMsgDo
	Limit(limit int) IBatchMsgDo
	Offset(offset int) IBatchMsgDo
	Count() (count int64, err error)
	Scopes(funcs ...func(gen.Dao) gen.Dao) IBatchMsgDo
	Unscoped() IBatchMsgDo
	Create(values ...*model.BatchMsg) error
	CreateInBatches(values []*model.BatchMsg, batchSize int) error
	Save(values ...*model.BatchMsg) error
	First() (*model.BatchMsg, error)
	Take() (*model.BatchMsg, error)
	Last() (*model.BatchMsg, error)
	Find() ([]*model.BatchMsg, error)
	FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.BatchMsg, err error)
	FindInBatches(result *[]*model.BatchMsg, batchSize int, fc func(tx gen.Dao, batch int) error) error
	Pluck(column field.Expr, dest interface{}) error
	Delete(...*model.BatchMsg) (info gen.ResultInfo, err error)
	Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
	UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
	Updates(value interface{}) (info gen.ResultInfo, err error)
	UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
	UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
	UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
	UpdateFrom(q gen.SubQuery) gen.Dao
	Attrs(attrs ...field.AssignExpr) IBatchMsgDo
	Assign(attrs ...field.AssignExpr) IBatchMsgDo
	Joins(fields ...field.RelationField) IBatchMsgDo
	Preload(fields ...field.RelationField) IBatchMsgDo
	FirstOrInit() (*model.BatchMsg, error)
	FirstOrCreate() (*model.BatchMsg, error)
	FindByPage(offset int, limit int) (result []*model.BatchMsg, count int64, err error)
	ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
	Scan(result interface{}) (err error)
	Returning(value interface{}, columns ...string) IBatchMsgDo
	UnderlyingDB() *gorm.DB
	schema.Tabler
}

func (b batchMsgDo) Debug() IBatchMsgDo {
	return b.withDO(b.DO.Debug())
}

func (b batchMsgDo) WithContext(ctx context.Context) IBatchMsgDo {
	return b.withDO(b.DO.WithContext(ctx))
}

func (b batchMsgDo) ReadDB() IBatchMsgDo {
	return b.Clauses(dbresolver.Read)
}

func (b batchMsgDo) WriteDB() IBatchMsgDo {
	return b.Clauses(dbresolver.Write)
}

func (b batchMsgDo) Session(config *gorm.Session) IBatchMsgDo {
	return b.withDO(b.DO.Session(config))
}

func (b batchMsgDo) Clauses(conds ...clause.Expression) IBatchMsgDo {
	return b.withDO(b.DO.Clauses(conds...))
}

func (b batchMsgDo) Returning(value interface{}, columns ...string) IBatchMsgDo {
	return b.withDO(b.DO.Returning(value, columns...))
}

func (b batchMsgDo) Not(conds ...gen.Condition) IBatchMsgDo {
	return b.withDO(b.DO.Not(conds...))
}

func (b batchMsgDo) Or(conds ...gen.Condition) IBatchMsgDo {
	return b.withDO(b.DO.Or(conds...))
}

func (b batchMsgDo) Select(conds ...field.Expr) IBatchMsgDo {
	return b.withDO(b.DO.Select(conds...))
}

func (b batchMsgDo) Where(conds ...gen.Condition) IBatchMsgDo {
	return b.withDO(b.DO.Where(conds...))
}

func (b batchMsgDo) Order(conds ...field.Expr) IBatchMsgDo {
	return b.withDO(b.DO.Order(conds...))
}

func (b batchMsgDo) Distinct(cols ...field.Expr) IBatchMsgDo {
	return b.withDO(b.DO.Distinct(cols...))
}

func (b batchMsgDo) Omit(cols ...field.Expr) IBatchMsgDo {
	return b.withDO(b.DO.Omit(cols...))
}

func (b batchMsgDo) Join(table schema.Tabler, on ...field.Expr) IBatchMsgDo {
	return b.withDO(b.DO.Join(table, on...))
}

func (b batchMsgDo) LeftJoin(table schema.Tabler, on ...field.Expr) IBatchMsgDo {
	return b.withDO(b.DO.LeftJoin(table, on...))
}

func (b batchMsgDo) RightJoin(table schema.Tabler, on ...field.Expr) IBatchMsgDo {
	return b.withDO(b.DO.RightJoin(table, on...))
}

func (b batchMsgDo) Group(cols ...field.Expr) IBatchMsgDo {
	return b.withDO(b.DO.Group(cols...))
}

func (b batchMsgDo) Having(conds ...gen.Condition) IBatchMsgDo {
	return b.withDO(b.DO.Having(conds...))
}

func (b batchMsgDo) Limit(limit int) IBatchMsgDo {
	return b.withDO(b.DO.Limit(limit))
}

func (b batchMsgDo) Offset(offset int) IBatchMsgDo {
	return b.withDO(b.DO.Offset(offset))
}

func (b batchMsgDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IBatchMsgDo {
	return b.withDO(b.DO.Scopes(funcs...))
}

func (b batchMsgDo) Unscoped() IBatchMsgDo {
	return b.withDO(b.DO.Unscoped())
}

func (b batchMsgDo) Create(values ...*model.BatchMsg) error {
	if len(values) == 0 {
		return nil
	}
	return b.DO.Create(values)
}

func (b batchMsgDo) CreateInBatches(values []*model.BatchMsg, batchSize int) error {
	return b.DO.CreateInBatches(values, batchSize)
}

// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (b batchMsgDo) Save(values ...*model.BatchMsg) error {
	if len(values) == 0 {
		return nil
	}
	return b.DO.Save(values)
}

func (b batchMsgDo) First() (*model.BatchMsg, error) {
	if result, err := b.DO.First(); err != nil {
		return nil, err
	} else {
		return result.(*model.BatchMsg), nil
	}
}

func (b batchMsgDo) Take() (*model.BatchMsg, error) {
	if result, err := b.DO.Take(); err != nil {
		return nil, err
	} else {
		return result.(*model.BatchMsg), nil
	}
}

func (b batchMsgDo) Last() (*model.BatchMsg, error) {
	if result, err := b.DO.Last(); err != nil {
		return nil, err
	} else {
		return result.(*model.BatchMsg), nil
	}
}

func (b batchMsgDo) Find() ([]*model.BatchMsg, error) {
	result, err := b.DO.Find()
	return result.([]*model.BatchMsg), err
}

func (b batchMsgDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*model.BatchMsg, err error) {
	buf := make([]*model.BatchMsg, 0, batchSize)
	err = b.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
		defer func() { results = append(results, buf...) }()
		return fc(tx, batch)
	})
	return results, err
}

func (b batchMsgDo) FindInBatches(result *[]*model.BatchMsg, batchSize int, fc func(tx gen.Dao, batch int) error) error {
	return b.DO.FindInBatches(result, batchSize, fc)
}

func (b batchMsgDo) Attrs(attrs ...field.AssignExpr) IBatchMsgDo {
	return b.withDO(b.DO.Attrs(attrs...))
}

func (b batchMsgDo) Assign(attrs ...field.AssignExpr) IBatchMsgDo {
	return b.withDO(b.DO.Assign(attrs...))
}

func (b batchMsgDo) Joins(fields ...field.RelationField) IBatchMsgDo {
	for _, _f := range fields {
		b = *b.withDO(b.DO.Joins(_f))
	}
	return &b
}

func (b batchMsgDo) Preload(fields ...field.RelationField) IBatchMsgDo {
	for _, _f := range fields {
		b = *b.withDO(b.DO.Preload(_f))
	}
	return &b
}

func (b batchMsgDo) FirstOrInit() (*model.BatchMsg, error) {
	if result, err := b.DO.FirstOrInit(); err != nil {
		return nil, err
	} else {
		return result.(*model.BatchMsg), nil
	}
}

func (b batchMsgDo) FirstOrCreate() (*model.BatchMsg, error) {
	if result, err := b.DO.FirstOrCreate(); err != nil {
		return nil, err
	} else {
		return result.(*model.BatchMsg), nil
	}
}

func (b batchMsgDo) FindByPage(offset int, limit int) (result []*model.BatchMsg, count int64, err error) {
	result, err = b.Offset(offset).Limit(limit).Find()
	if err != nil {
		return
	}

	if size := len(result); 0 < limit && 0 < size && size < limit {
		count = int64(size + offset)
		return
	}

	count, err = b.Offset(-1).Limit(-1).Count()
	return
}

func (b batchMsgDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
	count, err = b.Count()
	if err != nil {
		return
	}

	err = b.Offset(offset).Limit(limit).Scan(result)
	return
}

func (b batchMsgDo) Scan(result interface{}) (err error) {
	return b.DO.Scan(result)
}

func (b batchMsgDo) Delete(models ...*model.BatchMsg) (result gen.ResultInfo, err error) {
	return b.DO.Delete(models)
}

func (b *batchMsgDo) withDO(do gen.Dao) *batchMsgDo {
	b.DO = *do.(*gen.DO)
	return b
}
