2022-04-10 23:22:35 +08:00

238 lines
5.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"errors"
"github.com/1340691923/xwl_bi/engine/db"
"github.com/1340691923/xwl_bi/model"
"github.com/1340691923/xwl_bi/platform-basic-libs/service/analysis/utils"
"github.com/1340691923/xwl_bi/platform-basic-libs/service/myapp"
"github.com/1340691923/xwl_bi/platform-basic-libs/sinker"
"github.com/1340691923/xwl_bi/platform-basic-libs/util"
"strconv"
)
type AppService struct {
}
func (this *AppService) UpdateManager(app model.App, managerUid int32) (err error) {
_, err = db.
SqlBuilder.
Update("app").
SetMap(map[string]interface{}{
"app_manager": app.AppManager,
"update_by": managerUid}).
Where(db.Eq{"app_id": app.AppId}).
RunWith(db.Sqlx).Exec()
if err != nil {
return
}
return
}
func (this *AppService) Create(app model.App, managerUid int32) (err error) {
roolbackFn := func(id int64) {
db.SqlBuilder.
Delete("app").
Where(db.Eq{"id": id}).
RunWith(db.Sqlx).
Exec()
}
app.AppId = util.GetUUid()
app.AppKey = util.MD5HexHash(util.Str2bytes(util.GetUUid()))
if app.SaveMonth < 1 {
app.SaveMonth = 1
}
rows, err := db.
SqlBuilder.
Insert("app").
SetMap(map[string]interface{}{
"app_name": app.AppName,
"descibe": app.Descibe,
"app_id": app.AppId,
"app_key": app.AppKey,
"update_by": managerUid,
"create_by": managerUid,
"app_manager": managerUid,
"save_mouth": app.SaveMonth,
}).RunWith(db.Sqlx).Exec()
if err != nil {
return
}
tableId, err := rows.LastInsertId()
if err != nil {
return
}
eventTableName := "xwl_event" + strconv.Itoa(int(tableId))
_, err = db.ClickHouseSqlx.Exec(
` CREATE TABLE ` + eventTableName + ` ` + sinker.GetClusterSql() + ` (
xwl_part_date DateTime DEFAULT now(),
xwl_part_event String,
xwl_account_id String,
xwl_distinct_id String,
xwl_lib_version String,
xwl_os String,
xwl_screen_width Int64,
xwl_screen_height Int64,
xwl_device_id String,
xwl_network_type String,
xwl_device_model String,
xwl_ip String,
xwl_city String,
xwl_province String,
xwl_lib String,
xwl_scene String,
xwl_manufacturer String,
xwl_os_version String,
xwl_kafka_offset Int64,
xwl_kafka_partition Int64
)ENGINE = ` + sinker.GetMergeTree(eventTableName) + `
PARTITION BY (toYYYYMM(xwl_part_date))
ORDER BY (toYYYYMM(xwl_part_date),xwl_part_event) TTL xwl_part_date + toIntervalMonth(` + strconv.Itoa(app.SaveMonth) + `) SETTINGS index_granularity = 8192;`)
if err != nil {
roolbackFn(tableId)
return
}
userTableName := "xwl_user" + strconv.Itoa(int(tableId))
//由于clickhouse修改性能上的缺失所以本项目修改数据采用增量覆盖的方式
//因为ddl会修改所以不采用进行物化视图建立的方案
_, err = db.ClickHouseSqlx.Exec(
`CREATE table ` + userTableName + ` ` + sinker.GetClusterSql() + ` (
xwl_account_id String,
xwl_distinct_id String,
xwl_reg_time Nullable(DateTime),
xwl_update_time DateTime,
xwl_kafka_offset Int64,
xwl_kafka_partition Int64,
xwl_ip String,
xwl_city String,
xwl_province String
)
ENGINE = ` + sinker.GetReplacingMergeTree(userTableName, utils.ReplacingMergeTreeKey) + `
ORDER BY xwl_distinct_id
SETTINGS index_granularity = 8192;`)
if err != nil {
roolbackFn(tableId)
return
}
conn := db.RedisPool.Get()
defer conn.Close()
if _, err = conn.Do("hset", "AppidToTableid", app.AppId+"_xwl_"+app.AppKey, tableId); err != nil {
roolbackFn(tableId)
return
}
return
}
func (this AppService) ChangeStatus(app model.App, managerUid int32) (err error) {
if !util.InArr([]int{1, 0}, *app.IsClose) {
return errors.New("无效操作")
}
_, err = db.
SqlBuilder.
Update("app").
SetMap(map[string]interface{}{
"is_close": *app.IsClose,
"update_by": managerUid}).
Where(db.Eq{"app_id": app.AppId}).
RunWith(db.Sqlx).
Exec()
if err != nil {
return err
}
switch *app.IsClose {
case 1:
myapp.DeleteAppidToTableid(app.AppId, app.AppKey)
case 0:
if err = myapp.SetAppidToTableid(app.AppId, app.AppKey, app.Id); err != nil {
return err
}
default:
return errors.New("无效操作")
}
return nil
}
func (this *AppService) List(managerUid int32, app model.App) (list []model.App, count int, err error) {
selectBuilder := db.
SqlBuilder.
Select("*").
From("app")
selectBuilder2 := db.
SqlBuilder.
Select("count(*)").
From("app")
if managerUid != 1 {
selectBuilder = selectBuilder.Where(db.Eq{"create_by": managerUid})
selectBuilder2 = selectBuilder2.Where(db.Eq{"create_by": managerUid})
}
if app.AppName != "" {
selectBuilder = selectBuilder.Where(db.Like{"app_name": db.CreateLike(app.AppName)})
selectBuilder2 = selectBuilder2.Where(db.Like{"app_name": db.CreateLike(app.AppName)})
}
if app.IsClose != nil {
selectBuilder = selectBuilder.Where(db.Eq{"is_close": &app.IsClose})
selectBuilder2 = selectBuilder2.Where(db.Eq{"is_close": &app.IsClose})
}
sql, args, err := selectBuilder.Limit(app.Limit).Offset(db.CreatePage(app.Page, app.Limit)).ToSql()
if err != nil {
return
}
err = db.
Sqlx.
Select(&list, sql, args...)
if err != nil {
return
}
err = selectBuilder2.RunWith(db.Sqlx).QueryRow().Scan(&count)
if err != nil {
return
}
return
}
func (this *AppService) ResetAppkey(managerUid int32, app model.App) (err error) {
app.AppKey = util.MD5HexHash(util.Str2bytes(util.GetUUid()))
_, err = db.
SqlBuilder.
Update("app").
SetMap(map[string]interface{}{
"app_key": app.AppKey,
"update_by": managerUid,
}).Where(db.Eq{"app_id": app.AppId}).RunWith(db.Sqlx).Exec()
if err != nil {
return
}
if err = myapp.DeleteAppidToTableid(app.AppId, app.AppKey); err != nil {
return
}
if err = myapp.SetAppidToTableid(app.AppId, app.AppKey, app.Id); err != nil {
return
}
return
}