浏览代码

Merge branch 'master' into feature/v1.5.13

yuelujie 8 月之前
父节点
当前提交
cb241c1392
共有 7 个文件被更改,包括 857 次插入418 次删除
  1. 36 36
      clueSync/config.go
  2. 3 5
      clueSync/db.json
  3. 636 365
      clueSync/everything.go
  4. 1 0
      clueSync/go.mod
  5. 2 0
      clueSync/go.sum
  6. 170 4
      clueSync/jobutil.go
  7. 9 8
      clueSync/main.go

+ 36 - 36
clueSync/config.go

@@ -8,27 +8,28 @@ 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"`
-		AdvisoryCommitteeTime int64   `json:"advisoryCommitteeTime"`
-		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"`
+		SelectionDepartmentTime int64   `json:"selectionDepartmentTime"`
+		AllocationTime          string  `json:"allocationTime"`
+		AllocationRatio         float64 `json:"allocationRatio"`
+		ActiveTime              string  `json:"activeTime"`
+		RebindTime              string  `json:"rebindTime"`
 	}
 	DB struct {
 		CornExp1      int64  `json:"cornexp1"`
@@ -174,21 +175,20 @@ type (
 			UserName string `json:"user	Name"`
 			Password string `json:"password"`
 		} `json:"es"`
-		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"`
-		Sourceid              string            `json:"sourceid"`
-		AbhEmail              string            `json:"abhEmail"`
-		AfEmail               string            `json:"afEmail"`
-		NewRegistration       int64             `json:"newRegistration"`
+		ProductArr      []string          `json:"productArr"`
+		RedisServer     string            `json:"redisServer"`
+		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"`
+		Sourceid        string            `json:"sourceid"`
+		AbhEmail        string            `json:"abhEmail"`
+		AfEmail         string            `json:"afEmail"`
+		NewRegistration int64             `json:"newRegistration"`
+		OperationEmail  []string          `json:"operationEmail"`
 	}
 )
 

+ 3 - 5
clueSync/db.json

@@ -141,7 +141,6 @@
     "物业专版",
     "市场分析报告"
   ],
-  "marketSaleMail": "wanghao@jianyu360.com",
   "allocationCap": 400,
   "warningValue": 350,
   "corn_mail": "",
@@ -159,9 +158,8 @@
   "nameToMail": null,
   "thawDay": 3,
   "loopType": 1,
-  "advisoryCommitteeMail": ["wanghao@topnet.net.cn"],
-  "sourceid": 88,
-  "afEmail": 1,
-  "abhEmail": 1,
+  "sourceid": "88",
+  "afEmail": "wanghao@topnet.net.cn",
+  "abhEmail": "wanghao@topnet.net.cn",
   "newRegistration": 1
 }

+ 636 - 365
clueSync/everything.go

@@ -567,82 +567,63 @@ func bigCustomer() {
 	}
 	xlsxArr := []string{"用户昵称", "姓名", "公司名称", "职位", "联系人电话", "购买条数", "用户邮箱", "已支付订单信息", "未支付订单类型", "销售线索来源", "具体来源", "数据需求"}
 	if len(dataArr) > 0 {
-		bigData := TiDb.SelectBySql("select * from dwd_f_crm_clue_big_autodraw_record")
-		if bigData != nil && len(*bigData) > 0 {
-			cdata := *bigData
-			bigArr := map[string][]map[string]interface{}{}
-			for _, v := range dataArr {
-				mincount := common.IntAll(cdata[0]["count"])
-				minindex := 0
-				minemail := ""
-				for kk, vv := range cdata {
-					vcount := common.IntAll(vv["count"])
-					vemail := common.ObjToString(vv["email"])
-					if vcount <= mincount {
-						minindex = kk
-						mincount = vcount
-						minemail = vemail
-					}
-				}
-				bigArr[minemail] = append(bigArr[minemail], v)
-				cdata[minindex]["count"] = mincount + 1
-				name := common.ObjToString(cdata[minindex]["name"])
-				TiDb.UpdateOrDeleteBySql(`update dwd_f_crm_clue_big_autodraw_record set count = count + 1 where name = ?`, name)
+		bigArr := map[string][]map[string]interface{}{}
+		for _, v := range dataArr {
+			minemail, _ := EmailSelect("dk")
+			bigArr[minemail] = append(bigArr[minemail], v)
+		}
+		for k, vb := range bigArr {
+			batch := FindBatch("dk")
+			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 = time.Now().Format(date.Date_Short_Layout) + "数据详情请查看附件"
+			sh, _ := xf.AddSheet("线索数据")
+			row1 := sh.AddRow()
+			for _, x := range xlsxArr {
+				cell := row1.AddCell()
+				cell.SetString(x)
+				cell.SetStyle(style)
 			}
-			for k, vb := range bigArr {
-				batch := FindBatch("dk")
-				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 = time.Now().Format(date.Date_Short_Layout) + "数据详情请查看附件"
-				sh, _ := xf.AddSheet("线索数据")
-				row1 := sh.AddRow()
-				for _, x := range xlsxArr {
-					cell := row1.AddCell()
-					cell.SetString(x)
-					cell.SetStyle(style)
-				}
-				for _, v := range vb {
-					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"]))
-					//增加客户需求
+			for _, v := range vb {
+				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"]))
+				//增加客户需求
+			}
+			email := k
+			//email = "wanghao@jianyu360.com"
+			dir := "./xlsx/dk/" + 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",
 				}
-				email := k
-				//email = "wanghao@jianyu360.com"
-				dir := "./xlsx/dk/" + 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)
-					}
+				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("大客户线索定时任务结束")
@@ -657,81 +638,101 @@ func IsInternal(phone string) bool {
 	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
+
+	func AdvisoryCommittee() {
+		runOk := getRunOk()
+		if !runOk {
+			log.Println("不是工作日,任务暂停")
+			return
 		}
-	}
-	nowTime := time.Now().Format(date.Date_Full_Layout)
-	advisoryCommitteeTime := cfg.AdvisoryCommitteeTime
-	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")
-		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"])
-				}
-			} else {
-				userMapping := TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"userid": userid}, "", "")
-				if userMapping != nil && len(*userMapping) > 0 {
-					userid = common.ObjToString((*userMapping)["userid"])
-					uid = common.ObjToString((*userMapping)["uid"])
+		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
 			}
-			if sourceMap[sources] != "" {
-				company := common.ObjToString(v["company"])
-				phone := common.ObjToString(v["phone"])
-				if IsInternal(phone) {
-					continue
+		}
+		nowTime := time.Now().Format(date.Date_Full_Layout)
+		advisoryCommitteeTime := cfg.AdvisoryCommitteeTime
+		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")
+			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"])
+					}
+				} else {
+					userMapping := TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"userid": userid}, "", "")
+					if userMapping != nil && len(*userMapping) > 0 {
+						userid = common.ObjToString((*userMapping)["userid"])
+						uid = common.ObjToString((*userMapping)["uid"])
+					}
 				}
-				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" {
+				if sourceMap[sources] != "" {
+					company := common.ObjToString(v["company"])
+					phone := common.ObjToString(v["phone"])
+					if IsInternal(phone) {
 						continue
 					}
-				}
-				key := fmt.Sprintf("%s_%s_%s", source, phone, interest)
-				if _, ok := data[key]; ok {
-					continue
-				}
-				data[key] = true
-				s_sourceid := common.ObjToString((*userData)["s_sourceid"])
-				if s_sourceid == db.Sourceid {
-					abhList = append(abhList, map[string]interface{}{
+					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_%s", source, phone, interest)
+					if _, ok := data[key]; ok {
+						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,
+						})
+						if gconv.Int64(v["createtime"]) > advisoryCommitteeTime {
+							advisoryCommitteeTime = gconv.Int64(v["createtime"])
+						}
+						continue
+					}
+					dataArr = append(dataArr, map[string]interface{}{
 						"createTime":       nowTime,
 						"createtime":       v["createtime"],
 						"username":         username,
@@ -744,168 +745,175 @@ func AdvisoryCommittee() {
 						"branch":           v["branch"],
 						"email":            email,
 					})
-					if gconv.Int64(v["createtime"]) > advisoryCommitteeTime {
-						advisoryCommitteeTime = gconv.Int64(v["createtime"])
-					}
-					continue
+
 				}
-				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,
-				})
 
 			}
-
+			keyContent := fmt.Sprintf("data_%s_%s", time.Now().Format("2006-01-02"), "zx")
+			redis.Put("newother", keyContent, data, 86400)
 		}
-		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 {
-		//排序:首先按照“联系方式”排序,即同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))
-			//增加客户需求
+		if len(abhList) > 0 {
+			//安博会发邮件高翔
+			ABHEmail("advisory", abhList)
 		}
-		email := db.AdvisoryCommitteeMail
-		dir := "./xlsx/zx/" + 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",
+		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 email {
-				status := mail.GSendMail_q("剑鱼标讯", v, "", "", fileName, detailName, dir, fileName+".xlsx", gmail)
-				if status {
-					log.Println("send mail success", fileName, v)
+			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.AdvisoryCommitteeMail
+			dir := "./xlsx/zx/" + 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",
+				}
+				for _, v := range email {
+					status := mail.GSendMail_q("剑鱼标讯", v, "", "", fileName, detailName, dir, fileName+".xlsx", gmail)
+					if status {
+						log.Println("send mail success", fileName, v)
+					}
 				}
 			}
 		}
+		common.WriteSysConfig(&cfg)
+		log.Println("咨询部线索定时任务结束")
 	}
-	common.WriteSysConfig(&cfg)
-	log.Println("咨询部线索定时任务结束")
-}
 
 // 市场部线索
-func marketCustomer() {
-	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
+
+	func marketCustomer() {
+		runOk := getRunOk()
+		if !runOk {
+			log.Println("不是工作日,任务暂停")
+			return
 		}
-	}
-	nowTime := time.Now().Format(date.Date_Full_Layout)
-	marketSaleTime := cfg.MarketSaleTime
-	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")
-		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"])
-				}
-			} else {
-				userMapping := TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"userid": userid}, "", "")
-				if userMapping != nil && len(*userMapping) > 0 {
-					userid = common.ObjToString((*userMapping)["userid"])
-					uid = common.ObjToString((*userMapping)["uid"])
+		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
 			}
-			if sourceMap[sources] != "" {
-				company := common.ObjToString(v["company"])
-				phone := common.ObjToString(v["phone"])
-				if IsInternal(phone) {
-					continue
+		}
+		nowTime := time.Now().Format(date.Date_Full_Layout)
+		marketSaleTime := cfg.MarketSaleTime
+		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")
+			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"])
+					}
+				} else {
+					userMapping := TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"userid": userid}, "", "")
+					if userMapping != nil && len(*userMapping) > 0 {
+						userid = common.ObjToString((*userMapping)["userid"])
+						uid = common.ObjToString((*userMapping)["uid"])
+					}
 				}
-				job := common.ObjToString(v["position"])
-				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, usernickname := "市场组", ""
-				userData := TiDb.FindOne("dwd_f_userbase_baseinfo", map[string]interface{}{"uid": uid}, "", "")
-				if userData != nil {
-					usernickname = common.ObjToString((*userData)["nickname"])
-					bt := common.ObjToString((*userData)["belong_to"])
-					if strings.HasPrefix(bt, "03") || bt == "0102" {
+				if sourceMap[sources] != "" {
+					company := common.ObjToString(v["company"])
+					phone := common.ObjToString(v["phone"])
+					if IsInternal(phone) {
 						continue
 					}
-				}
-				key := fmt.Sprintf("%s_%s", source, phone)
-				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{}{
+					job := common.ObjToString(v["position"])
+					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, usernickname := "市场组", ""
+					userData := TiDb.FindOne("dwd_f_userbase_baseinfo", map[string]interface{}{"uid": uid}, "", "")
+					if userData != nil {
+						usernickname = common.ObjToString((*userData)["nickname"])
+						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
+					}
+					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,
+						})
+						if gconv.Int64(v["createtime"]) > marketSaleTime {
+							marketSaleTime = gconv.Int64(v["createtime"])
+						}
+						continue
+					}
+					dataArr = append(dataArr, map[string]interface{}{
 						"createTime":       nowTime,
 						"lastUpdateTime":   nowTime,
 						"createtime":       v["createtime"],
@@ -924,98 +932,75 @@ func marketCustomer() {
 						"branch":           v["branch"],
 						"s_sourceid":       s_sourceid,
 					})
-					if gconv.Int64(v["createtime"]) > marketSaleTime {
-						marketSaleTime = gconv.Int64(v["createtime"])
-					}
-					continue
-				}
-				dataArr = append(dataArr, 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,
-				})
 
+				}
+				if gconv.Int64(v["createtime"]) > marketSaleTime {
+					marketSaleTime = gconv.Int64(v["createtime"])
+				}
 			}
-			if gconv.Int64(v["createtime"]) > marketSaleTime {
-				marketSaleTime = gconv.Int64(v["createtime"])
+			if len(abhList) > 0 {
+				//安博会发邮件高翔
+				ABHEmail("market", abhList)
 			}
-		}
-		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)
+			keyContent := fmt.Sprintf("data_%s_%s", time.Now().Format("2006-01-02"), "sc")
+			redis.Put("newother", keyContent, data, 86400)
 
-	}
-	cfg.MarketSaleTime = marketSaleTime
-	xlsxArr := []string{"姓名", "联系人电话", "公司名称", "职位", "部门", "销售线索来源", "留资时间"}
-	if len(dataArr) > 0 {
-		//排序:首先按照“联系方式”排序,即同1个用户的留资放在一起,其次按照留资时间正序排序。
-		batch := FindBatch("sc")
-		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 {
+		cfg.MarketSaleTime = marketSaleTime
+		xlsxArr := []string{"姓名", "联系人电话", "公司名称", "职位", "部门", "销售线索来源", "留资时间"}
+		if len(dataArr) > 0 {
+			//排序:首先按照“联系方式”排序,即同1个用户的留资放在一起,其次按照留资时间正序排序。
+			batch := FindBatch("sc")
+			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["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))
-			//增加客户需求
-		}
-		email := db.MarketSaleMail
-		dir := "./xlsx/sc/" + 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",
+				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))
+				//增加客户需求
 			}
-			status := mail.GSendMail_q("剑鱼标讯", email, "", "", fileName, detailName, dir, fileName+".xlsx", gmail)
-			if status {
-				log.Println("send mail success", fileName, email)
+			email := db.MarketSaleMail
+			dir := "./xlsx/sc/" + 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)
+				}
 			}
-		}
 
+		}
+		common.WriteSysConfig(&cfg)
+		log.Println("大客户线索定时任务结束")
 	}
-	common.WriteSysConfig(&cfg)
-	log.Println("大客户线索定时任务结束")
-}
+*/
 func eventReg() {
 	lastEventRegTime := cfg.LastEventRegTime
 	sql := fmt.Sprintf(`select * from exhibition_sign_up where is_del = 0 and update_time > "%s" order by update_time asc`, lastEventRegTime)
@@ -1100,3 +1085,289 @@ func FindBatchData(moudle string) map[string]interface{} {
 	}
 
 }
+
+// 咨询组线索
+func AdvisoryCommittee() {
+	if !isRunning() {
+		log.Println("不是工作日,任务暂停")
+		return
+	}
+	log.Println("咨询部线索定时任务开始")
+
+	sourceMap := buildSourceMap("咨询组")
+	nowTime := time.Now().Format(date.Date_Full_Layout)
+	startTime := getCommitteeTime(cfg.AdvisoryCommitteeTime)
+	dataArr, abhList, endtime := processLeads("zx", startTime, sourceMap, nowTime)
+	if len(abhList) > 0 {
+		ABHEmail("advisory", abhList)
+	}
+
+	cfg.AdvisoryCommitteeTime = endtime
+	exportToExcel(dataArr, "咨询服务销售线索", "zx")
+	log.Println("咨询部线索定时任务结束")
+	common.WriteSysConfig(&cfg)
+}
+
+// 运营部线索
+func SelectionDepartment() {
+	if !isRunning() {
+		log.Println("不是工作日,任务暂停")
+		return
+	}
+	log.Println("运营部线索定时任务开始")
+
+	sourceMap := buildSourceMap("运营部")
+	nowTime := time.Now().Format(date.Date_Full_Layout)
+	startTime := getCommitteeTime(cfg.SelectionDepartmentTime)
+	dataArr, abhList, endtime := processLeads("yy", startTime, sourceMap, nowTime)
+	if len(abhList) > 0 {
+		ABHEmail("selection", abhList)
+	}
+	cfg.SelectionDepartmentTime = endtime
+	exportToExcel(dataArr, "运营部销售线索", "yy")
+	log.Println("运营部线索定时任务结束")
+	common.WriteSysConfig(&cfg)
+}
+
+// 市场部线索
+func MarketCustomer() {
+	if !isRunning() {
+		log.Println("不是工作日,任务暂停")
+		return
+	}
+	log.Println("市场部线索定时任务开始")
+
+	sourceMap := buildSourceMap("市场组")
+	nowTime := time.Now().Format(date.Date_Full_Layout)
+	startTime := getCommitteeTime(cfg.MarketSaleTime)
+	dataArr, abhList, endtime := processLeads("sc", startTime, sourceMap, nowTime)
+	if len(abhList) > 0 {
+		ABHEmail("market", abhList)
+	}
+	cfg.MarketSaleTime = endtime
+	exportToExcel(dataArr, "商务合作销售线索", "sc")
+	common.WriteSysConfig(&cfg)
+	log.Println("市场部线索定时任务结束")
+}
+
+// 判断是否在工作日
+func isRunning() bool {
+	return getRunOk()
+}
+
+// 从数据库构建来源映射
+func buildSourceMap(department string) map[string]string {
+	sourceMap := map[string]string{}
+	saleSource := TiDb.SelectBySql(fmt.Sprintf(`SELECT source,name FROM d_saleleads_code WHERE department LIKE '%%%s%%' AND is_delete = 1`, department))
+	if saleSource != nil {
+		for _, v := range *saleSource {
+			source := common.ObjToString(v["source"])
+			name := common.ObjToString(v["name"])
+			name = filterSourceName(name)
+			sourceMap[source] = name
+		}
+	}
+	return sourceMap
+}
+
+// 过滤来源名称
+func filterSourceName(name string) string {
+	filterArr := []string{"-pc", "-app", "-wx", "-h5"}
+	for _, s := range filterArr {
+		name = strings.ReplaceAll(name, s, "")
+	}
+	return name
+}
+
+// 获取最后一条数据时间
+func getCommitteeTime(cfgTime int64) int64 {
+	if cfgTime == 0 {
+		return time.Now().Unix()
+	}
+	return cfgTime
+}
+
+// 处理线索
+func processLeads(batch string, committeeTime int64, sourceMap map[string]string, nowTime string) ([]map[string]interface{}, []map[string]interface{}, int64) {
+	dataArr := []map[string]interface{}{}
+	abhList := []map[string]interface{}{}
+	endtime := int64(0)
+	saleleadsData, ok := Mgo.Find("saleLeads", map[string]interface{}{"createtime": map[string]interface{}{"$gte": committeeTime}}, `{"phone":1,"createtime":1}`, nil, false, -1, -1)
+	if ok && saleleadsData != nil {
+		data := FindBatchData(batch)
+		for _, v := range *saleleadsData {
+			lead := map[string]interface{}{}
+			lead, endtime = processLead(v, sourceMap, nowTime, committeeTime, data)
+			if lead != nil {
+				if isABHLead(lead) {
+					abhList = append(abhList, lead)
+				} else {
+					dataArr = append(dataArr, lead)
+				}
+			}
+		}
+		saveDataToRedis(data, batch)
+	}
+
+	return dataArr, abhList, endtime
+}
+
+// 处理单个线索
+func processLead(v map[string]interface{}, sourceMap map[string]string, nowTime string, committeeTime int64, data map[string]interface{}) (map[string]interface{}, int64) {
+	sources := common.ObjToString(v["source"])
+	// 更新委员会时间
+	if gconv.Int64(v["createtime"]) > committeeTime {
+		committeeTime = gconv.Int64(v["createtime"])
+	}
+	if sourceMap[sources] == "" {
+		return nil, committeeTime
+	}
+	phone := common.ObjToString(v["phone"])
+	if IsInternal(phone) {
+		return nil, committeeTime
+	}
+	// 获取用户信息
+	userData := getUserData(v)
+	if userData == nil || isUserInBlackList(userData) {
+		return nil, committeeTime
+	}
+	key := fmt.Sprintf("%s_%s_%s", sourceMap[sources], phone, common.ObjToString(v["interest"]))
+	if _, exists := data[key]; exists {
+		return nil, committeeTime
+	}
+	data[key] = true
+
+	return map[string]interface{}{
+		"createTime":       nowTime,
+		"createtime":       v["createtime"],
+		"username":         common.ObjToString(v["name"]),
+		"company":          common.ObjToString(v["company"]),
+		"phone":            phone,
+		"source":           sourceMap[sources],
+		"belongTo":         "咨询组/市场组", // 根据需要修改
+		"interest":         common.ObjToString(v["interest"]),
+		"data_requirement": common.ObjToString(v["data_requirement"]),
+		"branch":           v["branch"],
+		"job":              v["position"],
+		"email":            common.ObjToString(v["mail"]),
+	}, committeeTime
+}
+
+// 获取用户数据
+func getUserData(v map[string]interface{}) map[string]interface{} {
+	userid := common.ObjToString(v["userid"])
+	userMapping := &map[string]interface{}{}
+	if !mongodb.IsObjectIdHex(userid) {
+		userMapping = TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"position_id": userid}, "", "")
+	} else {
+		userMapping = TiDb.FindOne("dwd_f_userbase_id_mapping", map[string]interface{}{"userid": userid}, "", "")
+	}
+
+	if userMapping != nil && len(*userMapping) > 0 {
+		return *userMapping
+	}
+	return nil
+}
+
+// 判断用户是否在黑名单
+func isUserInBlackList(userData map[string]interface{}) bool {
+	bt := common.ObjToString(userData["belong_to"])
+	return strings.HasPrefix(bt, "03") || bt == "0102"
+}
+
+// 判断是否是安博会线索
+func isABHLead(lead map[string]interface{}) bool {
+	s_sourceid := common.ObjToString(lead["s_sourceid"])
+	return s_sourceid == db.Sourceid
+}
+
+// 导出到 Excel
+func exportToExcel(dataArr []map[string]interface{}, title, batch string) {
+	if len(dataArr) == 0 {
+		return
+	}
+	bigArr := map[string][]map[string]interface{}{}
+	for _, v := range dataArr {
+		minemail, _ := EmailSelect(batch)
+		bigArr[minemail] = append(bigArr[minemail], v)
+	}
+	for email, arr := range bigArr {
+		data := FindBatch(batch)
+		xlsxArr := []string{"姓名", "联系方式", "职位", "部门", "邮箱", "公司名称", "咨询需求", "销售线索来源", "具体来源", "留资时间"}
+		fileName, detailName := fmt.Sprintf("%s %s-%s", title, time.Now().Format(date.Date_Short_Layout), data), "今日新增销售线索,请查收附件,及时跟进。"
+		xf := xlsx.NewFile()
+		style := xlsx.NewStyle()
+		style.Font.Size = 12
+		style.Font.Bold = true
+		style.Alignment.Vertical = "center"
+		style.Alignment.Horizontal = "center"
+		sh, _ := xf.AddSheet("线索数据")
+		row1 := sh.AddRow()
+		for _, x := range xlsxArr {
+			cell := row1.AddCell()
+			cell.SetString(x)
+			cell.SetStyle(style)
+		}
+
+		for _, v := range arr {
+			row := sh.AddRow()
+			row.AddCell().SetString(common.ObjToString(v["username"]))
+			row.AddCell().SetString(common.ObjToString(v["phone"]))
+			row.AddCell().SetString(common.ObjToString(v["job"]))
+			row.AddCell().SetString(common.ObjToString(v["branch"]))
+			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 := fmt.Sprintf("./xlsx/%s/%s.xlsx", batch, fileName)
+		if err := xf.Save(dir); err != nil {
+			log.Println("xls error", err, dir)
+			return
+		}
+		sendEmail(fileName, detailName, dir, email)
+	}
+}
+
+// 发送邮件
+func sendEmail(fileName, detailName, dir, email string) {
+	gmail := &mail.GmailAuth{
+		SmtpHost: "smtp.exmail.qq.com",
+		SmtpPort: 465,
+		User:     "public03@topnet.net.cn",
+		Pwd:      "ue9Rg9Sf4CVtdm5a",
+	}
+	if status := mail.GSendMail_q("剑鱼标讯", email, "", "", fileName, detailName, dir, fileName+".xlsx", gmail); status {
+		log.Println("send mail success", fileName, email)
+	}
+}
+
+// 保存数据到 Redis
+func saveDataToRedis(data map[string]interface{}, batch string) {
+	keyContent := fmt.Sprintf("data_%s_%s", time.Now().Format("2006-01-02"), batch)
+	redis.Put("newother", keyContent, data, 86400)
+}
+
+// 邮箱选择处理
+func EmailSelect(batch string) (string, string) {
+	name := ""
+	minemail := ""
+	bigData := TiDb.SelectBySql("select * from dwd_f_crm_clue_big_autodraw_record where   type =?  ", batch)
+	if bigData != nil && len(*bigData) > 0 {
+		mincount := common.IntAll((*bigData)[0]["count"])
+		for _, vv := range *bigData {
+			vcount := common.IntAll(vv["count"])
+			vemail := common.ObjToString(vv["email"])
+			vName := common.ObjToString(vv["name"])
+			if vcount <= mincount {
+				mincount = vcount
+				minemail = vemail
+				name = vName
+			}
+		}
+	}
+	TiDb.UpdateOrDeleteBySql(`update dwd_f_crm_clue_big_autodraw_record set count = count + 1 where name = ? and   type=?`, name, batch)
+	return minemail, name
+}

+ 1 - 0
clueSync/go.mod

@@ -13,5 +13,6 @@ require (
 	github.com/gogf/gf/v2 v2.7.0
 	github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd // indirect
 	github.com/robfig/cron v1.2.0
+	github.com/robfig/cron/v3 v3.0.1
 	github.com/tealeg/xlsx v1.0.5
 )

+ 2 - 0
clueSync/go.sum

@@ -1255,6 +1255,8 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
 github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
+github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
+github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=

+ 170 - 4
clueSync/jobutil.go

@@ -500,7 +500,6 @@ func orders() {
 	lastOrderId := cfg.LastOrderId
 	selectTimeStart := time.Unix(time.Now().Unix()-7200, 0).Format(date.Date_Full_Layout)
 	selectTimeEnd := time.Unix(time.Now().Unix()-3600, 0).Format(date.Date_Full_Layout)
-
 	sql := fmt.Sprintf(`select * from dataexport_order where create_time <= "%s" and create_time >= "%s" and id > %s`, selectTimeEnd, selectTimeStart, fmt.Sprint(lastOrderId))
 	data := Mysql.SelectBySql(sql)
 	if data != nil && *data != nil && len(*data) > 0 {
@@ -722,7 +721,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 '%市场组%' 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 '%咨询组%' or department LIKE '%运营部%') AND is_delete = 1`)
 		if saleSource != nil && len(*saleSource) > 0 {
 			for _, v := range *saleSource {
 				source := common.ObjToString(v["source"])
@@ -1488,7 +1487,7 @@ func activeUsers() {
 }
 
 // 安博会邮件
-func ABHEmail(source string, data []map[string]interface{}) {
+/*func ABHEmail(source string, data []map[string]interface{}) {
 	fileName, detailName, email, dir := "", "", "", ""
 	var err error
 	switch source {
@@ -1690,7 +1689,7 @@ func ABHEmail(source string, data []map[string]interface{}) {
 			log.Println("send mail success", fileName, email)
 		}
 	}
-}
+}*/
 
 // 安防邮件
 func AFEmail(data []map[string]interface{}) {
@@ -1742,3 +1741,170 @@ func AFEmail(data []map[string]interface{}) {
 
 	}
 }
+
+func ABHEmail(source string, data []map[string]interface{}) {
+	var fileName, detailName, dir string
+	var err error
+
+	xlsxArr, detailName := getExcelHeaderAndDetail(source)
+	batch := FindBatch("abh")
+	fileName = fmt.Sprintf("%s %s-%s", getFileNamePrefix(source), time.Now().Format(date.Date_Short_Layout), batch)
+
+	xf := xlsx.NewFile()
+	style := createExcelStyle()
+	sh, _ := xf.AddSheet("线索数据")
+	addHeaderRow(sh, xlsxArr, style)
+
+	switch source {
+	case "user":
+		err = populateUserData(sh, data)
+	case "saleLeads", "big":
+		err = populateSaleLeadData(sh, data)
+	case "advisory":
+		err = populateAdvisoryData(sh, data)
+	case "market", "selection":
+		err = populateMarketData(sh, data)
+	}
+	if err == nil {
+		dir = fmt.Sprintf("./xlsx/abh/%s.xlsx", fileName)
+		err = xf.Save(dir)
+	}
+
+	sendEmailIfSuccessful(err, fileName, detailName, dir)
+}
+
+func getExcelHeaderAndDetail(source string) ([]string, string) {
+	switch source {
+	case "user":
+		return []string{"姓名", "联系方式", "邮箱", "公司名称", "咨询需求", "销售线索来源", "具体来源", "留资时间"}, "今日新增安博会销售线索,请查收附件,及时跟进。"
+	case "saleLeads":
+		return []string{"用户昵称", "姓名", "公司名称", "职位", "联系人电话", "购买条数", "用户邮箱", "已支付订单信息", "未支付订单类型", "销售线索来源", "具体来源", "数据需求"}, "今日新增安博会销售线索,请查收附件,及时跟进。"
+	case "big":
+		return []string{"用户昵称", "姓名", "公司名称", "职位", "联系人电话", "购买条数", "用户邮箱", "已支付订单信息", "未支付订单类型", "销售线索来源", "具体来源", "数据需求"}, "今日新增安博会销售线索,请查收附件,及时跟进。"
+	case "advisory":
+		return []string{"姓名", "联系方式", "邮箱", "公司名称", "咨询需求", "销售线索来源", "具体来源", "留资时间"}, "今日新增安博会销售线索,请查收附件,及时跟进。"
+	case "market":
+		return []string{"姓名", "联系人电话", "公司名称", "职位", "部门", "销售线索来源", "留资时间"}, "今日新增安博会销售线索,请查收附件,及时跟进。"
+	case "selection":
+		return []string{"姓名", "联系人电话", "公司名称", "职位", "部门", "销售线索来源", "留资时间"}, "今日新增安博会销售线索,请查收附件,及时跟进。"
+	default:
+		return nil, ""
+	}
+}
+
+func getFileNamePrefix(source string) string {
+	switch source {
+	case "user":
+		return "安博会用户注册销售线索"
+	case "saleLeads":
+		return "安博会电销销售线索"
+	case "big":
+		return "安博会大客户销售线索"
+	case "advisory":
+		return "安博会咨询服务销售线索"
+	case "market":
+		return "安博会商务合作销售线索"
+	default:
+		return "未知线索"
+	}
+}
+
+func createExcelStyle() *xlsx.Style {
+	style := xlsx.NewStyle()
+	style.Font.Size = 12
+	style.Font.Bold = true
+	style.Alignment.Vertical = "center"
+	style.Alignment.Horizontal = "center"
+	return style
+}
+
+func addHeaderRow(sh *xlsx.Sheet, headers []string, style *xlsx.Style) {
+	row := sh.AddRow()
+	for _, header := range headers {
+		cell := row.AddCell()
+		cell.SetString(header)
+		cell.SetStyle(style)
+	}
+}
+
+func populateUserData(sh *xlsx.Sheet, data []map[string]interface{}) error {
+	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))
+	}
+	return nil
+}
+
+func populateSaleLeadData(sh *xlsx.Sheet, data []map[string]interface{}) error {
+	sourceMap := buildSourceMap("运营部")
+	for _, v := range data {
+		row := sh.AddRow()
+		row.AddCell().SetString(common.ObjToString(v["usernickname"]))
+		row.AddCell().SetString(common.ObjToString(v["name"]))
+		row.AddCell().SetString(common.ObjToString(v["company"]))
+		row.AddCell().SetString(common.ObjToString(v["position"]))
+		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[common.ObjToString(v["source"])])
+		row.AddCell().SetString(common.ObjToString(v["interest"]))
+		row.AddCell().SetString(common.ObjToString(v["data_requirement"]))
+	}
+	return nil
+}
+
+func populateAdvisoryData(sh *xlsx.Sheet, data []map[string]interface{}) error {
+	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))
+	}
+	return nil
+}
+
+func populateMarketData(sh *xlsx.Sheet, data []map[string]interface{}) error {
+	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))
+	}
+	return nil
+}
+
+func sendEmailIfSuccessful(err error, fileName, detailName, dir string) {
+	if err != nil {
+		log.Println("xls error", err, dir)
+		return
+	}
+	email := db.AbhEmail
+	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)
+	}
+}

+ 9 - 8
clueSync/main.go

@@ -158,14 +158,15 @@ func main() {
 		})
 		//5分钟一次
 		go p.VarTimeTask.RunInTimeSection("5分钟定时任务1", db.CornExp2Start, db.CornExp2End, db.CornExp2, func(dayFirst bool) {
-			users()             //新注册用户进线索
-			saleLeads()         //留资进线索
-			eventReg()          //渠道
-			bigCustomer()       //大客户线索
-			marketCustomer()    //市场部线索
-			AdvisoryCommittee() //咨询组线索
-			rebind()            //取关重新关注处理
-			activeUsers()       //活跃用户处理
+			users()               //新注册用户进线索
+			saleLeads()           //留资进线索
+			eventReg()            //渠道
+			bigCustomer()         //大客户线索
+			MarketCustomer()      //市场部线索
+			AdvisoryCommittee()   //咨询组线索
+			SelectionDepartment() //运营部线索
+			rebind()              //取关重新关注处理
+			activeUsers()         //活跃用户处理
 		})
 		//每天8点30
 		c := cron.New()