正在显示
21 个修改的文件
包含
431 行增加
和
59 行删除
| @@ -17,9 +17,13 @@ type QuerySetDto struct { | @@ -17,9 +17,13 @@ type QuerySetDto struct { | ||
| 17 | Status int `json:"status"` | 17 | Status int `json:"status"` |
| 18 | // 排序 | 18 | // 排序 |
| 19 | Sort int `json:"sort"` | 19 | Sort int `json:"sort"` |
| 20 | + // 时间 | ||
| 21 | + Time string `json:"time"` | ||
| 22 | + // 绑定的表ID | ||
| 23 | + BindTableId int `json:"tableId"` | ||
| 20 | } | 24 | } |
| 21 | 25 | ||
| 22 | -func (d *QuerySetDto) Load(m *domain.QuerySet) { | 26 | +func (d *QuerySetDto) Load(m *domain.QuerySet) *QuerySetDto { |
| 23 | d.QuerySetId = m.QuerySetId | 27 | d.QuerySetId = m.QuerySetId |
| 24 | d.Type = m.Type | 28 | d.Type = m.Type |
| 25 | d.Flag = m.Flag | 29 | d.Flag = m.Flag |
| @@ -27,4 +31,17 @@ func (d *QuerySetDto) Load(m *domain.QuerySet) { | @@ -27,4 +31,17 @@ func (d *QuerySetDto) Load(m *domain.QuerySet) { | ||
| 27 | d.ParentId = m.ParentId | 31 | d.ParentId = m.ParentId |
| 28 | d.Status = m.Status | 32 | d.Status = m.Status |
| 29 | d.Sort = m.Sort | 33 | d.Sort = m.Sort |
| 34 | + d.Time = m.CreatedAt.Local().Format("2006-01-02 15:04:05") | ||
| 35 | + d.BindTableId = m.QuerySetInfo.BindTableId | ||
| 36 | + return d | ||
| 37 | +} | ||
| 38 | + | ||
| 39 | +func NewQuerySetDtoList(querySets []*domain.QuerySet) []*QuerySetDto { | ||
| 40 | + var result = make([]*QuerySetDto, 0) | ||
| 41 | + for _, set := range querySets { | ||
| 42 | + var item = &QuerySetDto{} | ||
| 43 | + item.Load(set) | ||
| 44 | + result = append(result, item) | ||
| 45 | + } | ||
| 46 | + return result | ||
| 30 | } | 47 | } |
| @@ -12,6 +12,7 @@ import ( | @@ -12,6 +12,7 @@ import ( | ||
| 12 | type SearchQuerySetQuery struct { | 12 | type SearchQuerySetQuery struct { |
| 13 | Type string `cname:"类型" json:"type" valid:"Required"` | 13 | Type string `cname:"类型" json:"type" valid:"Required"` |
| 14 | Flag string `cname:"标识" json:"flag"` | 14 | Flag string `cname:"标识" json:"flag"` |
| 15 | + Status int `cname:"状态 1:启用 2:关闭" json:"status"` | ||
| 15 | MatchName string `cname:"匹配名称" json:"matchName"` | 16 | MatchName string `cname:"匹配名称" json:"matchName"` |
| 16 | SortByName string `json:"sortByName"` | 17 | SortByName string `json:"sortByName"` |
| 17 | SortByTime string `json:"sortByTime"` | 18 | SortByTime string `json:"sortByTime"` |
| @@ -8,6 +8,7 @@ import ( | @@ -8,6 +8,7 @@ import ( | ||
| 8 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/querySet/dto" | 8 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/querySet/dto" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/querySet/query" | 9 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/application/querySet/query" |
| 10 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | 10 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" |
| 11 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/domainService" | ||
| 11 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" | 12 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" |
| 12 | ) | 13 | ) |
| 13 | 14 | ||
| @@ -58,14 +59,16 @@ func (querySetService *QuerySetService) Copy(ctx *domain.Context, copyCommand *c | @@ -58,14 +59,16 @@ func (querySetService *QuerySetService) Copy(ctx *domain.Context, copyCommand *c | ||
| 58 | }() | 59 | }() |
| 59 | 60 | ||
| 60 | svr, _ := factory.FastQuerySetServices(transactionContext) | 61 | svr, _ := factory.FastQuerySetServices(transactionContext) |
| 61 | - if err := svr.Copy(ctx, copyCommand.QuerySetId, copyCommand.Type, copyCommand.ParentId, copyCommand.Name); err != nil { | 62 | + querySet, err := svr.Copy(ctx, copyCommand.QuerySetId, copyCommand.Type, copyCommand.ParentId, copyCommand.Name) |
| 63 | + if err != nil { | ||
| 62 | return nil, factory.FastError(err) | 64 | return nil, factory.FastError(err) |
| 63 | } | 65 | } |
| 64 | 66 | ||
| 65 | if err := transactionContext.CommitTransaction(); err != nil { | 67 | if err := transactionContext.CommitTransaction(); err != nil { |
| 66 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 68 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| 67 | } | 69 | } |
| 68 | - return struct{}{}, nil | 70 | + result := (&dto.QuerySetDto{}).Load(querySet) |
| 71 | + return result, nil | ||
| 69 | } | 72 | } |
| 70 | 73 | ||
| 71 | // 创建查询集合服务 | 74 | // 创建查询集合服务 |
| @@ -230,7 +233,21 @@ func (querySetService *QuerySetService) RemoveQuerySet(ctx *domain.Context, remo | @@ -230,7 +233,21 @@ func (querySetService *QuerySetService) RemoveQuerySet(ctx *domain.Context, remo | ||
| 230 | transactionContext.RollbackTransaction() | 233 | transactionContext.RollbackTransaction() |
| 231 | }() | 234 | }() |
| 232 | svr, _ := factory.FastQuerySetServices(transactionContext) | 235 | svr, _ := factory.FastQuerySetServices(transactionContext) |
| 233 | - if err := svr.Delete(ctx, removeQuerySetCommand.QuerySetId); err != nil { | 236 | + err = svr.Delete(ctx, removeQuerySetCommand.QuerySetId) |
| 237 | + // 依赖错误 | ||
| 238 | + if dependencyError, ok := err.(domainService.DependencyError); ok { | ||
| 239 | + bindTables := make([]int, 0) | ||
| 240 | + for _, t := range dependencyError.DependentTables { | ||
| 241 | + bindTables = append(bindTables, t.TableId) | ||
| 242 | + } | ||
| 243 | + querySetRepository, _, _ := factory.FastPgQuerySet(transactionContext, 0) | ||
| 244 | + _, querySets, _ := querySetRepository.Find(map[string]interface{}{"context": ctx, "bindTableIds": bindTables}) | ||
| 245 | + return map[string]interface{}{ | ||
| 246 | + "internalErr": err.Error(), | ||
| 247 | + "relatedQuerySets": dto.NewQuerySetDtoList(querySets), | ||
| 248 | + }, nil | ||
| 249 | + } | ||
| 250 | + if err != nil { | ||
| 234 | return nil, factory.FastError(err) | 251 | return nil, factory.FastError(err) |
| 235 | } | 252 | } |
| 236 | if err := transactionContext.CommitTransaction(); err != nil { | 253 | if err := transactionContext.CommitTransaction(); err != nil { |
| @@ -290,12 +307,7 @@ func (querySetService *QuerySetService) SearchQuerySet(ctx *domain.Context, sear | @@ -290,12 +307,7 @@ func (querySetService *QuerySetService) SearchQuerySet(ctx *domain.Context, sear | ||
| 290 | return nil, factory.FastError(err) | 307 | return nil, factory.FastError(err) |
| 291 | } | 308 | } |
| 292 | 309 | ||
| 293 | - var result = make([]*dto.QuerySetDto, 0) | ||
| 294 | - for _, set := range querySets { | ||
| 295 | - var item = &dto.QuerySetDto{} | ||
| 296 | - item.Load(set) | ||
| 297 | - result = append(result, item) | ||
| 298 | - } | 310 | + var result = dto.NewQuerySetDtoList(querySets) |
| 299 | 311 | ||
| 300 | if err := transactionContext.CommitTransaction(); err != nil { | 312 | if err := transactionContext.CommitTransaction(); err != nil { |
| 301 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 313 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| 1 | +package command | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "reflect" | ||
| 6 | + "strings" | ||
| 7 | + | ||
| 8 | + "github.com/beego/beego/v2/core/validation" | ||
| 9 | +) | ||
| 10 | + | ||
| 11 | +type CheckRowDuplicateCommand struct { | ||
| 12 | + TableId int `cname:"表Id" json:"tableId" valid:"Required"` | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +func (c *CheckRowDuplicateCommand) Valid(validation *validation.Validation) { | ||
| 16 | + | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +func (c *CheckRowDuplicateCommand) ValidateCommand() error { | ||
| 20 | + valid := validation.Validation{} | ||
| 21 | + b, err := valid.Valid(c) | ||
| 22 | + if err != nil { | ||
| 23 | + return err | ||
| 24 | + } | ||
| 25 | + if !b { | ||
| 26 | + elem := reflect.TypeOf(c).Elem() | ||
| 27 | + for _, validErr := range valid.Errors { | ||
| 28 | + field, isExist := elem.FieldByName(validErr.Field) | ||
| 29 | + if isExist { | ||
| 30 | + return fmt.Errorf(strings.Replace(validErr.Message, validErr.Field, field.Tag.Get("cname"), -1)) | ||
| 31 | + } else { | ||
| 32 | + return fmt.Errorf(validErr.Message) | ||
| 33 | + } | ||
| 34 | + } | ||
| 35 | + } | ||
| 36 | + return nil | ||
| 37 | +} |
| @@ -19,6 +19,7 @@ type TablePreviewCommand struct { | @@ -19,6 +19,7 @@ type TablePreviewCommand struct { | ||
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | func (cmd *TablePreviewCommand) Valid(validation *validation.Validation) { | 21 | func (cmd *TablePreviewCommand) Valid(validation *validation.Validation) { |
| 22 | + | ||
| 22 | if cmd.PageSize > 0 { | 23 | if cmd.PageSize > 0 { |
| 23 | cmd.Where.PageNumber = cmd.PageNumber | 24 | cmd.Where.PageNumber = cmd.PageNumber |
| 24 | cmd.Where.PageSize = cmd.PageSize | 25 | cmd.Where.PageSize = cmd.PageSize |
| @@ -30,6 +31,9 @@ func (cmd *TablePreviewCommand) Valid(validation *validation.Validation) { | @@ -30,6 +31,9 @@ func (cmd *TablePreviewCommand) Valid(validation *validation.Validation) { | ||
| 30 | 31 | ||
| 31 | func (cmd *TablePreviewCommand) ValidateCommand() error { | 32 | func (cmd *TablePreviewCommand) ValidateCommand() error { |
| 32 | valid := validation.Validation{} | 33 | valid := validation.Validation{} |
| 34 | + if cmd.TableId == 0 { | ||
| 35 | + return fmt.Errorf("暂无数据可预览") | ||
| 36 | + } | ||
| 33 | b, err := valid.Valid(cmd) | 37 | b, err := valid.Valid(cmd) |
| 34 | if err != nil { | 38 | if err != nil { |
| 35 | return err | 39 | return err |
| @@ -42,24 +42,7 @@ func (tableService *TableService) DBTablePreview(ctx *domain.Context, cmd *comma | @@ -42,24 +42,7 @@ func (tableService *TableService) DBTablePreview(ctx *domain.Context, cmd *comma | ||
| 42 | options.SetCondition(cmd.Where.Conditions) | 42 | options.SetCondition(cmd.Where.Conditions) |
| 43 | options.SetOffsetLimit(cmd.Where.PageNumber, cmd.Where.PageSize) | 43 | options.SetOffsetLimit(cmd.Where.PageNumber, cmd.Where.PageSize) |
| 44 | var dataTable *domain.DataTable | 44 | var dataTable *domain.DataTable |
| 45 | - switch cmd.ObjectId { | ||
| 46 | - case domain.DBTableTableOperateLog.ToInt(): | ||
| 47 | - options.SetCondition([]domain.Condition{{ | ||
| 48 | - Field: &domain.Field{ | ||
| 49 | - SQLName: "log_type", | ||
| 50 | - SQLType: domain.String.ToString(), | ||
| 51 | - }, | ||
| 52 | - In: []interface{}{domain.CommonLog.ToString()}, | ||
| 53 | - }}) | ||
| 54 | - case domain.DBTableQuerySetLog.ToInt(): | ||
| 55 | - options.SetCondition([]domain.Condition{{ | ||
| 56 | - Field: &domain.Field{ | ||
| 57 | - SQLName: "log_type", | ||
| 58 | - SQLType: domain.String.ToString(), | ||
| 59 | - }, | ||
| 60 | - In: []interface{}{domain.QuerySetLog.ToString()}, | ||
| 61 | - }}) | ||
| 62 | - } | 45 | + options.AdditionOptionsByTable(table) |
| 63 | 46 | ||
| 64 | dataTable, err = starrocks.Query(options, starrocks.WrapQueryFuncWithDB(pg.GormDB)) | 47 | dataTable, err = starrocks.Query(options, starrocks.WrapQueryFuncWithDB(pg.GormDB)) |
| 65 | if err != nil { | 48 | if err != nil { |
| @@ -143,7 +143,28 @@ func exportTableTo(ctx *domain.Context, cmd *command.TablePreviewCommand, table | @@ -143,7 +143,28 @@ func exportTableTo(ctx *domain.Context, cmd *command.TablePreviewCommand, table | ||
| 143 | Limit: blockSize, | 143 | Limit: blockSize, |
| 144 | Table: table, | 144 | Table: table, |
| 145 | } | 145 | } |
| 146 | + if table.TableType == domain.ObjectDBTable { | ||
| 147 | + switch table.TableId { | ||
| 148 | + case domain.DBTableTableOperateLog.ToInt(): | ||
| 149 | + options.SetCondition([]domain.Condition{{ | ||
| 150 | + Field: &domain.Field{ | ||
| 151 | + SQLName: "log_type", | ||
| 152 | + SQLType: domain.String.ToString(), | ||
| 153 | + }, | ||
| 154 | + In: []interface{}{domain.CommonLog.ToString()}, | ||
| 155 | + }}) | ||
| 156 | + case domain.DBTableQuerySetLog.ToInt(): | ||
| 157 | + options.SetCondition([]domain.Condition{{ | ||
| 158 | + Field: &domain.Field{ | ||
| 159 | + SQLName: "log_type", | ||
| 160 | + SQLType: domain.String.ToString(), | ||
| 161 | + }, | ||
| 162 | + In: []interface{}{domain.QuerySetLog.ToString()}, | ||
| 163 | + }}) | ||
| 164 | + } | ||
| 165 | + } | ||
| 146 | options.SetCondition(cmd.Where.Conditions).SetDefaultOrder() | 166 | options.SetCondition(cmd.Where.Conditions).SetDefaultOrder() |
| 167 | + | ||
| 147 | source <- Query{ | 168 | source <- Query{ |
| 148 | Index: i, | 169 | Index: i, |
| 149 | Options: options, | 170 | Options: options, |
| @@ -73,6 +73,7 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | @@ -73,6 +73,7 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | ||
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | options := &starrocks.QueryOptions{ | 75 | options := &starrocks.QueryOptions{ |
| 76 | + Table: table, | ||
| 76 | TableName: table.SQLName, | 77 | TableName: table.SQLName, |
| 77 | Select: []*domain.Field{field}, | 78 | Select: []*domain.Field{field}, |
| 78 | Where: []starrocks.Condition{ | 79 | Where: []starrocks.Condition{ |
| @@ -91,6 +92,7 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | @@ -91,6 +92,7 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | ||
| 91 | Condition: *cmd.Condition, | 92 | Condition: *cmd.Condition, |
| 92 | }) | 93 | }) |
| 93 | } | 94 | } |
| 95 | + options.AdditionOptionsByTable(table) | ||
| 94 | options.SetOffsetLimit(cmd.PageNumber, cmd.PageSize) | 96 | options.SetOffsetLimit(cmd.PageNumber, cmd.PageSize) |
| 95 | 97 | ||
| 96 | dataTable, err = starrocks.Query(*options, starrocks.WrapQueryFuncWithDB(db)) | 98 | dataTable, err = starrocks.Query(*options, starrocks.WrapQueryFuncWithDB(db)) |
| @@ -12,6 +12,7 @@ import ( | @@ -12,6 +12,7 @@ import ( | ||
| 12 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | 12 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" |
| 13 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/starrocks" | 13 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/starrocks" |
| 14 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" | 14 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" |
| 15 | + "strconv" | ||
| 15 | "strings" | 16 | "strings" |
| 16 | ) | 17 | ) |
| 17 | 18 | ||
| @@ -431,11 +432,15 @@ func (tableService *TableService) ValidExprSql(ctx *domain.Context, cmd *command | @@ -431,11 +432,15 @@ func (tableService *TableService) ValidExprSql(ctx *domain.Context, cmd *command | ||
| 431 | for _, f := range cmd.TableFields { | 432 | for _, f := range cmd.TableFields { |
| 432 | set.AddStr(f.TableSqlName) | 433 | set.AddStr(f.TableSqlName) |
| 433 | } | 434 | } |
| 434 | - sql := "select " + cmd.ExprSql + " as expr" | 435 | + selectValue := cmd.ExprSql |
| 436 | + if _, parseErr := strconv.ParseFloat(cmd.ExprSql, 64); parseErr != nil { | ||
| 437 | + selectValue = "'" + selectValue + "'" | ||
| 438 | + } | ||
| 439 | + sql := "select " + selectValue + " as expr" | ||
| 435 | if len(set.KeysStr()) > 0 { | 440 | if len(set.KeysStr()) > 0 { |
| 436 | sql += " from " + strings.Join(set.KeysStr(), ",") | 441 | sql += " from " + strings.Join(set.KeysStr(), ",") |
| 437 | - } | ||
| 438 | sql += " limit 1" | 442 | sql += " limit 1" |
| 443 | + } | ||
| 439 | tx := starrocks.DB.Exec(sql) | 444 | tx := starrocks.DB.Exec(sql) |
| 440 | if tx.Error != nil { | 445 | if tx.Error != nil { |
| 441 | return map[string]string{ | 446 | return map[string]string{ |
| @@ -445,6 +450,110 @@ func (tableService *TableService) ValidExprSql(ctx *domain.Context, cmd *command | @@ -445,6 +450,110 @@ func (tableService *TableService) ValidExprSql(ctx *domain.Context, cmd *command | ||
| 445 | return struct{}{}, nil | 450 | return struct{}{}, nil |
| 446 | } | 451 | } |
| 447 | 452 | ||
| 453 | +func (tableService *TableService) CheckRowDuplicate(ctx *domain.Context, cmd *command.CheckRowDuplicateCommand) (interface{}, error) { | ||
| 454 | + var defaultResponse = map[string]interface{}{ | ||
| 455 | + "rowDuplicateFlag": false, | ||
| 456 | + } | ||
| 457 | + if cmd.TableId == 0 { | ||
| 458 | + return defaultResponse, nil | ||
| 459 | + } | ||
| 460 | + if err := cmd.ValidateCommand(); err != nil { | ||
| 461 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 462 | + } | ||
| 463 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 464 | + if err != nil { | ||
| 465 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 466 | + } | ||
| 467 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 468 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 469 | + } | ||
| 470 | + defer func() { | ||
| 471 | + transactionContext.RollbackTransaction() | ||
| 472 | + }() | ||
| 473 | + | ||
| 474 | + var table *domain.Table | ||
| 475 | + _, table, err = factory.FastPgTable(transactionContext, cmd.TableId) | ||
| 476 | + if err != nil { | ||
| 477 | + return nil, factory.FastError(err) | ||
| 478 | + } | ||
| 479 | + | ||
| 480 | + var options = starrocks.QueryOptions{ | ||
| 481 | + Table: table, | ||
| 482 | + } | ||
| 483 | + total, duplicateTotal, err := starrocks.WrapQueryHasDuplicateRowWithDB(options, starrocks.DB)() | ||
| 484 | + if err != nil { | ||
| 485 | + return nil, factory.FastError(err) | ||
| 486 | + } | ||
| 487 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 488 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 489 | + } | ||
| 490 | + return map[string]interface{}{ | ||
| 491 | + "tableName": table.Name, | ||
| 492 | + "rowDuplicateFlag": total != duplicateTotal, | ||
| 493 | + "rowTotal": total, | ||
| 494 | + "rowDuplicateTotal": total - duplicateTotal, | ||
| 495 | + }, nil | ||
| 496 | +} | ||
| 497 | + | ||
| 498 | +func (tableService *TableService) CheckRowDuplicateV2(ctx *domain.Context, cmd *command.CheckRowDuplicateCommand) (interface{}, error) { | ||
| 499 | + var defaultResponse = map[string]interface{}{ | ||
| 500 | + "rowDuplicateFlag": false, | ||
| 501 | + } | ||
| 502 | + if cmd.TableId == 0 { | ||
| 503 | + return defaultResponse, nil | ||
| 504 | + } | ||
| 505 | + if err := cmd.ValidateCommand(); err != nil { | ||
| 506 | + return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | ||
| 507 | + } | ||
| 508 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
| 509 | + if err != nil { | ||
| 510 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 511 | + } | ||
| 512 | + if err := transactionContext.StartTransaction(); err != nil { | ||
| 513 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 514 | + } | ||
| 515 | + defer func() { | ||
| 516 | + transactionContext.RollbackTransaction() | ||
| 517 | + }() | ||
| 518 | + | ||
| 519 | + var table *domain.Table | ||
| 520 | + _, table, err = factory.FastPgTable(transactionContext, cmd.TableId) | ||
| 521 | + if err != nil { | ||
| 522 | + return nil, factory.FastError(err) | ||
| 523 | + } | ||
| 524 | + | ||
| 525 | + querySetRepository, _, _ := factory.FastPgQuerySet(transactionContext, 0) | ||
| 526 | + querySet, err := querySetRepository.FindOne(map[string]interface{}{"BindTableId": table.TableId, "context": ctx}) | ||
| 527 | + if err != nil { | ||
| 528 | + return nil, factory.FastError(err) | ||
| 529 | + } | ||
| 530 | + if len(querySet.QueryComponents) == 1 { | ||
| 531 | + return defaultResponse, nil | ||
| 532 | + } | ||
| 533 | + | ||
| 534 | + /* | ||
| 535 | + 重复判断 | ||
| 536 | + select max(id) from Schema_xiao_shou_ming_xi_t266316_c1 GROUP BY id HAVING count(id)>=2 limit 10 | ||
| 537 | + SELECT * FROM `Schema_xiao_shou_ming_xi_t266316_c1` where id = '1c04c626-7c96-4c31-9564-744051332b7c' | ||
| 538 | + */ | ||
| 539 | + var options = starrocks.QueryOptions{ | ||
| 540 | + Table: table, | ||
| 541 | + } | ||
| 542 | + total, duplicateTotal, err := starrocks.WrapQueryHasDuplicateRowByIDWithDB(options, starrocks.DB)() | ||
| 543 | + if err != nil { | ||
| 544 | + return nil, factory.FastError(err) | ||
| 545 | + } | ||
| 546 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
| 547 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
| 548 | + } | ||
| 549 | + return map[string]interface{}{ | ||
| 550 | + "tableName": table.Name, | ||
| 551 | + "rowDuplicateFlag": total != duplicateTotal, | ||
| 552 | + "rowTotal": total, | ||
| 553 | + "rowDuplicateTotal": total - duplicateTotal, | ||
| 554 | + }, nil | ||
| 555 | +} | ||
| 556 | + | ||
| 448 | func NewTableService(options map[string]interface{}) *TableService { | 557 | func NewTableService(options map[string]interface{}) *TableService { |
| 449 | newTableService := &TableService{} | 558 | newTableService := &TableService{} |
| 450 | return newTableService | 559 | return newTableService |
| @@ -43,7 +43,6 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command | @@ -43,7 +43,6 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command | ||
| 43 | return nil, factory.FastError(err) | 43 | return nil, factory.FastError(err) |
| 44 | } | 44 | } |
| 45 | response := (&dto.TablePreviewDto{}).Load(table, dataTable, domain.ObjectMetaTable) | 45 | response := (&dto.TablePreviewDto{}).Load(table, dataTable, domain.ObjectMetaTable) |
| 46 | - | ||
| 47 | if err := transactionContext.CommitTransaction(); err != nil { | 46 | if err := transactionContext.CommitTransaction(); err != nil { |
| 48 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 47 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| 49 | } | 48 | } |
| @@ -237,7 +237,7 @@ var DBTables = map[int]*Table{ | @@ -237,7 +237,7 @@ var DBTables = map[int]*Table{ | ||
| 237 | }, | 237 | }, |
| 238 | }, | 238 | }, |
| 239 | DBTableQuerySetLog.ToInt(): &Table{ | 239 | DBTableQuerySetLog.ToInt(): &Table{ |
| 240 | - TableId: 1, | 240 | + TableId: 2, |
| 241 | TableType: ObjectDBTable, | 241 | TableType: ObjectDBTable, |
| 242 | Name: "日志信息", | 242 | Name: "日志信息", |
| 243 | SQLName: "metadata.logs", | 243 | SQLName: "metadata.logs", |
| @@ -3,6 +3,7 @@ package domain | @@ -3,6 +3,7 @@ package domain | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | 4 | "fmt" |
| 5 | "math/rand" | 5 | "math/rand" |
| 6 | + "strings" | ||
| 6 | "time" | 7 | "time" |
| 7 | ) | 8 | ) |
| 8 | 9 | ||
| @@ -70,7 +71,7 @@ func (table *Table) WithContext(ctx *Context) *Table { | @@ -70,7 +71,7 @@ func (table *Table) WithContext(ctx *Context) *Table { | ||
| 70 | } | 71 | } |
| 71 | 72 | ||
| 72 | func (table *Table) WithPrefix(prefix string) *Table { | 73 | func (table *Table) WithPrefix(prefix string) *Table { |
| 73 | - table.SQLName = fmt.Sprintf("%v_%v", prefix, table.SQLName) | 74 | + table.SQLName = fmt.Sprintf("%v_%v", strings.ToLower(prefix), table.SQLName) |
| 74 | return table | 75 | return table |
| 75 | } | 76 | } |
| 76 | 77 |
| @@ -329,7 +329,7 @@ func NewSplitTableRequest(param domain.ReqSplitTable) SplitTableRequest { | @@ -329,7 +329,7 @@ func NewSplitTableRequest(param domain.ReqSplitTable) SplitTableRequest { | ||
| 329 | return SplitTableRequest{ | 329 | return SplitTableRequest{ |
| 330 | DatabaseTableName: param.FromTable.SQLName, | 330 | DatabaseTableName: param.FromTable.SQLName, |
| 331 | SplitTableName: param.ToSubTable.SQLName, | 331 | SplitTableName: param.ToSubTable.SQLName, |
| 332 | - DatabaseTableFieldSchemas: ToFieldSchemas(param.FromTable.DataFields), | 332 | + DatabaseTableFieldSchemas: ToFieldSchemas(param.ToSubTable.DataFields), |
| 333 | SplitTableFieldSchemas: ToFieldSchemas(param.ToSubTable.Fields(false)), | 333 | SplitTableFieldSchemas: ToFieldSchemas(param.ToSubTable.Fields(false)), |
| 334 | ManuallyFieldSchemas: ToFieldSchemas(param.ToSubTable.ManualFields), | 334 | ManuallyFieldSchemas: ToFieldSchemas(param.ToSubTable.ManualFields), |
| 335 | } | 335 | } |
| @@ -14,6 +14,8 @@ var ( | @@ -14,6 +14,8 @@ var ( | ||
| 14 | ErrQuerySetNameExists = fmt.Errorf("已存在") | 14 | ErrQuerySetNameExists = fmt.Errorf("已存在") |
| 15 | ErrQuerySetParentNotExists = fmt.Errorf("父级不存在") | 15 | ErrQuerySetParentNotExists = fmt.Errorf("父级不存在") |
| 16 | ErrQuerySetInvalidType = fmt.Errorf("查询集合的类型有误") | 16 | ErrQuerySetInvalidType = fmt.Errorf("查询集合的类型有误") |
| 17 | + ErrQuerySetDeleteStatusOn = fmt.Errorf("无法删除已启用的内容") | ||
| 18 | + ErrFieldsNotMatch = func(table string) error { return fmt.Errorf("[%v]字段数量不一致或类型不匹配", table) } | ||
| 17 | ) | 19 | ) |
| 18 | 20 | ||
| 19 | type QuerySetService struct { | 21 | type QuerySetService struct { |
| @@ -99,6 +101,10 @@ func (ptr *QuerySetService) Update(ctx *domain.Context, querySetId int, queryCom | @@ -99,6 +101,10 @@ func (ptr *QuerySetService) Update(ctx *domain.Context, querySetId int, queryCom | ||
| 99 | return err | 101 | return err |
| 100 | } | 102 | } |
| 101 | 103 | ||
| 104 | + if err = ptr.validQueryComponents(queryComponents); err != nil { | ||
| 105 | + return err | ||
| 106 | + } | ||
| 107 | + | ||
| 102 | // 调用底层的组装sql | 108 | // 调用底层的组装sql |
| 103 | formulasGenerateResponse, err := ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{ | 109 | formulasGenerateResponse, err := ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{ |
| 104 | QuerySet: qs, | 110 | QuerySet: qs, |
| @@ -130,6 +136,24 @@ func (ptr *QuerySetService) Update(ctx *domain.Context, querySetId int, queryCom | @@ -130,6 +136,24 @@ func (ptr *QuerySetService) Update(ctx *domain.Context, querySetId int, queryCom | ||
| 130 | return nil | 136 | return nil |
| 131 | } | 137 | } |
| 132 | 138 | ||
| 139 | +func (ptr *QuerySetService) validQueryComponents(queryComponents []*domain.QueryComponent) error { | ||
| 140 | + if len(queryComponents) == 0 { | ||
| 141 | + return nil | ||
| 142 | + } | ||
| 143 | + m := queryComponents[0] | ||
| 144 | + for i := 1; i < len(queryComponents); i++ { | ||
| 145 | + item := queryComponents[i] | ||
| 146 | + if len(item.MasterTable.Name) == 0 { | ||
| 147 | + continue | ||
| 148 | + } | ||
| 149 | + if len(item.MasterTable.Fields) != len(m.MasterTable.Fields) { | ||
| 150 | + return ErrFieldsNotMatch(item.MasterTable.Name) | ||
| 151 | + } | ||
| 152 | + // 类型匹配 | ||
| 153 | + } | ||
| 154 | + return nil | ||
| 155 | +} | ||
| 156 | + | ||
| 133 | func (ptr *QuerySetService) UpdateQuerySetLog(ctx *domain.Context, querySet *domain.QuerySet, queryComponents []*domain.QueryComponent) error { | 157 | func (ptr *QuerySetService) UpdateQuerySetLog(ctx *domain.Context, querySet *domain.QuerySet, queryComponents []*domain.QueryComponent) error { |
| 134 | var res = make([]FastSourceLog, 0) | 158 | var res = make([]FastSourceLog, 0) |
| 135 | if logs := conditionsEditLog(ctx, querySet, queryComponents); len(logs) > 0 { | 159 | if logs := conditionsEditLog(ctx, querySet, queryComponents); len(logs) > 0 { |
| @@ -395,6 +419,17 @@ func (ptr *QuerySetService) Rename(ctx *domain.Context, querySetId int, name str | @@ -395,6 +419,17 @@ func (ptr *QuerySetService) Rename(ctx *domain.Context, querySetId int, name str | ||
| 395 | if err != nil { | 419 | if err != nil { |
| 396 | return err | 420 | return err |
| 397 | } | 421 | } |
| 422 | + if qs.QuerySetInfo.BindTableId > 0 { | ||
| 423 | + tableRepository, _ := repository.NewTableRepository(ptr.transactionContext) | ||
| 424 | + table, err := tableRepository.FindOne(map[string]interface{}{"context": ctx, "tableId": qs.QuerySetInfo.BindTableId}) | ||
| 425 | + if err != nil { | ||
| 426 | + return err | ||
| 427 | + } | ||
| 428 | + table.Name = name | ||
| 429 | + if _, err := tableRepository.Save(table); err != nil { | ||
| 430 | + return err | ||
| 431 | + } | ||
| 432 | + } | ||
| 398 | // 日志 | 433 | // 日志 |
| 399 | if err = FastLog(ptr.transactionContext, domain.QuerySetLog, qs.QuerySetId, &RenameQuerySetLog{ | 434 | if err = FastLog(ptr.transactionContext, domain.QuerySetLog, qs.QuerySetId, &RenameQuerySetLog{ |
| 400 | LogEntry: domain.NewLogEntry(qs.Name, qs.Type, domain.UnKnown, ctx), | 435 | LogEntry: domain.NewLogEntry(qs.Name, qs.Type, domain.UnKnown, ctx), |
| @@ -442,17 +477,17 @@ func (ptr *QuerySetService) ChangeStatus(ctx *domain.Context, querySetId int, st | @@ -442,17 +477,17 @@ func (ptr *QuerySetService) ChangeStatus(ctx *domain.Context, querySetId int, st | ||
| 442 | return nil | 477 | return nil |
| 443 | } | 478 | } |
| 444 | 479 | ||
| 445 | -func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, groupId int, name string) error { | 480 | +func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, groupId int, name string) (*domain.QuerySet, error) { |
| 446 | querySetRepository, _ := repository.NewQuerySetRepository(ptr.transactionContext) | 481 | querySetRepository, _ := repository.NewQuerySetRepository(ptr.transactionContext) |
| 447 | qs, err := querySetRepository.FindOne(map[string]interface{}{"querySetId": querySetId}) | 482 | qs, err := querySetRepository.FindOne(map[string]interface{}{"querySetId": querySetId}) |
| 448 | if err != nil { | 483 | if err != nil { |
| 449 | - return err | 484 | + return nil, err |
| 450 | } | 485 | } |
| 451 | 486 | ||
| 452 | copy := copyQuerySet(qs, t, groupId, name) | 487 | copy := copyQuerySet(qs, t, groupId, name) |
| 453 | copy.Sort, err = dao.QuerySetCurrentSort(ptr.transactionContext, copy.Type, copy.ParentId) | 488 | copy.Sort, err = dao.QuerySetCurrentSort(ptr.transactionContext, copy.Type, copy.ParentId) |
| 454 | if err != nil { | 489 | if err != nil { |
| 455 | - return err | 490 | + return nil, err |
| 456 | } | 491 | } |
| 457 | // check duplicate name | 492 | // check duplicate name |
| 458 | options := map[string]interface{}{ | 493 | options := map[string]interface{}{ |
| @@ -462,45 +497,45 @@ func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, | @@ -462,45 +497,45 @@ func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, | ||
| 462 | "parentId": groupId, | 497 | "parentId": groupId, |
| 463 | } | 498 | } |
| 464 | if found, foundErr := querySetRepository.FindOne(options); foundErr == nil && found != nil && found.Name == name { | 499 | if found, foundErr := querySetRepository.FindOne(options); foundErr == nil && found != nil && found.Name == name { |
| 465 | - return ErrQuerySetNameExists | 500 | + return nil, ErrQuerySetNameExists |
| 466 | } | 501 | } |
| 467 | if copy.QuerySetInfo.BindTableId != 0 { | 502 | if copy.QuerySetInfo.BindTableId != 0 { |
| 468 | tableRepository, _ := repository.NewTableRepository(ptr.transactionContext) | 503 | tableRepository, _ := repository.NewTableRepository(ptr.transactionContext) |
| 469 | table, err := tableRepository.FindOne(map[string]interface{}{"tableId": copy.QuerySetInfo.BindTableId}) | 504 | table, err := tableRepository.FindOne(map[string]interface{}{"tableId": copy.QuerySetInfo.BindTableId}) |
| 470 | if err != nil { | 505 | if err != nil { |
| 471 | - return err | 506 | + return nil, err |
| 472 | } | 507 | } |
| 473 | copyTable := NewTable(domain.TableType(t), name, table.Fields(false), 0).WithContext(ctx).WithPrefix(qs.Type) | 508 | copyTable := NewTable(domain.TableType(t), name, table.Fields(false), 0).WithContext(ctx).WithPrefix(qs.Type) |
| 474 | 509 | ||
| 475 | copyTable, err = tableRepository.Save(copyTable) | 510 | copyTable, err = tableRepository.Save(copyTable) |
| 476 | if err != nil { | 511 | if err != nil { |
| 477 | - return err | 512 | + return nil, err |
| 478 | } | 513 | } |
| 479 | 514 | ||
| 480 | // 调用底层的组装sql | 515 | // 调用底层的组装sql |
| 481 | formulasGenerateResponse, err := ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{ | 516 | formulasGenerateResponse, err := ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{ |
| 482 | QuerySet: qs, | 517 | QuerySet: qs, |
| 483 | - Table: table, | 518 | + Table: copyTable, |
| 484 | QueryComponents: qs.QueryComponents, | 519 | QueryComponents: qs.QueryComponents, |
| 485 | }) | 520 | }) |
| 486 | if err != nil { | 521 | if err != nil { |
| 487 | - return err | 522 | + return nil, err |
| 488 | } | 523 | } |
| 489 | if len(formulasGenerateResponse.FormulaName) > 0 && formulasGenerateResponse.FormulaName != table.SQLName { | 524 | if len(formulasGenerateResponse.FormulaName) > 0 && formulasGenerateResponse.FormulaName != table.SQLName { |
| 490 | copyTable.SQLName = formulasGenerateResponse.FormulaName | 525 | copyTable.SQLName = formulasGenerateResponse.FormulaName |
| 491 | tableRepository, _ := repository.NewTableRepository(ptr.transactionContext) | 526 | tableRepository, _ := repository.NewTableRepository(ptr.transactionContext) |
| 492 | copyTable, err = tableRepository.Save(copyTable) | 527 | copyTable, err = tableRepository.Save(copyTable) |
| 493 | if err != nil { | 528 | if err != nil { |
| 494 | - return err | 529 | + return nil, err |
| 495 | } | 530 | } |
| 496 | } | 531 | } |
| 497 | copy.QuerySetInfo.BindTableId = copyTable.TableId | 532 | copy.QuerySetInfo.BindTableId = copyTable.TableId |
| 498 | } | 533 | } |
| 499 | - _, err = querySetRepository.Save(copy) | 534 | + copy, err = querySetRepository.Save(copy) |
| 500 | if err != nil { | 535 | if err != nil { |
| 501 | - return err | 536 | + return nil, err |
| 502 | } | 537 | } |
| 503 | - return nil | 538 | + return copy, nil |
| 504 | } | 539 | } |
| 505 | 540 | ||
| 506 | func copyQuerySet(qs *domain.QuerySet, t string, groupId int, name string) *domain.QuerySet { | 541 | func copyQuerySet(qs *domain.QuerySet, t string, groupId int, name string) *domain.QuerySet { |
| @@ -528,10 +563,14 @@ func (ptr *QuerySetService) Delete(ctx *domain.Context, querySetId int) error { | @@ -528,10 +563,14 @@ func (ptr *QuerySetService) Delete(ctx *domain.Context, querySetId int) error { | ||
| 528 | } | 563 | } |
| 529 | querySetRepository, _ := repository.NewQuerySetRepository(ptr.transactionContext) | 564 | querySetRepository, _ := repository.NewQuerySetRepository(ptr.transactionContext) |
| 530 | tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext) | 565 | tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext) |
| 566 | + // 1.判断依赖,删除表 | ||
| 531 | for i := range querySets { | 567 | for i := range querySets { |
| 532 | if _, err := querySetRepository.Remove(querySets[i]); err != nil { | 568 | if _, err := querySetRepository.Remove(querySets[i]); err != nil { |
| 533 | return err | 569 | return err |
| 534 | } | 570 | } |
| 571 | + if querySets[i].Flag != domain.FlagGroup && querySets[i].Type == domain.SchemaTable.ToString() && querySets[i].Status == domain.StatusOn { | ||
| 572 | + return ErrQuerySetDeleteStatusOn | ||
| 573 | + } | ||
| 535 | if querySets[i].QuerySetInfo.BindTableId > 0 { | 574 | if querySets[i].QuerySetInfo.BindTableId > 0 { |
| 536 | if err := tableDependencyService.HasDependencyError(ctx, querySets[i].QuerySetInfo.BindTableId); err != nil { | 575 | if err := tableDependencyService.HasDependencyError(ctx, querySets[i].QuerySetInfo.BindTableId); err != nil { |
| 537 | return err | 576 | return err |
| @@ -539,6 +578,11 @@ func (ptr *QuerySetService) Delete(ctx *domain.Context, querySetId int) error { | @@ -539,6 +578,11 @@ func (ptr *QuerySetService) Delete(ctx *domain.Context, querySetId int) error { | ||
| 539 | if err := dao.TableSoftDelete(ptr.transactionContext, querySets[i].QuerySetInfo.BindTableId, domain.TableType(querySets[i].Type)); err != nil { | 578 | if err := dao.TableSoftDelete(ptr.transactionContext, querySets[i].QuerySetInfo.BindTableId, domain.TableType(querySets[i].Type)); err != nil { |
| 540 | return err | 579 | return err |
| 541 | } | 580 | } |
| 581 | + } | ||
| 582 | + } | ||
| 583 | + // 2.底层清理 | ||
| 584 | + for i := range querySets { | ||
| 585 | + if querySets[i].QuerySetInfo.BindTableId > 0 { | ||
| 542 | ByteCore.FormulasClear(domain.ReqFormulasClear{ | 586 | ByteCore.FormulasClear(domain.ReqFormulasClear{ |
| 543 | QuerySetId: querySets[i].QuerySetId, | 587 | QuerySetId: querySets[i].QuerySetId, |
| 544 | }) | 588 | }) |
| @@ -653,6 +697,14 @@ func (ptr *QuerySetService) DependencyGraph(ctx *domain.Context, querySetId int) | @@ -653,6 +697,14 @@ func (ptr *QuerySetService) DependencyGraph(ctx *domain.Context, querySetId int) | ||
| 653 | 697 | ||
| 654 | tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext) | 698 | tableDependencyService, _ := NewTableDependencyService(ptr.transactionContext) |
| 655 | dependencies = tableDependencyService.TableDependTree(tables, querySet.QuerySetInfo.BindTableId) | 699 | dependencies = tableDependencyService.TableDependTree(tables, querySet.QuerySetInfo.BindTableId) |
| 700 | + | ||
| 701 | + _, querySets, err := querySetRepository.Find(map[string]interface{}{"context": ctx, "bindTableIds": dependencies.TableIds()}) | ||
| 702 | + if err != nil { | ||
| 703 | + return nil, err | ||
| 704 | + } | ||
| 705 | + if len(querySets) > 0 { | ||
| 706 | + dependencies.BindQuerySet(querySets) | ||
| 707 | + } | ||
| 656 | return dependencies, nil | 708 | return dependencies, nil |
| 657 | } | 709 | } |
| 658 | 710 |
| @@ -8,14 +8,19 @@ import ( | @@ -8,14 +8,19 @@ import ( | ||
| 8 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | 8 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/repository" | 9 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/repository" |
| 10 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" | 10 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" |
| 11 | + "strings" | ||
| 11 | ) | 12 | ) |
| 12 | 13 | ||
| 13 | type DependencyError struct { | 14 | type DependencyError struct { |
| 14 | - t *domain.Table | 15 | + DependentTables []*domain.Table |
| 15 | } | 16 | } |
| 16 | 17 | ||
| 17 | func (d DependencyError) Error() string { | 18 | func (d DependencyError) Error() string { |
| 18 | - return fmt.Sprintf("已关联%v:%v", domain.EnumsDescription(domain.ObjectTypeMap, d.t.TableType), d.t.Name) | 19 | + var relations = make([]string, 0) |
| 20 | + for _, t := range d.DependentTables { | ||
| 21 | + relations = append(relations, fmt.Sprintf("%v%v", domain.EnumsDescription(domain.ObjectTypeMap, t.TableType), t.Name)) | ||
| 22 | + } | ||
| 23 | + return fmt.Sprintf("引用对象:%v", strings.Join(relations, ",")) | ||
| 19 | } | 24 | } |
| 20 | 25 | ||
| 21 | type CircleDependError struct { | 26 | type CircleDependError struct { |
| @@ -64,11 +69,14 @@ func (ptr *TableDependencyService) CircleTable() *domain.Table { | @@ -64,11 +69,14 @@ func (ptr *TableDependencyService) CircleTable() *domain.Table { | ||
| 64 | } | 69 | } |
| 65 | 70 | ||
| 66 | func (ptr *TableDependencyService) HasDependencyError(ctx *domain.Context, dependencyTable int) error { | 71 | func (ptr *TableDependencyService) HasDependencyError(ctx *domain.Context, dependencyTable int) error { |
| 67 | - table, ok := TableHasDependency(ptr.transactionContext, ctx, dependencyTable) | 72 | + tables, ok := TableHasDependency(ptr.transactionContext, ctx, dependencyTable) |
| 68 | if !ok { | 73 | if !ok { |
| 69 | return nil | 74 | return nil |
| 70 | } | 75 | } |
| 71 | - return DependencyError{table} | 76 | + if len(tables) > 0 { |
| 77 | + return DependencyError{tables} | ||
| 78 | + } | ||
| 79 | + return nil | ||
| 72 | } | 80 | } |
| 73 | 81 | ||
| 74 | func (ptr *TableDependencyService) Detect(ctx *domain.Context, edges [][]int) bool { | 82 | func (ptr *TableDependencyService) Detect(ctx *domain.Context, edges [][]int) bool { |
| @@ -240,16 +248,16 @@ func (ptr *TableDependencyService) makeTrees(childMap map[int][]int, rootNodes [ | @@ -240,16 +248,16 @@ func (ptr *TableDependencyService) makeTrees(childMap map[int][]int, rootNodes [ | ||
| 240 | return set.KeysInt() | 248 | return set.KeysInt() |
| 241 | } | 249 | } |
| 242 | 250 | ||
| 243 | -func TableHasDependency(transactionContext *pgTransaction.TransactionContext, ctx *domain.Context, dependencyTable int) (*domain.Table, bool) { | 251 | +func TableHasDependency(transactionContext *pgTransaction.TransactionContext, ctx *domain.Context, dependencyTable int) ([]*domain.Table, bool) { |
| 244 | tableRepository, _ := repository.NewTableRepository(transactionContext) | 252 | tableRepository, _ := repository.NewTableRepository(transactionContext) |
| 245 | - table, err := tableRepository.FindOne(map[string]interface{}{"context": ctx, "dependencyTable": dependencyTable}) | 253 | + _, tables, err := tableRepository.Find(map[string]interface{}{"context": ctx, "dependencyTable": dependencyTable}) |
| 246 | if errors.Is(err, domain.ErrorNotFound) { | 254 | if errors.Is(err, domain.ErrorNotFound) { |
| 247 | return nil, false | 255 | return nil, false |
| 248 | } | 256 | } |
| 249 | - if table == nil && err != nil { | 257 | + if tables == nil && err != nil { |
| 250 | return nil, false | 258 | return nil, false |
| 251 | } | 259 | } |
| 252 | - return table, true | 260 | + return tables, true |
| 253 | } | 261 | } |
| 254 | 262 | ||
| 255 | type TableDependTree struct { | 263 | type TableDependTree struct { |
| @@ -267,7 +275,31 @@ func (td TableDependTree) EdgesArray() [][]int { | @@ -267,7 +275,31 @@ func (td TableDependTree) EdgesArray() [][]int { | ||
| 267 | return res | 275 | return res |
| 268 | } | 276 | } |
| 269 | 277 | ||
| 278 | +func (td TableDependTree) TableIds() []int { | ||
| 279 | + var set = collection.NewSet() | ||
| 280 | + for i := range td.Nodes { | ||
| 281 | + set.Add(td.Nodes[i].TableId) | ||
| 282 | + } | ||
| 283 | + return set.KeysInt() | ||
| 284 | +} | ||
| 285 | + | ||
| 286 | +func (td *TableDependTree) BindQuerySet(querySets []*domain.QuerySet) { | ||
| 287 | + for i := range td.Nodes { | ||
| 288 | + for j := range querySets { | ||
| 289 | + if td.Nodes[i].TableId == querySets[j].QuerySetInfo.BindTableId { | ||
| 290 | + td.Nodes[i].QuerySetId = querySets[j].QuerySetId | ||
| 291 | + } | ||
| 292 | + } | ||
| 293 | + } | ||
| 294 | + for j := range querySets { | ||
| 295 | + if td.NodeSelected.TableId == querySets[j].QuerySetInfo.BindTableId { | ||
| 296 | + td.NodeSelected.QuerySetId = querySets[j].QuerySetId | ||
| 297 | + } | ||
| 298 | + } | ||
| 299 | +} | ||
| 300 | + | ||
| 270 | type TableNode struct { | 301 | type TableNode struct { |
| 302 | + QuerySetId int `json:"querySetId"` | ||
| 271 | TableId int `json:"tableId"` | 303 | TableId int `json:"tableId"` |
| 272 | // 表类型 MainTable:主表 SideTable:副表 SubTable:分表 | 304 | // 表类型 MainTable:主表 SideTable:副表 SubTable:分表 |
| 273 | Type string `json:"type"` | 305 | Type string `json:"type"` |
| @@ -73,11 +73,10 @@ func (ptr *UpdateTableStructService) UpdateTableStruct(ctx *domain.Context, tabl | @@ -73,11 +73,10 @@ func (ptr *UpdateTableStructService) UpdateTableStruct(ctx *domain.Context, tabl | ||
| 73 | }); err != nil { | 73 | }); err != nil { |
| 74 | return nil, err | 74 | return nil, err |
| 75 | } | 75 | } |
| 76 | - | ||
| 77 | // 通知底层 | 76 | // 通知底层 |
| 78 | - //if _, err = ByteCore.SplitTable(domain.ReqSplitTable{FromTable: mainTable, ToSubTable: table}); err != nil { | ||
| 79 | - // return nil, err | ||
| 80 | - //} | 77 | + if _, err = ByteCore.SplitTable(domain.ReqSplitTable{FromTable: mainTable, ToSubTable: table}); err != nil { |
| 78 | + return nil, err | ||
| 79 | + } | ||
| 81 | return struct{}{}, nil | 80 | return struct{}{}, nil |
| 82 | } | 81 | } |
| 83 | 82 |
| @@ -4,6 +4,7 @@ import ( | @@ -4,6 +4,7 @@ import ( | ||
| 4 | "errors" | 4 | "errors" |
| 5 | "fmt" | 5 | "fmt" |
| 6 | "github.com/go-pg/pg/v10" | 6 | "github.com/go-pg/pg/v10" |
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" | ||
| 7 | 8 | ||
| 8 | "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" | 9 | "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" |
| 9 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 10 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
| @@ -132,6 +133,7 @@ func (repository *QuerySetRepository) FindOne(queryOptions map[string]interface{ | @@ -132,6 +133,7 @@ func (repository *QuerySetRepository) FindOne(queryOptions map[string]interface{ | ||
| 132 | query := sqlbuilder.BuildQuery(tx.Model(querySetModel), queryOptions) | 133 | query := sqlbuilder.BuildQuery(tx.Model(querySetModel), queryOptions) |
| 133 | WhereContext(query, queryOptions) | 134 | WhereContext(query, queryOptions) |
| 134 | query.SetWhereByQueryOption("query_set_id = ?", "querySetId") | 135 | query.SetWhereByQueryOption("query_set_id = ?", "querySetId") |
| 136 | + query.SetWhereByQueryOption("query_set_info->'BindTableId' = '?'", "BindTableId") | ||
| 135 | query.SetWhereByQueryOption("type = ?", "type") | 137 | query.SetWhereByQueryOption("type = ?", "type") |
| 136 | query.SetWhereByQueryOption("flag = ?", "flag") | 138 | query.SetWhereByQueryOption("flag = ?", "flag") |
| 137 | query.SetWhereByQueryOption("parent_id = ?", "parentId") | 139 | query.SetWhereByQueryOption("parent_id = ?", "parentId") |
| @@ -157,10 +159,14 @@ func (repository *QuerySetRepository) Find(queryOptions map[string]interface{}) | @@ -157,10 +159,14 @@ func (repository *QuerySetRepository) Find(queryOptions map[string]interface{}) | ||
| 157 | WhereContext(query, queryOptions) | 159 | WhereContext(query, queryOptions) |
| 158 | query.SetWhereByQueryOption("type = ?", "type") | 160 | query.SetWhereByQueryOption("type = ?", "type") |
| 159 | query.SetWhereByQueryOption("flag = ?", "flag") | 161 | query.SetWhereByQueryOption("flag = ?", "flag") |
| 162 | + query.SetWhereByQueryOption("status = ?", "status") | ||
| 160 | query.SetWhereByQueryOption(fmt.Sprintf("name like '%%%v%%'", queryOptions["matchName"]), "matchName") | 163 | query.SetWhereByQueryOption(fmt.Sprintf("name like '%%%v%%'", queryOptions["matchName"]), "matchName") |
| 161 | if v, ok := queryOptions["inParentIds"]; ok && len(v.([]int)) > 0 { | 164 | if v, ok := queryOptions["inParentIds"]; ok && len(v.([]int)) > 0 { |
| 162 | query.Where("parent_id in (?)", pg.In(v)) | 165 | query.Where("parent_id in (?)", pg.In(v)) |
| 163 | } | 166 | } |
| 167 | + if v, ok := queryOptions["bindTableIds"]; ok && len(v.([]int)) > 0 { | ||
| 168 | + query.Where("query_set_info->'BindTableId' in (?)", pg.In(utils.ToArrayString(v.([]int)))) | ||
| 169 | + } | ||
| 164 | if v, ok := queryOptions["sortByName"]; ok && len(v.(string)) > 0 { | 170 | if v, ok := queryOptions["sortByName"]; ok && len(v.(string)) > 0 { |
| 165 | query.SetOrderDirect("pin_name", v.(string)) | 171 | query.SetOrderDirect("pin_name", v.(string)) |
| 166 | } else if v, ok := queryOptions["sortByTime"]; ok && len(v.(string)) > 0 { | 172 | } else if v, ok := queryOptions["sortByTime"]; ok && len(v.(string)) > 0 { |
| @@ -178,6 +178,9 @@ func (repository *TableRepository) Find(queryOptions map[string]interface{}) (in | @@ -178,6 +178,9 @@ func (repository *TableRepository) Find(queryOptions map[string]interface{}) (in | ||
| 178 | if v, ok := queryOptions["module"]; ok && v.(int) > 0 { | 178 | if v, ok := queryOptions["module"]; ok && v.(int) > 0 { |
| 179 | query.Where(`(cast(table_info->>'module' as integer) & ?) >0`, v) | 179 | query.Where(`(cast(table_info->>'module' as integer) & ?) >0`, v) |
| 180 | } | 180 | } |
| 181 | + if v, ok := queryOptions["dependencyTable"]; ok && v.(int) > 0 { | ||
| 182 | + query.Where(`table_info->'dependencyTables' @> '[?]'`, v.(int)) | ||
| 183 | + } | ||
| 181 | 184 | ||
| 182 | //query.SetOffsetAndLimit(20) | 185 | //query.SetOffsetAndLimit(20) |
| 183 | query.SetOrderDirect("table_id", "DESC") | 186 | query.SetOrderDirect("table_id", "DESC") |
| @@ -84,6 +84,31 @@ func (o *QueryOptions) SetDefaultOrder() *QueryOptions { | @@ -84,6 +84,31 @@ func (o *QueryOptions) SetDefaultOrder() *QueryOptions { | ||
| 84 | return o | 84 | return o |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | +func (o *QueryOptions) AdditionOptionsByTable(table *domain.Table) *QueryOptions { | ||
| 88 | + if table.TableType != domain.ObjectDBTable { | ||
| 89 | + return o | ||
| 90 | + } | ||
| 91 | + switch table.TableId { | ||
| 92 | + case domain.DBTableTableOperateLog.ToInt(): | ||
| 93 | + o.SetCondition([]domain.Condition{{ | ||
| 94 | + Field: &domain.Field{ | ||
| 95 | + SQLName: "log_type", | ||
| 96 | + SQLType: domain.String.ToString(), | ||
| 97 | + }, | ||
| 98 | + In: []interface{}{domain.CommonLog.ToString()}, | ||
| 99 | + }}) | ||
| 100 | + case domain.DBTableQuerySetLog.ToInt(): | ||
| 101 | + o.SetCondition([]domain.Condition{{ | ||
| 102 | + Field: &domain.Field{ | ||
| 103 | + SQLName: "log_type", | ||
| 104 | + SQLType: domain.String.ToString(), | ||
| 105 | + }, | ||
| 106 | + In: []interface{}{domain.QuerySetLog.ToString()}, | ||
| 107 | + }}) | ||
| 108 | + } | ||
| 109 | + return o | ||
| 110 | +} | ||
| 111 | + | ||
| 87 | type Condition struct { | 112 | type Condition struct { |
| 88 | domain.Condition | 113 | domain.Condition |
| 89 | Distinct bool | 114 | Distinct bool |
| @@ -291,3 +316,54 @@ func ArrayInterfaceToString(args []interface{}) []string { | @@ -291,3 +316,54 @@ func ArrayInterfaceToString(args []interface{}) []string { | ||
| 291 | } | 316 | } |
| 292 | return result | 317 | return result |
| 293 | } | 318 | } |
| 319 | + | ||
| 320 | +// WrapQueryHasDuplicateRowWithDB query table view has duplicate row | ||
| 321 | +// result 1 represent is true other is false | ||
| 322 | +func WrapQueryHasDuplicateRowWithDB(params QueryOptions, db *gorm.DB) func() (int64, int64, error) { | ||
| 323 | + return func() (int64, int64, error) { | ||
| 324 | + var total int64 | ||
| 325 | + var duplicateTotal int64 | ||
| 326 | + query := db.Table(params.Table.SQLName) | ||
| 327 | + fieldNames := make([]string, 0) | ||
| 328 | + for _, f := range params.Table.DataFields { | ||
| 329 | + fieldNames = append(fieldNames, fmt.Sprintf("ifnull(%s,'')", f.SQLName)) | ||
| 330 | + } | ||
| 331 | + query.Select(fmt.Sprintf("count(0) c1,count(distinct %s) c2", strings.Join(fieldNames, ","))) | ||
| 332 | + row := query.Row() | ||
| 333 | + if row.Err() != nil { | ||
| 334 | + return total, duplicateTotal, row.Err() | ||
| 335 | + } | ||
| 336 | + if err := row.Scan(&total, &duplicateTotal); err != nil { | ||
| 337 | + return total, duplicateTotal, err | ||
| 338 | + } | ||
| 339 | + if total == duplicateTotal { | ||
| 340 | + return total, duplicateTotal, nil | ||
| 341 | + } | ||
| 342 | + return total, duplicateTotal, nil | ||
| 343 | + } | ||
| 344 | +} | ||
| 345 | + | ||
| 346 | +func WrapQueryHasDuplicateRowByIDWithDB(params QueryOptions, db *gorm.DB) func() (int64, int64, error) { | ||
| 347 | + return func() (int64, int64, error) { | ||
| 348 | + var total int64 | ||
| 349 | + var duplicateTotal int64 | ||
| 350 | + query := db.Table(params.Table.SQLName) | ||
| 351 | + fieldNames := make([]string, 0) | ||
| 352 | + fieldNames = append(fieldNames, "id") | ||
| 353 | + for _, f := range params.Table.DataFields { | ||
| 354 | + fieldNames = append(fieldNames, fmt.Sprintf("ifnull(%s,'')", f.SQLName)) | ||
| 355 | + } | ||
| 356 | + query.Select(fmt.Sprintf("count(0) c1,count(distinct %s) c2", strings.Join(fieldNames, ","))) | ||
| 357 | + row := query.Row() | ||
| 358 | + if row.Err() != nil { | ||
| 359 | + return total, duplicateTotal, row.Err() | ||
| 360 | + } | ||
| 361 | + if err := row.Scan(&total, &duplicateTotal); err != nil { | ||
| 362 | + return total, duplicateTotal, err | ||
| 363 | + } | ||
| 364 | + if total == duplicateTotal { | ||
| 365 | + return total, duplicateTotal, nil | ||
| 366 | + } | ||
| 367 | + return total, duplicateTotal, nil | ||
| 368 | + } | ||
| 369 | +} |
| @@ -142,7 +142,7 @@ func (controller *TableController) SearchQuerySetTables() { | @@ -142,7 +142,7 @@ func (controller *TableController) SearchQuerySetTables() { | ||
| 142 | if len(cmd.TableTypes) == 0 { | 142 | if len(cmd.TableTypes) == 0 { |
| 143 | cmd.TableTypes = []string{domain.MainTable.ToString(), domain.SideTable.ToString(), domain.SubTable.ToString(), domain.SubProcessTable.ToString()} | 143 | cmd.TableTypes = []string{domain.MainTable.ToString(), domain.SideTable.ToString(), domain.SubTable.ToString(), domain.SubProcessTable.ToString()} |
| 144 | } | 144 | } |
| 145 | - cmd.Module = domain.ModuleQuerySetCenter | domain.ModuleCalculateCenter | 145 | + cmd.Module = domain.ModuleQuerySetCenter |
| 146 | cmd.ReturnDetailStructInfo = true | 146 | cmd.ReturnDetailStructInfo = true |
| 147 | cmd.Context = ParseContext(controller.BaseController) | 147 | cmd.Context = ParseContext(controller.BaseController) |
| 148 | data, err := tableService.Search(cmd) | 148 | data, err := tableService.Search(cmd) |
| @@ -183,6 +183,22 @@ func (controller *TableController) ValidExprSql() { | @@ -183,6 +183,22 @@ func (controller *TableController) ValidExprSql() { | ||
| 183 | controller.Response(data, err) | 183 | controller.Response(data, err) |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | +func (controller *TableController) CheckRowDuplicate() { | ||
| 187 | + tableService := service.NewTableService(nil) | ||
| 188 | + cmd := &command.CheckRowDuplicateCommand{} | ||
| 189 | + Must(controller.Unmarshal(cmd)) | ||
| 190 | + data, err := tableService.CheckRowDuplicateV2(ParseContext(controller.BaseController), cmd) | ||
| 191 | + controller.Response(data, err) | ||
| 192 | +} | ||
| 193 | + | ||
| 194 | +func (controller *TableController) CheckRowValueDuplicate() { | ||
| 195 | + tableService := service.NewTableService(nil) | ||
| 196 | + cmd := &command.CheckRowDuplicateCommand{} | ||
| 197 | + Must(controller.Unmarshal(cmd)) | ||
| 198 | + data, err := tableService.CheckRowDuplicate(ParseContext(controller.BaseController), cmd) | ||
| 199 | + controller.Response(data, err) | ||
| 200 | +} | ||
| 201 | + | ||
| 186 | func (controller *TableController) ExportDataTable() { | 202 | func (controller *TableController) ExportDataTable() { |
| 187 | tableService := service.NewTableService(nil) | 203 | tableService := service.NewTableService(nil) |
| 188 | cmd := &command.TablePreviewCommand{} | 204 | cmd := &command.TablePreviewCommand{} |
| @@ -16,6 +16,8 @@ func init() { | @@ -16,6 +16,8 @@ func init() { | ||
| 16 | web.Router("/data/tables/relation-graph", &controllers.TableController{}, "Post:RelationGraph") | 16 | web.Router("/data/tables/relation-graph", &controllers.TableController{}, "Post:RelationGraph") |
| 17 | web.Router("/data/tables/apply-on", &controllers.TableController{}, "Post:ApplyOn") | 17 | web.Router("/data/tables/apply-on", &controllers.TableController{}, "Post:ApplyOn") |
| 18 | web.Router("/data/tables/valid-expr-sql", &controllers.TableController{}, "Post:ValidExprSql") | 18 | web.Router("/data/tables/valid-expr-sql", &controllers.TableController{}, "Post:ValidExprSql") |
| 19 | + web.Router("/data/tables/check", &controllers.TableController{}, "Post:CheckRowDuplicate") | ||
| 20 | + web.Router("/data/tables/check-row-value-duplicate", &controllers.TableController{}, "Post:CheckRowValueDuplicate") | ||
| 19 | web.Router("/data/tables/search-appended-list", &controllers.TableController{}, "Post:SearchAppendedList") | 21 | web.Router("/data/tables/search-appended-list", &controllers.TableController{}, "Post:SearchAppendedList") |
| 20 | web.Router("/data/tables/search-sub-table-list", &controllers.TableController{}, "Post:SearchSubTableList") | 22 | web.Router("/data/tables/search-sub-table-list", &controllers.TableController{}, "Post:SearchSubTableList") |
| 21 | web.Router("/data/tables/search-query-set-tables", &controllers.TableController{}, "Post:SearchQuerySetTables") | 23 | web.Router("/data/tables/search-query-set-tables", &controllers.TableController{}, "Post:SearchQuerySetTables") |
-
请 注册 或 登录 后发表评论