246 lines
10 KiB
Smarty
246 lines
10 KiB
Smarty
{{- if .IsAdd}}
|
||
|
||
// Get{{.StructName}}InfoList 新增搜索语句
|
||
{{ GenerateSearchConditions .Fields }}
|
||
// Get{{.StructName}}InfoList 新增排序语句 请自行在搜索语句中添加orderMap内容
|
||
{{- range .Fields}}
|
||
{{- if .Sort}}
|
||
orderMap["{{.ColumnName}}"] = true
|
||
{{- end}}
|
||
{{- end}}
|
||
|
||
|
||
{{- if .HasDataSource }}
|
||
// Get{{.StructName}}DataSource()方法新增关联语句
|
||
{{range $key, $value := .DataSourceMap}}
|
||
{{$key}} := make([]map[string]any, 0)
|
||
s.data.DB().Table("{{$value.Table}}"){{- if $value.HasDeletedAt}}.Where("deleted_at IS NULL"){{ end }}.Select("{{$value.Label}} as label,{{$value.Value}} as value").Scan(&{{$key}})
|
||
res["{{$key}}"] = {{$key}}
|
||
{{- end }}
|
||
{{- end }}
|
||
{{- else}}
|
||
package {{.Package}}
|
||
|
||
import (
|
||
{{- if not .OnlyTemplate }}
|
||
"context"
|
||
"{{.Module}}/internal/biz/{{.Package}}"
|
||
model "{{.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}}Service {{.Description}}服务层
|
||
// 负责处理请求类型转换、事务管理,并调用 Biz 层 Usecase 完成业务逻辑
|
||
type {{.StructName}}Service struct {
|
||
uc *{{.Package}}.{{.StructName}}Usecase
|
||
db *gorm.DB
|
||
log *log.Helper
|
||
}
|
||
|
||
// New{{.StructName}}Service 创建{{.Description}}服务
|
||
// @param uc Biz 层 Usecase,包含业务逻辑
|
||
// @param db 数据库连接,用于事务管理
|
||
// @param logger 日志记录器
|
||
func New{{.StructName}}Service(uc *{{.Package}}.{{.StructName}}Usecase, db *gorm.DB, logger log.Logger) *{{.StructName}}Service {
|
||
return &{{.StructName}}Service{
|
||
uc: uc,
|
||
db: db,
|
||
log: log.NewHelper(logger),
|
||
}
|
||
}
|
||
|
||
{{- if not .OnlyTemplate }}
|
||
|
||
// Create{{.StructName}} 创建{{.Description}}记录
|
||
// @param ctx 上下文
|
||
// @param req 创建请求,包含{{.Description}}信息
|
||
// @return error 创建失败时返回错误
|
||
func (s *{{.StructName}}Service) Create{{.StructName}}(ctx context.Context, req *{{.Package}}Req.{{.StructName}}Request) error {
|
||
s.log.WithContext(ctx).Infof("Service: 创建{{.Description}}")
|
||
// 请求类型转换:将 Request 转换为 Model
|
||
{{.Abbreviation}} := req.To{{.StructName}}()
|
||
return s.uc.Create(ctx, {{.Abbreviation}})
|
||
}
|
||
|
||
// Create{{.StructName}}WithModel 使用 Model 创建{{.Description}}记录(兼容 Handler 直接调用)
|
||
// @param ctx 上下文
|
||
// @param {{.Abbreviation}} {{.Description}}模型
|
||
// @return error 创建失败时返回错误
|
||
func (s *{{.StructName}}Service) Create{{.StructName}}WithModel(ctx context.Context, {{.Abbreviation}} *model.{{.StructName}}) error {
|
||
s.log.WithContext(ctx).Infof("Service: 创建{{.Description}}(Model)")
|
||
return s.uc.Create(ctx, {{.Abbreviation}})
|
||
}
|
||
|
||
|
||
// Delete{{.StructName}} 删除{{.Description}}记录
|
||
// @param ctx 上下文
|
||
// @param {{.PrimaryField.FieldJson}} 主键ID
|
||
{{- if .AutoCreateResource }}
|
||
// @param userID 操作用户ID
|
||
{{- end }}
|
||
// @return error 删除失败时返回错误
|
||
{{- if .AutoCreateResource }}
|
||
// 注意:当启用 AutoCreateResource 时,删除操作使用事务确保 deleted_by 字段更新和删除操作的原子性
|
||
{{- end }}
|
||
func (s *{{.StructName}}Service) Delete{{.StructName}}(ctx context.Context, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}{{- if .AutoCreateResource -}}, userID uint{{- end -}}) error {
|
||
s.log.WithContext(ctx).Infof("Service: 删除{{.Description}}, {{.PrimaryField.FieldJson}}: %v", {{.PrimaryField.FieldJson}})
|
||
{{- if .AutoCreateResource }}
|
||
// 使用事务确保 deleted_by 更新和删除操作的原子性
|
||
return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||
// 先更新 deleted_by 字段
|
||
if err := tx.Model(&model.{{.StructName}}{}).Where("{{.PrimaryField.ColumnName}} = ?", {{.PrimaryField.FieldJson}}).Update("deleted_by", userID).Error; err != nil {
|
||
s.log.WithContext(ctx).Errorf("更新 deleted_by 失败: %v", err)
|
||
return err
|
||
}
|
||
// 再执行删除
|
||
return s.uc.DeleteWithTx(ctx, tx, {{.PrimaryField.FieldJson}})
|
||
})
|
||
{{- else }}
|
||
return s.uc.Delete(ctx, {{.PrimaryField.FieldJson}})
|
||
{{- end }}
|
||
}
|
||
|
||
// Delete{{.StructName}}ByIds 批量删除{{.Description}}记录
|
||
// @param ctx 上下文
|
||
// @param {{.PrimaryField.FieldJson}}s 主键ID列表
|
||
{{- if .AutoCreateResource }}
|
||
// @param deletedBy 操作用户ID
|
||
{{- end }}
|
||
// @return error 删除失败时返回错误
|
||
{{- if .AutoCreateResource }}
|
||
// 注意:当启用 AutoCreateResource 时,批量删除操作使用事务确保 deleted_by 字段更新和删除操作的原子性
|
||
{{- end }}
|
||
func (s *{{.StructName}}Service) Delete{{.StructName}}ByIds(ctx context.Context, {{.PrimaryField.FieldJson}}s []{{.PrimaryField.FieldType}}{{- if .AutoCreateResource }}, deletedBy uint{{- end}}) error {
|
||
s.log.WithContext(ctx).Infof("Service: 批量删除{{.Description}}, 数量: %d", len({{.PrimaryField.FieldJson}}s))
|
||
{{- if .AutoCreateResource }}
|
||
// 使用事务确保 deleted_by 更新和删除操作的原子性
|
||
return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||
// 先批量更新 deleted_by 字段
|
||
if err := tx.Model(&model.{{.StructName}}{}).Where("{{.PrimaryField.ColumnName}} in ?", {{.PrimaryField.FieldJson}}s).Update("deleted_by", deletedBy).Error; err != nil {
|
||
s.log.WithContext(ctx).Errorf("批量更新 deleted_by 失败: %v", err)
|
||
return err
|
||
}
|
||
// 再执行批量删除
|
||
return s.uc.DeleteByIdsWithTx(ctx, tx, {{.PrimaryField.FieldJson}}s)
|
||
})
|
||
{{- else }}
|
||
return s.uc.DeleteByIds(ctx, {{.PrimaryField.FieldJson}}s)
|
||
{{- end }}
|
||
}
|
||
|
||
|
||
// Update{{.StructName}} 更新{{.Description}}记录
|
||
// @param ctx 上下文
|
||
// @param req 更新请求,包含{{.Description}}信息
|
||
// @return error 更新失败时返回错误
|
||
func (s *{{.StructName}}Service) Update{{.StructName}}(ctx context.Context, req *{{.Package}}Req.{{.StructName}}Request) error {
|
||
s.log.WithContext(ctx).Infof("Service: 更新{{.Description}}")
|
||
// 请求类型转换:将 Request 转换为 Model
|
||
{{.Abbreviation}} := req.To{{.StructName}}()
|
||
return s.uc.Update(ctx, {{.Abbreviation}})
|
||
}
|
||
|
||
// Update{{.StructName}}WithModel 使用 Model 更新{{.Description}}记录(兼容 Handler 直接调用)
|
||
// @param ctx 上下文
|
||
// @param {{.Abbreviation}} {{.Description}}模型
|
||
// @return error 更新失败时返回错误
|
||
func (s *{{.StructName}}Service) Update{{.StructName}}WithModel(ctx context.Context, {{.Abbreviation}} *model.{{.StructName}}) error {
|
||
s.log.WithContext(ctx).Infof("Service: 更新{{.Description}}(Model)")
|
||
return s.uc.Update(ctx, {{.Abbreviation}})
|
||
}
|
||
|
||
// Get{{.StructName}} 根据{{.PrimaryField.FieldJson}}获取{{.Description}}记录
|
||
// @param ctx 上下文
|
||
// @param {{.PrimaryField.FieldJson}} 主键ID
|
||
// @return *model.{{.StructName}} {{.Description}}记录
|
||
// @return error 查询失败时返回错误
|
||
func (s *{{.StructName}}Service) Get{{.StructName}}(ctx context.Context, {{.PrimaryField.FieldJson}} {{.PrimaryField.FieldType}}) (*model.{{.StructName}}, error) {
|
||
s.log.WithContext(ctx).Debugf("Service: 查询{{.Description}}, {{.PrimaryField.FieldJson}}: %v", {{.PrimaryField.FieldJson}})
|
||
return s.uc.FindByID(ctx, {{.PrimaryField.FieldJson}})
|
||
}
|
||
|
||
|
||
{{- if .IsTree }}
|
||
// Get{{.StructName}}InfoList 获取{{.Description}}列表(树形结构)
|
||
// @param ctx 上下文
|
||
// @return []*model.{{.StructName}} {{.Description}}列表
|
||
// @return error 查询失败时返回错误
|
||
func (s *{{.StructName}}Service) Get{{.StructName}}InfoList(ctx context.Context) ([]*model.{{.StructName}}, error) {
|
||
s.log.WithContext(ctx).Debug("Service: 获取{{.Description}}树形列表")
|
||
return s.uc.List(ctx)
|
||
}
|
||
{{- else }}
|
||
// Get{{.StructName}}InfoList 分页获取{{.Description}}列表
|
||
// @param ctx 上下文
|
||
// @param info 搜索条件,包含分页和筛选参数
|
||
// @return []*model.{{.StructName}} {{.Description}}列表
|
||
// @return int64 总记录数
|
||
// @return error 查询失败时返回错误
|
||
func (s *{{.StructName}}Service) Get{{.StructName}}InfoList(ctx context.Context, info *{{.Package}}Req.{{.StructName}}Search) ([]*model.{{.StructName}}, int64, error) {
|
||
s.log.WithContext(ctx).Debugf("Service: 获取{{.Description}}列表, 页码: %d, 每页: %d", info.Page, info.PageSize)
|
||
return s.uc.List(ctx, info)
|
||
}
|
||
{{- end }}
|
||
|
||
{{- if .HasDataSource }}
|
||
// Get{{.StructName}}DataSource 获取{{.StructName}}的数据源
|
||
// @param ctx 上下文
|
||
// @return map[string][]map[string]any 数据源映射
|
||
// @return error 查询失败时返回错误
|
||
func (s *{{.StructName}}Service) Get{{.StructName}}DataSource(ctx context.Context) (map[string][]map[string]any, error) {
|
||
s.log.WithContext(ctx).Debug("Service: 获取{{.Description}}数据源")
|
||
return s.uc.GetDataSource(ctx)
|
||
}
|
||
{{- end }}
|
||
|
||
|
||
// BatchCreate{{.StructName}} 批量创建{{.Description}}记录(带事务)
|
||
// @param ctx 上下文
|
||
// @param reqs 创建请求列表
|
||
// @return error 创建失败时返回错误,事务会自动回滚
|
||
func (s *{{.StructName}}Service) BatchCreate{{.StructName}}(ctx context.Context, reqs []*{{.Package}}Req.{{.StructName}}Request) error {
|
||
s.log.WithContext(ctx).Infof("Service: 批量创建{{.Description}}, 数量: %d", len(reqs))
|
||
return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||
for _, req := range reqs {
|
||
{{.Abbreviation}} := req.To{{.StructName}}()
|
||
if err := s.uc.Create(ctx, {{.Abbreviation}}); err != nil {
|
||
s.log.WithContext(ctx).Errorf("批量创建{{.Description}}失败: %v", err)
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
})
|
||
}
|
||
|
||
// BatchUpdate{{.StructName}} 批量更新{{.Description}}记录(带事务)
|
||
// @param ctx 上下文
|
||
// @param reqs 更新请求列表
|
||
// @return error 更新失败时返回错误,事务会自动回滚
|
||
func (s *{{.StructName}}Service) BatchUpdate{{.StructName}}(ctx context.Context, reqs []*{{.Package}}Req.{{.StructName}}Request) error {
|
||
s.log.WithContext(ctx).Infof("Service: 批量更新{{.Description}}, 数量: %d", len(reqs))
|
||
return s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||
for _, req := range reqs {
|
||
{{.Abbreviation}} := req.To{{.StructName}}()
|
||
if err := s.uc.Update(ctx, {{.Abbreviation}}); err != nil {
|
||
s.log.WithContext(ctx).Errorf("批量更新{{.Description}}失败: %v", err)
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
})
|
||
}
|
||
{{- end }}
|
||
|
||
// Get{{.StructName}}Public 获取公开数据
|
||
// @param ctx 上下文
|
||
func (s *{{.StructName}}Service) Get{{.StructName}}Public(ctx context.Context) {
|
||
s.log.WithContext(ctx).Debug("Service: 获取{{.Description}}公开数据")
|
||
s.uc.GetPublic(ctx)
|
||
}
|
||
{{- end }}
|