package main import ( "context" "fmt" "github.com/spf13/viper" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" es "jygit.jydev.jianyu360.cn/data_processing/common_utils/elastic" "jygit.jydev.jianyu360.cn/data_processing/common_utils/log" "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb" "os" "time" ) func init() { InitConfig() InitLog() InitClickhouse() InitEs() // InitMgo() InitMgoQY() InitMysql() InitAreaCode() InitLabels() //初始化获取标签和对应bitmap站位 } func InitConfig() (err error) { viper.SetConfigFile("config.toml") // 指定配置文件路径 viper.SetConfigName("config") // 配置文件名称(无扩展名) viper.SetConfigType("toml") // 如果配置文件的名称中没有扩展名,则需要配置此项 viper.AddConfigPath("./") viper.AddConfigPath("./conf/") // 还可以在工作目录中查找配置 viper.AddConfigPath("../conf/") // 还可以在工作目录中查找配置 err = viper.ReadInConfig() // 查找并读取配置文件 if err != nil { // 处理读取配置文件的错误 return } err = viper.Unmarshal(&GF) return err } func InitEs() { if GF.Esa.URL != "" { Esa = &es.Elastic{ S_esurl: GF.Esa.URL, I_size: 5, Username: GF.Esa.Username, Password: GF.Esa.Password, } Esa.InitElasticSize() } if GF.Esb.URL != "" { Esb = &es.Elastic{ S_esurl: GF.Esb.URL, I_size: 5, Username: GF.Esb.Username, Password: GF.Esb.Password, } Esb.InitElasticSize() } } func InitLog() { now := time.Now() err := log.InitLog( log.Path(GF.Log.LogPath), log.Level(GF.Log.LogLevel), log.Compress(GF.Log.Compress), log.MaxSize(GF.Log.MaxSize), log.MaxBackups(GF.Log.MaxBackups), log.MaxAge(GF.Log.MaxAge), log.Format(GF.Log.Format), ) if err != nil { fmt.Printf("InitLog failed: %v\n", err) os.Exit(1) } log.Info("InitLog", zap.Any("duration", time.Since(now).Seconds())) } // InitClickhouse 初始化Clickhouse func InitClickhouse() { username := GF.Clickhouse.Username password := GF.Clickhouse.Password host := GF.Clickhouse.Host dbname := GF.Clickhouse.DB // 测试环境 //host := "192.168.3.207:19000" //username := "jytop" //password := "pwdTopJy123" //dbname := "information" ClickHouseConn, _ = connectClickhouse(host, username, password, dbname) } // InitMgo 初始化标讯,mixdata.qyxy_std func InitMgo() { Mgo = &mongodb.MongodbSim{ MongodbAddr: GF.Mongo.Host, //MongodbAddr: "127.0.0.1:27083", Size: 10, DbName: GF.Mongo.DB, UserName: GF.Mongo.Username, Password: GF.Mongo.Password, Direct: GF.Mongo.Direct, } Mgo.InitPool() } func InitMysql() { username := GF.Mysql.Username password := GF.Mysql.Password host := GF.Mysql.Host // 本地 //host := "172.17.162.27:14000" //线上 database := GF.Mysql.DB dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, database) // 连接到数据库 var err error MysqlDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Error), //不打印日志 }) if err != nil { log.Info("InitMysql", zap.String("初始化MySQL失败", database), zap.Error(err)) return } else { log.Info("InitMysql", zap.String("初始化MySQL成功", database)) } } // CodeArea 表示 code_area 数据表的结构体 type CodeArea struct { ID uint16 `gorm:"primaryKey;autoIncrement;not null"` // id 为主键,自增 Code string `gorm:"size:10;not null;unique"` // code 列,长度 10,唯一 Area string `gorm:"size:45;not null"` // area 列,长度 45,不允许为空 City string `gorm:"size:45"` // city 列,长度 45,可以为空 District string `gorm:"size:45"` // district 列,长度 45,可以为空 Alias string `gorm:"size:10"` // alias 列,长度 10,可以为空 } // TableName 指定数据库表名 func (CodeArea) TableName() string { return "code_area" } // InitAreaCode 初始化地区code; func InitAreaCode() { // 查询所有数据 var codeAreas []CodeArea MysqlDB.Find(&codeAreas) // 查询所有记录 for _, ca := range codeAreas { key := ca.Area + "~" + ca.City + "~" + ca.District + "~" code := ca.Code RegionCodeData[key] = code } } func InitMgoQY() { //181 凭安库 MgoQY = &mongodb.MongodbSim{ //MongodbAddr: "172.17.4.181:27001", MongodbAddr: GF.MongoQy.Host, DbName: GF.MongoQy.DB, Size: 10, UserName: GF.MongoQy.Username, Password: GF.MongoQy.Password, Direct: GF.MongoQy.Direct, } MgoQY.InitPool() log.Info("InitMgoQY", zap.String("初始化成功", GF.MongoQy.Host)) } // InitLabels 获取现有设计好的标签以及对应bitmap 占位 func InitLabels() { log.Info("getLabels", zap.String("开始处理标签", "-------")) type entLabel struct { LabelName string BitmapNum uint64 } ctx := context.Background() sql := ` SELECT label_name,bitmap_num FROM ent_label ` rows, err := ClickHouseConn.Query(ctx, sql) if err != nil { log.Info("getLabels", zap.Error(err)) } // 遍历结果集 for rows.Next() { var label entLabel // 将当前行的值扫描到结构体中 err = rows.Scan(&label.LabelName, &label.BitmapNum) if err != nil { log.Info("getLabels", zap.Error(err)) continue } entLabelMap[label.BitmapNum] = label.LabelName nameBitMap[label.LabelName] = label.BitmapNum } // 检查是否有任何错误 if err = rows.Err(); err != nil { log.Info("getLabels", zap.Error(err)) } log.Info("getLabels", zap.String("标签处理完毕", "-------")) }