284 lines
7.9 KiB
Go
284 lines
7.9 KiB
Go
package system
|
|
|
|
import (
|
|
"context"
|
|
|
|
"kra/internal/biz/system"
|
|
"kra/internal/data/model"
|
|
"kra/internal/data/query"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type exportTemplateRepo struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewExportTemplateRepo 创建导出模板仓储
|
|
func NewExportTemplateRepo(db *gorm.DB) system.ExportTemplateRepo {
|
|
return &exportTemplateRepo{db: db}
|
|
}
|
|
|
|
func (r *exportTemplateRepo) Create(ctx context.Context, template *system.ExportTemplate) error {
|
|
m := toModelExportTemplate(template)
|
|
if err := r.db.WithContext(ctx).Create(m).Error; err != nil {
|
|
return err
|
|
}
|
|
template.ID = uint(m.ID)
|
|
|
|
// 创建条件
|
|
if len(template.Conditions) > 0 {
|
|
for _, c := range template.Conditions {
|
|
c.TemplateID = template.TemplateID
|
|
}
|
|
if err := r.CreateConditions(ctx, template.Conditions); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// 创建关联
|
|
if len(template.JoinTemplate) > 0 {
|
|
for _, j := range template.JoinTemplate {
|
|
j.TemplateID = template.TemplateID
|
|
}
|
|
if err := r.CreateJoins(ctx, template.JoinTemplate); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *exportTemplateRepo) Update(ctx context.Context, template *system.ExportTemplate) error {
|
|
m := toModelExportTemplate(template)
|
|
return r.db.WithContext(ctx).Model(&model.SysExportTemplate{}).Where("id = ?", template.ID).Updates(m).Error
|
|
}
|
|
|
|
func (r *exportTemplateRepo) Delete(ctx context.Context, id uint) error {
|
|
return r.db.WithContext(ctx).Delete(&model.SysExportTemplate{}, id).Error
|
|
}
|
|
|
|
func (r *exportTemplateRepo) FindByID(ctx context.Context, id uint) (*system.ExportTemplate, error) {
|
|
var m model.SysExportTemplate
|
|
if err := r.db.WithContext(ctx).First(&m, id).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 加载条件
|
|
var conditions []model.SysExportTemplateCondition
|
|
r.db.WithContext(ctx).Where("template_id = ?", m.TemplateID).Find(&conditions)
|
|
|
|
// 加载关联
|
|
var joins []model.SysExportTemplateJoin
|
|
r.db.WithContext(ctx).Where("template_id = ?", m.TemplateID).Find(&joins)
|
|
|
|
return toBizExportTemplate(&m, conditions, joins), nil
|
|
}
|
|
|
|
func (r *exportTemplateRepo) FindByTemplateID(ctx context.Context, templateID string) (*system.ExportTemplate, error) {
|
|
var m model.SysExportTemplate
|
|
if err := r.db.WithContext(ctx).Where("template_id = ?", templateID).First(&m).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 加载条件
|
|
var conditions []model.SysExportTemplateCondition
|
|
r.db.WithContext(ctx).Where("template_id = ?", templateID).Find(&conditions)
|
|
|
|
// 加载关联
|
|
var joins []model.SysExportTemplateJoin
|
|
r.db.WithContext(ctx).Where("template_id = ?", templateID).Find(&joins)
|
|
|
|
return toBizExportTemplate(&m, conditions, joins), nil
|
|
}
|
|
|
|
func (r *exportTemplateRepo) GetList(ctx context.Context, req *system.ExportTemplateSearchReq) ([]*system.ExportTemplate, int64, error) {
|
|
q := query.SysExportTemplate
|
|
do := q.WithContext(ctx)
|
|
|
|
if req.Name != "" {
|
|
do = do.Where(q.Name.Like("%" + req.Name + "%"))
|
|
}
|
|
if req.TableName != "" {
|
|
do = do.Where(q.TblName.Eq(req.TableName))
|
|
}
|
|
if req.TemplateID != "" {
|
|
do = do.Where(q.TemplateID.Eq(req.TemplateID))
|
|
}
|
|
if req.StartCreatedAt != nil && req.EndCreatedAt != nil {
|
|
do = do.Where(q.CreatedAt.Between(*req.StartCreatedAt, *req.EndCreatedAt))
|
|
}
|
|
|
|
total, err := do.Count()
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
if req.PageSize > 0 {
|
|
do = do.Limit(req.PageSize).Offset((req.Page - 1) * req.PageSize)
|
|
}
|
|
|
|
list, err := do.Find()
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
result := make([]*system.ExportTemplate, len(list))
|
|
for i, m := range list {
|
|
result[i] = toBizExportTemplateSimple(m)
|
|
}
|
|
|
|
return result, total, nil
|
|
}
|
|
|
|
func (r *exportTemplateRepo) DeleteConditionsByTemplateID(ctx context.Context, templateID string) error {
|
|
return r.db.WithContext(ctx).Where("template_id = ?", templateID).Delete(&model.SysExportTemplateCondition{}).Error
|
|
}
|
|
|
|
func (r *exportTemplateRepo) DeleteJoinsByTemplateID(ctx context.Context, templateID string) error {
|
|
return r.db.WithContext(ctx).Where("template_id = ?", templateID).Delete(&model.SysExportTemplateJoin{}).Error
|
|
}
|
|
|
|
func (r *exportTemplateRepo) CreateConditions(ctx context.Context, conditions []*system.Condition) error {
|
|
if len(conditions) == 0 {
|
|
return nil
|
|
}
|
|
models := make([]*model.SysExportTemplateCondition, len(conditions))
|
|
for i, c := range conditions {
|
|
models[i] = &model.SysExportTemplateCondition{
|
|
TemplateID: c.TemplateID,
|
|
From: c.From,
|
|
Column: c.Column,
|
|
Operator: c.Operator,
|
|
}
|
|
}
|
|
return r.db.WithContext(ctx).Create(&models).Error
|
|
}
|
|
|
|
func (r *exportTemplateRepo) CreateJoins(ctx context.Context, joins []*system.JoinTemplate) error {
|
|
if len(joins) == 0 {
|
|
return nil
|
|
}
|
|
models := make([]*model.SysExportTemplateJoin, len(joins))
|
|
for i, j := range joins {
|
|
models[i] = &model.SysExportTemplateJoin{
|
|
TemplateID: j.TemplateID,
|
|
Joins: j.Joins,
|
|
TblName: j.Table,
|
|
On: j.On,
|
|
}
|
|
}
|
|
return r.db.WithContext(ctx).Create(&models).Error
|
|
}
|
|
|
|
func (r *exportTemplateRepo) GetDB(dbName string) interface{} {
|
|
// 简化实现:返回默认数据库
|
|
return r.db
|
|
}
|
|
|
|
func (r *exportTemplateRepo) ExecuteQuery(ctx context.Context, dbName, sql string, args ...interface{}) ([]map[string]interface{}, error) {
|
|
var result []map[string]interface{}
|
|
if err := r.db.WithContext(ctx).Raw(sql, args...).Scan(&result).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (r *exportTemplateRepo) GetColumnTypes(ctx context.Context, dbName, tableName string) ([]string, error) {
|
|
columns, err := r.db.Migrator().ColumnTypes(tableName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result := make([]string, len(columns))
|
|
for i, col := range columns {
|
|
result[i] = col.Name()
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (r *exportTemplateRepo) HasDeletedAtColumn(ctx context.Context, tableName string) bool {
|
|
var count int64
|
|
r.db.Raw("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND COLUMN_NAME = 'deleted_at'", tableName).Count(&count)
|
|
return count > 0
|
|
}
|
|
|
|
func (r *exportTemplateRepo) ImportData(ctx context.Context, dbName, tableName string, items []map[string]interface{}) error {
|
|
return r.db.WithContext(ctx).Table(tableName).CreateInBatches(&items, 1000).Error
|
|
}
|
|
|
|
// 转换函数
|
|
func toModelExportTemplate(t *system.ExportTemplate) *model.SysExportTemplate {
|
|
var limit int64
|
|
if t.Limit != nil {
|
|
limit = int64(*t.Limit)
|
|
}
|
|
return &model.SysExportTemplate{
|
|
ID: int64(t.ID),
|
|
DbName: t.DBName,
|
|
Name: t.Name,
|
|
TblName: t.TableName,
|
|
TemplateID: t.TemplateID,
|
|
TemplateInfo: t.TemplateInfo,
|
|
Limit: limit,
|
|
Order: t.Order,
|
|
}
|
|
}
|
|
|
|
func toBizExportTemplate(m *model.SysExportTemplate, conditions []model.SysExportTemplateCondition, joins []model.SysExportTemplateJoin) *system.ExportTemplate {
|
|
limit := int(m.Limit)
|
|
t := &system.ExportTemplate{
|
|
ID: uint(m.ID),
|
|
DBName: m.DbName,
|
|
Name: m.Name,
|
|
TableName: m.TblName,
|
|
TemplateID: m.TemplateID,
|
|
TemplateInfo: m.TemplateInfo,
|
|
Limit: &limit,
|
|
Order: m.Order,
|
|
CreatedAt: m.CreatedAt,
|
|
UpdatedAt: m.UpdatedAt,
|
|
}
|
|
|
|
// 转换条件
|
|
t.Conditions = make([]*system.Condition, len(conditions))
|
|
for i, c := range conditions {
|
|
t.Conditions[i] = &system.Condition{
|
|
ID: uint(c.ID),
|
|
TemplateID: c.TemplateID,
|
|
From: c.From,
|
|
Column: c.Column,
|
|
Operator: c.Operator,
|
|
}
|
|
}
|
|
|
|
// 转换关联
|
|
t.JoinTemplate = make([]*system.JoinTemplate, len(joins))
|
|
for i, j := range joins {
|
|
t.JoinTemplate[i] = &system.JoinTemplate{
|
|
ID: uint(j.ID),
|
|
TemplateID: j.TemplateID,
|
|
Joins: j.Joins,
|
|
Table: j.TblName,
|
|
On: j.On,
|
|
}
|
|
}
|
|
|
|
return t
|
|
}
|
|
|
|
func toBizExportTemplateSimple(m *model.SysExportTemplate) *system.ExportTemplate {
|
|
limit := int(m.Limit)
|
|
return &system.ExportTemplate{
|
|
ID: uint(m.ID),
|
|
DBName: m.DbName,
|
|
Name: m.Name,
|
|
TableName: m.TblName,
|
|
TemplateID: m.TemplateID,
|
|
TemplateInfo: m.TemplateInfo,
|
|
Limit: &limit,
|
|
Order: m.Order,
|
|
CreatedAt: m.CreatedAt,
|
|
UpdatedAt: m.UpdatedAt,
|
|
}
|
|
}
|