109 lines
2.5 KiB
Go
109 lines
2.5 KiB
Go
// Package common 公共组件
|
||
package common
|
||
|
||
import (
|
||
"reflect"
|
||
)
|
||
|
||
// BaseService 泛型 Service 基类,封装通用业务逻辑
|
||
type BaseService[T any] struct {
|
||
mapper *BaseMapper[T]
|
||
}
|
||
|
||
// NewBaseService 创建 BaseService 实例
|
||
func NewBaseService[T any]() *BaseService[T] {
|
||
return &BaseService[T]{
|
||
mapper: NewBaseMapper[T](),
|
||
}
|
||
}
|
||
|
||
// GetMapper 获取 Mapper 实例
|
||
func (s *BaseService[T]) GetMapper() *BaseMapper[T] {
|
||
return s.mapper
|
||
}
|
||
|
||
// List 分页查询
|
||
func (s *BaseService[T]) List(page, size int) ([]T, int64, error) {
|
||
return s.mapper.FindAll(page, size)
|
||
}
|
||
|
||
// GetByID 根据 ID 获取
|
||
func (s *BaseService[T]) GetByID(id string) (*T, error) {
|
||
return s.mapper.FindByID(id)
|
||
}
|
||
|
||
// Create 创建记录(自动生成 ID)
|
||
func (s *BaseService[T]) Create(item *T) error {
|
||
// 通过反射设置 ID 字段
|
||
if err := setID(item); err != nil {
|
||
return err
|
||
}
|
||
return s.mapper.Create(item)
|
||
}
|
||
|
||
// Update 更新记录
|
||
func (s *BaseService[T]) Update(item *T) error {
|
||
return s.mapper.Update(item)
|
||
}
|
||
|
||
// UpdateFields 更新指定字段
|
||
func (s *BaseService[T]) UpdateFields(id string, fields map[string]interface{}) error {
|
||
return s.mapper.UpdateFields(id, fields)
|
||
}
|
||
|
||
// Delete 删除记录
|
||
func (s *BaseService[T]) Delete(id string) error {
|
||
return s.mapper.Delete(id)
|
||
}
|
||
|
||
// BatchCreate 批量创建(自动生成 ID)
|
||
func (s *BaseService[T]) BatchCreate(items []T) error {
|
||
for i := range items {
|
||
if err := setID(&items[i]); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return s.mapper.BatchCreate(items, DefaultBatchSize)
|
||
}
|
||
|
||
// BatchUpdate 批量更新
|
||
func (s *BaseService[T]) BatchUpdate(items []T) error {
|
||
return s.mapper.BatchUpdate(items)
|
||
}
|
||
|
||
// BatchUpsert 批量插入或更新
|
||
func (s *BaseService[T]) BatchUpsert(items []T, updateColumns []string) error {
|
||
for i := range items {
|
||
if err := setID(&items[i]); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return s.mapper.BatchUpsert(items, updateColumns)
|
||
}
|
||
|
||
// BatchDelete 批量删除
|
||
func (s *BaseService[T]) BatchDelete(ids []string) error {
|
||
return s.mapper.BatchDelete(ids)
|
||
}
|
||
|
||
// setID 通过反射设置 ID 字段
|
||
func setID(item interface{}) error {
|
||
val := reflect.ValueOf(item).Elem()
|
||
|
||
// 如果当前类型是指针,再次解引用以获取实际的 Struct
|
||
if val.Kind() == reflect.Ptr {
|
||
val = val.Elem()
|
||
}
|
||
|
||
if val.Kind() == reflect.Struct {
|
||
idField := val.FieldByName("ID")
|
||
if idField.IsValid() && idField.Kind() == reflect.String {
|
||
// 如果 ID 为空,生成新 ID
|
||
if idField.String() == "" {
|
||
idField.SetString(GenerateStringID())
|
||
}
|
||
}
|
||
}
|
||
return nil
|
||
}
|