{{- if .IsAdd}}
// 在 {{.StructName}}Repo 接口中新增如下方法
// 请根据实际需求添加

{{- else}}
package {{.Package}}

import (
{{- if not .OnlyTemplate }}
	"context"
	{{- if .IsTree }}
	"errors"
	{{- end }}
	"{{.Module}}/internal/data/model/{{.Package}}"
	{{- if not .IsTree}}
	{{.Package}}Req "{{.Module}}/internal/service/types/{{.Package}}/request"
	{{- end }}
	"github.com/go-kratos/kratos/v2/log"
	"gorm.io/gorm"
{{- end }}
)

// {{.StructName}}Repo {{.Description}}仓储接口
type {{.StructName}}Repo interface {
{{- if not .OnlyTemplate }}
	Create(ctx context.Context, {{.Abbreviation}} *{{.Package}}.{{.StructName}}) error
	Delete(ctx context.Context, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}{{- if .AutoCreateResource -}}, userID uint{{- end -}}) error
	DeleteByIds(ctx context.Context, {{.PrimaryField.FieldJson}}s []{{.PrimaryField.FieldType}}{{- if .AutoCreateResource -}}, deletedBy uint{{- end -}}) error
	{{- if .AutoCreateResource }}
	// DeleteWithTx 在事务中删除记录（用于 AutoCreateResource 场景）
	DeleteWithTx(ctx context.Context, tx *gorm.DB, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}) error
	// DeleteByIdsWithTx 在事务中批量删除记录（用于 AutoCreateResource 场景）
	DeleteByIdsWithTx(ctx context.Context, tx *gorm.DB, {{.PrimaryField.FieldJson}}s []{{.PrimaryField.FieldType}}) error
	{{- end }}
	Update(ctx context.Context, {{.Abbreviation}} *{{.Package}}.{{.StructName}}) error
	FindByID(ctx context.Context, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}) (*{{.Package}}.{{.StructName}}, error)
	{{- if .IsTree }}
	List(ctx context.Context) ([]*{{.Package}}.{{.StructName}}, error)
	HasChildren(ctx context.Context, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}) (bool, error)
	{{- else }}
	List(ctx context.Context, req *{{.Package}}Req.{{.StructName}}Search) ([]*{{.Package}}.{{.StructName}}, int64, error)
	{{- end }}
	{{- if .HasDataSource }}
	GetDataSource(ctx context.Context) (map[string][]map[string]any, error)
	{{- end }}
{{- end }}
{{- if .HasCustomMethods }}
{{ GenerateCustomMethodInterface .CustomMethods .StructName .Package }}
{{- end }}
}

// {{.StructName}}Usecase {{.Description}}用例
type {{.StructName}}Usecase struct {
	repo {{.StructName}}Repo
	log  *log.Helper
}

// New{{.StructName}}Usecase 创建{{.Description}}用例
func New{{.StructName}}Usecase(repo {{.StructName}}Repo, logger log.Logger) *{{.StructName}}Usecase {
	return &{{.StructName}}Usecase{
		repo: repo,
		log:  log.NewHelper(logger),
	}
}

{{- if not .OnlyTemplate }}

// Create 创建{{.Description}}
func (uc *{{.StructName}}Usecase) Create(ctx context.Context, {{.Abbreviation}} *{{.Package}}.{{.StructName}}) error {
	uc.log.WithContext(ctx).Infof("创建{{.Description}}")
	if err := uc.repo.Create(ctx, {{.Abbreviation}}); err != nil {
		uc.log.WithContext(ctx).Errorf("创建{{.Description}}失败: %v", err)
		return err
	}
	return nil
}

// Delete 删除{{.Description}}
func (uc *{{.StructName}}Usecase) Delete(ctx context.Context, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}{{- if .AutoCreateResource -}}, userID uint{{- end -}}) error {
	uc.log.WithContext(ctx).Infof("删除{{.Description}}, {{.PrimaryField.FieldJson}}: %v", {{.PrimaryField.FieldJson}})
	{{- if .IsTree }}
	// 检查是否有子节点
	hasChildren, err := uc.repo.HasChildren(ctx, {{.PrimaryField.FieldJson}})
	if err != nil {
		uc.log.WithContext(ctx).Errorf("检查子节点失败: %v", err)
		return err
	}
	if hasChildren {
		uc.log.WithContext(ctx).Warn("此节点存在子节点不允许删除")
		return errors.New("此节点存在子节点不允许删除")
	}
	{{- end }}
	if err := uc.repo.Delete(ctx, {{.PrimaryField.FieldJson}}{{- if .AutoCreateResource -}}, userID{{- end -}}); err != nil {
		uc.log.WithContext(ctx).Errorf("删除{{.Description}}失败: %v", err)
		return err
	}
	return nil
}

// DeleteByIds 批量删除{{.Description}}
func (uc *{{.StructName}}Usecase) DeleteByIds(ctx context.Context, {{.PrimaryField.FieldJson}}s []{{.PrimaryField.FieldType}}{{- if .AutoCreateResource -}}, deletedBy uint{{- end -}}) error {
	uc.log.WithContext(ctx).Infof("批量删除{{.Description}}, 数量: %d", len({{.PrimaryField.FieldJson}}s))
	if err := uc.repo.DeleteByIds(ctx, {{.PrimaryField.FieldJson}}s{{- if .AutoCreateResource -}}, deletedBy{{- end -}}); err != nil {
		uc.log.WithContext(ctx).Errorf("批量删除{{.Description}}失败: %v", err)
		return err
	}
	return nil
}

{{- if .AutoCreateResource }}
// DeleteWithTx 在事务中删除{{.Description}}（用于 AutoCreateResource 场景）
// @param ctx 上下文
// @param tx 事务对象
// @param {{.PrimaryField.FieldJson}} 主键ID
// @return error 删除失败时返回错误
func (uc *{{.StructName}}Usecase) DeleteWithTx(ctx context.Context, tx *gorm.DB, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}) error {
	uc.log.WithContext(ctx).Infof("事务删除{{.Description}}, {{.PrimaryField.FieldJson}}: %v", {{.PrimaryField.FieldJson}})
	{{- if .IsTree }}
	// 检查是否有子节点
	hasChildren, err := uc.repo.HasChildren(ctx, {{.PrimaryField.FieldJson}})
	if err != nil {
		uc.log.WithContext(ctx).Errorf("检查子节点失败: %v", err)
		return err
	}
	if hasChildren {
		uc.log.WithContext(ctx).Warn("此节点存在子节点不允许删除")
		return errors.New("此节点存在子节点不允许删除")
	}
	{{- end }}
	if err := uc.repo.DeleteWithTx(ctx, tx, {{.PrimaryField.FieldJson}}); err != nil {
		uc.log.WithContext(ctx).Errorf("事务删除{{.Description}}失败: %v", err)
		return err
	}
	return nil
}

// DeleteByIdsWithTx 在事务中批量删除{{.Description}}（用于 AutoCreateResource 场景）
// @param ctx 上下文
// @param tx 事务对象
// @param {{.PrimaryField.FieldJson}}s 主键ID列表
// @return error 删除失败时返回错误
func (uc *{{.StructName}}Usecase) DeleteByIdsWithTx(ctx context.Context, tx *gorm.DB, {{.PrimaryField.FieldJson}}s []{{.PrimaryField.FieldType}}) error {
	uc.log.WithContext(ctx).Infof("事务批量删除{{.Description}}, 数量: %d", len({{.PrimaryField.FieldJson}}s))
	if err := uc.repo.DeleteByIdsWithTx(ctx, tx, {{.PrimaryField.FieldJson}}s); err != nil {
		uc.log.WithContext(ctx).Errorf("事务批量删除{{.Description}}失败: %v", err)
		return err
	}
	return nil
}
{{- end }}

// Update 更新{{.Description}}
func (uc *{{.StructName}}Usecase) Update(ctx context.Context, {{.Abbreviation}} *{{.Package}}.{{.StructName}}) error {
	uc.log.WithContext(ctx).Infof("更新{{.Description}}")
	if err := uc.repo.Update(ctx, {{.Abbreviation}}); err != nil {
		uc.log.WithContext(ctx).Errorf("更新{{.Description}}失败: %v", err)
		return err
	}
	return nil
}

// FindByID 根据ID获取{{.Description}}
func (uc *{{.StructName}}Usecase) FindByID(ctx context.Context, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}) (*{{.Package}}.{{.StructName}}, error) {
	uc.log.WithContext(ctx).Debugf("查询{{.Description}}, {{.PrimaryField.FieldJson}}: %v", {{.PrimaryField.FieldJson}})
	result, err := uc.repo.FindByID(ctx, {{.PrimaryField.FieldJson}})
	if err != nil {
		uc.log.WithContext(ctx).Errorf("查询{{.Description}}失败: %v", err)
		return nil, err
	}
	return result, nil
}

{{- if .IsTree }}
// List 获取{{.Description}}列表（树形）
func (uc *{{.StructName}}Usecase) List(ctx context.Context) ([]*{{.Package}}.{{.StructName}}, error) {
	uc.log.WithContext(ctx).Debug("获取{{.Description}}树形列表")
	result, err := uc.repo.List(ctx)
	if err != nil {
		uc.log.WithContext(ctx).Errorf("获取{{.Description}}列表失败: %v", err)
		return nil, err
	}
	return result, nil
}
{{- else }}
// List 分页获取{{.Description}}列表
func (uc *{{.StructName}}Usecase) List(ctx context.Context, req *{{.Package}}Req.{{.StructName}}Search) ([]*{{.Package}}.{{.StructName}}, int64, error) {
	uc.log.WithContext(ctx).Debugf("获取{{.Description}}列表, 页码: %d, 每页: %d", req.Page, req.PageSize)
	list, total, err := uc.repo.List(ctx, req)
	if err != nil {
		uc.log.WithContext(ctx).Errorf("获取{{.Description}}列表失败: %v", err)
		return nil, 0, err
	}
	return list, total, nil
}
{{- end }}

{{- if .HasDataSource }}
// GetDataSource 获取{{.Description}}数据源
func (uc *{{.StructName}}Usecase) GetDataSource(ctx context.Context) (map[string][]map[string]any, error) {
	uc.log.WithContext(ctx).Debug("获取{{.Description}}数据源")
	result, err := uc.repo.GetDataSource(ctx)
	if err != nil {
		uc.log.WithContext(ctx).Errorf("获取{{.Description}}数据源失败: %v", err)
		return nil, err
	}
	return result, nil
}
{{- end }}

{{- end }}

// GetPublic 获取{{.Description}}公开数据
func (uc *{{.StructName}}Usecase) GetPublic(ctx context.Context) {
	// 此方法为获取公开数据
	// 请自行实现
}
{{- end }}
