bi/platform-basic-libs/service/analysis/user_event_detail.go
1340691923@qq.com 742458ee1d 优化代码
2022-03-16 16:04:29 +08:00

143 lines
3.8 KiB
Go

package analysis
import (
"fmt"
"github.com/1340691923/xwl_bi/engine/db"
"github.com/1340691923/xwl_bi/engine/logs"
"github.com/1340691923/xwl_bi/platform-basic-libs/my_error"
"github.com/1340691923/xwl_bi/platform-basic-libs/request"
"github.com/1340691923/xwl_bi/platform-basic-libs/service/meta_data"
"github.com/1340691923/xwl_bi/platform-basic-libs/util"
jsoniter "github.com/json-iterator/go"
"strconv"
"time"
)
type UserEventDetail struct {
req request.UserEventDetailReq
eventNameMapStr string
}
func (this *UserEventDetail) GetList() (interface{}, error) {
SQL, args, err := this.GetExecSql()
if err != nil {
return nil, err
}
logs.Logger.Sugar().Infof("sql", SQL, args)
rows, err := db.ClickHouseSqlx.Query(SQL, args...)
if err != nil {
return nil, err
}
defer rows.Close()
columns, err := rows.Columns()
if err != nil {
return nil, err
}
columnLength := len(columns)
cache := make([]interface{}, columnLength)
for index, _ := range cache {
var a interface{}
cache[index] = &a
}
var list []map[string]interface{}
for rows.Next() {
err := rows.Scan(cache...)
if err != nil {
return nil, err
}
item := make(map[string]interface{})
for i, data := range cache {
item[columns[i]] = *data.(*interface{})
}
list = append(list, item)
}
for index := range list {
obj := list[index]
for k, v := range obj {
switch v.(type) {
case time.Time:
obj[k] = v.(time.Time).Format(util.TimeFormat)
}
}
list[index] = obj
}
res := map[string][]map[string]interface{}{}
tmp := []string{}
for index := range list {
if _, ok := res[list[index]["date_year"].(string)]; !ok {
m := []map[string]interface{}{}
m = append(m, list[index])
res[list[index]["date_year"].(string)] = m
tmp = append(tmp, list[index]["date_year"].(string))
} else {
m := res[list[index]["date_year"].(string)]
m = append(m, list[index])
res[list[index]["date_year"].(string)] = m
}
}
resList := []map[string][]map[string]interface{}{}
for index := range tmp {
val := res[tmp[index]]
m := map[string][]map[string]interface{}{tmp[index]: val}
resList = append(resList, m)
}
return map[string]interface{}{"list": resList}, nil
}
func (this *UserEventDetail) GetExecSql() (SQL string, allArgs []interface{}, err error) {
eventWhereSql := ""
if this.req.EventName != "" {
eventWhereSql = fmt.Sprintf(` and xwl_part_event = '%s' `, this.req.EventName)
}
SQL = `
with ` + this.eventNameMapStr + ` as eventMap
select formatDateTime(xwl_part_date,'%Y年%m月%d日') as date_year,
formatDateTime(xwl_part_date,'%H点%M分%S秒') as date_t,
mapValues(eventMap)[indexOf(mapKeys(eventMap), xwl_part_event)] as xwl_part_event_desc,* from xwl_event` + strconv.Itoa(this.req.Appid) + `
prewhere xwl_distinct_id = ? and xwl_part_date >= toDateTime(?) and xwl_part_date <= toDateTime(?) and xwl_part_event in (?) ` + eventWhereSql + `
order by xwl_part_date ` + this.req.OrderBy + ` limit ?,? `
allArgs = append(allArgs, this.req.UserID, this.req.Date[0]+" 00:00:00", this.req.Date[1]+" 23:59:59", this.req.EventNames, db.CreatePage(uint64(this.req.Page), uint64(this.req.PageSize)), this.req.PageSize)
return
}
func NewUserEventDetailList(reqData []byte) (Ianalysis, error) {
obj := &UserEventDetail{}
var json = jsoniter.ConfigCompatibleWithStandardLibrary
err := json.Unmarshal(reqData, &obj.req)
if err != nil {
return nil, err
}
metaDataService := meta_data.MetaDataService{Appid: strconv.Itoa(obj.req.Appid)}
mapStr, err := metaDataService.GetEventNameShowMap()
if err != nil {
return nil, err
}
obj.eventNameMapStr = mapStr
if obj.req.Page == 0 {
obj.req.Page = 1
}
if obj.req.PageSize == 0 {
obj.req.PageSize = 30
}
if len(obj.req.EventNames) == 0 {
return nil, my_error.NewBusiness(ERROR_TABLE, EventNameEmptyError)
}
return obj, nil
}