diff --git a/apps/visual/api/visual_data_set_table.go b/apps/visual/api/visual_data_set_table.go index 9ca8bcf..4a9c0b5 100644 --- a/apps/visual/api/visual_data_set_table.go +++ b/apps/visual/api/visual_data_set_table.go @@ -146,11 +146,89 @@ func (p *VisualDataSetTableApi) GetDataSetTableFun(rc *restfulx.ReqCtx) { rc.ResData = p.VisualDataSetTableApp.FindFunList(one.SourceType) } -// GetDataSets 获取图表设置的数据集查询数据 -func (p *VisualDataSetFieldApi) GetDataSets(rc *restfulx.ReqCtx) { +// GetDataSetSeries 获取图表设置的数据集查询数据 +func (p *VisualDataSetTableApi) GetDataSetSeries(rc *restfulx.ReqCtx) { var data entity.DataSetDataReq restfulx.BindQuery(rc, &data) + one := p.VisualDataSetTableApp.FindOne(data.TableId) + biz.NotNil(one, "未查到该数据集") + info := make(map[string]string) + biz.ErrIsNil(json.Unmarshal([]byte(one.Info), &info), "解析info失败") + // 数据源查询 + source := p.VisualDataSourceApp.FindOne(one.DataSourceId) + // 拼接维度 + dataDs := make([]string, 0) + dataQs := make([]string, 0) + sorts := make([]string, 0) + filters := make([]string, 0) + for _, ds := range data.DataDs { + dataDs = append(dataDs, ds.Value) + } + // 拼接指标 + for _, qs := range data.DataQs { + q := qs.Value + if qs.Func != "" { + q = fmt.Sprintf("%s(%s) as %s", qs.Func, q, qs.Value) + } + if qs.Decimal > 0 { + q = fmt.Sprintf("ROUND(%s,%d)", q, qs.Decimal) + } + if qs.Sort != "" { + //升序 + if qs.Sort == "2" { + sorts = append(sorts, fmt.Sprintf("%s asc", qs.Value)) + } + //降序 + if qs.Sort == "3" { + sorts = append(sorts, fmt.Sprintf("%s desc", qs.Value)) + } + } + if len(qs.Filters) > 0 { + for _, filter := range qs.Filters { + filters = append(filters, fmt.Sprintf("%s %s %d", filter.Name, filter.Rule, filter.Num)) + } + } + dataQs = append(dataQs, q) + } + + // + if one.TableType == "excel" { + rc.ResData = "占时不支持" + return + } + + var sql string + //根据信息拼接sql + if one.TableType == "db" { + sql = fmt.Sprintf(`select %s from %s`, + strings.Join(dataQs, ","), + info["table"], + ) + } + if one.TableType == "sql" { + sql = fmt.Sprintf(`select %s from (%s) as table`, + strings.Join(dataQs, ","), + info["sql"], + ) + } + if len(filters) > 0 { + sql += fmt.Sprintf(" WHERE %s", strings.Join(filters, " AND ")) + } + if len(dataDs) > 0 { + sql += fmt.Sprintf(" GROUP BY %s", strings.Join(dataDs, ",")) + } + if len(sorts) > 0 { + sql += fmt.Sprintf(" ORDER BY %s", strings.Join(sorts, ",")) + } + if data.ShowNumType == "2" { + sql += fmt.Sprintf(" LIMIT %d", data.ShowNum) + } + // 执行 + instance := driver.NewDbInstance(source) + _, series, err := instance.SelectData(sql) + biz.ErrIsNil(err, "查询表信息失败") + rc.ResData = series } func (p *VisualDataSetTableApi) operateTable(opType string, data entity.VisualDataSetTable) { diff --git a/apps/visual/entity/data_set.go b/apps/visual/entity/data_set.go index bd785e6..44e1cde 100644 --- a/apps/visual/entity/data_set.go +++ b/apps/visual/entity/data_set.go @@ -56,15 +56,34 @@ func (VisualDataSetTableFun) TableName() string { } type DataSetDataReq struct { - TableId string `json:"tableId"` //数据集Id - ShowNumType string `json:"showNumType"` - ShowNum int64 `json:"showNum"` - DataDs []map[string]interface{} `json:"dataDs"` - DataQs []map[string]interface{} `json:"dataQs"` - DataLs []map[string]interface{} `json:"dataLs"` + TableId string `json:"tableId"` //数据集Id + ShowNumType string `json:"showNumType"` + ShowNum int64 `json:"showNum"` + DataDs []DataSetDataDs `json:"dataDs"` + DataQs []DataSetDataQs `json:"dataQs"` + DataLs []DataSetDataDs `json:"dataLs"` } type DataSetDataRes struct { Fields []string `json:"fields"` Series []map[string]interface{} `json:"series"` } + +type DataSetDataDs struct { + Name string `json:"name"` + Value string `json:"value"` +} + +type DataSetDataQs struct { + DataSetDataDs + Func string `json:"func"` + Decimal int64 `json:"decimal"` + Sort string `json:"sort"` + Filters []DataSetDataFilters `json:"filters"` +} + +type DataSetDataFilters struct { + Name string `json:"name"` + Rule string `json:"rule"` + Num int64 `json:"num"` +} diff --git a/apps/visual/router/visual_data_set_table.go b/apps/visual/router/visual_data_set_table.go index 5871f46..7db7452 100644 --- a/apps/visual/router/visual_data_set_table.go +++ b/apps/visual/router/visual_data_set_table.go @@ -97,5 +97,12 @@ func InitVisualDataSetTableRouter(container *restful.Container) { Param(ws.QueryParameter("sourceId", "数据源Id").Required(true).DataType("string")). Metadata(restfulspec.KeyOpenAPITags, tags)) + ws.Route(ws.POST("/list/series").To(func(request *restful.Request, response *restful.Response) { + restfulx.NewReqCtx(request, response).WithNeedCasbin(false).WithLog("获取数列表").Handle(s.GetDataSetSeries) + }). + Doc("获取数列表"). + Reads(entity.DataSetDataReq{}). + Metadata(restfulspec.KeyOpenAPITags, tags)) + container.Add(ws) } diff --git a/pkg/tool/excel.go b/pkg/tool/excel.go index 6b3d622..0f0d804 100644 --- a/pkg/tool/excel.go +++ b/pkg/tool/excel.go @@ -3,6 +3,7 @@ package tool import ( "fmt" "github.com/xuri/excelize/v2" + "pandax/apps/visual/entity" ) // 读取数据表 @@ -38,3 +39,51 @@ func ReadExcel(filename string) ([]string, []map[string]interface{}) { } return cols, ret } + +func ReadExcelByFilter(filename string, data entity.DataSetDataReq) ([]string, []map[string]interface{}) { + dataDs := make([]string, 0) + for _, ds := range data.DataDs { + dataDs = append(dataDs, ds.Value) + } + + ret := make([]map[string]interface{}, 0) + f, err := excelize.OpenFile(filename) + if err != nil { + fmt.Println("读取excel文件出错", err.Error()) + return nil, ret + } + sheets := f.GetSheetMap() + sheet1 := sheets[1] + rows, err := f.GetRows(sheet1) + cols := make([]string, 0) + colsIndex := make([]int, 0) + isHead := true + count := 0 + for _, row := range rows { + if data.ShowNumType == "2" { + if count == int(data.ShowNum) { + break + } + } + if isHead { //取得第一行的所有数据---execel表头 + if len(row) == 0 { + continue + } + for i, colCell := range row { + cols = append(cols, colCell) + colsIndex = append(colsIndex, i) + } + isHead = false + } else { + theRow := map[string]interface{}{} + for j, colCell := range row { + k := cols[j] + theRow[k] = colCell + + } + ret = append(ret, theRow) + } + count++ + } + return cols, ret +}