合并分支 'test' 到 'master'
Test 查看合并请求 !2
正在显示
43 个修改的文件
包含
821 行增加
和
320 行删除
| @@ -39,9 +39,7 @@ spec: | @@ -39,9 +39,7 @@ spec: | ||
| 39 | operator: In | 39 | operator: In |
| 40 | values: | 40 | values: |
| 41 | - cn-hangzhou.i-bp1djh1xn7taumbue1ze | 41 | - cn-hangzhou.i-bp1djh1xn7taumbue1ze |
| 42 | - - cn-hangzhou.i-bp1djh1xn7taumbue1zd | ||
| 43 | - - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb | ||
| 44 | - - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy | 42 | + |
| 45 | containers: | 43 | containers: |
| 46 | - name: character-library-metadata-bastion | 44 | - name: character-library-metadata-bastion |
| 47 | image: 192.168.0.243:5000/mmm/character-library-metadata-bastion:dev | 45 | image: 192.168.0.243:5000/mmm/character-library-metadata-bastion:dev |
| @@ -42,7 +42,7 @@ func (querySetService *QuerySetService) CalculateSetPreview(ctx *domain.Context, | @@ -42,7 +42,7 @@ func (querySetService *QuerySetService) CalculateSetPreview(ctx *domain.Context, | ||
| 42 | response.ObjectType = querySet.Type | 42 | response.ObjectType = querySet.Type |
| 43 | response.Name = querySet.Name | 43 | response.Name = querySet.Name |
| 44 | response.Fields = dataTable.Fields | 44 | response.Fields = dataTable.Fields |
| 45 | - response.Data = domain.GripData(domain.ToFieldData(dataTable.Fields, dataTable.Data, false), int64(len(dataTable.Data))) | 45 | + response.Data = domain.GripData(domain.ToFieldData(dataTable.Fields, dataTable.Data, false, true), int64(len(dataTable.Data))) |
| 46 | 46 | ||
| 47 | if err := transactionContext.CommitTransaction(); err != nil { | 47 | if err := transactionContext.CommitTransaction(); err != nil { |
| 48 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 48 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| @@ -494,7 +494,7 @@ func GetItemValues(transactionContext application.TransactionContext, q *query.C | @@ -494,7 +494,7 @@ func GetItemValues(transactionContext application.TransactionContext, q *query.C | ||
| 494 | var result = make([]itemValue, 0) | 494 | var result = make([]itemValue, 0) |
| 495 | result = append(result, itemValue{ | 495 | result = append(result, itemValue{ |
| 496 | Name: querySet.Name, | 496 | Name: querySet.Name, |
| 497 | - Value: value, | 497 | + Value: domain.RoundValue(value), |
| 498 | }) | 498 | }) |
| 499 | 499 | ||
| 500 | for _, f := range q.Formula.TableFields { | 500 | for _, f := range q.Formula.TableFields { |
| @@ -511,7 +511,7 @@ func GetItemValues(transactionContext application.TransactionContext, q *query.C | @@ -511,7 +511,7 @@ func GetItemValues(transactionContext application.TransactionContext, q *query.C | ||
| 511 | }) | 511 | }) |
| 512 | result = append(result, itemValue{ | 512 | result = append(result, itemValue{ |
| 513 | Name: f.FieldName, | 513 | Name: f.FieldName, |
| 514 | - Value: value, | 514 | + Value: domain.RoundValue(value), |
| 515 | }) | 515 | }) |
| 516 | } | 516 | } |
| 517 | return querySet, result | 517 | return querySet, result |
| @@ -20,7 +20,10 @@ type TablePreviewCommand struct { | @@ -20,7 +20,10 @@ type TablePreviewCommand struct { | ||
| 20 | } | 20 | } |
| 21 | 21 | ||
| 22 | func (cmd *TablePreviewCommand) Valid(validation *validation.Validation) { | 22 | func (cmd *TablePreviewCommand) Valid(validation *validation.Validation) { |
| 23 | - | 23 | + if cmd.UseCache && cmd.PageSize==0{ |
| 24 | + cmd.PageNumber = 1 | ||
| 25 | + cmd.PageSize = 10000 //默认缓存前10000条 | ||
| 26 | + } | ||
| 24 | if cmd.PageSize > 0 { | 27 | if cmd.PageSize > 0 { |
| 25 | cmd.Where.PageNumber = cmd.PageNumber | 28 | cmd.Where.PageNumber = cmd.PageNumber |
| 26 | cmd.Where.PageSize = cmd.PageSize | 29 | cmd.Where.PageSize = cmd.PageSize |
| @@ -71,7 +71,10 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | @@ -71,7 +71,10 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | ||
| 71 | if table.TableType == domain.SubTable.ToString() && field.Flag == domain.ManualField { | 71 | if table.TableType == domain.SubTable.ToString() && field.Flag == domain.ManualField { |
| 72 | return empty, nil | 72 | return empty, nil |
| 73 | } | 73 | } |
| 74 | - | 74 | + match := cmd.Match |
| 75 | + if !domain.SQLType(field.SQLType).IsString() { | ||
| 76 | + match = "" | ||
| 77 | + } | ||
| 75 | options := &starrocks.QueryOptions{ | 78 | options := &starrocks.QueryOptions{ |
| 76 | Table: table, | 79 | Table: table, |
| 77 | TableName: table.SQLName, | 80 | TableName: table.SQLName, |
| @@ -80,7 +83,7 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | @@ -80,7 +83,7 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | ||
| 80 | { | 83 | { |
| 81 | Condition: domain.Condition{ | 84 | Condition: domain.Condition{ |
| 82 | Field: field, | 85 | Field: field, |
| 83 | - Like: cmd.Match, | 86 | + Like: match, |
| 84 | Order: "ASC", | 87 | Order: "ASC", |
| 85 | }, | 88 | }, |
| 86 | Distinct: true, | 89 | Distinct: true, |
| @@ -107,8 +110,9 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | @@ -107,8 +110,9 @@ func (tableService *TableService) FieldOptionalValues(ctx *domain.Context, cmd * | ||
| 107 | if err := transactionContext.CommitTransaction(); err != nil { | 110 | if err := transactionContext.CommitTransaction(); err != nil { |
| 108 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | 111 | return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) |
| 109 | } | 112 | } |
| 113 | + values := dataTable.OptionalValue(cmd.Match, field.SQLType) | ||
| 110 | return map[string]interface{}{ | 114 | return map[string]interface{}{ |
| 111 | - "values": dataTable.OptionalValue(), | ||
| 112 | - "total": dataTable.Total, | 115 | + "values": values, |
| 116 | + "total": len(values), | ||
| 113 | }, nil | 117 | }, nil |
| 114 | } | 118 | } |
| @@ -11,6 +11,9 @@ import ( | @@ -11,6 +11,9 @@ import ( | ||
| 11 | ) | 11 | ) |
| 12 | 12 | ||
| 13 | func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command.TablePreviewCommand) (interface{}, error) { | 13 | func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command.TablePreviewCommand) (interface{}, error) { |
| 14 | + if cmd.TableId == 0 { | ||
| 15 | + return &dto.TablePreviewDto{}, nil | ||
| 16 | + } | ||
| 14 | if err := cmd.ValidateCommand(); err != nil { | 17 | if err := cmd.ValidateCommand(); err != nil { |
| 15 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) | 18 | return nil, application.ThrowError(application.ARG_ERROR, err.Error()) |
| 16 | } | 19 | } |
| @@ -68,6 +71,10 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command | @@ -68,6 +71,10 @@ func (tableService *TableService) TablePreview(ctx *domain.Context, cmd *command | ||
| 68 | if err != nil { | 71 | if err != nil { |
| 69 | return nil, factory.FastError(err) | 72 | return nil, factory.FastError(err) |
| 70 | } | 73 | } |
| 74 | + // 计算项只返回第一个值 | ||
| 75 | + // if table.TableType==domain.CalculateItem.ToString() && dataTable!=nil && len(dataTable.Data)>0{ | ||
| 76 | + // dataTable.Data = dataTable.Data[:1] | ||
| 77 | + // } | ||
| 71 | response.Load(table, dataTable, domain.ObjectMetaTable) | 78 | response.Load(table, dataTable, domain.ObjectMetaTable) |
| 72 | } | 79 | } |
| 73 | } | 80 | } |
| @@ -24,14 +24,11 @@ type ( | @@ -24,14 +24,11 @@ type ( | ||
| 24 | Url string `json:"url"` | 24 | Url string `json:"url"` |
| 25 | Ext string `json:"ext"` | 25 | Ext string `json:"ext"` |
| 26 | Where | 26 | Where |
| 27 | - OriginalTableId string `json:"originalTableId"` | ||
| 28 | - IsFromOriginalTable bool `json:"isFromOriginalTable"` | ||
| 29 | - TableFileUrl string `json:"tableFileUrl"` | ||
| 30 | - ColumnSchemas []ColumnSchema `json:"columnSchemas"` | ||
| 31 | - //PageNumber int `json:"pageNumber"` | ||
| 32 | - //PageSize int `json:"pageSize"` | ||
| 33 | - //QueryParameters []QueryParameter `json:"queryParameters"` | ||
| 34 | - SortParameters map[string]interface{} `json:"sortParameters"` | 27 | + OriginalTableId string `json:"originalTableId"` |
| 28 | + IsFromOriginalTable bool `json:"isFromOriginalTable"` | ||
| 29 | + TableFileUrl string `json:"tableFileUrl"` | ||
| 30 | + ColumnSchemas []ColumnSchema `json:"columnSchemas"` | ||
| 31 | + SortParameters map[string]interface{} `json:"sortParameters"` | ||
| 35 | } | 32 | } |
| 36 | 33 | ||
| 37 | DataLoadDataTable struct { | 34 | DataLoadDataTable struct { |
| @@ -50,14 +47,6 @@ type ( | @@ -50,14 +47,6 @@ type ( | ||
| 50 | ColumnContents []string `json:"columnContents"` | 47 | ColumnContents []string `json:"columnContents"` |
| 51 | IsContainContent bool `json:"isContainContent"` | 48 | IsContainContent bool `json:"isContainContent"` |
| 52 | } | 49 | } |
| 53 | - //Field struct { | ||
| 54 | - // // 索引序号 | ||
| 55 | - // Index int `json:"index"` | ||
| 56 | - // // 名称 | ||
| 57 | - // Name string `json:"name"` | ||
| 58 | - // // 对应数据库类型 | ||
| 59 | - // Type string `json:"sqlType"` | ||
| 60 | - //} | ||
| 61 | 50 | ||
| 62 | InValidCell struct { | 51 | InValidCell struct { |
| 63 | Col string `json:"col"` | 52 | Col string `json:"col"` |
| @@ -157,11 +146,6 @@ type ( | @@ -157,11 +146,6 @@ type ( | ||
| 157 | MainTable *Table | 146 | MainTable *Table |
| 158 | Table *Table | 147 | Table *Table |
| 159 | CopyToTable *Table | 148 | CopyToTable *Table |
| 160 | - | ||
| 161 | - // 数据列 | ||
| 162 | - //DataFields []*Field `json:"dataFields"` | ||
| 163 | - // 手动添加的列 | ||
| 164 | - //ManualFields []*Field `json:"manualFields"` | ||
| 165 | } | 149 | } |
| 166 | 150 | ||
| 167 | DataCopyTable struct { | 151 | DataCopyTable struct { |
| @@ -249,32 +233,13 @@ func ToFields(fields []*Field) []*Field { | @@ -249,32 +233,13 @@ func ToFields(fields []*Field) []*Field { | ||
| 249 | return result | 233 | return result |
| 250 | } | 234 | } |
| 251 | 235 | ||
| 252 | -//func ToFieldData(fields []*Field, data [][]string, byteName bool) []map[string]string { | ||
| 253 | -// var result = make([]map[string]string, 0) | ||
| 254 | -// var key string | ||
| 255 | -// for _, d := range data { | ||
| 256 | -// var item = make(map[string]string) | ||
| 257 | -// for j, f := range fields { | ||
| 258 | -// key = f.Name | ||
| 259 | -// if byteName { | ||
| 260 | -// key = f.Name | ||
| 261 | -// } | ||
| 262 | -// if len(d) >= j { | ||
| 263 | -// item[key] = d[j] | ||
| 264 | -// } else { | ||
| 265 | -// item[key] = "" | ||
| 266 | -// } | ||
| 267 | -// } | ||
| 268 | -// result = append(result, item) | ||
| 269 | -// } | ||
| 270 | -// return result | ||
| 271 | -//} | ||
| 272 | - | ||
| 273 | type ( | 236 | type ( |
| 274 | ReqFormulasGenerate struct { | 237 | ReqFormulasGenerate struct { |
| 275 | QuerySet *QuerySet | 238 | QuerySet *QuerySet |
| 276 | Table *Table | 239 | Table *Table |
| 277 | QueryComponents []*QueryComponent | 240 | QueryComponents []*QueryComponent |
| 241 | + QuerySetService interface{} | ||
| 242 | + Context interface{} | ||
| 278 | } | 243 | } |
| 279 | 244 | ||
| 280 | DataFormulasGenerate struct { | 245 | DataFormulasGenerate struct { |
| @@ -9,7 +9,7 @@ type Context struct { | @@ -9,7 +9,7 @@ type Context struct { | ||
| 9 | OperatorName string `json:"operatorName"` | 9 | OperatorName string `json:"operatorName"` |
| 10 | // 租户 (个人、企业) | 10 | // 租户 (个人、企业) |
| 11 | TenantId int `json:"tenantId"` | 11 | TenantId int `json:"tenantId"` |
| 12 | - | 12 | + // 附加数据 |
| 13 | data map[string]interface{} | 13 | data map[string]interface{} |
| 14 | } | 14 | } |
| 15 | 15 |
| 1 | package domain | 1 | package domain |
| 2 | 2 | ||
| 3 | +import "strings" | ||
| 4 | + | ||
| 3 | type DataTable struct { | 5 | type DataTable struct { |
| 4 | Fields []*Field `json:"fields"` | 6 | Fields []*Field `json:"fields"` |
| 5 | Data [][]string `json:"data"` | 7 | Data [][]string `json:"data"` |
| @@ -51,19 +53,28 @@ type Condition struct { | @@ -51,19 +53,28 @@ type Condition struct { | ||
| 51 | Order string `json:"order"` | 53 | Order string `json:"order"` |
| 52 | } | 54 | } |
| 53 | 55 | ||
| 54 | -func (t *DataTable) OptionalValue() []string { | ||
| 55 | - //set := make(map[string]string) | 56 | +func (t *DataTable) OptionalValue(args ...string) []string { |
| 56 | var values = make([]string, 0) | 57 | var values = make([]string, 0) |
| 58 | + match := "" | ||
| 59 | + filedType := "" | ||
| 60 | + if len(args) > 0 { | ||
| 61 | + match = args[0] | ||
| 62 | + } | ||
| 63 | + if len(args) > 1 { | ||
| 64 | + filedType = args[1] | ||
| 65 | + } | ||
| 57 | if len(t.Data) > 0 && len(t.Data[0]) == 1 { | 66 | if len(t.Data) > 0 && len(t.Data[0]) == 1 { |
| 58 | for i := range t.Data { | 67 | for i := range t.Data { |
| 59 | if len(t.Data[i]) == 0 { | 68 | if len(t.Data[i]) == 0 { |
| 60 | continue | 69 | continue |
| 61 | } | 70 | } |
| 62 | - //if _, ok := set[t.Data[i][0]]; ok { | ||
| 63 | - // continue | ||
| 64 | - //} else { | ||
| 65 | - // set[t.Data[i][0]] = "" | ||
| 66 | - //} | 71 | + if len(match) > 0 && !strings.Contains(t.Data[i][0], match) { |
| 72 | + continue | ||
| 73 | + } | ||
| 74 | + if filedType == Float.ToString() { | ||
| 75 | + values = append(values, RoundFieldValue(&Field{SQLType: filedType}, t.Data[i][0])) | ||
| 76 | + continue | ||
| 77 | + } | ||
| 67 | values = append(values, t.Data[i][0]) | 78 | values = append(values, t.Data[i][0]) |
| 68 | } | 79 | } |
| 69 | } | 80 | } |
| @@ -85,7 +96,7 @@ func (t *DataTable) Values(f *Field) []string { | @@ -85,7 +96,7 @@ func (t *DataTable) Values(f *Field) []string { | ||
| 85 | for i := range t.Data { | 96 | for i := range t.Data { |
| 86 | for j := range t.Data[i] { | 97 | for j := range t.Data[i] { |
| 87 | if j == index { | 98 | if j == index { |
| 88 | - res = append(res, t.Data[i][j]) | 99 | + res = append(res, RoundFieldValue(f, t.Data[i][j])) |
| 89 | break | 100 | break |
| 90 | } | 101 | } |
| 91 | } | 102 | } |
| @@ -121,21 +121,24 @@ var ( | @@ -121,21 +121,24 @@ var ( | ||
| 121 | ) | 121 | ) |
| 122 | 122 | ||
| 123 | var ( | 123 | var ( |
| 124 | - String SQLType = "STRING" | ||
| 125 | - Int SQLType = "INT" | ||
| 126 | - BigInt SQLType = "BIGINT" | ||
| 127 | - Float SQLType = "FLOAT" | ||
| 128 | - Date SQLType = "DATE" | ||
| 129 | - Datetime SQLType = "DATETIME" | 124 | + String SQLType = "STRING" |
| 125 | + Int SQLType = "INT" | ||
| 126 | + BigInt SQLType = "BIGINT" | ||
| 127 | + Float SQLType = "FLOAT" | ||
| 128 | + DECIMALV2 SQLType = "DECIMAL(20,15)" //"DECIMALV2" | ||
| 129 | + DECIMAL279 SQLType = "DECIMAL(20,15)" | ||
| 130 | + Date SQLType = "DATE" | ||
| 131 | + Datetime SQLType = "DATETIME" | ||
| 130 | ) | 132 | ) |
| 131 | 133 | ||
| 132 | var SQLTypeMap = map[string]string{ | 134 | var SQLTypeMap = map[string]string{ |
| 133 | - String.ToString(): "文本", | ||
| 134 | - Int.ToString(): "整数", | ||
| 135 | - BigInt.ToString(): "整数", | ||
| 136 | - Float.ToString(): "小数", | ||
| 137 | - Date.ToString(): "日期", | ||
| 138 | - Datetime.ToString(): "日期时间", | 135 | + String.ToString(): "文本", |
| 136 | + Int.ToString(): "整数", | ||
| 137 | + BigInt.ToString(): "整数", | ||
| 138 | + Float.ToString(): "小数", | ||
| 139 | + DECIMALV2.ToString(): "小数", | ||
| 140 | + Date.ToString(): "日期", | ||
| 141 | + Datetime.ToString(): "日期时间", | ||
| 139 | } | 142 | } |
| 140 | 143 | ||
| 141 | type FileType string | 144 | type FileType string |
| @@ -4,6 +4,7 @@ import ( | @@ -4,6 +4,7 @@ import ( | ||
| 4 | "fmt" | 4 | "fmt" |
| 5 | "github.com/linmadan/egglib-go/utils/xtime" | 5 | "github.com/linmadan/egglib-go/utils/xtime" |
| 6 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" | 6 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" |
| 7 | + "strconv" | ||
| 7 | "strings" | 8 | "strings" |
| 8 | ) | 9 | ) |
| 9 | 10 | ||
| @@ -185,6 +186,16 @@ func ValueToType(value string, sqlType string) (interface{}, error) { | @@ -185,6 +186,16 @@ func ValueToType(value string, sqlType string) (interface{}, error) { | ||
| 185 | if err != nil { | 186 | if err != nil { |
| 186 | err = fmt.Errorf("[%v]不是有效的浮点数类型", value) | 187 | err = fmt.Errorf("[%v]不是有效的浮点数类型", value) |
| 187 | } | 188 | } |
| 189 | + case DECIMALV2.ToString(): | ||
| 190 | + toTypeVal, err = numberString.Float64() | ||
| 191 | + if err != nil { | ||
| 192 | + err = fmt.Errorf("[%v]不是有效的浮点数类型", value) | ||
| 193 | + } | ||
| 194 | + case DECIMAL279.ToString(): | ||
| 195 | + toTypeVal, err = numberString.Float64() | ||
| 196 | + if err != nil { | ||
| 197 | + err = fmt.Errorf("[%v]不是有效的浮点数类型", value) | ||
| 198 | + } | ||
| 188 | case Date.ToString(): | 199 | case Date.ToString(): |
| 189 | toTypeVal, err = xtime.Parse(value) | 200 | toTypeVal, err = xtime.Parse(value) |
| 190 | if err != nil { | 201 | if err != nil { |
| @@ -203,9 +214,13 @@ func ValueToType(value string, sqlType string) (interface{}, error) { | @@ -203,9 +214,13 @@ func ValueToType(value string, sqlType string) (interface{}, error) { | ||
| 203 | return toTypeVal, err | 214 | return toTypeVal, err |
| 204 | } | 215 | } |
| 205 | 216 | ||
| 206 | -func ToFieldData(fields []*Field, data [][]string, byName bool) []map[string]string { | 217 | +func ToFieldData(fields []*Field, data [][]string, byName bool, configs ...bool) []map[string]string { |
| 207 | var result = make([]map[string]string, 0) | 218 | var result = make([]map[string]string, 0) |
| 208 | var key string | 219 | var key string |
| 220 | + var ignoreEmptyString = false | ||
| 221 | + if len(configs) > 0 { | ||
| 222 | + ignoreEmptyString = configs[0] | ||
| 223 | + } | ||
| 209 | for _, d := range data { | 224 | for _, d := range data { |
| 210 | var item = make(map[string]string) | 225 | var item = make(map[string]string) |
| 211 | for j, f := range fields { | 226 | for j, f := range fields { |
| @@ -213,8 +228,12 @@ func ToFieldData(fields []*Field, data [][]string, byName bool) []map[string]str | @@ -213,8 +228,12 @@ func ToFieldData(fields []*Field, data [][]string, byName bool) []map[string]str | ||
| 213 | if byName { | 228 | if byName { |
| 214 | key = f.Name | 229 | key = f.Name |
| 215 | } | 230 | } |
| 231 | + if ignoreEmptyString && len(d[j]) == 0 { | ||
| 232 | + continue | ||
| 233 | + } | ||
| 216 | if len(d) >= j { | 234 | if len(d) >= j { |
| 217 | - item[key] = d[j] | 235 | + // 处理精度问题 |
| 236 | + item[key] = RoundFieldValue(f, d[j]) //d[j] | ||
| 218 | } else { | 237 | } else { |
| 219 | item[key] = "" | 238 | item[key] = "" |
| 220 | } | 239 | } |
| @@ -224,6 +243,35 @@ func ToFieldData(fields []*Field, data [][]string, byName bool) []map[string]str | @@ -224,6 +243,35 @@ func ToFieldData(fields []*Field, data [][]string, byName bool) []map[string]str | ||
| 224 | return result | 243 | return result |
| 225 | } | 244 | } |
| 226 | 245 | ||
| 246 | +// RoundFieldValue 字段值精度处理 | ||
| 247 | +func RoundFieldValue(f *Field, v string) string { | ||
| 248 | + if f.SQLType == Float.ToString() { | ||
| 249 | + fv, err := strconv.ParseFloat(v, 64) | ||
| 250 | + if err != nil { | ||
| 251 | + return v | ||
| 252 | + } | ||
| 253 | + return fmt.Sprintf("%v", fv) | ||
| 254 | + } | ||
| 255 | + return v | ||
| 256 | + //if f.SQLType != DECIMALV2.ToString() { | ||
| 257 | + // return v | ||
| 258 | + //} | ||
| 259 | + //fv, err := strconv.ParseFloat(v, 64) | ||
| 260 | + //if err != nil { | ||
| 261 | + // return v | ||
| 262 | + //} | ||
| 263 | + //fv = utils.Round(fv, 6) | ||
| 264 | + //return fmt.Sprintf("%v", fv) | ||
| 265 | +} | ||
| 266 | + | ||
| 267 | +func RoundValue(v string) string { | ||
| 268 | + fv, err := strconv.ParseFloat(v, 64) | ||
| 269 | + if err != nil { | ||
| 270 | + return v | ||
| 271 | + } | ||
| 272 | + return fmt.Sprintf("%v", fv) | ||
| 273 | +} | ||
| 274 | + | ||
| 227 | func GripData(data []map[string]string, total int64) map[string]interface{} { | 275 | func GripData(data []map[string]string, total int64) map[string]interface{} { |
| 228 | if len(data) == 0 { | 276 | if len(data) == 0 { |
| 229 | data = make([]map[string]string, 0) | 277 | data = make([]map[string]string, 0) |
| @@ -250,6 +298,10 @@ func MakeToInterfaces(fields []*Field) func([]string) []interface{} { | @@ -250,6 +298,10 @@ func MakeToInterfaces(fields []*Field) func([]string) []interface{} { | ||
| 250 | output := make([]interface{}, len(input)) | 298 | output := make([]interface{}, len(input)) |
| 251 | for i, v := range input { | 299 | for i, v := range input { |
| 252 | if i < len(fields) { | 300 | if i < len(fields) { |
| 301 | + // 处理精度问题 | ||
| 302 | + if fields[i].SQLType == Float.ToString() { | ||
| 303 | + v = RoundFieldValue(fields[i], v) | ||
| 304 | + } | ||
| 253 | convValue, err := ValueToType(v, fields[i].SQLType) | 305 | convValue, err := ValueToType(v, fields[i].SQLType) |
| 254 | if err == nil { | 306 | if err == nil { |
| 255 | output[i] = convValue | 307 | output[i] = convValue |
pkg/domain/field_test.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/stretchr/testify/assert" | ||
| 5 | + "testing" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func TestRoundFieldValue(t *testing.T) { | ||
| 9 | + floatFiled := &Field{ | ||
| 10 | + SQLType: Float.ToString(), | ||
| 11 | + } | ||
| 12 | + inputs := []struct { | ||
| 13 | + v string | ||
| 14 | + f *Field | ||
| 15 | + want string | ||
| 16 | + }{ | ||
| 17 | + { | ||
| 18 | + v: "0.12359999999999999", | ||
| 19 | + f: floatFiled, | ||
| 20 | + want: "0.1236", | ||
| 21 | + }, | ||
| 22 | + { | ||
| 23 | + v: "0.12360000000000001", | ||
| 24 | + f: floatFiled, | ||
| 25 | + want: "0.1236", | ||
| 26 | + }, | ||
| 27 | + { | ||
| 28 | + v: "0.12359999999999995", | ||
| 29 | + f: floatFiled, | ||
| 30 | + want: "0.1236", | ||
| 31 | + }, | ||
| 32 | + } | ||
| 33 | + for _, input := range inputs { | ||
| 34 | + got := RoundFieldValue(input.f, input.v) | ||
| 35 | + assert.Equal(t, input.want, got) | ||
| 36 | + } | ||
| 37 | +} |
| 1 | package domain | 1 | package domain |
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | + "path" | ||
| 4 | "path/filepath" | 5 | "path/filepath" |
| 5 | - "strings" | ||
| 6 | "time" | 6 | "time" |
| 7 | ) | 7 | ) |
| 8 | 8 | ||
| @@ -16,8 +16,6 @@ type File struct { | @@ -16,8 +16,6 @@ type File struct { | ||
| 16 | FileInfo *FileInfo `json:"fileInfo"` | 16 | FileInfo *FileInfo `json:"fileInfo"` |
| 17 | // 源文件Id(FileType为TemporaryFile或VerifiedFile时有值) | 17 | // 源文件Id(FileType为TemporaryFile或VerifiedFile时有值) |
| 18 | SourceFileId int `json:"sourceFileId"` | 18 | SourceFileId int `json:"sourceFileId"` |
| 19 | - // 操作人 | ||
| 20 | - // Operator string `json:"operator"` | ||
| 21 | // 创建时间 | 19 | // 创建时间 |
| 22 | CreatedAt time.Time `json:"createdAt"` | 20 | CreatedAt time.Time `json:"createdAt"` |
| 23 | // 更新时间 | 21 | // 更新时间 |
| @@ -60,8 +58,13 @@ func (file *File) Update(data map[string]interface{}) error { | @@ -60,8 +58,13 @@ func (file *File) Update(data map[string]interface{}) error { | ||
| 60 | } | 58 | } |
| 61 | 59 | ||
| 62 | func FileName(fileName string) string { | 60 | func FileName(fileName string) string { |
| 61 | + if len(fileName) == 0 { | ||
| 62 | + return "" | ||
| 63 | + } | ||
| 63 | base := filepath.Base(fileName) | 64 | base := filepath.Base(fileName) |
| 64 | - return strings.Split(base, ".")[0] | 65 | + suffix := path.Ext(fileName) |
| 66 | + prefix := base[0 : len(base)-len(suffix)] | ||
| 67 | + return prefix | ||
| 65 | } | 68 | } |
| 66 | 69 | ||
| 67 | func (file *File) CopyTo(fileType FileType, ctx *Context) *File { | 70 | func (file *File) CopyTo(fileType FileType, ctx *Context) *File { |
| @@ -78,8 +81,7 @@ func (file *File) CopyTo(fileType FileType, ctx *Context) *File { | @@ -78,8 +81,7 @@ func (file *File) CopyTo(fileType FileType, ctx *Context) *File { | ||
| 78 | CreatedAt: time.Now(), | 81 | CreatedAt: time.Now(), |
| 79 | UpdatedAt: time.Now(), | 82 | UpdatedAt: time.Now(), |
| 80 | SourceFileId: file.FileId, | 83 | SourceFileId: file.FileId, |
| 81 | - //Operator: file.Operator, | ||
| 82 | - Context: ctx, | 84 | + Context: ctx, |
| 83 | } | 85 | } |
| 84 | return t | 86 | return t |
| 85 | } | 87 | } |
| @@ -8,8 +8,6 @@ type FileInfo struct { | @@ -8,8 +8,6 @@ type FileInfo struct { | ||
| 8 | Url string `json:"url"` | 8 | Url string `json:"url"` |
| 9 | // 文件大小 | 9 | // 文件大小 |
| 10 | FileSize int `json:"fileSize"` | 10 | FileSize int `json:"fileSize"` |
| 11 | - // 文件编号,以固定字符“F”+4位年+2位月+2位日+三位流水,每天编号从001开始 | ||
| 12 | - // FileCode string `json:"fileCode"` | ||
| 13 | // 后缀扩展 | 11 | // 后缀扩展 |
| 14 | Ext string `json:"ext"` | 12 | Ext string `json:"ext"` |
| 15 | // 记录数 | 13 | // 记录数 |
pkg/domain/file_test.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "github.com/stretchr/testify/assert" | ||
| 5 | + "testing" | ||
| 6 | +) | ||
| 7 | + | ||
| 8 | +func TestFileName(t *testing.T) { | ||
| 9 | + inputs := []struct { | ||
| 10 | + input string | ||
| 11 | + want string | ||
| 12 | + }{ | ||
| 13 | + { | ||
| 14 | + input: "device/sdk/CMakeLists.txt", | ||
| 15 | + want: "CMakeLists", | ||
| 16 | + }, | ||
| 17 | + { | ||
| 18 | + input: "", | ||
| 19 | + want: "", | ||
| 20 | + }, | ||
| 21 | + { | ||
| 22 | + input: "CMakeLists.txt", | ||
| 23 | + want: "CMakeLists", | ||
| 24 | + }, | ||
| 25 | + { | ||
| 26 | + input: "d:\\CMakeLists.txt", | ||
| 27 | + want: "CMakeLists", | ||
| 28 | + }, | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + for _, input := range inputs { | ||
| 32 | + got := FileName(input.input) | ||
| 33 | + assert.Equal(t, input.want, got) | ||
| 34 | + } | ||
| 35 | +} |
| @@ -45,6 +45,5 @@ func (log *Log) Identify() interface{} { | @@ -45,6 +45,5 @@ func (log *Log) Identify() interface{} { | ||
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | func (log *Log) Update(data map[string]interface{}) error { | 47 | func (log *Log) Update(data map[string]interface{}) error { |
| 48 | - | ||
| 49 | return nil | 48 | return nil |
| 50 | } | 49 | } |
| @@ -2,7 +2,7 @@ package domain | @@ -2,7 +2,7 @@ package domain | ||
| 2 | 2 | ||
| 3 | import "time" | 3 | import "time" |
| 4 | 4 | ||
| 5 | -// 匹配规则配置 | 5 | +// MappingRule 匹配规则配置 |
| 6 | type MappingRule struct { | 6 | type MappingRule struct { |
| 7 | // 匹配规则ID | 7 | // 匹配规则ID |
| 8 | MappingRuleId int `json:"mappingRuleId"` | 8 | MappingRuleId int `json:"mappingRuleId"` |
| @@ -53,7 +53,6 @@ type MappingField struct { | @@ -53,7 +53,6 @@ type MappingField struct { | ||
| 53 | 53 | ||
| 54 | func NewMappingFields(all []*Field, some []*Field) []*MappingField { | 54 | func NewMappingFields(all []*Field, some []*Field) []*MappingField { |
| 55 | var result []*MappingField | 55 | var result []*MappingField |
| 56 | - //allMap :=(Fields)(all).ToMap() | ||
| 57 | someMap := (Fields)(some).ToMap() | 56 | someMap := (Fields)(some).ToMap() |
| 58 | for _, f := range all { | 57 | for _, f := range all { |
| 59 | item := &MappingField{ | 58 | item := &MappingField{ |
| @@ -76,7 +76,6 @@ type SelectExpr struct { // 查询表达式 | @@ -76,7 +76,6 @@ type SelectExpr struct { // 查询表达式 | ||
| 76 | FieldLeft FieldExpr `json:"fieldLeft"` | 76 | FieldLeft FieldExpr `json:"fieldLeft"` |
| 77 | FieldRight FieldExpr `json:"fieldRight"` // has value when type is equal to 1 | 77 | FieldRight FieldExpr `json:"fieldRight"` // has value when type is equal to 1 |
| 78 | Type string `json:"type"` // 1.拆分 2.拆方赋值 3.正常赋值 | 78 | Type string `json:"type"` // 1.拆分 2.拆方赋值 3.正常赋值 |
| 79 | - //SubGroup []SelectExpr `json:"subGroup,omitempty"` | ||
| 80 | } | 79 | } |
| 81 | 80 | ||
| 82 | func (s SelectExpr) Equal(compare SelectExpr) bool { | 81 | func (s SelectExpr) Equal(compare SelectExpr) bool { |
| @@ -94,7 +93,6 @@ type SelectExprGroup struct { // 查询表达式 | @@ -94,7 +93,6 @@ type SelectExprGroup struct { // 查询表达式 | ||
| 94 | } | 93 | } |
| 95 | 94 | ||
| 96 | type FieldExpr struct { | 95 | type FieldExpr struct { |
| 97 | - //LabelColumns []LabelColumn `json:"labelColumns"` | ||
| 98 | TableFields []TableField `json:"tableFields"` | 96 | TableFields []TableField `json:"tableFields"` |
| 99 | ExprHuman string `json:"exprHuman"` | 97 | ExprHuman string `json:"exprHuman"` |
| 100 | ExprSql string `json:"exprSql"` | 98 | ExprSql string `json:"exprSql"` |
| @@ -104,15 +102,11 @@ func (expr *FieldExpr) Complete() string { | @@ -104,15 +102,11 @@ func (expr *FieldExpr) Complete() string { | ||
| 104 | exprSql := expr.ExprSql | 102 | exprSql := expr.ExprSql |
| 105 | for _, f := range expr.TableFields { | 103 | for _, f := range expr.TableFields { |
| 106 | sql := fmt.Sprintf("%s.%s", f.TableSqlName, f.FieldSqlName) | 104 | sql := fmt.Sprintf("%s.%s", f.TableSqlName, f.FieldSqlName) |
| 107 | - //zhSql := fmt.Sprintf("%s.%s", f.TableName, f.FieldSqlName) | ||
| 108 | sub := fmt.Sprintf("max(%s.%s)", f.TableSqlName, f.FieldSqlName) | 105 | sub := fmt.Sprintf("max(%s.%s)", f.TableSqlName, f.FieldSqlName) |
| 109 | - //zhSub := fmt.Sprintf("max(%s.%s)", f.TableName, f.FieldSqlName) | ||
| 110 | if strings.Contains(expr.ExprSql, fmt.Sprintf("(%s)", sql)) { | 106 | if strings.Contains(expr.ExprSql, fmt.Sprintf("(%s)", sql)) { |
| 111 | continue | 107 | continue |
| 112 | } | 108 | } |
| 113 | exprSql = strings.ReplaceAll(exprSql, sql, sub) | 109 | exprSql = strings.ReplaceAll(exprSql, sql, sub) |
| 114 | - //expr.ExprSql = strings.ReplaceAll(expr.ExprSql, sql, sub) | ||
| 115 | - //expr.ExprHuman = strings.ReplaceAll(expr.ExprHuman, zhSql, zhSub) | ||
| 116 | } | 110 | } |
| 117 | return exprSql | 111 | return exprSql |
| 118 | } | 112 | } |
| @@ -227,3 +221,20 @@ func SelectsExprToMapById(items []SelectExpr) map[string]SelectExpr { | @@ -227,3 +221,20 @@ func SelectsExprToMapById(items []SelectExpr) map[string]SelectExpr { | ||
| 227 | } | 221 | } |
| 228 | return res | 222 | return res |
| 229 | } | 223 | } |
| 224 | + | ||
| 225 | +type QueryComponents []*QueryComponent | ||
| 226 | + | ||
| 227 | +func (list QueryComponents) IsEmpty(t TableType) bool { | ||
| 228 | + if len(list) == 0 { | ||
| 229 | + return true | ||
| 230 | + } | ||
| 231 | + for _, q := range list { | ||
| 232 | + switch t { | ||
| 233 | + case CalculateTable: | ||
| 234 | + if q.Aggregation != nil && len(q.Aggregation.RowFields) == 0 && len(q.Aggregation.ValueFields) == 0 { | ||
| 235 | + return true | ||
| 236 | + } | ||
| 237 | + } | ||
| 238 | + } | ||
| 239 | + return false | ||
| 240 | +} |
| 1 | package domain | 1 | package domain |
| 2 | 2 | ||
| 3 | +import ( | ||
| 4 | + "github.com/zeromicro/go-zero/core/collection" | ||
| 5 | + "sort" | ||
| 6 | + "strings" | ||
| 7 | +) | ||
| 8 | + | ||
| 3 | const ( | 9 | const ( |
| 4 | CellTypeTable = "Table" | 10 | CellTypeTable = "Table" |
| 5 | CellTypeTableField = "TableField" | 11 | CellTypeTableField = "TableField" |
| @@ -38,24 +44,12 @@ type Location struct { | @@ -38,24 +44,12 @@ type Location struct { | ||
| 38 | } | 44 | } |
| 39 | 45 | ||
| 40 | type LayoutCellData struct { | 46 | type LayoutCellData struct { |
| 41 | - //Table *Table `json:"table,omitempty"` | ||
| 42 | - //Field *Field `json:"field,omitempty"` | ||
| 43 | TableField *TableField `json:"tableField"` | 47 | TableField *TableField `json:"tableField"` |
| 44 | Text string `json:"text,omitempty"` | 48 | Text string `json:"text,omitempty"` |
| 45 | } | 49 | } |
| 46 | 50 | ||
| 47 | func (l *LayoutRuleItem) LayoutCells() []*LayoutCell { | 51 | func (l *LayoutRuleItem) LayoutCells() []*LayoutCell { |
| 48 | var cells = make([]*LayoutCell, 0) | 52 | var cells = make([]*LayoutCell, 0) |
| 49 | - //for i, rows := range l.Cells { | ||
| 50 | - // for j, item := range rows { | ||
| 51 | - // if item.Type == CellTypeNull || item.Type == "" { | ||
| 52 | - // continue | ||
| 53 | - // } | ||
| 54 | - // item.X = i | ||
| 55 | - // item.Y = j | ||
| 56 | - // cells = append(cells, item) | ||
| 57 | - // } | ||
| 58 | - //} | ||
| 59 | for _, item := range l.Cells { | 53 | for _, item := range l.Cells { |
| 60 | item.X = item.Position.X | 54 | item.X = item.Position.X |
| 61 | item.Y = item.Position.Y | 55 | item.Y = item.Position.Y |
| @@ -63,3 +57,19 @@ func (l *LayoutRuleItem) LayoutCells() []*LayoutCell { | @@ -63,3 +57,19 @@ func (l *LayoutRuleItem) LayoutCells() []*LayoutCell { | ||
| 63 | } | 57 | } |
| 64 | return cells | 58 | return cells |
| 65 | } | 59 | } |
| 60 | + | ||
| 61 | +type LayoutCells []*LayoutCell | ||
| 62 | + | ||
| 63 | +func (cells LayoutCells) CellsRange(direction string) []int { | ||
| 64 | + list := collection.NewSet() | ||
| 65 | + for i := range cells { | ||
| 66 | + if strings.ToLower(direction) == "x" { | ||
| 67 | + list.Add(cells[i].X) | ||
| 68 | + } else { | ||
| 69 | + list.Add(cells[i].Y) | ||
| 70 | + } | ||
| 71 | + } | ||
| 72 | + sortList := list.KeysInt() | ||
| 73 | + sort.Ints(sortList) | ||
| 74 | + return sortList | ||
| 75 | +} |
| @@ -67,16 +67,39 @@ func (table *Table) TableIdString() string { | @@ -67,16 +67,39 @@ func (table *Table) TableIdString() string { | ||
| 67 | 67 | ||
| 68 | func (table *Table) WithContext(ctx *Context) *Table { | 68 | func (table *Table) WithContext(ctx *Context) *Table { |
| 69 | rand.Seed(time.Now().Unix()) | 69 | rand.Seed(time.Now().Unix()) |
| 70 | - table.SQLName = fmt.Sprintf("%v_t%v_c%v", table.SQLName, rand.Intn(1000000), ctx.CompanyId) | 70 | + table.SQLName = fmt.Sprintf("%v_t%v_c%v", limitStringLen(table.SQLName, 40), rand.Intn(1000000), limitStringLen(fmt.Sprintf("%d", ctx.CompanyId), 8)) |
| 71 | table.Context = ctx | 71 | table.Context = ctx |
| 72 | return table | 72 | return table |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | +func limitStringLen(s string, l int) string { | ||
| 76 | + result := s | ||
| 77 | + subLength := l / 2 | ||
| 78 | + if len(result) > l { | ||
| 79 | + result = result[:subLength] + result[len(result)-subLength:] | ||
| 80 | + } | ||
| 81 | + return result | ||
| 82 | +} | ||
| 83 | + | ||
| 75 | func (table *Table) WithPrefix(prefix string) *Table { | 84 | func (table *Table) WithPrefix(prefix string) *Table { |
| 85 | + if strings.HasPrefix(table.SQLName, "_") { | ||
| 86 | + table.SQLName = fmt.Sprintf("%v%v", strings.ToLower(prefix), table.SQLName) | ||
| 87 | + return table | ||
| 88 | + } | ||
| 76 | table.SQLName = fmt.Sprintf("%v_%v", strings.ToLower(prefix), table.SQLName) | 89 | table.SQLName = fmt.Sprintf("%v_%v", strings.ToLower(prefix), table.SQLName) |
| 77 | return table | 90 | return table |
| 78 | } | 91 | } |
| 79 | 92 | ||
| 93 | +func (table *Table) ApplyDefaultModule() *Table { | ||
| 94 | + if table.TableType == CalculateTable.ToString() || table.TableType == SubProcessTable.ToString() { | ||
| 95 | + table.TableInfo.SetApplyOn(ModuleQuerySetCenter) | ||
| 96 | + } | ||
| 97 | + if table.TableType == SchemaTable.ToString() { | ||
| 98 | + table.TableInfo.SetApplyOn(ModuleQuerySetCenter | ModuleCalculateCenter) | ||
| 99 | + } | ||
| 100 | + return table | ||
| 101 | +} | ||
| 102 | + | ||
| 80 | func (table *Table) WithParentId(parentId int) *Table { | 103 | func (table *Table) WithParentId(parentId int) *Table { |
| 81 | table.ParentId = parentId | 104 | table.ParentId = parentId |
| 82 | return table | 105 | return table |
| @@ -91,44 +114,52 @@ func (table *Table) Update(data map[string]interface{}) error { | @@ -91,44 +114,52 @@ func (table *Table) Update(data map[string]interface{}) error { | ||
| 91 | return nil | 114 | return nil |
| 92 | } | 115 | } |
| 93 | 116 | ||
| 94 | -func (t *Table) Fields(includePK bool) []*Field { | 117 | +func (table *Table) Fields(includePK bool) []*Field { |
| 95 | var fields []*Field | 118 | var fields []*Field |
| 96 | 119 | ||
| 97 | - if includePK && t.PK != nil { | ||
| 98 | - fields = append(fields, t.PK) | 120 | + if includePK && table.PK != nil { |
| 121 | + fields = append(fields, table.PK) | ||
| 99 | } | 122 | } |
| 100 | - fields = append(fields, t.DataFields...) | ||
| 101 | - if t.TableType == SubTable.ToString() { | ||
| 102 | - fields = append(fields, t.ManualFields...) | 123 | + fields = append(fields, table.DataFields...) |
| 124 | + if table.TableType == SubTable.ToString() { | ||
| 125 | + fields = append(fields, table.ManualFields...) | ||
| 103 | } | 126 | } |
| 104 | - t.fields = fields | 127 | + table.fields = fields |
| 105 | 128 | ||
| 106 | - return t.fields | 129 | + return table.fields |
| 107 | } | 130 | } |
| 108 | 131 | ||
| 109 | -func (t *Table) MatchField(field *Field) (*Field, bool) { | ||
| 110 | - if len(t.fields) == 0 { | ||
| 111 | - t.fields = t.Fields(true) | 132 | +func (table *Table) MatchField(field *Field) (*Field, bool) { |
| 133 | + if len(table.fields) == 0 { | ||
| 134 | + table.fields = table.Fields(true) | ||
| 112 | } | 135 | } |
| 113 | - mField := (Fields)(t.fields).ToMap() | 136 | + mField := (Fields)(table.fields).ToMap() |
| 114 | if v, ok := mField[field.Name]; ok { | 137 | if v, ok := mField[field.Name]; ok { |
| 115 | return v, true | 138 | return v, true |
| 116 | } | 139 | } |
| 117 | return nil, false | 140 | return nil, false |
| 118 | } | 141 | } |
| 119 | 142 | ||
| 120 | -func (t *Table) DependencyTables() []int { | ||
| 121 | - if t.TableInfo == nil { | 143 | +func (table *Table) DependencyTables() []int { |
| 144 | + if table.TableInfo == nil { | ||
| 122 | return []int{} | 145 | return []int{} |
| 123 | } | 146 | } |
| 124 | - return t.TableInfo.DependencyTables | 147 | + return table.TableInfo.DependencyTables |
| 125 | } | 148 | } |
| 126 | 149 | ||
| 127 | -func (t *Table) AssertTableType(types ...TableType) bool { | 150 | +func (table *Table) AssertTableType(types ...TableType) bool { |
| 128 | for _, item := range types { | 151 | for _, item := range types { |
| 129 | - if t.TableType == item.ToString() { | 152 | + if table.TableType == item.ToString() { |
| 130 | return true | 153 | return true |
| 131 | } | 154 | } |
| 132 | } | 155 | } |
| 133 | return false | 156 | return false |
| 134 | } | 157 | } |
| 158 | + | ||
| 159 | +func TableTypesToStringList(list ...TableType) []string { | ||
| 160 | + var result = make([]string, 0) | ||
| 161 | + for _, item := range list { | ||
| 162 | + result = append(result, item.ToString()) | ||
| 163 | + } | ||
| 164 | + return result | ||
| 165 | +} |
pkg/domain/table_test.go
0 → 100644
| 1 | +package domain | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "testing" | ||
| 5 | + | ||
| 6 | + "github.com/stretchr/testify/assert" | ||
| 7 | +) | ||
| 8 | + | ||
| 9 | +func TestLimitStringLen(t *testing.T){ | ||
| 10 | + inputs:=[]struct{ | ||
| 11 | + input string | ||
| 12 | + length int | ||
| 13 | + want string | ||
| 14 | + }{ | ||
| 15 | + { | ||
| 16 | + input: "123456789", | ||
| 17 | + length: 6, | ||
| 18 | + want: "123789", | ||
| 19 | + }, | ||
| 20 | + { | ||
| 21 | + input: "123456789", | ||
| 22 | + length: 7, | ||
| 23 | + want: "123789", | ||
| 24 | + }, | ||
| 25 | + { | ||
| 26 | + input: "123456789", | ||
| 27 | + length: 10, | ||
| 28 | + want: "123456789", | ||
| 29 | + }, | ||
| 30 | + { | ||
| 31 | + input: "pai_xu_ce_shi_zhu_biao_fu_zhi", | ||
| 32 | + length: 20, | ||
| 33 | + want: "pai_xu_ce_iao_fu_zhi", | ||
| 34 | + }, | ||
| 35 | + } | ||
| 36 | + for _,input:=range inputs{ | ||
| 37 | + got:=limitStringLen(input.input,input.length) | ||
| 38 | + assert.Equal(t,input.want,got) | ||
| 39 | + } | ||
| 40 | +} |
pkg/infrastructure/api/bytelib/convert.go
0 → 100644
| 1 | +package bytelib | ||
| 2 | + | ||
| 3 | +import "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | ||
| 4 | + | ||
| 5 | +func DomainFieldsToColumnSchemas(fields []*domain.Field) []domain.ColumnSchema { | ||
| 6 | + result := make([]domain.ColumnSchema, 0) | ||
| 7 | + for _, f := range fields { | ||
| 8 | + res := domain.ColumnSchema{ | ||
| 9 | + ColumnName: f.Name, | ||
| 10 | + ColumnType: f.SQLType, | ||
| 11 | + } | ||
| 12 | + if convertFiledSQLType(f.SQLType) { | ||
| 13 | + res.ColumnType = domain.DECIMAL279.ToString() | ||
| 14 | + } | ||
| 15 | + result = append(result, res) | ||
| 16 | + } | ||
| 17 | + return result | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +func ToFieldSchemas(fields []*domain.Field) []FieldSchema { | ||
| 21 | + result := make([]FieldSchema, 0) | ||
| 22 | + for _, f := range fields { | ||
| 23 | + res := FieldSchema{ | ||
| 24 | + FieldZhName: f.Name, | ||
| 25 | + FieldEnName: f.SQLName, | ||
| 26 | + FieldType: f.SQLType, | ||
| 27 | + FieldDescription: f.Description, | ||
| 28 | + IsAllowNull: true, | ||
| 29 | + } | ||
| 30 | + if convertFiledSQLType(f.SQLType) { | ||
| 31 | + res.FieldType = domain.DECIMAL279.ToString() | ||
| 32 | + } | ||
| 33 | + result = append(result, res) | ||
| 34 | + } | ||
| 35 | + return result | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +func NewFieldSchema(f domain.TableField) FieldSchema { | ||
| 39 | + var res = FieldSchema{ | ||
| 40 | + FieldZhName: f.FieldName, | ||
| 41 | + FieldEnName: f.FieldSqlName, | ||
| 42 | + FieldType: f.FieldSQLType, | ||
| 43 | + FieldDescription: "", | ||
| 44 | + IsAllowNull: true, | ||
| 45 | + } | ||
| 46 | + if convertFiledSQLType(f.FieldSQLType) { | ||
| 47 | + res.FieldType = domain.DECIMAL279.ToString() | ||
| 48 | + } | ||
| 49 | + return res | ||
| 50 | +} | ||
| 51 | + | ||
| 52 | +func NewFieldSchemaFromField(f *domain.Field) FieldSchema { | ||
| 53 | + var res = FieldSchema{ | ||
| 54 | + FieldZhName: f.Name, | ||
| 55 | + FieldEnName: f.SQLName, | ||
| 56 | + FieldType: f.SQLType, | ||
| 57 | + FieldDescription: "", | ||
| 58 | + IsAllowNull: true, | ||
| 59 | + } | ||
| 60 | + if convertFiledSQLType(f.SQLType) { | ||
| 61 | + res.FieldType = domain.DECIMAL279.ToString() | ||
| 62 | + } | ||
| 63 | + return res | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +func convertFiledSQLType(sqlType string) bool { | ||
| 67 | + if sqlType == domain.Float.ToString() || sqlType == domain.DECIMAL279.ToString() { | ||
| 68 | + return true | ||
| 69 | + } | ||
| 70 | + return false | ||
| 71 | +} | ||
| 72 | + | ||
| 73 | +func FieldsToColumnSchemas(fields []*domain.Field) []domain.ColumnSchema { | ||
| 74 | + result := make([]domain.ColumnSchema, 0) | ||
| 75 | + | ||
| 76 | + for _, f := range fields { | ||
| 77 | + result = append(result, domain.ColumnSchema{ | ||
| 78 | + ColumnName: f.Name, | ||
| 79 | + ColumnType: f.SQLType, | ||
| 80 | + }) | ||
| 81 | + } | ||
| 82 | + return result | ||
| 83 | +} |
| @@ -96,30 +96,6 @@ type ResponseCheckoutTablesSave struct { | @@ -96,30 +96,6 @@ type ResponseCheckoutTablesSave struct { | ||
| 96 | CheckoutTableUrl string `json:"checkoutTableUrl"` | 96 | CheckoutTableUrl string `json:"checkoutTableUrl"` |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | -func FieldsToColumnSchemas(fields []*domain.Field) []domain.ColumnSchema { | ||
| 100 | - result := make([]domain.ColumnSchema, 0) | ||
| 101 | - | ||
| 102 | - for _, f := range fields { | ||
| 103 | - result = append(result, domain.ColumnSchema{ | ||
| 104 | - ColumnName: f.Name, | ||
| 105 | - ColumnType: f.SQLType, | ||
| 106 | - }) | ||
| 107 | - } | ||
| 108 | - return result | ||
| 109 | -} | ||
| 110 | - | ||
| 111 | -func DomainFieldsToColumnSchemas(fields []*domain.Field) []domain.ColumnSchema { | ||
| 112 | - result := make([]domain.ColumnSchema, 0) | ||
| 113 | - | ||
| 114 | - for _, f := range fields { | ||
| 115 | - result = append(result, domain.ColumnSchema{ | ||
| 116 | - ColumnName: f.Name, | ||
| 117 | - ColumnType: f.SQLType, // domain.String.ToString(), | ||
| 118 | - }) | ||
| 119 | - } | ||
| 120 | - return result | ||
| 121 | -} | ||
| 122 | - | ||
| 123 | func ToDataLoadDataTable(data DataCheckoutTables) *domain.DataLoadDataTable { | 99 | func ToDataLoadDataTable(data DataCheckoutTables) *domain.DataLoadDataTable { |
| 124 | response := &domain.DataLoadDataTable{ | 100 | response := &domain.DataLoadDataTable{ |
| 125 | PageNumber: data.PageNumber, | 101 | PageNumber: data.PageNumber, |
| @@ -181,28 +157,6 @@ func NewRequestCheckoutTablesGenerateMasterTable(param domain.ReqGenerateTable) | @@ -181,28 +157,6 @@ func NewRequestCheckoutTablesGenerateMasterTable(param domain.ReqGenerateTable) | ||
| 181 | return request | 157 | return request |
| 182 | } | 158 | } |
| 183 | 159 | ||
| 184 | -func ToFieldSchemas(fields []*domain.Field) []FieldSchema { | ||
| 185 | - result := make([]FieldSchema, 0) | ||
| 186 | - for _, f := range fields { | ||
| 187 | - result = append(result, FieldSchema{ | ||
| 188 | - FieldZhName: f.Name, | ||
| 189 | - FieldEnName: f.SQLName, | ||
| 190 | - FieldType: f.SQLType, | ||
| 191 | - FieldDescription: f.Description, | ||
| 192 | - IsAllowNull: true, | ||
| 193 | - }) | ||
| 194 | - } | ||
| 195 | - return result | ||
| 196 | -} | ||
| 197 | - | ||
| 198 | -func ToFieldSchemaEnNames(fields []*domain.Field) []string { | ||
| 199 | - result := make([]string, 0) | ||
| 200 | - for _, f := range fields { | ||
| 201 | - result = append(result, f.SQLName) | ||
| 202 | - } | ||
| 203 | - return result | ||
| 204 | -} | ||
| 205 | - | ||
| 206 | type ( | 160 | type ( |
| 207 | TableAppendRequest struct { | 161 | TableAppendRequest struct { |
| 208 | //MasterTableId string `json:"masterTableId"` | 162 | //MasterTableId string `json:"masterTableId"` |
| @@ -243,10 +197,6 @@ func NewTableAppendRequest(param domain.ReqAppendData) TableAppendRequest { | @@ -243,10 +197,6 @@ func NewTableAppendRequest(param domain.ReqAppendData) TableAppendRequest { | ||
| 243 | req.SchemaMap[param.To[i].SQLName] = columnSchemas[i] | 197 | req.SchemaMap[param.To[i].SQLName] = columnSchemas[i] |
| 244 | } | 198 | } |
| 245 | } | 199 | } |
| 246 | - //if len(param.From) > 0 { | ||
| 247 | - // req.ColumnSchemas = DomainFieldsToColumnSchemas(param.From) | ||
| 248 | - // req.FieldSchemas = ToFieldSchemas(param.To) | ||
| 249 | - //} | ||
| 250 | return req | 200 | return req |
| 251 | } | 201 | } |
| 252 | 202 |
| @@ -162,23 +162,23 @@ func NewFormulaCalculate(table *domain.Table, queryComponent *domain.QueryCompon | @@ -162,23 +162,23 @@ func NewFormulaCalculate(table *domain.Table, queryComponent *domain.QueryCompon | ||
| 162 | } | 162 | } |
| 163 | if queryComponent.Aggregation != nil { | 163 | if queryComponent.Aggregation != nil { |
| 164 | res.DatabaseTableName = queryComponent.MasterTable.SQLName | 164 | res.DatabaseTableName = queryComponent.MasterTable.SQLName |
| 165 | - for i, f := range queryComponent.Aggregation.ValueFields { | 165 | + if len(queryComponent.Aggregation.ValueFields) > 0 || len(queryComponent.Aggregation.RowFields) > 0 { |
| 166 | + res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{ | ||
| 167 | + DatabaseTableName: queryComponent.MasterTable.SQLName, | ||
| 168 | + FieldSchema: NewFieldSchemaFromField(&domain.Field{ | ||
| 169 | + Name: "序号", | ||
| 170 | + SQLName: "id", | ||
| 171 | + SQLType: domain.String.ToString(), | ||
| 172 | + }), | ||
| 173 | + CalculateExpression: fmt.Sprintf("max(%s.%s)", queryComponent.MasterTable.SQLName, "id"), | ||
| 174 | + CalculateFieldName: "id", | ||
| 175 | + }) | ||
| 176 | + } | ||
| 177 | + for _, f := range queryComponent.Aggregation.ValueFields { | ||
| 166 | tableField, ok := table.MatchField(&domain.Field{Name: f.DisplayName}) | 178 | tableField, ok := table.MatchField(&domain.Field{Name: f.DisplayName}) |
| 167 | if !ok { | 179 | if !ok { |
| 168 | continue | 180 | continue |
| 169 | } | 181 | } |
| 170 | - if i == 0 { | ||
| 171 | - res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{ | ||
| 172 | - DatabaseTableName: queryComponent.MasterTable.SQLName, | ||
| 173 | - FieldSchema: NewFieldSchemaFromField(&domain.Field{ | ||
| 174 | - Name: "序号", | ||
| 175 | - SQLName: "id", | ||
| 176 | - SQLType: domain.String.ToString(), | ||
| 177 | - }), | ||
| 178 | - CalculateExpression: fmt.Sprintf("max(%s.%s)", queryComponent.MasterTable.SQLName, "id"), | ||
| 179 | - CalculateFieldName: "id", | ||
| 180 | - }) | ||
| 181 | - } | ||
| 182 | res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{ | 182 | res.FormulaCalculateFields = append(res.FormulaCalculateFields, &FormulaCalculateField{ |
| 183 | DatabaseTableName: queryComponent.MasterTable.SQLName, | 183 | DatabaseTableName: queryComponent.MasterTable.SQLName, |
| 184 | FieldSchema: NewFieldSchemaFromField(f.Field), | 184 | FieldSchema: NewFieldSchemaFromField(f.Field), |
| @@ -252,28 +252,6 @@ func NewFormulaField(f domain.FieldExpr, args ...interface{}) FormulaField { | @@ -252,28 +252,6 @@ func NewFormulaField(f domain.FieldExpr, args ...interface{}) FormulaField { | ||
| 252 | return res | 252 | return res |
| 253 | } | 253 | } |
| 254 | 254 | ||
| 255 | -func NewFieldSchema(f domain.TableField) FieldSchema { | ||
| 256 | - var res = FieldSchema{ | ||
| 257 | - FieldZhName: f.FieldName, | ||
| 258 | - FieldEnName: f.FieldSqlName, | ||
| 259 | - FieldType: f.FieldSQLType, | ||
| 260 | - FieldDescription: "", | ||
| 261 | - IsAllowNull: true, | ||
| 262 | - } | ||
| 263 | - return res | ||
| 264 | -} | ||
| 265 | - | ||
| 266 | -func NewFieldSchemaFromField(f *domain.Field) FieldSchema { | ||
| 267 | - var res = FieldSchema{ | ||
| 268 | - FieldZhName: f.Name, | ||
| 269 | - FieldEnName: f.SQLName, | ||
| 270 | - FieldType: f.SQLType, | ||
| 271 | - FieldDescription: "", | ||
| 272 | - IsAllowNull: true, | ||
| 273 | - } | ||
| 274 | - return res | ||
| 275 | -} | ||
| 276 | - | ||
| 277 | func NewFormulaDataHandleRule(s domain.SelectExprGroup) FormulaDataHandleRule { | 255 | func NewFormulaDataHandleRule(s domain.SelectExprGroup) FormulaDataHandleRule { |
| 278 | var res = FormulaDataHandleRule{ | 256 | var res = FormulaDataHandleRule{ |
| 279 | RuleType: 1, | 257 | RuleType: 1, |
| @@ -9,6 +9,7 @@ import ( | @@ -9,6 +9,7 @@ import ( | ||
| 9 | ) | 9 | ) |
| 10 | 10 | ||
| 11 | var DefaultCache = cache.New(12*time.Hour, 1*time.Hour) | 11 | var DefaultCache = cache.New(12*time.Hour, 1*time.Hour) |
| 12 | +var TableCacheExpire = 24 * 60 * 60 * 2 // 两天过期 | ||
| 12 | 13 | ||
| 13 | func KeyCompanyUser(companyId int, userId int) string { | 14 | func KeyCompanyUser(companyId int, userId int) string { |
| 14 | return fmt.Sprintf("local:cache:user:%d:%d", companyId, userId) | 15 | return fmt.Sprintf("local:cache:user:%d:%d", companyId, userId) |
| @@ -26,15 +27,19 @@ func SetDataTable(tableId int, table *domain.DataTable) { | @@ -26,15 +27,19 @@ func SetDataTable(tableId int, table *domain.DataTable) { | ||
| 26 | DefaultDataTableCacheService.SetDataTable(tableId, table) | 27 | DefaultDataTableCacheService.SetDataTable(tableId, table) |
| 27 | } | 28 | } |
| 28 | 29 | ||
| 29 | -var DefaultDataTableCacheService = &DataTableCacheService{} | 30 | +// 1:优化点 redis 一万条数据占用内存 10M 无法大量使用,需要内存+本地文件形式 |
| 31 | +//var DefaultDataTableCacheService DataTableCacheService= &DataTableRedisCacheService{} | ||
| 30 | 32 | ||
| 31 | -type DataTableCacheService struct { | 33 | +var DefaultDataTableCacheService DataTableCacheService = &DataTableLocalCacheService{} |
| 34 | + | ||
| 35 | +type DataTableLocalCacheService struct { | ||
| 32 | } | 36 | } |
| 33 | 37 | ||
| 34 | -func (svr *DataTableCacheService) KeyDataTable(tableId int) string { | 38 | +func (svr *DataTableLocalCacheService) KeyDataTable(tableId int) string { |
| 35 | return fmt.Sprintf("local:cache:table:%d", tableId) | 39 | return fmt.Sprintf("local:cache:table:%d", tableId) |
| 36 | } | 40 | } |
| 37 | -func (svr *DataTableCacheService) GetDataTable(tableId int) (*domain.DataTable, bool) { | 41 | + |
| 42 | +func (svr *DataTableLocalCacheService) GetDataTable(tableId int) (*domain.DataTable, bool) { | ||
| 38 | v, ok := DefaultCache.Get(KeyDataTable(tableId)) | 43 | v, ok := DefaultCache.Get(KeyDataTable(tableId)) |
| 39 | if !ok { | 44 | if !ok { |
| 40 | log.Logger.Info(fmt.Sprintf("【缓存】 miss cache %v", KeyDataTable(tableId))) | 45 | log.Logger.Info(fmt.Sprintf("【缓存】 miss cache %v", KeyDataTable(tableId))) |
| @@ -43,11 +48,20 @@ func (svr *DataTableCacheService) GetDataTable(tableId int) (*domain.DataTable, | @@ -43,11 +48,20 @@ func (svr *DataTableCacheService) GetDataTable(tableId int) (*domain.DataTable, | ||
| 43 | log.Logger.Info(fmt.Sprintf("【缓存】 hit cache %v", KeyDataTable(tableId))) | 48 | log.Logger.Info(fmt.Sprintf("【缓存】 hit cache %v", KeyDataTable(tableId))) |
| 44 | return v.(*domain.DataTable), true | 49 | return v.(*domain.DataTable), true |
| 45 | } | 50 | } |
| 46 | -func (svr *DataTableCacheService) SetDataTable(tableId int, table *domain.DataTable) { | 51 | + |
| 52 | +func (svr *DataTableLocalCacheService) SetDataTable(tableId int, table *domain.DataTable) { | ||
| 47 | log.Logger.Info(fmt.Sprintf("【缓存】 set cache %v", KeyDataTable(tableId))) | 53 | log.Logger.Info(fmt.Sprintf("【缓存】 set cache %v", KeyDataTable(tableId))) |
| 48 | - DefaultCache.Set(KeyDataTable(tableId), table, 24*time.Hour*30) | 54 | + DefaultCache.Set(KeyDataTable(tableId), table, time.Duration(TableCacheExpire)*time.Second) |
| 49 | } | 55 | } |
| 50 | -func (svr *DataTableCacheService) DeleteDataTable(tableId int) { | 56 | + |
| 57 | +func (svr *DataTableLocalCacheService) DeleteDataTable(tableId int) { | ||
| 51 | log.Logger.Info(fmt.Sprintf("【缓存】 delete cache %v", KeyDataTable(tableId))) | 58 | log.Logger.Info(fmt.Sprintf("【缓存】 delete cache %v", KeyDataTable(tableId))) |
| 52 | DefaultCache.Delete(KeyDataTable(tableId)) | 59 | DefaultCache.Delete(KeyDataTable(tableId)) |
| 53 | } | 60 | } |
| 61 | + | ||
| 62 | +type DataTableCacheService interface { | ||
| 63 | + KeyDataTable(tableId int) string | ||
| 64 | + GetDataTable(tableId int) (*domain.DataTable, bool) | ||
| 65 | + SetDataTable(tableId int, table *domain.DataTable) | ||
| 66 | + DeleteDataTable(tableId int) | ||
| 67 | +} |
pkg/infrastructure/cache/redis_cache.go
0 → 100644
| 1 | +package cache | ||
| 2 | + | ||
| 3 | +import ( | ||
| 4 | + "fmt" | ||
| 5 | + "github.com/linmadan/egglib-go/utils/json" | ||
| 6 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant" | ||
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | ||
| 8 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/redis" | ||
| 9 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log" | ||
| 10 | +) | ||
| 11 | + | ||
| 12 | +type DataTableRedisCacheService struct { | ||
| 13 | +} | ||
| 14 | + | ||
| 15 | +func (svr *DataTableRedisCacheService) KeyDataTable(tableId int) string { | ||
| 16 | + return fmt.Sprintf("%s:cache:table:%d", constant.CACHE_PREFIX, tableId) | ||
| 17 | +} | ||
| 18 | + | ||
| 19 | +func (svr *DataTableRedisCacheService) GetDataTable(tableId int) (*domain.DataTable, bool) { | ||
| 20 | + key := svr.KeyDataTable(tableId) | ||
| 21 | + data, err := redis.ZeroCoreRedis.Get(key) | ||
| 22 | + if err == redis.NotFound || len(data) == 0 { | ||
| 23 | + log.Logger.Info(fmt.Sprintf("【缓存】 miss cache %v", key)) | ||
| 24 | + return nil, false | ||
| 25 | + } | ||
| 26 | + var table = &domain.DataTable{} | ||
| 27 | + err = json.UnmarshalFromString(data, table) | ||
| 28 | + if err != nil { | ||
| 29 | + log.Logger.Error(fmt.Sprintf("【缓存】 miss cache %v,err %v", key, err.Error())) | ||
| 30 | + return nil, false | ||
| 31 | + } | ||
| 32 | + log.Logger.Info(fmt.Sprintf("【缓存】 hit cache %v", key)) | ||
| 33 | + return table, true | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +func (svr *DataTableRedisCacheService) SetDataTable(tableId int, table *domain.DataTable) { | ||
| 37 | + key := svr.KeyDataTable(tableId) | ||
| 38 | + log.Logger.Info(fmt.Sprintf("【缓存】 set cache %v", key)) | ||
| 39 | + redis.ZeroCoreRedis.Setex(key, json.MarshalToString(table), TableCacheExpire) | ||
| 40 | +} | ||
| 41 | + | ||
| 42 | +func (svr *DataTableRedisCacheService) DeleteDataTable(tableId int) { | ||
| 43 | + key := svr.KeyDataTable(tableId) | ||
| 44 | + log.Logger.Info(fmt.Sprintf("【缓存】 delete cache %v", key)) | ||
| 45 | + redis.ZeroCoreRedis.Del(key) | ||
| 46 | +} |
| @@ -2,6 +2,7 @@ package domainService | @@ -2,6 +2,7 @@ package domainService | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "bytes" | 4 | "bytes" |
| 5 | + | ||
| 5 | "github.com/beego/beego/v2/client/httplib" | 6 | "github.com/beego/beego/v2/client/httplib" |
| 6 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant" | 7 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/constant" |
| 7 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | 8 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" |
| @@ -146,6 +147,13 @@ func (ptr *ByteCoreService) FormulasGenerate(param domain.ReqFormulasGenerate) ( | @@ -146,6 +147,13 @@ func (ptr *ByteCoreService) FormulasGenerate(param domain.ReqFormulasGenerate) ( | ||
| 146 | // } | 147 | // } |
| 147 | // return &domain.DataFormulasGenerate{}, nil | 148 | // return &domain.DataFormulasGenerate{}, nil |
| 148 | //} | 149 | //} |
| 150 | + if param.QuerySet.Type == domain.CalculateSet.ToString() { | ||
| 151 | + _, err := param.QuerySetService.(*QuerySetService).LoadCalculateSetData(param.Context.(*domain.Context), param.QuerySet, param.QueryComponents) | ||
| 152 | + if err != nil { | ||
| 153 | + return nil, err | ||
| 154 | + } | ||
| 155 | + return &domain.DataFormulasGenerate{}, nil | ||
| 156 | + } | ||
| 149 | return apiByteLib.FormulasGenerate(param) | 157 | return apiByteLib.FormulasGenerate(param) |
| 150 | } | 158 | } |
| 151 | 159 |
| @@ -33,8 +33,7 @@ func (ptr *FlushDataTableService) Flush(ctx *domain.Context, fileId int, table * | @@ -33,8 +33,7 @@ func (ptr *FlushDataTableService) Flush(ctx *domain.Context, fileId int, table * | ||
| 33 | table = NewTable(domain.ExcelTable, file.FileInfo.Name, table.DataFields, table.RowCount).WithContext(ctx) | 33 | table = NewTable(domain.ExcelTable, file.FileInfo.Name, table.DataFields, table.RowCount).WithContext(ctx) |
| 34 | // 通知底层保存、进行回调 | 34 | // 通知底层保存、进行回调 |
| 35 | var response *domain.DataSaveTable | 35 | var response *domain.DataSaveTable |
| 36 | - response, err = ByteCore.SaveTable(domain.ReqSaveTable{FileId: fileId, Table: table}) | ||
| 37 | - if err != nil { | 36 | + if response, err = ByteCore.SaveTable(domain.ReqSaveTable{FileId: fileId, Table: table}); err != nil { |
| 38 | return nil, err | 37 | return nil, err |
| 39 | } | 38 | } |
| 40 | // 来自源文件的 | 39 | // 来自源文件的 |
| @@ -154,12 +153,11 @@ func NewTable(tableType domain.TableType, fileName string, dataFields []*domain. | @@ -154,12 +153,11 @@ func NewTable(tableType domain.TableType, fileName string, dataFields []*domain. | ||
| 154 | 153 | ||
| 155 | func NewCopyTable(tableType domain.TableType, fileName string, dataFields []*domain.Field, rowCount int) *domain.Table { | 154 | func NewCopyTable(tableType domain.TableType, fileName string, dataFields []*domain.Field, rowCount int) *domain.Table { |
| 156 | var table = &domain.Table{} | 155 | var table = &domain.Table{} |
| 157 | - // New Table | ||
| 158 | table.TableType = tableType.ToString() | 156 | table.TableType = tableType.ToString() |
| 159 | table.Name = fileName | 157 | table.Name = fileName |
| 160 | - table.SQLName = pin(fileName) //SQLTableName() | 158 | + table.SQLName = pin(fileName) |
| 161 | table.PK = PK() | 159 | table.PK = PK() |
| 162 | - if table.TableType == domain.CalculateTable.ToString() || table.TableType == domain.CalculateItem.ToString() { | 160 | + if table.TableType == domain.CalculateItem.ToString() { |
| 163 | table.PK = nil | 161 | table.PK = nil |
| 164 | } | 162 | } |
| 165 | table.DataFieldIndex = len(dataFields) | 163 | table.DataFieldIndex = len(dataFields) |
| @@ -192,7 +190,7 @@ func DataField(name string, sqlType string, flag int, index int) *domain.Field { | @@ -192,7 +190,7 @@ func DataField(name string, sqlType string, flag int, index int) *domain.Field { | ||
| 192 | return &domain.Field{ | 190 | return &domain.Field{ |
| 193 | Index: index, | 191 | Index: index, |
| 194 | Name: name, | 192 | Name: name, |
| 195 | - SQLName: fmt.Sprintf("%v_c%d", pin(name), index), //fieldName(index), | 193 | + SQLName: fmt.Sprintf("%v_c%d", pin(name), index), |
| 196 | SQLType: sqlType, | 194 | SQLType: sqlType, |
| 197 | Description: "", | 195 | Description: "", |
| 198 | Flag: flag, | 196 | Flag: flag, |
| @@ -25,17 +25,17 @@ func (ptr *GenerateMainTableService) GenerateTable(ctx *domain.Context, fileId i | @@ -25,17 +25,17 @@ func (ptr *GenerateMainTableService) GenerateTable(ctx *domain.Context, fileId i | ||
| 25 | return nil, fmt.Errorf("文件未校验") | 25 | return nil, fmt.Errorf("文件未校验") |
| 26 | } | 26 | } |
| 27 | duplicateTable, err := tableRepository.FindOne(map[string]interface{}{"context": ctx, "tableName": tableName, | 27 | duplicateTable, err := tableRepository.FindOne(map[string]interface{}{"context": ctx, "tableName": tableName, |
| 28 | - "tableTypes":[]string{string(domain.MainTable),string(domain.SubTable),string(domain.SideTable)}}) | 28 | + "tableTypes": []string{string(domain.MainTable), string(domain.SubTable), string(domain.SideTable)}}) |
| 29 | if err == nil && duplicateTable != nil { | 29 | if err == nil && duplicateTable != nil { |
| 30 | return nil, fmt.Errorf("表名称重复") | 30 | return nil, fmt.Errorf("表名称重复") |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | - mainTable := NewTable(domain.MainTable, tableName, table.DataFields, table.RowCount).WithContext(ctx) | ||
| 34 | - _, err = tableRepository.Save(mainTable) | ||
| 35 | - if err != nil { | 33 | + mainTable := NewTable(domain.MainTable, tableName, table.DataFields, table.RowCount). |
| 34 | + WithContext(ctx). | ||
| 35 | + WithPrefix(domain.MainTable.ToString()) | ||
| 36 | + if _, err = tableRepository.Save(mainTable); err != nil { | ||
| 36 | return nil, err | 37 | return nil, err |
| 37 | } | 38 | } |
| 38 | - | ||
| 39 | // 日志 | 39 | // 日志 |
| 40 | if err = FastLog(ptr.transactionContext, domain.CommonLog, mainTable.TableId, &GenerateMainTableLog{ | 40 | if err = FastLog(ptr.transactionContext, domain.CommonLog, mainTable.TableId, &GenerateMainTableLog{ |
| 41 | LogEntry: domain.NewLogEntry(tableName, domain.MainTable.ToString(), domain.GenerateMainTable, ctx), | 41 | LogEntry: domain.NewLogEntry(tableName, domain.MainTable.ToString(), domain.GenerateMainTable, ctx), |
| @@ -91,7 +91,7 @@ type Log interface { | @@ -91,7 +91,7 @@ type Log interface { | ||
| 91 | 91 | ||
| 92 | var _ Log = (*FileUploadSuccessLog)(nil) | 92 | var _ Log = (*FileUploadSuccessLog)(nil) |
| 93 | 93 | ||
| 94 | -// 1.1文件上传成功 | 94 | +// FileUploadSuccessLog 1.1文件上传成功 |
| 95 | type FileUploadSuccessLog struct { | 95 | type FileUploadSuccessLog struct { |
| 96 | domain.LogEntry | 96 | domain.LogEntry |
| 97 | } | 97 | } |
| @@ -100,7 +100,7 @@ func (l *FileUploadSuccessLog) Content() string { | @@ -100,7 +100,7 @@ func (l *FileUploadSuccessLog) Content() string { | ||
| 100 | return fmt.Sprintf("上传成功") | 100 | return fmt.Sprintf("上传成功") |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | -// 1.2文件上传失败 | 103 | +// FileUploadFailLog 1.2文件上传失败 |
| 104 | type FileUploadFailLog struct { | 104 | type FileUploadFailLog struct { |
| 105 | domain.LogEntry | 105 | domain.LogEntry |
| 106 | Reason string | 106 | Reason string |
| @@ -110,7 +110,7 @@ func (l *FileUploadFailLog) Content() string { | @@ -110,7 +110,7 @@ func (l *FileUploadFailLog) Content() string { | ||
| 110 | return fmt.Sprintf("上传失败,失败原因:%s", l.Reason) | 110 | return fmt.Sprintf("上传失败,失败原因:%s", l.Reason) |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | -// 2.文件校验 | 113 | +// FileVerifyLog 2.文件校验 |
| 114 | type FileVerifyLog struct { | 114 | type FileVerifyLog struct { |
| 115 | domain.LogEntry | 115 | domain.LogEntry |
| 116 | // 错误信息 | 116 | // 错误信息 |
| @@ -127,7 +127,7 @@ func (l *FileVerifyLog) Content() string { | @@ -127,7 +127,7 @@ func (l *FileVerifyLog) Content() string { | ||
| 127 | return msg | 127 | return msg |
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | -// 3.主表生成日志 | 130 | +// GenerateMainTableLog 3.主表生成日志 |
| 131 | type GenerateMainTableLog struct { | 131 | type GenerateMainTableLog struct { |
| 132 | domain.LogEntry | 132 | domain.LogEntry |
| 133 | // 表名 | 133 | // 表名 |
| @@ -141,7 +141,7 @@ func (l *GenerateMainTableLog) Content() string { | @@ -141,7 +141,7 @@ func (l *GenerateMainTableLog) Content() string { | ||
| 141 | return msg | 141 | return msg |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | -// 4.主表拆分 | 144 | +// SpiltMainTableLog 4.主表拆分 |
| 145 | type SpiltMainTableLog struct { | 145 | type SpiltMainTableLog struct { |
| 146 | domain.LogEntry | 146 | domain.LogEntry |
| 147 | Reserve []*domain.Field | 147 | Reserve []*domain.Field |
| @@ -175,7 +175,7 @@ func (l *SpiltMainTableLog) fieldNames(fields []*domain.Field) []string { | @@ -175,7 +175,7 @@ func (l *SpiltMainTableLog) fieldNames(fields []*domain.Field) []string { | ||
| 175 | return names | 175 | return names |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | -// 5.分表编辑 | 178 | +// SubTableEditLog 5.分表编辑 |
| 179 | type SubTableEditLog struct { | 179 | type SubTableEditLog struct { |
| 180 | domain.LogEntry | 180 | domain.LogEntry |
| 181 | 181 | ||
| @@ -208,7 +208,7 @@ func (l *SubTableEditLog) fieldNames(fields []*domain.Field) []string { | @@ -208,7 +208,7 @@ func (l *SubTableEditLog) fieldNames(fields []*domain.Field) []string { | ||
| 208 | return names | 208 | return names |
| 209 | } | 209 | } |
| 210 | 210 | ||
| 211 | -// 6.表复制日志 | 211 | +// CopyTableLog 6.表复制日志 |
| 212 | type CopyTableLog struct { | 212 | type CopyTableLog struct { |
| 213 | domain.LogEntry | 213 | domain.LogEntry |
| 214 | // 表名 | 214 | // 表名 |
| @@ -220,7 +220,7 @@ func (l *CopyTableLog) Content() string { | @@ -220,7 +220,7 @@ func (l *CopyTableLog) Content() string { | ||
| 220 | return msg | 220 | return msg |
| 221 | } | 221 | } |
| 222 | 222 | ||
| 223 | -// 7.编辑记录 | 223 | +// RowAddLog 7.编辑记录 |
| 224 | type RowAddLog struct { | 224 | type RowAddLog struct { |
| 225 | domain.LogEntry | 225 | domain.LogEntry |
| 226 | } | 226 | } |
| @@ -239,10 +239,8 @@ type RowUpdateLog struct { | @@ -239,10 +239,8 @@ type RowUpdateLog struct { | ||
| 239 | 239 | ||
| 240 | func (l *RowUpdateLog) Content() string { | 240 | func (l *RowUpdateLog) Content() string { |
| 241 | change := "" | 241 | change := "" |
| 242 | - //index := l.Number + l.Where.Offset() | ||
| 243 | for _, f := range l.FieldValue { | 242 | for _, f := range l.FieldValue { |
| 244 | if f.OldValue != f.Value { | 243 | if f.OldValue != f.Value { |
| 245 | - //change += fmt.Sprintf("%v字段%v行的值从%v更改为%v;", f.Field.Name, index, f.OldValue, f.Value) | ||
| 246 | change += fmt.Sprintf("【%v】字段的值从“%v”更改为“%v”;", f.Field.Name, f.OldValue, f.Value) | 244 | change += fmt.Sprintf("【%v】字段的值从“%v”更改为“%v”;", f.Field.Name, f.OldValue, f.Value) |
| 247 | } | 245 | } |
| 248 | } | 246 | } |
| @@ -261,7 +259,6 @@ type RowRemoveLog struct { | @@ -261,7 +259,6 @@ type RowRemoveLog struct { | ||
| 261 | 259 | ||
| 262 | func (l *RowRemoveLog) Content() string { | 260 | func (l *RowRemoveLog) Content() string { |
| 263 | index := l.DeleteRowCount | 261 | index := l.DeleteRowCount |
| 264 | - //msg := fmt.Sprintf("删除%v行数据;筛选件:%v",index,"") | ||
| 265 | msg := fmt.Sprintf("删除%v行数据;", index) | 262 | msg := fmt.Sprintf("删除%v行数据;", index) |
| 266 | filters := make([]string, 0) | 263 | filters := make([]string, 0) |
| 267 | inArgs := func(args []string) string { | 264 | inArgs := func(args []string) string { |
| @@ -281,7 +278,7 @@ func (l *RowRemoveLog) Content() string { | @@ -281,7 +278,7 @@ func (l *RowRemoveLog) Content() string { | ||
| 281 | return msg | 278 | return msg |
| 282 | } | 279 | } |
| 283 | 280 | ||
| 284 | -// 8.表删除日志 | 281 | +// DeleteTableLog 8.表删除日志 |
| 285 | type DeleteTableLog struct { | 282 | type DeleteTableLog struct { |
| 286 | domain.LogEntry | 283 | domain.LogEntry |
| 287 | // 表名 | 284 | // 表名 |
| @@ -302,7 +299,7 @@ func (l *DeleteTableLog) Content() string { | @@ -302,7 +299,7 @@ func (l *DeleteTableLog) Content() string { | ||
| 302 | return msg | 299 | return msg |
| 303 | } | 300 | } |
| 304 | 301 | ||
| 305 | -// 9.数据追加日志 | 302 | +// AppendDataToTableLog 9.数据追加日志 |
| 306 | type AppendDataToTableLog struct { | 303 | type AppendDataToTableLog struct { |
| 307 | domain.LogEntry | 304 | domain.LogEntry |
| 308 | Table *domain.Table | 305 | Table *domain.Table |
| @@ -323,7 +320,8 @@ func (l *AppendDataToTableLog) Content() string { | @@ -323,7 +320,8 @@ func (l *AppendDataToTableLog) Content() string { | ||
| 323 | return msg | 320 | return msg |
| 324 | } | 321 | } |
| 325 | 322 | ||
| 326 | -/*步骤日志*/ | 323 | +/* *********************************************步骤日志************************************************** */ |
| 324 | + | ||
| 327 | type ExcelTableEditLog struct { | 325 | type ExcelTableEditLog struct { |
| 328 | domain.LogEntry | 326 | domain.LogEntry |
| 329 | // 操作名称 | 327 | // 操作名称 |
| @@ -278,6 +278,9 @@ func (ptr *QuerySetService) PreviewPrepare(ctx *domain.Context, querySetId int, | @@ -278,6 +278,9 @@ func (ptr *QuerySetService) PreviewPrepare(ctx *domain.Context, querySetId int, | ||
| 278 | return t, nil | 278 | return t, nil |
| 279 | } | 279 | } |
| 280 | } | 280 | } |
| 281 | + if domain.QueryComponents(queryComponents).IsEmpty(domain.TableType(querySet.Type)) { | ||
| 282 | + return &domain.Table{}, nil | ||
| 283 | + } | ||
| 281 | 284 | ||
| 282 | // 验证 | 285 | // 验证 |
| 283 | if err = ptr.validQueryComponents(queryComponents); err != nil { | 286 | if err = ptr.validQueryComponents(queryComponents); err != nil { |
| @@ -308,9 +311,6 @@ func (ptr *QuerySetService) PreviewPrepare(ctx *domain.Context, querySetId int, | @@ -308,9 +311,6 @@ func (ptr *QuerySetService) PreviewPrepare(ctx *domain.Context, querySetId int, | ||
| 308 | var table *domain.Table = NewCopyTable(domain.TableType(domain.TemporaryTable), querySet.Name, domain.RangeFields(fields, domain.ChangeFieldFlag), 0). | 311 | var table *domain.Table = NewCopyTable(domain.TableType(domain.TemporaryTable), querySet.Name, domain.RangeFields(fields, domain.ChangeFieldFlag), 0). |
| 309 | WithContext(ctx). | 312 | WithContext(ctx). |
| 310 | WithPrefix(strings.ToLower(string(domain.TemporaryTable))) | 313 | WithPrefix(strings.ToLower(string(domain.TemporaryTable))) |
| 311 | - if querySet.Type == domain.CalculateTable.ToString() { | ||
| 312 | - table.PK = nil | ||
| 313 | - } | ||
| 314 | // 循环依赖判断 | 314 | // 循环依赖判断 |
| 315 | if err = ptr.validDependentCircle(ctx, querySet, queryComponents); err != nil { | 315 | if err = ptr.validDependentCircle(ctx, querySet, queryComponents); err != nil { |
| 316 | return nil, err | 316 | return nil, err |
| @@ -937,29 +937,26 @@ func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, | @@ -937,29 +937,26 @@ func (ptr *QuerySetService) Copy(ctx *domain.Context, querySetId int, t string, | ||
| 937 | if err != nil { | 937 | if err != nil { |
| 938 | return nil, err | 938 | return nil, err |
| 939 | } | 939 | } |
| 940 | - copyTable := NewCopyTable(domain.TableType(t), name, table.Fields(false), 0).WithContext(ctx).WithPrefix(qs.Type) | 940 | + copyTable := NewCopyTable(domain.TableType(t), name, table.Fields(false), 0). |
| 941 | + WithContext(ctx). | ||
| 942 | + WithPrefix(qs.Type). | ||
| 943 | + ApplyDefaultModule() | ||
| 941 | copyTable, err = tableRepository.Save(copyTable) | 944 | copyTable, err = tableRepository.Save(copyTable) |
| 942 | if err != nil { | 945 | if err != nil { |
| 943 | return nil, err | 946 | return nil, err |
| 944 | } | 947 | } |
| 945 | 948 | ||
| 946 | // 调用底层的组装sql | 949 | // 调用底层的组装sql |
| 947 | - formulasGenerateResponse, err := ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{ | 950 | + _, err = ByteCore.FormulasGenerate(domain.ReqFormulasGenerate{ |
| 948 | QuerySet: qs, | 951 | QuerySet: qs, |
| 949 | Table: copyTable, | 952 | Table: copyTable, |
| 950 | QueryComponents: qs.QueryComponents, | 953 | QueryComponents: qs.QueryComponents, |
| 954 | + QuerySetService: ptr, | ||
| 955 | + Context: ctx, | ||
| 951 | }) | 956 | }) |
| 952 | if err != nil { | 957 | if err != nil { |
| 953 | return nil, err | 958 | return nil, err |
| 954 | } | 959 | } |
| 955 | - if len(formulasGenerateResponse.FormulaName) > 0 && formulasGenerateResponse.FormulaName != table.SQLName { | ||
| 956 | - //copyTable.SQLName = formulasGenerateResponse.FormulaName | ||
| 957 | - //tableRepository, _ := repository.NewTableRepository(ptr.transactionContext) | ||
| 958 | - //copyTable, err = tableRepository.Save(copyTable) | ||
| 959 | - //if err != nil { | ||
| 960 | - // return nil, err | ||
| 961 | - //} | ||
| 962 | - } | ||
| 963 | copy.QuerySetInfo.BindTableId = copyTable.TableId | 960 | copy.QuerySetInfo.BindTableId = copyTable.TableId |
| 964 | } | 961 | } |
| 965 | copy, err = querySetRepository.Save(copy) | 962 | copy, err = querySetRepository.Save(copy) |
| @@ -2,16 +2,18 @@ package domainService | @@ -2,16 +2,18 @@ package domainService | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | 4 | "fmt" |
| 5 | + "sort" | ||
| 6 | + "strings" | ||
| 7 | + | ||
| 5 | "github.com/zeromicro/go-zero/core/collection" | 8 | "github.com/zeromicro/go-zero/core/collection" |
| 6 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | 9 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" |
| 7 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/repository" | 10 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/repository" |
| 8 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/starrocks" | 11 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/starrocks" |
| 9 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log" | 12 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/log" |
| 10 | - "strings" | ||
| 11 | ) | 13 | ) |
| 12 | 14 | ||
| 13 | -const DefaultExpandNum = 10000 | ||
| 14 | -const MaxExpandNum = 50000 | 15 | +const DefaultExpandNum = 1000 |
| 16 | +const MaxExpandNum = 5000 | ||
| 15 | 17 | ||
| 16 | func (ptr *QuerySetService) LoadCalculateSetData(ctx *domain.Context, qs *domain.QuerySet, queryComponents []*domain.QueryComponent) (*domain.DataTable, error) { | 18 | func (ptr *QuerySetService) LoadCalculateSetData(ctx *domain.Context, qs *domain.QuerySet, queryComponents []*domain.QueryComponent) (*domain.DataTable, error) { |
| 17 | var ( | 19 | var ( |
| @@ -26,7 +28,13 @@ func (ptr *QuerySetService) LoadCalculateSetData(ctx *domain.Context, qs *domain | @@ -26,7 +28,13 @@ func (ptr *QuerySetService) LoadCalculateSetData(ctx *domain.Context, qs *domain | ||
| 26 | // 加载Tables数据 | 28 | // 加载Tables数据 |
| 27 | q := queryComponents[0] | 29 | q := queryComponents[0] |
| 28 | cells := q.Layout.LayoutCells() | 30 | cells := q.Layout.LayoutCells() |
| 29 | - dataTables = ptr.LoadDataTables(ctx, cells) | 31 | + if len(cells) == 0 { |
| 32 | + return res, nil | ||
| 33 | + } | ||
| 34 | + dataTables, err = ptr.LoadDataTables(ctx, cells) | ||
| 35 | + if err != nil { | ||
| 36 | + return nil, err | ||
| 37 | + } | ||
| 30 | // 设置数据 | 38 | // 设置数据 |
| 31 | dt := &DataLayoutDataTable{ | 39 | dt := &DataLayoutDataTable{ |
| 32 | DataTable: res, | 40 | DataTable: res, |
| @@ -38,10 +46,10 @@ func (ptr *QuerySetService) LoadCalculateSetData(ctx *domain.Context, qs *domain | @@ -38,10 +46,10 @@ func (ptr *QuerySetService) LoadCalculateSetData(ctx *domain.Context, qs *domain | ||
| 38 | cells[i].Length = length | 46 | cells[i].Length = length |
| 39 | cells[i].BlockData = blockData | 47 | cells[i].BlockData = blockData |
| 40 | } | 48 | } |
| 41 | - // 根据数据修改便宜 | 49 | + // 根据数据修改偏移 |
| 42 | CellsLocationAdjust(cells) | 50 | CellsLocationAdjust(cells) |
| 43 | // 数据布局 | 51 | // 数据布局 |
| 44 | - res, err = DataLayout(res, dataTables, cells) | 52 | + res, err = DataLayout(res, cells) |
| 45 | if err != nil { | 53 | if err != nil { |
| 46 | return nil, err | 54 | return nil, err |
| 47 | } | 55 | } |
| @@ -60,18 +68,6 @@ func CellsLocationAdjust(cells []*domain.LayoutCell) { | @@ -60,18 +68,6 @@ func CellsLocationAdjust(cells []*domain.LayoutCell) { | ||
| 60 | yMin = cells[0].Y | 68 | yMin = cells[0].Y |
| 61 | yMax = cells[0].Y | 69 | yMax = cells[0].Y |
| 62 | } | 70 | } |
| 63 | - min := func(a, b int) int { | ||
| 64 | - if a > b { | ||
| 65 | - return b | ||
| 66 | - } | ||
| 67 | - return a | ||
| 68 | - } | ||
| 69 | - max := func(a, b int) int { | ||
| 70 | - if a < b { | ||
| 71 | - return b | ||
| 72 | - } | ||
| 73 | - return a | ||
| 74 | - } | ||
| 75 | for i := 1; i <= len(cells)-1; i++ { | 71 | for i := 1; i <= len(cells)-1; i++ { |
| 76 | cell := cells[i] | 72 | cell := cells[i] |
| 77 | xMin = min(xMin, cell.X) | 73 | xMin = min(xMin, cell.X) |
| @@ -111,7 +107,7 @@ func CellsLocationAdjust(cells []*domain.LayoutCell) { | @@ -111,7 +107,7 @@ func CellsLocationAdjust(cells []*domain.LayoutCell) { | ||
| 111 | } | 107 | } |
| 112 | //move = cell.Length | 108 | //move = cell.Length |
| 113 | //c = cell | 109 | //c = cell |
| 114 | - if max(move, cell.Length) != move { | 110 | + if max(move, cell.Length) != move && c == nil { |
| 115 | c = cell | 111 | c = cell |
| 116 | } | 112 | } |
| 117 | move = max(move, cell.Length) | 113 | move = max(move, cell.Length) |
| @@ -121,6 +117,61 @@ func CellsLocationAdjust(cells []*domain.LayoutCell) { | @@ -121,6 +117,61 @@ func CellsLocationAdjust(cells []*domain.LayoutCell) { | ||
| 121 | } | 117 | } |
| 122 | } | 118 | } |
| 123 | 119 | ||
| 120 | +func CellsLocationAdjustV1(cells []*domain.LayoutCell) { | ||
| 121 | + yList := cellsRange(cells, "y") | ||
| 122 | + xList := cellsRange(cells, "x") | ||
| 123 | + for i := 0; i < len(yList); i++ { | ||
| 124 | + j := yList[i] | ||
| 125 | + move := 0 | ||
| 126 | + var c *domain.LayoutCell | ||
| 127 | + for _, cell := range cells { | ||
| 128 | + if cell.Y != j { | ||
| 129 | + continue | ||
| 130 | + } | ||
| 131 | + if cell.Direction != domain.DirectionRight { | ||
| 132 | + continue | ||
| 133 | + } | ||
| 134 | + if max(move, cell.Length) != move { | ||
| 135 | + c = cell | ||
| 136 | + } | ||
| 137 | + move = max(move, cell.Length) | ||
| 138 | + } | ||
| 139 | + ChangeLocation(cells, domain.DirectionRight, j, move, c) | ||
| 140 | + } | ||
| 141 | + for j := 0; j < len(xList); j++ { | ||
| 142 | + i := xList[j] | ||
| 143 | + move := 0 | ||
| 144 | + var c *domain.LayoutCell | ||
| 145 | + for _, cell := range cells { | ||
| 146 | + if cell.X != i { | ||
| 147 | + continue | ||
| 148 | + } | ||
| 149 | + if cell.Direction != domain.DirectionDown { | ||
| 150 | + continue | ||
| 151 | + } | ||
| 152 | + if max(move, cell.Length) != move && c == nil { | ||
| 153 | + c = cell | ||
| 154 | + } | ||
| 155 | + move = max(move, cell.Length) | ||
| 156 | + } | ||
| 157 | + ChangeLocation(cells, domain.DirectionDown, i, move, c) | ||
| 158 | + } | ||
| 159 | +} | ||
| 160 | + | ||
| 161 | +func cellsRange(cells []*domain.LayoutCell, direction string) []int { | ||
| 162 | + list := collection.NewSet() | ||
| 163 | + for i := range cells { | ||
| 164 | + if strings.ToLower(direction) == "x" { | ||
| 165 | + list.Add(cells[i].X) | ||
| 166 | + } else { | ||
| 167 | + list.Add(cells[i].Y) | ||
| 168 | + } | ||
| 169 | + } | ||
| 170 | + sortList := list.KeysInt() | ||
| 171 | + sort.Ints(sortList) | ||
| 172 | + return sortList | ||
| 173 | +} | ||
| 174 | + | ||
| 124 | func ChangeLocation(cells []*domain.LayoutCell, direction string, position, move int, c *domain.LayoutCell) { | 175 | func ChangeLocation(cells []*domain.LayoutCell, direction string, position, move int, c *domain.LayoutCell) { |
| 125 | // log.Logger.Info("修改定位点") | 176 | // log.Logger.Info("修改定位点") |
| 126 | if move == 0 { | 177 | if move == 0 { |
| @@ -148,6 +199,8 @@ func FastTable(table *domain.Table) (*domain.DataTable, error) { | @@ -148,6 +199,8 @@ func FastTable(table *domain.Table) (*domain.DataTable, error) { | ||
| 148 | TableName: table.SQLName, | 199 | TableName: table.SQLName, |
| 149 | Select: table.Fields(false), | 200 | Select: table.Fields(false), |
| 150 | } | 201 | } |
| 202 | + options.SetDefaultOrder() | ||
| 203 | + options.SetOffsetLimit(1, 10000) | ||
| 151 | var dataTable *domain.DataTable | 204 | var dataTable *domain.DataTable |
| 152 | dataTable, err = FastDataTable(options) | 205 | dataTable, err = FastDataTable(options) |
| 153 | if err != nil { | 206 | if err != nil { |
| @@ -164,7 +217,6 @@ func FastDataTable(options starrocks.QueryOptions) (*domain.DataTable, error) { | @@ -164,7 +217,6 @@ func FastDataTable(options starrocks.QueryOptions) (*domain.DataTable, error) { | ||
| 164 | if err != nil { | 217 | if err != nil { |
| 165 | return nil, err | 218 | return nil, err |
| 166 | } | 219 | } |
| 167 | - | ||
| 168 | dataTable.Total, err = starrocks.WrapQueryCountWithDB(options, starrocks.DB)() | 220 | dataTable.Total, err = starrocks.WrapQueryCountWithDB(options, starrocks.DB)() |
| 169 | if err != nil { | 221 | if err != nil { |
| 170 | return nil, err | 222 | return nil, err |
| @@ -172,7 +224,7 @@ func FastDataTable(options starrocks.QueryOptions) (*domain.DataTable, error) { | @@ -172,7 +224,7 @@ func FastDataTable(options starrocks.QueryOptions) (*domain.DataTable, error) { | ||
| 172 | return dataTable, nil | 224 | return dataTable, nil |
| 173 | } | 225 | } |
| 174 | 226 | ||
| 175 | -func (ptr *QuerySetService) LoadDataTables(ctx *domain.Context, cells []*domain.LayoutCell) map[int]*domain.DataTable { | 227 | +func (ptr *QuerySetService) LoadDataTables(ctx *domain.Context, cells []*domain.LayoutCell) (map[int]*domain.DataTable, error) { |
| 176 | var ( | 228 | var ( |
| 177 | dataTables = make(map[int]*domain.DataTable) | 229 | dataTables = make(map[int]*domain.DataTable) |
| 178 | tableRepository, _ = repository.NewTableRepository(ptr.transactionContext) | 230 | tableRepository, _ = repository.NewTableRepository(ptr.transactionContext) |
| @@ -187,28 +239,27 @@ func (ptr *QuerySetService) LoadDataTables(ctx *domain.Context, cells []*domain. | @@ -187,28 +239,27 @@ func (ptr *QuerySetService) LoadDataTables(ctx *domain.Context, cells []*domain. | ||
| 187 | if len(tableIds.KeysInt()) > 0 { | 239 | if len(tableIds.KeysInt()) > 0 { |
| 188 | _, tables, err := tableRepository.Find(map[string]interface{}{"context": ctx, "tableIds": tableIds.KeysInt()}) | 240 | _, tables, err := tableRepository.Find(map[string]interface{}{"context": ctx, "tableIds": tableIds.KeysInt()}) |
| 189 | if err != nil { | 241 | if err != nil { |
| 190 | - return nil | 242 | + return nil, err |
| 191 | } | 243 | } |
| 192 | for _, t := range tables { | 244 | for _, t := range tables { |
| 193 | if _, ok := dataTables[t.TableId]; ok { | 245 | if _, ok := dataTables[t.TableId]; ok { |
| 194 | continue | 246 | continue |
| 195 | } | 247 | } |
| 196 | - dataTable, e := FastTable(t) | ||
| 197 | - if e != nil { | ||
| 198 | - log.Logger.Error(e.Error()) | ||
| 199 | - continue | 248 | + dataTable, err := FastTable(t) |
| 249 | + if err != nil { | ||
| 250 | + log.Logger.Error(err.Error()) | ||
| 251 | + return nil, fmt.Errorf("获取【%s】出现异常:%s", t.Name, err.Error()) | ||
| 200 | } | 252 | } |
| 201 | dataTable.Fields = t.DataFields | 253 | dataTable.Fields = t.DataFields |
| 202 | dataTables[t.TableId] = dataTable | 254 | dataTables[t.TableId] = dataTable |
| 203 | } | 255 | } |
| 204 | } | 256 | } |
| 205 | - return dataTables | 257 | + return dataTables, nil |
| 206 | } | 258 | } |
| 207 | 259 | ||
| 208 | -func DataLayout(res *domain.DataTable, dataTables map[int]*domain.DataTable, cells []*domain.LayoutCell) (*domain.DataTable, error) { | 260 | +func DataLayout(res *domain.DataTable, cells []*domain.LayoutCell) (*domain.DataTable, error) { |
| 209 | dt := &DataLayoutDataTable{ | 261 | dt := &DataLayoutDataTable{ |
| 210 | - DataTable: res, | ||
| 211 | - //MapDataTables: dataTables, | 262 | + DataTable: res, |
| 212 | unprocessed: cells, | 263 | unprocessed: cells, |
| 213 | } | 264 | } |
| 214 | dt.Init(DefaultExpandNum) | 265 | dt.Init(DefaultExpandNum) |
| @@ -218,14 +269,6 @@ func DataLayout(res *domain.DataTable, dataTables map[int]*domain.DataTable, cel | @@ -218,14 +269,6 @@ func DataLayout(res *domain.DataTable, dataTables map[int]*domain.DataTable, cel | ||
| 218 | } | 269 | } |
| 219 | cell := dt.unprocessed[0] | 270 | cell := dt.unprocessed[0] |
| 220 | dt.unprocessed = dt.unprocessed[1:] | 271 | dt.unprocessed = dt.unprocessed[1:] |
| 221 | - //blockData, length := dt.BlockData(cell) | ||
| 222 | - //if err := dt.Expand(cell, length); err != nil { | ||
| 223 | - // return nil, err | ||
| 224 | - //} | ||
| 225 | - //dt.addByLocation(cell, blockData) | ||
| 226 | - //blockData, length := dt.BlockData(cell) | ||
| 227 | - // 当前单元格子 影响其他格子坐标 | ||
| 228 | - //dt.changeUnProcessedLocation(cell, cell.Length) | ||
| 229 | if err := dt.Expand(cell, cell.Length); err != nil { | 272 | if err := dt.Expand(cell, cell.Length); err != nil { |
| 230 | return nil, err | 273 | return nil, err |
| 231 | } | 274 | } |
| @@ -273,8 +316,13 @@ func (l *Location) UpdateY(y int) { | @@ -273,8 +316,13 @@ func (l *Location) UpdateY(y int) { | ||
| 273 | } | 316 | } |
| 274 | } | 317 | } |
| 275 | 318 | ||
| 276 | -func (d *DataLayoutDataTable) StartCell() { | ||
| 277 | - | 319 | +func (l *Location) Update(x int, y int, compare func(int, int) int) { |
| 320 | + if x != 0 { | ||
| 321 | + l.X = compare(l.X, x) | ||
| 322 | + } | ||
| 323 | + if y != 0 { | ||
| 324 | + l.Y = compare(l.Y, y) | ||
| 325 | + } | ||
| 278 | } | 326 | } |
| 279 | 327 | ||
| 280 | func (d *DataLayoutDataTable) addByLocation(cell *domain.LayoutCell, blockData []string) { | 328 | func (d *DataLayoutDataTable) addByLocation(cell *domain.LayoutCell, blockData []string) { |
| @@ -287,23 +335,19 @@ func (d *DataLayoutDataTable) addByLocation(cell *domain.LayoutCell, blockData [ | @@ -287,23 +335,19 @@ func (d *DataLayoutDataTable) addByLocation(cell *domain.LayoutCell, blockData [ | ||
| 287 | for i := range blockData { | 335 | for i := range blockData { |
| 288 | d.DataTable.Data[cell.X][cell.Y+i] = blockData[i] | 336 | d.DataTable.Data[cell.X][cell.Y+i] = blockData[i] |
| 289 | } | 337 | } |
| 290 | - d.PointEnd.UpdateX(cell.X) | ||
| 291 | - d.PointEnd.UpdateY(cell.Y + len(blockData) - 1) | 338 | + d.PointEnd.Update(cell.X, cell.Y+len(blockData)-1, max) |
| 292 | case domain.DirectionDown: | 339 | case domain.DirectionDown: |
| 293 | for i := range blockData { | 340 | for i := range blockData { |
| 294 | d.DataTable.Data[cell.X+i][cell.Y] = blockData[i] | 341 | d.DataTable.Data[cell.X+i][cell.Y] = blockData[i] |
| 295 | } | 342 | } |
| 296 | - d.PointEnd.UpdateX(cell.X + len(blockData) - 1) | ||
| 297 | - d.PointEnd.UpdateY(cell.Y) | 343 | + d.PointEnd.Update(cell.X+len(blockData)-1, cell.Y, max) |
| 298 | case domain.DirectionNone: | 344 | case domain.DirectionNone: |
| 299 | d.DataTable.Data[cell.X][cell.Y] = blockData[0] | 345 | d.DataTable.Data[cell.X][cell.Y] = blockData[0] |
| 300 | - d.PointEnd.UpdateX(cell.X) | ||
| 301 | - d.PointEnd.UpdateY(cell.Y) | 346 | + d.PointEnd.Update(cell.X, cell.Y, max) |
| 302 | } | 347 | } |
| 303 | } | 348 | } |
| 304 | 349 | ||
| 305 | func (d *DataLayoutDataTable) changeUnProcessedLocation(lastCell *domain.LayoutCell, length int) { | 350 | func (d *DataLayoutDataTable) changeUnProcessedLocation(lastCell *domain.LayoutCell, length int) { |
| 306 | - // log.Logger.Info("修改定位点") | ||
| 307 | for _, cell := range d.unprocessed { | 351 | for _, cell := range d.unprocessed { |
| 308 | switch lastCell.Direction { | 352 | switch lastCell.Direction { |
| 309 | case domain.DirectionRight: | 353 | case domain.DirectionRight: |
| @@ -315,7 +359,6 @@ func (d *DataLayoutDataTable) changeUnProcessedLocation(lastCell *domain.LayoutC | @@ -315,7 +359,6 @@ func (d *DataLayoutDataTable) changeUnProcessedLocation(lastCell *domain.LayoutC | ||
| 315 | cell.X += length - 1 | 359 | cell.X += length - 1 |
| 316 | } | 360 | } |
| 317 | } | 361 | } |
| 318 | - // log.Logger.Info(fmt.Sprintf("%s %s X:%d Y:%d", cell.Data.Field.SQLName, cell.Direction, cell.X, cell.Y)) | ||
| 319 | } | 362 | } |
| 320 | } | 363 | } |
| 321 | 364 | ||
| @@ -329,7 +372,7 @@ func (d *DataLayoutDataTable) BlockData(cells *domain.LayoutCell) ([]string, int | @@ -329,7 +372,7 @@ func (d *DataLayoutDataTable) BlockData(cells *domain.LayoutCell) ([]string, int | ||
| 329 | if !ok { | 372 | if !ok { |
| 330 | return block, 0 | 373 | return block, 0 |
| 331 | } | 374 | } |
| 332 | - values := table.Values(&domain.Field{SQLName: cells.Data.TableField.FieldSqlName}) | 375 | + values := table.Values(&domain.Field{SQLName: cells.Data.TableField.FieldSqlName, SQLType: cells.Data.TableField.FieldSQLType}) |
| 333 | if len(values) == 0 { | 376 | if len(values) == 0 { |
| 334 | return block, 0 | 377 | return block, 0 |
| 335 | } | 378 | } |
| @@ -411,3 +454,16 @@ func (d *DataLayoutDataTable) CellOutRange(cell *domain.LayoutCell, length int) | @@ -411,3 +454,16 @@ func (d *DataLayoutDataTable) CellOutRange(cell *domain.LayoutCell, length int) | ||
| 411 | } | 454 | } |
| 412 | return false | 455 | return false |
| 413 | } | 456 | } |
| 457 | + | ||
| 458 | +func min(a, b int) int { | ||
| 459 | + if a > b { | ||
| 460 | + return b | ||
| 461 | + } | ||
| 462 | + return a | ||
| 463 | +} | ||
| 464 | +func max(a, b int) int { | ||
| 465 | + if a < b { | ||
| 466 | + return b | ||
| 467 | + } | ||
| 468 | + return a | ||
| 469 | +} |
| @@ -13,6 +13,7 @@ func TestDataLayout(t *testing.T) { | @@ -13,6 +13,7 @@ func TestDataLayout(t *testing.T) { | ||
| 13 | cells []*domain.LayoutCell | 13 | cells []*domain.LayoutCell |
| 14 | flag Location | 14 | flag Location |
| 15 | title string | 15 | title string |
| 16 | + debug bool | ||
| 16 | }{ | 17 | }{ |
| 17 | { | 18 | { |
| 18 | title: "配置组多组混合", | 19 | title: "配置组多组混合", |
| @@ -410,6 +411,93 @@ func TestDataLayout(t *testing.T) { | @@ -410,6 +411,93 @@ func TestDataLayout(t *testing.T) { | ||
| 410 | flag: Location{X: 2, Y: 1}, | 411 | flag: Location{X: 2, Y: 1}, |
| 411 | }, | 412 | }, |
| 412 | { | 413 | { |
| 414 | + title: "测试用例4", | ||
| 415 | + cells: []*domain.LayoutCell{ | ||
| 416 | + // 分组一 | ||
| 417 | + { | ||
| 418 | + X: 0, | ||
| 419 | + Y: 0, | ||
| 420 | + Length: 5, | ||
| 421 | + ImageData: "a", | ||
| 422 | + Direction: domain.DirectionDown, | ||
| 423 | + }, | ||
| 424 | + { | ||
| 425 | + X: 0, | ||
| 426 | + Y: 1, | ||
| 427 | + Length: 5, | ||
| 428 | + ImageData: "b", | ||
| 429 | + Direction: domain.DirectionDown, | ||
| 430 | + }, | ||
| 431 | + // , | ||
| 432 | + // { | ||
| 433 | + // X: 1, | ||
| 434 | + // Y: 1, | ||
| 435 | + // Length: 5, | ||
| 436 | + // ImageData: "c", | ||
| 437 | + // Direction: domain.DirectionRight, | ||
| 438 | + // }, | ||
| 439 | + // { | ||
| 440 | + // X: 2, | ||
| 441 | + // Y: 1, | ||
| 442 | + // Length: 5, | ||
| 443 | + // ImageData: "d", | ||
| 444 | + // Direction: domain.DirectionRight, | ||
| 445 | + // }, | ||
| 446 | + }, | ||
| 447 | + flag: Location{X: 0, Y: 0}, | ||
| 448 | + }, | ||
| 449 | + { | ||
| 450 | + title: "测试用例5", | ||
| 451 | + cells: []*domain.LayoutCell{ | ||
| 452 | + // 分组一 | ||
| 453 | + { | ||
| 454 | + X: 0, | ||
| 455 | + Y: 0, | ||
| 456 | + Length: 5, | ||
| 457 | + ImageData: "a", | ||
| 458 | + Direction: domain.DirectionDown, | ||
| 459 | + }, | ||
| 460 | + { | ||
| 461 | + X: 0, | ||
| 462 | + Y: 1, | ||
| 463 | + Length: 6, | ||
| 464 | + ImageData: "b", | ||
| 465 | + Direction: domain.DirectionDown, | ||
| 466 | + }, | ||
| 467 | + { | ||
| 468 | + X: 1, | ||
| 469 | + Y: 0, | ||
| 470 | + Length: 1, | ||
| 471 | + ImageData: "t", | ||
| 472 | + Direction: domain.DirectionNone, | ||
| 473 | + }, | ||
| 474 | + { | ||
| 475 | + X: 1, | ||
| 476 | + Y: 1, | ||
| 477 | + Length: 1, | ||
| 478 | + ImageData: "x", | ||
| 479 | + Direction: domain.DirectionNone, | ||
| 480 | + }, | ||
| 481 | + // , | ||
| 482 | + // { | ||
| 483 | + // X: 1, | ||
| 484 | + // Y: 1, | ||
| 485 | + // Length: 5, | ||
| 486 | + // ImageData: "c", | ||
| 487 | + // Direction: domain.DirectionRight, | ||
| 488 | + // }, | ||
| 489 | + // { | ||
| 490 | + // X: 2, | ||
| 491 | + // Y: 1, | ||
| 492 | + // Length: 5, | ||
| 493 | + // ImageData: "d", | ||
| 494 | + // Direction: domain.DirectionRight, | ||
| 495 | + // }, | ||
| 496 | + }, | ||
| 497 | + flag: Location{X: 0, Y: 0}, | ||
| 498 | + debug:true, | ||
| 499 | + }, | ||
| 500 | + { | ||
| 413 | title: "测试用例6", | 501 | title: "测试用例6", |
| 414 | cells: []*domain.LayoutCell{ | 502 | cells: []*domain.LayoutCell{ |
| 415 | // 分组一 | 503 | // 分组一 |
| @@ -445,13 +533,17 @@ func TestDataLayout(t *testing.T) { | @@ -445,13 +533,17 @@ func TestDataLayout(t *testing.T) { | ||
| 445 | } | 533 | } |
| 446 | } | 534 | } |
| 447 | } | 535 | } |
| 536 | + debugItem:= false | ||
| 448 | for _, input := range inputs { | 537 | for _, input := range inputs { |
| 538 | + if debugItem && !input.debug{ | ||
| 539 | + continue | ||
| 540 | + } | ||
| 449 | padding(input.cells) | 541 | padding(input.cells) |
| 450 | // 根据数据修改位移 | 542 | // 根据数据修改位移 |
| 451 | CellsLocationAdjust(input.cells) | 543 | CellsLocationAdjust(input.cells) |
| 452 | // 数据布局 | 544 | // 数据布局 |
| 453 | res := &domain.DataTable{} | 545 | res := &domain.DataTable{} |
| 454 | - res, err := DataLayout(res, nil, input.cells) | 546 | + res, err := DataLayout(res, input.cells) |
| 455 | if err != nil { | 547 | if err != nil { |
| 456 | assert.NoError(t, err) | 548 | assert.NoError(t, err) |
| 457 | } | 549 | } |
| @@ -500,6 +592,20 @@ b | | | | | | | | | | @@ -500,6 +592,20 @@ b | | | | | | | | | | ||
| 500 | b | | | | | | | | | | 592 | b | | | | | | | | | |
| 501 | | | | | | d | d | d | d | d | 593 | | | | | | d | d | d | d | d |
| 502 | 594 | ||
| 595 | +a | b | ||
| 596 | +a | b | ||
| 597 | +a | b | ||
| 598 | +a | b | ||
| 599 | +a | b | ||
| 600 | + | ||
| 601 | +a | b | ||
| 602 | +a | b | ||
| 603 | +a | b | ||
| 604 | +a | b | ||
| 605 | +a | b | ||
| 606 | + | b | ||
| 607 | +t | x | ||
| 608 | + | ||
| 503 | a | | | | | | 609 | a | | | | | |
| 504 | | c | c | c | c | c | 610 | | c | c | c | c | c |
| 505 | | d | d | d | d | d | 611 | | d | d | d | d | d |
| @@ -40,7 +40,7 @@ func (ptr *AddTableStructService) AddTableStruct(ctx *domain.Context, parentTabl | @@ -40,7 +40,7 @@ func (ptr *AddTableStructService) AddTableStruct(ctx *domain.Context, parentTabl | ||
| 40 | fields = MappingFields(mainTable, fields) | 40 | fields = MappingFields(mainTable, fields) |
| 41 | dataFields := (domain.Fields)(fields).Select(map[string]interface{}{"flag": domain.MainTableField}) | 41 | dataFields := (domain.Fields)(fields).Select(map[string]interface{}{"flag": domain.MainTableField}) |
| 42 | manualFields := (domain.Fields)(fields).Select(map[string]interface{}{"flag": domain.ManualField}) | 42 | manualFields := (domain.Fields)(fields).Select(map[string]interface{}{"flag": domain.ManualField}) |
| 43 | - table := NewTable(domain.SubTable, name, fields, mainTable.RowCount).WithContext(ctx) | 43 | + table := NewTable(domain.SubTable, name, fields, mainTable.RowCount).WithContext(ctx).WithPrefix(string(domain.SubTable)) |
| 44 | table.DataFieldIndex = mainTable.DataFieldIndex | 44 | table.DataFieldIndex = mainTable.DataFieldIndex |
| 45 | table.DataFields = dataFields | 45 | table.DataFields = dataFields |
| 46 | table.ManualFields = manualFields | 46 | table.ManualFields = manualFields |
| @@ -2,6 +2,7 @@ package domainService | @@ -2,6 +2,7 @@ package domainService | ||
| 2 | 2 | ||
| 3 | import ( | 3 | import ( |
| 4 | "fmt" | 4 | "fmt" |
| 5 | + | ||
| 5 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | 6 | pgTransaction "github.com/linmadan/egglib-go/transaction/pg" |
| 6 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | 7 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" |
| 7 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/repository" | 8 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/repository" |
| @@ -28,9 +29,6 @@ func (ptr *CopyDataTableService) CopyTable(ctx *domain.Context, tableId int, tab | @@ -28,9 +29,6 @@ func (ptr *CopyDataTableService) CopyTable(ctx *domain.Context, tableId int, tab | ||
| 28 | if err != nil { | 29 | if err != nil { |
| 29 | return nil, err | 30 | return nil, err |
| 30 | } | 31 | } |
| 31 | - if !(table.TableType == domain.MainTable.ToString() || table.TableType == domain.SubTable.ToString()) { | ||
| 32 | - return nil, fmt.Errorf("主表、分表才允许复制") | ||
| 33 | - } | ||
| 34 | var mainTable *domain.Table | 32 | var mainTable *domain.Table |
| 35 | dataFields := table.DataFields | 33 | dataFields := table.DataFields |
| 36 | if table.TableType == domain.SubTable.ToString() { | 34 | if table.TableType == domain.SubTable.ToString() { |
| @@ -45,7 +43,10 @@ func (ptr *CopyDataTableService) CopyTable(ctx *domain.Context, tableId int, tab | @@ -45,7 +43,10 @@ func (ptr *CopyDataTableService) CopyTable(ctx *domain.Context, tableId int, tab | ||
| 45 | } | 43 | } |
| 46 | } | 44 | } |
| 47 | // 验证表名是否重复 | 45 | // 验证表名是否重复 |
| 48 | - duplicateTable, err := tableRepository.FindOne(map[string]interface{}{"context": ctx, "tableName": tableName}) | 46 | + duplicateTable, err := tableRepository.FindOne(map[string]interface{}{ |
| 47 | + "context": ctx, | ||
| 48 | + "tableName": tableName, | ||
| 49 | + "tableTypes": domain.TableTypesToStringList(domain.MainTable, domain.SubTable, domain.SideTable)}) | ||
| 49 | if err == nil && duplicateTable != nil { | 50 | if err == nil && duplicateTable != nil { |
| 50 | return nil, fmt.Errorf("表名称重复") | 51 | return nil, fmt.Errorf("表名称重复") |
| 51 | } | 52 | } |
| @@ -53,7 +54,8 @@ func (ptr *CopyDataTableService) CopyTable(ctx *domain.Context, tableId int, tab | @@ -53,7 +54,8 @@ func (ptr *CopyDataTableService) CopyTable(ctx *domain.Context, tableId int, tab | ||
| 53 | sideTable := NewCopyTable(domain.SideTable, tableName, dataFields, table.RowCount). | 54 | sideTable := NewCopyTable(domain.SideTable, tableName, dataFields, table.RowCount). |
| 54 | WithContext(ctx). | 55 | WithContext(ctx). |
| 55 | WithParentId(table.TableId). | 56 | WithParentId(table.TableId). |
| 56 | - WithDataFieldIndex(table.DataFieldIndex) | 57 | + WithDataFieldIndex(table.DataFieldIndex). |
| 58 | + WithPrefix(domain.SideTable.ToString()) | ||
| 57 | if sideTable, err = tableRepository.Save(sideTable); err != nil { | 59 | if sideTable, err = tableRepository.Save(sideTable); err != nil { |
| 58 | return nil, err | 60 | return nil, err |
| 59 | } | 61 | } |
| @@ -62,8 +62,9 @@ func (ptr *UpdateTableStructService) UpdateTableStruct(ctx *domain.Context, tabl | @@ -62,8 +62,9 @@ func (ptr *UpdateTableStructService) UpdateTableStruct(ctx *domain.Context, tabl | ||
| 62 | return nil, err | 62 | return nil, err |
| 63 | } | 63 | } |
| 64 | } | 64 | } |
| 65 | - | ||
| 66 | - // Log | 65 | + defer func() { |
| 66 | + AsyncEvent(domain.NewEventTable(ctx, domain.TableDataEditEvent).WithTable(table)) | ||
| 67 | + }() | ||
| 67 | // 日志 | 68 | // 日志 |
| 68 | if err = FastLog(ptr.transactionContext, domain.CommonLog, table.TableId, &SubTableEditLog{ | 69 | if err = FastLog(ptr.transactionContext, domain.CommonLog, table.TableId, &SubTableEditLog{ |
| 69 | LogEntry: domain.NewLogEntry(table.Name, table.TableType, domain.EditSubTable, ctx), | 70 | LogEntry: domain.NewLogEntry(table.Name, table.TableType, domain.EditSubTable, ctx), |
| @@ -13,6 +13,8 @@ func KeyExportTable(ctx *domain.Context, tableId int) string { | @@ -13,6 +13,8 @@ func KeyExportTable(ctx *domain.Context, tableId int) string { | ||
| 13 | 13 | ||
| 14 | var ZeroCoreRedis *redis.Redis | 14 | var ZeroCoreRedis *redis.Redis |
| 15 | 15 | ||
| 16 | +var NotFound = redis.ErrEmptyKey | ||
| 17 | + | ||
| 16 | func InitZeroCoreRedis() { | 18 | func InitZeroCoreRedis() { |
| 17 | ZeroCoreRedis = redis.New(constant.REDIS_HOST+":"+constant.REDIS_PORT, redis.WithPass(constant.REDIS_AUTH)) | 19 | ZeroCoreRedis = redis.New(constant.REDIS_HOST+":"+constant.REDIS_PORT, redis.WithPass(constant.REDIS_AUTH)) |
| 18 | } | 20 | } |
| @@ -3,8 +3,8 @@ package starrocks | @@ -3,8 +3,8 @@ package starrocks | ||
| 3 | import ( | 3 | import ( |
| 4 | "bytes" | 4 | "bytes" |
| 5 | "fmt" | 5 | "fmt" |
| 6 | - "github.com/google/uuid" | ||
| 7 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" | 6 | "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain" |
| 7 | + "gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/infrastructure/utils" | ||
| 8 | "gorm.io/gorm" | 8 | "gorm.io/gorm" |
| 9 | "html" | 9 | "html" |
| 10 | "html/template" | 10 | "html/template" |
| @@ -15,8 +15,12 @@ func Insert(db *gorm.DB, tableName string, fields []*domain.FieldValue) error { | @@ -15,8 +15,12 @@ func Insert(db *gorm.DB, tableName string, fields []*domain.FieldValue) error { | ||
| 15 | for _, f := range fields { | 15 | for _, f := range fields { |
| 16 | if f.Field.Flag == domain.PKField && f.Value == "" { | 16 | if f.Field.Flag == domain.PKField && f.Value == "" { |
| 17 | //continue | 17 | //continue |
| 18 | - id, _ := uuid.NewUUID() | ||
| 19 | - f.Value = id.String() | 18 | + //id, _ := uuid.NewUUID() |
| 19 | + // idString := id.String() | ||
| 20 | + // 需要调用分布式id生成 | ||
| 21 | + id, _ := utils.NewSnowflakeId() | ||
| 22 | + idString := fmt.Sprintf("%d", id) | ||
| 23 | + f.Value = idString | ||
| 20 | } | 24 | } |
| 21 | value[f.Field.SQLName] = f.TypeValue() | 25 | value[f.Field.SQLName] = f.TypeValue() |
| 22 | } | 26 | } |
| @@ -128,17 +128,23 @@ func (o *QueryOptions) AdditionOptionsByTable(table *domain.Table) *QueryOptions | @@ -128,17 +128,23 @@ func (o *QueryOptions) AdditionOptionsByTable(table *domain.Table) *QueryOptions | ||
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | type Condition struct { | 130 | type Condition struct { |
| 131 | + params QueryOptions | ||
| 131 | domain.Condition | 132 | domain.Condition |
| 132 | Distinct bool | 133 | Distinct bool |
| 133 | DisableFormat bool | 134 | DisableFormat bool |
| 134 | } | 135 | } |
| 135 | 136 | ||
| 136 | func (c Condition) SetWhere(params QueryOptions, q *gorm.DB) { | 137 | func (c Condition) SetWhere(params QueryOptions, q *gorm.DB) { |
| 138 | + c.SetParams(params) | ||
| 137 | if len(c.Like) > 0 { | 139 | if len(c.Like) > 0 { |
| 138 | q.Where(fmt.Sprintf("%v like '%%%v%%'", c.FormatIfNull(params, c.Field), c.Like)) | 140 | q.Where(fmt.Sprintf("%v like '%%%v%%'", c.FormatIfNull(params, c.Field), c.Like)) |
| 139 | } | 141 | } |
| 140 | if len(c.In) > 0 { | 142 | if len(c.In) > 0 { |
| 141 | - q.Where(fmt.Sprintf("%v in %v", c.FormatIfNull(params, c.Field), c.InArgs(c.In))) | 143 | + if c.Field.SQLType == domain.Float.ToString() { |
| 144 | + q.Where(fmt.Sprintf("%v in %v", c.CastType(c.Field.SQLName, domain.DECIMALV2.ToString()), c.InArgs(c.In))) | ||
| 145 | + } else { | ||
| 146 | + q.Where(fmt.Sprintf("%v in %v", c.CastType(c.FormatIfNull(params, c.Field), "string"), c.InArgs(c.In))) | ||
| 147 | + } | ||
| 142 | } | 148 | } |
| 143 | if len(c.Ex) > 0 { | 149 | if len(c.Ex) > 0 { |
| 144 | in := c.InArgs(c.Ex) | 150 | in := c.InArgs(c.Ex) |
| @@ -166,13 +172,18 @@ func (c Condition) SetWhere(params QueryOptions, q *gorm.DB) { | @@ -166,13 +172,18 @@ func (c Condition) SetWhere(params QueryOptions, q *gorm.DB) { | ||
| 166 | } | 172 | } |
| 167 | } | 173 | } |
| 168 | if c.Distinct { | 174 | if c.Distinct { |
| 169 | - q.Distinct(c.Field.SQLName) | 175 | + // 需要优化 |
| 176 | + q.Distinct(c.FormatFiled(c.Field)) | ||
| 170 | } | 177 | } |
| 171 | if len(c.Order) > 0 { | 178 | if len(c.Order) > 0 { |
| 172 | q.Order(fmt.Sprintf("%v %v", c.Field.SQLName, c.Order)) | 179 | q.Order(fmt.Sprintf("%v %v", c.Field.SQLName, c.Order)) |
| 173 | } | 180 | } |
| 174 | } | 181 | } |
| 175 | 182 | ||
| 183 | +func (c *Condition) SetParams(params QueryOptions) { | ||
| 184 | + c.params = params | ||
| 185 | +} | ||
| 186 | + | ||
| 176 | func (c Condition) FormatIfNull(params QueryOptions, f *domain.Field) string { | 187 | func (c Condition) FormatIfNull(params QueryOptions, f *domain.Field) string { |
| 177 | if params.Table != nil && params.Table.TableType == domain.ObjectDBTable { | 188 | if params.Table != nil && params.Table.TableType == domain.ObjectDBTable { |
| 178 | return f.SQLName | 189 | return f.SQLName |
| @@ -183,6 +194,42 @@ func (c Condition) FormatIfNull(params QueryOptions, f *domain.Field) string { | @@ -183,6 +194,42 @@ func (c Condition) FormatIfNull(params QueryOptions, f *domain.Field) string { | ||
| 183 | return f.SQLName | 194 | return f.SQLName |
| 184 | } | 195 | } |
| 185 | 196 | ||
| 197 | +func (c Condition) FormatFiled(f *domain.Field) string { | ||
| 198 | + return formatFiled(c.Field) | ||
| 199 | +} | ||
| 200 | + | ||
| 201 | +func (c Condition) CastType(sql, t string) string { | ||
| 202 | + if c.params.Table != nil && c.params.Table.TableType == domain.ObjectDBTable { | ||
| 203 | + return sql | ||
| 204 | + } | ||
| 205 | + return castType(sql, t) | ||
| 206 | +} | ||
| 207 | + | ||
| 208 | +func (c Condition) CastTypeByField(f *domain.Field, t string) string { | ||
| 209 | + if c.params.Table != nil && c.params.Table.TableType == domain.ObjectDBTable { | ||
| 210 | + return f.SQLName | ||
| 211 | + } | ||
| 212 | + if f.SQLType == domain.Float.ToString() || f.SQLType == domain.DECIMAL279.ToString() { | ||
| 213 | + return castTypeAlias(f.SQLName, domain.DECIMALV2.ToString()) | ||
| 214 | + } | ||
| 215 | + return castType(f.SQLName, t) | ||
| 216 | +} | ||
| 217 | + | ||
| 218 | +func formatFiled(f *domain.Field) string { | ||
| 219 | + //if f.SQLType == domain.Float.ToString() || f.SQLType == domain.DECIMAL279.ToString() { | ||
| 220 | + // return castTypeAlias(f.SQLName, domain.DECIMALV2.ToString()) | ||
| 221 | + //} | ||
| 222 | + return f.SQLName | ||
| 223 | +} | ||
| 224 | + | ||
| 225 | +func castType(sql, t string) string { | ||
| 226 | + return fmt.Sprintf("cast(%v as %v)", sql, t) | ||
| 227 | +} | ||
| 228 | + | ||
| 229 | +func castTypeAlias(sql, t string) string { | ||
| 230 | + return fmt.Sprintf("cast(%v as %v) %v", sql, t, sql) | ||
| 231 | +} | ||
| 232 | + | ||
| 186 | var opMap = map[string]string{ | 233 | var opMap = map[string]string{ |
| 187 | "=": "=", | 234 | "=": "=", |
| 188 | ">": ">", | 235 | ">": ">", |
| @@ -292,7 +339,7 @@ func queryWithoutLimitOffset(query *gorm.DB, params QueryOptions) { | @@ -292,7 +339,7 @@ func queryWithoutLimitOffset(query *gorm.DB, params QueryOptions) { | ||
| 292 | fields = append(fields, "'' "+f.SQLName) | 339 | fields = append(fields, "'' "+f.SQLName) |
| 293 | continue | 340 | continue |
| 294 | } | 341 | } |
| 295 | - fields = append(fields, f.SQLName) | 342 | + fields = append(fields, formatFiled(f)) |
| 296 | } | 343 | } |
| 297 | query.Select(strings.Join(fields, ",")) | 344 | query.Select(strings.Join(fields, ",")) |
| 298 | } | 345 | } |
| @@ -117,3 +117,10 @@ func TestRound(t *testing.T) { | @@ -117,3 +117,10 @@ func TestRound(t *testing.T) { | ||
| 117 | t.Logf("%.1f", Truncate(99.99, 1)) | 117 | t.Logf("%.1f", Truncate(99.99, 1)) |
| 118 | t.Logf("%v", Truncate(99, 0)) | 118 | t.Logf("%v", Truncate(99, 0)) |
| 119 | } | 119 | } |
| 120 | + | ||
| 121 | +func TestNewSnowflakeId(t *testing.T) { | ||
| 122 | + id, _ := NewSnowflakeId() | ||
| 123 | + for i := 0; i < 100; i++ { | ||
| 124 | + t.Log(id / 2) | ||
| 125 | + } | ||
| 126 | +} |
-
请 注册 或 登录 后发表评论