golang-yitisheng-server/server/common/base_service.go

101 lines
2.3 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 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()
if val.Kind() == reflect.Struct {
idField := val.FieldByName("ID")
if idField.IsValid() && idField.Kind() == reflect.String {
if idField.String() == "" {
idField.SetString(GenerateStringID())
}
}
}
return nil
}