xuzhiheng 2 年之前
父節點
當前提交
5f0ced12a6

+ 223 - 562
customerdata/src/task.go

@@ -25,14 +25,13 @@ import (
 	"go.mongodb.org/mongo-driver/bson/primitive"
 
 	esV7 "github.com/olivere/elastic"
-	es "gopkg.in/olivere/elastic.v1"
 )
 
 func TimeTask() {
 	StartTask()
 	c := cron.New()
 	//cronstr := "0 */" + fmt.Sprint(TaskTime) + " * * * ?"
-	cronstr := "0 0 */" + fmt.Sprint(TaskTime) + " * * ?" //每TaskTime小时执行一次
+	cronstr := "0 5 */" + fmt.Sprint(TaskTime) + " * * ?" //每TaskTime小时执行一次
 	c.AddFunc(cronstr, func() { StartTask() })
 	c.Start()
 }
@@ -162,340 +161,10 @@ func (c *Customer) GetData(stype string) {
 	esConfig := Sysconfig.Es
 	esversion := qu.ObjToString(esConfig["version"])
 	if esversion == "v1" {
-		esCon := esv.VarEs.(*esv.EsV1)
-		c.EsConGetDataV1(stype, esCon)
 	} else {
 		esCon := esv.VarEs.(*esv.EsV7)
 		c.EsConGetDataV7(stype, esCon)
 	}
-
-}
-
-func (c *Customer) EsConGetDataV1(stype string, esCon *esv.EsV1) {
-	client := esCon.GetEsConn()
-	defer esCon.DestoryEsConn(client)
-	for _, dm := range c.Departments {
-		for _, sr := range dm.Rules {
-
-			//测试
-			// MgoDataTest(sr, dm, c)
-			// return
-
-			ch := make(chan bool, 10)
-			wg := &sync.WaitGroup{}
-			escount := Es.Count(Index, Itype, sr.EsQuery)
-			log.Println("查询总数:", escount, "规则ID:", sr.ID, "EsQuery:", sr.EsQuery)
-			if escount == 0 {
-				continue
-			}
-			//查询条件类型转换
-			var q es.Query
-			//sr.EsQuery = `{"query":{"filtered":{"filter":{"bool":{"must":[{"bool":{"should":[{"terms":{"city":["上海市"]}}]}},{"terms":{"toptype":["招标","结果"]}},{"range":{"publishtime":{"gte":1588262400,"lt":1608825600}}}]}},"query":{"bool":{"must":[{"bool":{"should":[{"bool":{"must":[{"bool":{"should":[{"bool":{"must":[{"terms":{"buyer":["上海城建职业学院","上海市第一人民医院","中国银联股份有限公司","上海立信会计金融学院法规处","中国东方航空股份有限公司","上海外国语大学","上海小昆山环卫服务有限公司","国家税务总局上海市税务局","中国浦东干部学院","上海市浦东新区老港镇人民政府","咪咕视讯科技有限公司","上海交通大学医学院附属新华医院","交通运输部上海打捞局","松江区体育局","复旦大学附属中山医院","上海交通大学医学院附属瑞金医院","中国科学院上海应用物理研究所"]}}]}}]}}]}}]}}],"must_not":[{"constant_score":{"filter":{"missing":{"field":"filetext"}}}}]}}}}}`
-			tmpQuery := es.BoolQuery{
-				QueryStrings: sr.EsQuery,
-			}
-			q = tmpQuery
-
-			//游标查询,index不支持别名,只能写索引库的名称
-			res, err := client.Scroll(Index).Query(q).Size(200).Do() //查询一条获取游标
-			if err == nil {
-				numDocs := 0
-				scrollId := res.ScrollId
-				for {
-					if scrollId == "" {
-						log.Println("ScrollId Is Error")
-						break
-					}
-					searchResult, err := client.Scroll(Index).Size(200).ScrollId(scrollId).Do() //查询
-					if err != nil {
-						if err.Error() == "EOS" { //迭代完毕
-							log.Println("Es Search Data Over:", err)
-						} else {
-							log.Println("Es Search Data Error:", err)
-						}
-						break
-					}
-					for _, hit := range searchResult.Hits.Hits {
-						//开始处理数据
-						wg.Add(1)
-						ch <- true
-						go func(tmpHit *es.SearchHit) {
-							defer func() {
-								<-ch
-								wg.Done()
-							}()
-							tmp := make(map[string]interface{})
-							if json.Unmarshal(*tmpHit.Source, &tmp) == nil {
-								if stype != "history" {
-									if !SkipData(tmp) {
-										qu.Debug("跳过该条数据,发布时间在入库时间7天之前,", qu.ObjToString(tmp["_id"]))
-										return
-									}
-								}
-								id := qu.ObjToString(tmp["_id"])
-								//亚信
-								if CheckBidOpenAppidMap[c.AppId] {
-									if tmp["bidopentime"] != nil {
-										bidopentime := qu.Int64All(tmp["bidopentime"])
-										comeintime := qu.Int64All(tmp["comeintime"])
-										if bidopentime-comeintime <= 7*24*60*60 {
-											qu.Debug("跳过该条数据,开标时间-入库时间<=7天,", id)
-											return
-										}
-									}
-								}
-								//河南移动,过滤掉中国移动采购网招标数据
-								if CheckBidHrefRuleIdMap[dm.ID] {
-									if strings.Contains(qu.ObjToString(tmp["href"]), "b2b.10086.cn") {
-										qu.Debug("跳过该条数据,公告原网址中包含 b2b.10086.cn,", id)
-										return
-									}
-								}
-								isExists, err := redis.Exists("datag", c.AppId+"_"+id)
-								if err != nil {
-									log.Println("redis信息id判重出错 ", err)
-								} else if isExists {
-									log.Println("信息id重复 ", id)
-									return
-								}
-								tmp["id"] = id //记录数据原有id
-								delete(tmp, "_id")
-								if sr.ExtFieldType == 2 {
-									findwinner := ""
-									s_winner := strings.Split(qu.ObjToString(tmp["s_winner"]), ",")
-									if len(s_winner) > 0 {
-										for i := 0; i < len(s_winner); i++ {
-											findwinners := strings.TrimSpace(s_winner[i])
-											if findwinners != "" {
-												for _, v := range Sysconfig.SWinnerFilter {
-													strings.ReplaceAll(findwinners, v, "")
-												}
-												if findwinners != "" {
-													findwinner = findwinners
-													break
-												}
-											}
-										}
-									}
-									// findwinner := strings.TrimSpace(qu.ObjToString(tmp["winner"]))
-									if findwinner != "" {
-										finddata := MgoEnps.FindOne(EnpsColl, bson.M{"company_name": findwinner})
-										if finddata != nil {
-											if legal_person := qu.ObjToString(finddata["legal_person"]); legal_person != "" {
-												tmp["legal_person"] = legal_person
-											}
-											if email := qu.ObjToString(finddata["company_email"]); email != "" {
-												tmp["company_email"] = email
-											}
-											if phone := qu.ObjToString(finddata["company_phone"]); phone != "" {
-												tmp["company_phone"] = phone
-											}
-											//从最新年报中获取 中标单位联系电话、中标单位邮箱
-											// if annual_reports, ok := finddata["annual_reports"].(primitive.A); ok && len(annual_reports) > 0 {
-											// 	anreport := Sort_year_report(annual_reports)
-											// 	if len(anreport) > 0 {
-											// 		if email := qu.ObjToString(anreport["company_email"]); email != "" {
-											// 			tmp["company_email"] = email
-											// 		}
-											// 		if phone := qu.ObjToString(anreport["company_phone"]); phone != "" {
-											// 			tmp["company_phone"] = phone
-											// 		}
-											// 	}
-											// }
-										}
-									}
-								}
-								matchKey := map[string]bool{}     //记录所有匹配上的关键词
-								matchKeyType := map[string]bool{} //记录关键词对应的匹配方式
-								//先获取用到的所有字段值
-								fieldText := map[string]interface{}{}
-								for field, _ := range sr.Fields {
-									text := qu.ObjToString(tmp[field])
-									text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
-									fieldText[field] = text
-								}
-								//清理词清理
-								for _, cwm := range sr.GCW.MatchType {
-									if text := qu.ObjToString(fieldText[cwm]); text != "" {
-										for _, gcw_reg := range sr.GCW.KeyReg {
-											text = gcw_reg.ReplaceAllString(text, "")
-										}
-										fieldText[cwm] = text
-									}
-								}
-								//精准筛选规则2022-10-19
-								if c.Exact == 1 && sr.ExactRule != "" {
-									nameArr := []string{}
-									data, _ := MgoTag.Find("groups", map[string]interface{}{"ruleId": sr.ID}, nil, nil)
-									if data != nil && len(data) > 0 {
-										for _, v := range data {
-											nameArr = append(nameArr, qu.ObjToString(v["name"]))
-										}
-									}
-									exactResult := exactMatchs(sr.ExactRule, qu.ObjToString(tmp["title"]), qu.ObjToString(tmp["detail"]), sr.Maths, nameArr)
-									qu.Debug("-------------------精准匹配", id, exactResult)
-									if !exactResult {
-										return
-									}
-								}
-								/*
-									因为要记录所有匹配上的关键词,所有优先匹配附加词,在匹配关键词
-								*/
-								//1.附加词匹配
-								IsMatch := false
-								//qu.Debug("sr.AW---", len(sr.AW))
-								for i, aw := range sr.AW {
-									//qu.Debug("-------------------------开始附加词匹配--------------------------")
-									IsMatchAddKey := RegMatch(fieldText, aw.MatchType, aw.KeyReg, nil, nil, false, true)
-									//qu.Debug(IsMatchAddKey, "------------------------------------------------------------")
-
-									//2.关键词匹配
-									if IsMatchAddKey {
-										kw := sr.KW[i]
-										//qu.Debug("-------------------------开始关键词匹配--------------------------")
-										IsMatchKey := RegMatch(fieldText, kw.MatchType, kw.KeyReg, matchKey, matchKeyType, true, false)
-										//qu.Debug(IsMatchKey, "------------------------------------------------------------")
-										if IsMatchKey {
-											IsMatch = true
-										}
-									}
-								}
-								if len(sr.AW) == 0 {
-									IsMatch = true
-								}
-								/*
-									到此已经匹配完数据
-								*/
-								qu.Debug("---------------------", id, IsMatch, matchKey)
-								if IsMatch { //匹配成功,数据上新增规则id,matchKey,item并临时保存数据
-									// tmpMatchKey := MapDataToArr(matchKey)
-									tmpMatchKeyType := MapDataToArr(matchKeyType)
-									tmp["matchkey"] = GetMactchKeys(sr.Maths, tmp)
-									tmp["matchtype"] = strings.Join(tmpMatchKeyType, ",")
-									tmp["ruleid"] = sr.ID
-									tmp["rulename"] = sr.Name
-									tmpBuyerClass := qu.ObjToString(tmp["buyerclass"])
-
-									//开始打标签
-									//qu.Debug("c.IsTagRule+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
-									if c.IsTagRule {
-										tagNameMap := map[string]bool{}
-										tagIdMap := map[string]bool{}
-										//qu.Debug("c.TagRules---", len(c.TagRules))
-										//log.Println(c.TagRules,"=========",)
-										for _, tr := range c.TagRules {
-											if tr.DepartRuleIds[sr.ID] {
-												// log.Println(tr.TagNames, "===========打标签")
-												//先获取用到的所有字段值
-												for field, _ := range tr.Fields {
-													if fieldText[field] == nil { //补充fieldText
-														text := qu.ObjToString(tmp[field])
-														text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
-														fieldText[field] = text
-													}
-												}
-												//qu.Debug("-------------------------开始排除词匹配--------------------------")
-												//qu.Debug("tr.NW---", len(tr.NW))
-												matchKeyTag := map[string]bool{}     //记录所有标签里的匹配上的关键词
-												matchKeyTypeTag := map[string]bool{} //记录标签里的关键词对应的匹配方式
-												for j, tag_nw := range tr.NW {       //排除词匹配
-													IsMatchNotKey := RegMatch(fieldText, tag_nw.MatchType, tag_nw.KeyReg, nil, nil, false, false)
-													//qu.Debug(IsMatchNotKey, "------------------------------------------------------------")
-													if !IsMatchNotKey { //排除词未匹配,匹配附加词关键词
-														// log.Println(j, tr.TagNames[j])
-														if RegMatch(fieldText, tr.AW[j].MatchType, tr.AW[j].KeyReg, nil, nil, false, true) && RegMatch(fieldText, tr.KW[j].MatchType, tr.KW[j].KeyReg, matchKeyTag, matchKeyTypeTag, true, false) {
-															tagname := tr.TagNames[j]
-															tagBuyerClass := tr.BuyerClass[j]
-															if tagBuyerClass != "" {
-																if strings.Contains(tagBuyerClass, tmpBuyerClass) {
-																	if tagname == "" {
-																		tempList := []string{}
-																		for k, _ := range matchKeyTag {
-																			tempList = append(tempList, k)
-																		}
-																		tagname = strings.Join(tempList, ",")
-																		log.Println("=====tagname为空取匹配词为标签名称", tagname)
-																	}
-																	//qu.Debug("tagname-----", tagname)
-																	tagNameMap[tagname] = true
-																	tagIdMap[tr.ID] = true
-																}
-															} else {
-																if tagname == "" {
-																	tempList := []string{}
-																	for k, _ := range matchKeyTag {
-																		tempList = append(tempList, k)
-																	}
-																	tagname = strings.Join(tempList, ",")
-																	log.Println("=====tagname为空取匹配词为标签名称", tagname)
-																}
-																//qu.Debug("tagname-----", tagname)
-																tagNameMap[tagname] = true
-																tagIdMap[tr.ID] = true
-															}
-														}
-													}
-												}
-											}
-										}
-										//tagname
-										tagNameArr := MapDataToArr(tagNameMap)
-										tagIdArr := MapDataToArr(tagIdMap)
-										if len(tagNameArr) > 0 {
-											tmp["tagname"] = strings.Join(tagNameArr, ",")
-											if DisPackageAppidMap[c.AppId] {
-												tmp["buyer_type"] = strings.Join(tagNameArr, ",")
-											}
-											if c.PushModel == 2 {
-												tmp["item"] = strings.Join(tagNameArr, ",")
-											}
-											tmp["tagid"] = strings.Join(tagIdArr, ",")
-										}
-									}
-									//item
-									switch c.PushModel {
-									case 0:
-										tmp["item"] = "数据"
-									case 1:
-										tmp["item"] = dm.Name
-									case 2:
-										//tmp["item"] = sr.Name
-									case 3:
-										tmp["item"] = dm.Name + "_" + sr.Name
-									case 4:
-										tmp["item"] = sr.Name
-									}
-									//appid
-									tmp["appid"] = c.AppId
-									//部门名称
-									tmp["departname"] = dm.Name
-									tmp["departid"] = dm.ID
-									//存储数据
-									dm.DataLock.Lock()
-									//qu.Debug("tmp---", tmp)
-									tmpMap := map[string]interface{}{id: tmp}
-									dm.DepartmentData[sr.ID] = append(dm.DepartmentData[sr.ID], tmpMap)
-									dm.DataLock.Unlock()
-								} else {
-									qu.Debug("------------", id, IsMatch)
-								}
-							}
-						}(hit)
-						numDocs += 1
-						if numDocs%500 == 0 {
-							log.Println("Current:", numDocs)
-						}
-					}
-					scrollId = searchResult.ScrollId
-				}
-				wg.Wait()
-				client.ClearScroll().ScrollId(scrollId).Do() //清理游标
-				log.Println("SearchRule ID", sr.ID, "Result Data Count:", numDocs)
-			} else {
-				log.Println("Customer:", c.Name, "Departmnet", dm.Name, "TagName", sr.Name, "Es Search Data Error,Tag ID:", sr.ID)
-			}
-		}
-	}
 }
 
 type MySource struct {
@@ -511,16 +180,15 @@ func (m *MySource) Source() (interface{}, error) {
 func (c *Customer) EsConGetDataV7(stype string, esCon *esv.EsV7) {
 	client := esCon.GetEsConn()
 	defer esCon.DestoryEsConn(client)
-	ctx, _ := context.WithTimeout(context.Background(), 30*time.Second)
+	ctx, _ := context.WithTimeout(context.Background(), 10*time.Minute)
 	for _, dm := range c.Departments {
 		for _, sr := range dm.Rules {
-
 			//测试
 			// MgoDataTest(sr, dm, c)
 			// return
 
-			ch := make(chan bool, 10)
-			wg := &sync.WaitGroup{}
+			// ch := make(chan bool, 10)
+			// wg := &sync.WaitGroup{}
 			escount := Es.Count(Index, Itype, sr.EsQuery)
 			log.Println("查询总数:", escount, "规则ID:", sr.ID, "EsQuery:", sr.EsQuery)
 			if escount == 0 {
@@ -569,210 +237,190 @@ func (c *Customer) EsConGetDataV7(stype string, esCon *esv.EsV7) {
 					}
 					for _, hit := range searchResult.Hits.Hits {
 						//开始处理数据
-						wg.Add(1)
-						ch <- true
-						go func(tmpHit *esV7.SearchHit) {
-							defer func() {
-								<-ch
-								wg.Done()
-							}()
-							tmp := make(map[string]interface{})
-							if json.Unmarshal(tmpHit.Source, &tmp) == nil {
-								if stype != "history" {
-									if !SkipData(tmp) {
-										qu.Debug("跳过该条数据,发布时间在入库时间7天之前,", qu.ObjToString(tmp["_id"]))
-										return
-									}
+						tmp := make(map[string]interface{})
+						if json.Unmarshal(hit.Source, &tmp) == nil {
+							if stype != "history" {
+								if !SkipData(tmp) {
+									qu.Debug("跳过该条数据,发布时间在入库时间7天之前,", qu.ObjToString(tmp["_id"]))
+									continue
 								}
-								id := qu.ObjToString(tmp["id"])
-								//亚信
-								if CheckBidOpenAppidMap[c.AppId] {
-									if tmp["bidopentime"] != nil {
-										bidopentime := qu.Int64All(tmp["bidopentime"])
-										comeintime := qu.Int64All(tmp["comeintime"])
-										if bidopentime-comeintime <= 7*24*60*60 {
-											qu.Debug("跳过该条数据,开标时间-入库时间<=7天,", id)
-											return
-										}
-									}
-								}
-								//河南移动,过滤掉中国移动采购网招标数据
-								if CheckBidHrefRuleIdMap[dm.ID] {
-									if strings.Contains(qu.ObjToString(tmp["href"]), "b2b.10086.cn") {
-										qu.Debug("跳过该条数据,公告原网址中包含 b2b.10086.cn,", id)
-										return
+							}
+							id := qu.ObjToString(tmp["id"])
+							//亚信
+							if CheckBidOpenAppidMap[c.AppId] {
+								if tmp["bidopentime"] != nil {
+									bidopentime := qu.Int64All(tmp["bidopentime"])
+									comeintime := qu.Int64All(tmp["comeintime"])
+									if bidopentime-comeintime <= 7*24*60*60 {
+										qu.Debug("跳过该条数据,开标时间-入库时间<=7天,", id)
+										continue
 									}
 								}
-								isExists, err := redis.Exists("datag", c.AppId+"_"+id)
-								if err != nil {
-									log.Println("redis信息id判重出错 ", err)
-								} else if isExists {
-									log.Println("信息id重复 ", id)
-									return
+							}
+							//河南移动,过滤掉中国移动采购网招标数据
+							if CheckBidHrefRuleIdMap[dm.ID] {
+								if strings.Contains(qu.ObjToString(tmp["href"]), "b2b.10086.cn") {
+									qu.Debug("跳过该条数据,公告原网址中包含 b2b.10086.cn,", id)
+									continue
 								}
-								tmp["id"] = id //记录数据原有id
-								delete(tmp, "_id")
-								if sr.ExtFieldType == 2 {
-									findwinner := ""
-									s_winner := strings.Split(qu.ObjToString(tmp["s_winner"]), ",")
-									if len(s_winner) > 0 {
-										for i := 0; i < len(s_winner); i++ {
-											findwinners := strings.TrimSpace(s_winner[i])
-											if findwinners != "" {
-												for _, v := range Sysconfig.SWinnerFilter {
-													strings.ReplaceAll(findwinners, v, "")
-												}
-												if findwinners != "" {
-													findwinner = findwinners
-													break
-												}
-											}
-										}
-									}
-									// findwinner := strings.TrimSpace(qu.ObjToString(tmp["winner"]))
-									if findwinner != "" {
-										finddata := MgoEnps.FindOne(EnpsColl, bson.M{"company_name": findwinner})
-										if finddata != nil {
-											if legal_person := qu.ObjToString(finddata["legal_person"]); legal_person != "" {
-												tmp["legal_person"] = legal_person
-											}
-											if email := qu.ObjToString(finddata["company_email"]); email != "" {
-												tmp["company_email"] = email
+							}
+							isExists, err := redis.Exists("datag", c.AppId+"_"+id)
+							if err != nil {
+								log.Println("redis信息id判重出错 ", err)
+							} else if isExists {
+								log.Println("信息id重复 ", id)
+								continue
+							}
+							tmp["id"] = id //记录数据原有id
+							delete(tmp, "_id")
+							if sr.ExtFieldType == 2 {
+								findwinner := ""
+								s_winner := strings.Split(qu.ObjToString(tmp["s_winner"]), ",")
+								if len(s_winner) > 0 {
+									for i := 0; i < len(s_winner); i++ {
+										findwinners := strings.TrimSpace(s_winner[i])
+										if findwinners != "" {
+											for _, v := range Sysconfig.SWinnerFilter {
+												strings.ReplaceAll(findwinners, v, "")
 											}
-											if phone := qu.ObjToString(finddata["company_phone"]); phone != "" {
-												tmp["company_phone"] = phone
+											if findwinners != "" {
+												findwinner = findwinners
+												break
 											}
-											//从最新年报中获取 中标单位联系电话、中标单位邮箱
-											// if annual_reports, ok := finddata["annual_reports"].(primitive.A); ok && len(annual_reports) > 0 {
-											// 	anreport := Sort_year_report(annual_reports)
-											// 	if len(anreport) > 0 {
-											// 		if email := qu.ObjToString(anreport["company_email"]); email != "" {
-											// 			tmp["company_email"] = email
-											// 		}
-											// 		if phone := qu.ObjToString(anreport["company_phone"]); phone != "" {
-											// 			tmp["company_phone"] = phone
-											// 		}
-											// 	}
-											// }
 										}
 									}
 								}
-								matchKey := map[string]bool{}     //记录所有匹配上的关键词
-								matchKeyType := map[string]bool{} //记录关键词对应的匹配方式
-								//先获取用到的所有字段值
-								fieldText := map[string]interface{}{}
-								for field, _ := range sr.Fields {
-									text := qu.ObjToString(tmp[field])
-									text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
-									fieldText[field] = text
-								}
-								//清理词清理
-								for _, cwm := range sr.GCW.MatchType {
-									if text := qu.ObjToString(fieldText[cwm]); text != "" {
-										for _, gcw_reg := range sr.GCW.KeyReg {
-											text = gcw_reg.ReplaceAllString(text, "")
+								// findwinner := strings.TrimSpace(qu.ObjToString(tmp["winner"]))
+								if findwinner != "" {
+									finddata := MgoEnps.FindOne(EnpsColl, bson.M{"company_name": findwinner})
+									if finddata != nil {
+										if legal_person := qu.ObjToString(finddata["legal_person"]); legal_person != "" {
+											tmp["legal_person"] = legal_person
 										}
-										fieldText[cwm] = text
-									}
-								}
-								//精准筛选规则2022-10-19
-								if c.Exact == 1 && sr.ExactRule != "" {
-									nameArr := []string{}
-									data, _ := MgoTag.Find("groups", map[string]interface{}{"ruleId": sr.ID}, nil, nil)
-									if data != nil && len(data) > 0 {
-										for _, v := range data {
-											nameArr = append(nameArr, qu.ObjToString(v["name"]))
+										if email := qu.ObjToString(finddata["company_email"]); email != "" {
+											tmp["company_email"] = email
 										}
+										if phone := qu.ObjToString(finddata["company_phone"]); phone != "" {
+											tmp["company_phone"] = phone
+										}
+										//从最新年报中获取 中标单位联系电话、中标单位邮箱
+										// if annual_reports, ok := finddata["annual_reports"].(primitive.A); ok && len(annual_reports) > 0 {
+										// 	anreport := Sort_year_report(annual_reports)
+										// 	if len(anreport) > 0 {
+										// 		if email := qu.ObjToString(anreport["company_email"]); email != "" {
+										// 			tmp["company_email"] = email
+										// 		}
+										// 		if phone := qu.ObjToString(anreport["company_phone"]); phone != "" {
+										// 			tmp["company_phone"] = phone
+										// 		}
+										// 	}
+										// }
 									}
-									exactResult := exactMatchs(sr.ExactRule, qu.ObjToString(tmp["title"]), qu.ObjToString(tmp["detail"]), sr.Maths, nameArr)
-									qu.Debug("-------------------精准匹配", id, exactResult)
-									if !exactResult {
-										return
+								}
+							}
+							matchKey := map[string]bool{}     //记录所有匹配上的关键词
+							matchKeyType := map[string]bool{} //记录关键词对应的匹配方式
+							//先获取用到的所有字段值
+							fieldText := map[string]interface{}{}
+							for field, _ := range sr.Fields {
+								text := qu.ObjToString(tmp[field])
+								text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
+								fieldText[field] = text
+							}
+							//清理词清理
+							for _, cwm := range sr.GCW.MatchType {
+								if text := qu.ObjToString(fieldText[cwm]); text != "" {
+									for _, gcw_reg := range sr.GCW.KeyReg {
+										text = gcw_reg.ReplaceAllString(text, "")
 									}
+									fieldText[cwm] = text
 								}
-								/*
-									因为要记录所有匹配上的关键词,所有优先匹配附加词,在匹配关键词
-								*/
-								//1.附加词匹配
-								IsMatch := false
-								//qu.Debug("sr.AW---", len(sr.AW))
-								for i, aw := range sr.AW {
-									//qu.Debug("-------------------------开始附加词匹配--------------------------")
-									IsMatchAddKey := RegMatch(fieldText, aw.MatchType, aw.KeyReg, nil, nil, false, true)
-									//qu.Debug(IsMatchAddKey, "------------------------------------------------------------")
-
-									//2.关键词匹配
-									if IsMatchAddKey {
-										kw := sr.KW[i]
-										//qu.Debug("-------------------------开始关键词匹配--------------------------")
-										IsMatchKey := RegMatch(fieldText, kw.MatchType, kw.KeyReg, matchKey, matchKeyType, true, false)
-										//qu.Debug(IsMatchKey, "------------------------------------------------------------")
-										if IsMatchKey {
-											IsMatch = true
-										}
+							}
+							//精准筛选规则2022-10-19
+							if c.Exact == 1 && sr.ExactRule != "" {
+								nameArr := []string{}
+								data, _ := MgoTag.Find("groups", map[string]interface{}{"ruleId": sr.ID}, nil, nil)
+								if data != nil && len(data) > 0 {
+									for _, v := range data {
+										nameArr = append(nameArr, qu.ObjToString(v["name"]))
 									}
 								}
-								if len(sr.AW) == 0 {
-									IsMatch = true
+								exactResult := exactMatchs(sr.ExactRule, qu.ObjToString(tmp["title"]), qu.ObjToString(tmp["detail"]), sr.Maths, nameArr)
+								qu.Debug("-------------------精准匹配", id, exactResult)
+								if !exactResult {
+									continue
 								}
-								/*
-									到此已经匹配完数据
-								*/
-								qu.Debug("---------------------", id, IsMatch, matchKey)
-								if IsMatch { //匹配成功,数据上新增规则id,matchKey,item并临时保存数据
-									// tmpMatchKey := MapDataToArr(matchKey)
-									tmpMatchKeyType := MapDataToArr(matchKeyType)
-									tmp["matchkey"] = GetMactchKeys(sr.Maths, tmp)
-									tmp["matchtype"] = strings.Join(tmpMatchKeyType, ",")
-									tmp["ruleid"] = sr.ID
-									tmp["rulename"] = sr.Name
-									tmpBuyerClass := qu.ObjToString(tmp["buyerclass"])
-
-									//开始打标签
-									//qu.Debug("c.IsTagRule+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
-									if c.IsTagRule {
-										tagNameMap := map[string]bool{}
-										tagIdMap := map[string]bool{}
-										//qu.Debug("c.TagRules---", len(c.TagRules))
-										//log.Println(c.TagRules,"=========",)
-										for _, tr := range c.TagRules {
-											if tr.DepartRuleIds[sr.ID] {
-												// log.Println(tr.TagNames, "===========打标签")
-												//先获取用到的所有字段值
-												for field, _ := range tr.Fields {
-													if fieldText[field] == nil { //补充fieldText
-														text := qu.ObjToString(tmp[field])
-														text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
-														fieldText[field] = text
-													}
+							}
+							/*
+								因为要记录所有匹配上的关键词,所有优先匹配附加词,在匹配关键词
+							*/
+							//1.附加词匹配
+							IsMatch := false
+							//qu.Debug("sr.AW---", len(sr.AW))
+							for i, aw := range sr.AW {
+								//qu.Debug("-------------------------开始附加词匹配--------------------------")
+								IsMatchAddKey := RegMatch(fieldText, aw.MatchType, aw.KeyReg, nil, nil, false, true)
+								//qu.Debug(IsMatchAddKey, "------------------------------------------------------------")
+
+								//2.关键词匹配
+								if IsMatchAddKey {
+									kw := sr.KW[i]
+									//qu.Debug("-------------------------开始关键词匹配--------------------------")
+									IsMatchKey := RegMatch(fieldText, kw.MatchType, kw.KeyReg, matchKey, matchKeyType, true, false)
+									//qu.Debug(IsMatchKey, "------------------------------------------------------------")
+									if IsMatchKey {
+										IsMatch = true
+									}
+								}
+							}
+							if len(sr.AW) == 0 {
+								IsMatch = true
+							}
+							/*
+								到此已经匹配完数据
+							*/
+							qu.Debug("---------------------", id, IsMatch, matchKey)
+							if IsMatch { //匹配成功,数据上新增规则id,matchKey,item并临时保存数据
+								// tmpMatchKey := MapDataToArr(matchKey)
+								tmpMatchKeyType := MapDataToArr(matchKeyType)
+								tmp["matchkey"] = GetMactchKeys(sr.Maths, tmp)
+								tmp["matchtype"] = strings.Join(tmpMatchKeyType, ",")
+								tmp["ruleid"] = sr.ID
+								tmp["rulename"] = sr.Name
+								tmpBuyerClass := qu.ObjToString(tmp["buyerclass"])
+
+								//开始打标签
+								//qu.Debug("c.IsTagRule+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
+								if c.IsTagRule {
+									tagNameMap := map[string]bool{}
+									tagIdMap := map[string]bool{}
+									//qu.Debug("c.TagRules---", len(c.TagRules))
+									//log.Println(c.TagRules,"=========",)
+									for _, tr := range c.TagRules {
+										if tr.DepartRuleIds[sr.ID] {
+											// log.Println(tr.TagNames, "===========打标签")
+											//先获取用到的所有字段值
+											for field, _ := range tr.Fields {
+												if fieldText[field] == nil { //补充fieldText
+													text := qu.ObjToString(tmp[field])
+													text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
+													fieldText[field] = text
 												}
-												//qu.Debug("-------------------------开始排除词匹配--------------------------")
-												//qu.Debug("tr.NW---", len(tr.NW))
-												matchKeyTag := map[string]bool{}     //记录所有标签里的匹配上的关键词
-												matchKeyTypeTag := map[string]bool{} //记录标签里的关键词对应的匹配方式
-												for j, tag_nw := range tr.NW {       //排除词匹配
-													IsMatchNotKey := RegMatch(fieldText, tag_nw.MatchType, tag_nw.KeyReg, nil, nil, false, false)
-													//qu.Debug(IsMatchNotKey, "------------------------------------------------------------")
-													if !IsMatchNotKey { //排除词未匹配,匹配附加词关键词
-														// log.Println(j, tr.TagNames[j])
-														if RegMatch(fieldText, tr.AW[j].MatchType, tr.AW[j].KeyReg, nil, nil, false, true) && RegMatch(fieldText, tr.KW[j].MatchType, tr.KW[j].KeyReg, matchKeyTag, matchKeyTypeTag, true, false) {
-															tagname := tr.TagNames[j]
-															tagBuyerClass := tr.BuyerClass[j]
-															if tagBuyerClass != "" {
-																if strings.Contains(tagBuyerClass, tmpBuyerClass) {
-																	if tagname == "" {
-																		tempList := []string{}
-																		for k, _ := range matchKeyTag {
-																			tempList = append(tempList, k)
-																		}
-																		tagname = strings.Join(tempList, ",")
-																		log.Println("=====tagname为空取匹配词为标签名称", tagname)
-																	}
-																	//qu.Debug("tagname-----", tagname)
-																	tagNameMap[tagname] = true
-																	tagIdMap[tr.ID] = true
-																}
-															} else {
+											}
+											//qu.Debug("-------------------------开始排除词匹配--------------------------")
+											//qu.Debug("tr.NW---", len(tr.NW))
+											matchKeyTag := map[string]bool{}     //记录所有标签里的匹配上的关键词
+											matchKeyTypeTag := map[string]bool{} //记录标签里的关键词对应的匹配方式
+											for j, tag_nw := range tr.NW {       //排除词匹配
+												IsMatchNotKey := RegMatch(fieldText, tag_nw.MatchType, tag_nw.KeyReg, nil, nil, false, false)
+												//qu.Debug(IsMatchNotKey, "------------------------------------------------------------")
+												if !IsMatchNotKey { //排除词未匹配,匹配附加词关键词
+													// log.Println(j, tr.TagNames[j])
+													if RegMatch(fieldText, tr.AW[j].MatchType, tr.AW[j].KeyReg, nil, nil, false, true) && RegMatch(fieldText, tr.KW[j].MatchType, tr.KW[j].KeyReg, matchKeyTag, matchKeyTypeTag, true, false) {
+														tagname := tr.TagNames[j]
+														tagBuyerClass := tr.BuyerClass[j]
+														if tagBuyerClass != "" {
+															if strings.Contains(tagBuyerClass, tmpBuyerClass) {
 																if tagname == "" {
 																	tempList := []string{}
 																	for k, _ := range matchKeyTag {
@@ -785,54 +433,66 @@ func (c *Customer) EsConGetDataV7(stype string, esCon *esv.EsV7) {
 																tagNameMap[tagname] = true
 																tagIdMap[tr.ID] = true
 															}
+														} else {
+															if tagname == "" {
+																tempList := []string{}
+																for k, _ := range matchKeyTag {
+																	tempList = append(tempList, k)
+																}
+																tagname = strings.Join(tempList, ",")
+																log.Println("=====tagname为空取匹配词为标签名称", tagname)
+															}
+															//qu.Debug("tagname-----", tagname)
+															tagNameMap[tagname] = true
+															tagIdMap[tr.ID] = true
 														}
 													}
 												}
 											}
 										}
-										//tagname
-										tagNameArr := MapDataToArr(tagNameMap)
-										tagIdArr := MapDataToArr(tagIdMap)
-										if len(tagNameArr) > 0 {
-											tmp["tagname"] = strings.Join(tagNameArr, ",")
-											if DisPackageAppidMap[c.AppId] {
-												tmp["buyer_type"] = strings.Join(tagNameArr, ",")
-											}
-											if c.PushModel == 2 {
-												tmp["item"] = strings.Join(tagNameArr, ",")
-											}
-											tmp["tagid"] = strings.Join(tagIdArr, ",")
-										}
 									}
-									//item
-									switch c.PushModel {
-									case 0:
-										tmp["item"] = "数据"
-									case 1:
-										tmp["item"] = dm.Name
-									case 2:
-										//tmp["item"] = sr.Name
-									case 3:
-										tmp["item"] = dm.Name + "_" + sr.Name
-									case 4:
-										tmp["item"] = sr.Name
+									//tagname
+									tagNameArr := MapDataToArr(tagNameMap)
+									tagIdArr := MapDataToArr(tagIdMap)
+									if len(tagNameArr) > 0 {
+										tmp["tagname"] = strings.Join(tagNameArr, ",")
+										if DisPackageAppidMap[c.AppId] {
+											tmp["buyer_type"] = strings.Join(tagNameArr, ",")
+										}
+										if c.PushModel == 2 {
+											tmp["item"] = strings.Join(tagNameArr, ",")
+										}
+										tmp["tagid"] = strings.Join(tagIdArr, ",")
 									}
-									//appid
-									tmp["appid"] = c.AppId
-									//部门名称
-									tmp["departname"] = dm.Name
-									tmp["departid"] = dm.ID
-									//存储数据
-									dm.DataLock.Lock()
-									//qu.Debug("tmp---", tmp)
-									tmpMap := map[string]interface{}{id: tmp}
-									dm.DepartmentData[sr.ID] = append(dm.DepartmentData[sr.ID], tmpMap)
-									dm.DataLock.Unlock()
-								} else {
-									qu.Debug("------------", id, IsMatch)
 								}
+								//item
+								switch c.PushModel {
+								case 0:
+									tmp["item"] = "数据"
+								case 1:
+									tmp["item"] = dm.Name
+								case 2:
+									//tmp["item"] = sr.Name
+								case 3:
+									tmp["item"] = dm.Name + "_" + sr.Name
+								case 4:
+									tmp["item"] = sr.Name
+								}
+								//appid
+								tmp["appid"] = c.AppId
+								//部门名称
+								tmp["departname"] = dm.Name
+								tmp["departid"] = dm.ID
+								//存储数据
+								dm.DataLock.Lock()
+								//qu.Debug("tmp---", tmp)
+								tmpMap := map[string]interface{}{id: tmp}
+								dm.DepartmentData[sr.ID] = append(dm.DepartmentData[sr.ID], tmpMap)
+								dm.DataLock.Unlock()
+							} else {
+								qu.Debug("------------", id, IsMatch)
 							}
-						}(hit)
+						}
 						numDocs += 1
 						if numDocs%500 == 0 {
 							log.Println("Current:", numDocs)
@@ -841,12 +501,13 @@ func (c *Customer) EsConGetDataV7(stype string, esCon *esv.EsV7) {
 					scrollId = searchResult.ScrollId
 					count++
 				}
-				wg.Wait()
+				// wg.Wait()
 				client.ClearScroll().ScrollId(scrollId).Do(ctx) //清理游标
 				log.Println("SearchRule ID", sr.ID, "Result Data Count:", numDocs)
 			} else {
 				log.Println("Customer:", c.Name, "Departmnet", dm.Name, "TagName", sr.Name, "Es Search Data Error,Tag ID:", sr.ID)
 			}
+			time.Sleep(2 * time.Second)
 		}
 	}
 }

+ 2 - 2
customerdata/src/util.go

@@ -930,8 +930,8 @@ func SearchEnterpriseInfo(tmp map[string]interface{}) {
 				tmp["company_address"] = company_address
 			}
 			//注册资金"capital" : "324 万","capital" : 124.8,
-			if capital := qu.ObjToString(data["capital"]); capital != "" {
-				tmp["capital"] = capital
+			if data["capital"] != nil {
+				tmp["capital"] = qu.Float64All(data["capital"])
 			}
 			//注册时间"establish_date" : ISODate("1949-10-01T00:00:00.000+0000")
 			if establish_date := qu.ObjToString(data["establish_date"]); establish_date != "" {

+ 3 - 1
src/config.json

@@ -285,5 +285,7 @@
     ""
   ],
   "filter_detail_count": 15,
-  "isNewSql": 1
+  "isNewSql": 1,
+  "filter_owner_appid": [
+  ]
 }

+ 4 - 0
src/history/datamodel.go

@@ -38,9 +38,13 @@ type Customer struct {
 	PushModel    int                               //推送模式 0:全局模式;1:部门模式;2:标签模式;3:部门+标签模式;4:规则模式
 	Departments  []*Department                     //所有部门
 	IsTagRule    bool                              //是否打标签
+	IsTagRule2   bool                              //是否打标签2
+	IsTagRule3   bool                              //是否打标签3
 	IsSearchHosp bool                              //是否查询第三方医院信息
 	IsSearchEnps bool                              //是否查询第三方企业信息
 	TagRules     []*TagRule                        //打标签规则集合
+	TagRules2    []*TagRule                        //打标签规则集合2
+	TagRules3    []*TagRule                        //打标签规则集合3
 	SaveDataMap  map[string]map[string]interface{} //最终入库数据(全局模式)
 	SaveDataArr  []map[string]interface{}          //最终入库数据(规则模式)
 	IdRange      bson.M                            //由当前时间生成是id查询区间

+ 32 - 5
src/history/historytask.go

@@ -136,15 +136,24 @@ func (this *HistoryData) HistoryTask(history_id string) {
 		if !ok {
 			tag_rule = []interface{}{}
 		}
+		tag_rule2, ok := c["tag_rules2"].([]interface{})
+		if !ok {
+			tag_rule2 = []interface{}{}
+		}
+		tag_rule3, ok := c["tag_rules3"].([]interface{})
+		if !ok {
+			tag_rule3 = []interface{}{}
+		}
 		dep_rule, ok := c["dep_rules"].([]interface{})
 		if !ok {
 			dep_rule = []interface{}{}
 		}
 		tag_rules := qu.ObjArrToMapArr(tag_rule)
+		tag_rules2 := qu.ObjArrToMapArr(tag_rule2)
+		tag_rules3 := qu.ObjArrToMapArr(tag_rule3)
 		dep_rules := qu.ObjArrToMapArr(dep_rule)
-		log.Println(tag_rules, "*********************")
-		cus.GetTagRules(tag_rules)               //获取客户打标签规则
-		cus.GetDepartments("history", dep_rules) //获取客户信息
+		cus.GetTagRules(tag_rules, tag_rules2, tag_rules3) //获取客户打标签规则
+		cus.GetDepartments("history", dep_rules)           //获取客户信息
 		qu.Debug("customer:", cus.ID, cus.Name, cus.PushModel, cus.AppId, cus.IsTagRule, cus.IsSearchHosp, cus.IsSearchEnps, len(cus.TagRules), len(cus.Departments))
 		cus.GetData("history", i_dataSource)                                                              //获取数据
 		cus.RemoveRepeatData()                                                                            //数据去重
@@ -181,9 +190,27 @@ func (this *HistoryData) HistoryTask(history_id string) {
 func (this *HistoryData) HistoryList() {
 	id := this.GetString("id")
 	if this.Method() == "POST" {
-		data, _ := Mgo.Find("historylog", bson.M{"user_id": id, "state": bson.M{"$ne": -1}}, `{"createtime":-1}`, nil, false, -1, -1)
+		start, _ := this.GetInteger("start")
+		limit, _ := this.GetInteger("length")
+		draw, _ := this.GetInteger("draw")
+		searchStr := this.GetString("search[value]")
+		search := strings.TrimSpace(searchStr)
+		query := map[string]interface{}{
+			"user_id": id,
+			"state":   map[string]interface{}{"$ne": -1},
+		}
+		if search != "" {
+			query["$or"] = []interface{}{
+				bson.M{"s_name": bson.M{"$regex": search}},
+			}
+		}
+		data, _ := Mgo.Find("historylog", query, `{"createtime":-1}`, nil, false, start, limit)
+		count := Mgo.Count("historylog", query)
 		this.ServeJson(map[string]interface{}{
-			"data": data,
+			"draw":            draw,
+			"data":            data,
+			"recordsFiltered": count,
+			"recordsTotal":    count,
 		})
 	} else {
 		this.T["id"] = id

+ 193 - 17
src/history/task.go

@@ -23,7 +23,7 @@ import (
 )
 
 // 获取客户打标签规则
-func (c *Customer) GetTagRules(tagRules []map[string]interface{}) {
+func (c *Customer) GetTagRules(tagRules, tagRules2, tagRules3 []map[string]interface{}) {
 	log.Println("开始加载标签规则...")
 	defer qu.Catch()
 	if len(tagRules) > 0 {
@@ -56,6 +56,66 @@ func (c *Customer) GetTagRules(tagRules []map[string]interface{}) {
 			c.TagRules = append(c.TagRules, TR)
 		}
 	}
+	if len(tagRules2) > 0 {
+		c.IsTagRule2 = true //查到打标签规则,表示打标签
+		for _, tr := range tagRules2 {
+			TR := &TagRule{}
+			TR.Fields = make(map[string]interface{})
+			TR.DepartRuleIds = make(map[string]bool)
+			id := mongoutil.BsonIdToSId(tr["_id"])
+			name := qu.ObjToString(tr["s_name"])
+			TR.ID = id
+			TR.Name = name
+			TR.CustomerId = c.ID
+			//部门规则id组
+			if departRuleIds := qu.ObjToString(tr["o_departruleids"]); departRuleIds != "" {
+				for _, drid := range strings.Split(departRuleIds, ",") {
+					TR.DepartRuleIds[drid] = true
+				}
+			}
+
+			o_list, ok := tr["o_list"].([]interface{})
+			if !ok {
+				o_list = []interface{}{}
+			}
+			o_lists := qu.ObjArrToMapArr(o_list)
+			//规则
+			if len(o_list) > 0 {
+				TR.GetKeyAddNotKeyWord(o_lists)
+			}
+			c.TagRules2 = append(c.TagRules2, TR)
+		}
+	}
+	if len(tagRules3) > 0 {
+		c.IsTagRule3 = true //查到打标签规则,表示打标签
+		for _, tr := range tagRules3 {
+			TR := &TagRule{}
+			TR.Fields = make(map[string]interface{})
+			TR.DepartRuleIds = make(map[string]bool)
+			id := mongoutil.BsonIdToSId(tr["_id"])
+			name := qu.ObjToString(tr["s_name"])
+			TR.ID = id
+			TR.Name = name
+			TR.CustomerId = c.ID
+			//部门规则id组
+			if departRuleIds := qu.ObjToString(tr["o_departruleids"]); departRuleIds != "" {
+				for _, drid := range strings.Split(departRuleIds, ",") {
+					TR.DepartRuleIds[drid] = true
+				}
+			}
+
+			o_list, ok := tr["o_list"].([]interface{})
+			if !ok {
+				o_list = []interface{}{}
+			}
+			o_lists := qu.ObjArrToMapArr(o_list)
+			//规则
+			if len(o_list) > 0 {
+				TR.GetKeyAddNotKeyWord(o_lists)
+			}
+			c.TagRules3 = append(c.TagRules3, TR)
+		}
+	}
 }
 
 // 获取部门信息
@@ -417,16 +477,6 @@ func (c *Customer) EsConGetDataV1(stype string, dataSource int, esCon *esv.EsV1)
 	}
 }
 
-// type MySource struct {
-// 	Querys string
-// }
-
-// func (m *MySource) Source() (interface{}, error) {
-// 	mp := make(map[string]interface{})
-// 	json.Unmarshal([]byte(m.Querys), &mp)
-// 	return mp["query"], nil
-// }
-
 func (c *Customer) EsConGetDataV7(stype string, dataSource int, esCon *esv.EsV7) {
 	client := esCon.GetEsConn()
 	defer esCon.DestoryEsConn(client)
@@ -630,7 +680,6 @@ func (c *Customer) EsConGetDataV7(stype string, dataSource int, esCon *esv.EsV7)
 									if c.IsTagRule {
 										tagNameMap := map[string]bool{}
 										tagIdMap := map[string]bool{}
-										//qu.Debug("c.TagRules---", len(c.TagRules))
 										for _, tr := range c.TagRules {
 											if tr.DepartRuleIds[sr.ID] {
 												//先获取用到的所有字段值
@@ -643,12 +692,9 @@ func (c *Customer) EsConGetDataV7(stype string, dataSource int, esCon *esv.EsV7)
 												}
 												matchKeyTag := map[string]bool{}     //记录所有标签里的匹配上的关键词
 												matchKeyTypeTag := map[string]bool{} //记录标签里的关键词对应的匹配方式
-
 												//qu.Debug("-------------------------开始排除词匹配--------------------------")
-												//qu.Debug("tr.NW---", len(tr.NW))
 												for j, tag_nw := range tr.NW { //排除词匹配
 													IsMatchNotKey := RegMatch(fieldText, tag_nw.MatchType, tag_nw.KeyReg, nil, nil, false, false)
-													//qu.Debug(IsMatchNotKey, "------------------------------------------------------------")
 													if !IsMatchNotKey { //排除词未匹配,匹配附加词关键词
 														if RegMatch(fieldText, tr.AW[j].MatchType, tr.AW[j].KeyReg, nil, nil, false, true) && RegMatch(fieldText, tr.KW[j].MatchType, tr.KW[j].KeyReg, matchKeyTag, matchKeyTypeTag, true, false) {
 															tagname := tr.TagNames[j]
@@ -663,7 +709,6 @@ func (c *Customer) EsConGetDataV7(stype string, dataSource int, esCon *esv.EsV7)
 																		tagname = strings.Join(tempList, ",")
 																		log.Println("=====tagname为空取匹配词为标签名称", tagname)
 																	}
-																	//qu.Debug("tagname-----", tagname)
 																	tagNameMap[tagname] = true
 																	tagIdMap[tr.ID] = true
 																}
@@ -676,7 +721,6 @@ func (c *Customer) EsConGetDataV7(stype string, dataSource int, esCon *esv.EsV7)
 																	tagname = strings.Join(tempList, ",")
 																	log.Println("=====tagname为空取匹配词为标签名称", tagname)
 																}
-																//qu.Debug("tagname-----", tagname)
 																tagNameMap[tagname] = true
 																tagIdMap[tr.ID] = true
 															}
@@ -699,6 +743,138 @@ func (c *Customer) EsConGetDataV7(stype string, dataSource int, esCon *esv.EsV7)
 											tmp["tagid"] = strings.Join(tagIdArr, ",")
 										}
 									}
+									if c.IsTagRule2 {
+										tagNameMap := map[string]bool{}
+										tagIdMap := map[string]bool{}
+										for _, tr := range c.TagRules2 {
+											if tr.DepartRuleIds[sr.ID] {
+												//先获取用到的所有字段值
+												for field, _ := range tr.Fields {
+													if fieldText[field] == nil { //补充fieldText
+														text := qu.ObjToString(tmp[field])
+														text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
+														fieldText[field] = text
+													}
+												}
+												matchKeyTag := map[string]bool{}     //记录所有标签里的匹配上的关键词
+												matchKeyTypeTag := map[string]bool{} //记录标签里的关键词对应的匹配方式
+												//qu.Debug("-------------------------开始排除词匹配--------------------------")
+												for j, tag_nw := range tr.NW { //排除词匹配
+													IsMatchNotKey := RegMatch(fieldText, tag_nw.MatchType, tag_nw.KeyReg, nil, nil, false, false)
+													if !IsMatchNotKey { //排除词未匹配,匹配附加词关键词
+														if RegMatch(fieldText, tr.AW[j].MatchType, tr.AW[j].KeyReg, nil, nil, false, true) && RegMatch(fieldText, tr.KW[j].MatchType, tr.KW[j].KeyReg, matchKeyTag, matchKeyTypeTag, true, false) {
+															tagname := tr.TagNames[j]
+															tagBuyerClass := tr.BuyerClass[j]
+															if tagBuyerClass != "" {
+																if strings.Contains(tagBuyerClass, tmpBuyerClass) {
+																	if tagname == "" {
+																		tempList := []string{}
+																		for k, _ := range matchKeyTag {
+																			tempList = append(tempList, k)
+																		}
+																		tagname = strings.Join(tempList, ",")
+																		log.Println("=====tagname为空取匹配词为标签名称", tagname)
+																	}
+																	tagNameMap[tagname] = true
+																	tagIdMap[tr.ID] = true
+																}
+															} else {
+																if tagname == "" {
+																	tempList := []string{}
+																	for k, _ := range matchKeyTag {
+																		tempList = append(tempList, k)
+																	}
+																	tagname = strings.Join(tempList, ",")
+																	log.Println("=====tagname为空取匹配词为标签名称", tagname)
+																}
+																tagNameMap[tagname] = true
+																tagIdMap[tr.ID] = true
+															}
+														}
+													}
+												}
+											}
+										}
+										//tagname
+										tagNameArr := MapDataToArr(tagNameMap)
+										tagIdArr := MapDataToArr(tagIdMap)
+										if len(tagNameArr) > 0 {
+											tmp["tagname2"] = strings.Join(tagNameArr, ",")
+											if DisPackageAppidMap[c.AppId] {
+												tmp["buyer_type2"] = strings.Join(tagNameArr, ",")
+											}
+											if c.PushModel == 2 {
+												tmp["item2"] = strings.Join(tagNameArr, ",")
+											}
+											tmp["tagid2"] = strings.Join(tagIdArr, ",")
+										}
+									}
+									if c.IsTagRule3 {
+										tagNameMap := map[string]bool{}
+										tagIdMap := map[string]bool{}
+										for _, tr := range c.TagRules3 {
+											if tr.DepartRuleIds[sr.ID] {
+												//先获取用到的所有字段值
+												for field, _ := range tr.Fields {
+													if fieldText[field] == nil { //补充fieldText
+														text := qu.ObjToString(tmp[field])
+														text = ProcessData(text) //处理文本(字母转大写,删除一些符号)
+														fieldText[field] = text
+													}
+												}
+												matchKeyTag := map[string]bool{}     //记录所有标签里的匹配上的关键词
+												matchKeyTypeTag := map[string]bool{} //记录标签里的关键词对应的匹配方式
+												//qu.Debug("-------------------------开始排除词匹配--------------------------")
+												for j, tag_nw := range tr.NW { //排除词匹配
+													IsMatchNotKey := RegMatch(fieldText, tag_nw.MatchType, tag_nw.KeyReg, nil, nil, false, false)
+													if !IsMatchNotKey { //排除词未匹配,匹配附加词关键词
+														if RegMatch(fieldText, tr.AW[j].MatchType, tr.AW[j].KeyReg, nil, nil, false, true) && RegMatch(fieldText, tr.KW[j].MatchType, tr.KW[j].KeyReg, matchKeyTag, matchKeyTypeTag, true, false) {
+															tagname := tr.TagNames[j]
+															tagBuyerClass := tr.BuyerClass[j]
+															if tagBuyerClass != "" {
+																if strings.Contains(tagBuyerClass, tmpBuyerClass) {
+																	if tagname == "" {
+																		tempList := []string{}
+																		for k, _ := range matchKeyTag {
+																			tempList = append(tempList, k)
+																		}
+																		tagname = strings.Join(tempList, ",")
+																		log.Println("=====tagname为空取匹配词为标签名称", tagname)
+																	}
+																	tagNameMap[tagname] = true
+																	tagIdMap[tr.ID] = true
+																}
+															} else {
+																if tagname == "" {
+																	tempList := []string{}
+																	for k, _ := range matchKeyTag {
+																		tempList = append(tempList, k)
+																	}
+																	tagname = strings.Join(tempList, ",")
+																	log.Println("=====tagname为空取匹配词为标签名称", tagname)
+																}
+																tagNameMap[tagname] = true
+																tagIdMap[tr.ID] = true
+															}
+														}
+													}
+												}
+											}
+										}
+										//tagname
+										tagNameArr := MapDataToArr(tagNameMap)
+										tagIdArr := MapDataToArr(tagIdMap)
+										if len(tagNameArr) > 0 {
+											tmp["tagname3"] = strings.Join(tagNameArr, ",")
+											if DisPackageAppidMap[c.AppId] {
+												tmp["buyer_type3"] = strings.Join(tagNameArr, ",")
+											}
+											if c.PushModel == 2 {
+												tmp["item3"] = strings.Join(tagNameArr, ",")
+											}
+											tmp["tagid3"] = strings.Join(tagIdArr, ",")
+										}
+									}
 									//item
 									switch c.PushModel {
 									case 0:

+ 60 - 12
src/service/customer_service.go

@@ -121,10 +121,25 @@ func (c *Customer) CustomerEdit() {
 	data, _ := Mgo.FindOneByField("cuser", query, `{}`)
 	depart, _ := Mgo.Find("cuserdepart", bson.M{"s_userid": id, "b_delete": false}, nil, nil, false, -1, -1)
 	(*data)["_id"] = mongoutil.BsonIdToSId((*data)["_id"])
+	tagRule, tagRule2, tagRule3 := []map[string]interface{}{}, []map[string]interface{}{}, []map[string]interface{}{}
 	if (*data)["i_state"] == 1 {
-		tagRule, _ := Mgo.Find("eusertagrule", bson.M{"s_userid": id, "b_delete": false}, nil, nil, false, -1, -1)
-		c.T["tagrule"] = *tagRule
+		tagRules, _ := Mgo.Find("eusertagrule", bson.M{"s_userid": id, "b_delete": false}, nil, nil, false, -1, -1)
+		if tagRules != nil && len(*tagRules) > 0 {
+			for _, v := range *tagRules {
+				tagType := qu.ObjToString(v["tagType"])
+				if tagType == "2" {
+					tagRule2 = append(tagRule2, v)
+				} else if tagType == "3" {
+					tagRule3 = append(tagRule3, v)
+				} else {
+					tagRule = append(tagRule, v)
+				}
+			}
+		}
 	}
+	c.T["tagrule"] = tagRule
+	c.T["tagrule2"] = tagRule2
+	c.T["tagrule3"] = tagRule3
 	c.T["data"] = *data
 	c.T["depart"] = *depart
 	c.Render("private/customer_edit.html", &c.T)
@@ -899,7 +914,6 @@ func (c *Customer) EuserTagEdit() {
 				}
 				data["i_type"] = "historyData"
 				data["_id"] = mongoutil.StringTOBsonId(_id)
-				log.Println("历史任务更新私有标签", data)
 				reps := Mgo.Update("eusertagrule", query, bson.M{"$set": data}, false, false)
 				if reps {
 					rep = AddHistoryLogTag(data, true, _id)
@@ -916,7 +930,9 @@ func (c *Customer) EuserTagEdit() {
 			c.T["tagrule"] = *data
 		}
 		cid := c.GetString("cid")
+		tag := c.GetString("tag")
 		c.T["cid"] = cid
+		c.T["tagType"] = tag
 		c.T["matchTypeMap"] = MatchTypeMap3
 		c.T["hid"] = c.GetString("hid")
 		c.T["buyerClassMap"] = BuyerClassMap
@@ -1081,6 +1097,8 @@ func (c *Customer) CustomerHistory() {
 		if ok && hData != nil && len(*hData) > 0 {
 			c.T["history_rule"] = (*hData)["dep_rules"]
 			c.T["tagrule"] = (*hData)["tag_rules"]
+			c.T["tagrule2"] = (*hData)["tag_rules2"]
+			c.T["tagrule3"] = (*hData)["tag_rules3"]
 			(*hData)["_id"] = id
 			c.T["data"] = *hData
 		}
@@ -1446,26 +1464,56 @@ func AddHistoryLogDep(ruleData map[string]interface{}, isUpdate bool, id string)
 }
 
 func AddHistoryLogTag(ruleData map[string]interface{}, isUpdate bool, id string) bool {
-	log.Println("=====", ruleData)
 	history_id := mongoutil.StringTOBsonId(qu.ObjToString(ruleData["hid"]))
 	hData, ok := Mgo.FindOne("historylog", bson.M{"_id": history_id})
 	if ok && hData != nil && *hData != nil && len(*hData) > 0 {
-		tag_rules := []map[string]interface{}{}
+		tagType := qu.ObjToString(ruleData["tagType"])
+		tag_rules, tag_rules2, tag_rules3 := []map[string]interface{}{}, []map[string]interface{}{}, []map[string]interface{}{}
 		if (*hData)["tag_rules"] != nil {
 			tag_rules = qu.ObjArrToMapArr((*hData)["tag_rules"].([]interface{}))
 		}
+		if (*hData)["tag_rules2"] != nil {
+			tag_rules2 = qu.ObjArrToMapArr((*hData)["tag_rules2"].([]interface{}))
+		}
+		if (*hData)["tag_rules3"] != nil {
+			tag_rules3 = qu.ObjArrToMapArr((*hData)["tag_rules3"].([]interface{}))
+		}
 		ruleData["is_new"] = true
-		if isUpdate {
-			for k, v := range tag_rules {
-				if mongoutil.BsonIdToSId(v["_id"]) == id {
-					log.Println(ruleData)
-					tag_rules[k] = ruleData
+		log.Println("tagType ", tagType)
+		if tagType == "2" {
+			if isUpdate {
+				for k, v := range tag_rules2 {
+					if mongoutil.BsonIdToSId(v["_id"]) == id {
+						tag_rules2[k] = ruleData
+					}
+				}
+			} else {
+				tag_rules2 = append(tag_rules2, ruleData)
+			}
+			return Mgo.Update("historylog", bson.M{"_id": history_id}, bson.M{"$set": bson.M{"tag_rules2": tag_rules2}}, false, false)
+		} else if tagType == "3" {
+			if isUpdate {
+				for k, v := range tag_rules3 {
+					if mongoutil.BsonIdToSId(v["_id"]) == id {
+						tag_rules3[k] = ruleData
+					}
 				}
+			} else {
+				tag_rules3 = append(tag_rules3, ruleData)
 			}
+			return Mgo.Update("historylog", bson.M{"_id": history_id}, bson.M{"$set": bson.M{"tag_rules3": tag_rules3}}, false, false)
 		} else {
-			tag_rules = append(tag_rules, ruleData)
+			if isUpdate {
+				for k, v := range tag_rules {
+					if mongoutil.BsonIdToSId(v["_id"]) == id {
+						tag_rules[k] = ruleData
+					}
+				}
+			} else {
+				tag_rules = append(tag_rules, ruleData)
+			}
+			return Mgo.Update("historylog", bson.M{"_id": history_id}, bson.M{"$set": bson.M{"tag_rules": tag_rules}}, false, false)
 		}
-		return Mgo.Update("historylog", bson.M{"_id": history_id}, bson.M{"$set": bson.M{"tag_rules": tag_rules}}, false, false)
 	} else {
 		return false
 	}

+ 173 - 8
src/web/templates/private/customer_edit.html

@@ -18,10 +18,10 @@
         <div class="tab-content">
             <div class="nav-tabs-custom">
                 <ul class="nav nav-tabs edit-step">
-                    <li class="active" data-mode="guide"><a href="#tab_1" data-toggle="tab"
-                                                            aria-expanded="true">客户信息</a></li>
-                    <li data-mode="guide" class="tab_2"><a href="#tab_2" data-toggle="tab"
-                                                           aria-expanded="false">私有标签</a></li>
+                    <li class="active" data-mode="guide"><a href="#tab_1" data-toggle="tab" aria-expanded="true">客户信息</a></li>
+                    <li data-mode="guide" class="tab_2"><a href="#tab_2" data-toggle="tab" aria-expanded="false">私有标签1</a></li>
+                    <li data-mode="guide" class="tab_2"><a href="#tab_3" data-toggle="tab" aria-expanded="false">私有标签2</a></li>
+                    <li data-mode="guide" class="tab_2"><a href="#tab_4" data-toggle="tab" aria-expanded="false">私有标签3</a></li>
                 </ul>
                 <div class="tab-content">
 
@@ -186,10 +186,10 @@
                         <div class="box box-primary">
                             <div class="box-header with-border">
                                 <i class="fa fa-bookmark"></i>
-                                <h3 class="box-title">私有标签</h3>
+                                <h3 class="box-title">私有标签1</h3>
                                 <a class="btn btn-primary btn-sm"
                                    style="float: right;margin-top: 7px;margin-right: 10px"
-                                   href="/service/euser/tag/edit?cid={{.T.data._id}}"><i
+                                   href="/service/euser/tag/edit?tag=1&cid={{.T.data._id}}"><i
                                             class="fa fa-fw fa-file-code-o fa-lg"></i>新建标签</a>
                             </div>
                             <table id="tagrule" class="table table-bordered">
@@ -206,6 +206,54 @@
                             </table>
                         </div>
                     </div>
+                    <div class="tab-pane" id="tab_3">
+                        <div class="box box-primary">
+                            <div class="box-header with-border">
+                                <i class="fa fa-bookmark"></i>
+                                <h3 class="box-title">私有标签2</h3>
+                                <a class="btn btn-primary btn-sm"
+                                   style="float: right;margin-top: 7px;margin-right: 10px"
+                                   href="/service/euser/tag/edit?tag=2&cid={{.T.data._id}}"><i
+                                            class="fa fa-fw fa-file-code-o fa-lg"></i>新建标签</a>
+                            </div>
+                            <table id="tagrule2" class="table table-bordered">
+                                <thead>
+                                <tr>
+                                    <th>编号</th>
+                                    <th>标签规则名称</th>
+                                    <th>修改时间</th>
+                                    <th>启用状态</th>
+                                    <th>操作</th>
+                                    <th>功能</th>
+                                </tr>
+                                </thead>
+                            </table>
+                        </div>
+                    </div>
+                    <div class="tab-pane" id="tab_4">
+                        <div class="box box-primary">
+                            <div class="box-header with-border">
+                                <i class="fa fa-bookmark"></i>
+                                <h3 class="box-title">私有标签3</h3>
+                                <a class="btn btn-primary btn-sm"
+                                   style="float: right;margin-top: 7px;margin-right: 10px"
+                                   href="/service/euser/tag/edit?tag=3&cid={{.T.data._id}}"><i
+                                            class="fa fa-fw fa-file-code-o fa-lg"></i>新建标签</a>
+                            </div>
+                            <table id="tagrule3" class="table table-bordered">
+                                <thead>
+                                <tr>
+                                    <th>编号</th>
+                                    <th>标签规则名称</th>
+                                    <th>修改时间</th>
+                                    <th>启用状态</th>
+                                    <th>操作</th>
+                                    <th>功能</th>
+                                </tr>
+                                </thead>
+                            </table>
+                        </div>
+                    </div>
                 </div>
             </div>
         </div>
@@ -299,6 +347,8 @@
     var dataMap = {{.T.data}}
     var departArr = {{.T.depart}}
     var tagruleArr = []
+    var tagruleArr2 = []
+    var tagruleArr3 = []
     var ruleArr = []
 
     var selectIndex = [];               //选中的编号
@@ -309,7 +359,8 @@
             $('#pushDiv').hide()
         } else {
             tagruleArr = {{.T.tagrule}}
-                console.log("私有标签", tagruleArr)
+            tagruleArr2 = {{.T.tagrule2}}
+            tagruleArr3 = {{.T.tagrule3}}
             $('#pushSwitch').bootstrapSwitch({
                 onText: "开启",
                 offText: "关闭",
@@ -455,7 +506,121 @@
                 {
                     "data": "_id", width: "11%", render: function (val, a, row, pos) {
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?id=' + val + '&cid=' + row.s_userid + '">编辑</a>&nbsp&nbsp' +
+                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?tag=1&id=' + val + '&cid=' + row.s_userid + '">编辑</a>&nbsp&nbsp' +
+                            '<a class="btn btn-sm btn-danger" onclick="delTag(\'' + val + '\')">删除</a>' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        var s = [val, row.s_userid]
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" onclick="associated(\'' + s + '\',\'' + row.o_departruleids + '\')">关联数据范围</a>&nbsp&nbsp' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+            ],
+        });
+        $('#tagrule2').DataTable({
+            "paging": false,
+            "lengthChange": false,
+            "searching": false,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "data": tagruleArr2,
+            "columns": [
+                {"data": null, width: "1%"},
+                {"data": "s_name", width: "10%"},
+                {
+                    "data": "i_updatetime", width: "9%", render: function (val) {
+                        var dt = new Date()
+                        dt.setTime(parseInt(val) * 1000);
+                        return dt.format("yyyy-MM-dd hh:mm:ss")
+                    }
+                },
+                {
+                    "data": "i_isuse", render: function (val, a, row) {
+                        tmp = ""
+                        if (val == 1) {
+                            tmp = "<a href='#' title='停用' onclick='setupTag(\"" + row._id + "\",false)'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+                        } else {
+                            tmp = "<a href='#' title='启用' onclick='setupTag(\"" + row._id + "\",true)'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+                        }
+                        return tmp
+                    }, width: "10%"
+                },
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?tag=2&id=' + val + '&cid=' + row.s_userid + '">编辑</a>&nbsp&nbsp' +
+                            '<a class="btn btn-sm btn-danger" onclick="delTag(\'' + val + '\')">删除</a>' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        var s = [val, row.s_userid]
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" onclick="associated(\'' + s + '\',\'' + row.o_departruleids + '\')">关联数据范围</a>&nbsp&nbsp' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+            ],
+        });
+        $('#tagrule3').DataTable({
+            "paging": false,
+            "lengthChange": false,
+            "searching": false,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "data": tagruleArr3,
+            "columns": [
+                {"data": null, width: "1%"},
+                {"data": "s_name", width: "10%"},
+                {
+                    "data": "i_updatetime", width: "9%", render: function (val) {
+                        var dt = new Date()
+                        dt.setTime(parseInt(val) * 1000);
+                        return dt.format("yyyy-MM-dd hh:mm:ss")
+                    }
+                },
+                {
+                    "data": "i_isuse", render: function (val, a, row) {
+                        tmp = ""
+                        if (val == 1) {
+                            tmp = "<a href='#' title='停用' onclick='setupTag(\"" + row._id + "\",false)'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+                        } else {
+                            tmp = "<a href='#' title='启用' onclick='setupTag(\"" + row._id + "\",true)'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+                        }
+                        return tmp
+                    }, width: "10%"
+                },
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?tag=3&id=' + val + '&cid=' + row.s_userid + '">编辑</a>&nbsp&nbsp' +
                             '<a class="btn btn-sm btn-danger" onclick="delTag(\'' + val + '\')">删除</a>' +
                             '</div>';
                         return tmp

+ 180 - 6
src/web/templates/private/customer_history.html

@@ -20,10 +20,10 @@
         <div class="tab-content">
             <div class="nav-tabs-custom">
                 <ul class="nav nav-tabs edit-step">
-                    <li class="active" data-mode="guide"><a href="#tab_1" data-toggle="tab"
-                                                            aria-expanded="true">新建历史任务</a></li>
-                    <li data-mode="guide" class="tab_2"><a href="#tab_2" data-toggle="tab"
-                                                           aria-expanded="false">私有标签</a></li>
+                    <li class="active" data-mode="guide"><a href="#tab_1" data-toggle="tab" aria-expanded="true">新建历史任务</a></li>
+                    <li data-mode="guide" class="tab_2"><a href="#tab_2" data-toggle="tab" aria-expanded="false">私有标签1</a></li>
+                    <li data-mode="guide" class="tab_2"><a href="#tab_3" data-toggle="tab" aria-expanded="false">私有标签2</a></li>
+                    <li data-mode="guide" class="tab_2"><a href="#tab_4" data-toggle="tab" aria-expanded="false">私有标签3</a></li>
                 </ul>
                 <div class="tab-content">
 
@@ -243,7 +243,7 @@
                                 <h3 class="box-title">私有标签</h3>
                                 <a class="btn btn-primary btn-sm"
                                    style="float: right;margin-top: 7px;margin-right: 10px"
-                                   href="/service/euser/tag/edit?cid={{.T.data._id}}&hid={{.T.history_id}}"><i
+                                   href="/service/euser/tag/edit?tag=1&cid={{.T.data._id}}&hid={{.T.history_id}}"><i
                                             class="fa fa-fw fa-file-code-o fa-lg"></i>新建标签</a>
                             </div>
                             <table id="tagrule" class="table table-bordered">
@@ -260,6 +260,54 @@
                             </table>
                         </div>
                     </div>
+                    <div class="tab-pane" id="tab_3">
+                        <div class="box box-primary">
+                            <div class="box-header with-border">
+                                <i class="fa fa-bookmark"></i>
+                                <h3 class="box-title">私有标签</h3>
+                                <a class="btn btn-primary btn-sm"
+                                   style="float: right;margin-top: 7px;margin-right: 10px"
+                                   href="/service/euser/tag/edit?tag=2&cid={{.T.data._id}}&hid={{.T.history_id}}"><i
+                                            class="fa fa-fw fa-file-code-o fa-lg"></i>新建标签</a>
+                            </div>
+                            <table id="tagrule2" class="table table-bordered">
+                                <thead>
+                                <tr>
+                                    <th>编号</th>
+                                    <th>标签规则名称</th>
+                                    <th>修改时间</th>
+                                    <th>启用状态</th>
+                                    <th>操作</th>
+                                    <th>功能</th>
+                                </tr>
+                                </thead>
+                            </table>
+                        </div>
+                    </div>
+                    <div class="tab-pane" id="tab_4">
+                        <div class="box box-primary">
+                            <div class="box-header with-border">
+                                <i class="fa fa-bookmark"></i>
+                                <h3 class="box-title">私有标签</h3>
+                                <a class="btn btn-primary btn-sm"
+                                   style="float: right;margin-top: 7px;margin-right: 10px"
+                                   href="/service/euser/tag/edit?tag=3&cid={{.T.data._id}}&hid={{.T.history_id}}"><i
+                                            class="fa fa-fw fa-file-code-o fa-lg"></i>新建标签</a>
+                            </div>
+                            <table id="tagrule3" class="table table-bordered">
+                                <thead>
+                                <tr>
+                                    <th>编号</th>
+                                    <th>标签规则名称</th>
+                                    <th>修改时间</th>
+                                    <th>启用状态</th>
+                                    <th>操作</th>
+                                    <th>功能</th>
+                                </tr>
+                                </thead>
+                            </table>
+                        </div>
+                    </div>
                 </div>
             </div>
         </div>
@@ -381,6 +429,8 @@
     menuActive("/customer/list");
     var dataMap = {{.T.data}}
     var tagruleArr = []
+    var tagruleArr2 = []
+    var tagruleArr3 = []
     var ruleArr = []
     var history_id = {{.T.history_id}}
     var selectIndex = [];               //选中的编号
@@ -564,9 +614,17 @@
             $('#pushDiv').hide()
         } else {
             tagruleArr = {{.T.tagrule}}
+            tagruleArr2 = {{.T.tagrule2}}
+            tagruleArr3 = {{.T.tagrule3}}
             if (tagruleArr != null) {
                 tagruleArr = tagruleArr.sort(compare("i_updatetime"))
             }
+            if (tagruleArr2 != null) {
+                tagruleArr2 = tagruleArr2.sort(compare("i_updatetime"))
+            }
+            if (tagruleArr3 != null) {
+                tagruleArr3 = tagruleArr3.sort(compare("i_updatetime"))
+            }
             $('#pushSwitch').bootstrapSwitch({
                 onText: "开启",
                 offText: "关闭",
@@ -717,7 +775,123 @@
                 {
                     "data": "_id", width: "11%", render: function (val, a, row, pos) {
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?id=' + val + '&cid=' + row.s_userid + '&hid={{.T.history_id}}">编辑</a>&nbsp&nbsp' +
+                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?tag=1&id=' + val + '&cid=' + row.s_userid + '&hid={{.T.history_id}}">编辑</a>&nbsp&nbsp' +
+                            '<a class="btn btn-sm btn-danger" onclick="delTag(\'' + val + '\')">删除</a>' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        var s = [val, row.hid]
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" onclick="associated(\'' + s + '\')">关联数据范围</a>&nbsp&nbsp' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+            ],
+        });
+
+        $('#tagrule2').DataTable({
+            "paging": false,
+            "lengthChange": false,
+            "searching": false,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "data": tagruleArr2,
+            "columns": [
+                {"data": null, width: "1%"},
+                {"data": "s_name", width: "10%"},
+                {
+                    "data": "i_updatetime", width: "9%", render: function (val) {
+                        var dt = new Date()
+                        dt.setTime(parseInt(val) * 1000);
+                        return dt.format("yyyy-MM-dd hh:mm:ss")
+                    }
+                },
+                {
+                    "data": "i_isuse", render: function (val, a, row) {
+                        tmp = ""
+                        if (val == 1) {
+                            tmp = "<a href='#' title='停用' onclick='setupTag(\"" + row._id + "\",false)'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+                        } else {
+                            tmp = "<a href='#' title='启用' onclick='setupTag(\"" + row._id + "\",true)'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+                        }
+                        return tmp
+                    }, width: "10%"
+                },
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?tag=2&id=' + val + '&cid=' + row.s_userid + '&hid={{.T.history_id}}">编辑</a>&nbsp&nbsp' +
+                            '<a class="btn btn-sm btn-danger" onclick="delTag(\'' + val + '\')">删除</a>' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        var s = [val, row.hid]
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" onclick="associated(\'' + s + '\')">关联数据范围</a>&nbsp&nbsp' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+            ],
+        });
+
+        $('#tagrule3').DataTable({
+            "paging": false,
+            "lengthChange": false,
+            "searching": false,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                this.api().column(0).nodes().each(function (cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "data": tagruleArr3,
+            "columns": [
+                {"data": null, width: "1%"},
+                {"data": "s_name", width: "10%"},
+                {
+                    "data": "i_updatetime", width: "9%", render: function (val) {
+                        var dt = new Date()
+                        dt.setTime(parseInt(val) * 1000);
+                        return dt.format("yyyy-MM-dd hh:mm:ss")
+                    }
+                },
+                {
+                    "data": "i_isuse", render: function (val, a, row) {
+                        tmp = ""
+                        if (val == 1) {
+                            tmp = "<a href='#' title='停用' onclick='setupTag(\"" + row._id + "\",false)'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+                        } else {
+                            tmp = "<a href='#' title='启用' onclick='setupTag(\"" + row._id + "\",true)'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+                        }
+                        return tmp
+                    }, width: "10%"
+                },
+                {
+                    "data": "_id", width: "11%", render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" href="/service/euser/tag/edit?tag=3&id=' + val + '&cid=' + row.s_userid + '&hid={{.T.history_id}}">编辑</a>&nbsp&nbsp' +
                             '<a class="btn btn-sm btn-danger" onclick="delTag(\'' + val + '\')">删除</a>' +
                             '</div>';
                         return tmp

+ 2 - 0
src/web/templates/private/euser_tag_rule.html

@@ -216,6 +216,7 @@
     var buyerArr = [];  
     var buyerClassMap = {{.T.buyerClassMap}}
     var tagRule = {{.T.tagrule}}
+    var tagType = {{.T.tagType}}
 
     //表单数据
     var dataMap = {
@@ -504,6 +505,7 @@
         }
         dataMap["o_list"] = JSON.stringify(o_list);
         dataMap["hid"] = history_id;
+        dataMap["tagType"] = tagType;
         if (history_id !== "") {
             dataMap["i_isuse"] = 1;
         }

+ 2 - 114
src/web/templates/private/historylog_list.html

@@ -23,31 +23,7 @@
                                                                              aria-expanded="true">历史任务</a></li>
                     <li data-mode="guide" class="tab_2" id="showSecondPush"><a href="#tab_2" data-toggle="tab"
                                                                                aria-expanded="false">二次推送</a></li>
-                </ul>
-                <!-- <div class="row">
-                    <div class="col-lg-2 ">
-                        <div class="input-group">
-                            <span class="input-group-addon">规则名称:</span>
-                            <input type="text" class="form-control" id="ruleName" placeholder="请输入规则名称">
-                        </div>
-                    </div>
-                    <div class="col-lg-2 ">
-                        <div class="input-group">
-                            <span class="input-group-addon">起始时间:</span>
-                            <input type="text" class="form-control" id="startTime" placeholder="起始时间">
-                        </div>
-                    </div>
-                    <div class="col-lg-2 ">
-                        <div class="input-group">
-                            <span class="input-group-addon">截止时间:</span>
-                            <input type="text" class="form-control" id="endTime" placeholder="截止时间">
-                        </div>
-                    </div>
-                    <div class="col-lg-3 ">
-                        <a style="width: 20%;" class="btn btn-sm btn-info" onclick="historyWork(this)">查询</a>
-                        <a style="width: 20%;" class="btn btn-sm btn-default" onclick="cloneWork(this)">重置</a>
-                    </div>
-                </div> -->
+                </ul>
                 <div class="row" id="history-task-list">
                     <div class="col-xs-12">
                         <div class="box">
@@ -102,56 +78,6 @@
         </div>
 
     </section>
-    {{/*<div class="modal fade" id="modal-whether-filter" tabindex="-1" role="dialog" aria-hidden="true">
-        <div class="modal-dialog" style="width: 30%">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-                    <span style="font-size: 21px;font-weight: bold">历史数据</span>
-                    <div class="header" style="font-size: 18px;">
-                        */}}{{/*<p style="text-align:center;font-size: 18px;margin-top: 30px">是否根据项目id去重?</p>
-                        <div style="margin-top: 40px;margin-bottom: 20px;text-align: center;">
-                            <input type="button" onclick="executeHistoryWork(1)" class="btn btn-primary saveBtn" value="是"
-                                   style="margin: 0 auto;width: 70px;height: 35px">
-                            <input type="button" onclick="executeHistoryWork(0)" class="btn btn-default"
-                                   style="margin-left: 40px;width: 70px;height: 35px" value="否">
-                        </div>*/}}{{/*
-                        <h4 style="margin-left: 20px;margin-top: 30px;">数据去重:</h4>
-                        <div class="row" style="text-align: center;">
-                            <span>项目去重:</span>
-                            <input style="margin-right: 10px;margin-left: 20px;" type="radio" name="projectId"
-                                   value="1">是
-                            <input style="margin: 20px 10px auto 20px;" type="radio" name="projectId" value="0"
-                                   checked="checked">否
-                        </div>
-                        <div class="row" style="margin: 20px auto 30px auto;text-align: center;">
-                            <span>公告去重:</span>
-                            <input style="margin-right: 10px;margin-left: 20px;" type="radio" name="notice" value="1">是
-                            <input style="margin: 20px 10px auto 20px;" type="radio" name="notice" value="0"
-                                   checked="checked">否
-                        </div>
-                        <h4 style="margin-left: 20px;margin-top: 30px;">存表方式:</h4>
-                        <div class="row" style="text-align: center;">
-                            <span>存储位置:</span>
-                            <select style="height: 30px;width: 130px;font-size: 16px;border-radius: 3px;"
-                                    id="dataTableSelect">
-                                <option value="0">历史数据表</option>
-                                <option value="1">接口数据表</option>
-                                <option value="2">商机管理数据表</option>
-                            </select>
-                        </div>
-                        <div style="margin-top: 40px;margin-bottom: 20px;text-align: center;">
-                            <input type="button" onclick="cancelModel()" class="btn btn-default"
-                                   style="margin: 0 auto;width: 70px;height: 35px" value="取消">
-                            <input type="button" onclick="executeHistoryWork()" class="btn btn-primary saveBtn"
-                                   value="确定" style="margin-left: 50px;width: 70px;height: 35px">
-                        </div>
-                    </div>
-
-                </div>
-            </div>
-        </div><!-- /.modal -->
-    </div>*/}}
 </div>
 {{include "com/footer.html"}}
 <script>
@@ -173,6 +99,7 @@
             "ordering": true,
             "info": true,
             "autoWidth": false,
+            "serverSide": true,
             "ajax": {
                 "url": "/service/historylog/list",
                 "type": "post",
@@ -470,45 +397,6 @@
         $("#showHistory").addClass("active");
     }
 
-    //是否根据项目id去重
-    /*function whetherFilter(obj) {
-        historyId = $(obj).attr("eid");
-        // rowIndex = $(obj).parents('tr').find('td:eq(0)').text();
-        // $(obj).removeClass("btn-default").addClass("btn-info").attr("onclick", "");
-        $("#modal-whether-filter").modal("show")
-        goon = obj
-    }
-
-    function executeHistoryWork() {
-        var isFilter = $("input[name=projectId]:checked").val();
-        var noticeIsFilter = $("input[name=notice]:checked").val();
-        var dataTable = $("#dataTableSelect option:selected").val();
-        console.log(isFilter, noticeIsFilter, dataTable)
-        $("#modal-whether-filter").modal("hide")
-        setTimeout(function () {
-            var ok = confirm("是否确定执行?");
-            if (ok) {
-                $(goon).removeClass("btn-default").addClass("btn-info").attr("onclick", "");
-                $(goon).text("进行");
-                // var ishistory = $("#showHistory").hasClass("active")
-                $.ajax({
-                    url: "/service/history/" + historyId,
-                    type: 'POST',
-                    data: {"isFilter": isFilter, "noticeIsFilter": noticeIsFilter, "dataTable": dataTable},
-                    success: function (r) {
-                        $(goon).removeClass("btn-info").addClass("btn-success").attr("disabled", "disabled");
-                        $(goon).text("完成");
-                    },
-                    error: function (r) {
-                        $(goon).removeClass("btn-info").addClass("btn-danger").attr("disabled", "disabled");
-                        $(goon).text("失败");
-                    }
-                })
-            }
-        }, 500)
-
-    }*/
-
     function historyWork(obj) {
         var ok = confirm("是否确定执行?");
         if (ok) {