// 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 }