浏览代码

安博会需求

WH01243 9 月之前
父节点
当前提交
7f533bba57
共有 6 个文件被更改,包括 443 次插入35 次删除
  1. 4 0
      clueSync/config.go
  2. 5 1
      clueSync/db.json
  3. 98 6
      clueSync/everything.go
  4. 28 17
      clueSync/job.go
  5. 307 10
      clueSync/jobutil.go
  6. 1 1
      clueSync/tag.go

+ 4 - 0
clueSync/config.go

@@ -185,6 +185,10 @@ type (
 		NameToMail            map[string]string `json:"nameToMail"`
 		ThawDay               int64             `json:"thawDay"`
 		LoopType              int64             `json:"loopType"`
+		Sourceid              string            `json:"sourceid"`
+		AbhEmail              string            `json:"abhEmail"`
+		AfEmail               string            `json:"afEmail"`
+		NewRegistration       int64             `json:"newRegistration"`
 	}
 )
 

+ 5 - 1
clueSync/db.json

@@ -159,5 +159,9 @@
   "nameToMail": null,
   "thawDay": 3,
   "loopType": 1,
-  "advisoryCommitteeMail": ["wanghao@topnet.net.cn"]
+  "advisoryCommitteeMail": ["wanghao@topnet.net.cn"],
+  "sourceid": 88,
+  "afEmail": 1,
+  "abhEmail": 1,
+  "newRegistration": 1
 }

+ 98 - 6
clueSync/everything.go

@@ -366,6 +366,7 @@ func bigCustomer() {
 	if bigOrderTime == "" {
 		bigOrderTime = nowTime
 	}
+	abhList := []map[string]interface{}{}
 	data := FindBatchData("dk")
 	saleleadsData, ok := Mgo.Find("saleLeads", map[string]interface{}{"createtime": map[string]interface{}{"$gte": bigSaleTime}}, `{"phone":1,"createtime":1}`, nil, false, -1, -1)
 	if ok && saleleadsData != nil && len(*saleleadsData) > 0 {
@@ -406,6 +407,27 @@ func bigCustomer() {
 						continue
 					}
 				}
+				s_sourceid := common.ObjToString((*userData)["s_sourceid"])
+				if s_sourceid == db.Sourceid {
+					//安博会数据
+					abhList = append(abhList, map[string]interface{}{
+						"createTime":       nowTime,
+						"lastUpdateTime":   nowTime,
+						"uid":              uid,
+						"userid":           userid,
+						"username":         username,
+						"usernickname":     usernickname,
+						"company":          company,
+						"job":              job,
+						"phone":            phone,
+						"email":            email,
+						"source":           source,
+						"belongTo":         belongTo,
+						"interest":         interest,
+						"data_requirement": data_requirement,
+					})
+					continue
+				}
 				dataArr = append(dataArr, map[string]interface{}{
 					"createTime":       nowTime,
 					"lastUpdateTime":   nowTime,
@@ -447,7 +469,7 @@ func bigCustomer() {
 				query["userid"] = orderUserId
 			}
 			userData := TiDb.FindOne("dwd_f_userbase_baseinfo", query, "", "")
-			username, usernickname, userid, uid, source, payorderinfo, unpayorderinfo := "", "", "", "", "", "", ""
+			username, usernickname, userid, uid, source, payorderinfo, unpayorderinfo, s_sourceid := "", "", "", "", "", "", "", ""
 			if userData != nil {
 				if phone == "" {
 					phone = common.ObjToString((*userData)["phone"])
@@ -459,6 +481,7 @@ func bigCustomer() {
 				usernickname = common.ObjToString((*userData)["nickname"])
 				uid = common.ObjToString((*userData)["uid"])
 				userid = common.ObjToString((*userData)["userid"])
+				s_sourceid = common.ObjToString((*userData)["s_sourceid"])
 				bt := common.ObjToString((*userData)["belong_to"])
 				if strings.HasPrefix(bt, "03") || bt == "0102" {
 					continue
@@ -486,6 +509,25 @@ func bigCustomer() {
 				continue
 			}
 			data[key] = true
+			if s_sourceid == db.Sourceid {
+				abhList = append(abhList, map[string]interface{}{
+					"createTime":     nowTime,
+					"lastUpdateTime": nowTime,
+					"phone":          phone,
+					"username":       username,
+					"usernickname":   usernickname,
+					"uid":            uid,
+					"userid":         userid,
+					"company":        v["company_name"],
+					"email":          v["user_mail"],
+					"belongTo":       "大客户",
+					"source":         source,
+					"data_count":     v["data_count"],
+					"unpayorderinfo": unpayorderinfo,
+					"payorderinfo":   payorderinfo, //增加客户需求
+				})
+				continue
+			}
 			dataArr = append(dataArr, map[string]interface{}{
 				"createTime":     nowTime,
 				"lastUpdateTime": nowTime,
@@ -506,6 +548,9 @@ func bigCustomer() {
 		}
 		cfg.BigOrderTime = bigOrderTime
 	}
+	if len(abhList) > 0 {
+		ABHEmail("big", abhList)
+	}
 	xlsxArr := []string{"用户昵称", "姓名", "公司名称", "职位", "联系人电话", "购买条数", "用户邮箱", "已支付订单信息", "未支付订单类型", "销售线索来源", "具体来源", "数据需求"}
 	if len(dataArr) > 0 {
 		keyContent := fmt.Sprintf("data_%s_%s", time.Now().Format("2006-01-02"), "dk")
@@ -627,6 +672,7 @@ func AdvisoryCommittee() {
 	if advisoryCommitteeTime == 0 {
 		advisoryCommitteeTime = time.Now().Unix()
 	}
+	abhList := []map[string]interface{}{}
 	saleleadsData, ok := Mgo.Find("saleLeads", map[string]interface{}{"createtime": map[string]interface{}{"$gte": advisoryCommitteeTime}}, `{"phone":1,"createtime":1}`, nil, false, -1, -1)
 	if ok && saleleadsData != nil && len(*saleleadsData) > 0 {
 		data := FindBatchData("zx")
@@ -665,6 +711,23 @@ func AdvisoryCommittee() {
 					continue
 				}
 				data[key] = true
+				s_sourceid := common.ObjToString((*userData)["s_sourceid"])
+				if s_sourceid == db.Sourceid {
+					abhList = append(abhList, 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,
+					})
+					continue
+				}
 				dataArr = append(dataArr, map[string]interface{}{
 					"createTime":       nowTime,
 					"createtime":       v["createtime"],
@@ -687,6 +750,10 @@ func AdvisoryCommittee() {
 		keyContent := fmt.Sprintf("data_%s_%s", time.Now().Format("2006-01-02"), "zx")
 		redis.Put("newother", keyContent, data, 86400)
 	}
+	if len(abhList) > 0 {
+		//安博会发邮件高翔
+		ABHEmail("advisory", abhList)
+	}
 	cfg.AdvisoryCommitteeTime = advisoryCommitteeTime
 	xlsxArr := []string{"姓名", "联系方式", "邮箱", "公司名称", "咨询需求", "销售线索来源", "具体来源", "留资时间"}
 	if len(dataArr) > 0 {
@@ -708,7 +775,6 @@ func AdvisoryCommittee() {
 			cell.SetStyle(style)
 		}
 		for _, v := range dataArr {
-
 			row := sh.AddRow()
 			row.AddCell().SetString(common.ObjToString(v["username"]))
 			row.AddCell().SetString(common.ObjToString(v["phone"]))
@@ -738,9 +804,7 @@ func AdvisoryCommittee() {
 					log.Println("send mail success", fileName, v)
 				}
 			}
-
 		}
-
 	}
 	common.WriteSysConfig(&cfg)
 	log.Println("咨询部线索定时任务结束")
@@ -773,6 +837,7 @@ func marketCustomer() {
 	if marketSaleTime == 0 {
 		marketSaleTime = time.Now().Unix()
 	}
+	abhList := []map[string]interface{}{}
 	saleleadsData, ok := Mgo.Find("saleLeads", map[string]interface{}{"createtime": map[string]interface{}{"$gte": marketSaleTime}}, `{"phone":1,"createtime":1}`, nil, false, -1, -1)
 	if ok && saleleadsData != nil && len(*saleleadsData) > 0 {
 		data := FindBatchData("sc")
@@ -812,8 +877,30 @@ func marketCustomer() {
 				if _, ok := data[key]; ok {
 					continue
 				}
-
+				s_sourceid := common.ObjToString((*userData)["s_sourceid"])
 				data[key] = true
+				if s_sourceid == db.Sourceid {
+					abhList = append(abhList, map[string]interface{}{
+						"createTime":       nowTime,
+						"lastUpdateTime":   nowTime,
+						"createtime":       v["createtime"],
+						"uid":              uid,
+						"userid":           userid,
+						"username":         username,
+						"usernickname":     usernickname,
+						"company":          company,
+						"job":              job,
+						"phone":            phone,
+						"email":            email,
+						"source":           source,
+						"belongTo":         belongTo,
+						"interest":         interest,
+						"data_requirement": data_requirement,
+						"branch":           v["branch"],
+						"s_sourceid":       s_sourceid,
+					})
+					continue
+				}
 				dataArr = append(dataArr, map[string]interface{}{
 					"createTime":       nowTime,
 					"lastUpdateTime":   nowTime,
@@ -831,6 +918,7 @@ func marketCustomer() {
 					"interest":         interest,
 					"data_requirement": data_requirement,
 					"branch":           v["branch"],
+					"s_sourceid":       s_sourceid,
 				})
 
 			}
@@ -838,6 +926,10 @@ func marketCustomer() {
 				marketSaleTime = gconv.Int64(v["createtime"])
 			}
 		}
+		if len(abhList) > 0 {
+			//安博会发邮件高翔
+			ABHEmail("market", abhList)
+		}
 		keyContent := fmt.Sprintf("data_%s_%s", time.Now().Format("2006-01-02"), "sc")
 		redis.Put("newother", keyContent, data, 86400)
 
@@ -903,7 +995,7 @@ func eventReg() {
 	data := Jyactivities.SelectBySql(sql)
 	if data != nil && *data != nil && len(*data) > 0 {
 		for _, v := range *data {
-			ok1, ok2 := FormatData(v, "eventReg")
+			ok1, ok2, _ := FormatData(v, "eventReg")
 			if !ok1 {
 				common.WriteSysConfig(&cfg)
 				log.Println("线索卡点", "eventReg", v, lastEventRegTime)

+ 28 - 17
clueSync/job.go

@@ -16,8 +16,8 @@ import (
 	"app.yhyue.com/moapp/jybase/mongodb"
 )
 
-func FormatData(data map[string]interface{}, item string) (bool, bool) {
-	userId, uId, positionId, source, cluename, phone, sourceCode, keyword := common.ObjToString(data["user_id"]), "", "", "", "", "", "", []string{}
+func FormatData(data map[string]interface{}, item string) (bool, bool, bool) {
+	userId, uId, positionId, source, cluename, phone, sourceCode, keyword, s_sourceid := common.ObjToString(data["user_id"]), "", "", "", "", "", "", []string{}, ""
 	role, industry, department, departments, position, name, top_cluetype, sub_cluetype, follow_project_area, level := "", "", "", "", "", "", "", "", "", ""
 	query, topname, subname, belong_to, sourceName, remark, sourceId := map[string]interface{}{}, "", "", "01", "", "", int64(0)
 	nowTime := time.Now().Format("2006-01-02 15:04:05")
@@ -80,12 +80,18 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 				uId = common.ObjToString((*userInfo)["uid"])
 				source = common.ObjToString((*userInfo)["source"])
 				belong_to = common.ObjToString((*userInfo)["belong_to"])
+				s_sourceid = common.ObjToString((*userInfo)["s_sourceid"])
 			}
 			if item == "xcxusers" {
 				sourceCode = common.ObjToString(data["industry"])
+				createtimeStr := common.ObjToString(data["createtime"])
+				t, _ := time.Parse("2006-01-02 15:04:05", createtimeStr)
 				if sourceCode == "" {
 					log.Println("留资没有source", phone)
-					return true, true
+					return true, true, true
+				}
+				if t.Unix() > db.NewRegistration && sourceCode == "安防" {
+					return true, true, false
 				}
 				//线索名称查询处理
 				clueData, _ := TiDb.FindOne("dwd_f_crm_clue_info", map[string]interface{}{"uid": uId}, "", ""), true //查当前线索是否已存在
@@ -128,7 +134,7 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 		sourceCode = common.ObjToString(data["source"])
 		if sourceCode == "" {
 			log.Println("留资没有source", phone)
-			return true, true
+			return true, true, true
 		}
 		remark = common.ObjToString(data["jyRemark"]) //荟聚线索备注
 		keywordArr := data["keyword"]
@@ -153,14 +159,15 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 				source = common.ObjToString((*userInfo)["source"])
 				belong_to = common.ObjToString((*userInfo)["belong_to"])
 				userId = common.ObjToString((*userInfo)["userid"])
+				s_sourceid = common.ObjToString((*userInfo)["s_sourceid"])
 			}
 		} else {
 			if sourceCode == "report_retention" || sourceCode == "marketing_retention" { //荟聚线索来源,不是剑鱼用户,需要等待用户归集
 				log.Println("不是剑鱼用户留资,等待用户", phone)
-				return false, false
+				return false, false, true
 			} else if remark != "" {
 				log.Println("留资source过滤", phone, sourceCode)
-				return true, true
+				return true, true, true
 			}
 		}
 	} else if item == "eventReg" { //渠道
@@ -216,14 +223,18 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 	if source == "0104" || strings.HasPrefix(belong_to, "02") || source == "0102" || source == "0103" || phone == "" { //参照用户来源代码表
 		//log.Println("线索分配失败,线索过滤!!", item, source, phone, userId)
 		//saveHlyj(belong_to, item, phone, name, sourceName, cluename, position, nowTime, isGroup, isCommerce)
-		return true, true
+		return true, true, true
+	}
+	//安博会
+	if s_sourceid == db.Sourceid {
+		return true, true, false
 	}
 	if uId == "" { //没有进用户归集,等待进入,结束任务,放在下次继续执行
 		if isExists, _ := redis.Exists("bidx", "bidx_userId_"+userId); isExists {
 			redisInt := redis.GetInt("bidx", "bidx_userId_"+userId)
 			if redisInt > 4 {
 				log.Println("线索分配失败,线索缺少信息,任务已执行超过1次", item, userId, phone)
-				return true, true
+				return true, true, true
 			} else {
 				redis.Incr("bidx", "bidx_userId_"+userId)
 			}
@@ -231,7 +242,7 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 			redis.Put("bidx", "bidx_userId_"+userId, 1, 3600)
 		}
 		log.Println("线索分配失败,线索缺少信息", item, phone, userId)
-		return false, false
+		return false, false, true
 	}
 	if item == "orders" { //订单没信息再查一遍留资
 		qid := positionId
@@ -252,20 +263,20 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 	top_cluetype, sub_cluetype, level, topname, subname = getClueType(item, data, sourceCode, sourceId) //查留资来源名字
 	if topname == "市场活动" && item == "saleLeads" {                                                       //市场活动的不要
 		log.Println("市场活动留资过滤 ", userId, phone)
-		return true, true
+		return true, true, true
 	}
 	if strings.HasPrefix(belong_to, "03") { //一切都好的不进
 		isOk := saveEverything(userId, phone, item, subname, sourceCode)
 		log.Println("渠道线索电销", userId, phone, item, subname, sourceCode)
 		if !isOk {
-			return true, true
+			return true, true, true
 		}
 	}
 	follow_project_area = getAreaCode(userId) //关注项目区域
 	log.Println("data +++", top_cluetype, sub_cluetype, level, follow_project_area, isGroup, isCommerce)
 	if top_cluetype == "" || sub_cluetype == "" || level == "" {
 		log.Println("线索分配失败,线索过滤top_cluetype!!", item, uId, phone, userId)
-		return true, true
+		return true, true, true
 	}
 	position_id, seatNumber, saleName, saleData, pIsOk, isFreeze, noticePositionId := autoDraw(level, cluename, phone, isGroup, isCommerce) //查询当前分配次数最少的,如果当前线索有销售,此次找出的不会+1
 	log.Println("data -------", position_id, seatNumber, saleName, pIsOk, isFreeze, noticePositionId)
@@ -279,7 +290,7 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 			//已存在,走更新
 			batch_import := common.ObjToString((*uCount)["batch_import"])
 			if batch_import != "" && item == "users" { //有导入批次号还是新用户,不执行
-				return true, true
+				return true, true, true
 			}
 			oks = UpdateClue(*uCount, saleData, item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber, level, position_id, source, sourceCode, remark, keyword, belong_to, isGroup, isCommerce, pIsOk)
 		} else { //不存在走新增
@@ -290,7 +301,7 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 		}
 		if !oks {
 			log.Println("线索分配失败!!", item, position_id, seatNumber, uId, userId, phone)
-			return false, false
+			return false, false, true
 		}
 	} else {
 		if isFreeze {
@@ -437,11 +448,11 @@ func FormatData(data map[string]interface{}, item string) (bool, bool) {
 				}
 			}
 			AssFail(noticePositionId, cluename, phone)
-			return true, true
+			return true, true, true
 		}
-		return true, false
+		return true, false, true
 	}
-	return true, true
+	return true, true, true
 }
 
 func SaveClue(item, userId, uId, top_cluetype, sub_cluetype, topname, subname, cluename, name, saleName, phone, position, department, departments, industry, follow_project_area, role, seatNumber string, positionId int64, source, sourceCode, remark string, keyword []string, belong_to string, isGroup, isCommerce int, isFreeze bool, demand string) bool {

+ 307 - 10
clueSync/jobutil.go

@@ -1,8 +1,10 @@
 package main
 
 import (
+	"app.yhyue.com/moapp/jybase/mail"
 	"app.yhyue.com/moapp/jybase/redis"
 	"fmt"
+	"github.com/tealeg/xlsx"
 	"log"
 	"math"
 	"strings"
@@ -508,7 +510,7 @@ func orders() {
 			product_type_str1 := `"大会员","VIP订阅","数据流量包","历史数据"`
 			product_type := common.ObjToString(v["product_type"])
 			if order_status == 0 && is_backstage_order == 0 && strings.Contains(product_type_str1, product_type) {
-				ok1, ok2 := FormatData(v, "orders")
+				ok1, ok2, _ := FormatData(v, "orders")
 				if !ok1 {
 					common.WriteSysConfig(&cfg)
 					log.Println("线索卡点", "orders", v, selectTimeEnd, selectTimeStart)
@@ -533,7 +535,7 @@ func readClue() {
 	data := TiDb.SelectBySql(sql)
 	if data != nil && *data != nil && len(*data) > 0 {
 		for _, v := range *data {
-			ok1, ok2 := FormatData(v, "readClue")
+			ok1, ok2, _ := FormatData(v, "readClue")
 			if !ok1 {
 				common.WriteSysConfig(&cfg)
 				log.Println("线索卡点", "readClue", v, lastReadClueTime)
@@ -563,11 +565,18 @@ func users() {
 	selectTimeEnd := cfg.LastUserId
 	sql := fmt.Sprintf(`select * from dwd_f_userbase_baseinfo   where createtime > "%s" and (s_platform != 'xcx' or  s_platform is  NULL)  and source = "0101" and status != 2  order by  createtime asc`, selectTimeEnd)
 	data := TiDb.SelectBySql(sql)
+	abhList := []map[string]interface{}{}
 	if data != nil && *data != nil && len(*data) > 0 {
 		for k, v := range *data {
 			//判断用户是否有小程序切使用过剑鱼其他产品
 			createtime := common.ObjToString(v["createtime"])
-			ok1, ok2 := FormatData(v, "users")
+			ok1, ok2, ok3 := FormatData(v, "users")
+			if !ok3 {
+				cfg.LastUserId = createtime
+				//安博会数据
+				abhList = append(abhList, v)
+				continue
+			}
 			if !ok1 {
 				log.Println("线索卡点", "users", v, selectTimeEnd)
 			} else {
@@ -579,6 +588,10 @@ func users() {
 				cfg.LastUserId = createtime
 			}
 		}
+		if len(abhList) > 0 {
+			//安博会发邮件高翔
+			ABHEmail("user", abhList)
+		}
 	}
 	common.WriteSysConfig(&cfg)
 	selectXcxTimeEnd := cfg.LastXcxUserId
@@ -618,6 +631,7 @@ WHERE
 	`, selectXcxTimeEnd, selectXcxTimeEnd)
 	xcxData := debrisProductMysql.SelectBySql(xcxSql)
 	if xcxData != nil && *xcxData != nil && len(*xcxData) > 0 {
+		afList := []map[string]interface{}{}
 		for k, v := range *xcxData {
 			//判断用户是否有小程序切使用过剑鱼其他产品
 			//判断uid
@@ -641,7 +655,11 @@ WHERE
 				cfg.LastXcxUserId = updatetime
 				continue
 			}
-			ok1, ok2 := FormatData(v, "xcxusers")
+			ok1, ok2, ok3 := FormatData(v, "xcxusers")
+			if !ok3 {
+				//首次使用"安防"小程序新注册用户
+				afList = append(afList, v)
+			}
 			if !ok1 {
 				common.WriteSysConfig(&cfg)
 				log.Println("小程序用户分配线索卡点", "xcxusers", v, selectXcxTimeEnd)
@@ -656,6 +674,9 @@ WHERE
 				cfg.LastXcxUserId = updatetime
 			}
 		}
+		if len(afList) > 0 {
+			//发邮件给张文福
+		}
 	}
 	common.WriteSysConfig(&cfg)
 	log.Println("新注册用户定时任务结束")
@@ -674,6 +695,7 @@ func saleLeads() {
 	log.Println("用户留资定时任务开始")
 	session := Mgo.GetMgoConn()
 	lastId := cfg.LastId
+	abhList := []map[string]interface{}{}
 	defer func() {
 		Mgo.DestoryMongoConn(session)
 	}()
@@ -710,7 +732,13 @@ func saleLeads() {
 		if sourceMap[sourceCode] != "" {
 			continue
 		}
-		ok1, ok2 := FormatData(thisData, "saleLeads")
+		ok1, ok2, ok3 := FormatData(thisData, "saleLeads")
+		if !ok3 {
+			cfg.LastId = mongodb.BsonIdToSId(thisData["_id"])
+			//安博会数据
+			abhList = append(abhList, thisData)
+			continue
+		}
 		if !ok1 {
 			log.Println("线索卡点", "saleLeads", thisData, lastId)
 		} else {
@@ -720,6 +748,10 @@ func saleLeads() {
 		}
 		cfg.LastId = mongodb.BsonIdToSId(thisData["_id"])
 	}
+	if len(abhList) > 0 {
+		//安博会发邮件高翔
+		ABHEmail("saleLeads", abhList)
+	}
 	common.WriteSysConfig(&cfg)
 	log.Println("用户留资定时任务结束")
 }
@@ -729,7 +761,9 @@ func userbase() {
 	selectTimeEnd := time.Unix(time.Now().Unix()-1800, 0).Format("2006-01-02 15:04:05")
 	sql := fmt.Sprintf(`select * from dwd_f_userbase_baseinfo where updatetime > "%s" and source != "0105" and source != "0104" and source != "0103" and source != "0102"`, selectTimeEnd)
 	data := TiDb.SelectBySql(sql)
+
 	if data != nil && *data != nil && len(*data) > 0 {
+		abhList := []map[string]interface{}{}
 		for _, v := range *data {
 			phone := common.ObjToString(v["phone"])
 			uId := common.ObjToString(v["uid"])
@@ -840,14 +874,17 @@ func userbase() {
 							}
 						} else {
 							if count == 0 {
-								ok1, ok2 := FormatData(v, "users")
+								ok1, ok2, ok3 := FormatData(v, "users")
+								if !ok3 {
+									//安博会数据
+									abhList = append(abhList, v)
+									continue
+								}
 								if !ok1 {
-									common.WriteSysConfig(&cfg)
 									log.Println("线索卡点", "userbase uid", v, uId)
 								} else {
 									if !ok2 {
 										log.Println("用户分配已达上限", "userbase uid", v, uId)
-										common.WriteSysConfig(&cfg)
 									}
 								}
 							} else {
@@ -866,6 +903,10 @@ func userbase() {
 				}
 			}
 		}
+		if len(abhList) > 0 {
+			//安博会发邮件高翔
+			ABHEmail("user", abhList)
+		}
 	}
 	log.Println("userbase定时任务结束")
 }
@@ -1390,7 +1431,7 @@ func rebind() {
 			rebindTimeEnd = common.ObjToString(v["sub_again_date"])
 			registedates, _ := time.Parse(date.Date_Full_Layout, gconv.String(v["register_time"]))
 			if time.Now().Unix()-registedates.Unix() > int64(db.RegTimes)*86400 {
-				ok1, ok2 := FormatData(v, "rebind")
+				ok1, ok2, _ := FormatData(v, "rebind")
 				if !ok1 {
 					log.Println("线索卡点", "allocation", v, rebindTimeEnd)
 				} else {
@@ -1422,7 +1463,7 @@ func activeUsers() {
 	if data != nil && *data != nil && len(*data) > 0 {
 		for _, v := range *data {
 			activeTimeEnd = common.ObjToString(v["act_again_date"])
-			ok1, ok2 := FormatData(v, "allocation")
+			ok1, ok2, _ := FormatData(v, "allocation")
 			log.Println(v, "allocation", ok1, ok2)
 			if !ok1 {
 				log.Println("线索卡点", "allocation", v, activeTimeEnd)
@@ -1437,3 +1478,259 @@ func activeUsers() {
 	}
 	log.Println("活跃用户处理结束")
 }
+
+// 安博会邮件
+func ABHEmail(source string, data []map[string]interface{}) {
+	fileName, detailName, email, dir := "", "", "", ""
+	var err error
+	switch source {
+	case "user":
+		xlsxArr := []string{"姓名", "联系方式", "邮箱", "公司名称", "咨询需求", "销售线索来源", "具体来源", "留资时间"}
+		batch := FindBatch("abh")
+		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 data {
+			row := sh.AddRow()
+			row.AddCell().SetString(common.ObjToString(v["name"]))
+			row.AddCell().SetString(common.ObjToString(v["phone"]))
+			row.AddCell().SetString(common.ObjToString(v["email"]))
+			row.AddCell().SetString(common.ObjToString(v["company_name"]))
+			row.AddCell().SetString("")
+			row.AddCell().SetString("")
+			row.AddCell().SetString("安博会用户注册")
+			row.AddCell().SetString(gconv.Time(gconv.Int64(v["createtime"])).Format(date.Date_Full_Layout))
+			//增加客户需求
+		}
+		dir := "./xlsx/abh/" + fileName + ".xlsx"
+		err = xf.Save(dir)
+	case "saleLeads":
+		xlsxArr := []string{"用户昵称", "姓名", "公司名称", "职位", "联系人电话", "购买条数", "用户邮箱", "已支付订单信息", "未支付订单类型", "销售线索来源", "具体来源", "数据需求"}
+		batch := FindBatch("abh")
+		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)
+		}
+		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
+			}
+		}
+		for _, v := range data {
+			sources := common.ObjToString(v["source"])
+			interest := common.ObjToString(v["interest"])
+			row := sh.AddRow()
+			row.AddCell().SetString(common.ObjToString(v["usernickname"]))
+			row.AddCell().SetString(common.ObjToString(v["username"]))
+			row.AddCell().SetString(common.ObjToString(v["company"]))
+			row.AddCell().SetString(common.ObjToString(v["job"]))
+			row.AddCell().SetString(common.ObjToString(v["phone"]))
+			row.AddCell().SetValue(0)
+			row.AddCell().SetString(common.ObjToString(v["email"]))
+			row.AddCell().SetString("")
+			row.AddCell().SetString("")
+			row.AddCell().SetString(sourceMap[sources])
+			row.AddCell().SetString(interest)
+			row.AddCell().SetString(common.ObjToString(v["data_requirement"]))
+			//增加客户需求
+		}
+		dir := "./xlsx/abh/" + fileName + ".xlsx"
+		err = xf.Save(dir)
+	case "big":
+		xlsxArr := []string{"用户昵称", "姓名", "公司名称", "职位", "联系人电话", "购买条数", "用户邮箱", "已支付订单信息", "未支付订单类型", "销售线索来源", "具体来源", "数据需求"}
+		batch := FindBatch("abh")
+		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 data {
+			row := sh.AddRow()
+			row.AddCell().SetString(common.ObjToString(v["usernickname"]))
+			row.AddCell().SetString(common.ObjToString(v["username"]))
+			row.AddCell().SetString(common.ObjToString(v["company"]))
+			row.AddCell().SetString(common.ObjToString(v["job"]))
+			row.AddCell().SetString(common.ObjToString(v["phone"]))
+			row.AddCell().SetValue(common.IntAll(v["data_count"]))
+			row.AddCell().SetString(common.ObjToString(v["email"]))
+			row.AddCell().SetString(common.ObjToString(v["payorderinfo"]))
+			row.AddCell().SetString(common.ObjToString(v["unpayorderinfo"]))
+			row.AddCell().SetString(common.ObjToString(v["source"]))
+			row.AddCell().SetString(common.ObjToString(v["interest"]))
+			row.AddCell().SetString(common.ObjToString(v["data_requirement"]))
+			//增加客户需求
+		}
+		dir := "./xlsx/abh/" + fileName + ".xlsx"
+		err = xf.Save(dir)
+	case "advisory":
+		xlsxArr := []string{"姓名", "联系方式", "邮箱", "公司名称", "咨询需求", "销售线索来源", "具体来源", "留资时间"}
+		//排序:首先按照“联系方式”排序,即同1个用户的留资放在一起,其次按照留资时间正序排序。
+		batch := FindBatch("abh")
+		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 data {
+			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))
+		}
+		dir := "./xlsx/abh/" + fileName + ".xlsx"
+		err = xf.Save(dir)
+	case "market":
+		xlsxArr := []string{"姓名", "联系人电话", "公司名称", "职位", "部门", "销售线索来源", "留资时间"}
+		batch := FindBatch("abh")
+		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 data {
+			row := sh.AddRow()
+			row.AddCell().SetString(common.ObjToString(v["username"]))
+			row.AddCell().SetString(common.ObjToString(v["phone"]))
+			row.AddCell().SetString(common.ObjToString(v["company"]))
+			row.AddCell().SetString(common.ObjToString(v["job"]))
+			row.AddCell().SetString(common.ObjToString(v["branch"]))
+			row.AddCell().SetString(common.ObjToString(v["source"]))
+			row.AddCell().SetString(gconv.Time(gconv.Int64(v["createtime"])).Format(date.Date_Full_Layout))
+			//增加客户需求
+		}
+		dir := "./xlsx/abh/" + fileName + ".xlsx"
+		err = xf.Save(dir)
+	}
+	email = db.AbhEmail
+	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)
+		}
+	}
+}
+
+// 安防邮件
+func AFEmail(data []map[string]interface{}) {
+	xlsxArr := []string{"姓名", "联系方式", "邮箱", "公司名称", "咨询需求", "销售线索来源", "具体来源", "留资时间"}
+	batch := FindBatch("af")
+	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 data {
+		row := sh.AddRow()
+		row.AddCell().SetString(common.ObjToString(v["name"]))
+		row.AddCell().SetString(common.ObjToString(v["phone"]))
+		row.AddCell().SetString(common.ObjToString(v["email"]))
+		row.AddCell().SetString(common.ObjToString(v["company_name"]))
+		row.AddCell().SetString("")
+		row.AddCell().SetString("")
+		row.AddCell().SetString("首次使用安防新注册")
+		row.AddCell().SetString(gconv.Time(gconv.Int64(v["createtime"])).Format(date.Date_Full_Layout))
+		//增加客户需求
+	}
+	email := db.AfEmail
+	dir := "./xlsx/af/" + fileName + ".xlsx"
+	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)
+		}
+
+	}
+}

+ 1 - 1
clueSync/tag.go

@@ -321,7 +321,7 @@ func messageSync() {
 				if mData != nil && len(*mData) > 0 {
 					own_id := common.Int64All((*mData)["own_id"])
 					if own_id > 0 {
-						ok1, ok2 := FormatData(*mData, "message")
+						ok1, ok2, _ := FormatData(*mData, "message")
 						if !ok1 {
 							log.Println("线索卡点", "message", mData, messag_id)
 						} else {