作者 yangfu

fix:formula create error

@@ -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(), ",")
  442 + sql += " limit 1"
437 } 443 }
438 - sql += " limit 1"  
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,8 +275,32 @@ func (td TableDependTree) EdgesArray() [][]int { @@ -267,8 +275,32 @@ 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 {
271 - TableId int `json:"tableId"` 302 + QuerySetId int `json:"querySetId"`
  303 + TableId int `json:"tableId"`
272 // 表类型 MainTable:主表 SideTable:副表 SubTable:分表 304 // 表类型 MainTable:主表 SideTable:副表 SubTable:分表
273 Type string `json:"type"` 305 Type string `json:"type"`
274 // 名称 306 // 名称
@@ -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")