浏览代码

Merge branch 'dev3.4' of http://39.105.157.10:10080/qmx/jy-data-extract into dev3.4

maxiaoshan 5 年之前
父节点
当前提交
766fc0d89f

+ 8 - 9
fullproject/src_v1/load_data.go

@@ -30,7 +30,7 @@ func (p *ProjectTask) loadData(starttime int64) {
 			case tmp := <-pool:
 				n++
 				if n%10000 == 0 {
-					log.Println("current", n, "\n", tmp.Id, len(p.mapPn), len(p.mapPc), len(p.mapPb)) //, tmp.ProjectName, tmp.MPN, tmp.ProjectCode, tmp.MPC, tmp.Buyer)
+					log.Println("current", n, "\n", tmp.Id, len(p.mapPn), len(p.mapPc), len(p.mapPb), len(p.mapHref)) //, tmp.ProjectName, tmp.MPN, tmp.ProjectCode, tmp.MPC, tmp.Buyer)
 				}
 				if tmp != nil {
 					id := tmp.Id.Hex()
@@ -143,17 +143,16 @@ func (p *ProjectTask) loadSite() {
 }
 
 func saveFiled(p *ProjectTask, res map[string]interface{}, tmp *ProjectInfo) {
-	if jsonData, ok := res["jsondata"].(map[string]interface{}); ok {
-		proHref := util.ObjToString(jsonData["projecthref"])
-		if jsonData != nil && proHref != "" {
-			p.mapHrefLock.Lock()
-			p.mapHref[proHref] = tmp.Id.Hex()
-			p.mapHrefLock.Unlock()
-		}
+	proHref := util.ObjToString(res["projecthref"])
+	if proHref != "" {
+		p.mapHrefLock.Lock()
+		p.mapHref[proHref] = tmp.Id.Hex()
+		p.mapHrefLock.Unlock()
 	}
+
 	tmpMap := make(map[string]InfoField)
 	infoMap := res["infofield"].(map[string]interface{})
-	for _, v := range infoMap{
+	for _, v := range infoMap {
 		var field InfoField
 		b, _ := json.Marshal(v)
 		_ = json.Unmarshal(b, &field)

+ 5 - 1
src/config.json

@@ -8,7 +8,11 @@
     "elasticsearch_index": "winner_enterprise",
     "elasticsearch_type": "winnerent",
     "elasticsearch_db": "winner_enterprise",
-    "elasticPoolSize": 10,
+    "redis_qyk": "127.0.0.1:6379",
+    "redis_winner_db": "1",
+    "redis_buyer_db": "2",
+    "redis_agency_db": "3",
+    "elasticPoolSize": 5,
     "mergetable": "projectset",
     "mergetablealias": "projectset_v1",
     "saveresult": false,

+ 228 - 0
src/jy/admin/audit/agencyinfo.go

@@ -0,0 +1,228 @@
+package audit
+
+import (
+	"github.com/gin-gonic/gin"
+	"gopkg.in/mgo.v2/bson"
+	. "jy/admin"
+	"jy/clear"
+	. "jy/mongodbutil"
+	"jy/util"
+	"log"
+	"qfw/util/elastic"
+	"strings"
+)
+
+/**
+企业库
+ */
+func init() {
+	//页面
+	Admin.GET("/audit/agency_info", func(c *gin.Context) {
+		c.HTML(200, "agencyinfo.html", gin.H{})
+	})
+	//save
+	Admin.POST("/audit/agency_info/save", func(c *gin.Context) {
+		_id := c.PostForm("_id")
+		company_name := c.PostForm("company_name")
+		alias := c.PostForm("alias")
+		province := c.PostForm("province")
+		city := c.PostForm("city")
+		district := c.PostForm("district")
+		capital := c.PostForm("capital")
+		company_address := c.PostForm("company_address")
+		if strings.TrimSpace(company_name) == "" {
+			c.JSON(200, gin.H{"rep": 400})
+			return
+		}
+		capitalfloat := clear.ObjToMoney([]interface{}{capital, ""})[0]
+		e := make(map[string]interface{})
+		e["company_name"] = company_name
+		e["alias"] = alias
+		e["province"] = province
+		e["city"] = city
+		e["district"] = district
+		e["capital"] = capitalfloat
+		e["company_address"] = company_address
+		var sid string
+		if strings.TrimSpace(_id) != "" && bson.IsObjectIdHex(_id) {
+			sid = _id
+			tmpb := Mgo.Update("enterprise_qyxy", bson.M{"_id": bson.ObjectIdHex(_id)}, bson.M{"$set": bson.M{
+				"company_name":    company_name,
+				"alias":           alias,
+				"province":        province,
+				"city":            city,
+				"district":        district,
+				"capital":         capitalfloat,
+				"company_address": company_address,
+			}}, false, false)
+			if tmpb {
+				escon := elastic.GetEsConn()
+				defer elastic.DestoryEsConn(escon)
+				_, err := escon.Update().Index(util.ElasticClientIndex).Type(util.ElasticClientType).
+					Id(sid).Doc(map[string]interface{}{
+					"company_name":    company_name,
+					"alias":           alias,
+					"province":        province,
+					"city":            city,
+					"district":        district,
+					"capital":         capitalfloat,
+					"company_address": company_address,
+				}).Refresh(true).Do()
+				if err != nil {
+					log.Println("update qyk err:", err)
+				}
+			}
+		} else {
+			sid = Mgo.Save("enterprise_qyxy", e)
+			delete(e, "_id")
+			escon := elastic.GetEsConn()
+			defer elastic.DestoryEsConn(escon)
+			_, err := escon.Index().Index(util.ElasticClientIndex).Type(util.ElasticClientType).Id(sid).BodyJson(e).Refresh(true).Do()
+			if err != nil {
+				log.Println("save qyk err:", err)
+			}
+		}
+		c.JSON(200, gin.H{"rep": 200, "saveid": sid})
+	})
+	////列表查询
+	//Admin.POST("/audit/query_qyk/list", func(c *gin.Context) {
+	//	search, _ := c.GetPostForm("search[value]")
+	//	startstr, _ := c.GetPostForm("start")
+	//	limitstr, _ := c.GetPostForm("length")
+	//	start, _ := strconv.Atoi(startstr)
+	//	limit, _ := strconv.Atoi(limitstr)
+	//	if limit < 1 {
+	//		limit = 10
+	//	}
+	//	if search == "" {
+	//		c.JSON(200, gin.H{"data": []map[string]interface{}{}, "recordsFiltered": 0, "recordsTotal": 0})
+	//	} else {
+	//		//log.Println(util.ElasticClientIndex, util.ElasticClientType, search)
+	//		escon := elastic.GetEsConn()
+	//		defer elastic.DestoryEsConn(escon)
+	//		res, err := escon.Search(util.ElasticClientIndex).
+	//			Type(util.ElasticClientType).Source(`{"query": {"match_phrase":{"company_name":"`+search+`"}}}`).
+	//			//Query( elastic.NewMatchPhraseQuery("company_name", search)).
+	//			Size(limit).
+	//			From(start).
+	//			Do()
+	//		if err != nil {
+	//			log.Println(err)
+	//			c.JSON(500, gin.H{"data": []map[string]interface{}{}, "recordsFiltered": 0, "recordsTotal": 0})
+	//			return
+	//		}
+	//		if res.Hits != nil{
+	//			tmps := make([]map[string]interface{}, 0)
+	//			for _, v := range res.Hits.Hits {
+	//				tmp := make(map[string]interface{})
+	//				err := json.Unmarshal(*v.Source, &tmp)
+	//				if err != nil {
+	//					log.Println(err)
+	//					continue
+	//				}
+	//				tmp["_id"] = v.Id
+	//				//log.Println(tmp)
+	//				tmps = append(tmps, tmp)
+	//			}
+	//			//count := Mgo.Count("enterprise_qyxy", bson.M{"company_name": bson.M{"$regex": bson.RegEx{search, "i"}}})
+	//			//data, _ := Mgo.Find("enterprise_qyxy", bson.M{"company_name": bson.M{"$regex": bson.RegEx{search, "i"}}}, `{"_id":-1}`, nil, false, start, limit)
+	//			c.JSON(200, gin.H{"data": tmps, "recordsFiltered": res.Hits.TotalHits, "recordsTotal": res.Hits.TotalHits})
+	//		}else {
+	//			c.JSON(200, gin.H{"data": []map[string]interface{}{}, "recordsFiltered": 0, "recordsTotal": 0})
+	//		}
+	//	}
+	//})
+	////delete
+	//Admin.POST("/audit/buyer_info/deleteQyk", func(c *gin.Context) {
+	//	_id := c.PostForm("_id")
+	//	if bson.IsObjectIdHex(_id) {
+	//		delisok := Mgo.Del("enterprise_qyxy", bson.M{"_id": bson.ObjectIdHex(_id)})
+	//		escon := elastic.GetEsConn()
+	//		defer elastic.DestoryEsConn(escon)
+	//		_, err := escon.Delete().Index(util.ElasticClientIndex).Type(util.ElasticClientType).Id(_id).Refresh(true).Do()
+	//		if err != nil {
+	//			log.Println("delete qyk err:", err)
+	//		}
+	//		c.JSON(200, gin.H{"rep": 200, "data": delisok})
+	//	} else {
+	//		c.JSON(200, gin.H{"rep": 400})
+	//	}
+	//})
+	////queryById
+	//Admin.POST("/audit/query_qyk/ById", func(c *gin.Context) {
+	//	_id := c.PostForm("_id")
+	//	q_field := c.PostForm("q_field")
+	//	if bson.IsObjectIdHex(_id) && strings.TrimSpace(q_field) != "" {
+	//		data, _ := Mgo.FindById(util.ElasticClientDB, _id, bson.M{q_field: 1})
+	//		c.JSON(200, gin.H{"rep": 200, "data": data})
+	//	} else {
+	//		c.JSON(200, gin.H{"rep": 400})
+	//	}
+	//})
+	////updateIndustrys
+	//Admin.POST("/audit/query_qyk/UpdateIndustrys", func(c *gin.Context) {
+	//	_id := c.PostForm("_id")
+	//	industrys := c.PostFormArray("industry")
+	//	//log.Println(_id,industrys)
+	//	if bson.IsObjectIdHex(_id) {
+	//		b := Mgo.Update(util.ElasticClientDB, bson.M{"_id": bson.ObjectIdHex(_id)}, bson.M{"$set": bson.M{"industry": industrys}}, false, false)
+	//		if b {
+	//			escon := elastic.GetEsConn()
+	//			defer elastic.DestoryEsConn(escon)
+	//			_, err := escon.Update().Index(util.ElasticClientIndex).Type(util.ElasticClientType).Id(_id).Doc(map[string]interface{}{
+	//				"industry": industrys,
+	//			}).Refresh(true).Do()
+	//			if err != nil {
+	//				log.Println("update yqk industry err :", err)
+	//			}
+	//		}
+	//		c.JSON(200, gin.H{"rep": 200, "data": b})
+	//	} else {
+	//		c.JSON(200, gin.H{"rep": 400})
+	//	}
+	//})
+	////updateTels
+	//Admin.POST("/audit/query_qyk/UpdateTels", func(c *gin.Context) {
+	//	_id := c.PostForm("_id")
+	//	//log.Println(_id)
+	//	contact_persons := c.PostFormArray("contact_persons")
+	//	contact_types := c.PostFormArray("contact_types")
+	//	phones := c.PostFormArray("phones")
+	//	topscopeclasss := c.PostFormArray("topscopeclasss")
+	//	if bson.IsObjectIdHex(_id) && len(contact_persons) == len(contact_types) && len(phones) == len(topscopeclasss) && len(phones) == len(contact_persons) {
+	//		contacts := make([]map[string]interface{}, 0)
+	//		for _, v := range contact_persons {
+	//			tmp := make(map[string]interface{})
+	//			tmp["contact_person"] = v
+	//			contacts = append(contacts, tmp)
+	//		}
+	//		for i, v := range contact_types {
+	//			contacts[i]["contact_type"] = v
+	//		}
+	//		for i, v := range phones {
+	//			contacts[i]["phone"] = v
+	//		}
+	//		for i, v := range topscopeclasss {
+	//			contacts[i]["topscopeclass"] = v
+	//			contacts[i]["updatetime"] = time.Now().Unix()
+	//		}
+	//		//for k,v := range contacts{
+	//		//	log.Println(k,v)
+	//		//}
+	//		b := Mgo.Update(util.ElasticClientDB, bson.M{"_id": bson.ObjectIdHex(_id)}, bson.M{"$set": bson.M{"contact": contacts}}, false, false)
+	//		if b {
+	//			escon := elastic.GetEsConn()
+	//			defer elastic.DestoryEsConn(escon)
+	//			_, err := escon.Update().Index(util.ElasticClientIndex).Type(util.ElasticClientType).Id(_id).Doc(map[string]interface{}{
+	//				"contact": contacts,
+	//			}).Refresh(true).Do()
+	//			if err != nil {
+	//				log.Println("update yqk contact err :", err)
+	//			}
+	//		}
+	//		c.JSON(200, gin.H{"rep": 200, "data": b})
+	//	} else {
+	//		c.JSON(200, gin.H{"rep": 400})
+	//	}
+	//})
+}

+ 85 - 29
src/jy/admin/audit/qiyeku.go

@@ -28,11 +28,19 @@ func init() {
 		_id := c.PostForm("_id")
 		company_name := c.PostForm("company_name")
 		alias := c.PostForm("alias")
+		history_name := strings.ReplaceAll(c.PostForm("history_name"),";",";")
+		area_code := c.PostForm("area_code")
 		province := c.PostForm("province")
 		city := c.PostForm("city")
 		district := c.PostForm("district")
 		capital := c.PostForm("capital")
 		company_address := c.PostForm("company_address")
+		business_scope := c.PostForm("business_scope")
+		wechat_accounts := strings.ReplaceAll(c.PostForm("wechat_accounts"),";",";")
+		website := c.PostForm("website")
+		contact := c.PostForm("contact")
+		contacts := make([]map[string]interface{},0)
+		jsonerr :=json.Unmarshal([]byte(contact),&contacts)
 		if strings.TrimSpace(company_name) == "" {
 			c.JSON(200, gin.H{"rep": 400})
 			return
@@ -42,53 +50,87 @@ func init() {
 		e := make(map[string]interface{})
 		e["company_name"] = company_name
 		e["alias"] = alias
+		if len(history_name)>0{
+			e["history_name"] = strings.Split(history_name,";")
+		}else {
+			e["history_name"] =[]string{}
+		}
+		e["area_code"] = area_code
 		e["province"] = province
 		e["city"] = city
 		e["district"] = district
 		e["capital"] = capitalfloat
 		e["company_address"] = company_address
+		e["business_scope"] = business_scope
+		if len(wechat_accounts)>0{
+			e["wechat_accounts"] = strings.Split(wechat_accounts,";")
+		}else {
+			e["wechat_accounts"] = []string{}
+		}
+		e["website"] = website
+		if jsonerr != nil {
+			e["contact"] = []map[string]interface{}{}
+		}else {
+			for k,v := range contacts{
+				if v["updatetime"] == nil{
+					contacts[k]["updatetime"]=time.Now().Unix()
+				}
+			}
+			e["contact"] = contacts
+		}
 		var sid string
-		if strings.TrimSpace(_id) != "" && bson.IsObjectIdHex(_id) {
+		if bson.IsObjectIdHex(_id) {
+			//更新
 			sid = _id
-			tmpb := Mgo.Update("enterprise_qyxy", bson.M{"_id": bson.ObjectIdHex(_id)}, bson.M{"$set": bson.M{
-				"company_name":    company_name,
-				"alias":           alias,
-				"province":        province,
-				"city":            city,
-				"district":        district,
-				"capital":         capitalfloat,
-				"company_address": company_address,
-			}}, false, false)
+			delete(e,"_id")
+			delete(e,"company_name")
+			//转换失败不更新
+			if jsonerr!= nil {
+				delete(e,"contact")
+			}
+			tmpb := Mgo.Update(util.ElasticClientDB, bson.M{"_id": bson.ObjectIdHex(_id)}, bson.M{"$set": e}, false, false)
 			//更新es
 			if tmpb {
 				escon := elastic.GetEsConn()
 				defer elastic.DestoryEsConn(escon)
 				_, err := escon.Update().Index(util.ElasticClientIndex).Type(util.ElasticClientType).
-					Id(sid).Doc(map[string]interface{}{
-					"company_name":    company_name,
-					"alias":           alias,
-					"province":        province,
-					"city":            city,
-					"district":        district,
-					"capital":         capitalfloat,
-					"company_address": company_address,
-				}).Refresh(true).Do()
+					Id(sid).Doc(e).Refresh(true).Do()
 				if err != nil {
 					log.Println("update qyk err:", err)
+					c.JSON(200, gin.H{"rep": 500, "err":"更新es错误"})
+					return
 				}
+			}else {
+				c.JSON(200, gin.H{"rep": 500, "err":"更新mongo错误"})
+				return
 			}
+			c.JSON(200, gin.H{"rep": 200, "updateid": sid})
 		} else {
 			//不存在直接保存新数据
-			sid = Mgo.Save("enterprise_qyxy", e)
-			delete(e, "_id")
-			escon := elastic.GetEsConn()
-			defer elastic.DestoryEsConn(escon)
-			_, err := escon.Index().Index(util.ElasticClientIndex).Type(util.ElasticClientType).Id(sid).BodyJson(e).Refresh(true).Do()
-			if err != nil {
-				log.Println("save qyk err:", err)
+			sid = Mgo.Save(util.ElasticClientDB, e)
+			if sid == ""{
+				c.JSON(200, gin.H{"rep": 500,"err":"保存mongo出错"})
+				return
+			}else {
+				delete(e, "_id")
+				qykredis := util.QykRedisPool.Conn()
+				defer qykredis.Close()
+				if saveRedis:=qykredis.Set(company_name,sid,0);saveRedis.Err()!= nil{
+					log.Println("保存redis 错误",saveRedis.Err())
+					c.JSON(200, gin.H{"rep": 500,"err":"保存reids出错"})
+					return
+				}
+				escon := elastic.GetEsConn()
+				defer elastic.DestoryEsConn(escon)
+				_, err := escon.Index().Index(util.ElasticClientIndex).Type(util.ElasticClientType).Id(sid).BodyJson(e).Refresh(true).Do()
+				if err != nil {
+					log.Println("save qyk err:", err)
+					c.JSON(200, gin.H{"rep": 500, "err": "更新es错误"})
+					return
+				}
 			}
+			c.JSON(200, gin.H{"rep": 200, "saveid": sid})
 		}
-		c.JSON(200, gin.H{"rep": 200, "saveid": sid})
 	})
 	//列表查询
 	Admin.POST("/audit/query_qyk/list", func(c *gin.Context) {
@@ -142,17 +184,31 @@ func init() {
 	//delete
 	Admin.POST("/audit/qiyeku_info/deleteQyk", func(c *gin.Context) {
 		_id := c.PostForm("_id")
+		company_name := c.PostForm("company_name")
 		if bson.IsObjectIdHex(_id) {
-			delisok := Mgo.Del("enterprise_qyxy", bson.M{"_id": bson.ObjectIdHex(_id)})
+			delisok := Mgo.Del(util.ElasticClientDB, bson.M{"_id": bson.ObjectIdHex(_id)})
+			if !delisok{
+				c.JSON(200, gin.H{"rep": 500,"err":"删除mongo错误"})
+				return
+			}
+			qykredis := util.QykRedisPool.Conn()
+			defer qykredis.Close()
+			if del := qykredis.Del(company_name);del.Err()!=nil{
+				log.Println("delete qyk err:", del.Err(),company_name)
+				c.JSON(200, gin.H{"rep": 500,"err":"删除redis错误"})
+				return
+			}
 			escon := elastic.GetEsConn()
 			defer elastic.DestoryEsConn(escon)
 			_, err := escon.Delete().Index(util.ElasticClientIndex).Type(util.ElasticClientType).Id(_id).Refresh(true).Do()
 			if err != nil {
 				log.Println("delete qyk err:", err)
+				c.JSON(200, gin.H{"rep": 500,"err":"删除es错误"})
+				return
 			}
 			c.JSON(200, gin.H{"rep": 200, "data": delisok})
 		} else {
-			c.JSON(200, gin.H{"rep": 400})
+			c.JSON(200, gin.H{"rep": 400,"err":"参数错误"})
 		}
 	})
 	//queryById

+ 10 - 10
src/jy/extract/extract.go

@@ -27,13 +27,13 @@ import (
 var (
 	lock, lockrule, lockclear, locktag, blocktag sync.RWMutex
 
-	cut     = ju.NewCut()                          //获取正文并清理
-	ExtLogs map[*TaskInfo][]map[string]interface{} //抽取日志
-	TaskList      map[string]*ExtractTask          //任务列表
-	ClearTaskList map[string]*ClearTask            //清理任务列表
-	saveLimit     = 100                            //抽取日志批量保存
-	PageSize      = 5000                           //查询分页
-	Fields        = `{"title":1,"summary":1,"detail":1,"contenthtml":1,"site":1,"spidercode":1,"toptype":1,"subtype":1,"bidstatus":1,"area":1,"city":1,"comeintime":1,"publishtime":1,"sensitive":1,"projectinfo":1,"jsondata":1,"href":1}`
+	cut           = ju.NewCut()                          //获取正文并清理
+	ExtLogs       map[*TaskInfo][]map[string]interface{} //抽取日志
+	TaskList      map[string]*ExtractTask                //任务列表
+	ClearTaskList map[string]*ClearTask                  //清理任务列表
+	saveLimit     = 100                                  //抽取日志批量保存
+	PageSize      = 5000                                 //查询分页
+	Fields        = `{"title":1,"summary":1,"detail":1,"contenthtml":1,"site":1,"spidercode":1,"toptype":1,"subtype":1,"bidstatus":1,"area":1,"city":1,"comeintime":1,"publishtime":1,"sensitive":1,"projectinfo":1,"jsondata":1,"href":1,"infoformat":1}`
 	Fields2       = `{"budget":1,"bidamount":1,"title":1,"projectname":1,"winner":1}`
 )
 
@@ -1861,9 +1861,9 @@ func AnalysisSaveResult(j, jf *ju.Job, e *ExtractTask) {
 		} else { //测试结果
 			delete(tmp, "_id")
 			if len(j.BlockPackage) > 0 { //分包详情
-				if len(j.BlockPackage) >10{
+				if len(j.BlockPackage) > 10 {
 					tmp["epackage"] = "分包异常"
-				}else {
+				} else {
 					bs, _ := json.Marshal(j.BlockPackage)
 					tmp["epackage"] = string(bs)
 				}
@@ -2058,7 +2058,7 @@ func (e *ExtractTask) QualityAudit(resulttmp map[string]interface{}) {
 func (e *ExtractTask) RedisMatch(field, fv string, val map[string]interface{}) {
 	defer qu.Catch()
 	i := redis.GetInt(field, field+"_"+fv) //查找redis
-	if i == 0 { //reids未找到,执行规则匹配
+	if i == 0 {                            //reids未找到,执行规则匹配
 		val[field+"_isredis"] = false
 		e.RuleMatch(field, fv, val) //规则匹配
 	} else { //redis找到,打标识存库

+ 19 - 1
src/jy/util/elastic_client.go

@@ -1,12 +1,30 @@
 package util
 
+import (
+	"github.com/go-redis/redis"
+	"qfw/util"
+	"time"
+)
+
 //import (
 //	"gopkg.in/olivere/elastic.v5"
 //)
 //
 //var ElasticClient *elastic.Client
 var ElasticClientIndex,ElasticClientType,ElasticClientDB string
-
+var QykRedisPool *redis.Client
+func init() {
+	QykRedisPool = redis.NewClient(&redis.Options{
+		Addr:         util.ObjToString(Config["redis_qyk"]),
+		DB:           1,
+		DialTimeout:  10 * time.Second,
+		ReadTimeout:  30 * time.Second,
+		WriteTimeout: 30 * time.Second,
+		PoolSize:     30,
+		MinIdleConns: 20,
+		PoolTimeout:  30 * time.Second,
+	})
+}
 //func init() {
 //	if eClient, err := elastic.NewClient(elastic.SetURL(util.ObjToString(Config["elasticsearch"])));err != nil{
 //		log.Println(Config["elasticsearch"])

+ 1 - 1
src/web/res/js/dialog.js

@@ -16,7 +16,7 @@ var tpl_list_ajax='<div class="input-group">'+
          '<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" tabindex="-1">'+
          '<span class="caret"></span></button>'+
          '<ul class="dropdown-menu pull-right" id="u_list"></ul></div></div>';
-		
+var tpl_json='<div  style="height:300px;width: 450px;"  id="{s_label}" name="jsonadd"></div>';
 var tag_head='<div class="row form-group"><label for="lastname" class="col-sm-2 control-label" >{label}</label><div class="col-sm-10">{type}</div></div>'
 var notag_head='<div class="row form-group"><div class="col-sm-12">{type}</div></div>'
 //设置对话窗口内容并弹出对话窗口

+ 402 - 10
src/web/templates/admin/agencyinfo.html

@@ -1,10 +1,402 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-
-</body>
-</html>
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<link href="/res/other/css/other.css" rel="stylesheet" type="text/css">
+<link href="/res/jsoneditor/css/jsoneditor.css" rel="stylesheet" type="text/css">
+<script src="/res/jsoneditor/js/jsoneditor.js"></script>
+<style>
+    #dataTable_filter div {
+        padding: 0px 10px;
+    }
+
+    .operate a {
+        padding: 5px 10px;
+    }
+</style>
+<div class="content-wrapper">
+    <section class="content-header" style="padding: 49px 15px 0 15px;">
+        <h1>
+            <small><a class="btn btn-primary opraaa" opraaa="newqyk" onclick='AddAgencyHTML()'>新增代理机构信息</a></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 代理机构增删改查</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>代理机构名称</th>
+                                <th>统一信用代码</th>
+                                <th>单位类型</th>
+                                <th>行政级别</th>
+                                <th>省份</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+
+</div>
+<div class="modal fade" id="info_data">
+    <div class="modal-dialog">
+        <form id="update-dataform" class="form-horizontal" role="form">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title" id="info_title"></h4>
+                </div>
+                <div class="modal-body" id="infos">
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+{{template "dialog"}}
+{{template "footer"}}
+<script>
+    menuActive("agency_info")
+    var ttable = {};
+    var editor_add = null;
+    var editor_udapte = null;
+
+
+    $(function () {
+        ttable = $('#dataTable').DataTable({
+            "paging": true,
+            "lengthChange": false,
+            "searching": true,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "serverSide": true,
+            "ajax": {
+                "url": "/admin/audit/query_qyk/list",
+                "type": "post",
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                {
+                    "data": "company_name", "width": "15%", render: function (val, a, row) {
+                        if (val == null) {
+                            return ""
+                        }
+                        return "<text  title="+val+">"+val+"</text >"
+                    }
+                },
+                {
+                    "data": "credit_no", "width": "10%", render: function (val, a, row) {
+                        if (val == null) {
+                            return ""
+                        }
+                        return "<text  title="+val+">"+val+"</text >"
+                    }
+                },
+                {
+                    "data": "type", "width": "10%", render: function (val, a, row) {
+                        if (val == null) {
+                            return ""
+                        }
+                        return "<text  title="+val+">"+val+"</text >"
+                    }
+                },
+                {
+                    "data": "ranks", "width": "10%", render: function (val, a, row) {
+                        if (val == null) {
+                            return ""
+                        }
+                        return "<text  title="+val+">"+val+"</text >"
+                    }
+                },
+                {
+                    "data": "province", "width": "10%", render: function (val, a, row) {
+                        if (val == null) {
+                            return ""
+                        }
+                        return "<text  title="+val+">"+val+"</text >"
+                    }
+                },
+                {
+                    "data": "_id", "width": "10%", render: function (val, a, row) {
+                        var valueStr = JSON.stringify(row);
+                        return "<div class='operate'>" +
+                            "<a class='btn btn-primary' onclick='editdata(" + valueStr + ")'>编辑</a>&nbsp;" +
+                            // "<a class='btn btn-default' onclick='showHylxs(\"" + val + "\")'>详细行业类型</a>&nbsp;" +
+                            // "<a class='btn btn-sm btn-warning' onclick='showTels(\"" + val + "\")'>详细联系方式</a>&nbsp;" +
+                            "<a class='btn btn-sm btn-danger' onclick='deleteQyk(\"" + val + "\")'>删除</a>&nbsp;" +
+                            "</div>"
+                    }
+                }
+            ]
+        });
+    });
+
+    var vastrjson = [{
+        "infoid": "招标信息id",
+        "contact_person": "联系人",
+        "contact_type": "联系人类型",
+        "phone": "联系人电话",
+        "topscopeclass": "项目类型"
+    }];
+
+
+    /*新增采购单位html*/
+    function AddAgencyHTML() {
+        $("#infos").html("");
+        $("#info_title").html("新增代理机构信息");
+        com ="<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\" style=\"color: red;\">代理机构名称:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_company_name\" must=\"true\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">历史名称:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_history_name\" placeholder=\"多个;隔开\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">行政区划代码:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_area_code\" ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">单位类型:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_type\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">行政级别:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_ranks\" ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">省份:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_province\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">城市:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_city\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">区县:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_district\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">代理机构地址地址:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_address\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">微信公众号:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_wechat_accounts\" placeholder=\"多个;隔开\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">网址:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_website\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">联系方式:</label>" +
+            "<div class=\"col-sm-10\" id='s_contact' style=\"height:250px\"></div>" +
+            "<div class=\"row form-group\">" +
+            "<button type='button' class='btn btn-sm btn-default col-md-offset-5 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
+            "<button type='button' class='btn btn-sm btn-danger col-md-2' onclick='Add()'>新增代理机构</button></div>";
+
+
+        $("#infos").html(com);
+        $("#s_contact").html('');
+        var container = document.getElementById('s_contact');
+        showJson("add", vastrjson, container);
+        $("#info_data").modal("show");
+    }
+    /*保存企业库*/
+    function Add() {
+        var company_name = $("#s_company_name").val();          //代理机构名称
+        var history_name = $("#s_history_name").val();          //历史名称
+        var area_code = $("#s_area_code").val();                //行政区划代码
+        var type = $("#s_type").val();                          //单位类型
+        var ranks = $("#s_ranks").val();                        //行政级别
+        var province = $("#s_province").val();                  //省份
+        var city = $("#s_city").val();                          //城市
+        var district = $("#s_district").val();                  //区县
+        var address = $("#s_address").val();                    //代理机构地址
+        var wechat_accounts = $("#s_wechat_accounts").val();    //微信公众号
+        var website = $("#s_website").val();                    //网址
+        var contact = editor_add.getText();                     //联系人
+        if (company_name === "") {
+            alert("红色标签的表单不能为空!");
+            return
+        } else if (contact === JSON.stringify(vastrjson, null, 2)) {
+            alert("联系人的表单未填写!");
+            return
+        }
+
+
+
+        //打印测试
+        console.log(company_name,contact);
+
+        return
+        //新增代理机构api
+        $.post("/admin/audit/agency_info/save", {
+            "company_name": company_name,
+            "history_name": history_name,
+            "area_code": area_code,
+            "type": type,
+            "ranks": ranks,
+            "province": province,
+            "city": city,
+            "district": district,
+            "address": address,
+            "wechat_accounts": wechat_accounts,
+            "website": website,
+            "contact":contact
+        }, function (data) {
+            if (data && data.rep) {
+                $("#myModal").modal("hide");
+                alert("保存成功");
+                setTimeout(function () {
+                    ttable.search(company_name).draw();
+                    //    history.go(0) //刷新本页
+                }, 1500) //停1.5秒
+
+            } else {
+                alert("内部错误");
+            }
+        }, 'json')
+    }
+
+
+    //删除
+    function deleteQyk(_id) {
+        if (_id === "") {
+            alert("参数id为空");
+            return
+        }
+        if (confirm("您确认要提交此操作?")) {
+            $.post("/admin/audit/agency_info/deleteQyk", {
+                "_id": _id,
+            }, function (data) {
+                if (data && data.rep) {
+                    setTimeout(function () {
+                        alert("删除成功");
+                        ttable.search("").draw();
+                        //    history.go(0) //刷新本页
+                    }, 800) //停1.5秒
+
+                } else {
+                    alert("内部错误");
+                }
+            }, 'json');
+            ttable.draw();
+        }
+    }
+
+    //编辑采购单位
+    function editdata(_obj) {
+        $("#infos").html("");
+        $("#info_title").html("编辑采购单位信息");
+        com ="<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\" style=\"color: red;\">采购单位名称:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_company_name\" must=\"true\" value='" + _obj.company_name + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">历史名称:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_history_name\" value='" + _obj.history_name + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">行政区划代码:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_area_code\"  value='" + _obj.area_code + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">单位类型:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_type\" value='" + _obj.type + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">行政级别:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_ranks\" value='" + _obj.ranks + "' ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">省份:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_province\" value='" + _obj.province + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">城市:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_city\" value='" + _obj.city + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">区县:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_district\" value='" + _obj.district + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">代理机构地址:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_address\" value='" + _obj.address + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">微信公众号:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_wechat_accounts\" value='" + _obj.wechat_accounts + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">网址:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_website\" value='" + _obj.website + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">联系方式:</label>" +
+            "<div class=\"col-sm-10\" id='s_contact' style=\"height:250px\"></div>" +
+            "<div class=\"row form-group\">" +
+
+            "<button type='button' class='btn btn-sm btn-default col-md-offset-2 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
+            "<button type='button' class='btn btn-sm btn-danger col-md-2' onclick='updatedate(\"" + _obj._id + "\")'>更新</button></div>";
+
+        $("#infos").html(com);
+        $("#s_contact").html('');
+        var container = document.getElementById('s_contact');
+        showJson("add", vastrjson, container);
+        $("#info_data").modal("show");
+    }
+
+    function updatedate(_id) {
+        if (_id === "") {
+            alert("id不存在!");
+            return
+        }
+        var company_name = $("#s_company_name").val();          //采购单位名称
+        var history_name = $("#s_history_name").val();          //历史名称
+        var area_code = $("#s_area_code").val();                //行政区划代码
+        var type = $("#s_type").val();                          //单位类型
+        var ranks = $("#s_ranks").val();                        //行政级别
+        var province = $("#s_province").val();                  //省份
+        var city = $("#s_city").val();                          //城市
+        var district = $("#s_district").val();                  //区县
+        var address = $("#s_address").val();                    //代理机构地址
+        var wechat_accounts = $("#s_wechat_accounts").val();    //微信公众号
+        var website = $("#s_website").val();                    //网址
+        var contact = editor_add.getText();                     //联系人
+        if (company_name === "") {
+            alert("红色标签的表单不能为空!");
+            return
+        } else if (contact === JSON.stringify(vastrjson, null, 2)) {
+            alert("联系人的表单未填写!");
+            return
+        }
+
+
+        //打印测试
+        console.log(company_name,contact);
+
+        return
+
+
+
+        //新增企业库api
+        $.post("/admin/audit/agency_info/save", {
+            "_id": _id,
+            "company_name": company_name,
+            "history_name": history_name,
+            "area_code": area_code,
+            "type": type,
+            "ranks": ranks,
+            "province": province,
+            "city": city,
+            "district": district,
+            "address": address,
+            "wechat_accounts": wechat_accounts,
+            "website": website,
+
+        }, function (data) {
+            if (data && data.rep) {
+                alert("更新成功");
+                $("#info_data").modal("hide");
+                setTimeout(function () {
+                    ttable.search(company_name).draw();
+                    //    history.go(0) //刷新本页
+                }, 800) //停1.5秒
+            } else {
+                alert("内部错误");
+            }
+        }, 'json')
+    }
+    function showJson(ptype, content, container) {
+        var options = {
+            mode: 'code',
+            modes: ['code', 'tree'], // allowed modes
+            onError: function (err) {
+                alert(err.toString());
+            }
+        };
+        if (ptype == "add") {
+            editor_add = new JSONEditor(container, options, content);
+        } else if (ptype == "update") {
+            editor_update = new JSONEditor(container, options, content);
+        }
+    }
+
+
+
+</script>
+

+ 208 - 284
src/web/templates/admin/buyerinfo.html

@@ -4,6 +4,8 @@
 <!-- Left side column. 权限菜单 -->
 {{template "memu"}}
 <link href="/res/other/css/other.css" rel="stylesheet" type="text/css">
+<link href="/res/jsoneditor/css/jsoneditor.css" rel="stylesheet" type="text/css">
+<script src="/res/jsoneditor/js/jsoneditor.js"></script>
 <style>
     #dataTable_filter div {
         padding: 0px 10px;
@@ -16,10 +18,10 @@
 <div class="content-wrapper">
     <section class="content-header" style="padding: 49px 15px 0 15px;">
         <h1>
-            <small><a class="btn btn-primary opraaa" opraaa="newqyk">新增buyer信息</a></small>
+            <small><a class="btn btn-primary opraaa" opraaa="newqyk" onclick='AddBuyerHTML()'>新增采购单位信息</a></small>
         </h1>
         <ol class="breadcrumb">
-            <li><a href="#"><i class="fa fa-dashboard"></i> buyer增删改查</a></li>
+            <li><a href="#"><i class="fa fa-dashboard"></i> 采购单位增删改查</a></li>
         </ol>
     </section>
     <!-- Main content -->
@@ -31,13 +33,11 @@
                         <table id="dataTable" class="table table-bordered table-hover">
                             <thead>
                             <tr>
-                                <th>企业名称</th>
-                                <th>别名</th>
+                                <th>采购单位名称</th>
+                                <th>统一信用代码</th>
+                                <th>单位类型</th>
+                                <th>行政级别</th>
                                 <th>省份</th>
-                                <th>城市</th>
-                                <th>区县</th>
-                                <th>注册资本</th>
-                                <th>企业地址</th>
                                 <th>操作</th>
                             </tr>
                             </thead>
@@ -71,8 +71,12 @@
 {{template "dialog"}}
 {{template "footer"}}
 <script>
-    menuActive("qiyeku_info")
-    var ttable = {}
+    menuActive("buyer_info")
+    var ttable = {};
+    var editor_add = null;
+    var editor_udapte = null;
+
+
     $(function () {
         ttable = $('#dataTable').DataTable({
             "paging": true,
@@ -91,306 +95,169 @@
             },
             "columns": [
                 {
-                    "data": "company_name", "width": "18%", render: function (val, a, row) {
-                        if (val == null) {
-                            return ""
-                        }
-                        return val
-                    }
-                },
-                {
-                    "data": "alias", "width": "11%", render: function (val, a, row) {
-                        if (val == null) {
-                            return ""
-                        }
-                        return val
-                    }
-                },
-                {
-                    "data": "province", "width": "4%", render: function (val, a, row) {
+                    "data": "company_name", "width": "15%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title="+val+">"+val+"</text >"
                     }
                 },
                 {
-                    "data": "city", "width": "4%", render: function (val, a, row) {
+                    "data": "credit_no", "width": "10%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title="+val+">"+val+"</text >"
                     }
                 },
                 {
-                    "data": "district", "width": "4%", render: function (val, a, row) {
+                    "data": "type", "width": "10%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title="+val+">"+val+"</text >"
                     }
                 },
                 {
-                    "data": "capital", "width": "6%", render: function (val, a, row) {
+                    "data": "ranks", "width": "10%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title="+val+">"+val+"</text >"
                     }
                 },
                 {
-                    "data": "company_address", "width": "17%", render: function (val, a, row) {
+                    "data": "province", "width": "10%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title="+val+">"+val+"</text >"
                     }
                 },
                 {
-                    "data": "_id", "width": "24%", render: function (val, a, row) {
+                    "data": "_id", "width": "10%", render: function (val, a, row) {
                         var valueStr = JSON.stringify(row);
                         return "<div class='operate'>" +
                             "<a class='btn btn-primary' onclick='editdata(" + valueStr + ")'>编辑</a>&nbsp;" +
-                            "<a class='btn btn-default' onclick='showHylxs(\"" + val + "\")'>详细行业类型</a>&nbsp;" +
-                            "<a class='btn btn-sm btn-warning' onclick='showTels(\"" + val + "\")'>详细联系方式</a>&nbsp;" +
+                            // "<a class='btn btn-default' onclick='showHylxs(\"" + val + "\")'>详细行业类型</a>&nbsp;" +
+                            // "<a class='btn btn-sm btn-warning' onclick='showTels(\"" + val + "\")'>详细联系方式</a>&nbsp;" +
                             "<a class='btn btn-sm btn-danger' onclick='deleteQyk(\"" + val + "\")'>删除</a>&nbsp;" +
                             "</div>"
                     }
                 }
             ]
         });
-        /*新增企业库*/
-        ttable.on('init.dt', function () {
-            $(".opraaa").click(function () {
-                var n = $(this).attr("opraaa");
-                var _tit = "", htmlObj = {}, obj, tag = [];
-                switch (n) {
-                    case "newqyk":
-                        tag = [
-                            {label: "企业名称:", s_label: "s_company_name", must: true},
-                            {label: "别名:", s_label: "s_alias"},
-                            {label: "省份:", s_label: "s_province"},
-                            {label: "城市:", s_label: "s_city"},
-                            {label: "区县:", s_label: "s_district"},
-                            {label: "注册资本:", s_label: "s_capital", placeholder: "示例:45678.98元;456.78万元;1234.25;"},
-                            {label: "企业地址:", s_label: "s_company_address"},
-                        ];
-                        //新增企业库按钮
-                        htmlObj = {
-                            title: "新增企业库信息",
-                            tag: tag,
-                            bts: [
-                                {
-                                    label: "Save", class: "btn-danger",
-                                    fun: function () {
-                                        var company_name = $("#s_company_name").val();
-                                        var alias = $("#s_alias").val();
-                                        var province = $("#s_province").val();
-                                        var city = $("#s_city").val();
-                                        var district = $("#s_district").val();
-                                        var capital = $("#s_capital").val();
-                                        var company_address = $("#s_company_address").val();
-                                        if (company_name === "") {
-                                            alert("红色标签的表单不能为空!");
-                                            return
-                                        }
-                                        //新增企业库api
-                                        $.post("/admin/audit/qiyeku_info/save", {
-                                            "company_name": company_name,
-                                            "alias": alias,
-                                            "province": province,
-                                            "city": city,
-                                            "district": district,
-                                            "capital": capital,
-                                            "company_address": company_address,
-                                        }, function (data) {
-                                            if (data && data.rep) {
-                                                $("#myModal").modal("hide");
-                                                alert("保存成功");
-                                                setTimeout(function () {
-                                                    ttable.search(company_name).draw();
-                                                    //    history.go(0) //刷新本页
-                                                }, 1500) //停1.5秒
-
-                                            } else {
-                                                alert("内部错误");
-                                            }
-                                        }, 'json')
-                                    }
-                                }
-                            ]
-                        };
-                        OpenDialog(htmlObj, obj);
-                        break;
-                }
-            });
-        })
     });
 
-    //详细行业类型
-    function showHylxs(_id) {
+    var vastrjson = [{
+        "infoid": "招标信息id",
+        "contact_person": "联系人",
+        "contact_type": "联系人类型",
+        "phone": "联系人电话",
+        "topscopeclass": "项目类型"
+    }];
+
+
+    /*新增采购单位html*/
+    function AddBuyerHTML() {
         $("#infos").html("");
-        $("#info_title").html("详细行业类型");
-        $.post("/admin/audit/query_qyk/ById", {
-            "_id": _id,
-            "q_field": "industry",
-        }, function (data) {
-            if (data && data.rep) {
-                // console.log(data);
-                var tmp = "<div class='row'>";
-                for (var i in data.data.industry) {
-                    tmp = tmp +
-                        "<div class=\"col-lg-10\">\n" +
-                        "<div class=\"input-group\">\n" +
-                        "   <input type='text' class='form-control' name='industry'  placeholder=\"请填写行业类型\" value='" + data.data.industry[i] + "'>" +
-                        "   <span class=\"input-group-btn\">" +
-                        '       <button class="btn btn-info " type="button" data-toggle="tooltip" title="删除" id="delCenterIpGrp"><span class="glyphicon glyphicon-minus"></span></button>' +
-                        "   </span> " +
-                        "  </div>" +
-                        "</div>";
-                    // console.log(i, data.data.industry[i]);
-                }
-                tmp = tmp +
-                    "<div class=\"col-lg-10\">\n" +
-                    "<button class='btn btn-info col-md-3' type='button'  id='addCenterIpGrpBtn' onclick='addCenterIpGrp(this)' >新增行业类型</button> " +
-                    "<button type='button' class='btn btn-sm btn-default col-md-offset-5 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
-                    "<button type='button' class='btn btn-sm btn-danger col-md-2' onclick='updateIndustrys(\"" + _id + "\")'>保存</button>" +
-                    "</div>" +
-                    "</div>";
-                $("#infos").html(tmp);
+        $("#info_title").html("新增采购单位信息");
+        com ="<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\" style=\"color: red;\">采购单位名称:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_company_name\" must=\"true\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">历史名称:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_history_name\" placeholder=\"多个;隔开\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">行政区划代码:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_area_code\" ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">单位类型:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_type\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">行政级别:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_ranks\" ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">省份:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_province\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">城市:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_city\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">区县:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_district\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">采购单位类型:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_buyerclass\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">采购单位地址:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_address\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">微信公众号:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_wechat_accounts\" placeholder=\"多个;隔开\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">网址:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_website\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">联系方式:</label>" +
+            "<div class=\"col-sm-10\" id='s_contact' style=\"height:250px\"></div>" +
+            "<div class=\"row form-group\">" +
+            "<button type='button' class='btn btn-sm btn-default col-md-offset-5 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
+            "<button type='button' class='btn btn-sm btn-danger col-md-2' onclick='Add()'>新增采购单位</button></div>";
 
 
-            } else {
-                alert("内部错误");
-            }
-        }, 'json');
-        //展示详细行业类型
+        $("#infos").html(com);
+        $("#s_contact").html('');
+        var container = document.getElementById('s_contact');
+        showJson("add", vastrjson, container);
         $("#info_data").modal("show");
     }
-
-    //添加行业详情
-    function addCenterIpGrp(obj) {
-        html = '<div class="input-group centerIp">' +
-            '<input type="text" name="industry" class="form-control" id="ipInput" placeholder="请填写行业类型">' +
-            '<span class="input-group-btn">' +
-            '<button class="btn btn-info" type="button" data-toggle="tooltip" title="删除" id="delCenterIpGrp"><span class="glyphicon glyphicon-minus"></span></button>' +
-            '</span>' +
-            '</div>'
-        obj.insertAdjacentHTML('beforebegin', html);
-    }
-
-    //更新行业详情
-    function updateIndustrys(_id) {
-        if (_id === "") {
-            alert("参数id不存在");
+    /*保存企业库*/
+    function Add() {
+        var company_name = $("#s_company_name").val();          //采购单位名称
+        var history_name = $("#s_history_name").val();          //历史名称
+        var area_code = $("#s_area_code").val();                //行政区划代码
+        var type = $("#s_type").val();                          //单位类型
+        var ranks = $("#s_ranks").val();                        //行政级别
+        var province = $("#s_province").val();                  //省份
+        var city = $("#s_city").val();                          //城市
+        var district = $("#s_district").val();                  //区县
+        var buyerclass = $("#s_buyerclass").val();              //采购单位类型
+        var address = $("#s_address").val();                    //采购单位地址
+        var wechat_accounts = $("#s_wechat_accounts").val();    //微信公众号
+        var website = $("#s_website").val();                    //网址
+        var contact = editor_add.getText();                     //联系人
+        if (company_name === "") {
+            alert("红色标签的表单不能为空!");
+            return
+        } else if (contact === JSON.stringify(vastrjson, null, 2)) {
+            alert("联系人的表单未填写!");
             return
         }
-        var params = $("#update-dataform").serialize();
-        // console.log(_id, params);
-        $.ajax({
-            type: "POST",
-            url: "/admin/audit/query_qyk/UpdateIndustrys",
-            data: params + "&_id=" + _id,
-            success: function (msg) {
-                $("#info_data").modal("hide");
-                if (msg.data) {
-                    alert("success");
-                } else {
-                    alert("更新失败");
-                }
-            }
-        });
-    }
 
-    $(document).on('click', '#delCenterIpGrp', function () {
-        var el = this.parentNode.parentNode;
-        if (confirm('您确定要删除选中的命令?')) {
-            el.parentNode.removeChild(el);
-        }
-    });
 
-    //详细联系方式
-    function showTels(_id) {
-        $("#infos").html("");
-        $("#info_title").html("详细联系方式");
-        $.post("/admin/audit/query_qyk/ById", {
-            "_id": _id,
-            "q_field": "contact",
+
+        //打印测试
+        console.log(company_name,contact);
+
+        return
+        //新增采购单位api
+        $.post("/admin/audit/buyer_info/save", {
+            "company_name": company_name,
+            "history_name": history_name,
+            "area_code": area_code,
+            "type": type,
+            "ranks": ranks,
+            "province": province,
+            "city": city,
+            "district": district,
+            "buyerclass": buyerclass,
+            "address": address,
+            "wechat_accounts": wechat_accounts,
+            "website": website,
+            "contact":contact
         }, function (data) {
             if (data && data.rep) {
-                // console.log(data);
-                // var tmp = "<div class='row'>";
-                var tmp = "";
-                for (var i in data.data.contact) {
-                    tmp += "<div class='row'>" +
-                        "<div class=\"col-lg-10\">" +
-                        '<h1><div class="input-group centerIp">' +
-                        '<input type="text" name="contact_persons" class="form-control" id="ipInput" placeholder="请填写联系人" value=' + data.data.contact[i].contact_person + '>' +
-                        '<select class="form-control" name="contact_types" value=' + data.data.contact[i].contact_type + '><option value ="法定代表人">法定代表人</option><option value ="项目联系人">项目联系人</option></select>' +
-                        '<input type="text" name="phones" class="form-control" id="ipInput" placeholder="请填写联系电话" value=' + data.data.contact[i].phone + '>' +
-                        '<select class="form-control" name="topscopeclasss" value=' + data.data.contact[i].topscopeclass + '><option value ="企业公示">企业公示</option><option value ="剑鱼标讯">剑鱼标讯</option></select>' +
-                        '<span class="input-group-btn">' +
-                        '<button class="btn btn-info" type="button" data-toggle="tooltip" title="删除" id="delCenterIpGrp"><span class="glyphicon glyphicon-minus"></span></button>' +
-                        '</span>' +
-                        '</div><h1>' +
-                        '</div></div>';
-                    // console.log(i, data.data.contact[i]);
-                }
-                tmp = tmp +
-                    "<div class='row'>" +
-                    "<div class=\"col-lg-10\">" +
-                    "<button class='btn btn-info col-md-3' type='button'  id='addCenterIpGrpBtn' onclick='addCenterIpGrpTels(this)' >新增联系方式</button> " +
-                    "<button type='button' class='btn btn-sm btn-default col-md-offset-5 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
-                    "<button type='button' class='btn btn-sm btn-danger col-md-2' onclick='updateTels(\"" + _id + "\")'>保存</button>" +
-                    "</div>" +
-                    "</div>";
-                $("#infos").html(tmp);
+                $("#myModal").modal("hide");
+                alert("保存成功");
+                setTimeout(function () {
+                    ttable.search(company_name).draw();
+                    //    history.go(0) //刷新本页
+                }, 1500) //停1.5秒
+
             } else {
                 alert("内部错误");
             }
-        }, 'json');
-        $("#info_data").modal("show");
+        }, 'json')
     }
 
-    //添加联系方式
-    function addCenterIpGrpTels(obj) {
-        html = '<h1><div class="input-group centerIp">' +
-            '<input type="text" name="contact_persons" class="form-control" id="ipInput" placeholder="请填写联系人">' +
-            '<select class="form-control" name="contact_types"><option value ="法定代表人">法定代表人</option><option value ="项目联系人">项目联系人</option></select>' +
-            '<input type="text" name="phones" class="form-control" id="ipInput" placeholder="请填写联系电话">' +
-            '<select class="form-control" name="topscopeclasss"><option value ="企业公示">企业公示</option><option value ="剑鱼标讯">剑鱼标讯</option></select>' +
-            '<span class="input-group-btn">' +
-            '<button class="btn btn-info" type="button" data-toggle="tooltip" title="删除" id="delCenterIpGrp"><span class="glyphicon glyphicon-minus"></span></button>' +
-            '</span>' +
-            '</div><h1>'
-        obj.insertAdjacentHTML('beforebegin', html);
-    }
-
-    //更新联系方式
-    function updateTels(_id) {
-        if (_id === "") {
-            alert("参数id不存在");
-            return
-        }
-        var params = $("#update-dataform").serialize();
-        console.log(params)
-        $.ajax({
-            type: "POST",
-            url: "/admin/audit/query_qyk/UpdateTels",
-            data: params + "&_id=" + _id,
-            // contentType: "application/json; charset=utf-8",
-            dataType: "json",
-            traditional: true,
-            success: function (msg) {
-                $("#info_data").modal("hide");
-                if (msg.data) {
-                    alert("success");
-                } else {
-                    alert("更新失败");
-                }
-            }
-        });
-    }
 
     //删除
     function deleteQyk(_id) {
@@ -399,7 +266,7 @@
             return
         }
         if (confirm("您确认要提交此操作?")) {
-            $.post("/admin/audit/qiyeku_info/deleteQyk", {
+            $.post("/admin/audit/buyer_info/deleteQyk", {
                 "_id": _id,
             }, function (data) {
                 if (data && data.rep) {
@@ -417,30 +284,45 @@
         }
     }
 
+    //编辑采购单位
     function editdata(_obj) {
         $("#infos").html("");
-        $("#info_title").html("编辑企业库信息");
-        com = "<div class=\"row form-group\">" +
-            "<label for=\"lastname\" class=\"col-sm-2 control-label\" style=\"color: red;\">企业名称:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_company_name\" must=\"true\" value='" + _obj.company_name + "'></div>" +
-            "</div><div class=\"row form-group\">" +
-            "<label for=\"lastname\" class=\"col-sm-2 control-label\">别名:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_alias\" value='" + _obj.alias + "'></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">省份:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_province\" value='" + _obj.province + "'></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">城市:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_city\" value='" + _obj.city + "'></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">区县:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_district\" value='" + _obj.district + "'></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">注册资本:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_capital\" value='" + _obj.capital + "'  placeholder=\"示例:45678.98元;456.78万元;1234.25;\"></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">企业地址:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_company_address\" value='" + _obj.company_address + "'></div>" +
-            "</div></div>" +
+        $("#info_title").html("编辑采购单位信息");
+        com ="<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\" style=\"color: red;\">采购单位名称:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_company_name\" must=\"true\" value='" + _obj.company_name + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">历史名称:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_history_name\" value='" + _obj.history_name + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">行政区划代码:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_area_code\"  value='" + _obj.area_code + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">单位类型:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_type\" value='" + _obj.type + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">行政级别:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_ranks\" value='" + _obj.ranks + "' ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">省份:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_province\" value='" + _obj.province + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">城市:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_city\" value='" + _obj.city + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">区县:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_district\" value='" + _obj.district + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">采购单位类型:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_buyerclass\" value='" + _obj.buyerclass + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">采购单位地址:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_address\" value='" + _obj.address + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">微信公众号:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_wechat_accounts\" value='" + _obj.wechat_accounts + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">网址:</label>" +
+            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_website\" value='" + _obj.website + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">联系方式:</label>" +
+            "<div class=\"col-sm-10\" id='s_contact' style=\"height:250px\"></div>" +
             "<div class=\"row form-group\">" +
-            "<button type='button' class='btn btn-sm btn-default col-md-offset-5 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
+
+            "<button type='button' class='btn btn-sm btn-default col-md-offset-2 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
             "<button type='button' class='btn btn-sm btn-danger col-md-2' onclick='updatedate(\"" + _obj._id + "\")'>更新</button></div>";
+
         $("#infos").html(com);
+        $("#s_contact").html('');
+        var container = document.getElementById('s_contact');
+        showJson("add", vastrjson, container);
         $("#info_data").modal("show");
     }
 
@@ -449,27 +331,51 @@
             alert("id不存在!");
             return
         }
-        var company_name = $("#s_company_name").val();
-        var alias = $("#s_alias").val();
-        var province = $("#s_province").val();
-        var city = $("#s_city").val();
-        var district = $("#s_district").val();
-        var capital = $("#s_capital").val();
-        var company_address = $("#s_company_address").val();
+        var company_name = $("#s_company_name").val();          //采购单位名称
+        var history_name = $("#s_history_name").val();          //历史名称
+        var area_code = $("#s_area_code").val();                //行政区划代码
+        var type = $("#s_type").val();                          //单位类型
+        var ranks = $("#s_ranks").val();                        //行政级别
+        var province = $("#s_province").val();                  //省份
+        var city = $("#s_city").val();                          //城市
+        var district = $("#s_district").val();                  //区县
+        var buyerclass = $("#s_buyerclass").val();              //采购单位类型
+        var address = $("#s_address").val();                    //采购单位地址
+        var wechat_accounts = $("#s_wechat_accounts").val();    //微信公众号
+        var website = $("#s_website").val();                    //网址
+        var contact = editor_add.getText();                     //联系人
         if (company_name === "") {
             alert("红色标签的表单不能为空!");
             return
+        } else if (contact === JSON.stringify(vastrjson, null, 2)) {
+            alert("联系人的表单未填写!");
+            return
         }
+
+
+        //打印测试
+        console.log(company_name,contact);
+
+        return
+
+
+
         //新增企业库api
-        $.post("/admin/audit/qiyeku_info/save", {
+        $.post("/admin/audit/buyer_info/save", {
             "_id": _id,
             "company_name": company_name,
-            "alias": alias,
+            "history_name": history_name,
+            "area_code": area_code,
+            "type": type,
+            "ranks": ranks,
             "province": province,
             "city": city,
             "district": district,
-            "capital": capital,
-            "company_address": company_address,
+            "buyerclass": buyerclass,
+            "address": address,
+            "wechat_accounts": wechat_accounts,
+            "website": website,
+
         }, function (data) {
             if (data && data.rep) {
                 alert("更新成功");
@@ -483,4 +389,22 @@
             }
         }, 'json')
     }
+    function showJson(ptype, content, container) {
+        var options = {
+            mode: 'code',
+            modes: ['code', 'tree'], // allowed modes
+            onError: function (err) {
+                alert(err.toString());
+            }
+        };
+        if (ptype == "add") {
+            editor_add = new JSONEditor(container, options, content);
+        } else if (ptype == "update") {
+            editor_update = new JSONEditor(container, options, content);
+        }
+    }
+
+
+
 </script>
+

+ 235 - 58
src/web/templates/admin/qiyekuinfo.html

@@ -4,6 +4,8 @@
 <!-- Left side column. 权限菜单 -->
 {{template "memu"}}
 <link href="/res/other/css/other.css" rel="stylesheet" type="text/css">
+<link href="/res/jsoneditor/css/jsoneditor.css" rel="stylesheet" type="text/css">
+<script src="/res/jsoneditor/js/jsoneditor.js"></script>
 <style>
     #dataTable_filter div {
         padding: 0px 10px;
@@ -16,7 +18,7 @@
 <div class="content-wrapper">
     <section class="content-header" style="padding: 49px 15px 0 15px;">
         <h1>
-            <small><a class="btn btn-primary opraaa" opraaa="newqyk">新增企业库信息</a></small>
+            <small><a class="btn btn-primary opraaa" opraaa="newqyk" onclick='AddQYKHTML()'>新增企业库信息</a></small>
         </h1>
         <ol class="breadcrumb">
             <li><a href="#"><i class="fa fa-dashboard"></i> 企业库增删改查</a></li>
@@ -32,12 +34,12 @@
                             <thead>
                             <tr>
                                 <th>企业名称</th>
-                                <th>别名</th>
+                                {{/*<th>别名</th>*/}}
                                 <th>省份</th>
-                                <th>城市</th>
-                                <th>区县</th>
+                                <th>统一信用代码</th>
+                                <th>企业类型</th>
                                 <th>注册资本</th>
-                                <th>企业地址</th>
+                                {{/*<th>企业地址</th>*/}}
                                 <th>操作</th>
                             </tr>
                             </thead>
@@ -72,7 +74,9 @@
 {{template "footer"}}
 <script>
     menuActive("qiyeku_info")
-    var ttable = {}
+    var ttable = {};
+    var editor_add = null;
+    var editor_update = null;
     $(function () {
         ttable = $('#dataTable').DataTable({
             "paging": true,
@@ -95,72 +99,72 @@
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title=" + val + ">" + val + "</text >"
                     }
                 },
-                {
-                    "data": "alias", "width": "11%", render: function (val, a, row) {
+                /*{
+                    "data": "alias", "width": "5%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
                         return val
                     }
-                },
+                },*/
                 {
                     "data": "province", "width": "4%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
-                    }
-                },
-                {
-                    "data": "city", "width": "4%", render: function (val, a, row) {
-                        if (val == null) {
-                            return ""
-                        }
-                        return val
+                        return "<text  title=" + val + ">" + val + "</text >"
                     }
                 },
                 {
-                    "data": "district", "width": "4%", render: function (val, a, row) {
+                    "data": "credit_no", "width": "10%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title=" + val + ">" + val + "</text >"
                     }
                 },
                 {
-                    "data": "capital", "width": "6%", render: function (val, a, row) {
+                    "data": "company_type", "width": "8%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title=" + val + ">" + val + "</text >"
                     }
                 },
                 {
-                    "data": "company_address", "width": "17%", render: function (val, a, row) {
+                    "data": "capital", "width": "4%", render: function (val, a, row) {
                         if (val == null) {
                             return ""
                         }
-                        return val
+                        return "<text  title=" + val + ">" + val + "</text >"
                     }
                 },
+                /*   {
+                       "data": "company_address", "width": "17%", render: function (val, a, row) {
+                           if (val == null) {
+                               return ""
+                           }
+                           return val
+                       }
+                   },*/
                 {
-                    "data": "_id", "width": "24%", render: function (val, a, row) {
+                    "data": "_id", "width": "8%", render: function (val, a, row) {
                         var valueStr = JSON.stringify(row);
                         return "<div class='operate'>" +
                             "<a class='btn btn-primary' onclick='editdata(" + valueStr + ")'>编辑</a>&nbsp;" +
-                            "<a class='btn btn-default' onclick='showHylxs(\"" + val + "\")'>详细行业类型</a>&nbsp;" +
-                            "<a class='btn btn-sm btn-warning' onclick='showTels(\"" + val + "\")'>详细联系方式</a>&nbsp;" +
-                            "<a class='btn btn-sm btn-danger' onclick='deleteQyk(\"" + val + "\")'>删除</a>&nbsp;" +
+                            /*"<a class='btn btn-default' onclick='showHylxs(\"" + val + "\")'>详细行业类型</a>&nbsp;" +
+                            "<a class='btn btn-sm btn-warning' onclick='showTels(\"" + val + "\")'>详细联系方式</a>&nbsp;" +*/
+                            "<a class='btn btn-sm btn-danger' onclick='deleteQyk(\"" + row._id + "\",\"" + row.company_name + "\" )'>删除</a>&nbsp;" +
                             "</div>"
                     }
                 }
             ]
         });
         /*新增企业库*/
-        ttable.on('init.dt', function () {
+        /*ttable.on('init.dt', function () {
             $(".opraaa").click(function () {
                 var n = $(this).attr("opraaa");
                 var _tit = "", htmlObj = {}, obj, tag = [];
@@ -169,11 +173,16 @@
                         tag = [
                             {label: "企业名称:", s_label: "s_company_name", must: true},
                             {label: "别名:", s_label: "s_alias"},
+                            {label: "行政区划代码:", s_label: "s_area_code"},
                             {label: "省份:", s_label: "s_province"},
                             {label: "城市:", s_label: "s_city"},
                             {label: "区县:", s_label: "s_district"},
                             {label: "注册资本:", s_label: "s_capital", placeholder: "示例:45678.98元;456.78万元;1234.25;"},
                             {label: "企业地址:", s_label: "s_company_address"},
+                            {label: "经营范围:", s_label: "s_business_scope"},
+                            {label: "微信公众号:", s_label: "s_wechat_accounts"},
+                            {label: "网址:", s_label: "s_website"},
+                            {label: "联系方式:", s_label: "s_contact",type:"tpl_json"},
                         ];
                         //新增企业库按钮
                         htmlObj = {
@@ -224,9 +233,124 @@
                         break;
                 }
             });
-        })
+        })*/
     });
 
+    var vastrjson = [{
+        "infoid": "招标信息id",
+        "contact_person": "联系人",
+        "contact_type": "联系人类型",
+        "phone": "联系人电话",
+        "topscopeclass": "项目类型"
+    }];
+
+    /*新增企业库html*/
+    function AddQYKHTML() {
+        $("#infos").html("");
+        $("#info_title").html("新增企业库信息");
+        com = "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\" style=\"color: red;\">企业名称:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_company_name\" must=\"true\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">别名:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_alias\" ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">历史名称:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_history_name\" placeholder=\"多个;隔开\" ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">行政区划代码:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_area_code\" ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">省份:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_province\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">城市:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_city\" ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">区县:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_district\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">注册资本:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_capital\"  placeholder=\"示例:45678.98元;456.78万元;1234.25;\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">企业地址:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_company_address\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">经营范围:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_business_scope\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">微信公众号:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_wechat_accounts\" placeholder=\"多个;隔开\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">网址:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_website\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">联系方式:</label>" +
+            "<div class=\"col-sm-9\" id='s_contact' style=\"height:250px\"></div>" +
+            "<div class=\"row form-group\">" +
+            "<button type='button' class='btn btn-sm btn-default col-md-offset-5 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
+            "<button type='button' class='btn btn-sm btn-danger col-md-2' onclick='Add()'>新增企业库</button></div>";
+        $("#infos").html(com);
+        $("#s_contact").html('');
+        var container = document.getElementById('s_contact');
+        showJson("add", vastrjson, container);
+        $("#info_data").modal("show");
+    }
+
+    /*保存企业库*/
+    function Add() {
+        var company_name = $("#s_company_name").val();//企业名称
+        var alias = $("#s_alias").val();//别名
+        var history_name = $("#s_history_name").val();//历史名称
+        var area_code = $("#s_area_code").val();//行政区划代码
+        var province = $("#s_province").val();//省份
+        var city = $("#s_city").val();//城市
+        var district = $("#s_district").val();//区县
+        var capital = $("#s_capital").val();//注册资本
+        var company_address = $("#s_company_address").val();//企业地址
+        var business_scope = $("#s_business_scope").val();//经营范围
+        var wechat_accounts = $("#s_wechat_accounts").val();//微信公众号
+        var website = $("#s_website").val();//网址
+        var contact = editor_add.getText();//联系人
+        if (typeof contact == 'string') {
+            try {
+                var obj=JSON.parse(contact);
+                if(typeof obj == 'object' && obj ){
+                    // alert("格式正确");
+                }else{
+                    alert("联系人的表单json格式不正确");
+                    return
+                }
+            } catch(e) {
+                alert("联系人的表单json格式不正确");
+                return
+            }
+        }
+        if (company_name === "") {
+            alert("红色标签的表单不能为空!");
+            return
+        } else if (contact === JSON.stringify(vastrjson, null, 2)) {
+            alert("联系人的表单未填写!");
+            return
+        }
+        //新增企业库api
+        $.post("/admin/audit/qiyeku_info/save", {
+            "company_name": company_name,
+            "alias": alias,
+            "history_name": history_name,
+            "area_code": area_code,
+            "province": province,
+            "city": city,
+            "district": district,
+            "capital": capital,
+            "company_address": company_address,
+            "business_scope": business_scope,
+            "wechat_accounts": wechat_accounts,
+            "website": website,
+            "contact": contact
+        }, function (data) {
+            if (data && data.rep) {
+                alert("保存成功");
+                $("#info_data").modal("hide");
+                setTimeout(function () {
+                    ttable.search(company_name).draw();
+                    //    history.go(0) //刷新本页
+                }, 1500) //停1.5秒
+
+            } else {
+                alert("内部错误");
+            }
+        }, 'json')
+    }
+
+
     //详细行业类型
     function showHylxs(_id) {
         $("#infos").html("");
@@ -373,7 +497,6 @@
             return
         }
         var params = $("#update-dataform").serialize();
-        console.log(params)
         $.ajax({
             type: "POST",
             url: "/admin/audit/query_qyk/UpdateTels",
@@ -393,7 +516,7 @@
     }
 
     //删除
-    function deleteQyk(_id) {
+    function deleteQyk(_id, company_name) {
         if (_id === "") {
             alert("参数id为空");
             return
@@ -401,6 +524,7 @@
         if (confirm("您确认要提交此操作?")) {
             $.post("/admin/audit/qiyeku_info/deleteQyk", {
                 "_id": _id,
+                "company_name": company_name,
             }, function (data) {
                 if (data && data.rep) {
                     setTimeout(function () {
@@ -420,27 +544,38 @@
     function editdata(_obj) {
         $("#infos").html("");
         $("#info_title").html("编辑企业库信息");
-        com = "<div class=\"row form-group\">" +
-            "<label for=\"lastname\" class=\"col-sm-2 control-label\" style=\"color: red;\">企业名称:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_company_name\" must=\"true\" value='" + _obj.company_name + "'></div>" +
-            "</div><div class=\"row form-group\">" +
-            "<label for=\"lastname\" class=\"col-sm-2 control-label\">别名:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_alias\" value='" + _obj.alias + "'></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">省份:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_province\" value='" + _obj.province + "'></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">城市:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_city\" value='" + _obj.city + "'></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">区县:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_district\" value='" + _obj.district + "'></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">注册资本:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_capital\" value='" + _obj.capital + "'  placeholder=\"示例:45678.98元;456.78万元;1234.25;\"></div>" +
-            "</div><div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-2 control-label\">企业地址:</label>" +
-            "<div class=\"col-sm-10\"><input type=\"text\" class=\"form-control\" id=\"s_company_address\" value='" + _obj.company_address + "'></div>" +
-            "</div></div>" +
+        com = "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\" style=\"color: red;\">企业名称:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_company_name\"  readonly=\"true\" must=\"true\" value='" + _obj.company_name + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">别名:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_alias\" value='" + _obj.alias + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">历史名称:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_history_name\" placeholder=\"多个;隔开\" value='" + _obj.history_name.join(";") + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">行政区划代码:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_area_code\" value='"+_obj.area_code+"' ></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">省份:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_province\" value='" + _obj.province + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">城市:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_city\" value='" + _obj.city + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">区县:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_district\" value='" + _obj.district + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">注册资本:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_capital\" value='" + _obj.capital + "'  placeholder=\"示例:45678.98元;456.78万元;1234.25;\"></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">企业地址:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_company_address\" value='" + _obj.company_address + "'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">经营范围:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_business_scope\" value='"+_obj.business_scope+"'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">微信公众号:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_wechat_accounts\" placeholder=\"多个;隔开\" value='"+_obj.wechat_accounts.join(";")+"'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">网址:</label>" +
+            "<div class=\"col-sm-9\"><input type=\"text\" class=\"form-control\" id=\"s_website\" value='"+_obj.website+"'></div></div>" +
+            "<div class=\"row form-group\"><label for=\"lastname\" class=\"col-sm-3 control-label\">联系方式:</label>" +
+            "<div class=\"col-sm-9\" id='s_contact' style=\"height:250px\"></div>" +
             "<div class=\"row form-group\">" +
             "<button type='button' class='btn btn-sm btn-default col-md-offset-5 col-md-2'  data-dismiss='modal' aria-label='Close'>取消</button>" +
             "<button type='button' class='btn btn-sm btn-danger col-md-2' onclick='updatedate(\"" + _obj._id + "\")'>更新</button></div>";
         $("#infos").html(com);
+        var container = document.getElementById('s_contact');
+        showJson("update", _obj.contact, container);
         $("#info_data").modal("show");
     }
 
@@ -449,13 +584,33 @@
             alert("id不存在!");
             return
         }
-        var company_name = $("#s_company_name").val();
-        var alias = $("#s_alias").val();
-        var province = $("#s_province").val();
-        var city = $("#s_city").val();
-        var district = $("#s_district").val();
-        var capital = $("#s_capital").val();
-        var company_address = $("#s_company_address").val();
+        var company_name = $("#s_company_name").val();//企业名称
+        var alias = $("#s_alias").val();//别名
+        var history_name = $("#s_history_name").val();//历史名称
+        var area_code = $("#s_area_code").val();//行政区划代码
+        var province = $("#s_province").val();//省份
+        var city = $("#s_city").val();//城市
+        var district = $("#s_district").val();//区县
+        var capital = $("#s_capital").val();//注册资本
+        var company_address = $("#s_company_address").val();//企业地址
+        var business_scope = $("#s_business_scope").val();//经营范围
+        var wechat_accounts = $("#s_wechat_accounts").val();//微信公众号
+        var website = $("#s_website").val();//网址
+        var contact = editor_update.getText();//联系人
+        if (typeof contact == 'string') {
+            try {
+                var obj=JSON.parse(contact);
+                if(typeof obj == 'object' && obj ){
+                    // alert("格式正确");
+                }else{
+                    alert("联系人的表单json格式不正确");
+                    return
+                }
+            } catch(e) {
+                alert("联系人的表单json格式不正确");
+                return
+            }
+        }
         if (company_name === "") {
             alert("红色标签的表单不能为空!");
             return
@@ -465,15 +620,21 @@
             "_id": _id,
             "company_name": company_name,
             "alias": alias,
+            "history_name": history_name,
+            "area_code": area_code,
             "province": province,
             "city": city,
             "district": district,
             "capital": capital,
             "company_address": company_address,
+            "business_scope": business_scope,
+            "wechat_accounts": wechat_accounts,
+            "website": website,
+            "contact": contact
         }, function (data) {
             if (data && data.rep) {
-                alert("更新成功");
                 $("#info_data").modal("hide");
+                alert("更新成功");
                 setTimeout(function () {
                     ttable.search(company_name).draw();
                     //    history.go(0) //刷新本页
@@ -483,4 +644,20 @@
             }
         }, 'json')
     }
+
+    function showJson(ptype, content, container) {
+        var options = {
+            mode: 'code',
+            modes: ['code', 'tree'], // allowed modes
+            onError: function (err) {
+                alert(err.toString());
+            }
+        };
+        if (ptype == "add") {
+            editor_add = new JSONEditor(container, options, content);
+        } else if (ptype == "update") {
+            editor_update = new JSONEditor(container, options, content);
+        }
+    }
 </script>
+

+ 1 - 1
udp_winner/config.json

@@ -19,7 +19,7 @@
   "mgodb_extract_kf": "extract_kf",
   "mgo_qyk_c": "enterprise_qyxy",
   "mgo_qyk_buyer": "buyer_qyxy",
-  "mgo_qyk_agency": "gency_qyxy",
+  "mgo_qyk_agency": "agency_qyxy",
   "redis": "127.0.0.1:6379",
   "redis_winner_db": "1",
   "redis_buyer_db": "2",

+ 12 - 12
udp_winner/main.go

@@ -5,16 +5,16 @@ import (
 	"fmt"
 	"github.com/garyburd/redigo/redis"
 	hisRedis "github.com/go-redis/redis"
-	"go.mongodb.org/mongo-driver/bson"
+	"gopkg.in/mgo.v2/bson"
 	es "gopkg.in/olivere/elastic.v1"
 	"log"
 	mu "mfw/util"
 	"net"
 	"qfw/common/src/qfw/util/elastic"
 	"qfw/util"
+	"qfw/util/mongodb"
 	"regexp"
 	"strconv"
-
 	"strings"
 	"time"
 )
@@ -22,7 +22,7 @@ import (
 var (
 	Config                                = make(map[string]string)
 	Fields, BuyerFields, AgencyFields     []string
-	SourceClient, FClient                 *MongodbSim
+	SourceClient, FClient                 *mongodb.MongodbSim
 	RedisPool                             redis.Pool
 	HisRedisPool                          *hisRedis.Client
 	Addrs                                 = make(map[string]interface{}, 0) //省市县
@@ -46,15 +46,15 @@ func init() {
 	log.Println(Config)
 	var err error
 	cpnum, err := strconv.Atoi(Config["chan_pool_num"])
-	if err != nil{
+	if err != nil {
 		log.Fatalln(err)
 	}
-	CPool = make(chan bool,cpnum)
+	CPool = make(chan bool, cpnum)
 	Fields = []string{"_id", "contact", "partners", "business_scope", "company_address",
 		"capital", "establish_date", "legal_person", "company_type",
 		"district", "city", "province", "area_code", "credit_no",
-		"company_name", "history_name", "topscopeclass", "wechat_accounts",
-		"alias", "website", "report_websites"}
+		"company_name", "history_name", "wechat_accounts",
+		"alias", "website", "report_websites","industry"}
 
 	BuyerFields = []string{"_id", "contact", "type", "ranks", "buyerclass",
 		"address", "district", "city", "province", "area_code", "credit_no", "buyer_name",
@@ -66,20 +66,20 @@ func init() {
 	pool_size, _ := strconv.Atoi(Config["pool_size"])
 
 	//mongo init
-	SourceClient = new(MongodbSim)
+	SourceClient = new(mongodb.MongodbSim)
 	SourceClient.MongodbAddr = Config["mgoinit"]
 	SourceClient.Size = pool_size
+	SourceClient.DbName = Config["mgodb_bidding"]
 	//mongodbSim.DbName = "qfw"
 	SourceClient.InitPool()
-	SourceClientmgoConn := SourceClient.GetMgoConn()
-	defer SourceClient.DestoryMongoConn(SourceClientmgoConn)
-	FClient = new(MongodbSim)
+
+	FClient = new(mongodb.MongodbSim)
 	FClient.MongodbAddr = Config["mgourl"]
 	FClient.Size = pool_size
 	FClient.DbName = Config["mgodb_extract_kf"]
 	//mongodbSim.DbName = "qfw"
 	FClient.InitPool()
-	FClientmgoConn := FClient.GetMgoConn()
+	FClientmgoConn := FClient.GetMgoConn(86400)
 	defer FClient.DestoryMongoConn(FClientmgoConn)
 	//加载省市县代码
 	cursor2 := FClientmgoConn.DB(Config["mgodb_extract_kf"]).C("address").Find(bson.M{}).Select(bson.M{"province": 1, "code": 1, "city": 1, "district": 1}).Iter()

+ 0 - 321
udp_winner/mgo.go

@@ -1,321 +0,0 @@
-package main
-
-import (
-	"context"
-	"log"
-	"time"
-
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/bson/primitive"
-	"go.mongodb.org/mongo-driver/mongo"
-	"go.mongodb.org/mongo-driver/mongo/options"
-)
-
-var Mgo *MongodbSim
-
-type MgoSess struct {
-	Db     string
-	Coll   string
-	Query  interface{}
-	Sorts  []string
-	fields interface{}
-	limit  int64
-	skip   int64
-	M      *MongodbSim
-}
-
-type MgoIter struct {
-	Cursor *mongo.Cursor
-}
-
-func (mt *MgoIter) Next(result interface{}) bool {
-	if mt.Cursor != nil {
-		if mt.Cursor.Next(nil) {
-			err := mt.Cursor.Decode(result)
-			if err != nil {
-				log.Println("mgo cur err", err.Error())
-				mt.Cursor.Close(nil)
-				return false
-			}
-			return true
-		} else {
-			mt.Cursor.Close(nil)
-			return false
-		}
-	} else {
-		return false
-	}
-
-}
-
-func (ms *MgoSess) DB(name string) *MgoSess {
-	ms.Db = name
-	return ms
-}
-
-func (ms *MgoSess) C(name string) *MgoSess {
-	ms.Coll = name
-	return ms
-}
-
-func (ms *MgoSess) Find(q interface{}) *MgoSess {
-	ms.Query = q
-	return ms
-}
-
-func (ms *MgoSess) Select(fields interface{}) *MgoSess {
-	ms.fields = fields
-	return ms
-}
-
-func (ms *MgoSess) Limit(limit int64) *MgoSess {
-	ms.limit = limit
-	return ms
-}
-func (ms *MgoSess) Skip(skip int64) *MgoSess {
-	ms.skip = skip
-	return ms
-}
-
-func (ms *MgoSess) Sort(sorts ...string) *MgoSess {
-	ms.Sorts = sorts
-	return ms
-}
-
-func (ms *MgoSess) Iter() *MgoIter {
-	it := &MgoIter{}
-	find := options.Find()
-	if ms.skip > 0 {
-		find.SetSkip(ms.skip)
-	}
-	if ms.limit > 0 {
-		find.SetLimit(ms.limit)
-	}
-	find.SetBatchSize(100)
-	if len(ms.Sorts) > 0 {
-		sort := bson.M{}
-		for _, k := range ms.Sorts {
-			switch k[:1] {
-			case "-":
-				sort[k[1:]] = -1
-			case "+":
-				sort[k[1:]] = 1
-			default:
-				sort[k] = 1
-			}
-		}
-		find.SetSort(sort)
-	}
-	if ms.fields != nil {
-		find.SetProjection(ms.fields)
-	}
-	cur, err := ms.M.C.Database(ms.Db).Collection(ms.Coll).Find(ms.M.Ctx, ms.Query, find)
-	if err != nil {
-		log.Println("mgo find err", err.Error())
-	} else {
-		it.Cursor = cur
-	}
-	return it
-}
-
-type MongodbSim struct {
-	MongodbAddr string
-	Size        int
-	//	MinSize     int
-	DbName   string
-	C        *mongo.Client
-	Ctx      context.Context
-	ShortCtx context.Context
-	pool     chan bool
-}
-
-func (m *MongodbSim) GetMgoConn() *MgoSess {
-	//m.Open()
-	ms := &MgoSess{}
-	ms.M = m
-	return ms
-}
-
-func (m *MongodbSim) DestoryMongoConn(ms *MgoSess) {
-	//m.Close()
-	ms.M = nil
-	ms = nil
-}
-
-func (m *MongodbSim) InitPool() {
-	opts := options.Client()
-	opts.SetConnectTimeout(3 * time.Second)
-	opts.ApplyURI("mongodb://" + m.MongodbAddr)
-	opts.SetMaxPoolSize(uint16(m.Size))
-	m.pool = make(chan bool, m.Size)
-	opts.SetMaxConnIdleTime(2 * time.Hour)
-	m.Ctx, _ = context.WithTimeout(context.Background(), 99999*time.Hour)
-	m.ShortCtx, _ = context.WithTimeout(context.Background(), 1*time.Minute)
-	client, err := mongo.Connect(m.ShortCtx, opts)
-	if err != nil {
-		log.Println("mgo init error:", err.Error())
-	} else {
-		m.C = client
-		log.Println("init success")
-	}
-}
-
-func (m *MongodbSim) Open() {
-	m.pool <- true
-}
-func (m *MongodbSim) Close() {
-	<-m.pool
-}
-
-//批量插入
-func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	var writes []mongo.WriteModel
-	for _, d := range doc {
-		write := mongo.NewUpdateOneModel()
-		write.SetFilter(d[0])
-		write.SetUpdate(d[1])
-		write.SetUpsert(true)
-		writes = append(writes, write)
-	}
-	r, e := coll.BulkWrite(m.Ctx, writes)
-	if e != nil {
-		log.Println("mgo upsert error:", e.Error())
-		return nil, false
-	}
-	//	else {
-	//		if r.UpsertedCount != int64(len(doc)) {
-	//			log.Println("mgo upsert uncomplete:uc/dc", r.UpsertedCount, len(doc))
-	//		}
-	//		return true
-	//	}
-	return r.UpsertedIDs, true
-}
-
-//批量插入
-func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	var writes []mongo.WriteModel
-	for _, d := range doc {
-		write := mongo.NewInsertOneModel()
-		write.SetDocument(d)
-		writes = append(writes, write)
-	}
-	_, e := coll.BulkWrite(m.Ctx, writes)
-	if e != nil {
-		log.Println("mgo savebulk error:", e.Error())
-		return false
-	}
-	return true
-}
-
-//保存
-func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	r, err := coll.InsertOne(m.Ctx, doc)
-	if err != nil {
-		return nil
-	}
-	return r.InsertedID
-}
-
-//更新by Id
-func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	_, err := coll.UpdateOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)}, doc)
-	if err != nil {
-		log.Println(err)
-		return false
-	}
-	return true
-}
-
-//删除by id
-func (m *MongodbSim) DeleteById(c, id string) int64 {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	r, err := coll.DeleteOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)})
-	if err != nil {
-		return 0
-	}
-	return r.DeletedCount
-}
-
-//通过条件删除
-func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	r, err := coll.DeleteMany(m.Ctx, query)
-	if err != nil {
-		return 0
-	}
-	return r.DeletedCount
-}
-
-//findbyid
-func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	r := coll.FindOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)})
-	v := map[string]interface{}{}
-	if e := r.Decode(&v);e != nil{
-		log.Println(e)
-		return nil
-	}
-	return v
-}
-
-//findone
-func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]interface{} {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	r := coll.FindOne(m.Ctx, query)
-	v := map[string]interface{}{}
-	r.Decode(&v)
-	return v
-}
-
-//find
-func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields interface{}) ([]map[string]interface{}, error) {
-	m.Open()
-	defer m.Close()
-	coll := m.C.Database(m.DbName).Collection(c)
-	op := options.Find()
-	r, err := coll.Find(m.Ctx, query, op.SetSort(sort), op.SetProjection(fields))
-	if err != nil {
-		log.Fatal(err)
-		return nil, err
-	}
-	var results []map[string]interface{}
-	if err = r.All(m.Ctx, &results); err != nil {
-		log.Fatal(err)
-		return nil, err
-	}
-	return results, nil
-}
-
-//创建_id
-func NewObjectId() primitive.ObjectID {
-	return primitive.NewObjectID()
-}
-
-func StringTOBsonId(id string) primitive.ObjectID {
-	objectId, _ := primitive.ObjectIDFromHex(id)
-	return objectId
-}
-
-func BsonTOStringId(id interface{}) string {
-	return id.(primitive.ObjectID).Hex()
-}

+ 227 - 224
udp_winner/timedTaskAgency.go

@@ -4,69 +4,92 @@ import (
 	"encoding/json"
 	"fmt"
 	"github.com/garyburd/redigo/redis"
-	"go.mongodb.org/mongo-driver/bson/primitive"
 	"gopkg.in/mgo.v2/bson"
 	"log"
 	mu "mfw/util"
 	"net"
 	"qfw/util"
 	"sort"
+	"strconv"
 	"strings"
 	"time"
+	"unicode/utf8"
 )
 
 //之前main方法,只更新
 func TaskAgency(mapinfo *map[string]interface{}) {
 	defer util.Catch()
+	//释放
+	defer func() { <-CPool }()
 	gtid, lteid := util.ObjToString((*mapinfo)["gtid"]), util.ObjToString((*mapinfo)["lteid"])
 	if gtid == "" || lteid == "" {
 		log.Println(gtid, lteid, "参数错误")
 		return
 	}
-	GId, err := primitive.ObjectIDFromHex(gtid)
-	LtId, err2 := primitive.ObjectIDFromHex(lteid)
-	if err != nil || err2 != nil {
-		log.Println(gtid, lteid, "转换_id错误")
+	var GId, LtId bson.ObjectId
+	if bson.IsObjectIdHex(gtid) && bson.IsObjectIdHex(lteid) {
+		GId = bson.ObjectIdHex(gtid)
+		LtId = bson.ObjectIdHex(lteid)
+	} else {
+		log.Println(gtid, lteid, "不是Objectid,转换_id错误", gtid, lteid)
 		return
 	}
 	//udp的id区间查询bidding  中标人 中标联系人 中标联系电话
 	// topscopeclass项目类型-industry行业类型&&topscopeclass联系人项目类型
 	// (area地区-province省份 city城市-city城市 district区县-district区县)
-	// winneraddr-company_address企业地址
-	SourceClientcc := SourceClient.GetMgoConn()
-	defer SourceClient.DestoryMongoConn(SourceClientcc)
+	// agencyaddr-company_address企业地址
+	SourceClientcc := SourceClient.GetMgoConn(86400)
 	cursor := SourceClientcc.DB(Config["mgodb_bidding"]).C(Config["mgodb_mgoinit_c"]).Find(bson.M{
 		"_id": bson.M{
 			"$gte": GId,
 			"$lte": LtId,
 		},
-	}).Select(bson.M{"agency": 1, "agencytel": 1, "agencyperson": 1,
-		"topscopeclass": 1, "agencyaddr": 1}).Iter()
-	if cursor == nil {
-		log.Println(cursor)
+	}).Select(bson.M{"agency": 1, "agencytel": 1, "agencyperson": 1, "topscopeclass": 1,
+		"agencyaddr": 1}).Iter()
+	if cursor.Err() != nil {
+		SourceClient.DestoryMongoConn(SourceClientcc)
+		log.Println(cursor.Err())
 		return
 	}
 	//判断是否是存量,是存量走Redis遍历
 	if v, ok := (*mapinfo)["data_info"].(string); ok && v == "save" {
 		//存量处理
-		tmp := map[string]interface{}{}
 		conn := HisRedisPool.Conn()
 		defer conn.Close()
 		//选择redis db
-		conn.Select(1)
+		redis_agency_db, _ := strconv.Atoi(Config["redis_agency_db"])
+		conn.Select(redis_agency_db)
 		//遍历bidding表保存到redis
-		// key:_id  value:json结构体
+		//key:企业名  value:json结构体{"agency": 1, "agencytel": 1, "agencyperson": 1,"topscopeclass": 1, "agencyaddr": 1,"_id":1}
+		tmp := make(map[string]interface{})
 		for cursor.Next(&tmp) {
-			if tmp["agency"] == nil || tmp["agency"] == "" {
+			agency, ok := tmp["agency"].(string)
+			if !ok ||utf8.RuneCountInString(agency)<4{
 				continue
 			}
-			mgoId:=tmp["_id"].(primitive.ObjectID).Hex()
-			delete(tmp,"_id")
-			bytes, _ := json.Marshal(tmp)
-			if err := conn.Set(mgoId, string(bytes), 0).Err(); err != nil {
+			//判断redis key是否存在
+			e_num := conn.Exists(agency).Val()
+			//获取字符串_id
+			mgoId := tmp["_id"].(bson.ObjectId).Hex()
+			//替换_id
+			tmp["_id"] = mgoId
+			//创建value数组
+			tmps := make([]map[string]interface{}, 0)
+			if e_num > 0 {
+				//存量redis的key存在,累加更新
+				bytes, _ := conn.Get(agency).Bytes()
+				json.Unmarshal(bytes, &tmps)
+			}
+			tmps = append(tmps, tmp)
+			bytes, _ := json.Marshal(tmps)
+			//存量redis的key不存在,新增  key :企业名 val :[]map
+			if err := conn.Set(agency, string(bytes), 0).Err(); err != nil {
 				log.Println(err)
 			}
 		}
+
+		SourceClient.DestoryMongoConn(SourceClientcc)
+
 		//遍历redis
 		if scan := conn.Scan(0, "", 100); scan.Err() != nil {
 			log.Println(scan.Err())
@@ -74,140 +97,110 @@ func TaskAgency(mapinfo *map[string]interface{}) {
 		} else {
 			iterator := scan.Iterator()
 			for iterator.Next() {
-				redisId := iterator.Val()                       //redis key
-				redisvalue := conn.Get(iterator.Val()).Val() //redis val
-				tmp := make(map[string]interface{})
-				json.Unmarshal([]byte(redisvalue),&tmp)
-				//重复增量操作
+				redisCName := iterator.Val()                       //redis key 企业名
+				redisvalueBytes, _ := conn.Get(redisCName).Bytes() //redis val []数组
+				rValuesMaps := make([]map[string]interface{}, 0)
+				json.Unmarshal(redisvalueBytes, &rValuesMaps)
 				//redis查询是否存在
 				rdb := RedisPool.Get()
-				rdb.Do("SELECT","3")
-				if reply, err := redis.String(rdb.Do("GET", tmp["agency"])); err != nil {
+				rdb.Do("SELECT", Config["redis_agency_db"])
+				if reply, err := redis.String(rdb.Do("GET", redisCName)); err != nil {
 					//redis不存在,存到临时表,定时任务处理
 					FClient.DbName = Config["mgodb_extract_kf"]
-					if tmpid := FClient.Save("agency_new", tmp); tmpid == nil {
-						log.Println("存量 FClient.Save err", tmpid)
+					for _, vmap := range rValuesMaps {
+						vmap["_id"] = bson.ObjectIdHex(vmap["_id"].(string))
+						if err = FClient.SaveForOld("agency_new", vmap); err != nil {
+							log.Println("存量 FClient.Save err", err,vmap)
+						}
 					}
 					//log.Println("get redis id err:定时任务处理", err, tmp)
 					if err := rdb.Close(); err != nil {
-						log.Println("存量",err)
+						log.Println("存量", err)
 					}
-					//删除存量redis
-					conn.Del(redisId)
 					continue
 				} else {
+					//redis存在更新合并
 					if err := rdb.Close(); err != nil {
 						log.Println(err)
 					}
 					//拿到合并后的qyk
 					FClient.DbName = Config["mgodb_extract_kf"]
-					oldTmp := FClient.FindById(Config["mgo_qyk_agency"], reply)
-					if oldTmp == nil {
-						log.Println("存量 redis id 不存在",reply,tmp["agency"])
+					oldTmp, b := FClient.FindById(Config["mgo_qyk_agency"], reply, nil)
+					if !b || oldTmp == nil {
+						log.Println(redisCName, "存量 redis id 不存在", reply)
 						continue
 					}
-
-
 					tmpTopscopeclass := []string{}
 					tmpTopscopeclassMap := make(map[string]bool)
 
-					if v, ok := tmp["topscopeclass"].(primitive.A); ok {
-						for _, vv := range v {
-							if vvv, ok := vv.(string); ok && len(vvv) > 1 {
-								tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
+					for _, rvaluemaps := range rValuesMaps {
+						if tclasss, ok := rvaluemaps["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpTopscopeclassMap[vv[:len(vv)-1]] = true
+								}
 							}
 						}
-						for k := range tmpTopscopeclassMap {
-							tmpTopscopeclass = append(tmpTopscopeclass, k)
-						}
+					}
+					for k := range tmpTopscopeclassMap {
+						tmpTopscopeclass = append(tmpTopscopeclass, k)
 					}
 					sort.Strings(tmpTopscopeclass)
+					esId := (*oldTmp)["_id"].(bson.ObjectId).Hex()
 
-
-
-
-					esId := oldTmp["_id"].(primitive.ObjectID).Hex()
-					//更新行业类型
-					if tmp["agencyperson"] == nil || tmp["agencyperson"] == "" ||
-						Reg_xing.MatchString(util.ObjToString(tmp["agencyperson"])) {
-						oldTmp["updatatime"] = time.Now().Unix()
-						//mongo更新
-						FClient.DbName = Config["mgodb_extract_kf"]
-						if !FClient.UpdateById(Config["mgo_qyk_agency"], esId, bson.M{"$set": oldTmp}) {
-							log.Println("mongo更新err", esId)
-						}
-
-						//es更新
-						delete(oldTmp, "_id")
-						if _, err := EsConn.Update().Index(Config["elasticsearch_agency_index"]).Type(Config["elasticsearch_agency_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
-							log.Println("update es err:", err)
+					//联系方式合并
+					contactMaps := make([]interface{}, 0)
+					if (*oldTmp)["contact"] != nil {
+						//直接添加联系人,不再判断
+						if v, ok := (*oldTmp)["contact"].([]interface{}); ok {
+							contactMaps = append(contactMaps, v...)
 						}
-						//删除存量redis
-						conn.Del(redisId)
-						continue
 					}
-					//联系方式合并
-					var tmpperson, agencytel string
-					tmpperson = tmp["agencyperson"].(string)
-					if tmp["agencytel"] == nil || tmp["agencytel"] == "" {
-						agencytel = ""
-					} else {
-						if Reg_xing.MatchString(util.ObjToString(tmp["agencytel"])) || !Reg_tel.MatchString(util.ObjToString(tmp["agencytel"])) {
-							agencytel = ""
+					//遍历redis value联系人
+					for _, rvmap := range rValuesMaps {
+						var tmpperson, agencytel string
+						if rvmapperson, ok := rvmap["agencyperson"].(string); ok && rvmapperson != "" {
+							tmpperson = rvmapperson
 						} else {
-							agencytel = util.ObjToString(tmp["agencytel"])
+							continue
+						}
+						if rvmapwintel, ok := rvmap["agencytel"].(string); ok {
+							agencytel = rvmapwintel
+						} else {
+							agencytel = ""
+						}
+						if Reg_xing.MatchString(agencytel) || !Reg_tel.MatchString(agencytel) {
+							agencytel = ""
 						}
-					}
-					contactMaps := make([]interface{}, 0)
-					if oldTmp["contact"] == nil {
 						tmpContact := make(map[string]interface{})
-						tmpContact["infoid"] = redisId
+						tmpContact["infoid"] = rvmap["_id"]
 						tmpContact["contact_person"] = tmpperson
 						tmpContact["contact_type"] = "项目联系人"
 						tmpContact["phone"] = agencytel
-						tmpContact["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-						tmpContact["updatetime"] = time.Now().Unix()
-						contactMaps = append(contactMaps, tmpContact)
-					} else {
-						//对比前四项,相等丢弃
-						if v, ok := oldTmp["contact"].(primitive.A); ok {
-							var isNotUpdate bool
-							for _, vv := range v {
-								if vvv, ok := vv.(map[string]interface{}); ok {
-									if vvv["contact_person"] == tmpperson && vvv["contact_type"] == "项目联系人" &&
-										vvv["phone"] == agencytel && vvv["topscopeclass"] == strings.Join(tmpTopscopeclass, ";") {
-										isNotUpdate = true
-										vvv["updatetime"] = time.Now().Unix()
-									}
-									contactMaps = append(contactMaps, vvv)
+						tmpclass := make([]string, 0)
+						if tclasss, ok := rvmap["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpclass = append(tmpclass, vv[:len(vv)-1])
 								}
 							}
-							if !isNotUpdate {
-								vvv := make(map[string]interface{})
-								vvv["infoid"] = redisId
-								vvv["contact_person"] = tmp["agencyperson"]
-								vvv["contact_type"] = "项目联系人"
-								vvv["phone"] = agencytel
-								vvv["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-								vvv["updatetime"] = time.Now().Unix()
-								contactMaps = append(contactMaps, vvv)
-							}
 						}
+						tmpContact["topscopeclass"] = strings.Join(tmpclass, ";")
+						tmpContact["updatetime"] = time.Now().Unix()
+						contactMaps = append(contactMaps, tmpContact)
 					}
-					oldTmp["contact"] = contactMaps
+					(*oldTmp)["contact"] = contactMaps
 					//mongo更新
-					oldTmp["updatatime"] = time.Now().Unix()
+					(*oldTmp)["updatatime"] = time.Now().Unix()
 					FClient.DbName = Config["mgodb_extract_kf"]
 					if !FClient.UpdateById(Config["mgo_qyk_agency"], esId, bson.M{"$set": oldTmp}) {
 						log.Println("存量  mongo更新 err", esId, oldTmp)
 					}
 					//es更新
-					delete(oldTmp, "_id")
+					delete((*oldTmp), "_id")
 					if _, err := EsConn.Update().Index(Config["elasticsearch_agency_index"]).Type(Config["elasticsearch_agency_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 						log.Println("存量 EsConn err :", err)
 					}
-					//最后删除redis
-					conn.Del(redisId)
 				}
 			}
 		}
@@ -218,19 +211,20 @@ func TaskAgency(mapinfo *map[string]interface{}) {
 		overid := gtid
 		tmp := map[string]interface{}{}
 		for cursor.Next(&tmp) {
-			overid = tmp["_id"].(primitive.ObjectID).Hex()
+			overid = tmp["_id"].(bson.ObjectId).Hex()
 			//log.Println(tmp["_id"])
-			if tmp["agency"] == nil || tmp["agency"] == "" {
+			agency, ok := tmp["agency"].(string)
+			if !ok ||utf8.RuneCountInString(agency)<4{
 				continue
 			}
 			//redis查询是否存在
 			rdb := RedisPool.Get()
-			rdb.Do("SELECT","3")
-			if reply, err := redis.String(rdb.Do("GET", tmp["agency"])); err != nil {
+			rdb.Do("SELECT", Config["redis_agency_db"])
+			if reply, err := redis.String(rdb.Do("GET", agency)); err != nil {
 				//redis不存在存到临时表,定时任务处理
 				FClient.DbName = Config["mgodb_extract_kf"]
-				if tmpid := FClient.Save("agency_new", tmp); tmpid == nil {
-					log.Println("FClient.Save err", tmpid)
+				if err := FClient.SaveForOld("agency_new", tmp); err!=nil {
+					log.Println("FClient.Save err", err,tmp)
 				}
 				//log.Println("get redis id err:定时任务处理", err, tmp)
 				if err := rdb.Close(); err != nil {
@@ -243,34 +237,35 @@ func TaskAgency(mapinfo *map[string]interface{}) {
 				}
 				//拿到合并后的qyk
 				FClient.DbName = Config["mgodb_extract_kf"]
-				oldTmp := FClient.FindById(Config["mgo_qyk_agency"], reply)
-				if oldTmp == nil {
+				oldTmp, b := FClient.FindById(Config["mgo_qyk_agency"], reply, bson.M{})
+				if !b || oldTmp == nil {
 					log.Println("redis id 不存在")
 					continue
 				}
 				//比较合并
 				//行业类型
 				tmpTopscopeclass := []string{}
+				tmpConTopscopeclass := []string{}
 				tmpTopscopeclassMap := make(map[string]bool)
 
-				if v, ok := tmp["topscopeclass"].(primitive.A); ok {
+				if v, ok := tmp["topscopeclass"].([]interface{}); ok {
 					for _, vv := range v {
 						if vvv, ok := vv.(string); ok && len(vvv) > 1 {
 							tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
+							tmpConTopscopeclass = append(tmpConTopscopeclass, vvv[:len(vvv)-1])
 						}
 					}
-					for k := range tmpTopscopeclassMap {
-						tmpTopscopeclass = append(tmpTopscopeclass, k)
-					}
+				}
+				for k := range tmpTopscopeclassMap {
+					tmpTopscopeclass = append(tmpTopscopeclass, k)
 				}
 				sort.Strings(tmpTopscopeclass)
+				esId := (*oldTmp)["_id"].(bson.ObjectId).Hex()
 
-
-
-				esId := oldTmp["_id"].(primitive.ObjectID).Hex()
 				//更新行业类型
 				if tmp["agencyperson"] == nil || tmp["agencyperson"] == "" || Reg_xing.MatchString(util.ObjToString(tmp["agencyperson"])) {
-					oldTmp["updatatime"] = time.Now().Unix()
+
+					(*oldTmp)["updatatime"] = time.Now().Unix()
 					//mongo更新
 					FClient.DbName = Config["mgodb_extract_kf"]
 					if !FClient.UpdateById(Config["mgo_qyk_agency"], esId, bson.M{"$set": oldTmp}) {
@@ -278,7 +273,7 @@ func TaskAgency(mapinfo *map[string]interface{}) {
 					}
 
 					//es更新
-					delete(oldTmp, "_id")
+					delete((*oldTmp), "_id")
 					if _, err := EsConn.Update().Index(Config["elasticsearch_agency_index"]).Type(Config["elasticsearch_agency_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 						log.Println("update es err:", err)
 					}
@@ -286,93 +281,71 @@ func TaskAgency(mapinfo *map[string]interface{}) {
 				}
 				//联系方式合并
 				var tmpperson, agencytel string
-				tmpperson = tmp["agencyperson"].(string)
-				if tmp["agencytel"] == nil || tmp["agencytel"] == "" {
+				if tmppersona, ok := tmp["agencyperson"].(string); ok {
+					tmpperson = tmppersona
+				}
+				if agencyteltmp, ok := tmp["agencytel"].(string); ok {
+					agencytel = agencyteltmp
+				}
+				if Reg_xing.MatchString(agencytel) || !Reg_tel.MatchString(agencytel) {
 					agencytel = ""
 				} else {
-					if Reg_xing.MatchString(util.ObjToString(tmp["agencytel"])) || !Reg_tel.MatchString(util.ObjToString(tmp["agencytel"])) {
-						agencytel = ""
-					} else {
-						agencytel = util.ObjToString(tmp["agencytel"])
-					}
+					agencytel = agencytel
 				}
 				contactMaps := make([]interface{}, 0)
-				if oldTmp["contact"] == nil {
-					tmpContact := make(map[string]interface{})
-					tmpContact["infoid"] = overid
-					tmpContact["contact_person"] = tmpperson
-					tmpContact["contact_type"] = "项目联系人"
-					tmpContact["phone"] = agencytel
-					tmpContact["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-					tmpContact["updatetime"] = time.Now().Unix()
-					contactMaps = append(contactMaps, tmpContact)
-				} else {
-					//对比前四项,相等丢弃
-					if v, ok := oldTmp["contact"].(primitive.A); ok {
-						var isNotUpdate bool
-						for _, vv := range v {
-							if vvv, ok := vv.(map[string]interface{}); ok {
-								if vvv["contact_person"] == tmpperson && vvv["contact_type"] == "项目联系人" &&
-									vvv["phone"] == agencytel && vvv["topscopeclass"] == strings.Join(tmpTopscopeclass, ";") {
-									isNotUpdate = true
-									vvv["updatetime"] = time.Now().Unix()
-								}
-								contactMaps = append(contactMaps, vvv)
-							}
-						}
-						if !isNotUpdate {
-							vvv := make(map[string]interface{})
-							vvv["infoid"] = overid
-							vvv["contact_person"] = tmp["agencyperson"]
-							vvv["contact_type"] = "项目联系人"
-							vvv["phone"] = agencytel
-							vvv["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-							vvv["updatetime"] = time.Now().Unix()
-							contactMaps = append(contactMaps, vvv)
-						}
+				if (*oldTmp)["contact"] != nil {
+					//直接添加联系人,不再判断
+					if v, ok := (*oldTmp)["contact"].([]interface{}); ok {
+						contactMaps = append(contactMaps, v...)
 					}
 				}
-				oldTmp["contact"] = contactMaps
+				vvv := make(map[string]interface{})
+				vvv["infoid"] = overid
+				vvv["contact_person"] = tmpperson
+				vvv["contact_type"] = "项目联系人"
+				vvv["phone"] = agencytel
+				vvv["topscopeclass"] = strings.Join(tmpConTopscopeclass, ";")
+				vvv["updatetime"] = time.Now().Unix()
+				contactMaps = append(contactMaps, vvv)
+				(*oldTmp)["contact"] = contactMaps
 				//mongo更新
-				oldTmp["updatatime"] = time.Now().Unix()
+				(*oldTmp)["updatatime"] = time.Now().Unix()
 				FClient.DbName = Config["mgodb_extract_kf"]
 				if !FClient.UpdateById(Config["mgo_qyk_agency"], esId, bson.M{"$set": oldTmp}) {
 					log.Println("mongo更新 err", esId, oldTmp)
 				}
 				//es更新
-				delete(oldTmp, "_id")
+				delete((*oldTmp), "_id")
 				if _, err := EsConn.Update().Index(Config["elasticsearch_agency_index"]).Type(Config["elasticsearch_agency_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 					log.Println("EsConn err :", err)
 				}
 			}
 		}
+		SourceClient.DestoryMongoConn(SourceClientcc)
 		log.Println("增量合并执行完成 ok", gtid, lteid, overid)
 	}
 
 }
 
-
-
-//定时任务
+//定时任务  新增
 //1.存异常表
 //2.合并原始库新增
 func TimedTaskAgency() {
 	//time.Sleep(time.Hour*70)
 	t2 := time.NewTimer(time.Second * 5)
 	for range t2.C {
-		Fcconn := FClient.GetMgoConn()
-		defer FClient.DestoryMongoConn(Fcconn)
+		Fcconn := FClient.GetMgoConn(86400)
 		tmpLast := map[string]interface{}{}
 		if iter := Fcconn.DB(Config["mgodb_extract_kf"]).C("agency_new").Find(bson.M{}).Sort("-_id").Limit(1).Iter(); iter != nil {
 			if !iter.Next(&tmpLast) {
 				//临时表无数据
 				log.Println("临时表无数据:")
-				t2.Reset(time.Second * 10)
+				t2.Reset(time.Minute * 5)
+				FClient.DestoryMongoConn(Fcconn)
 				continue
 			} else {
 				log.Println("临时表有数据:", tmpLast)
-				fconn := FClient.GetMgoConn()
-				defer FClient.DestoryMongoConn(fconn)
+				fconn := FClient.GetMgoConn(86400)
 				cursor := fconn.DB(Config["mgodb_extract_kf"]).C("agency_new").Find(bson.M{
 					"_id": bson.M{
 						"$lte": tmpLast["_id"],
@@ -381,23 +354,24 @@ func TimedTaskAgency() {
 				if cursor == nil {
 					log.Println("查询失败")
 					t2.Reset(time.Second * 5)
+					FClient.DestoryMongoConn(fconn)
 					continue
 				}
 				//遍历临时表数据,匹配不到原始库存入异常表
 				tmp := make(map[string]interface{})
 				for cursor.Next(&tmp) {
-					tmpId := tmp["_id"].(primitive.ObjectID).Hex()
+					tmpId := tmp["_id"].(bson.ObjectId).Hex()
 					//再重新查找redis,存在发udp处理,不存在走新增合并
 					rdb := RedisPool.Get()
-					rdb.Do("SELECT","3")
-
+					rdb.Do("SELECT", Config["redis_agency_db"])
 					if _, err := redis.String(rdb.Do("GET", tmp["agency"])); err == nil {
-						//{"gtid":"57d7ad2f61a0721f152d2ad5","lteid":"5e20968d85a9271abf0ad6c2","stype":""}
 						//redis存在发送udp进行处理
 						by, _ := json.Marshal(map[string]interface{}{
-							"gtid":  tmpId,
-							"lteid": tmpId,
-							"stype": "",
+							"gtid":      tmpId,
+							"lteid":     tmpId,
+							"stype":     "",
+							"data_type": "agency",
+							"data_info": "add",
 						})
 						if e := udpclient.WriteUdp(by, mu.OP_TYPE_DATA, &net.UDPAddr{
 							IP:   net.ParseIP("127.0.0.1"),
@@ -407,7 +381,7 @@ func TimedTaskAgency() {
 						}
 						//存在的话删除tmp mongo表
 						FClient.DbName = Config["mgodb_extract_kf"]
-						if DeletedCount := FClient.DeleteById("agency_new", tmpId); DeletedCount == 0 {
+						if DeletedCount := FClient.Del("agency_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !DeletedCount {
 							log.Println("删除临时表err:", DeletedCount)
 						}
 						if err := rdb.Close(); err != nil {
@@ -421,33 +395,33 @@ func TimedTaskAgency() {
 					}
 					//查询redis不存在新增
 					FClient.DbName = Config["mgodb_enterprise"]
-					resulttmp := FClient.FindOne(Config["mgodb_enterprise_c"], bson.M{"company_name": tmp["agency"]})
-					if resulttmp["_id"] == nil {
+
+					resulttmp, b := FClient.FindOne(Config["mgodb_enterprise_c"], bson.M{"company_name": tmp["agency"]})
+					if !b || (*resulttmp)["_id"] == nil {
 						//log.Println(r)
 						//匹配不到原始库,存入异常表删除临时表
 						FClient.DbName = Config["mgodb_extract_kf"]
-						if saveid := FClient.Save("agency_err", tmp); saveid == nil {
-							log.Println("存入异常表错误", tmp)
+						if err := FClient.SaveForOld("agency_err", tmp); err != nil {
+							log.Println("存入异常表错误", err, tmp)
 						}
-						FClient.DbName = Config["mgodb_extract_kf"]
-						if deleteNum := FClient.DeleteById("agency_new", tmpId); deleteNum == 0 {
+						if deleteNum := FClient.Del("agency_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !b {
 							log.Println("删除临时表错误", deleteNum)
 						}
 						continue
 					} else {
 						//log.Println(123)
 						//匹配到原始库,新增 resulttmp
-						if resulttmp["credit_no"] != nil {
-							if credit_no, ok := resulttmp["credit_no"].(string); ok && strings.TrimSpace(credit_no) != "" &&
+						if (*resulttmp)["credit_no"] != nil {
+							if credit_no, ok := (*resulttmp)["credit_no"].(string); ok && strings.TrimSpace(credit_no) != "" &&
 								len(strings.TrimSpace(credit_no)) > 8 {
 								dataNo := strings.TrimSpace(credit_no)[2:8]
 								if Addrs[dataNo] != nil {
 									if v, ok := Addrs[dataNo].(map[string]interface{}); ok {
-										if resulttmp["province"] == nil || resulttmp["province"] == "" {
-											resulttmp["province"] = v["province"]
+										if (*resulttmp)["province"] == nil || (*resulttmp)["province"] == "" {
+											(*resulttmp)["province"] = v["province"]
 										}
-										resulttmp["city"] = v["city"]
-										resulttmp["district"] = v["district"]
+										(*resulttmp)["city"] = v["city"]
+										(*resulttmp)["district"] = v["district"]
 
 									}
 								}
@@ -455,15 +429,15 @@ func TimedTaskAgency() {
 						}
 						contacts := make([]map[string]interface{}, 0)
 						contact := make(map[string]interface{}, 0)
-						if resulttmp["legal_person"] != nil {
-							contact["contact_person"] = resulttmp["legal_person"] //联系人
+						if (*resulttmp)["legal_person"] != nil {
+							contact["contact_person"] = (*resulttmp)["legal_person"] //联系人
 						} else {
 							contact["contact_person"] = "" //联系人
 						}
 						contact["contact_type"] = "法定代表人" //法定代表人
 						//log.Println(1)
-						if resulttmp["annual_reports"] != nil {
-							bytes, err := json.Marshal(resulttmp["annual_reports"])
+						if (*resulttmp)["annual_reports"] != nil {
+							bytes, err := json.Marshal((*resulttmp)["annual_reports"])
 							if err != nil {
 								log.Println("annual_reports err:", err)
 							}
@@ -495,24 +469,50 @@ func TimedTaskAgency() {
 						contact["updatetime"] = time.Now().Unix() //更新时间
 						contact["infoid"] = ""                    //招标信息id
 						contacts = append(contacts, contact)
-						resulttmp["contact"] = contacts
+						//添加临时表匹配到的联系人
+						vvv := make(map[string]interface{})
+						vvv["infoid"] = tmp["_id"].(bson.ObjectId).Hex()
+						if tmp["agencyperson"] != nil{
+							vvv["contact_person"] = tmp["agencyperson"]
+						}else {
+							vvv["contact_person"] = ""
+						}
+						vvv["contact_type"] = "项目联系人"
+						//	"agency": 1, "agencytel": 1, "agencyperson": 1, "topscopeclass": 1
+						if tmp["agencytel"] != nil{
+							vvv["phone"] = tmp["agencytel"]
+						}else {
+							vvv["phone"] = ""
+						}
+						tmpclass := make([]string, 0)
+						if tclasss, ok := tmp["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpclass = append(tmpclass, vv[:len(vv)-1])
+								}
+							}
+						}
+						vvv["topscopeclass"] = strings.Join(tmpclass, ";")
+						vvv["updatetime"] = time.Now().Unix()
+						contacts = append(contacts, vvv)
+						(*resulttmp)["contact"] = contacts
 
 						savetmp := make(map[string]interface{}, 0)
 						for _, sk := range AgencyFields {
 							if sk == "_id" {
-								savetmp["tmp"+sk] = resulttmp[sk]
+								savetmp["tmp"+sk] = (*resulttmp)[sk]
 								continue
 							} else if sk == "area_code" {
 								//行政区划代码
-								savetmp[sk] = fmt.Sprint(resulttmp[sk])
+								savetmp[sk] = fmt.Sprint((*resulttmp)[sk])
 								continue
 							} else if sk == "report_websites" {
 								//网址
-								if resulttmp["report_websites"] == nil {
+								if (*resulttmp)["report_websites"] == nil {
 									savetmp["website"] = ""
 								} else {
 									report_websitesArr := []string{}
-									if ppms, ok := resulttmp[sk].(primitive.A); ok {
+									if ppms, ok := (*resulttmp)[sk].([]interface{}); ok {
 										for _, v := range ppms {
 											if vvv, ok := v.(map[string]interface{}); ok {
 												if rv, ok := vvv["website_url"].(string); ok {
@@ -529,47 +529,47 @@ func TimedTaskAgency() {
 								savetmp[sk] = []interface{}{}
 								continue
 							}else if sk=="agency_name" {
-								if resulttmp["company_name"] == nil {
+								if (*resulttmp)["company_name"] == nil {
 									savetmp[sk] = ""
 								}else {
-									savetmp[sk] = resulttmp["company_name"]
+									savetmp[sk] = (*resulttmp)["company_name"]
 								}
 								continue
 							}else if sk=="address"{
-								if resulttmp["company_address"] == nil {
+								if (*resulttmp)["company_address"] == nil {
 									savetmp[sk] = ""
 								}else {
-									savetmp[sk] = resulttmp["company_address"]
+									savetmp[sk] = (*resulttmp)["company_address"]
 								}
 								continue
 							}
 
 
-
-							if resulttmp[sk] == nil && sk != "history_name" && sk != "wechat_accounts" &&
+							if (*resulttmp)[sk] == nil && sk != "history_name" && sk != "wechat_accounts" &&
 								sk != "agency_name" && sk != "address" &&
 								sk != "contact" && sk != "report_websites" {
 								savetmp[sk] = ""
 							} else {
-								savetmp[sk] = resulttmp[sk]
+								savetmp[sk] = (*resulttmp)[sk]
 							}
 						}
 						//tmps = append(tmps, savetmp)
 						savetmp["updatatime"] = time.Now().Unix()
 						//保存mongo
 						FClient.DbName = Config["mgodb_extract_kf"]
+
+
+
 						saveid := FClient.Save(Config["mgo_qyk_agency"], savetmp)
-						if saveid != nil {
-							//保存redis
+						if saveid != "" {
 							//保存redis
 							rc := RedisPool.Get()
-							rc.Do("SELECT","3")
-
-							var _id string
-							if v, ok := saveid.(primitive.ObjectID); ok {
-								_id = v.Hex()
-							}
-							if _, err := rc.Do("SET", savetmp["agency_name"], _id); err != nil {
+							rc.Do("SELECT", Config["redis_agency_db"])
+							//var _id string
+							//if v, ok := saveid.(primitive.ObjectID); ok {
+							//	_id = v.Hex()
+							//}
+							if _, err := rc.Do("SET", savetmp["agency_name"], saveid); err != nil {
 								log.Println("save redis err:", tmp["_id"], savetmp["_id"], savetmp["agency_name"], err)
 								if err := rc.Close(); err != nil {
 									log.Println(err)
@@ -583,12 +583,12 @@ func TimedTaskAgency() {
 
 								//esConn := elastic.GetEsConn()
 								//defer elastic.DestoryEsConn(esConn)
-								if _, err := EsConn.Index().Index(Config["elasticsearch_agency_index"]).Type(Config["elasticsearch_agency_type"]).Id(_id).BodyJson(savetmp).Refresh(true).Do(); err != nil {
+								if _, err := EsConn.Index().Index(Config["elasticsearch_agency_index"]).Type(Config["elasticsearch_agency_type"]).Id(saveid).BodyJson(savetmp).Refresh(true).Do(); err != nil {
 									log.Println("save es err :", tmp["_id"], savetmp["_id"], err)
 								} else {
 									//删除临时表
 									FClient.DbName = Config["mgodb_extract_kf"]
-									if deleteNum := FClient.DeleteById("agency_new", tmpId); deleteNum == 0 {
+									if deleteNum := FClient.Del("agency_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !deleteNum {
 										log.Println("删除临时表失败", deleteNum)
 									}
 								}
@@ -598,8 +598,11 @@ func TimedTaskAgency() {
 						}
 					}
 				}
+				FClient.DestoryMongoConn(fconn)
 			}
 		}
+		FClient.DestoryMongoConn(Fcconn)
 		t2.Reset(time.Minute)
 	}
-}
+}
+

+ 259 - 289
udp_winner/timedTaskBuyer.go

@@ -4,69 +4,92 @@ import (
 	"encoding/json"
 	"fmt"
 	"github.com/garyburd/redigo/redis"
-	"go.mongodb.org/mongo-driver/bson/primitive"
 	"gopkg.in/mgo.v2/bson"
 	"log"
 	mu "mfw/util"
 	"net"
 	"qfw/util"
 	"sort"
+	"strconv"
 	"strings"
 	"time"
+	"unicode/utf8"
 )
 
 //之前main方法,只更新
 func TaskBuyer(mapinfo *map[string]interface{}) {
 	defer util.Catch()
+	//释放
+	defer func() { <-CPool }()
 	gtid, lteid := util.ObjToString((*mapinfo)["gtid"]), util.ObjToString((*mapinfo)["lteid"])
 	if gtid == "" || lteid == "" {
 		log.Println(gtid, lteid, "参数错误")
 		return
 	}
-	GId, err := primitive.ObjectIDFromHex(gtid)
-	LtId, err2 := primitive.ObjectIDFromHex(lteid)
-	if err != nil || err2 != nil {
-		log.Println(gtid, lteid, "转换_id错误")
+	var GId, LtId bson.ObjectId
+	if bson.IsObjectIdHex(gtid) && bson.IsObjectIdHex(lteid) {
+		GId = bson.ObjectIdHex(gtid)
+		LtId = bson.ObjectIdHex(lteid)
+	} else {
+		log.Println(gtid, lteid, "不是Objectid,转换_id错误", gtid, lteid)
 		return
 	}
 	//udp的id区间查询bidding  中标人 中标联系人 中标联系电话
 	// topscopeclass项目类型-industry行业类型&&topscopeclass联系人项目类型
 	// (area地区-province省份 city城市-city城市 district区县-district区县)
-	// winneraddr-company_address企业地址
-	SourceClientcc := SourceClient.GetMgoConn()
-	defer SourceClient.DestoryMongoConn(SourceClientcc)
+	// buyeraddr-company_address企业地址
+	SourceClientcc := SourceClient.GetMgoConn(86400)
 	cursor := SourceClientcc.DB(Config["mgodb_bidding"]).C(Config["mgodb_mgoinit_c"]).Find(bson.M{
 		"_id": bson.M{
 			"$gte": GId,
 			"$lte": LtId,
 		},
-	}).Select(bson.M{"buyer": 1, "buyertel": 1, "buyerperson": 1,
-		"topscopeclass": 1, "buyeraddr": 1,"buyerclass":1}).Iter()
-	if cursor == nil {
-		log.Println(cursor)
+	}).Select(bson.M{"buyer": 1, "buyertel": 1, "buyerperson": 1, "topscopeclass": 1,
+		"buyeraddr": 1,"buyerclass":1}).Iter()
+	if cursor.Err() != nil {
+		SourceClient.DestoryMongoConn(SourceClientcc)
+		log.Println(cursor.Err())
 		return
 	}
 	//判断是否是存量,是存量走Redis遍历
 	if v, ok := (*mapinfo)["data_info"].(string); ok && v == "save" {
 		//存量处理
-		tmp := map[string]interface{}{}
 		conn := HisRedisPool.Conn()
 		defer conn.Close()
 		//选择redis db
-		conn.Select(1)
+		redis_buyer_db, _ := strconv.Atoi(Config["redis_buyer_db"])
+		conn.Select(redis_buyer_db)
 		//遍历bidding表保存到redis
-		// key:_id  value:json结构体
+		//key:企业名  value:json结构体{"buyer": 1, "buyertel": 1, "buyerperson": 1,"topscopeclass": 1, "buyeraddr": 1,"_id":1}
+		tmp := make(map[string]interface{})
 		for cursor.Next(&tmp) {
-			if tmp["buyer"] == nil || tmp["buyer"] == "" {
+			buyer, ok := tmp["buyer"].(string)
+			if !ok || utf8.RuneCountInString(buyer)<4{
 				continue
 			}
-			mgoId:=tmp["_id"].(primitive.ObjectID).Hex()
-			delete(tmp,"_id")
-			bytes, _ := json.Marshal(tmp)
-			if err := conn.Set(mgoId, string(bytes), 0).Err(); err != nil {
+			//判断redis key是否存在
+			e_num := conn.Exists(buyer).Val()
+			//获取字符串_id
+			mgoId := tmp["_id"].(bson.ObjectId).Hex()
+			//替换_id
+			tmp["_id"] = mgoId
+			//创建value数组
+			tmps := make([]map[string]interface{}, 0)
+			if e_num > 0 {
+				//存量redis的key存在,累加更新
+				bytes, _ := conn.Get(buyer).Bytes()
+				json.Unmarshal(bytes, &tmps)
+			}
+			tmps = append(tmps, tmp)
+			bytes, _ := json.Marshal(tmps)
+			//存量redis的key不存在,新增  key :企业名 val :[]map
+			if err := conn.Set(buyer, string(bytes), 0).Err(); err != nil {
 				log.Println(err)
 			}
 		}
+
+		SourceClient.DestoryMongoConn(SourceClientcc)
+
 		//遍历redis
 		if scan := conn.Scan(0, "", 100); scan.Err() != nil {
 			log.Println(scan.Err())
@@ -74,172 +97,129 @@ func TaskBuyer(mapinfo *map[string]interface{}) {
 		} else {
 			iterator := scan.Iterator()
 			for iterator.Next() {
-				redisId := iterator.Val()                       //redis key
-				redisvalue := conn.Get(iterator.Val()).Val() //redis val
-				tmp := make(map[string]interface{})
-				json.Unmarshal([]byte(redisvalue),&tmp)
-				//重复增量操作
+				redisCName := iterator.Val()                       //redis key 企业名
+				redisvalueBytes, _ := conn.Get(redisCName).Bytes() //redis val []数组
+				rValuesMaps := make([]map[string]interface{}, 0)
+				json.Unmarshal(redisvalueBytes, &rValuesMaps)
 				//redis查询是否存在
 				rdb := RedisPool.Get()
-				rdb.Do("SELECT","2")
-				if reply, err := redis.String(rdb.Do("GET", tmp["buyer"])); err != nil {
+				rdb.Do("SELECT", Config["redis_buyer_db"])
+				if reply, err := redis.String(rdb.Do("GET", redisCName)); err != nil {
 					//redis不存在,存到临时表,定时任务处理
 					FClient.DbName = Config["mgodb_extract_kf"]
-					if tmpid := FClient.Save("buyer_new", tmp); tmpid == nil {
-						log.Println("存量 FClient.Save err", tmpid)
+					for _, vmap := range rValuesMaps {
+						vmap["_id"] = bson.ObjectIdHex(vmap["_id"].(string))
+						if err = FClient.SaveForOld("buyer_new", vmap); err != nil {
+							log.Println("存量 FClient.Save err", err,vmap)
+						}
 					}
 					//log.Println("get redis id err:定时任务处理", err, tmp)
 					if err := rdb.Close(); err != nil {
-						log.Println("存量",err)
+						log.Println("存量", err)
 					}
-					//删除存量redis
-					conn.Del(redisId)
 					continue
 				} else {
+					//redis存在更新合并
 					if err := rdb.Close(); err != nil {
 						log.Println(err)
 					}
 					//拿到合并后的qyk
 					FClient.DbName = Config["mgodb_extract_kf"]
-					oldTmp := FClient.FindById(Config["mgo_qyk_buyer"], reply)
-					if oldTmp == nil {
-						log.Println("存量 redis id 不存在",reply,tmp["buyer"])
+					oldTmp, b := FClient.FindById(Config["mgo_qyk_buyer"], reply, nil)
+					if !b || oldTmp == nil {
+						log.Println(redisCName, "存量 redis id 不存在", reply)
 						continue
 					}
 					tmpTopscopeclass := []string{}
 					tmpTopscopeclassMap := make(map[string]bool)
 
-					if v, ok := tmp["topscopeclass"].(primitive.A); ok {
-						for _, vv := range v {
-							if vvv, ok := vv.(string); ok && len(vvv) > 1 {
-								tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
+					for _, rvaluemaps := range rValuesMaps {
+						if tclasss, ok := rvaluemaps["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpTopscopeclassMap[vv[:len(vv)-1]] = true
+								}
 							}
 						}
-						for k := range tmpTopscopeclassMap {
-							tmpTopscopeclass = append(tmpTopscopeclass, k)
-						}
+					}
+					for k := range tmpTopscopeclassMap {
+						tmpTopscopeclass = append(tmpTopscopeclass, k)
 					}
 					sort.Strings(tmpTopscopeclass)
+					esId := (*oldTmp)["_id"].(bson.ObjectId).Hex()
 
-					//更新buyerclass
-					esId := oldTmp["_id"].(primitive.ObjectID).Hex()
-					//更新行业类型
-					if tmp["buyerperson"] == nil || tmp["buyerperson"] == "" || Reg_xing.MatchString(util.ObjToString(tmp["buyerperson"])) {
-						//更新buyerclass合并
-						if tmp["buyerclass"] == nil || tmp["buyerclass"] == "" {
-							//无值,不更新
+
+					//更新buyerclass合并
+					if tmp["buyerclass"] == nil || tmp["buyerclass"] == "" {
+						//无值,不更新
+					}else {
+						var buyerclass_new,buyerclass_old string
+						buyerclass_new = tmp["buyerclass"].(string)
+						buyerclass_old = (*oldTmp)["buyerclass"].(string)
+						if buyerclass_old=="" {
+							(*oldTmp)["buyerclass"] = buyerclass_new
 						}else {
-							var buyerclass_new,buyerclass_old string
-							buyerclass_new = tmp["buyerclass"].(string)
-							buyerclass_old = oldTmp["buyerclass"].(string)
-							if buyerclass_old=="" {
-								oldTmp["buyerclass"] = buyerclass_new
-							}else {
-								if buyerclass_new!=buyerclass_old {
-									if !strings.Contains(buyerclass_old, buyerclass_new) {
-										oldTmp["buyerclass"] = buyerclass_old + ","+buyerclass_new //采购单位类型
-									}
+							if buyerclass_new!=buyerclass_old {
+								if !strings.Contains(buyerclass_old, buyerclass_new) {
+									(*oldTmp)["buyerclass"] = buyerclass_old + ","+buyerclass_new //采购单位类型
 								}
 							}
 						}
+					}
 
-						oldTmp["updatatime"] = time.Now().Unix()
-						//mongo更新
-						FClient.DbName = Config["mgodb_extract_kf"]
-						if !FClient.UpdateById(Config["mgo_qyk_buyer"], esId, bson.M{"$set": oldTmp}) {
-							log.Println("mongo更新err", esId)
-						}
-
-						//es更新
-						delete(oldTmp, "_id")
-						if _, err := EsConn.Update().Index(Config["elasticsearch_buyer_index"]).Type(Config["elasticsearch_buyer_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
-							log.Println("update es err:", err)
+					//联系方式合并
+					contactMaps := make([]interface{}, 0)
+					if (*oldTmp)["contact"] != nil {
+						//直接添加联系人,不再判断
+						if v, ok := (*oldTmp)["contact"].([]interface{}); ok {
+							contactMaps = append(contactMaps, v...)
 						}
-						//删除存量redis
-						conn.Del(redisId)
-						continue
 					}
-					//联系方式合并
-					var tmpperson, buyertel string
-					tmpperson = tmp["buyerperson"].(string)
-					if tmp["buyertel"] == nil || tmp["buyertel"] == "" {
-						buyertel = ""
-					} else {
-						if Reg_xing.MatchString(util.ObjToString(tmp["buyertel"])) || !Reg_tel.MatchString(util.ObjToString(tmp["buyertel"])) {
-							buyertel = ""
+					//遍历redis value联系人
+					for _, rvmap := range rValuesMaps {
+						var tmpperson, buyertel string
+						if rvmapperson, ok := rvmap["buyerperson"].(string); ok && rvmapperson != "" {
+							tmpperson = rvmapperson
 						} else {
-							buyertel = util.ObjToString(tmp["buyertel"])
+							continue
+						}
+						if rvmapwintel, ok := rvmap["buyertel"].(string); ok {
+							buyertel = rvmapwintel
+						} else {
+							buyertel = ""
+						}
+						if Reg_xing.MatchString(buyertel) || !Reg_tel.MatchString(buyertel) {
+							buyertel = ""
 						}
-					}
-					contactMaps := make([]interface{}, 0)
-					if oldTmp["contact"] == nil {
 						tmpContact := make(map[string]interface{})
-						tmpContact["infoid"] = redisId
+						tmpContact["infoid"] = rvmap["_id"]
 						tmpContact["contact_person"] = tmpperson
 						tmpContact["contact_type"] = "项目联系人"
 						tmpContact["phone"] = buyertel
-						tmpContact["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-						tmpContact["updatetime"] = time.Now().Unix()
-						contactMaps = append(contactMaps, tmpContact)
-					} else {
-						//对比前四项,相等丢弃
-						if v, ok := oldTmp["contact"].(primitive.A); ok {
-							var isNotUpdate bool
-							for _, vv := range v {
-								if vvv, ok := vv.(map[string]interface{}); ok {
-									if vvv["contact_person"] == tmpperson && vvv["contact_type"] == "项目联系人" &&
-										vvv["phone"] == buyertel && vvv["topscopeclass"] == strings.Join(tmpTopscopeclass, ";") {
-										isNotUpdate = true
-										vvv["updatetime"] = time.Now().Unix()
-									}
-									contactMaps = append(contactMaps, vvv)
-								}
-							}
-							if !isNotUpdate {
-								vvv := make(map[string]interface{})
-								vvv["infoid"] = redisId
-								vvv["contact_person"] = tmp["buyerperson"]
-								vvv["contact_type"] = "项目联系人"
-								vvv["phone"] = buyertel
-								vvv["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-								vvv["updatetime"] = time.Now().Unix()
-								contactMaps = append(contactMaps, vvv)
-							}
-						}
-					}
-					oldTmp["contact"] = contactMaps
-
-					//更新buyerclass合并
-					if tmp["buyerclass"] == nil || tmp["buyerclass"] == "" {
-						//无值,不更新
-					}else {
-						var buyerclass_new,buyerclass_old string
-						buyerclass_new = tmp["buyerclass"].(string)
-						buyerclass_old = oldTmp["buyerclass"].(string)
-						if buyerclass_old=="" {
-							oldTmp["buyerclass"] = buyerclass_new
-						}else {
-							if buyerclass_new!=buyerclass_old {
-								if !strings.Contains(buyerclass_old, buyerclass_new) {
-									oldTmp["buyerclass"] = buyerclass_old + ","+buyerclass_new //采购单位类型
+						tmpclass := make([]string, 0)
+						if tclasss, ok := rvmap["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpclass = append(tmpclass, vv[:len(vv)-1])
 								}
 							}
 						}
+						tmpContact["topscopeclass"] = strings.Join(tmpclass, ";")
+						tmpContact["updatetime"] = time.Now().Unix()
+						contactMaps = append(contactMaps, tmpContact)
 					}
-
+					(*oldTmp)["contact"] = contactMaps
 					//mongo更新
-					oldTmp["updatatime"] = time.Now().Unix()
+					(*oldTmp)["updatatime"] = time.Now().Unix()
 					FClient.DbName = Config["mgodb_extract_kf"]
 					if !FClient.UpdateById(Config["mgo_qyk_buyer"], esId, bson.M{"$set": oldTmp}) {
 						log.Println("存量  mongo更新 err", esId, oldTmp)
 					}
 					//es更新
-					delete(oldTmp, "_id")
+					delete((*oldTmp), "_id")
 					if _, err := EsConn.Update().Index(Config["elasticsearch_buyer_index"]).Type(Config["elasticsearch_buyer_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 						log.Println("存量 EsConn err :", err)
 					}
-					//最后删除redis
-					conn.Del(redisId)
 				}
 			}
 		}
@@ -250,19 +230,20 @@ func TaskBuyer(mapinfo *map[string]interface{}) {
 		overid := gtid
 		tmp := map[string]interface{}{}
 		for cursor.Next(&tmp) {
-			overid = tmp["_id"].(primitive.ObjectID).Hex()
+			overid = tmp["_id"].(bson.ObjectId).Hex()
 			//log.Println(tmp["_id"])
-			if tmp["buyer"] == nil || tmp["buyer"] == "" {
+			buyer, ok := tmp["buyer"].(string)
+			if !ok || utf8.RuneCountInString(buyer)<4{
 				continue
 			}
 			//redis查询是否存在
 			rdb := RedisPool.Get()
-			rdb.Do("SELECT","2")
-			if reply, err := redis.String(rdb.Do("GET", tmp["buyer"])); err != nil {
+			rdb.Do("SELECT", Config["redis_buyer_db"])
+			if reply, err := redis.String(rdb.Do("GET", buyer)); err != nil {
 				//redis不存在存到临时表,定时任务处理
 				FClient.DbName = Config["mgodb_extract_kf"]
-				if tmpid := FClient.Save("buyer_new", tmp); tmpid == nil {
-					log.Println("FClient.Save err", tmpid)
+				if err := FClient.SaveForOld("buyer_new", tmp); err!=nil {
+					log.Println("FClient.Save err", err,tmp)
 				}
 				//log.Println("get redis id err:定时任务处理", err, tmp)
 				if err := rdb.Close(); err != nil {
@@ -275,53 +256,54 @@ func TaskBuyer(mapinfo *map[string]interface{}) {
 				}
 				//拿到合并后的qyk
 				FClient.DbName = Config["mgodb_extract_kf"]
-				oldTmp := FClient.FindById(Config["mgo_qyk_buyer"], reply)
-				if oldTmp == nil {
+				oldTmp, b := FClient.FindById(Config["mgo_qyk_buyer"], reply, bson.M{})
+				if !b || oldTmp == nil {
 					log.Println("redis id 不存在")
 					continue
 				}
 				//比较合并
 				//行业类型
 				tmpTopscopeclass := []string{}
+				tmpConTopscopeclass := []string{}
 				tmpTopscopeclassMap := make(map[string]bool)
 
-
-				if v, ok := tmp["topscopeclass"].(primitive.A); ok {
+				if v, ok := tmp["topscopeclass"].([]interface{}); ok {
 					for _, vv := range v {
 						if vvv, ok := vv.(string); ok && len(vvv) > 1 {
 							tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
+							tmpConTopscopeclass = append(tmpConTopscopeclass, vvv[:len(vvv)-1])
 						}
 					}
-					for k := range tmpTopscopeclassMap {
-						tmpTopscopeclass = append(tmpTopscopeclass, k)
-					}
+				}
+				for k := range tmpTopscopeclassMap {
+					tmpTopscopeclass = append(tmpTopscopeclass, k)
 				}
 				sort.Strings(tmpTopscopeclass)
+				esId := (*oldTmp)["_id"].(bson.ObjectId).Hex()
 
-				esId := oldTmp["_id"].(primitive.ObjectID).Hex()
-
-				//更新行业类型 buyerclass合并
-				if tmp["buyerperson"] == nil || tmp["buyerperson"] == "" || Reg_xing.MatchString(util.ObjToString(tmp["buyerperson"])) {
 
-					//更新buyerclass合并
-					if tmp["buyerclass"] == nil || tmp["buyerclass"] == "" {
-						//无值,不更新
+				//更新buyerclass合并
+				if tmp["buyerclass"] == nil || tmp["buyerclass"] == "" {
+					//无值,不更新
+				}else {
+					var buyerclass_new,buyerclass_old string
+					buyerclass_new = tmp["buyerclass"].(string)
+					buyerclass_old = (*oldTmp)["buyerclass"].(string)
+					if buyerclass_old=="" {
+						(*oldTmp)["buyerclass"] = buyerclass_new
 					}else {
-						var buyerclass_new,buyerclass_old string
-						buyerclass_new = tmp["buyerclass"].(string)
-						buyerclass_old = oldTmp["buyerclass"].(string)
-						if buyerclass_old=="" {
-							oldTmp["buyerclass"] = buyerclass_new
-						}else {
-							if buyerclass_new!=buyerclass_old {
-								if !strings.Contains(buyerclass_old, buyerclass_new) {
-									oldTmp["buyerclass"] = buyerclass_old + ","+buyerclass_new //采购单位类型
-								}
+						if buyerclass_new!=buyerclass_old {
+							if !strings.Contains(buyerclass_old, buyerclass_new) {
+								(*oldTmp)["buyerclass"] = buyerclass_old + ","+buyerclass_new //采购单位类型
 							}
 						}
 					}
+				}
 
-					oldTmp["updatatime"] = time.Now().Unix()
+				//更新行业类型
+				if tmp["buyerperson"] == nil || tmp["buyerperson"] == "" || Reg_xing.MatchString(util.ObjToString(tmp["buyerperson"])) {
+
+					(*oldTmp)["updatatime"] = time.Now().Unix()
 					//mongo更新
 					FClient.DbName = Config["mgodb_extract_kf"]
 					if !FClient.UpdateById(Config["mgo_qyk_buyer"], esId, bson.M{"$set": oldTmp}) {
@@ -329,7 +311,7 @@ func TaskBuyer(mapinfo *map[string]interface{}) {
 					}
 
 					//es更新
-					delete(oldTmp, "_id")
+					delete((*oldTmp), "_id")
 					if _, err := EsConn.Update().Index(Config["elasticsearch_buyer_index"]).Type(Config["elasticsearch_buyer_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 						log.Println("update es err:", err)
 					}
@@ -337,113 +319,72 @@ func TaskBuyer(mapinfo *map[string]interface{}) {
 				}
 				//联系方式合并
 				var tmpperson, buyertel string
-				tmpperson = tmp["buyerperson"].(string)
-				if tmp["buyertel"] == nil || tmp["buyertel"] == "" {
+				if tmppersona, ok := tmp["buyerperson"].(string); ok {
+					tmpperson = tmppersona
+				}
+				if buyerteltmp, ok := tmp["buyertel"].(string); ok {
+					buyertel = buyerteltmp
+				}
+				if Reg_xing.MatchString(buyertel) || !Reg_tel.MatchString(buyertel) {
 					buyertel = ""
 				} else {
-					if Reg_xing.MatchString(util.ObjToString(tmp["buyertel"])) || !Reg_tel.MatchString(util.ObjToString(tmp["buyertel"])) {
-						buyertel = ""
-					} else {
-						buyertel = util.ObjToString(tmp["buyertel"])
-					}
+					buyertel = buyertel
 				}
 				contactMaps := make([]interface{}, 0)
-				if oldTmp["contact"] == nil {
-					tmpContact := make(map[string]interface{})
-					tmpContact["infoid"] = overid
-					tmpContact["contact_person"] = tmpperson
-					tmpContact["contact_type"] = "项目联系人"
-					tmpContact["phone"] = buyertel
-					tmpContact["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-					tmpContact["updatetime"] = time.Now().Unix()
-					contactMaps = append(contactMaps, tmpContact)
-				} else {
-					//对比前四项,相等丢弃
-					if v, ok := oldTmp["contact"].(primitive.A); ok {
-						var isNotUpdate bool
-						for _, vv := range v {
-							if vvv, ok := vv.(map[string]interface{}); ok {
-								if vvv["contact_person"] == tmpperson && vvv["contact_type"] == "项目联系人" &&
-									vvv["phone"] == buyertel && vvv["topscopeclass"] == strings.Join(tmpTopscopeclass, ";") {
-									isNotUpdate = true
-									vvv["updatetime"] = time.Now().Unix()
-								}
-								contactMaps = append(contactMaps, vvv)
-							}
-						}
-						if !isNotUpdate {
-							vvv := make(map[string]interface{})
-							vvv["infoid"] = overid
-							vvv["contact_person"] = tmp["buyerperson"]
-							vvv["contact_type"] = "项目联系人"
-							vvv["phone"] = buyertel
-							vvv["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-							vvv["updatetime"] = time.Now().Unix()
-							contactMaps = append(contactMaps, vvv)
-						}
+				if (*oldTmp)["contact"] != nil {
+					//直接添加联系人,不再判断
+					if v, ok := (*oldTmp)["contact"].([]interface{}); ok {
+						contactMaps = append(contactMaps, v...)
 					}
 				}
-				oldTmp["contact"] = contactMaps
-
-				//更新buyerclass合并
-				if tmp["buyerclass"] == nil || tmp["buyerclass"] == "" {
-					//无值,不更新
-				}else {
-					var buyerclass_new,buyerclass_old string
-					buyerclass_new = tmp["buyerclass"].(string)
-					buyerclass_old = oldTmp["buyerclass"].(string)
-					if buyerclass_old=="" {
-						oldTmp["buyerclass"] = buyerclass_new
-					}else {
-						if buyerclass_new!=buyerclass_old {
-							if !strings.Contains(buyerclass_old, buyerclass_new) {
-								oldTmp["buyerclass"] = buyerclass_old + ","+buyerclass_new //采购单位类型
-							}
-						}
-					}
-				}
-
+				vvv := make(map[string]interface{})
+				vvv["infoid"] = overid
+				vvv["contact_person"] = tmpperson
+				vvv["contact_type"] = "项目联系人"
+				vvv["phone"] = buyertel
+				vvv["topscopeclass"] = strings.Join(tmpConTopscopeclass, ";")
+				vvv["updatetime"] = time.Now().Unix()
+				contactMaps = append(contactMaps, vvv)
+				(*oldTmp)["contact"] = contactMaps
 				//mongo更新
-				oldTmp["updatatime"] = time.Now().Unix()
+				(*oldTmp)["updatatime"] = time.Now().Unix()
 				FClient.DbName = Config["mgodb_extract_kf"]
 				if !FClient.UpdateById(Config["mgo_qyk_buyer"], esId, bson.M{"$set": oldTmp}) {
 					log.Println("mongo更新 err", esId, oldTmp)
 				}
 				//es更新
-				delete(oldTmp, "_id")
+				delete((*oldTmp), "_id")
 				if _, err := EsConn.Update().Index(Config["elasticsearch_buyer_index"]).Type(Config["elasticsearch_buyer_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 					log.Println("EsConn err :", err)
 				}
 			}
 		}
+		SourceClient.DestoryMongoConn(SourceClientcc)
+
 		log.Println("增量合并执行完成 ok", gtid, lteid, overid)
 	}
 
 }
 
-
-
-//定时任务
+//定时任务  新增
 //1.存异常表
 //2.合并原始库新增
 func TimedTaskBuyer() {
 	//time.Sleep(time.Hour*70)
 	t2 := time.NewTimer(time.Second * 5)
 	for range t2.C {
-		Fcconn := FClient.GetMgoConn()
-		defer FClient.DestoryMongoConn(Fcconn)
+		Fcconn := FClient.GetMgoConn(86400)
 		tmpLast := map[string]interface{}{}
 		if iter := Fcconn.DB(Config["mgodb_extract_kf"]).C("buyer_new").Find(bson.M{}).Sort("-_id").Limit(1).Iter(); iter != nil {
 			if !iter.Next(&tmpLast) {
 				//临时表无数据
 				log.Println("临时表无数据:")
-				//t2.Reset(time.Second * 10) //增量
-				t2.Reset(time.Minute * 5) //存量
+				t2.Reset(time.Minute * 5)
+				FClient.DestoryMongoConn(Fcconn)
 				continue
 			} else {
 				log.Println("临时表有数据:", tmpLast)
-				fconn := FClient.GetMgoConn()
-				defer FClient.DestoryMongoConn(fconn)
+				fconn := FClient.GetMgoConn(86400)
 				cursor := fconn.DB(Config["mgodb_extract_kf"]).C("buyer_new").Find(bson.M{
 					"_id": bson.M{
 						"$lte": tmpLast["_id"],
@@ -452,22 +393,24 @@ func TimedTaskBuyer() {
 				if cursor == nil {
 					log.Println("查询失败")
 					t2.Reset(time.Second * 5)
+					FClient.DestoryMongoConn(fconn)
 					continue
 				}
 				//遍历临时表数据,匹配不到原始库存入异常表
 				tmp := make(map[string]interface{})
 				for cursor.Next(&tmp) {
-					tmpId := tmp["_id"].(primitive.ObjectID).Hex()
+					tmpId := tmp["_id"].(bson.ObjectId).Hex()
 					//再重新查找redis,存在发udp处理,不存在走新增合并
 					rdb := RedisPool.Get()
-					rdb.Do("SELECT","2")
+					rdb.Do("SELECT", Config["redis_buyer_db"])
 					if _, err := redis.String(rdb.Do("GET", tmp["buyer"])); err == nil {
-						//{"gtid":"57d7ad2f61a0721f152d2ad5","lteid":"5e20968d85a9271abf0ad6c2","stype":""}
 						//redis存在发送udp进行处理
 						by, _ := json.Marshal(map[string]interface{}{
-							"gtid":  tmpId,
-							"lteid": tmpId,
-							"stype": "",
+							"gtid":      tmpId,
+							"lteid":     tmpId,
+							"stype":     "",
+							"data_type": "buyer",
+							"data_info": "add",
 						})
 						if e := udpclient.WriteUdp(by, mu.OP_TYPE_DATA, &net.UDPAddr{
 							IP:   net.ParseIP("127.0.0.1"),
@@ -477,7 +420,7 @@ func TimedTaskBuyer() {
 						}
 						//存在的话删除tmp mongo表
 						FClient.DbName = Config["mgodb_extract_kf"]
-						if DeletedCount := FClient.DeleteById("buyer_new", tmpId); DeletedCount == 0 {
+						if DeletedCount := FClient.Del("buyer_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !DeletedCount {
 							log.Println("删除临时表err:", DeletedCount)
 						}
 						if err := rdb.Close(); err != nil {
@@ -491,34 +434,33 @@ func TimedTaskBuyer() {
 					}
 					//查询redis不存在新增
 					FClient.DbName = Config["mgodb_enterprise"]
-					//qyxy 企业库 两亿条
-					resulttmp := FClient.FindOne(Config["mgodb_enterprise_c"], bson.M{"company_name": tmp["buyer"]})
-					if resulttmp["_id"] == nil {
+
+					resulttmp, b := FClient.FindOne(Config["mgodb_enterprise_c"], bson.M{"company_name": tmp["buyer"]})
+					if !b || (*resulttmp)["_id"] == nil {
 						//log.Println(r)
 						//匹配不到原始库,存入异常表删除临时表
 						FClient.DbName = Config["mgodb_extract_kf"]
-						if saveid := FClient.Save("buyer_err", tmp); saveid == nil {
-							log.Println("存入异常表错误", tmp)
+						if err := FClient.SaveForOld("buyer_err", tmp); err != nil {
+							log.Println("存入异常表错误", err, tmp)
 						}
-						FClient.DbName = Config["mgodb_extract_kf"]
-						if deleteNum := FClient.DeleteById("buyer_new", tmpId); deleteNum == 0 {
+						if deleteNum := FClient.Del("buyer_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !b {
 							log.Println("删除临时表错误", deleteNum)
 						}
 						continue
 					} else {
 						//log.Println(123)
 						//匹配到原始库,新增 resulttmp
-						if resulttmp["credit_no"] != nil {
-							if credit_no, ok := resulttmp["credit_no"].(string); ok && strings.TrimSpace(credit_no) != "" &&
+						if (*resulttmp)["credit_no"] != nil {
+							if credit_no, ok := (*resulttmp)["credit_no"].(string); ok && strings.TrimSpace(credit_no) != "" &&
 								len(strings.TrimSpace(credit_no)) > 8 {
 								dataNo := strings.TrimSpace(credit_no)[2:8]
 								if Addrs[dataNo] != nil {
 									if v, ok := Addrs[dataNo].(map[string]interface{}); ok {
-										if resulttmp["province"] == nil || resulttmp["province"] == "" {
-											resulttmp["province"] = v["province"]
+										if (*resulttmp)["province"] == nil || (*resulttmp)["province"] == "" {
+											(*resulttmp)["province"] = v["province"]
 										}
-										resulttmp["city"] = v["city"]
-										resulttmp["district"] = v["district"]
+										(*resulttmp)["city"] = v["city"]
+										(*resulttmp)["district"] = v["district"]
 
 									}
 								}
@@ -526,15 +468,15 @@ func TimedTaskBuyer() {
 						}
 						contacts := make([]map[string]interface{}, 0)
 						contact := make(map[string]interface{}, 0)
-						if resulttmp["legal_person"] != nil {
-							contact["contact_person"] = resulttmp["legal_person"] //联系人
+						if (*resulttmp)["legal_person"] != nil {
+							contact["contact_person"] = (*resulttmp)["legal_person"] //联系人
 						} else {
 							contact["contact_person"] = "" //联系人
 						}
 						contact["contact_type"] = "法定代表人" //法定代表人
 						//log.Println(1)
-						if resulttmp["annual_reports"] != nil {
-							bytes, err := json.Marshal(resulttmp["annual_reports"])
+						if (*resulttmp)["annual_reports"] != nil {
+							bytes, err := json.Marshal((*resulttmp)["annual_reports"])
 							if err != nil {
 								log.Println("annual_reports err:", err)
 							}
@@ -566,24 +508,50 @@ func TimedTaskBuyer() {
 						contact["updatetime"] = time.Now().Unix() //更新时间
 						contact["infoid"] = ""                    //招标信息id
 						contacts = append(contacts, contact)
-						resulttmp["contact"] = contacts
+						//添加临时表匹配到的联系人
+						vvv := make(map[string]interface{})
+						vvv["infoid"] = tmp["_id"].(bson.ObjectId).Hex()
+						if tmp["buyerperson"] != nil {
+							vvv["contact_person"] = tmp["buyerperson"]
+						} else {
+							vvv["contact_person"] = ""
+						}
+						vvv["contact_type"] = "项目联系人"
+						//	"buyer": 1, "buyertel": 1, "buyerperson": 1, "topscopeclass": 1 buyerclass : 1
+						if tmp["buyertel"] != nil {
+							vvv["phone"] = tmp["buyertel"]
+						} else {
+							vvv["phone"] = ""
+						}
+						tmpclass := make([]string, 0)
+						if tclasss, ok := tmp["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpclass = append(tmpclass, vv[:len(vv)-1])
+								}
+							}
+						}
+						vvv["topscopeclass"] = strings.Join(tmpclass, ";")
+						vvv["updatetime"] = time.Now().Unix()
+						contacts = append(contacts, vvv)
+						(*resulttmp)["contact"] = contacts
 
 						savetmp := make(map[string]interface{}, 0)
 						for _, sk := range BuyerFields {
 							if sk == "_id" {
-								savetmp["tmp"+sk] = resulttmp[sk]
+								savetmp["tmp"+sk] = (*resulttmp)[sk]
 								continue
 							} else if sk == "area_code" {
 								//行政区划代码
-								savetmp[sk] = fmt.Sprint(resulttmp[sk])
+								savetmp[sk] = fmt.Sprint((*resulttmp)[sk])
 								continue
 							} else if sk == "report_websites" {
 								//网址
-								if resulttmp["report_websites"] == nil {
+								if (*resulttmp)["report_websites"] == nil {
 									savetmp["website"] = ""
 								} else {
 									report_websitesArr := []string{}
-									if ppms, ok := resulttmp[sk].(primitive.A); ok {
+									if ppms, ok := (*resulttmp)[sk].([]interface{}); ok {
 										for _, v := range ppms {
 											if vvv, ok := v.(map[string]interface{}); ok {
 												if rv, ok := vvv["website_url"].(string); ok {
@@ -599,46 +567,45 @@ func TimedTaskBuyer() {
 							} else if sk == "wechat_accounts" {
 								savetmp[sk] = []interface{}{}
 								continue
-							}else if sk=="buyer_name" {
-								if resulttmp["company_name"] == nil {
+							} else if sk == "buyer_name" {
+								if (*resulttmp)["company_name"] == nil {
 									savetmp[sk] = ""
-								}else {
-									savetmp[sk] = resulttmp["company_name"]
+								} else {
+									savetmp[sk] = (*resulttmp)["company_name"]
 								}
 								continue
-							}else if sk=="address"{
-								if resulttmp["company_address"] == nil {
+							} else if sk == "address" {
+								if (*resulttmp)["company_address"] == nil {
 									savetmp[sk] = ""
-								}else {
-									savetmp[sk] = resulttmp["company_address"]
+								} else {
+									savetmp[sk] = (*resulttmp)["company_address"]
 								}
 								continue
 							}
 
-
-
-							if resulttmp[sk] == nil && sk != "history_name" && sk != "wechat_accounts" &&
+							if (*resulttmp)[sk] == nil && sk != "history_name" && sk != "wechat_accounts" &&
 								sk != "buyer_name" && sk != "address" &&
 								sk != "contact" && sk != "report_websites" {
 								savetmp[sk] = ""
 							} else {
-								savetmp[sk] = resulttmp[sk]
+								savetmp[sk] = (*resulttmp)[sk]
 							}
 						}
 						//tmps = append(tmps, savetmp)
 						savetmp["updatatime"] = time.Now().Unix()
 						//保存mongo
 						FClient.DbName = Config["mgodb_extract_kf"]
+
 						saveid := FClient.Save(Config["mgo_qyk_buyer"], savetmp)
-						if saveid != nil {
+						if saveid != "" {
 							//保存redis
 							rc := RedisPool.Get()
-							rc.Do("SELECT","2")
-							var _id string
-							if v, ok := saveid.(primitive.ObjectID); ok {
-								_id = v.Hex()
-							}
-							if _, err := rc.Do("SET", savetmp["buyer_name"], _id); err != nil {
+							rc.Do("SELECT", Config["redis_buyer_db"])
+							//var _id string
+							//if v, ok := saveid.(primitive.ObjectID); ok {
+							//	_id = v.Hex()
+							//}
+							if _, err := rc.Do("SET", savetmp["buyer_name"], saveid); err != nil {
 								log.Println("save redis err:", tmp["_id"], savetmp["_id"], savetmp["buyer_name"], err)
 								if err := rc.Close(); err != nil {
 									log.Println(err)
@@ -652,12 +619,12 @@ func TimedTaskBuyer() {
 
 								//esConn := elastic.GetEsConn()
 								//defer elastic.DestoryEsConn(esConn)
-								if _, err := EsConn.Index().Index(Config["elasticsearch_buyer_index"]).Type(Config["elasticsearch_buyer_type"]).Id(_id).BodyJson(savetmp).Refresh(true).Do(); err != nil {
+								if _, err := EsConn.Index().Index(Config["elasticsearch_buyer_index"]).Type(Config["elasticsearch_buyer_type"]).Id(saveid).BodyJson(savetmp).Refresh(true).Do(); err != nil {
 									log.Println("save es err :", tmp["_id"], savetmp["_id"], err)
 								} else {
 									//删除临时表
 									FClient.DbName = Config["mgodb_extract_kf"]
-									if deleteNum := FClient.DeleteById("buyer_new", tmpId); deleteNum == 0 {
+									if deleteNum := FClient.Del("buyer_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !deleteNum {
 										log.Println("删除临时表失败", deleteNum)
 									}
 								}
@@ -666,9 +633,12 @@ func TimedTaskBuyer() {
 							log.Println("save mongo err:", saveid, tmp["_id"])
 						}
 					}
+
 				}
+				FClient.DestoryMongoConn(fconn)
 			}
 		}
+		FClient.DestoryMongoConn(Fcconn)
 		t2.Reset(time.Minute)
 	}
-}
+}

+ 226 - 254
udp_winner/timedTaskWinner.go

@@ -4,7 +4,6 @@ import (
 	"encoding/json"
 	"fmt"
 	"github.com/garyburd/redigo/redis"
-	"go.mongodb.org/mongo-driver/bson/primitive"
 	"gopkg.in/mgo.v2/bson"
 	"log"
 	mu "mfw/util"
@@ -14,6 +13,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	"unicode/utf8"
 )
 
 //之前main方法,只更新
@@ -26,51 +26,68 @@ func TaskWinner(mapinfo *map[string]interface{}) {
 		log.Println(gtid, lteid, "参数错误")
 		return
 	}
-	GId, err := primitive.ObjectIDFromHex(gtid)
-	LtId, err2 := primitive.ObjectIDFromHex(lteid)
-	if err != nil || err2 != nil {
-		log.Println(gtid, lteid, "转换_id错误")
+	var GId, LtId bson.ObjectId
+	if bson.IsObjectIdHex(gtid) && bson.IsObjectIdHex(lteid) {
+		GId = bson.ObjectIdHex(gtid)
+		LtId = bson.ObjectIdHex(lteid)
+	} else {
+		log.Println(gtid, lteid, "不是Objectid,转换_id错误", gtid, lteid)
 		return
 	}
 	//udp的id区间查询bidding  中标人 中标联系人 中标联系电话
 	// topscopeclass项目类型-industry行业类型&&topscopeclass联系人项目类型
 	// (area地区-province省份 city城市-city城市 district区县-district区县)
 	// winneraddr-company_address企业地址
-	SourceClientcc := SourceClient.GetMgoConn()
-	defer SourceClient.DestoryMongoConn(SourceClientcc)
+	SourceClientcc := SourceClient.GetMgoConn(86400)
 	cursor := SourceClientcc.DB(Config["mgodb_bidding"]).C(Config["mgodb_mgoinit_c"]).Find(bson.M{
 		"_id": bson.M{
 			"$gte": GId,
 			"$lte": LtId,
 		},
-	}).Select(bson.M{"winner": 1, "winnertel": 1, "winnerperson": 1,
-		"topscopeclass": 1, "winneraddr": 1}).Iter()
-	if cursor == nil {
-		log.Println(cursor)
+	}).Select(bson.M{"winner": 1, "winnertel": 1, "winnerperson": 1, "topscopeclass": 1, "winneraddr": 1}).Iter()
+
+	if cursor.Err() != nil {
+		SourceClient.DestoryMongoConn(SourceClientcc)
+		log.Println(cursor.Err())
 		return
 	}
 	//判断是否是存量,是存量走Redis遍历
 	if v, ok := (*mapinfo)["data_info"].(string); ok && v == "save" {
 		//存量处理
-		tmp := map[string]interface{}{}
 		conn := HisRedisPool.Conn()
 		defer conn.Close()
 		//选择redis db
 		redis_winner_db, _ := strconv.Atoi(Config["redis_winner_db"])
 		conn.Select(redis_winner_db)
 		//遍历bidding表保存到redis
-		// key:_id  value:json结构体
+		//key:企业名  value:json结构体{"winner": 1, "winnertel": 1, "winnerperson": 1,"topscopeclass": 1, "winneraddr": 1,"_id":1}
+		tmp := make(map[string]interface{})
 		for cursor.Next(&tmp) {
-			if tmp["winner"] == nil || tmp["winner"] == "" {
+			winner, ok := tmp["winner"].(string)
+			if !ok ||utf8.RuneCountInString(winner)<4 {
 				continue
 			}
-			mgoId := tmp["_id"].(primitive.ObjectID).Hex()
-			delete(tmp, "_id")
-			bytes, _ := json.Marshal(tmp)
-			if err := conn.Set(mgoId, string(bytes), 0).Err(); err != nil {
+			//判断redis key是否存在
+			e_num := conn.Exists(winner).Val()
+			//获取字符串_id
+			mgoId := tmp["_id"].(bson.ObjectId).Hex()
+			//替换_id
+			tmp["_id"] = mgoId
+			//创建value数组
+			tmps := make([]map[string]interface{}, 0)
+			if e_num > 0 {
+				//存量redis的key存在,累加更新
+				bytes, _ := conn.Get(winner).Bytes()
+				json.Unmarshal(bytes, &tmps)
+			}
+			tmps = append(tmps, tmp)
+			bytes, _ := json.Marshal(tmps)
+			//存量redis的key不存在,新增  key :企业名 val :[]map
+			if err := conn.Set(winner, string(bytes), 0).Err(); err != nil {
 				log.Println(err)
 			}
 		}
+		SourceClient.DestoryMongoConn(SourceClientcc)
 		//遍历redis
 		if scan := conn.Scan(0, "", 100); scan.Err() != nil {
 			log.Println(scan.Err())
@@ -78,166 +95,122 @@ func TaskWinner(mapinfo *map[string]interface{}) {
 		} else {
 			iterator := scan.Iterator()
 			for iterator.Next() {
-				redisId := iterator.Val()                    //redis key
-				redisvalue := conn.Get(iterator.Val()).Val() //redis val
-				tmp := make(map[string]interface{})
-				json.Unmarshal([]byte(redisvalue), &tmp)
-				//重复增量操作
+				redisCName := iterator.Val()                       //redis key 企业名
+				redisvalueBytes, _ := conn.Get(redisCName).Bytes() //redis val []数组
+				rValuesMaps := make([]map[string]interface{}, 0)
+				json.Unmarshal(redisvalueBytes, &rValuesMaps)
 				//redis查询是否存在
 				rdb := RedisPool.Get()
 				rdb.Do("SELECT", Config["redis_winner_db"])
-				if reply, err := redis.String(rdb.Do("GET", tmp["winner"])); err != nil {
+				if reply, err := redis.String(rdb.Do("GET", redisCName)); err != nil {
 					//redis不存在,存到临时表,定时任务处理
 					FClient.DbName = Config["mgodb_extract_kf"]
-					if tmpid := FClient.Save("winner_new", tmp); tmpid == nil {
-						log.Println("存量 FClient.Save err", tmpid)
+					//if tmpid := FClient.Save("winner_new", tmps); tmpid == nil {
+					//	log.Println("存量 FClient.Save err", tmpid)
+					//}
+					for _, vmap := range rValuesMaps {
+						vmap["_id"] = bson.ObjectIdHex(vmap["_id"].(string))
+						if err = FClient.SaveForOld("winner_new", vmap); err != nil {
+							log.Println("存量 FClient.Save err", err, vmap)
+						}
 					}
 					//log.Println("get redis id err:定时任务处理", err, tmp)
 					if err := rdb.Close(); err != nil {
 						log.Println("存量", err)
 					}
-					//删除存量redis
-					conn.Del(redisId)
 					continue
 				} else {
+					//redis存在更新合并
 					if err := rdb.Close(); err != nil {
 						log.Println(err)
 					}
 					//拿到合并后的qyk
 					FClient.DbName = Config["mgodb_extract_kf"]
-					oldTmp := FClient.FindById(Config["mgo_qyk_c"], reply)
-					if oldTmp == nil {
-						log.Println("存量 redis id 不存在", reply, tmp["winner"])
+					oldTmp, b := FClient.FindById(Config["mgo_qyk_c"], reply, nil)
+					if !b || oldTmp == nil {
+						log.Println(redisCName, "存量 redis id 不存在", reply)
 						continue
 					}
 					tmpTopscopeclass := []string{}
 					tmpTopscopeclassMap := make(map[string]bool)
 
-					if oldTmp["industry"] == nil {
-						if v, ok := tmp["topscopeclass"].(primitive.A); ok {
-							for _, vv := range v {
-								if vvv, ok := vv.(string); ok && len(vvv) > 1 {
-									tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
-								}
-							}
-							for k := range tmpTopscopeclassMap {
-								tmpTopscopeclass = append(tmpTopscopeclass, k)
-							}
-						}
-					} else {
-						if v, ok := oldTmp["industry"].(primitive.A); ok {
+					if (*oldTmp)["industry"] != nil {
+						if v, ok := (*oldTmp)["industry"].([]interface{}); ok {
 							for _, vv := range v {
 								if vvv, ok := vv.(string); ok {
 									tmpTopscopeclassMap[vvv] = true
 								}
 							}
 						}
-						if v, ok := tmp["topscopeclass"].(primitive.A); ok {
-							for _, vv := range v {
-								if vvv, ok := vv.(string); ok && len(vvv) > 1 {
-									tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
+					}
+					for _, rvaluemaps := range rValuesMaps {
+						if tclasss, ok := rvaluemaps["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpTopscopeclassMap[vv[:len(vv)-1]] = true
 								}
 							}
-							for k := range tmpTopscopeclassMap {
-								tmpTopscopeclass = append(tmpTopscopeclass, k)
-							}
 						}
 					}
+					for k := range tmpTopscopeclassMap {
+						tmpTopscopeclass = append(tmpTopscopeclass, k)
+					}
 					sort.Strings(tmpTopscopeclass)
-					oldTmp["industry"] = tmpTopscopeclass
-					esId := oldTmp["_id"].(primitive.ObjectID).Hex()
-					//更新行业类型
-					if tmp["winnerperson"] == nil || tmp["winnerperson"] == "" || Reg_xing.MatchString(util.ObjToString(tmp["winnerperson"])) {
-						oldTmp["updatatime"] = time.Now().Unix()
-						//mongo更新
-						FClient.DbName = Config["mgodb_extract_kf"]
-						if !FClient.UpdateById(Config["mgo_qyk_c"], esId, bson.M{"$set": oldTmp}) {
-							log.Println("mongo更新err", esId)
-						}
-
-						//es更新
-						delete(oldTmp, "_id")
-						if _, err := EsConn.Update().Index(Config["elasticsearch_index"]).Type(Config["elasticsearch_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
-							log.Println("update es err:", err)
+					(*oldTmp)["industry"] = tmpTopscopeclass
+					esId := (*oldTmp)["_id"].(bson.ObjectId).Hex()
+					//联系方式合并
+					contactMaps := make([]interface{}, 0)
+					if (*oldTmp)["contact"] != nil {
+						//直接添加联系人,不再判断
+						if v, ok := (*oldTmp)["contact"].([]interface{}); ok {
+							contactMaps = append(contactMaps, v...)
 						}
-						//删除存量redis
-						conn.Del(redisId)
-						continue
 					}
-					//联系方式合并
-					var tmpperson, winnertel string
-					tmpperson = tmp["winnerperson"].(string)
-					if tmp["winnertel"] == nil || tmp["winnertel"] == "" {
-						winnertel = ""
-					} else {
-						if Reg_xing.MatchString(util.ObjToString(tmp["winnertel"])) || !Reg_tel.MatchString(util.ObjToString(tmp["winnertel"])) {
-							winnertel = ""
+					//遍历redis value联系人
+					for _, rvmap := range rValuesMaps {
+						var tmpperson, winnertel string
+						if rvmapperson, ok := rvmap["winnerperson"].(string); ok && rvmapperson != "" {
+							tmpperson = rvmapperson
 						} else {
-							winnertel = util.ObjToString(tmp["winnertel"])
+							continue
+						}
+						if rvmapwintel, ok := rvmap["winnertel"].(string); ok {
+							winnertel = rvmapwintel
+						} else {
+							winnertel = ""
+						}
+						if Reg_xing.MatchString(winnertel) || !Reg_tel.MatchString(winnertel) {
+							winnertel = ""
 						}
-					}
-					contactMaps := make([]interface{}, 0)
-					if oldTmp["contact"] == nil {
 						tmpContact := make(map[string]interface{})
-						tmpContact["infoid"] = redisId
+						tmpContact["infoid"] = rvmap["_id"]
 						tmpContact["contact_person"] = tmpperson
 						tmpContact["contact_type"] = "项目联系人"
 						tmpContact["phone"] = winnertel
-						tmpContact["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-						tmpContact["updatetime"] = time.Now().Unix()
-						contactMaps = append(contactMaps, tmpContact)
-					} else {
-						//对比前四项,相等丢弃
-						/*if v, ok := oldTmp["contact"].(primitive.A); ok {
-							var isNotUpdate bool
-							for _, vv := range v {
-								if vvv, ok := vv.(map[string]interface{}); ok {
-									if vvv["contact_person"] == tmpperson && vvv["contact_type"] == "项目联系人" &&
-										vvv["phone"] == winnertel && vvv["topscopeclass"] == strings.Join(tmpTopscopeclass, ";") {
-										isNotUpdate = true
-										vvv["updatetime"] = time.Now().Unix()
-									}
-									contactMaps = append(contactMaps, vvv)
+						tmpclass := make([]string, 0)
+						if tclasss, ok := rvmap["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpclass = append(tmpclass, vv[:len(vv)-1])
 								}
 							}
-							if !isNotUpdate {
-								vvv := make(map[string]interface{})
-								vvv["infoid"] = redisId
-								vvv["contact_person"] = tmp["winnerperson"]
-								vvv["contact_type"] = "项目联系人"
-								vvv["phone"] = winnertel
-								vvv["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-								vvv["updatetime"] = time.Now().Unix()
-								contactMaps = append(contactMaps, vvv)
-							}
-						}*/
-						//直接添加联系人,不再判断
-						if v, ok := oldTmp["contact"].(primitive.A); ok {
-							contactMaps = append(contactMaps, v...)
 						}
-						vvv := make(map[string]interface{})
-						vvv["infoid"] = redisId
-						vvv["contact_person"] = tmp["winnerperson"]
-						vvv["contact_type"] = "项目联系人"
-						vvv["phone"] = winnertel
-						vvv["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-						vvv["updatetime"] = time.Now().Unix()
-						contactMaps = append(contactMaps, vvv)
+						tmpContact["topscopeclass"] = strings.Join(tmpclass, ";")
+						tmpContact["updatetime"] = time.Now().Unix()
+						contactMaps = append(contactMaps, tmpContact)
 					}
-					oldTmp["contact"] = contactMaps
+					(*oldTmp)["contact"] = contactMaps
 					//mongo更新
-					oldTmp["updatatime"] = time.Now().Unix()
+					(*oldTmp)["updatatime"] = time.Now().Unix()
 					FClient.DbName = Config["mgodb_extract_kf"]
 					if !FClient.UpdateById(Config["mgo_qyk_c"], esId, bson.M{"$set": oldTmp}) {
 						log.Println("存量  mongo更新 err", esId, oldTmp)
 					}
 					//es更新
-					delete(oldTmp, "_id")
+					delete((*oldTmp), "_id")
 					if _, err := EsConn.Update().Index(Config["elasticsearch_index"]).Type(Config["elasticsearch_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 						log.Println("存量 EsConn err :", err)
 					}
-					//最后删除redis
-					conn.Del(redisId)
 				}
 			}
 		}
@@ -248,19 +221,20 @@ func TaskWinner(mapinfo *map[string]interface{}) {
 		overid := gtid
 		tmp := map[string]interface{}{}
 		for cursor.Next(&tmp) {
-			overid = tmp["_id"].(primitive.ObjectID).Hex()
-			log.Println(tmp["_id"])
-			if tmp["winner"] == nil || tmp["winner"] == "" {
+			overid = tmp["_id"].(bson.ObjectId).Hex()
+			//log.Println(tmp["_id"])
+			winner, ok := tmp["winner"].(string)
+			if !ok || utf8.RuneCountInString(winner) < 4 {
 				continue
 			}
 			//redis查询是否存在
 			rdb := RedisPool.Get()
 			rdb.Do("SELECT", Config["redis_winner_db"])
-			if reply, err := redis.String(rdb.Do("GET", tmp["winner"])); err != nil {
+			if reply, err := redis.String(rdb.Do("GET", winner)); err != nil {
 				//redis不存在存到临时表,定时任务处理
 				FClient.DbName = Config["mgodb_extract_kf"]
-				if tmpid := FClient.Save("winner_new", tmp); tmpid == nil {
-					log.Println("FClient.Save err", tmpid)
+				if err := FClient.SaveForOld("winner_new", tmp); err != nil {
+					log.Println("FClient.Save err", err, tmp)
 				}
 				//log.Println("get redis id err:定时任务处理", err, tmp)
 				if err := rdb.Close(); err != nil {
@@ -273,53 +247,44 @@ func TaskWinner(mapinfo *map[string]interface{}) {
 				}
 				//拿到合并后的qyk
 				FClient.DbName = Config["mgodb_extract_kf"]
-				oldTmp := FClient.FindById(Config["mgo_qyk_c"], reply)
-				if oldTmp == nil {
+				oldTmp, b := FClient.FindById(Config["mgo_qyk_c"], reply, bson.M{})
+				if !b || oldTmp == nil {
 					log.Println("redis id 不存在")
 					continue
 				}
 				//比较合并
 				//行业类型
 				tmpTopscopeclass := []string{}
+				tmpConTopscopeclass := []string{}
 				tmpTopscopeclassMap := make(map[string]bool)
 
-				if oldTmp["industry"] == nil {
-					if v, ok := tmp["topscopeclass"].(primitive.A); ok {
-						for _, vv := range v {
-							if vvv, ok := vv.(string); ok && len(vvv) > 1 {
-								tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
-							}
-						}
-						for k := range tmpTopscopeclassMap {
-							tmpTopscopeclass = append(tmpTopscopeclass, k)
-						}
-					}
-				} else {
-					if v, ok := oldTmp["industry"].(primitive.A); ok {
+				if (*oldTmp)["industry"] != nil {
+					if v, ok := (*oldTmp)["industry"].([]interface{}); ok {
 						for _, vv := range v {
 							if vvv, ok := vv.(string); ok {
 								tmpTopscopeclassMap[vvv] = true
 							}
 						}
 					}
-					if v, ok := tmp["topscopeclass"].(primitive.A); ok {
-						for _, vv := range v {
-							if vvv, ok := vv.(string); ok && len(vvv) > 1 {
-								tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
-							}
-						}
-						for k := range tmpTopscopeclassMap {
-							tmpTopscopeclass = append(tmpTopscopeclass, k)
+				}
+				if v, ok := tmp["topscopeclass"].([]interface{}); ok {
+					for _, vv := range v {
+						if vvv, ok := vv.(string); ok && len(vvv) > 1 {
+							tmpTopscopeclassMap[vvv[:len(vvv)-1]] = true
+							tmpConTopscopeclass = append(tmpConTopscopeclass, vvv[:len(vvv)-1])
 						}
 					}
 				}
+				for k := range tmpTopscopeclassMap {
+					tmpTopscopeclass = append(tmpTopscopeclass, k)
+				}
 				sort.Strings(tmpTopscopeclass)
-				oldTmp["industry"] = tmpTopscopeclass
+				(*oldTmp)["industry"] = tmpTopscopeclass
 
-				esId := oldTmp["_id"].(primitive.ObjectID).Hex()
+				esId := (*oldTmp)["_id"].(bson.ObjectId).Hex()
 				//更新行业类型
 				if tmp["winnerperson"] == nil || tmp["winnerperson"] == "" || Reg_xing.MatchString(util.ObjToString(tmp["winnerperson"])) {
-					oldTmp["updatatime"] = time.Now().Unix()
+					(*oldTmp)["updatatime"] = time.Now().Unix()
 					//mongo更新
 					FClient.DbName = Config["mgodb_extract_kf"]
 					if !FClient.UpdateById(Config["mgo_qyk_c"], esId, bson.M{"$set": oldTmp}) {
@@ -327,7 +292,7 @@ func TaskWinner(mapinfo *map[string]interface{}) {
 					}
 
 					//es更新
-					delete(oldTmp, "_id")
+					delete((*oldTmp), "_id")
 					if _, err := EsConn.Update().Index(Config["elasticsearch_index"]).Type(Config["elasticsearch_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 						log.Println("update es err:", err)
 					}
@@ -335,78 +300,47 @@ func TaskWinner(mapinfo *map[string]interface{}) {
 				}
 				//联系方式合并
 				var tmpperson, winnertel string
-				tmpperson = tmp["winnerperson"].(string)
-				if tmp["winnertel"] == nil || tmp["winnertel"] == "" {
+				if tmppersona, ok := tmp["winnerperson"].(string); ok {
+					tmpperson = tmppersona
+				}
+				if winnerteltmp, ok := tmp["winnertel"].(string); ok {
+					winnertel = winnerteltmp
+				}
+				if Reg_xing.MatchString(winnertel) || !Reg_tel.MatchString(winnertel) {
 					winnertel = ""
 				} else {
-					if Reg_xing.MatchString(util.ObjToString(tmp["winnertel"])) || !Reg_tel.MatchString(util.ObjToString(tmp["winnertel"])) {
-						winnertel = ""
-					} else {
-						winnertel = util.ObjToString(tmp["winnertel"])
-					}
+					winnertel = winnertel
 				}
 				contactMaps := make([]interface{}, 0)
-				if oldTmp["contact"] == nil {
-					tmpContact := make(map[string]interface{})
-					tmpContact["infoid"] = overid
-					tmpContact["contact_person"] = tmpperson
-					tmpContact["contact_type"] = "项目联系人"
-					tmpContact["phone"] = winnertel
-					tmpContact["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-					tmpContact["updatetime"] = time.Now().Unix()
-					contactMaps = append(contactMaps, tmpContact)
-				} else {
-					//对比前四项,相等丢弃
-					/*if v, ok := oldTmp["contact"].(primitive.A); ok {
-						var isNotUpdate bool
-						for _, vv := range v {
-							if vvv, ok := vv.(map[string]interface{}); ok {
-								if vvv["contact_person"] == tmpperson && vvv["contact_type"] == "项目联系人" &&
-									vvv["phone"] == winnertel && vvv["topscopeclass"] == strings.Join(tmpTopscopeclass, ";") {
-									isNotUpdate = true
-									vvv["updatetime"] = time.Now().Unix()
-								}
-								contactMaps = append(contactMaps, vvv)
-							}
-						}
-						if !isNotUpdate {
-							vvv := make(map[string]interface{})
-							vvv["infoid"] = overid
-							vvv["contact_person"] = tmp["winnerperson"]
-							vvv["contact_type"] = "项目联系人"
-							vvv["phone"] = winnertel
-							vvv["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-							vvv["updatetime"] = time.Now().Unix()
-							contactMaps = append(contactMaps, vvv)
-						}
-					}*/
+				if (*oldTmp)["contact"] != nil {
 					//直接添加联系人,不再判断
-					if v, ok := oldTmp["contact"].(primitive.A); ok {
+					if v, ok := (*oldTmp)["contact"].([]interface{}); ok {
 						contactMaps = append(contactMaps, v...)
 					}
-					vvv := make(map[string]interface{})
-					vvv["infoid"] = overid
-					vvv["contact_person"] = tmp["winnerperson"]
-					vvv["contact_type"] = "项目联系人"
-					vvv["phone"] = winnertel
-					vvv["topscopeclass"] = strings.Join(tmpTopscopeclass, ";")
-					vvv["updatetime"] = time.Now().Unix()
-					contactMaps = append(contactMaps, vvv)
 				}
-				oldTmp["contact"] = contactMaps
+				vvv := make(map[string]interface{})
+				vvv["infoid"] = overid
+				vvv["contact_person"] = tmpperson
+				vvv["contact_type"] = "项目联系人"
+				vvv["phone"] = winnertel
+				vvv["topscopeclass"] = strings.Join(tmpConTopscopeclass, ";")
+				vvv["updatetime"] = time.Now().Unix()
+				contactMaps = append(contactMaps, vvv)
+				(*oldTmp)["contact"] = contactMaps
 				//mongo更新
-				oldTmp["updatatime"] = time.Now().Unix()
+				(*oldTmp)["updatatime"] = time.Now().Unix()
 				FClient.DbName = Config["mgodb_extract_kf"]
 				if !FClient.UpdateById(Config["mgo_qyk_c"], esId, bson.M{"$set": oldTmp}) {
 					log.Println("mongo更新 err", esId, oldTmp)
 				}
 				//es更新
-				delete(oldTmp, "_id")
+				delete((*oldTmp), "_id")
 				if _, err := EsConn.Update().Index(Config["elasticsearch_index"]).Type(Config["elasticsearch_type"]).Id(esId).Doc(oldTmp).Refresh(true).Do(); err != nil {
 					log.Println("EsConn err :", err)
 				}
 			}
 		}
+		SourceClient.DestoryMongoConn(SourceClientcc)
 		log.Println("增量合并执行完成 ok", gtid, lteid, overid)
 	}
 
@@ -419,19 +353,18 @@ func TimedTaskWinner() {
 	//time.Sleep(time.Hour*70)
 	t2 := time.NewTimer(time.Second * 5)
 	for range t2.C {
-		Fcconn := FClient.GetMgoConn()
-		defer FClient.DestoryMongoConn(Fcconn)
+		Fcconn := FClient.GetMgoConn(86400)
 		tmpLast := map[string]interface{}{}
 		if iter := Fcconn.DB(Config["mgodb_extract_kf"]).C("winner_new").Find(bson.M{}).Sort("-_id").Limit(1).Iter(); iter != nil {
 			if !iter.Next(&tmpLast) {
 				//临时表无数据
 				log.Println("临时表无数据:")
 				t2.Reset(time.Minute * 5)
+				FClient.DestoryMongoConn(Fcconn)
 				continue
 			} else {
 				log.Println("临时表有数据:", tmpLast)
-				fconn := FClient.GetMgoConn()
-				defer FClient.DestoryMongoConn(fconn)
+				fconn := FClient.GetMgoConn(86400)
 				cursor := fconn.DB(Config["mgodb_extract_kf"]).C("winner_new").Find(bson.M{
 					"_id": bson.M{
 						"$lte": tmpLast["_id"],
@@ -440,17 +373,17 @@ func TimedTaskWinner() {
 				if cursor == nil {
 					log.Println("查询失败")
 					t2.Reset(time.Second * 5)
+					FClient.DestoryMongoConn(fconn)
 					continue
 				}
 				//遍历临时表数据,匹配不到原始库存入异常表
 				tmp := make(map[string]interface{})
 				for cursor.Next(&tmp) {
-					tmpId := tmp["_id"].(primitive.ObjectID).Hex()
+					tmpId := tmp["_id"].(bson.ObjectId).Hex()
 					//再重新查找redis,存在发udp处理,不存在走新增合并
 					rdb := RedisPool.Get()
 					rdb.Do("SELECT", Config["redis_winner_db"])
 					if _, err := redis.String(rdb.Do("GET", tmp["winner"])); err == nil {
-						//{"gtid":"57d7ad2f61a0721f152d2ad5","lteid":"5e20968d85a9271abf0ad6c2","stype":""}
 						//redis存在发送udp进行处理
 						by, _ := json.Marshal(map[string]interface{}{
 							"gtid":      tmpId,
@@ -467,7 +400,7 @@ func TimedTaskWinner() {
 						}
 						//存在的话删除tmp mongo表
 						FClient.DbName = Config["mgodb_extract_kf"]
-						if DeletedCount := FClient.DeleteById("winner_new", tmpId); DeletedCount == 0 {
+						if DeletedCount := FClient.Del("winner_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !DeletedCount {
 							log.Println("删除临时表err:", DeletedCount)
 						}
 						if err := rdb.Close(); err != nil {
@@ -482,33 +415,32 @@ func TimedTaskWinner() {
 					//查询redis不存在新增
 					FClient.DbName = Config["mgodb_enterprise"]
 
-					resulttmp := FClient.FindOne(Config["mgodb_enterprise_c"], bson.M{"company_name": tmp["winner"]})
-					if resulttmp["_id"] == nil {
+					resulttmp, b := FClient.FindOne(Config["mgodb_enterprise_c"], bson.M{"company_name": tmp["winner"]})
+					if !b || (*resulttmp)["_id"] == nil {
 						//log.Println(r)
 						//匹配不到原始库,存入异常表删除临时表
 						FClient.DbName = Config["mgodb_extract_kf"]
-						if saveid := FClient.Save("winner_err", tmp); saveid == nil {
-							log.Println("存入异常表错误", tmp)
+						if err := FClient.SaveForOld("winner_err", tmp); err != nil {
+							log.Println("存入异常表错误", err, tmp)
 						}
-						FClient.DbName = Config["mgodb_extract_kf"]
-						if deleteNum := FClient.DeleteById("winner_new", tmpId); deleteNum == 0 {
+						if deleteNum := FClient.Del("winner_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !b {
 							log.Println("删除临时表错误", deleteNum)
 						}
 						continue
 					} else {
 						//log.Println(123)
 						//匹配到原始库,新增 resulttmp
-						if resulttmp["credit_no"] != nil {
-							if credit_no, ok := resulttmp["credit_no"].(string); ok && strings.TrimSpace(credit_no) != "" &&
+						if (*resulttmp)["credit_no"] != nil {
+							if credit_no, ok := (*resulttmp)["credit_no"].(string); ok && strings.TrimSpace(credit_no) != "" &&
 								len(strings.TrimSpace(credit_no)) > 8 {
 								dataNo := strings.TrimSpace(credit_no)[2:8]
 								if Addrs[dataNo] != nil {
 									if v, ok := Addrs[dataNo].(map[string]interface{}); ok {
-										if resulttmp["province"] == nil || resulttmp["province"] == "" {
-											resulttmp["province"] = v["province"]
+										if (*resulttmp)["province"] == nil || (*resulttmp)["province"] == "" {
+											(*resulttmp)["province"] = v["province"]
 										}
-										resulttmp["city"] = v["city"]
-										resulttmp["district"] = v["district"]
+										(*resulttmp)["city"] = v["city"]
+										(*resulttmp)["district"] = v["district"]
 
 									}
 								}
@@ -516,15 +448,15 @@ func TimedTaskWinner() {
 						}
 						contacts := make([]map[string]interface{}, 0)
 						contact := make(map[string]interface{}, 0)
-						if resulttmp["legal_person"] != nil {
-							contact["contact_person"] = resulttmp["legal_person"] //联系人
+						if (*resulttmp)["legal_person"] != nil {
+							contact["contact_person"] = (*resulttmp)["legal_person"] //联系人
 						} else {
 							contact["contact_person"] = "" //联系人
 						}
 						contact["contact_type"] = "法定代表人" //法定代表人
 						//log.Println(1)
-						if resulttmp["annual_reports"] != nil {
-							bytes, err := json.Marshal(resulttmp["annual_reports"])
+						if (*resulttmp)["annual_reports"] != nil {
+							bytes, err := json.Marshal((*resulttmp)["annual_reports"])
 							if err != nil {
 								log.Println("annual_reports err:", err)
 							}
@@ -556,24 +488,49 @@ func TimedTaskWinner() {
 						contact["updatetime"] = time.Now().Unix() //更新时间
 						contact["infoid"] = ""                    //招标信息id
 						contacts = append(contacts, contact)
-						resulttmp["contact"] = contacts
+						//添加临时表匹配到的联系人
+						vvv := make(map[string]interface{})
+						vvv["infoid"] = tmp["_id"].(bson.ObjectId).Hex()
+						if tmp["winnerperson"] != nil {
+							vvv["contact_person"] = tmp["winnerperson"]
+						} else {
+							vvv["contact_person"] = ""
+						}
+						vvv["contact_type"] = "项目联系人"
+						//	"winner": 1, "winnertel": 1, "winnerperson": 1, "topscopeclass": 1
+						if tmp["winnertel"] != nil {
+							vvv["phone"] = tmp["winnertel"]
+						} else {
+							vvv["phone"] = ""
+						}
+						tmpclass := make([]string, 0)
+						if tclasss, ok := tmp["topscopeclass"].([]string); ok {
+							for _, vv := range tclasss {
+								if len(vv) > 1 {
+									tmpclass = append(tmpclass, vv[:len(vv)-1])
+								}
+							}
+						}
+						vvv["topscopeclass"] = strings.Join(tmpclass, ";")
+						vvv["updatetime"] = time.Now().Unix()
+						contacts = append(contacts, vvv)
+						(*resulttmp)["contact"] = contacts
 
 						savetmp := make(map[string]interface{}, 0)
 						for _, sk := range Fields {
 							if sk == "establish_date" {
-								if resulttmp[sk] != nil {
-									savetmp[sk] = resulttmp[sk].(primitive.DateTime).Time().UTC().Unix()
+								if (*resulttmp)[sk] != nil {
+									savetmp[sk] = (*resulttmp)[sk].(time.Time).UTC().Unix()
 									continue
 								}
 							} else if sk == "capital" {
 								//log.Println(sk, resulttmp[sk])
-								savetmp[sk] = ObjToMoney([]interface{}{resulttmp[sk], ""})[0]
+								savetmp[sk] = ObjToMoney([]interface{}{(*resulttmp)[sk], ""})[0]
 								continue
 							} else if sk == "partners" {
 								//log.Println(sk, resulttmp[sk], )
-								//fmt.Println(reflect.TypeOf(resulttmp[sk]))
-								if resulttmp[sk] != nil {
-									if ppms, ok := resulttmp[sk].(primitive.A); ok {
+								if (*resulttmp)[sk] != nil {
+									if ppms, ok := (*resulttmp)[sk].([]interface{}); ok {
 										for i, _ := range ppms {
 											if ppms[i].(map[string]interface{})["stock_type"] != nil {
 												ppms[i].(map[string]interface{})["stock_type"] = "企业公示"
@@ -588,19 +545,19 @@ func TimedTaskWinner() {
 								}
 								continue
 							} else if sk == "_id" {
-								savetmp["tmp"+sk] = resulttmp[sk]
+								savetmp["tmp"+sk] = (*resulttmp)[sk]
 								continue
 							} else if sk == "area_code" {
 								//行政区划代码
-								savetmp[sk] = fmt.Sprint(resulttmp[sk])
+								savetmp[sk] = fmt.Sprint((*resulttmp)[sk])
 								continue
 							} else if sk == "report_websites" {
 								//网址
-								if resulttmp["report_websites"] == nil {
+								if (*resulttmp)["report_websites"] == nil {
 									savetmp["website"] = ""
 								} else {
 									report_websitesArr := []string{}
-									if ppms, ok := resulttmp[sk].(primitive.A); ok {
+									if ppms, ok := (*resulttmp)[sk].([]interface{}); ok {
 										for _, v := range ppms {
 											if vvv, ok := v.(map[string]interface{}); ok {
 												if rv, ok := vvv["website_url"].(string); ok {
@@ -616,27 +573,40 @@ func TimedTaskWinner() {
 							} else if sk == "wechat_accounts" {
 								savetmp[sk] = []interface{}{}
 								continue
+							} else if sk == "industry" {
+								tmpTopscopeclass := make([]string, 0)
+								if v, ok := tmp["topscopeclass"].([]interface{}); ok {
+									for _, vv := range v {
+										if vvv, ok := vv.(string); ok && len(vvv) > 1 {
+											tmpTopscopeclass = append(tmpTopscopeclass, vvv[:len(vvv)-1])
+										}
+									}
+								}
+								sort.Strings(tmpTopscopeclass)
+								savetmp[sk] = tmpTopscopeclass
+								continue
 							}
-							if resulttmp[sk] == nil && sk != "history_name" && sk != "wechat_accounts" && sk != "establish_date" && sk != "capital" && sk != "partners" && sk != "contact" && sk != "report_websites" {
+							if (*resulttmp)[sk] == nil && sk != "history_name" && sk != "wechat_accounts" && sk != "establish_date" && sk != "capital" && sk != "partners" && sk != "contact" && sk != "report_websites" {
 								savetmp[sk] = ""
 							} else {
-								savetmp[sk] = resulttmp[sk]
+								savetmp[sk] = (*resulttmp)[sk]
 							}
 						}
 						//tmps = append(tmps, savetmp)
 						savetmp["updatatime"] = time.Now().Unix()
 						//保存mongo
 						FClient.DbName = Config["mgodb_extract_kf"]
+
 						saveid := FClient.Save(Config["mgo_qyk_c"], savetmp)
-						if saveid != nil {
+						if saveid != "" {
 							//保存redis
 							rc := RedisPool.Get()
 							rc.Do("SELECT", Config["redis_winner_db"])
-							var _id string
-							if v, ok := saveid.(primitive.ObjectID); ok {
-								_id = v.Hex()
-							}
-							if _, err := rc.Do("SET", savetmp["company_name"], _id); err != nil {
+							//var _id string
+							//if v, ok := saveid.(primitive.ObjectID); ok {
+							//	_id = v.Hex()
+							//}
+							if _, err := rc.Do("SET", savetmp["company_name"], saveid); err != nil {
 								log.Println("save redis err:", tmp["_id"], savetmp["_id"], savetmp["company_name"], err)
 								if err := rc.Close(); err != nil {
 									log.Println(err)
@@ -650,12 +620,12 @@ func TimedTaskWinner() {
 
 								//esConn := elastic.GetEsConn()
 								//defer elastic.DestoryEsConn(esConn)
-								if _, err := EsConn.Index().Index(Config["elasticsearch_index"]).Type(Config["elasticsearch_type"]).Id(_id).BodyJson(savetmp).Refresh(true).Do(); err != nil {
+								if _, err := EsConn.Index().Index(Config["elasticsearch_index"]).Type(Config["elasticsearch_type"]).Id(saveid).BodyJson(savetmp).Refresh(true).Do(); err != nil {
 									log.Println("save es err :", tmp["_id"], savetmp["_id"], err)
 								} else {
 									//删除临时表
 									FClient.DbName = Config["mgodb_extract_kf"]
-									if deleteNum := FClient.DeleteById("winner_new", tmpId); deleteNum == 0 {
+									if deleteNum := FClient.Del("winner_new", bson.M{"_id": bson.ObjectIdHex(tmpId)}); !deleteNum {
 										log.Println("删除临时表失败", deleteNum)
 									}
 								}
@@ -665,8 +635,10 @@ func TimedTaskWinner() {
 						}
 					}
 				}
+				FClient.DestoryMongoConn(fconn)
 			}
 		}
+		FClient.DestoryMongoConn(Fcconn)
 		t2.Reset(time.Minute)
 	}
 }

+ 5 - 1
udpfilterdup/src/datamap.go

@@ -71,7 +71,11 @@ func NewDatamap(days int, lastid string) *datamap {
 	//初始化加载数据
 	sess := mgo.GetMgoConn()
 	defer mgo.DestoryMongoConn(sess)
-	it := sess.DB(mgo.DbName).C(extract).Find(mongodb.ObjToMQ(`{"_id":{"$lte":"`+lastid+`"}}`, true)).Sort("-_id").Iter()
+	query := map[string]interface{}{"_id": map[string]interface{}{
+		"$lte": StringTOBsonId(lastid),
+	}}
+	log.Println("query", query)
+	it := sess.DB(mgo.DbName).C(extract).Find(query).Sort("-_id").Iter()
 	now1 := int64(0)
 	n, continuSum := 0, 0
 	for tmp := make(map[string]interface{}); it.Next(&tmp); n++ {

+ 1 - 1
udpfilterdup/src/mgo.go

@@ -144,7 +144,7 @@ func (m *MongodbSim) InitPool() {
 	opts := options.Client()
 	opts.SetConnectTimeout(3 * time.Second)
 	opts.ApplyURI("mongodb://" + m.MongodbAddr)
-	opts.SetMaxPoolSize(uint16(m.Size))
+	opts.SetMaxPoolSize(uint64(m.Size))
 	m.pool = make(chan bool, m.Size)
 	opts.SetMaxConnIdleTime(2 * time.Hour)
 	m.Ctx, _ = context.WithTimeout(context.Background(), 99999*time.Hour)