Pārlūkot izejas kodu

Merge branch 'dev_v1.5.14_wh' of jianyu/datatools into feature/v1.5.14

王浩 11 mēneši atpakaļ
vecāks
revīzija
e979312f36
6 mainītis faili ar 253 papildinājumiem un 82 dzēšanām
  1. 42 30
      clueSync/config.go
  2. 1 23
      clueSync/config.json
  3. 12 1
      clueSync/db.json
  4. 163 2
      clueSync/everything.go
  5. 1 1
      clueSync/jobutil.go
  6. 34 25
      clueSync/main.go

+ 42 - 30
clueSync/config.go

@@ -8,26 +8,27 @@ import (
 
 type (
 	Config struct {
-		LastOrderId        int     `json:"lastOrderId"`
-		LastOrderClueId    string  `json:"lastOrderClueId"`
-		LastUserId         string  `json:"lastUserId"`
-		LastXcxUserId      string  `json:"lastXcxUserId"`
-		LastId             string  `json:"lastId"`
-		LastOrderTime      string  `json:"lastOrderTime"`
-		LastUserTime       string  `json:"lastUserTime"`
-		LastSubscribeId    string  `json:"lastSubscribeId"`
-		LastMessageTime    string  `json:"lastMessageTime"`
-		LastkcTime         string  `json:"lastkcTime"`
-		LastEverythingTime string  `json:"lastEverythingTime"`
-		LastEventRegTime   string  `json:"lastEventRegTime"`
-		LastReadClueTime   string  `json:"lastReadClueTime"`
-		BigSaleTime        int64   `json:"bigSaleTime"`
-		BigOrderTime       string  `json:"bigOrderTime"`
-		MarketSaleTime     int64   `json:"marketSaleTime"`
-		AllocationTime     string  `json:"allocationTime"`
-		AllocationRatio    float64 `json:"allocationRatio"`
-		ActiveTime         string  `json:"activeTime"`
-		RebindTime         string  `json:"rebindTime"`
+		LastOrderId           int     `json:"lastOrderId"`
+		LastOrderClueId       string  `json:"lastOrderClueId"`
+		LastUserId            string  `json:"lastUserId"`
+		LastXcxUserId         string  `json:"lastXcxUserId"`
+		LastId                string  `json:"lastId"`
+		LastOrderTime         string  `json:"lastOrderTime"`
+		LastUserTime          string  `json:"lastUserTime"`
+		LastSubscribeId       string  `json:"lastSubscribeId"`
+		LastMessageTime       string  `json:"lastMessageTime"`
+		LastkcTime            string  `json:"lastkcTime"`
+		LastEverythingTime    string  `json:"lastEverythingTime"`
+		LastEventRegTime      string  `json:"lastEventRegTime"`
+		LastReadClueTime      string  `json:"lastReadClueTime"`
+		BigSaleTime           int64   `json:"bigSaleTime"`
+		BigOrderTime          string  `json:"bigOrderTime"`
+		MarketSaleTime        int64   `json:"marketSaleTime"`
+		AdvisoryCommitteeTime int64   `json:"advisoryCommitteeTime"`
+		AllocationTime        string  `json:"allocationTime"`
+		AllocationRatio       float64 `json:"allocationRatio"`
+		ActiveTime            string  `json:"activeTime"`
+		RebindTime            string  `json:"rebindTime"`
 	}
 	DB struct {
 		CornExp1      int64  `json:"cornexp1"`
@@ -129,6 +130,16 @@ type (
 			MaxIdle     int    `json:"maxidle"`
 			MaxLeftTime int    `json:"maxleft"`
 		} `json:"mysql"`
+		DataAnalysis struct {
+			Host        string `json:"host"`
+			Port        int    `json:"port"`
+			Database    string `json:"database"`
+			User        string `json:"user"`
+			Password    string `json:"password"`
+			PollSize    int    `json:"poolsize"`
+			MaxIdle     int    `json:"maxidle"`
+			MaxLeftTime int    `json:"maxleft"`
+		} `json:"dataAnalysis"`
 		Mgo struct {
 			Address string `json:"address"`
 			DbName  string `json:"dbName"`
@@ -155,16 +166,17 @@ type (
 			UserName string `json:"user	Name"`
 			Password string `json:"password"`
 		} `json:"es"`
-		ProductArr     []string          `json:"productArr"`
-		RedisServer    string            `json:"redisServer"`
-		MarketSaleMail string            `json:"marketSaleMail"`
-		AllocationCap  int64             `json:"allocationCap"`
-		WarningValue   int64             `json:"warningValue"`
-		CornMail       string            `json:"corn_mail"`
-		RegTimes       int               `json:"regTimes"`
-		NameToMail     map[string]string `json:"nameToMail"`
-		ThawDay        int64             `json:"thawDay"`
-		LoopType       int64             `json:"loopType"`
+		ProductArr            []string          `json:"productArr"`
+		RedisServer           string            `json:"redisServer"`
+		MarketSaleMail        string            `json:"marketSaleMail"`
+		AdvisoryCommitteeMail []string          `json:"advisoryCommitteeMail"`
+		AllocationCap         int64             `json:"allocationCap"`
+		WarningValue          int64             `json:"warningValue"`
+		CornMail              string            `json:"corn_mail"`
+		RegTimes              int               `json:"regTimes"`
+		NameToMail            map[string]string `json:"nameToMail"`
+		ThawDay               int64             `json:"thawDay"`
+		LoopType              int64             `json:"loopType"`
 	}
 )
 

+ 1 - 23
clueSync/config.json

@@ -1,23 +1 @@
-{
-  "lastOrderId": 258784,
-  "lastOrderClueId": "2024-05-25 02:23:21",
-  "lastUserId": "2024-05-20 15:40:02",
-  "lastId": "668c9fdbd1f99a10cd641691",
-  "lastOrderTime": "2023-04-25 00:00:00",
-  "lastUserTime": "2024-07-09 11:54:02",
-  "lastSubscribeId": "645470af172d9e8dcc5c507a",
-  "lastMessageTime": "2024-06-20 17:54:18",
-  "lastkcTime": "",
-  "lastEverythingTime": "",
-  "lastEventRegTime": "",
-  "lastReadClueTime": "",
-  "bigSaleTime": 1718241923,
-  "bigOrderTime": "2024-06-12 17:01:39",
-  "marketSaleTime": 1708160200,
-  "allocationTime": "2024-07-01 14:59:37",
-  "allocationRatio": 2,
-  "lastXcxUserId": "2024-07-09 14:59:37",
-  "activeTime": "2024-07-01 14:59:37",
-  "rebindTime": "2024-07-01 14:59:37"
-}
-
+{"lastOrderId":258784,"lastOrderClueId":"2024-05-25 02:23:21","lastUserId":"2024-05-20 15:40:02","lastXcxUserId":"2024-07-09 14:59:37","lastId":"668c9fdbd1f99a10cd641691","lastOrderTime":"2023-04-25 00:00:00","lastUserTime":"2024-07-09 11:54:02","lastSubscribeId":"645470af172d9e8dcc5c507a","lastMessageTime":"2024-06-20 17:54:18","lastkcTime":"","lastEverythingTime":"","lastEventRegTime":"","lastReadClueTime":"","bigSaleTime":1718241923,"bigOrderTime":"2024-06-12 17:01:39","marketSaleTime":1708160200,"advisoryCommitteeTime":1724136683,"allocationTime":"2024-07-01 14:59:37","allocationRatio":2,"activeTime":"2024-07-01 14:59:37","rebindTime":"2024-07-01 14:59:37"}

+ 12 - 1
clueSync/db.json

@@ -79,6 +79,16 @@
     "maxidle": 40,
     "maxleft": 40
   },
+  "dataAnalysis": {
+    "host": "192.168.3.14",
+    "port": 4000,
+    "database": "data_analysis",
+    "user": "root",
+    "password": "=PDT49#80Z!RVv52_z",
+    "poolsize": 20,
+    "maxidle": 40,
+    "maxleft": 40
+  },
   "mysql": {
     "host": "192.168.3.14",
     "port": 4000,
@@ -140,5 +150,6 @@
   },
   "nameToMail": null,
   "thawDay": 3,
-  "loopType": 1
+  "loopType": 1,
+  "advisoryCommitteeMail": ["wanghao@topnet.net.cn"]
 }

+ 163 - 2
clueSync/everything.go

@@ -383,6 +383,9 @@ func bigCustomer() {
 			if sourceMap[sources] != "" {
 				source := sourceMap[sources]
 				phone := common.ObjToString(v["phone"])
+				if IsInternal(phone) {
+					continue
+				}
 				key := fmt.Sprintf("%s_%s", source, phone)
 				if _, ok := data[key]; ok {
 					continue
@@ -447,6 +450,9 @@ func bigCustomer() {
 				if phone == "" {
 					phone = common.ObjToString((*userData)["phone"])
 				}
+				if IsInternal(phone) {
+					continue
+				}
 				username = common.ObjToString((*userData)["name"])
 				usernickname = common.ObjToString((*userData)["nickname"])
 				uid = common.ObjToString((*userData)["uid"])
@@ -559,7 +565,7 @@ func bigCustomer() {
 				}
 				email := k
 				//email = "wanghao@jianyu360.com"
-				dir := "./xlsx/" + fileName + ".xlsx"
+				dir := "./xlsx/dk/" + fileName + ".xlsx"
 				err := xf.Save(dir)
 				if err != nil {
 					log.Println("xls error", err, dir)
@@ -583,6 +589,158 @@ func bigCustomer() {
 	log.Println("大客户线索定时任务结束")
 }
 
+func IsInternal(phone string) bool {
+	if DataAnalysisService.Count("dwd_f_userbase_insider", map[string]interface{}{
+		"mobile": phone,
+	}) > 0 {
+		return true
+	}
+	return false
+}
+
+// 咨询组线索
+func AdvisoryCommittee() {
+	runOk := getRunOk()
+	if !runOk {
+		log.Println("不是工作日,任务暂停")
+		return
+	}
+	log.Println("资询部线索定时任务开始")
+	dataArr := []map[string]interface{}{}
+	filterArr := []string{"-pc", "-app", "-wx", "-h5"}
+	sourceMap := map[string]string{} //根据留资维表:tidb/Jianyu_subjectdb/d_saleleads_code
+	saleSource := TiDb.SelectBySql(`SELECT source,name FROM d_saleleads_code WHERE department LIKE '%咨询组%' AND is_delete = 1`)
+	if saleSource != nil && len(*saleSource) > 0 {
+		for _, v := range *saleSource {
+			source := common.ObjToString(v["source"])
+			name := common.ObjToString(v["name"])
+			for _, s := range filterArr {
+				name = strings.ReplaceAll(name, s, "")
+			}
+			sourceMap[source] = name
+		}
+	}
+	nowTime := time.Now().Format(date.Date_Full_Layout)
+	advisoryCommitteeTime := cfg.AdvisoryCommitteeTime
+	if advisoryCommitteeTime == 0 {
+		advisoryCommitteeTime = time.Now().Unix()
+	}
+	saleleadsData, ok := Mgo.Find("saleLeads", map[string]interface{}{"createtime": map[string]interface{}{"$gte": advisoryCommitteeTime}}, "phone,createtime", nil, false, -1, -1)
+	if ok && saleleadsData != nil && len(*saleleadsData) > 0 {
+		data := FindBatchData("sc")
+		for _, v := range *saleleadsData {
+			sources := common.ObjToString(v["source"])
+			userid := common.ObjToString(v["userid"])
+			uid := ""
+			if !mongodb.IsObjectIdHex(userid) {
+				userMapping := TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"position_id": userid}, "", "")
+				if userMapping != nil && len(*userMapping) > 0 {
+					userid = common.ObjToString((*userMapping)["userid"])
+					uid = common.ObjToString((*userMapping)["uid"])
+				}
+			}
+			if sourceMap[sources] != "" {
+				company := common.ObjToString(v["company"])
+				phone := common.ObjToString(v["phone"])
+				if IsInternal(phone) {
+					continue
+				}
+				username := common.ObjToString(v["name"])
+				email := common.ObjToString(v["mail"])
+				interest := common.ObjToString(v["interest"])
+				data_requirement := common.ObjToString(v["data_requirement"])
+				source := sourceMap[sources]
+				belongTo := "资询组"
+				userData := TiDb.FindOne("dwd_f_userbase_baseinfo", map[string]interface{}{"uid": uid}, "", "")
+				if userData != nil {
+					bt := common.ObjToString((*userData)["belong_to"])
+					if strings.HasPrefix(bt, "03") || bt == "0102" {
+						continue
+					}
+				}
+				key := fmt.Sprintf("%s_%s", source, phone)
+				if _, ok := data[key]; ok {
+					continue
+				}
+				data[key] = true
+				dataArr = append(dataArr, map[string]interface{}{
+					"createTime":       nowTime,
+					"createtime":       v["createtime"],
+					"username":         username,
+					"company":          company,
+					"phone":            phone,
+					"source":           source,
+					"belongTo":         belongTo,
+					"interest":         interest,
+					"data_requirement": data_requirement,
+					"branch":           v["branch"],
+					"email":            email,
+				})
+
+			}
+			advisoryCommitteeTime = gconv.Int64(v["createtime"])
+		}
+		keyContent := fmt.Sprintf("data_%s_%s", time.Now().Format("2006-01-02"), "zx")
+		redis.Put("newother", keyContent, data, 86400)
+
+	}
+	cfg.AdvisoryCommitteeTime = advisoryCommitteeTime
+	xlsxArr := []string{"姓名", "联系方式", "邮箱", "公司名称", "咨询需求", "销售线索来源", "具体来源", "留资时间"}
+	if len(dataArr) > 0 {
+		//排序:首先按照“联系方式”排序,即同1个用户的留资放在一起,其次按照留资时间正序排序。
+		batch := FindBatch("zx")
+		fileName, detailName := "咨询服务销售线索 "+time.Now().Format(date.Date_Short_Layout)+"-"+batch, ""
+		xf := xlsx.NewFile()
+		style := xlsx.NewStyle()
+		style.Font.Size = 12
+		style.Font.Bold = true
+		style.Alignment.Vertical = "center"
+		style.Alignment.Horizontal = "center"
+		detailName = "今日新增商务合作销售线索,请查收附件,及时跟进。"
+		sh, _ := xf.AddSheet("线索数据")
+		row1 := sh.AddRow()
+		for _, x := range xlsxArr {
+			cell := row1.AddCell()
+			cell.SetString(x)
+			cell.SetStyle(style)
+		}
+		for _, v := range dataArr {
+
+			row := sh.AddRow()
+			row.AddCell().SetString(common.ObjToString(v["username"]))
+			row.AddCell().SetString(common.ObjToString(v["phone"]))
+			row.AddCell().SetString(common.ObjToString(v["email"]))
+			row.AddCell().SetString(common.ObjToString(v["company"]))
+			row.AddCell().SetString(common.ObjToString(v["data_requirement"]))
+			row.AddCell().SetString(common.ObjToString(v["source"]))
+			row.AddCell().SetString(common.ObjToString(v["interest"]))
+			row.AddCell().SetString(gconv.Time(gconv.Int64(v["createtime"])).Format(date.Date_Full_Layout))
+			//增加客户需求
+		}
+		email := db.MarketSaleMail
+		dir := "./xlsx/zx/" + fileName + ".xlsx"
+		xf.
+			err := xf.Save(dir)
+		if err != nil {
+			log.Println("xls error", err, dir)
+		} else {
+			gmail := &mail.GmailAuth{
+				SmtpHost: "smtp.exmail.qq.com",
+				SmtpPort: 465,
+				User:     "public03@topnet.net.cn",
+				Pwd:      "ue9Rg9Sf4CVtdm5a",
+			}
+			status := mail.GSendMail_q("剑鱼标讯", email, "", "", fileName, detailName, dir, fileName+".xlsx", gmail)
+			if status {
+				log.Println("send mail success", fileName, email)
+			}
+		}
+
+	}
+	common.WriteSysConfig(&cfg)
+	log.Println("大客户线索定时任务结束")
+}
+
 // 市场部线索
 func marketCustomer() {
 	runOk := getRunOk()
@@ -627,6 +785,9 @@ func marketCustomer() {
 			if sourceMap[sources] != "" {
 				company := common.ObjToString(v["company"])
 				phone := common.ObjToString(v["phone"])
+				if IsInternal(phone) {
+					continue
+				}
 				job := common.ObjToString(v["position"])
 				username := common.ObjToString(v["name"])
 				email := common.ObjToString(v["mail"])
@@ -707,7 +868,7 @@ func marketCustomer() {
 			//增加客户需求
 		}
 		email := db.MarketSaleMail
-		dir := "./xlsx/" + fileName + ".xlsx"
+		dir := "./xlsx/sc/" + fileName + ".xlsx"
 		err := xf.Save(dir)
 		if err != nil {
 			log.Println("xls error", err, dir)

+ 1 - 1
clueSync/jobutil.go

@@ -663,7 +663,7 @@ func saleLeads() {
 		//
 		filterArr := []string{"-pc", "-app", "-wx", "-h5"}
 		sourceMap := map[string]string{}
-		saleSource := TiDb.SelectBySql(`SELECT source,name FROM d_saleleads_code WHERE (department LIKE '%大客户%' or department LIKE '%市场组%') AND is_delete = 1`)
+		saleSource := TiDb.SelectBySql(`SELECT source,name FROM d_saleleads_code WHERE (department LIKE '%大客户%' or department LIKE '%市场组%' or department LIKE '%咨询组%') AND is_delete = 1`)
 		if saleSource != nil && len(*saleSource) > 0 {
 			for _, v := range *saleSource {
 				source := common.ObjToString(v["source"])

+ 34 - 25
clueSync/main.go

@@ -14,23 +14,24 @@ import (
 )
 
 var (
-	cfg                = new(Config)
-	db                 = new(DB)
-	Mysql              *mysql.Mysql
-	TiDb               *mysql.Mysql
-	TiDbData           *mysql.Mysql
-	TiDbPower          *mysql.Mysql
-	WorkOrder          *mysql.Mysql
-	ThirdParty         *mysql.Mysql
-	Jyactivities       *mysql.Mysql
-	Base               *mysql.Mysql
-	BiService          *mysql.Mysql
-	Es                 elastic.Es
-	Mgo                *mongodb.MongodbSim
-	MgoLog             *mongodb.MongodbSim
-	MgoQyxy            *mongodb.MongodbSim
-	mode               = flag.Int("m", 1, "")
-	startTime, endTime = "00:00", "23:59"
+	cfg                 = new(Config)
+	db                  = new(DB)
+	Mysql               *mysql.Mysql
+	TiDb                *mysql.Mysql
+	TiDbData            *mysql.Mysql
+	TiDbPower           *mysql.Mysql
+	WorkOrder           *mysql.Mysql
+	ThirdParty          *mysql.Mysql
+	Jyactivities        *mysql.Mysql
+	Base                *mysql.Mysql
+	BiService           *mysql.Mysql
+	DataAnalysisService *mysql.Mysql
+	Es                  elastic.Es
+	Mgo                 *mongodb.MongodbSim
+	MgoLog              *mongodb.MongodbSim
+	MgoQyxy             *mongodb.MongodbSim
+	mode                = flag.Int("m", 1, "")
+	startTime, endTime  = "00:00", "23:59"
 )
 
 func main() {
@@ -120,6 +121,15 @@ func main() {
 		MaxIdleConns: db.BiService.MaxIdle,
 	}
 	BiService.Init()
+	DataAnalysisService = &mysql.Mysql{
+		Address:      db.BiService.Host + ":" + fmt.Sprint(db.BiService.Port),
+		UserName:     db.BiService.User,
+		PassWord:     db.BiService.Password,
+		DBName:       db.BiService.Database,
+		MaxOpenConns: db.BiService.PollSize,
+		MaxIdleConns: db.BiService.MaxIdle,
+	}
+	DataAnalysisService.Init()
 	Es = elastic.NewEs(db.Es.Version, db.Es.Address, db.Es.DbSize, db.Es.UserName, db.Es.Password)
 	redis.InitRedis(db.RedisServer)
 	Mgo = mongodb.NewMgo(db.Mgo.Address, db.Mgo.DbName, db.Mgo.DbSize)
@@ -127,7 +137,6 @@ func main() {
 	MgoQyxy = mongodb.NewMgoWithUser(db.MgoQyxy.Address, db.MgoQyxy.DbName, db.MgoQyxy.User, db.MgoQyxy.Password, db.MgoQyxy.DbSize)
 	InitArea()
 	InitProduct(db.ProductArr)
-	//activeUsers() //取关重新关注处理
 	if *mode == 1 {
 		//30分钟一次
 		go p.VarTimeTask.RunInTimeLoop("30分钟定时任务", "", "", db.CornExp1, true, true, nil, func() {
@@ -138,12 +147,13 @@ func main() {
 		//5分钟一次
 
 		go p.VarTimeTask.RunInTimeSection("5分钟定时任务1", db.CornExp2Start, db.CornExp2End, db.CornExp2, func(dayFirst bool) {
-			users()          //新注册用户进线索
-			saleLeads()      //留资进线索
-			eventReg()       //渠道
-			bigCustomer()    //大客户线索
-			marketCustomer() //市场部线索
-			rebind()         //取关重新关注处理
+			users()             //新注册用户进线索
+			saleLeads()         //留资进线索
+			eventReg()          //渠道
+			bigCustomer()       //大客户线索
+			marketCustomer()    //市场部线索
+			AdvisoryCommittee() //咨询组线索
+			rebind()            //取关重新关注处理
 		})
 		//每天8点30
 		c := cron.New()
@@ -209,5 +219,4 @@ func main() {
 		users()
 		saleLeads()
 	}
-
 }