package repository import ( "context" "errors" "giter.top/smart/internal/system/entity" "gorm.io/gorm" ) // ErrNotFound 记录未找到 var ErrNotFound = errors.New("param not found") // ParamRepository 系统参数数据访问层 type ParamRepository interface { // Create 创建系统参数 Create(ctx context.Context, param *entity.SystemParam) error // Update 更新系统参数 Update(ctx context.Context, param *entity.SystemParam) error // Delete 删除系统参数 Delete(ctx context.Context, id string) error // DeleteBatch 批量删除 DeleteBatch(ctx context.Context, ids []string) error // GetByID 根据 ID 获取 GetByID(ctx context.Context, id string) (*entity.SystemParam, error) // GetByKey 根据键获取 GetByKey(ctx context.Context, key string) (*entity.SystemParam, error) // List 获取列表(支持分页和筛选) List(ctx context.Context, group string, paramKey string, page, pageSize int) ([]entity.SystemParam, int64, error) // GetAll 获取所有参数(用于缓存) GetAll(ctx context.Context) (map[string]entity.SystemParam, error) // ExistsByKey 检查键是否存在(排除指定 ID) ExistsByKey(ctx context.Context, key string, excludeID string) (bool, error) } type paramRepository struct { db *gorm.DB } // NewParamRepository 创建参数仓库实例 func NewParamRepository(db *gorm.DB) ParamRepository { return ¶mRepository{db: db} } func (r *paramRepository) Create(ctx context.Context, param *entity.SystemParam) error { return r.db.WithContext(ctx).Create(param).Error } func (r *paramRepository) Update(ctx context.Context, param *entity.SystemParam) error { return r.db.WithContext(ctx).Save(param).Error } func (r *paramRepository) Delete(ctx context.Context, id string) error { return r.db.WithContext(ctx).Where("id = ?", id).Delete(&entity.SystemParam{}).Error } func (r *paramRepository) DeleteBatch(ctx context.Context, ids []string) error { return r.db.WithContext(ctx).Where("id IN ?", ids).Delete(&entity.SystemParam{}).Error } func (r *paramRepository) GetByID(ctx context.Context, id string) (*entity.SystemParam, error) { var param entity.SystemParam err := r.db.WithContext(ctx).Where("id = ?", id).First(¶m).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrNotFound } return nil, err } return ¶m, nil } func (r *paramRepository) GetByKey(ctx context.Context, key string) (*entity.SystemParam, error) { var param entity.SystemParam err := r.db.WithContext(ctx).Where("param_key = ?", key).First(¶m).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, ErrNotFound } return nil, err } return ¶m, nil } func (r *paramRepository) List(ctx context.Context, group string, paramKey string, page, pageSize int) ([]entity.SystemParam, int64, error) { var params []entity.SystemParam var total int64 query := r.db.WithContext(ctx).Model(&entity.SystemParam{}) // 应用筛选条件 if group != "" { query = query.Where("param_group = ?", group) } if paramKey != "" { query = query.Where("param_key LIKE ?", "%"+paramKey+"%") } // 获取总数 if err := query.Count(&total).Error; err != nil { return nil, 0, err } // 分页查询 offset := (page - 1) * pageSize if offset < 0 { offset = 0 } if pageSize <= 0 { pageSize = 10 } err := query.Order("id DESC").Offset(offset).Limit(pageSize).Find(¶ms).Error if err != nil { return nil, 0, err } return params, total, nil } func (r *paramRepository) GetAll(ctx context.Context) (map[string]entity.SystemParam, error) { var params []entity.SystemParam err := r.db.WithContext(ctx).Find(¶ms).Error if err != nil { return nil, err } result := make(map[string]entity.SystemParam, len(params)) for _, param := range params { result[param.ParamKey] = param } return result, nil } func (r *paramRepository) ExistsByKey(ctx context.Context, key string, excludeID string) (bool, error) { query := r.db.WithContext(ctx).Where("param_key = ?", key) if excludeID != "" { query = query.Where("id != ?", excludeID) } var count int64 err := query.Model(&entity.SystemParam{}).Count(&count).Error return count > 0, err }