Jianghan před 3 roky
rodič
revize
b7b4aa6877
38 změnil soubory, kde provedl 11198 přidání a 1008 odebrání
  1. 6 6
      esmgocount/src/main.go
  2. 9 4
      forecast/es/main.go
  3. 4 2
      forecast/es/task.go
  4. 14 7
      fullproject/src_v1/config.json
  5. 70 32
      fullproject/src_v1/init.go
  6. 20 16
      fullproject/src_v1/load_data.go
  7. 130 84
      fullproject/src_v1/main.go
  8. 1 1
      fullproject/src_v1/merge_comparepnc.go
  9. 1 1
      fullproject/src_v1/merge_select.go
  10. 0 294
      fullproject/src_v1/mgotool.go
  11. 162 169
      fullproject/src_v1/project.go
  12. 53 60
      fullproject/src_v1/task.go
  13. 849 179
      fullproject/src_v1/update.go
  14. 5 2
      monitor/task.go
  15. 8 3
      qyxy/qyxy_es/main.go
  16. 1 1
      qyxy/qyxy_es/task.go
  17. 13 8
      qyxy/qyxy_inc_data/main.go
  18. 2 2
      qyxy/qyxy_std/config.json
  19. 2 3
      qyxy/qyxy_std/init.go
  20. 20 20
      qyxy/qyxy_std/task.go
  21. 17 17
      qyxy/save_ent/main.go
  22. 1 1
      udpcreateindex/src/biddingall.go
  23. 1 1
      udpcreateindex/src/biddingdata.go
  24. 102 1
      udpcreateindex/src/biddingindex.go
  25. 1 1
      udpcreateindex/src/biddingindexback.go
  26. 104 21
      udpcreateindex/src/biddingtask.go
  27. 7 5
      udpcreateindex/src/buyertask.go
  28. 9103 0
      udpcreateindex/src/common.txt
  29. 11 4
      udpcreateindex/src/config.json
  30. 199 0
      udpcreateindex/src/file.go
  31. 12 7
      udpcreateindex/src/init.go
  32. 91 13
      udpcreateindex/src/main.go
  33. 92 0
      udpcreateindex/src/nsq/consumer.go
  34. 51 0
      udpcreateindex/src/nsq/producer.go
  35. 13 38
      udpcreateindex/src/projectindex.go
  36. 1 0
      udpcreateindex/src/task.go
  37. 15 0
      udpcreateindex/src/util/ossclient.go
  38. 7 5
      udpcreateindex/src/winnertask.go

+ 6 - 6
esmgocount/src/main.go

@@ -96,13 +96,13 @@ func (t *T) task() {
 	et1 := fmt.Sprintf("%x0000000000000000", et)
 	eq = fmt.Sprintf(esQ, st1, et1)
 	eq1 := fmt.Sprintf(esQ1, st1, et1)
-	es := elastic.Elastic{S_esurl: esAddr, I_size: 1}
-	es.InitElasticSize()
+	//es := elastic.Elastic{S_esurl: esAddr, I_size: 1}
+	//es.InitElasticSize()
 	es2 := elastic.Elastic{S_esurl: esAddr2, I_size: 1}
 	es2.InitElasticSize()
-	count := int(es.Count(esIndex, esIndex, eq))
-	count2 := int(es2.Count(esIndex2, esIndex2, eq)) // es 新集群
-	count1 := int(es.Count(esIndex, esIndex, eq1))   // 竞品
+	//count := int(es.Count(esIndex, esIndex, eq))
+	count := int(es2.Count(esIndex2, esIndex2, eq)) // es 新集群
+	count1 := int(es2.Count(esIndex, esIndex, eq1)) // 竞品
 	switch t.Type {
 	case "alert":
 		if count < t.Min || count > t.Max {
@@ -110,7 +110,7 @@ func (t *T) task() {
 			t.SendMail(report)
 		}
 	case "report":
-		report := fmt.Sprintf("统计报告%s,统计结果旧es库数量:%d,新es库数量:%d", t.Name, count, count2)
+		report := fmt.Sprintf("统计报告%s,统计结果es库数量:%d", t.Name, count)
 		if len(t.Mgo) > 5 {
 			fs := strings.Split(t.Mgo, "|")
 			fmgo := mongodb.NewMgoWithUser(fs[0], fs[3], fs[1], fs[2], 1)

+ 9 - 4
forecast/es/main.go

@@ -11,7 +11,7 @@ var (
 	Mgo       *mongodb.MongodbSim
 	Dbname    string
 	Dbcoll    string
-	Es        *es.Elastic
+	Es1, Es2  *es.Elastic
 	Index     string
 	Itype     string
 	EsFields  []string
@@ -37,11 +37,16 @@ func init() {
 	econf := Sysconfig["elastic"].(map[string]interface{})
 	Index = econf["index"].(string)
 	Itype = econf["itype"].(string)
-	Es = &es.Elastic{
-		S_esurl: econf["addr"].(string),
+	//Es1 = &es.Elastic{
+	//	S_esurl: econf["addr"].(string),
+	//	I_size:  qu.IntAllDef(econf["pool"], 12),
+	//}
+	//Es1.InitElasticSize()
+	Es2 = &es.Elastic{
+		S_esurl: econf["addr1"].(string),
 		I_size:  qu.IntAllDef(econf["pool"], 12),
 	}
-	Es.InitElasticSize()
+	Es2.InitElasticSize()
 	EsFields = qu.ObjArrToStringArr(econf["esfields"].([]interface{}))
 	//TaskTime = qu.IntAll(Sysconfig["tasktime"])
 	UpdateId = qu.ObjToString(Sysconfig["updateid"])

+ 4 - 2
forecast/es/task.go

@@ -177,7 +177,8 @@ func SaveEs() {
 					defer func() {
 						<-SP
 					}()
-					Es.BulkSave(Index, Itype, &arru, true)
+					//Es1.BulkSave(Index, Itype, &arru, true)
+					Es2.BulkSave(Index, Itype, &arru, true)
 				}(arru)
 				arru = make([]map[string]interface{}, 100)
 				indexu = 0
@@ -189,7 +190,8 @@ func SaveEs() {
 					defer func() {
 						<-SP
 					}()
-					Es.BulkSave(Index, Itype, &arru, true)
+					//Es1.BulkSave(Index, Itype, &arru, true)
+					Es2.BulkSave(Index, Itype, &arru, true)
 				}(arru[:indexu])
 				arru = make([]map[string]interface{}, 100)
 				indexu = 0

+ 14 - 7
fullproject/src_v1/config.json

@@ -1,14 +1,16 @@
 {
+    "udpport": ":1482",
     "loadStart": 0,
 	"validdays":150,
     "statusdays": 15,
+    "redis-addr": "project=192.168.3.207:2679",
 	"mongodbServers": "192.168.3.207:27092",
     "mongodbPoolSize": 10,
     "mongodbName": "wjh",
 	"hints":"_id_1_publishtime_1",
     "extractColl": "bidding",
     "extractColl1": "bidding",
-    "projectColl": "projectset-test",
+    "projectColl": "projectset",
     "backupFlag": true,
     "siteColl": "site",
     "thread": 1,
@@ -22,15 +24,15 @@
         "db": ""
     },
     "bidding": {
-        "addr": "127.0.0.1:27092",
+        "addr": "192.168.3.207:27092",
         "dbname": "qfw",
         "dbsize": 5,
-        "uname": "dataAnyWrite",
-        "upwd": "data@dataAnyWrite"
+        "uname": "",
+        "upwd": ""
     },
     "spider": {
-        "addr": "127.0.0.1:27092",
-        "dbname": "editor",
+        "addr": "192.168.3.207:27092",
+        "dbname": "wjh",
         "dbsize": 2
     },
     "es": {
@@ -39,7 +41,12 @@
         "itype": "projectset",
         "pool": 10
     },
-    "udpport": ":1482",
+    "nsq_id": {
+        "addr": "192.168.3.166:4150",
+        "topic": "project-id",
+        "channel": "projectset",
+        "concurrent": 1
+    },
     "nextNode": [
         {
             "addr": "192.168.20.104",

+ 70 - 32
fullproject/src_v1/init.go

@@ -1,27 +1,31 @@
 package main
 
 import (
+	"fmt"
+	"go.mongodb.org/mongo-driver/bson/primitive"
 	"log"
 	"math"
 	mu "mfw/util"
+	"mongodb"
 	"qfw/util"
+	"qfw/util/redis"
 	"reflect"
 	"regexp"
 	"sort"
 	"strings"
 	"sync"
-
-	"go.mongodb.org/mongo-driver/bson/primitive"
 )
 
 var (
 	Sysconfig                                      map[string]interface{} //读取配置文件
-	MongoTool, MgoBidding, MgoSpider               *MongodbSim            //mongodb连接
+	MongoTool, MgoBidding, MgoSpider               *mongodb.MongodbSim    //mongodb连接
 	ExtractColl, ProjectColl, BackupColl, SiteColl string                 //抽取表、项目表、项目快照表、站点表
 	ExtractColl1                                   string
 	Thread                                         int //配置项线程数
 	BlackList                                      []interface{}
 	BlaskListMap                                   map[string]bool
+
+	RedisCode string
 )
 
 var (
@@ -53,14 +57,14 @@ var (
 
 func init() {
 	util.ReadConfig(&Sysconfig)
-	MongoTool = &MongodbSim{
+	MongoTool = &mongodb.MongodbSim{
 		MongodbAddr: Sysconfig["mongodbServers"].(string),
 		Size:        util.IntAll(Sysconfig["mongodbPoolSize"]),
 		DbName:      Sysconfig["mongodbName"].(string),
 	}
 	MongoTool.InitPool()
 	bidding, _ := Sysconfig["bidding"].(map[string]interface{})
-	MgoBidding = &MongodbSim{
+	MgoBidding = &mongodb.MongodbSim{
 		MongodbAddr: bidding["addr"].(string),
 		Size:        util.IntAll(bidding["dbsize"]),
 		DbName:      bidding["dbname"].(string),
@@ -69,7 +73,7 @@ func init() {
 	}
 	MgoBidding.InitPool()
 	spider, _ := Sysconfig["spider"].(map[string]interface{})
-	MgoSpider = &MongodbSim{
+	MgoSpider = &mongodb.MongodbSim{
 		MongodbAddr: spider["addr"].(string),
 		Size:        util.IntAll(spider["dbsize"]),
 		DbName:      spider["dbname"].(string),
@@ -94,6 +98,15 @@ func init() {
 		BlaskListMap[util.ObjToString(v)] = true
 	}
 
+	redisC := Sysconfig["redis-addr"].(string)
+	redisCon := Sysconfig["redis"].(map[string]interface{})
+	RedisCode = util.ObjToString(redisCon["dbname"])
+	redis_addr := util.ObjToString(redisCon["addr"])
+	redis_db := util.IntAll(redisCon["db"])
+	//"qyxy_buyer=172.17.4.189:8379"
+	redis.InitRedis1(fmt.Sprintf("%s=%s", RedisCode, redis_addr), redis_db) // 采购单位与中标单位初次合作项目
+	redis.InitRedis1(redisC, 0)
+
 	initWinnerRegexp()
 	initBuyerRegexp()
 	initAgencyRegexp()
@@ -227,7 +240,7 @@ type KeyMap struct {
 type ID struct {
 	Id   string
 	Lock sync.Mutex
-	P    *ProjectInfo
+	P    *ProjectCache
 }
 type Key struct {
 	Arr  []string
@@ -300,27 +313,57 @@ type Info struct {
 	PTCBH int
 }
 
-//项目实体类
-type ProjectInfo struct {
-	Id                 primitive.ObjectID     `json:"_id"`
-	FirstTime          int64                  `json:"firsttime,omitempty"` //项目的最早时间
-	LastTime           int64                  `json:"lasttime,omitempty"`  //项目的最后时间
-	Ids                []string               `json:"ids,omitempty"`
+// 内存 项目信息
+type ProjectCache struct {
+	Id            primitive.ObjectID `json:"_id"`
+	Ids           []string           `json:"ids,omitempty"`
+	FirstTime     int64              `json:"firsttime,omitempty"`   //项目的最早时间
+	LastTime      int64              `json:"lasttime,omitempty"`    //项目的最后时间
+	ProjectName   string             `json:"projectname,omitempty"` //项目名称
+	ProjectCode   string             `json:"projectcode,omitempty"` //项目代码唯一(纯数字的权重低)
+	Buyer         string             `json:"buyer,omitempty"`       //采购单位唯一
+	Agency        string             `json:"agency"`                //代理机构
+	Area          string             `json:"area"`                  //地区
+	City          string             `json:"city"`                  //地市
+	District      string             `json:"district"`              //区县
+	Bidamount     float64            `json:"bidamount,omitempty"`   //中标金额
+	Budget        float64            `json:"budget,omitempty"`      //预算
+	Bidstatus     string             `json:"bidstatus"`             //
+	Bidtype       string             `json:"bidtype"`               //
+	score         int
+	comStr        string
+	MPN           []string `json:"mpn,omitempty"` //合并后多余的项目名称
+	MPC           []string `json:"mpc,omitempty"` //合并后多余的项目编号
+	resVal, pjVal int
+}
+
+// 项目信息
+type Project struct {
+	Id            primitive.ObjectID `json:"_id"`
+	Ids           []string           `json:"ids,omitempty"`
+	FirstTime     int64              `json:"firsttime,omitempty"`   //项目的最早时间
+	LastTime      int64              `json:"lasttime,omitempty"`    //项目的最后时间
+	ProjectName   string             `json:"projectname,omitempty"` //项目名称
+	ProjectCode   string             `json:"projectcode,omitempty"` //项目代码唯一(纯数字的权重低)
+	Buyer         string             `json:"buyer,omitempty"`       //采购单位唯一
+	Agency        string             `json:"agency"`                //代理机构
+	Area          string             `json:"area"`                  //地区
+	City          string             `json:"city"`                  //地市
+	District      string             `json:"district"`              //区县
+	Bidamount     float64            `json:"bidamount,omitempty"`   //中标金额
+	Budget        float64            `json:"budget,omitempty"`      //预算
+	score         int
+	comStr        string
+	MPN           []string `json:"mpn,omitempty"` //合并后多余的项目名称
+	MPC           []string `json:"mpc,omitempty"` //合并后多余的项目编号
+	resVal, pjVal int
+
 	Topscopeclass      []string               `json:"topscopeclass,omitempty"`
 	Subscopeclass      []string               `json:"subscopeclass,omitempty"` //子行业分类
-	Winners            []string               `json:"s_winner,omitempty"`      //中标人
-	ProjectName        string                 `json:"projectname,omitempty"`   //项目名称
-	ProjectCode        string                 `json:"projectcode,omitempty"`   //项目代码唯一(纯数字的权重低)
-	ContractCode       string                 `json:"contractcode,omitempty"`  //项目编号
-	Buyer              string                 `json:"buyer,omitempty"`         //采购单位唯一
-	MPN                []string               `json:"mpn,omitempty"`           //合并后多余的项目名称
-	MPC                []string               `json:"mpc,omitempty"`           //合并后多余的项目编号
+	Winners            string                 `json:"s_winner,omitempty"`      //中标人
+	ContractCode       string                 `json:"contractcode,omitempty"`  //合同编号
 	Buyerperson        string                 `json:"buyerperson"`             //采购联系人
 	Buyertel           string                 `json:"buyertel"`                //采购联系人电话
-	Agency             string                 `json:"agency"`                  //代理机构
-	Area               string                 `json:"area"`                    //地区
-	City               string                 `json:"city"`                    //地市
-	District           string                 `json:"district"`                //区县
 	Bidstatus          string                 `json:"bidstatus"`               //
 	Bidtype            string                 `json:"bidtype"`                 //
 	ReviewExperts      []string               `json:"review_experts"`          // 项目评审专家
@@ -330,8 +373,6 @@ type ProjectInfo struct {
 	Bidopentime        int64                  `json:"bidopentime,omitempty"`   //开标时间
 	Jgtime             int64                  `json:"jgtime"`                  //结果中标时间
 	Zbtime             int64                  `json:"zbtime"`                  //招标时间
-	Bidamount          float64                `json:"bidamount,omitempty"`     //中标金额
-	Budget             float64                `json:"budget,omitempty"`        //预算
 	Winnerorder        []string               `json:"winnerorder"`             //中标候选人
 	ProjectScale       string                 `json:"project_scale"`           //项目规模
 	ProjectDuration    int                    `json:"project_duration"`        //工期时长
@@ -344,12 +385,9 @@ type ProjectInfo struct {
 	Qualifies          string                 `json:"qualifies"`               //资质条件
 	EntIdList          []string               `json:"entidlist"`               //企业id
 	//FirstCooperation   []string               `json:"first_cooperation"`       //first_cooperation
-	score         int
-	comStr        string
-	resVal, pjVal int
-	InfoFiled     map[string]InfoField `json:"infofield"`    //逻辑处理需要的info字段
-	Budgettag     int                  `json:"budgettag"`    //预算是否有效标记
-	Bidamounttag  int                  `json:"bidamounttag"` //中标金额是否有效标记
+	InfoFiled    map[string]InfoField `json:"infofield"`    //逻辑处理需要的info字段
+	Budgettag    int                  `json:"budgettag"`    //预算是否有效标记
+	Bidamounttag int                  `json:"bidamounttag"` //中标金额是否有效标记
 }
 
 //存储部分招标信息字段,业务逻辑处理需要

+ 20 - 16
fullproject/src_v1/load_data.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"log"
 	"qfw/util"
+	"qfw/util/redis"
 	"time"
 )
 
@@ -16,13 +17,14 @@ func (p *ProjectTask) loadData(starttime int64) {
 	defer p.AllIdsMapLock.Unlock()
 	sess := MongoTool.GetMgoConn()
 	defer MongoTool.DestoryMongoConn(sess)
+	loadOver := make(chan bool)
 	q := map[string]interface{}{
 		"lasttime": map[string]interface{}{"$gte": starttime},
 	}
-	it := sess.DB(MongoTool.DbName).C(p.coll).Find(&q).Iter()
+	//field := map[string]interface{}{"list": 0}
+	it := sess.DB(MongoTool.DbName).C(p.coll).Find(&q).Select(nil).Iter()
 	n := 0
-	pool := make(chan *ProjectInfo, 100)
-	over := make(chan bool)
+	pool := make(chan *ProjectCache, 1000)
 	go func() {
 		for {
 			select {
@@ -72,7 +74,7 @@ func (p *ProjectTask) loadData(starttime int64) {
 					}
 					p.AllIdsMap[id] = &ID{Id: id, P: tmp}
 				}
-			case <-over:
+			case <-loadOver:
 				return
 			}
 		}
@@ -82,9 +84,11 @@ func (p *ProjectTask) loadData(starttime int64) {
 		if it.Next(&result) {
 			go func(res map[string]interface{}) {
 				bys, _ := json.Marshal(result)
-				var tmp *ProjectInfo
+
+				var tmp *ProjectCache
 				_ = json.Unmarshal(bys, &tmp)
 				saveFiled(p, result, tmp)
+				redis.PutCKV("project", tmp.Id.Hex(), result)
 				pool <- tmp
 			}(result)
 		} else {
@@ -92,7 +96,7 @@ func (p *ProjectTask) loadData(starttime int64) {
 		}
 	}
 	time.Sleep(2 * time.Second)
-	over <- true
+	loadOver <- true
 	log.Println("load project over..", n)
 }
 
@@ -142,7 +146,7 @@ func (p *ProjectTask) loadSite() {
 
 }
 
-func saveFiled(p *ProjectTask, res map[string]interface{}, tmp *ProjectInfo) {
+func saveFiled(p *ProjectTask, res map[string]interface{}, tmp *ProjectCache) {
 	proHref := util.ObjToString(res["projecthref"])
 	if proHref != "" {
 		p.mapHrefLock.Lock()
@@ -150,15 +154,15 @@ func saveFiled(p *ProjectTask, res map[string]interface{}, tmp *ProjectInfo) {
 		p.mapHrefLock.Unlock()
 	}
 
-	tmpMap := make(map[string]InfoField)
-	infoMap := res["infofield"].(map[string]interface{})
-	for _, v := range infoMap {
-		var field InfoField
-		b, _ := json.Marshal(v)
-		_ = json.Unmarshal(b, &field)
-		tmpMap[tmp.Id.Hex()] = field
-	}
-	tmp.InfoFiled = tmpMap
+	//tmpMap := make(map[string]InfoField)
+	//infoMap := res["infofield"].(map[string]interface{})
+	//for _, v := range infoMap {
+	//	var field InfoField
+	//	b, _ := json.Marshal(v)
+	//	_ = json.Unmarshal(b, &field)
+	//	tmpMap[tmp.Id.Hex()] = field
+	//}
+	//tmp.InfoFiled = tmpMap
 }
 
 //  加载spidercode数据,isflow字段

+ 130 - 84
fullproject/src_v1/main.go

@@ -5,12 +5,14 @@ import (
 	"fmt"
 	"log"
 	mu "mfw/util"
+	"mongodb"
 	"net"
+	nsq "nsq"
 	"os"
 	"os/signal"
 	"qfw/util"
 	"qfw/util/elastic"
-	"qfw/util/redis"
+	"strings"
 	"syscall"
 	"time"
 )
@@ -24,9 +26,11 @@ var (
 	Es           *elastic.Elastic
 	Index        string
 	Itype        string
-	RedisCode    string
+	Mcmer        *nsq.Consumer
 
 	sid, eid string //测试使用
+
+	UdpChan = make(chan map[string]interface{}, 500)
 )
 
 func init() {
@@ -48,12 +52,10 @@ func init() {
 	Itype = util.ObjToString(es["itype"])
 	Es.InitElasticSize()
 
-	redisCon := Sysconfig["redis"].(map[string]interface{})
-	RedisCode = util.ObjToString(redisCon["dbname"])
-	redis_addr := util.ObjToString(redisCon["addr"])
-	redis_db := util.IntAll(redisCon["db"])
-	//"qyxy_buyer=172.17.4.189:8379"
-	redis.InitRedis1(fmt.Sprintf("%s=%s", RedisCode, redis_addr), redis_db) // 采购单位与中标单位初次合作项目
+	P_QL = NewPT()
+	go P_QL.updateAllQueue()
+	go P_QL.clearMem()
+
 }
 
 var queryClose = make(chan bool)
@@ -80,13 +82,8 @@ func DealSign() {
 	}
 }
 
-func mainT() {
-	//udp跑增量  id段   project
-	//udp跑全量			qlT
-	//udp跑历史数据  信息id1,id2/或id段  ls
-	//udp强制合并  信息id1,id2,id3 [项目id] 不存在时新建  qzhb
-	//udp强制拆分  项目id,信息id1,id2          qzcf
-	//udp重新合并  信息id1,id2,id3             cxhb
+func main() {
+
 	P_QL.loadSpiderCode()
 	P_QL.loadSite()
 	if Sysconfig["loadStart"] != nil {
@@ -96,12 +93,92 @@ func mainT() {
 		}
 	}
 	go checkMapJob()
-	time.Sleep(99999 * time.Hour)
+	go P_QL.nsqMethod()
+
+	for {
+		mapinfo, ok := <-UdpChan
+		if !ok {
+			continue
+		}
+		SingleThread <- true
+		tasktype := util.ObjToString(mapinfo["stype"])
+		switch tasktype {
+		case "ql": //全量合并
+			go func() {
+				defer func() {
+					<-SingleThread
+				}()
+				P_QL.currentType = tasktype
+				P_QL.pici = time.Now().Unix()
+				P_QL.taskQl(mapinfo)
+			}()
+		case "project": //增量合并,
+			go func() {
+				defer func() {
+					<-SingleThread
+				}()
+				P_QL.currentType = tasktype
+				P_QL.pici = time.Now().Unix()
+				P_QL.taskZl(mapinfo)
+			}()
+		case "project_history": //增量合并, id段历史数据
+			go func() {
+				defer func() {
+					<-SingleThread
+				}()
+				P_QL.currentType = tasktype
+				P_QL.pici = time.Now().Unix()
+				P_QL.taskZl(mapinfo)
+			}()
+		case "updateInfo": //招标字段变更
+			go func() {
+				defer func() {
+					<-SingleThread
+				}()
+				P_QL.currentType = tasktype
+				P_QL.pici = time.Now().Unix()
+				P_QL.taskUpdateInfo(mapinfo)
+			}()
+		case "updatePro": //修改项目外围字段(只修改外围字段值)
+			go func() {
+				defer func() {
+					<-SingleThread
+				}()
+				P_QL.currentType = tasktype
+				P_QL.pici = time.Now().Unix()
+				P_QL.taskUpdatePro(mapinfo)
+			}()
+		case "deleteInfo": // 删除招标公告
+			go func() {
+				defer func() {
+					<-SingleThread
+				}()
+				P_QL.currentType = tasktype
+				P_QL.pici = time.Now().Unix()
+				P_QL.delInfoPro(mapinfo)
+			}()
+		case "spider": // 爬虫代码code、isflow
+			go func() {
+				defer func() {
+					<-SingleThread
+				}()
+				go P_QL.loadSpiderCode()
+			}()
+		case "history": //历史数据合并,暂时不写
+			go func() {
+				defer func() {
+					<-SingleThread
+				}()
+			}()
+		default:
+			<-SingleThread
+		}
+	}
 }
 
-func main() {
-	sid = "62a311cb1cd2d8ec214ea212"
-	eid = "62a311cb1cd2d8ec214ea214"
+func mainT() {
+	sid = "62df420b2e43d7e553df78f3"
+	eid = "62df420b2e43d7e553df78f3"
 	//flag.StringVar(&sid, "sid", "", "开始id")
 	//flag.StringVar(&eid, "eid", "", "结束id")
 	//flag.Parse()
@@ -116,6 +193,9 @@ func main() {
 	mapinfo["stype"] = "ql"
 	mapinfo["ip"] = "127.0.0.1"
 	mapinfo["port"] = Sysconfig["udpport"]
+
+	P_QL.loadSpiderCode()
+	P_QL.loadSite()
 	if Sysconfig["loadStart"] != nil {
 		loadStart := util.Int64All(Sysconfig["loadStart"])
 		if loadStart > -1 {
@@ -144,71 +224,7 @@ func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
 				key = "udpok"
 			}
 			go udpclient.WriteUdp([]byte(key), mu.OP_NOOP, ra)
-			SingleThread <- true
-			tasktype, _ := mapInfo["stype"].(string)
-			switch tasktype {
-			case "ql": //全量合并
-				go func() {
-					defer func() {
-						<-SingleThread
-					}()
-					P_QL.currentType = tasktype
-					P_QL.pici = time.Now().Unix()
-					P_QL.taskQl(mapInfo)
-				}()
-			case "project": //增量合并,未抽取到项目名称或项目编号的不合并  bidding中mergestatus 1已合并 2字段问题不合并 3历史待合并
-				//合同、验收公告在6个月内查询不到可扩展到两年
-				go func() {
-					defer func() {
-						<-SingleThread
-					}()
-					P_QL.currentType = tasktype
-					P_QL.pici = time.Now().Unix()
-					P_QL.taskZl(mapInfo)
-				}()
-			case "updateInfo": //招标字段变更
-				go func() {
-					defer func() {
-						<-SingleThread
-					}()
-					P_QL.currentType = tasktype
-					P_QL.pici = time.Now().Unix()
-					P_QL.taskUpdateInfo(mapInfo)
-				}()
-			case "updatePro": //修改项目外围字段(只修改外围字段值)
-				go func() {
-					defer func() {
-						<-SingleThread
-					}()
-					P_QL.currentType = tasktype
-					P_QL.pici = time.Now().Unix()
-					P_QL.taskUpdatePro(mapInfo)
-				}()
-			case "deleteInfo": // 删除招标公告
-				go func() {
-					defer func() {
-						<-SingleThread
-					}()
-					P_QL.currentType = tasktype
-					P_QL.pici = time.Now().Unix()
-					P_QL.delInfoPro(mapInfo)
-				}()
-			case "spider": // 爬虫代码code、isflow
-				go func() {
-					defer func() {
-						<-SingleThread
-					}()
-					go P_QL.loadSpiderCode()
-				}()
-			case "history": //历史数据合并,暂时不写
-				go func() {
-					defer func() {
-						<-SingleThread
-					}()
-				}()
-			default:
-				<-SingleThread
-			}
+			UdpChan <- mapInfo
 		}
 	case mu.OP_NOOP: //下个节点回应
 		ok := string(data)
@@ -218,3 +234,33 @@ func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
 		}
 	}
 }
+
+// @Description nsq处理id不变,内容替换的竞品数据
+// @Author J 2022/8/10 11:40
+func (p *ProjectTask) nsqMethod() {
+	cof := Sysconfig["nsq_id"].(map[string]interface{})
+	var err error
+	Mcmer, err = nsq.NewConsumer(&nsq.Cconfig{
+		IsJsonEncode: true, //与生产者配置对应,设为true会取第1个字节进行类型判断
+		Addr:         util.ObjToString(cof["addr"]),
+		ConnectType:  0, //默认连接nsqd
+		Topic:        util.ObjToString(cof["topic"]),
+		Channel:      util.ObjToString(cof["channel"]),
+		Concurrent:   util.IntAllDef(cof["concurrent"], 1), //并发数
+	})
+	if err != nil {
+		util.Debug("nsqMethod err: ", err.Error())
+	}
+	for {
+		select {
+		case obj := <-Mcmer.Ch: //从通道读取即可
+			util.Debug("project nsq: " + fmt.Sprint(obj))
+			id := strings.Split(util.ObjToString(obj), "=")
+			if mongodb.IsObjectIdHex(id[1]) {
+				p.taskinfo(id[1])
+			} else {
+				util.Debug("jy nsq id err: ", id[1])
+			}
+		}
+	}
+}

+ 1 - 1
fullproject/src_v1/merge_comparepnc.go

@@ -6,7 +6,7 @@ import (
 
 //对比项目名称、项目编号
 
-func comparePNC(info *Info, compareProject *ProjectInfo) (compareStr string, score int) {
+func comparePNC(info *Info, compareProject *ProjectCache) (compareStr string, score int) {
 	if info.ProjectName != "" {
 		pns := []string{}
 		if compareProject.ProjectName != "" {

+ 1 - 1
fullproject/src_v1/merge_select.go

@@ -2,7 +2,7 @@ package main
 
 //根据字符特征打分
 //3为最高分,pj为评级 A AD A  AA AA AB
-func Select(compareStr string, info *Info, compareInfo *ProjectInfo) (res, pj int) {
+func Select(compareStr string, info *Info, compareInfo *ProjectCache) (res, pj int) {
 	//没有可对比的项目名称、或项目编号 //评级
 	if compareNoPass[compareStr] {
 

+ 0 - 294
fullproject/src_v1/mgotool.go

@@ -1,294 +0,0 @@
-package main
-
-import (
-	"context"
-	"go.mongodb.org/mongo-driver/bson/primitive"
-	"log"
-	"time"
-
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/mongo"
-	"go.mongodb.org/mongo-driver/mongo/options"
-)
-
-type MgoSess struct {
-	Db     string
-	Coll   string
-	Query  interface{}
-	Sorts  []string
-	Hints  interface{}
-	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) Hint(hint interface{}) *MgoSess {
-	ms.Hints = hint
-	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(300)
-	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.Hints != nil {
-		find.SetHint(ms.Hints)
-	}
-	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
-}
-
-func (ms *MgoSess) Count() (int64, error) {
-	if ms.Query != nil {
-		return ms.M.C.Database(ms.Db).Collection(ms.Coll).CountDocuments(ms.M.Ctx, ms.Query)
-	}
-	return ms.M.C.Database(ms.Db).Collection(ms.Coll).EstimatedDocumentCount(ms.M.Ctx)
-}
-
-type MongodbSim struct {
-	MongodbAddr string
-	Size        int
-	//	MinSize     int
-	DbName   string
-	C        *mongo.Client
-	Ctx      context.Context
-	ShortCtx context.Context
-	pool     chan bool
-	UserName string
-	Password string
-}
-
-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(uint64(m.Size))
-	if m.UserName != "" && m.Password != "" {
-		cre := options.Credential{
-			Username: m.UserName,
-			Password: m.Password,
-		}
-		opts.SetAuth(cre)
-	}
-	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{}) 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(), r)
-		log.Println(doc)
-		return false
-	}
-	return 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 {
-		return false
-	}
-	return true
-}
-
-//删除
-func (m *MongodbSim) Delete(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) 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)})
-	result := map[string]interface{}{}
-	_ = r.Decode(&result)
-	return result
-}
-
-func BsonIdToSId(uid interface{}) string {
-	if uid == nil {
-		return ""
-	} else if u, ok := uid.(string); ok {
-		return u
-	} else if u, ok := uid.(primitive.ObjectID); ok {
-		return u.Hex()
-	} else {
-		return ""
-	}
-}
-
-func StringTOBsonId(id string) primitive.ObjectID {
-	objectId, _ := primitive.ObjectIDFromHex(id)
-	return objectId
-}

+ 162 - 169
fullproject/src_v1/project.go

@@ -2,7 +2,6 @@ package main
 
 import (
 	"encoding/json"
-	"log"
 	"math"
 	"mongodb"
 	qu "qfw/util"
@@ -97,15 +96,14 @@ func (p *ProjectTask) startProjectMerge(info *Info, tmp map[string]interface{})
 	p.findLock.Lock()
 	defer p.findLock.Unlock()
 	// 3.18 isfow=0数据不参与项目合并		(1表示正常数据招标流程)
-	//code := strings.ReplaceAll(qu.ObjToString(tmp["spidercode"]), " ", "")
-	//p.mapSpiderLock.Lock()
-	//isflow := p.mapSpider[code]
-	//p.mapSpiderLock.Unlock()
-	//if isflow == 0 {
-	//	qu.Debug("isflow 新建项目" + code)
-	//	p.NewProject(tmp, info)
-	//	return
-	//}
+	code := strings.ReplaceAll(qu.ObjToString(tmp["spidercode"]), " ", "")
+	p.mapSpiderLock.Lock()
+	defer p.mapSpiderLock.Unlock()
+	if v, ok := p.mapSpider[code]; ok && (v == 0) {
+		//qu.Debug("isflow=0 新建项目" + code)
+		p.NewProject(tmp, info)
+		return
+	}
 
 	//只有或没有采购单位的无法合并
 	//bpn, bpc, bptc, bpb 是否查找到,并标识位置。-1代表未查找到。
@@ -126,9 +124,9 @@ func (p *ProjectTask) startProjectMerge(info *Info, tmp map[string]interface{})
 	findPid := ""
 	//获取完id,进行计算
 	//定义两组
-	comRes1 := []*ProjectInfo{} //优先级最高的对比结果数组
-	comRes2 := []*ProjectInfo{} //优化级其次
-	comRes3 := []*ProjectInfo{}
+	comRes1 := []*ProjectCache{} //优先级最高的对比结果数组
+	comRes2 := []*ProjectCache{} //优化级其次
+	comRes3 := []*ProjectCache{}
 	for _, v := range IDArr {
 		comStr := ""
 		compareProject := v.P
@@ -175,7 +173,7 @@ func (p *ProjectTask) startProjectMerge(info *Info, tmp map[string]interface{})
 	//--------------------------------对比完成-----------------------
 
 	//更新数组、更新项目
-	for kv, resN := range [][]*ProjectInfo{comRes1, comRes2, comRes3} {
+	for kv, resN := range [][]*ProjectCache{comRes1, comRes2, comRes3} {
 		if len(resN) > 0 {
 			if len(resN) > 1 {
 				sort.Slice(resN, func(i, j int) bool {
@@ -184,7 +182,7 @@ func (p *ProjectTask) startProjectMerge(info *Info, tmp map[string]interface{})
 			}
 
 			ex := 0
-			resArr := []*ProjectInfo{}
+			resArr := []*ProjectCache{}
 			for i, res := range resN {
 				choose, e := p.CompareStatus(resN[i], info)
 				if !choose {
@@ -249,7 +247,7 @@ func (p *ProjectTask) startProjectMerge(info *Info, tmp map[string]interface{})
 	}
 }
 
-func (p *ProjectTask) compareBCTABB(info *Info, cp *ProjectInfo, diffTime int64, score int) (compareBuyer, compareCity, compareTime, compareAgency, compareBudget, compareBidmount string, score2 int) {
+func (p *ProjectTask) compareBCTABB(info *Info, cp *ProjectCache, diffTime int64, score int) (compareBuyer, compareCity, compareTime, compareAgency, compareBudget, compareBidmount string, score2 int) {
 	compareBuyer = "D"
 	if len([]rune(info.Buyer)) > 3 && len([]rune(cp.Buyer)) > 3 {
 		v := CheckContain(info.Buyer, cp.Buyer)
@@ -419,8 +417,7 @@ func compareResult(resVal, pjVal, score2 int, comStr, compareBuyer, compareCity,
 	return eqV
 }
 
-//招标时间zbtime、中标时间jgtime、项目状态bidstatus、招标类型bidtype、最后发布时间lasttime、首次发布时间firsttime
-func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (string, *ProjectInfo) {
+func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (string, *ProjectCache) {
 	//pId := primitive.NewObjectID() //NewObjectId()
 	pId := mongodb.StringTOBsonId(thisinfo.Id)
 	set := map[string]interface{}{}
@@ -480,7 +477,7 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 	p.mapBidLock.Unlock()
 
 	pkg := PackageFormat(thisinfo, nil)
-	p1 := p.NewCachePinfo(pId, thisinfo, bs, bt, pkg)
+	p1 := p.NewCachePinfo(pId, thisinfo, bs, bt)
 
 	now := time.Now().Unix()
 	set["createtime"] = now
@@ -489,27 +486,24 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 	set["firsttime"] = tmp["publishtime"]
 	set["lasttime"] = tmp["publishtime"]
 	//增量用系统时间,全量(历史)入库时间
-	if p.currentType == "project" {
-		set["pici"] = p.pici
-	} else {
+	if p.currentType == "pl" {
 		set["pici"] = tmp["comeintime"]
+	} else {
+		set["pici"] = p.pici
 	}
 	set["ids"] = []string{thisinfo.Id}
 	if thisinfo.TopType == "招标" {
 		//if thisinfo.SubType != "变更" && thisinfo.SubType != "其它" {
 		set["zbtime"] = tmp["publishtime"]
-		p1.Zbtime = qu.Int64All(tmp["publishtime"])
 		//}
 	} else if thisinfo.TopType == "结果" || thisinfo.SubType == "合同" {
 		set["jgtime"] = tmp["publishtime"]
-		p1.Jgtime = thisinfo.Publishtime
 	}
 	if len(thisinfo.Subscopeclass) > 0 {
 		set["s_subscopeclass"] = strings.Join(thisinfo.Subscopeclass, ",")
 	}
 	if len(thisinfo.Winners) > 0 {
 		set["s_winner"] = strings.Join(thisinfo.Winners, ",")
-		p1.Winners = thisinfo.Winners
 	}
 	if thisinfo.HasPackage {
 		set["multipackage"] = 1
@@ -520,14 +514,12 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 	//项目评审专家
 	if len(thisinfo.ReviewExperts) > 0 {
 		set["review_experts"] = thisinfo.ReviewExperts
-		p1.ReviewExperts = thisinfo.ReviewExperts
 	}
 	//标的物
 	if thisinfo.Purchasing != "" {
 		list := Duplicate(strings.Split(thisinfo.Purchasing, ",")) //标的物 去重 03/03
 		p := strings.Join(qu.ObjArrToStringArr(list), ",")
 		set["purchasing"] = p
-		p1.Purchasing = p
 	}
 	//中标候选人
 	if len(thisinfo.WinnerOrder) > 0 {
@@ -538,46 +530,37 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 			}
 		}
 		set["winnerorder"] = list
-		p1.Winnerorder = list
 	}
 	//项目规模
 	if len(thisinfo.ProjectScale) > 0 {
-		p1.ProjectScale = thisinfo.ProjectScale
 		set["project_scale"] = thisinfo.ProjectScale
 	}
 	//工期时长
 	if thisinfo.ProjectDuration > 0 {
-		p1.ProjectDuration = thisinfo.ProjectDuration
 		set["project_duration"] = thisinfo.ProjectDuration
 	}
 	// 工期单位
 	if thisinfo.ProjectDuration > 0 && len(thisinfo.ProjectTimeUnit) > 0 {
-		p1.ProjectTimeunit = thisinfo.ProjectTimeUnit
 		set["project_timeunit"] = thisinfo.ProjectTimeUnit
 	}
 	//开工日期
 	if thisinfo.ProjectStartDate > 0 {
-		p1.ProjectStartDate = thisinfo.ProjectStartDate
 		set["project_startdate"] = thisinfo.ProjectStartDate
 	}
 	//竣工日期
 	if thisinfo.ProjectCompleteDate > 0 {
-		p1.ProjctCompleteDate = thisinfo.ProjectCompleteDate
 		set["project_completedate"] = thisinfo.ProjectCompleteDate
 	}
 	//付款方式
 	if len(thisinfo.Payway) > 0 {
-		p1.Payway = thisinfo.Payway
 		set["payway"] = thisinfo.Payway
 	}
 	// 履约保证金
 	if tmp["contract_guarantee"] != nil {
-		p1.ContractGuarantee = thisinfo.ContractGuarantee
 		set["contract_guarantee"] = thisinfo.ContractGuarantee
 	}
 	// 投标保证金
 	if tmp["bid_guarantee"] != nil {
-		p1.BidGuarantee = thisinfo.BidGuarantee
 		set["bid_guarantee"] = thisinfo.BidGuarantee
 	}
 	// 资质条件
@@ -591,19 +574,17 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 			}
 		}
 		if len(str) > 0 {
-			p1.Qualifies = strings.Join(str, ",")
 			set["qualifies"] = strings.Join(str, ",")
 		}
 	}
-	if len(p1.EntIdList) > 0 {
-		set["entidlist"] = p1.EntIdList
+	if len(thisinfo.EntIdList) > 0 {
+		set["entidlist"] = thisinfo.EntIdList
 	}
 	// first_cooperation
 	if p1.Buyer != "" && len(thisinfo.Winners) > 0 {
-		//FirstCooperation(set, p1.Buyer, thisinfo.Winners, thisinfo.EntIdList)
+		FirstCooperation(set, p1.Buyer, thisinfo.Winners, thisinfo.EntIdList)
 	}
 
-	p1.InfoFiled = make(map[string]InfoField)
 	infofield := InfoField{
 		Budget:       thisinfo.Budget,
 		Bidamount:    thisinfo.Bidamount,
@@ -612,25 +593,20 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 		ProjectCode:  thisinfo.ProjectCode,
 		Bidstatus:    bs,
 	}
-	p1.InfoFiled[thisinfo.Id] = infofield
 	res := StructToMap(infofield)
 	set["infofield"] = map[string]interface{}{
 		thisinfo.Id: res,
 	}
 	if tmp["budget"] != nil && tmp["budget"] != "" {
 		set["budget"] = thisinfo.Budget
-		p1.Budgettag = 0
 		set["budgettag"] = 0
 	} else {
-		p1.Budgettag = 1
 		set["budgettag"] = 1
 	}
 	if tmp["bidamount"] != nil && tmp["bidamount"] != "" {
 		set["bidamount"] = thisinfo.Bidamount
-		p1.Bidamounttag = 0
 		set["bidamounttag"] = 0
 	} else {
-		p1.Bidamounttag = 1
 		set["bidamounttag"] = 1
 	}
 	if p1.Bidamount > 0 {
@@ -640,12 +616,12 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 			set["sortprice"] = p1.Budget
 		}
 	}
+	redis.PutCKV("project", thisinfo.Id, set)
 	push := p.PushListInfo(tmp, thisinfo.Id)
 	push["s_winner"] = strings.Join(thisinfo.Winners, ",")
 	set["list"] = []bson.M{
 		push,
 	}
-	//p.savePool <- set
 	p.updatePool <- []map[string]interface{}{
 		{
 			"_id": pId,
@@ -671,34 +647,25 @@ func (p *ProjectTask) PushListInfo(tmp map[string]interface{}, infoid string) bs
 }
 
 //生成存放在内存中的对象
-func (p *ProjectTask) NewCachePinfo(id primitive.ObjectID, thisinfo *Info, bidtype, bidstatus string, pkg map[string]interface{}) ProjectInfo {
-	p1 := ProjectInfo{
-		Id:            id,
-		Ids:           []string{thisinfo.Id},
-		ProjectName:   thisinfo.ProjectName,
-		ProjectCode:   thisinfo.ProjectCode,
-		ContractCode:  thisinfo.ContractCode,
-		Buyer:         thisinfo.Buyer,
-		Buyerclass:    thisinfo.Buyerclass,
-		Buyerperson:   thisinfo.Buyerperson,
-		Buyertel:      thisinfo.Buyertel,
-		Topscopeclass: thisinfo.Topscopeclass,
-		Subscopeclass: thisinfo.Subscopeclass,
-		Agency:        thisinfo.Agency,
-		Area:          thisinfo.Area,
-		City:          thisinfo.City,
-		District:      thisinfo.District,
-		MPN:           []string{},
-		MPC:           []string{},
-		FirstTime:     thisinfo.Publishtime,
-		LastTime:      thisinfo.Publishtime,
-		Budget:        thisinfo.Budget,
-		Package:       pkg,
-		Bidamount:     thisinfo.Bidamount,
-		Bidstatus:     bidstatus,
-		Bidtype:       bidtype,
-		Winners:       thisinfo.Winners,
-		EntIdList:     thisinfo.EntIdList,
+func (p *ProjectTask) NewCachePinfo(id primitive.ObjectID, thisinfo *Info, bidtype, bidstatus string) ProjectCache {
+	p1 := ProjectCache{
+		Id:          id,
+		Ids:         []string{thisinfo.Id},
+		ProjectName: thisinfo.ProjectName,
+		ProjectCode: thisinfo.ProjectCode,
+		Buyer:       thisinfo.Buyer,
+		Agency:      thisinfo.Agency,
+		Area:        thisinfo.Area,
+		City:        thisinfo.City,
+		District:    thisinfo.District,
+		MPN:         []string{},
+		MPC:         []string{},
+		FirstTime:   thisinfo.Publishtime,
+		LastTime:    thisinfo.Publishtime,
+		Budget:      thisinfo.Budget,
+		Bidamount:   thisinfo.Bidamount,
+		Bidstatus:   bidstatus,
+		Bidtype:     bidtype,
 	}
 	if thisinfo.LenPTC > 5 {
 		p1.MPC = append(p1.MPC, thisinfo.PTC)
@@ -706,14 +673,29 @@ func (p *ProjectTask) NewCachePinfo(id primitive.ObjectID, thisinfo *Info, bidty
 	return p1
 }
 
-//更新项目	全量合并
-func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info, pInfo *ProjectInfo, weight int, comStr string, ex int) {
+// @Description 更新项目	全量合并
+// @update 中间表查询需要更新的项目信息
+// @Author J 2022/7/6 14:02
+func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info, pInfo *ProjectCache, weight int, comStr string, ex int) {
 	if p.currentType != "updateInfo" {
 		if BinarySearch(pInfo.Ids, thisinfo.Id) > -1 {
-			log.Println("repeat", thisinfo.Id, ",pid", pInfo.Id)
+			qu.Debug("repeat", thisinfo.Id, ",pid", pInfo.Id)
 			return
 		}
 	}
+	pdata := redis.Get("project", pInfo.Id.Hex())
+	if pdata == nil {
+		qu.Debug("redis err, not find project ", pInfo.Id.Hex())
+		return
+	}
+	projectMap := pdata.(map[string]interface{})
+	bys, _ := json.Marshal(projectMap)
+	var project *Project
+	err := json.Unmarshal(bys, &project)
+	if err != nil {
+		qu.Debug("project Unmarshal err,", err)
+		return
+	}
 	set := map[string]interface{}{}
 	pInfo.Ids = append(pInfo.Ids, thisinfo.Id)
 	if len(pInfo.Ids) > 30 {
@@ -724,47 +706,49 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 	//zbtime、lasttime、jgtime
 	pInfo.LastTime = thisinfo.Publishtime
 	set["lasttime"] = thisinfo.Publishtime
+
 	if thisinfo.TopType == "招标" {
-		if pInfo.Zbtime <= 0 {
+		if project.Zbtime <= 0 {
+			project.Zbtime = thisinfo.Publishtime
 			set["zbtime"] = tmp["publishtime"]
 		}
-		if pInfo.Jgtime > 0 {
-			pInfo.Jgtime = int64(0)
+		if project.Jgtime > 0 {
+			project.Jgtime = int64(0)
 			set["jgtime"] = int64(0)
 		}
 	} else if thisinfo.TopType == "结果" {
 		if thisinfo.SubType == "中标" || thisinfo.SubType == "成交" || thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
-			if pInfo.Jgtime > 0 {
+			if project.Jgtime > 0 {
 				//jg1 := int64(math.Abs(float64(pInfo.Jgtime - thisinfo.Publishtime)))
 				//公告状态和项目状态同样都是中标或者成交,
-				if thisinfo.SubType == "成交" && pInfo.Bidstatus == "中标" {
+				if thisinfo.SubType == "成交" && project.Bidstatus == "中标" {
 					if p.jgTime < thisinfo.Publishtime {
+						project.Jgtime = thisinfo.Publishtime
 						set["jgtime"] = tmp["publishtime"]
-						pInfo.Jgtime = thisinfo.Publishtime
 					}
 					//公告状态和项目状态同样是流标或者废标
-				} else if (thisinfo.SubType == "流标" || thisinfo.SubType == "废标") && (pInfo.Bidstatus == "流标" || pInfo.Bidstatus == "废标") {
+				} else if (thisinfo.SubType == "流标" || thisinfo.SubType == "废标") && (project.Bidstatus == "流标" || project.Bidstatus == "废标") {
 					if p.jgTime < thisinfo.Publishtime {
+						project.Jgtime = thisinfo.Publishtime
 						set["jgtime"] = tmp["publishtime"]
-						pInfo.Jgtime = thisinfo.Publishtime
 					}
 				}
 			} else {
+				project.Jgtime = thisinfo.Publishtime
 				set["jgtime"] = tmp["publishtime"]
-				pInfo.Jgtime = thisinfo.Publishtime
 			}
 		}
 	} else if thisinfo.SubType == "合同" {
-		if pInfo.Bidstatus == "中标" || pInfo.Bidstatus == "成交" || pInfo.Bidstatus == "" {
+		if project.Bidstatus == "中标" || project.Bidstatus == "成交" || project.Bidstatus == "" {
 			//中标、成交不更新jgtime
 		} else {
+			project.Jgtime = thisinfo.Publishtime
 			set["jgtime"] = tmp["publishtime"]
-			pInfo.Jgtime = thisinfo.Publishtime
 		}
 	}
-	if thisinfo.Bidopentime > pInfo.Bidopentime {
-		pInfo.Bidopentime = thisinfo.Bidopentime
-		set["bidopentime"] = pInfo.Bidopentime
+	if thisinfo.Bidopentime > project.Bidopentime {
+		project.Bidopentime = thisinfo.Bidopentime
+		set["bidopentime"] = project.Bidopentime
 	}
 
 	bt := qu.ObjToString(tmp["toptype"])
@@ -776,29 +760,29 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 			set["projectscope"] = qu.ObjToString(tmp["projectscope"])
 		}
 		set["bidstatus"] = bt
-		pInfo.Bidstatus = bt
+		project.Bidstatus = bt
 		if bidtype[bs] != "" {
 			set["bidtype"] = bidtype[bs]
-			pInfo.Bidtype = bidtype[bs]
+			project.Bidtype = bidtype[bs]
 		} else {
 			set["bidtype"] = "招标"
-			pInfo.Bidtype = "招标"
+			project.Bidtype = "招标"
 		}
 	} else {
 		if bidstatus[bs] != "" {
 			set["bidstatus"] = thisinfo.SubType
-			pInfo.Bidstatus = thisinfo.SubType
+			project.Bidstatus = thisinfo.SubType
 		} else if thisinfo.Infoformat == 2 {
 			set["bidstatus"] = "拟建"
-			pInfo.Bidstatus = "拟建"
+			project.Bidstatus = "拟建"
 		} else if bs == "" && bt == "结果" {
-			if pInfo.Bidstatus == "招标" {
+			if project.Bidstatus == "招标" {
 				set["bidstatus"] = ""
-				pInfo.Bidstatus = ""
+				project.Bidstatus = ""
 			}
 		} else {
 			set["bidstatus"] = "其它"
-			pInfo.Bidstatus = "其它"
+			project.Bidstatus = "其它"
 		}
 	}
 	p.mapBidLock.Unlock()
@@ -829,13 +813,16 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 	//相同城市的公告才会合并到一起(全国列外)
 	if thisinfo.Area != "全国" {
 		pInfo.Area = thisinfo.Area
+		project.Area = thisinfo.Area
 		set["area"] = thisinfo.Area
 		if thisinfo.City != "" {
 			pInfo.City = thisinfo.City
+			project.City = thisinfo.City
 			set["city"] = thisinfo.City
 		}
 		if thisinfo.District != "" {
 			pInfo.District = thisinfo.District
+			project.District = thisinfo.District
 			set["district"] = thisinfo.District
 		}
 	}
@@ -843,46 +830,50 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 	//if (thisinfo.ProjectName != "" && pInfo.ProjectName == "") || (len([]rune(pInfo.ProjectName)) < 6 && thisinfo.LenPN > 6) {
 	if pInfo.ProjectName == "" && thisinfo.ProjectName != "" {
 		pInfo.ProjectName = thisinfo.ProjectName
+		project.ProjectName = thisinfo.ProjectName
 		set["projectname"] = thisinfo.ProjectName
 	}
 	//7--项目编号
 	//if (pInfo.ProjectCode == "" && thisinfo.ProjectCode != "") || (len([]rune(pInfo.ProjectCode)) < 6 && len([]rune(thisinfo.ProjectCode)) > 6) {
 	if pInfo.ProjectCode == "" && thisinfo.ProjectCode != "" {
 		pInfo.ProjectCode = thisinfo.ProjectCode
+		project.ProjectCode = thisinfo.ProjectCode
 		set["projectcode"] = thisinfo.ProjectCode
 	}
 	//7--采购单位
 	if (pInfo.Buyer == "" && thisinfo.Buyer != "") || (len([]rune(pInfo.Buyer)) < 5 && len([]rune(thisinfo.Buyer)) > 5) {
 		pInfo.Buyer = thisinfo.Buyer
+		project.Buyer = thisinfo.Buyer
 		set["buyer"] = thisinfo.Buyer
 
-		pInfo.Buyerclass = thisinfo.Buyerclass
+		project.Buyerclass = thisinfo.Buyerclass
 		set["buyerclass"] = thisinfo.Buyerclass
 	}
 	if pInfo.Buyer == "" {
+		project.Buyerclass = ""
 		set["buyerclass"] = ""
 	}
 	//采购单位联系人
 	if thisinfo.Buyerperson != "" {
-		pInfo.Buyerperson = thisinfo.Buyerperson
-		set["buyerperson"] = pInfo.Buyerperson
+		project.Buyerperson = thisinfo.Buyerperson
+		set["buyerperson"] = thisinfo.Buyerperson
 	} else {
-		pInfo.Buyerperson = ""
+		project.Buyerperson = ""
 		set["buyerperson"] = ""
 	}
 	//采购单位電話
 	if thisinfo.Buyertel != "" {
-		pInfo.Buyertel = thisinfo.Buyertel
-		set["buyertel"] = pInfo.Buyertel
+		project.Buyertel = thisinfo.Buyertel
+		set["buyertel"] = project.Buyertel
 	} else {
-		pInfo.Buyertel = ""
+		project.Buyertel = ""
 		set["buyertel"] = ""
 	}
 	if thisinfo.ContractCode != "" {
-		if pInfo.ContractCode == "" {
+		if project.ContractCode == "" {
 			set["contractcode"] = thisinfo.ContractCode
 		} else {
-			list := strings.Split(pInfo.ContractCode, ",")
+			list := strings.Split(project.ContractCode, ",")
 			if BinarySearch(list, thisinfo.ContractCode) == -1 {
 				list = append(list, thisinfo.ContractCode)
 				sort.Strings(list)
@@ -894,33 +885,34 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 	//8--代理机构
 	if (pInfo.Agency == "" && thisinfo.Agency != "") || (len([]rune(pInfo.Agency)) < 5 && len([]rune(thisinfo.Agency)) > 5) {
 		pInfo.Agency = thisinfo.Agency
+		project.Agency = thisinfo.Agency
 		set["agency"] = thisinfo.Agency
 	}
 
 	if len(thisinfo.Topscopeclass) > 0 {
-		sort.Strings(pInfo.Topscopeclass)
+		sort.Strings(project.Topscopeclass)
 		for _, k := range thisinfo.Topscopeclass {
-			if BinarySearch(pInfo.Topscopeclass, k) == -1 {
-				pInfo.Topscopeclass = append(pInfo.Topscopeclass, k)
-				sort.Strings(pInfo.Topscopeclass)
+			if BinarySearch(project.Topscopeclass, k) == -1 {
+				project.Topscopeclass = append(project.Topscopeclass, k)
+				sort.Strings(project.Topscopeclass)
 			}
 		}
-		set["topscopeclass"] = pInfo.Topscopeclass
+		set["topscopeclass"] = project.Topscopeclass
 	}
 
 	//项目评审专家
 	if len(thisinfo.ReviewExperts) > 0 {
 		set["review_experts"] = thisinfo.ReviewExperts
-		pInfo.ReviewExperts = thisinfo.ReviewExperts
+		project.ReviewExperts = thisinfo.ReviewExperts
 	}
 	if thisinfo.Purchasing != "" {
-		if pInfo.Purchasing == "" {
+		if project.Purchasing == "" {
 			list := Duplicate(strings.Split(thisinfo.Purchasing, ",")) //标的物 去重 03/03
 			p := strings.Join(qu.ObjArrToStringArr(list), ",")
-			pInfo.Purchasing = p
+			project.Purchasing = p
 			set["purchasing"] = p
 		} else {
-			list := strings.Split(pInfo.Purchasing, ",")
+			list := strings.Split(project.Purchasing, ",")
 			list = qu.ObjArrToStringArr(Duplicate(list))
 			for _, k := range list {
 				if BinarySearch(strings.Split(thisinfo.Purchasing, ","), k) == -1 {
@@ -941,115 +933,113 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 			}
 		}
 		set["winnerorder"] = list
-		pInfo.Winnerorder = list
+		project.Winnerorder = list
 	}
 
 	if len(thisinfo.Subscopeclass) > 0 {
-		sort.Strings(pInfo.Subscopeclass)
+		sort.Strings(project.Subscopeclass)
 		for _, k := range thisinfo.Subscopeclass {
-			if BinarySearch(pInfo.Subscopeclass, k) == -1 {
-				pInfo.Subscopeclass = append(pInfo.Subscopeclass, k)
-				sort.Strings(pInfo.Subscopeclass)
+			if BinarySearch(project.Subscopeclass, k) == -1 {
+				project.Subscopeclass = append(project.Subscopeclass, k)
+				sort.Strings(project.Subscopeclass)
 			}
 		}
-		set["subscopeclass"] = pInfo.Subscopeclass
-		set["s_subscopeclass"] = strings.Join(pInfo.Subscopeclass, ",")
+		set["subscopeclass"] = project.Subscopeclass
+		set["s_subscopeclass"] = strings.Join(project.Subscopeclass, ",")
 	}
 
 	if len(thisinfo.Winners) > 0 {
-		if len(pInfo.Winners) <= 0 {
+		if len(project.Winners) <= 0 {
 			set["winner"] = qu.ObjToString(tmp["winner"])
 		}
-		//sort.Strings(pInfo.Winners)
+		winners := strings.Split(project.Winners, ",")
 		for _, k := range thisinfo.Winners {
 			if thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
-				if BinarySearch(pInfo.Winners, k) != -1 {
-					deleteSlice(pInfo.Winners, k, "")
-					//sort.Strings(pInfo.Winners)
+				if BinarySearch(winners, k) != -1 {
+					deleteSlice(winners, k, "")
 				}
 			} else {
-				if BinarySearch(pInfo.Winners, k) == -1 {
-					pInfo.Winners = append(pInfo.Winners, k)
-					//sort.Strings(pInfo.Winners)
+				if BinarySearch(winners, k) == -1 {
+					winners = append(winners, k)
 				}
 			}
 		}
 
-		set["s_winner"] = strings.Join(qu.ObjArrToStringArr(Duplicate(pInfo.Winners)), ",")
+		set["s_winner"] = strings.Join(qu.ObjArrToStringArr(Duplicate(winners)), ",")
 	}
 
 	if len(thisinfo.EntIdList) > 0 {
 		for _, v := range thisinfo.EntIdList {
-			if BinarySearch(pInfo.EntIdList, v) == -1 {
-				pInfo.EntIdList = append(pInfo.EntIdList, v)
+			if BinarySearch(project.EntIdList, v) == -1 {
+				project.EntIdList = append(project.EntIdList, v)
 			}
 		}
-		set["entidlist"] = pInfo.EntIdList
+		set["entidlist"] = project.EntIdList
 	}
 	// first_cooperation
-	if pInfo.Buyer != "" && len(pInfo.Winners) > 0 {
-		//FirstCooperation(set, pInfo.Buyer, pInfo.Winners, pInfo.EntIdList)
+	if pInfo.Buyer != "" && len(strings.Split(project.Winners, ",")) > 0 {
+		FirstCooperation(set, pInfo.Buyer, strings.Split(project.Winners, ","), project.EntIdList)
 	}
 
 	//项目规模
 	if len(thisinfo.ProjectScale) > 0 {
-		pInfo.ProjectScale = thisinfo.ProjectScale
+		project.ProjectScale = thisinfo.ProjectScale
 		set["project_scale"] = thisinfo.ProjectScale
 	}
 	//工期时长
 	if thisinfo.ProjectDuration > 0 {
-		pInfo.ProjectDuration = thisinfo.ProjectDuration
+		project.ProjectDuration = thisinfo.ProjectDuration
 		set["project_duration"] = thisinfo.ProjectDuration
 	}
 	// 工期单位
 	if thisinfo.ProjectDuration > 0 && len(thisinfo.ProjectTimeUnit) > 0 {
-		pInfo.ProjectTimeunit = thisinfo.ProjectTimeUnit
+		project.ProjectTimeunit = thisinfo.ProjectTimeUnit
 		set["project_timeunit"] = thisinfo.ProjectTimeUnit
 	}
 	//开工日期
 	if thisinfo.ProjectStartDate > 0 {
-		if pInfo.ProjectStartDate > 0 {
-			if pInfo.ProjectStartDate < thisinfo.ProjectStartDate {
-				pInfo.ProjectStartDate = thisinfo.ProjectStartDate
+		if project.ProjectStartDate > 0 {
+			if project.ProjectStartDate < thisinfo.ProjectStartDate {
+				project.ProjectStartDate = thisinfo.ProjectStartDate
 				set["project_startdate"] = thisinfo.ProjectStartDate
 			}
 		} else {
-			pInfo.ProjectStartDate = thisinfo.ProjectStartDate
+			project.ProjectStartDate = thisinfo.ProjectStartDate
 			set["project_startdate"] = thisinfo.ProjectStartDate
 		}
 	}
 	//竣工日期
 	if thisinfo.ProjectCompleteDate > 0 {
-		if pInfo.ProjctCompleteDate > 0 {
-			if pInfo.ProjctCompleteDate < thisinfo.ProjectCompleteDate {
-				pInfo.ProjctCompleteDate = thisinfo.ProjectCompleteDate
+		if project.ProjctCompleteDate > 0 {
+			if project.ProjctCompleteDate < thisinfo.ProjectCompleteDate {
+				project.ProjctCompleteDate = thisinfo.ProjectCompleteDate
 				set["project_completedate"] = thisinfo.ProjectCompleteDate
 			}
 		} else {
-			pInfo.ProjctCompleteDate = thisinfo.ProjectCompleteDate
+			project.ProjctCompleteDate = thisinfo.ProjectCompleteDate
 			set["project_completedate"] = thisinfo.ProjectCompleteDate
 		}
 	}
 	// 付款方式
 	if len(thisinfo.Payway) > 0 {
-		pInfo.Payway = thisinfo.Payway
+		project.Payway = thisinfo.Payway
 		set["payway"] = thisinfo.Payway
 	}
 	// 履约保证金
 	if tmp["contract_guarantee"] != nil {
-		pInfo.ContractGuarantee = thisinfo.ContractGuarantee
+		project.ContractGuarantee = thisinfo.ContractGuarantee
 		set["contract_guarantee"] = thisinfo.ContractGuarantee
 	}
 	// 投标保证金
 	if tmp["bid_guarantee"] != nil {
-		pInfo.BidGuarantee = thisinfo.BidGuarantee
+		project.BidGuarantee = thisinfo.BidGuarantee
 		set["bid_guarantee"] = thisinfo.BidGuarantee
 	}
 	// 资质条件
 	if len(thisinfo.Qualifies) > 0 {
 		var str []string
-		if len(pInfo.Qualifies) > 0 {
-			str = append(str, strings.Split(pInfo.Qualifies, ",")...)
+		if len(project.Qualifies) > 0 {
+			str = append(str, strings.Split(project.Qualifies, ",")...)
 		}
 		for _, v := range thisinfo.Qualifies {
 			if len(qu.ObjToString(v["key"])) > 0 {
@@ -1059,24 +1049,26 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 			}
 		}
 		if len(str) > 0 {
-			pInfo.Qualifies = strings.Join(str, ",")
+			project.Qualifies = strings.Join(str, ",")
 			set["qualifies"] = strings.Join(str, ",")
 		}
 	}
 
 	if thisinfo.HasPackage { //多包处理
 		set["multipackage"] = 1
-		pkg := PackageFormat(thisinfo, pInfo)
-		pInfo.Package = pkg
-		set["package"] = pInfo.Package
+		pkg := PackageFormat(thisinfo, project)
+		project.Package = pkg
+		set["package"] = project.Package
 	}
 	//处理多包后,计算预算金额、中标金额
-	CountAmount(pInfo, thisinfo, tmp)
-	if pInfo.Budget >= 0 && pInfo.Budgettag != 1 {
-		set["budget"] = pInfo.Budget
+	CountAmount(project, thisinfo, tmp)
+	if project.Budget >= 0 && project.Budgettag != 1 {
+		pInfo.Budget = project.Budget
+		set["budget"] = project.Budget
 		set["budgettag"] = 0
 	}
-	if pInfo.Bidamount >= 0 && pInfo.Bidamounttag != 1 {
+	if project.Bidamount >= 0 && project.Bidamounttag != 1 {
+		pInfo.Bidamount = project.Bidamount
 		set["bidamount"] = pInfo.Bidamount
 		set["bidamounttag"] = 0
 	}
@@ -1096,14 +1088,14 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 		ProjectCode:  thisinfo.ProjectCode,
 		Bidstatus:    bs,
 	}
-	copyMap := Copy(pInfo.InfoFiled).(map[string]InfoField)
+	copyMap := Copy(project.InfoFiled).(map[string]InfoField)
 	copyMap[thisinfo.Id] = infofield
 	tmpMap := make(map[string]interface{})
 	for k, v := range copyMap {
 		tmpMap[k] = StructToMap(v)
 	}
 	tmpMap[thisinfo.Id] = StructToMap(infofield)
-	pInfo.InfoFiled = copyMap
+	project.InfoFiled = copyMap
 	set["infofield"] = tmpMap
 
 	set["mpn"] = pInfo.MPN
@@ -1113,6 +1105,7 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 	} else {
 		set["pici"] = tmp["comeintime"]
 	}
+	redis.PutCKV("project", project.Id.Hex(), set)
 	update := map[string]interface{}{}
 	if len(set) > 0 {
 		update["$set"] = set
@@ -1150,7 +1143,7 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
  *	3、项目合并时,项目状态是”流标“/”废标“,招标信息状态不是”招标“		异常:2
  *	4、项目合并时,项目状态是”合同“/”其它“,招标信息类型是”结果“		异常:3
  */
-func (p *ProjectTask) CompareStatus(project *ProjectInfo, info *Info) (bool, int) {
+func (p *ProjectTask) CompareStatus(project *ProjectCache, info *Info) (bool, int) {
 	if info.TopType == "拟建" || info.TopType == "预告" || info.TopType == "招标" {
 		if project.Bidstatus == "拟建" || project.Bidstatus == "预告" || project.Bidstatus == "招标" {
 			return false, 0
@@ -1187,7 +1180,7 @@ func (p *ProjectTask) CompareStatus(project *ProjectInfo, info *Info) (bool, int
  *	对比地区(省、市),存在且不同,不能合并
  *	返回是否新建项目
  */
-func ComparePlace(project *ProjectInfo, info *Info) bool {
+func ComparePlace(project *ProjectCache, info *Info) bool {
 	if info.Area == "全国" || info.Area == "" {
 		return false
 	}
@@ -1220,7 +1213,7 @@ func packageEle(map1 map[string]interface{}, id string) map[string]interface{} {
 	return p2
 }
 
-func PackageFormat(info *Info, project *ProjectInfo) map[string]interface{} {
+func PackageFormat(info *Info, project *Project) map[string]interface{} {
 	p1 := map[string]interface{}{}
 	if project != nil && project.Package != nil && len(project.Package) > 0 {
 		packageCopy := Copy(project.Package).(map[string]interface{})
@@ -1264,7 +1257,7 @@ func PackageFormat(info *Info, project *ProjectInfo) map[string]interface{} {
 }
 
 // 计算预算(budget)、中标金额(bidamount)
-func CountAmount(project *ProjectInfo, info *Info, tmp map[string]interface{}) {
+func CountAmount(project *Project, info *Info, tmp map[string]interface{}) {
 	if info.HasPackage {
 		budget := 0.0
 		for _, v := range project.Package {

+ 53 - 60
fullproject/src_v1/task.go

@@ -8,6 +8,7 @@ import (
 	mu "mfw/util"
 	"mongodb"
 	"qfw/util"
+	"qfw/util/redis"
 	"regexp"
 	"strings"
 	"sync"
@@ -16,7 +17,6 @@ import (
 
 	"github.com/goinggo/mapstructure"
 	"github.com/robfig/cron"
-	"go.mongodb.org/mongo-driver/bson/primitive"
 )
 
 /**
@@ -95,11 +95,7 @@ type ProjectTask struct {
 	statusTime int64
 	//结果时间的更新		最近两天的公告不再更新jgtime
 	jgTime int64
-	//	LockPool     chan *sync.Mutex
-	//	LockPoolLock sync.Mutex
-	//	m1, m23, m4  map[int]int
-	//	l1, l23, l4  map[int]*sync.Mutex
-	Brun bool
+	Brun   bool
 }
 
 func NewPT() *ProjectTask {
@@ -117,7 +113,7 @@ func NewPT() *ProjectTask {
 		mapHref:   make(map[string]string, 1500000),
 		mapSite:   make(map[string]*Site, 1000000),
 		mapSpider: make(map[string]int, 1000000),
-		saveSize:  100,
+		saveSize:  200,
 
 		//saveSign:   make(chan bool, 1),
 		//updateSign: make(chan bool, 1),
@@ -130,15 +126,7 @@ func NewPT() *ProjectTask {
 }
 
 var P_QL *ProjectTask
-var sp = make(chan bool, 5)
-
-//初始化全量合并对象
-func init() {
-	P_QL = NewPT()
-	log.Println(len(P_QL.updatePool))
-	go P_QL.updateAllQueue()
-	go P_QL.clearMem()
-}
+var sp = make(chan bool, 1)
 
 func (p *ProjectTask) updateAllQueue() {
 	arru := make([][]map[string]interface{}, p.saveSize)
@@ -159,7 +147,7 @@ func (p *ProjectTask) updateAllQueue() {
 				arru = make([][]map[string]interface{}, p.saveSize)
 				indexu = 0
 			}
-		case <-time.After(1000 * time.Millisecond):
+		case <-time.After(1 * time.Second):
 			if indexu > 0 {
 				sp <- true
 				go func(arru [][]map[string]interface{}) {
@@ -178,6 +166,7 @@ func (p *ProjectTask) updateAllQueue() {
 //项目合并内存更新
 func (p *ProjectTask) clearMem() {
 	c := cron.New()
+	// 创建项目的时间大于7天
 	//在内存中保留最近6个月的信息
 	//跑全量时每5分钟跑一次,跑增量时400分钟跑一次
 	_ = c.AddFunc("50 0/5 * * * *", func() {
@@ -199,13 +188,14 @@ func (p *ProjectTask) clearMem() {
 			clearNum := 0
 			for kHref, pid := range p.mapHref { //删除mapHref,p.AllIdsMap删除之前执行
 				v := p.AllIdsMap[pid]
-				if p.currentTime-v.P.LastTime > p.validTime {
+				if v != nil && p.currentTime-v.P.LastTime > p.validTime {
 					delete(p.mapHref, kHref)
 				}
 			}
 			for k, v := range p.AllIdsMap {
 				if p.currentTime-v.P.LastTime > p.validTime {
 					clearNum++
+					redis.Del("project", k)
 					//删除id的map
 					delete(p.AllIdsMap, k)
 					//删除pb
@@ -274,7 +264,7 @@ func (p *ProjectTask) taskQl(udpInfo map[string]interface{}) {
 		var idmap map[string]interface{}
 		if len(lteid) > 15 {
 			idmap = map[string]interface{}{
-				"$lte": StringTOBsonId(lteid),
+				"$lte": mongodb.StringTOBsonId(lteid),
 			}
 		}
 		gtid, _ := udpInfo["gtid"].(string)
@@ -282,7 +272,7 @@ func (p *ProjectTask) taskQl(udpInfo map[string]interface{}) {
 			if idmap == nil {
 				idmap = map[string]interface{}{}
 			}
-			idmap["$gte"] = StringTOBsonId(gtid)
+			idmap["$gte"] = mongodb.StringTOBsonId(gtid)
 		}
 		if idmap != nil {
 			q["_id"] = idmap
@@ -316,30 +306,30 @@ func (p *ProjectTask) taskZl(udpInfo map[string]interface{}) {
 	lteid := udpInfo["lteid"].(string)
 	q = map[string]interface{}{
 		"_id": map[string]interface{}{
-			"$gt":  StringTOBsonId(gtid),
-			"$lte": StringTOBsonId(lteid),
+			"$gt":  mongodb.StringTOBsonId(gtid),
+			"$lte": mongodb.StringTOBsonId(lteid),
 		},
 	}
 	p.enter(db, coll, q)
 	if udpInfo["stop"] == nil {
-		for i := 0; i < 5; i++ {
+		for i := 0; i < 1; i++ {
 			sp <- true
 		}
-		for i := 0; i < 5; i++ {
+		for i := 0; i < 1; i++ {
 			<-sp
 		}
-		log.Println("保存完成,生索引", p.pici)
-		time.Sleep(5 * time.Second)
-		nextNode(udpInfo, p.pici)
 	}
+	log.Println("保存完成,生索引", p.pici)
+	time.Sleep(5 * time.Second)
+	nextNode(udpInfo, p.pici)
 }
 
 //招标字段更新
 func (p *ProjectTask) taskUpdateInfo(udpInfo map[string]interface{}) {
 	defer util.Catch()
 	infoid := udpInfo["infoid"].(string)
-	infoMap := MgoBidding.FindById(util.ObjToString(udpInfo["coll"]), infoid)
-	if infoMap["modifyinfo"] == nil {
+	infoMap, _ := MgoBidding.FindById(util.ObjToString(udpInfo["coll"]), infoid, nil)
+	if (*infoMap)["modifyinfo"] == nil {
 		util.Debug("does not exist modifyinfo ---,", infoid)
 		return
 	}
@@ -349,7 +339,7 @@ func (p *ProjectTask) taskUpdateInfo(udpInfo map[string]interface{}) {
 	data := Es.Get(Index, Itype, esquery)
 	if len(*data) > 0 {
 		pid := util.ObjToString(((*data)[0])["_id"])
-		p.updateJudge(infoMap, pid)
+		p.updateJudge(*infoMap, pid)
 	} else {
 		util.Debug("not find project---,", infoid)
 	}
@@ -364,11 +354,11 @@ func (p *ProjectTask) taskUpdatePro(udpInfo map[string]interface{}) {
 		util.Debug("参数有误")
 		return
 	}
-	proMap := MongoTool.FindById(ProjectColl, pid)
-	if len(proMap) > 1 {
-		proMap["reason"] = "直接修改项目字段信息"
-		backupPro(proMap)
-		delete(proMap, "reason")
+	proMap, _ := MongoTool.FindById(ProjectColl, pid, nil)
+	if len(*proMap) > 1 {
+		(*proMap)["reason"] = "直接修改项目字段信息"
+		backupPro(*proMap)
+		delete(*proMap, "reason")
 		updataMap := make(map[string]interface{})
 		modifyInfo := make(map[string]interface{})
 		for k, v := range *updateMap {
@@ -396,7 +386,7 @@ func (p *ProjectTask) taskUpdatePro(udpInfo map[string]interface{}) {
 			_ = udpclient.WriteUdp(by, mu.OP_TYPE_DATA, toaddr[1])
 		}
 		// 内存
-		var pro ProjectInfo
+		var pro ProjectCache
 		err := mapstructure.Decode(proMap, &pro)
 		if err != nil {
 			util.Debug(err)
@@ -496,15 +486,12 @@ func (p *ProjectTask) enter(db, coll string, q map[string]interface{}) {
 			}
 		}
 	}()
-	fields := map[string]interface{}{"kvtext": 0, "repeat_reason": 0}
-	if p.currentType == "project" {
+	fields := map[string]interface{}{"kvtext": 0, "repeat_reason": 0, "field_source": 0}
+	if p.currentType == "project" || p.currentType == "project_history" {
 		c, _ := sess.DB(db).C(coll).Find(q).Count()
 		util.Debug("共查询:", c, "条")
 	}
 	ms := sess.DB(db).C(coll).Find(q).Select(fields).Sort("publishtime")
-	//if Sysconfig["hints"] != nil {
-	//	ms.Hint(Sysconfig["hints"])
-	//}
 	query := ms.Iter()
 	var lastid interface{}
 L:
@@ -520,12 +507,12 @@ L:
 			if query.Next(&tmp) {
 				lastid = tmp["_id"]
 				if P_QL.currentType == "ql" {
-					if count%20000 == 0 {
-						log.Println("current", count, lastid)
+					if count%50000 == 0 {
+						util.Debug("current", count, lastid)
 					}
 				} else {
 					if count%2000 == 0 {
-						log.Println("current", count, lastid)
+						util.Debug("current", count, lastid)
 					}
 				}
 				if util.IntAll(tmp["repeat"]) == 0 {
@@ -533,9 +520,11 @@ L:
 						if P_QL.currentType == "ql" {
 							infoPool <- tmp
 						} else if P_QL.currentType == "project" && util.IntAll(tmp["dataging"]) == 0 {
+							// id段增量数据
+							infoPool <- tmp
+						} else if P_QL.currentType == "project_history" && util.ObjToString(tmp["history_updatetime"]) != "" {
+							// id段 历史数据
 							infoPool <- tmp
-						} else {
-							util.Debug("增量   dataging == 1 ", tmp["_id"])
 						}
 					}
 				} else {
@@ -572,10 +561,15 @@ func (p *ProjectTask) CommonMerge(tmp map[string]interface{}, info *Info) {
 				p.mapHrefLock.Unlock()
 				if pid != "" {
 					p.AllIdsMapLock.Lock()
-					comparePro := p.AllIdsMap[pid].P
+					res := p.AllIdsMap[pid]
 					p.AllIdsMapLock.Unlock()
-					_, ex := p.CompareStatus(comparePro, info)
-					p.UpdateProject(tmp, info, comparePro, -1, "AAAAAAAAAA", ex)
+					if res != nil {
+						comparePro := res.P
+						_, ex := p.CompareStatus(comparePro, info)
+						p.UpdateProject(tmp, info, comparePro, -1, "AAAAAAAAAA", ex)
+					} else {
+						p.startProjectMerge(info, tmp)
+					}
 				} else {
 					id, p1 := p.NewProject(tmp, info)
 					p.mapHrefLock.Lock()
@@ -593,6 +587,7 @@ func (p *ProjectTask) CommonMerge(tmp map[string]interface{}, info *Info) {
 			//项目合并
 			p.startProjectMerge(info, tmp)
 		}
+	} else {
 	}
 }
 
@@ -736,13 +731,11 @@ func ParseInfo(tmp map[string]interface{}) (info *Info) {
 }
 
 func (p *ProjectTask) updateJudge(infoMap map[string]interface{}, pid string) {
-	tmpPro := MongoTool.FindById(ProjectColl, pid)
-
+	tmpPro, _ := MongoTool.FindById(ProjectColl, pid, nil)
 	modifyProMap := make(map[string]interface{}) // 修改项目的字段
-
 	if modifyMap, ok := infoMap["modifyinfo"].(map[string]interface{}); ok {
 		for k := range modifyMap {
-			if modifyMap[k] != nil && modifyMap[k] != "" && tmpPro[k] != nil {
+			if modifyMap[k] != nil && modifyMap[k] != "" && (*tmpPro)[k] != nil {
 				modifyProMap[k] = infoMap[k]
 			}
 		}
@@ -754,7 +747,7 @@ func (p *ProjectTask) updateJudge(infoMap map[string]interface{}, pid string) {
 	p.AllIdsMapLock.Lock()
 	_, ok := p.AllIdsMap[pid]
 	p.AllIdsMapLock.Unlock()
-	ids := []interface{}(tmpPro["ids"].(primitive.A))
+	ids := (*tmpPro)["ids"].([]interface{})
 	index, position := -1, 0 // index 0:第一个,1:中间,2:最后一个   position list中位置
 
 	for i, v := range ids {
@@ -779,7 +772,7 @@ func (p *ProjectTask) updateJudge(infoMap map[string]interface{}, pid string) {
 				tempId := p.mapHref[proHref]
 				p.mapHrefLock.Unlock()
 				if pid == tempId {
-					p.modifyUpdate(pid, index, position, tmpPro, modifyProMap)
+					p.modifyUpdate(pid, index, position, *tmpPro, modifyProMap)
 				} else {
 					util.Debug("projecthref data id err---pid="+pid, "---"+tempId)
 				}
@@ -788,11 +781,11 @@ func (p *ProjectTask) updateJudge(infoMap map[string]interface{}, pid string) {
 				if f {
 					//合并、修改
 					util.Debug("合并修改更新", "----------------------------")
-					p.mergeAndModify(pid, index, position, infoMap, tmpPro, modifyProMap)
+					p.mergeAndModify(pid, index, position, infoMap, *tmpPro, modifyProMap)
 				} else {
 					//修改
 					util.Debug("修改更新", "----------------------------")
-					p.modifyUpdate(pid, index, position, tmpPro, modifyProMap)
+					p.modifyUpdate(pid, index, position, *tmpPro, modifyProMap)
 				}
 			}
 		} else {
@@ -800,17 +793,17 @@ func (p *ProjectTask) updateJudge(infoMap map[string]interface{}, pid string) {
 			if f {
 				//合并、修改
 				util.Debug("合并修改更新", "----------------------------")
-				p.mergeAndModify(pid, index, position, infoMap, tmpPro, modifyProMap)
+				p.mergeAndModify(pid, index, position, infoMap, *tmpPro, modifyProMap)
 			} else {
 				//修改
 				util.Debug("修改更新", "----------------------------")
-				p.modifyUpdate(pid, index, position, tmpPro, modifyProMap)
+				p.modifyUpdate(pid, index, position, *tmpPro, modifyProMap)
 			}
 		}
 	} else {
 		// 周期外
 		util.Debug("周期外数据直接修改", "----------------------------")
-		p.modifyUpdate(pid, index, position, tmpPro, modifyProMap)
+		p.modifyUpdate(pid, index, position, *tmpPro, modifyProMap)
 	}
 }
 

+ 849 - 179
fullproject/src_v1/update.go

@@ -2,13 +2,16 @@ package main
 
 import (
 	"encoding/json"
+	"fmt"
 	"github.com/go-xweb/log"
 	"github.com/goinggo/mapstructure"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
 	"math"
 	mu "mfw/util"
+	"mongodb"
 	qu "qfw/util"
+	"qfw/util/redis"
 	"reflect"
 	"sort"
 	"strings"
@@ -86,17 +89,17 @@ func (p *ProjectTask) mergeAndModify(pInfoId string, index, position int, tmp ma
 			flag := true // 标记是否需要删除原有项目信息
 			for _, v := range proList {
 				v1 := v.(map[string]interface{})
-				temp := MongoTool.FindById(ExtractColl, qu.ObjToString(v1["infoid"]))
-				if len(temp) == 0 {
-					temp = MongoTool.FindById(ExtractColl1, qu.ObjToString(v1["infoid"]))
-					if len(temp) == 0 {
+				temp, _ := MongoTool.FindById(ExtractColl, qu.ObjToString(v1["infoid"]), nil)
+				if len(*temp) == 0 {
+					temp, _ = MongoTool.FindById(ExtractColl1, qu.ObjToString(v1["infoid"]), nil)
+					if len(*temp) == 0 {
 						qu.Debug("extract not find id...", v1["infoid"])
 						continue
 					}
 				}
-				tempInfo := ParseInfo(temp)
+				tempInfo := ParseInfo(*temp)
 				if flag {
-					merge := p.ReMerge(tempInfo, temp, tmpPro)
+					merge := p.ReMerge(tempInfo, *temp, tmpPro)
 					if !merge {
 						flag = false
 						break
@@ -195,12 +198,12 @@ func (p *ProjectTask) mergeAndModify(pInfoId string, index, position int, tmp ma
 
 // 删除
 func (p *ProjectTask) delJudge(infoid, pid string) {
-	tmpPro := MongoTool.FindById(ProjectColl, pid)
-	ids := []interface{}(tmpPro["ids"].(primitive.A))
-	proList := []interface{}(tmpPro["list"].(primitive.A))
+	tmpPro, _ := MongoTool.FindById(ProjectColl, pid, nil)
+	ids := []interface{}((*tmpPro)["ids"].(primitive.A))
+	proList := []interface{}((*tmpPro)["list"].(primitive.A))
 	if len(ids) == 1 {
-		tmpPro["reason"] = "删除项目信息"
-		backupPro(tmpPro)
+		(*tmpPro)["reason"] = "删除项目信息"
+		backupPro(*tmpPro)
 		c := MongoTool.Delete(ProjectColl, pid)
 		if c > 0 {
 			client := Es.GetEsConn()
@@ -222,25 +225,25 @@ func (p *ProjectTask) delJudge(infoid, pid string) {
 		}
 	}
 	if index == 0 {
-		tmpPro["reason"] = "删除list中第一个条招标公告信息"
-		backupPro(tmpPro)
-		delete(tmpPro, "reason")
+		(*tmpPro)["reason"] = "删除list中第一个条招标公告信息"
+		backupPro(*tmpPro)
+		delete(*tmpPro, "reason")
 		proList = deleteSlice1(proList, proList[0])
-		var pro *ProjectInfo
+		var pro *ProjectCache
 		flag := true // 标记是否需要删除原有项目信息
 		for _, v := range proList {
 			v1 := v.(map[string]interface{})
-			temp := MongoTool.FindById(ExtractColl, qu.ObjToString(v1["infoid"]))
-			if len(temp) == 0 {
-				temp = MongoTool.FindById(ExtractColl1, qu.ObjToString(v1["infoid"]))
-				if len(temp) == 0 {
+			temp, _ := MongoTool.FindById(ExtractColl, qu.ObjToString(v1["infoid"]), nil)
+			if len(*temp) == 0 {
+				temp, _ = MongoTool.FindById(ExtractColl1, qu.ObjToString(v1["infoid"]), nil)
+				if len(*temp) == 0 {
 					qu.Debug("extract not find id...", v1["infoid"])
 					continue
 				}
 			}
-			tempInfo := ParseInfo(temp)
+			tempInfo := ParseInfo(*temp)
 			if flag {
-				merge := p.ReMerge(tempInfo, temp, tmpPro)
+				merge := p.ReMerge(tempInfo, *temp, *tmpPro)
 				if !merge {
 					flag = false
 					break
@@ -250,7 +253,7 @@ func (p *ProjectTask) delJudge(infoid, pid string) {
 		if flag {
 			delOldPro(pid)
 		} else {
-			tmpPro, pro = p.innerMerge(proList, tmpPro)
+			*tmpPro, pro = p.innerMerge(proList, *tmpPro)
 			bol := MongoTool.UpdateById(ProjectColl, pid, map[string]interface{}{"$set": tmpPro})
 			if bol {
 				by, _ := json.Marshal(map[string]interface{}{
@@ -272,11 +275,11 @@ func (p *ProjectTask) delJudge(infoid, pid string) {
 			p.AllIdsMapLock.Unlock()
 		}
 	} else if index == 1 {
-		tmpPro["reason"] = "删除list中间某一条招标公告信息"
-		backupPro(tmpPro)
-		delete(tmpPro, "reason")
-		var pro *ProjectInfo
-		tmpPro, pro = p.innerMerge1(proList, infoid, tmpPro)
+		(*tmpPro)["reason"] = "删除list中间某一条招标公告信息"
+		backupPro(*tmpPro)
+		delete(*tmpPro, "reason")
+		var pro *ProjectCache
+		*tmpPro, pro = p.innerMerge1(proList, infoid, *tmpPro)
 		bol := MongoTool.UpdateById(ProjectColl, pid, map[string]interface{}{"$set": tmpPro})
 		if bol {
 			by, _ := json.Marshal(map[string]interface{}{
@@ -297,13 +300,13 @@ func (p *ProjectTask) delJudge(infoid, pid string) {
 		}
 		p.AllIdsMapLock.Unlock()
 	} else if index == 2 {
-		tmpPro["reason"] = "删除list中最后一条招标公告信息"
-		backupPro(tmpPro)
-		delete(tmpPro, "reason")
+		(*tmpPro)["reason"] = "删除list中最后一条招标公告信息"
+		backupPro(*tmpPro)
+		delete(*tmpPro, "reason")
 		w := len(proList) - 1
 		proList = deleteSlice1(proList, proList[w])
-		var pro *ProjectInfo
-		tmpPro, pro = p.innerMerge(proList, tmpPro)
+		var pro *ProjectCache
+		*tmpPro, pro = p.innerMerge(proList, *tmpPro)
 		bol := MongoTool.UpdateById(ProjectColl, pid, map[string]interface{}{"$set": tmpPro})
 		if bol {
 			by, _ := json.Marshal(map[string]interface{}{
@@ -339,9 +342,9 @@ func (p *ProjectTask) ReMerge(info *Info, tmp map[string]interface{}, tmpPro map
 
 	bFindProject := false
 	findPid := ""
-	comRes1 := []*ProjectInfo{}
-	comRes2 := []*ProjectInfo{}
-	comRes3 := []*ProjectInfo{}
+	comRes1 := []*ProjectCache{}
+	comRes2 := []*ProjectCache{}
+	comRes3 := []*ProjectCache{}
 	for _, v := range IDArr {
 		comStr := ""
 		compareProject := v.P
@@ -377,7 +380,7 @@ func (p *ProjectTask) ReMerge(info *Info, tmp map[string]interface{}, tmpPro map
 		}
 	}
 	//--------------------------------对比完成-----------------------
-	for kv, resN := range [][]*ProjectInfo{comRes1, comRes2, comRes3} {
+	for kv, resN := range [][]*ProjectCache{comRes1, comRes2, comRes3} {
 		if len(resN) > 0 {
 			if len(resN) > 1 {
 				sort.Slice(resN, func(i, j int) bool {
@@ -386,7 +389,7 @@ func (p *ProjectTask) ReMerge(info *Info, tmp map[string]interface{}, tmpPro map
 			}
 
 			ex := 0
-			resArr := []*ProjectInfo{}
+			resArr := []*ProjectCache{}
 			for i, res := range resN {
 				choose, e := p.CompareStatus(resN[i], info)
 				if !choose {
@@ -397,7 +400,7 @@ func (p *ProjectTask) ReMerge(info *Info, tmp map[string]interface{}, tmpPro map
 			if len(resArr) > 0 {
 				bFindProject = true
 				findPid = resArr[0].Id.Hex()
-				if findPid == BsonIdToSId(tmpPro["_id"]) {
+				if findPid == mongodb.BsonIdToSId(tmpPro["_id"]) {
 					return false
 				}
 				p.updateProFiled(tmp, info, resArr[0], kv+1, resArr[0].comStr, ex)
@@ -453,93 +456,104 @@ func (p *ProjectTask) ReMerge(info *Info, tmp map[string]interface{}, tmpPro map
 }
 
 //内部合并
-func (p *ProjectTask) innerMerge(infoList []interface{}, tmpPro map[string]interface{}) (map[string]interface{}, *ProjectInfo) {
+func (p *ProjectTask) innerMerge(infoList []interface{}, tmpPro map[string]interface{}) (map[string]interface{}, *ProjectCache) {
 	newP := make(map[string]interface{})
 	newP["_id"] = tmpPro["_id"]
-	var p1 *ProjectInfo
+	var p1 *ProjectCache
 	for k, m := range infoList {
 		m1 := m.(map[string]interface{})
-		temp := MongoTool.FindById(ExtractColl, qu.ObjToString(m1["infoid"]))
-		if len(temp) == 0 {
-			temp = MongoTool.FindById(ExtractColl1, qu.ObjToString(m1["infoid"]))
-			if len(temp) == 0 {
+		temp, _ := MongoTool.FindById(ExtractColl, qu.ObjToString(m1["infoid"]), nil)
+		if len(*temp) == 0 {
+			temp, _ = MongoTool.FindById(ExtractColl1, qu.ObjToString(m1["infoid"]), nil)
+			if len(*temp) == 0 {
 				qu.Debug("extract not find id...", m1["infoid"])
 				continue
 			}
 		}
-		tempInfo := ParseInfo(temp)
+		tempInfo := ParseInfo(*temp)
 		if k == 0 {
-			p1 = p.newPro(temp, newP, tempInfo)
+			p1 = p.newPro(*temp, newP, tempInfo)
 		} else {
-			p.updateOldProField(p1, tempInfo, newP, temp, m1)
+			p.updateOldProField(p1, tempInfo, newP, *temp, m1)
 		}
 	}
 	return newP, p1
 }
 
-func (p *ProjectTask) innerMerge1(infoList []interface{}, infoid string, tmpPro map[string]interface{}) (map[string]interface{}, *ProjectInfo) {
+func (p *ProjectTask) innerMerge1(infoList []interface{}, infoid string, tmpPro map[string]interface{}) (map[string]interface{}, *ProjectCache) {
 	newP := make(map[string]interface{})
 	newP["_id"] = tmpPro["_id"]
-	var p1 *ProjectInfo
+	var p1 *ProjectCache
 	for k, m := range infoList {
 		m1 := m.(map[string]interface{})
 		if m1["infoid"] == infoid {
 			continue
 		}
-		temp := MongoTool.FindById(ExtractColl, qu.ObjToString(m1["infoid"]))
-		if len(temp) == 0 {
-			temp = MongoTool.FindById(ExtractColl1, qu.ObjToString(m1["infoid"]))
-			if len(temp) == 0 {
+		temp, _ := MongoTool.FindById(ExtractColl, qu.ObjToString(m1["infoid"]), nil)
+		if len(*temp) == 0 {
+			temp, _ = MongoTool.FindById(ExtractColl1, qu.ObjToString(m1["infoid"]), nil)
+			if len(*temp) == 0 {
 				qu.Debug("extract not find id...", m1["infoid"])
 				continue
 			}
 		}
-		tempInfo := ParseInfo(temp)
+		tempInfo := ParseInfo(*temp)
 		if k == 0 {
-			p1 = p.newPro(temp, newP, tempInfo)
+			p1 = p.newPro(*temp, newP, tempInfo)
 		} else {
-			p.updateOldProField(p1, tempInfo, newP, temp, m1)
+			p.updateOldProField(p1, tempInfo, newP, *temp, m1)
 		}
 	}
 	return newP, p1
 }
 
 // 更新招标公告到新的项目中
-func (p *ProjectTask) updateProFiled(tmp map[string]interface{}, thisinfo *Info, pInfo *ProjectInfo, weight int, comStr string, ex int) {
+func (p *ProjectTask) updateProFiled(tmp map[string]interface{}, thisinfo *Info, pInfo *ProjectCache, weight int, comStr string, ex int) {
+	pdata := redis.Get("project", pInfo.Id.Hex())
+	projectMap := pdata.(map[string]interface{})
+	bys, _ := json.Marshal(projectMap)
+	var project *Project
+	err := json.Unmarshal(bys, &project)
+	if err != nil {
+		qu.Debug("project Unmarshal err,", err)
+		return
+	}
 	set := map[string]interface{}{}
 	pInfo.Ids = append(pInfo.Ids, thisinfo.Id)
+	project.Ids = append(project.Ids, thisinfo.Id)
 	if len(pInfo.Ids) > 30 {
 		//异常标记
 		set["listtag"] = 1
 	}
 	if thisinfo.Publishtime > pInfo.LastTime {
 		pInfo.LastTime = thisinfo.Publishtime
+		project.LastTime = thisinfo.Publishtime
 		set["lasttime"] = thisinfo.Publishtime
 	}
 	if thisinfo.TopType == "招标" {
-		if thisinfo.SubType != "变更" && thisinfo.SubType != "其它" && pInfo.Zbtime <= 0 {
+		if thisinfo.SubType != "变更" && thisinfo.SubType != "其它" && project.Zbtime <= 0 {
 			set["zbtime"] = tmp["publishtime"]
 		}
 	} else if thisinfo.TopType == "结果" {
 		if thisinfo.SubType == "中标" || thisinfo.SubType == "成交" || thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
-			if pInfo.Jgtime > 0 {
-				jg1 := int64(math.Abs(float64(pInfo.Jgtime - thisinfo.Publishtime)))
+			if project.Jgtime > 0 {
+				jg1 := int64(math.Abs(float64(project.Jgtime - thisinfo.Publishtime)))
 				//公告状态和项目状态同样都是中标或者成交,
 				if (thisinfo.SubType == "中标" || thisinfo.SubType == "成交") && (pInfo.Bidstatus == "中标" || pInfo.Bidstatus == "成交") {
 					if jg1 > p.jgTime {
 						set["jgtime"] = tmp["publishtime"]
-						pInfo.Jgtime = thisinfo.Publishtime
+						project.Jgtime = thisinfo.Publishtime
 					}
 				} else if (thisinfo.SubType == "流标" || thisinfo.SubType == "废标") && (pInfo.Bidstatus == "流标" || pInfo.Bidstatus == "废标") {
 					//公告状态和项目状态同样是流标或者废标
 					if jg1 > p.jgTime {
 						set["jgtime"] = tmp["publishtime"]
-						pInfo.Jgtime = thisinfo.Publishtime
+						project.Jgtime = thisinfo.Publishtime
 					}
 				}
 			} else {
 				set["jgtime"] = tmp["publishtime"]
-				pInfo.Jgtime = thisinfo.Publishtime
+				project.Jgtime = thisinfo.Publishtime
 			}
 		}
 	} else if thisinfo.SubType == "合同" {
@@ -547,15 +561,16 @@ func (p *ProjectTask) updateProFiled(tmp map[string]interface{}, thisinfo *Info,
 			//中标、成交不更新jgtime
 		} else {
 			set["jgtime"] = tmp["publishtime"]
-			pInfo.Jgtime = thisinfo.Publishtime
+			project.Jgtime = thisinfo.Publishtime
 		}
 	}
-	if thisinfo.Bidopentime > pInfo.Bidopentime {
-		pInfo.Bidopentime = thisinfo.Bidopentime
-		set["bidopentime"] = pInfo.Bidopentime
+	if thisinfo.Bidopentime > project.Bidopentime {
+		project.Bidopentime = thisinfo.Bidopentime
+		set["bidopentime"] = thisinfo.Bidopentime
 	}
 	// bidtype、bidstatus
 	pInfo.Bidtype, pInfo.Bidstatus = p.GetBidTypeAndBidStatus(thisinfo)
+	project.Bidtype, project.Bidstatus = p.GetBidTypeAndBidStatus(thisinfo)
 	set["bidtype"] = pInfo.Bidtype
 	set["bidstatus"] = pInfo.Bidstatus
 
@@ -566,52 +581,58 @@ func (p *ProjectTask) updateProFiled(tmp map[string]interface{}, thisinfo *Info,
 	//相同城市的公告才会合并到一起(全国列外)
 	if thisinfo.Area != "全国" {
 		pInfo.Area = thisinfo.Area
+		project.Area = thisinfo.Area
 		set["area"] = thisinfo.Area
 		pInfo.City = thisinfo.City
+		project.City = thisinfo.City
 		set["city"] = thisinfo.City
 		if thisinfo.District != "" {
 			pInfo.District = thisinfo.District
+			project.District = thisinfo.District
 			set["district"] = thisinfo.District
 		}
 	}
 	// 项目名称
 	if (thisinfo.ProjectName != "" && pInfo.ProjectName == "") || (len([]rune(pInfo.ProjectName)) < 6 && thisinfo.LenPN > 6) {
 		pInfo.ProjectName = thisinfo.ProjectName
+		project.ProjectName = thisinfo.ProjectName
 		set["projectname"] = thisinfo.ProjectName
 	}
 	// 项目编号
 	if (pInfo.ProjectCode == "" && thisinfo.ProjectCode != "") || (len([]rune(pInfo.ProjectCode)) < 6 && len([]rune(thisinfo.ProjectCode)) > 6) {
 		pInfo.ProjectCode = thisinfo.ProjectCode
+		project.ProjectCode = thisinfo.ProjectCode
 		set["projectcode"] = thisinfo.ProjectCode
 	}
 	// 采购单位
 	if (pInfo.Buyer == "" && thisinfo.Buyer != "") || (len([]rune(pInfo.Buyer)) < 5 && len([]rune(thisinfo.Buyer)) > 5) {
 		pInfo.Buyer = thisinfo.Buyer
 		set["buyer"] = thisinfo.Buyer
-		pInfo.Buyerclass = thisinfo.Buyerclass
+		project.Buyerclass = thisinfo.Buyerclass
 		set["buyerclass"] = thisinfo.Buyerclass
 	}
 	if pInfo.Buyer == "" {
+		project.Buyerclass = ""
 		set["buyerclass"] = ""
 	}
 	// 采购单位联系人
 	if thisinfo.Buyerperson != "" {
-		pInfo.Buyerperson = thisinfo.Buyerperson
-		set["buyerperson"] = pInfo.Buyerperson
+		project.Buyerperson = thisinfo.Buyerperson
+		set["buyerperson"] = thisinfo.Buyerperson
 	} else {
-		pInfo.Buyerperson = ""
+		project.Buyerperson = ""
 		set["buyerperson"] = ""
 	}
 	// 采购单位電話
 	if thisinfo.Buyertel != "" {
-		pInfo.Buyertel = thisinfo.Buyertel
-		set["buyertel"] = pInfo.Buyertel
+		project.Buyertel = thisinfo.Buyertel
+		set["buyertel"] = thisinfo.Buyertel
 	} else {
-		pInfo.Buyertel = ""
+		project.Buyertel = ""
 		set["buyertel"] = ""
 	}
 	if thisinfo.ContractCode != "" {
-		set["contractcode"] = pInfo.ContractCode + "," + thisinfo.ContractCode
+		set["contractcode"] = project.ContractCode + "," + thisinfo.ContractCode
 	}
 	// 代理机构	相同的代理机构才会合并到一个项目 2020.11.9
 	//if (pInfo.Agency == "" && thisinfo.Agency != "") || (len([]rune(pInfo.Agency)) < 5 && len([]rune(thisinfo.Agency)) > 5) {
@@ -619,26 +640,26 @@ func (p *ProjectTask) updateProFiled(tmp map[string]interface{}, thisinfo *Info,
 	//	set["agency"] = thisinfo.Agency
 	//}
 	if len(thisinfo.Topscopeclass) > 0 && thisinfo.Publishtime > pInfo.LastTime {
-		sort.Strings(pInfo.Topscopeclass)
+		sort.Strings(project.Topscopeclass)
 		for _, k := range thisinfo.Topscopeclass {
-			if BinarySearch(pInfo.Topscopeclass, k) == -1 {
-				pInfo.Topscopeclass = append(pInfo.Topscopeclass, k)
-				sort.Strings(pInfo.Topscopeclass)
+			if BinarySearch(project.Topscopeclass, k) == -1 {
+				project.Topscopeclass = append(project.Topscopeclass, k)
+				sort.Strings(project.Topscopeclass)
 			}
 		}
-		set["topscopeclass"] = pInfo.Topscopeclass
+		set["topscopeclass"] = project.Topscopeclass
 	}
 	// 项目评审专家
 	if len(thisinfo.ReviewExperts) > 0 && thisinfo.Publishtime > pInfo.LastTime {
 		set["review_experts"] = thisinfo.ReviewExperts
-		pInfo.ReviewExperts = thisinfo.ReviewExperts
+		project.ReviewExperts = thisinfo.ReviewExperts
 	}
 	if thisinfo.Purchasing != "" && thisinfo.Publishtime > pInfo.LastTime {
-		if pInfo.Purchasing == "" {
-			pInfo.Purchasing = thisinfo.Purchasing
+		if project.Purchasing == "" {
+			project.Purchasing = thisinfo.Purchasing
 			set["purchasing"] = thisinfo.Purchasing
 		} else {
-			list := strings.Split(pInfo.Purchasing, ",")
+			list := strings.Split(project.Purchasing, ",")
 			for _, k := range list {
 				if BinarySearch(strings.Split(thisinfo.Purchasing, ","), k) == -1 {
 					list = append(list, k)
@@ -657,56 +678,57 @@ func (p *ProjectTask) updateProFiled(tmp map[string]interface{}, thisinfo *Info,
 			}
 		}
 		set["winnerorder"] = list
-		pInfo.Winnerorder = list
+		project.Winnerorder = list
 	}
 
 	if len(thisinfo.Subscopeclass) > 0 && thisinfo.Publishtime > pInfo.LastTime {
-		sort.Strings(pInfo.Subscopeclass)
+		sort.Strings(project.Subscopeclass)
 		for _, k := range thisinfo.Subscopeclass {
-			if BinarySearch(pInfo.Subscopeclass, k) == -1 {
-				pInfo.Subscopeclass = append(pInfo.Subscopeclass, k)
-				sort.Strings(pInfo.Subscopeclass)
+			if BinarySearch(project.Subscopeclass, k) == -1 {
+				project.Subscopeclass = append(project.Subscopeclass, k)
+				sort.Strings(project.Subscopeclass)
 			}
 		}
-		set["subscopeclass"] = pInfo.Subscopeclass
-		set["s_subscopeclass"] = strings.Join(pInfo.Subscopeclass, ",")
+		set["subscopeclass"] = project.Subscopeclass
+		set["s_subscopeclass"] = strings.Join(project.Subscopeclass, ",")
 	}
 
 	if len(thisinfo.Winners) > 0 && thisinfo.Publishtime > pInfo.LastTime {
-		if len(pInfo.Winners) <= 0 {
+		winners := strings.Split(project.Winners, ",")
+		if len(winners) <= 0 {
 			set["winner"] = qu.ObjToString(tmp["winner"])
 		}
-
-		sort.Strings(pInfo.Winners)
 		for _, k := range thisinfo.Winners {
 			if thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
-				if BinarySearch(pInfo.Winners, k) != -1 {
-					deleteSlice(pInfo.Winners, k, "")
-					sort.Strings(pInfo.Winners)
+				if BinarySearch(winners, k) != -1 {
+					deleteSlice(winners, k, "")
+					sort.Strings(winners)
 				}
 			} else {
-				if BinarySearch(pInfo.Winners, k) == -1 {
-					pInfo.Winners = append(pInfo.Winners, k)
-					sort.Strings(pInfo.Winners)
+				if BinarySearch(winners, k) == -1 {
+					winners = append(winners, k)
+					sort.Strings(winners)
 				}
 			}
 		}
-		set["s_winner"] = strings.Join(pInfo.Winners, ",")
+		set["s_winner"] = strings.Join(winners, ",")
 	}
 
 	if thisinfo.HasPackage { //多包处理
 		set["multipackage"] = 1
-		pkg := PackageFormat(thisinfo, pInfo)
-		pInfo.Package = pkg
-		set["package"] = pInfo.Package
+		pkg := PackageFormat(thisinfo, project)
+		project.Package = pkg
+		set["package"] = project.Package
 	}
 	//处理多包后,计算预算金额、中标金额
-	CountAmount(pInfo, thisinfo, tmp)
-	if pInfo.Budget >= 0 && pInfo.Budgettag != 1 {
+	CountAmount(project, thisinfo, tmp)
+	if project.Budget >= 0 && project.Budgettag != 1 {
+		pInfo.Budget = project.Budget
 		set["budget"] = pInfo.Budget
 		set["budgettag"] = 0
 	}
-	if pInfo.Bidamount >= 0 && pInfo.Bidamounttag != 1 {
+	if pInfo.Bidamount >= 0 && project.Bidamounttag != 1 {
+		pInfo.Bidamount = project.Bidamount
 		set["bidamount"] = pInfo.Bidamount
 		set["bidamounttag"] = 0
 	}
@@ -726,19 +748,20 @@ func (p *ProjectTask) updateProFiled(tmp map[string]interface{}, thisinfo *Info,
 		ProjectCode:  thisinfo.ProjectCode,
 		Bidstatus:    pInfo.Bidstatus,
 	}
-	copyMap := Copy(pInfo.InfoFiled).(map[string]InfoField)
+	copyMap := Copy(project.InfoFiled).(map[string]InfoField)
 	copyMap[thisinfo.Id] = infofield
 	tmpMap := make(map[string]interface{})
 	for k, v := range copyMap {
 		tmpMap[k] = StructToMap(v)
 	}
 	tmpMap[thisinfo.Id] = StructToMap(infofield)
-	pInfo.InfoFiled = copyMap
+	project.InfoFiled = copyMap
 	set["infofield"] = tmpMap
 
 	set["mpn"] = pInfo.MPN
 	set["mpc"] = pInfo.MPC
 	set["updatetime"] = p.pici
+	redis.PutCKV("project", project.Id.Hex(), set)
 	update := map[string]interface{}{}
 	if len(set) > 0 {
 		update["$set"] = set
@@ -768,7 +791,7 @@ func (p *ProjectTask) updateProFiled(tmp map[string]interface{}, thisinfo *Info,
 }
 
 // 内部合并时,原有项目id基础上新建项目
-func (p *ProjectTask) newPro(tmp, tmpPro map[string]interface{}, thisinfo *Info) *ProjectInfo {
+func (p *ProjectTask) newPro(tmp, tmpPro map[string]interface{}, thisinfo *Info) *ProjectCache {
 	for _, f := range FIELDS {
 		if tmp[f] != nil && tmp[f] != "" {
 			tmpPro[f] = tmp[f]
@@ -796,7 +819,7 @@ func (p *ProjectTask) newPro(tmp, tmpPro map[string]interface{}, thisinfo *Info)
 	tmpPro["bidtype"] = bs
 	tmpPro["bidstatus"] = bt
 	pkg := PackageFormat(thisinfo, nil)
-	p1 := p.NewCachePinfo(tmpPro["_id"].(primitive.ObjectID), thisinfo, bs, bt, pkg)
+	p1 := p.NewCachePinfo(tmpPro["_id"].(primitive.ObjectID), thisinfo, bs, bt)
 
 	now := time.Now().Unix()
 	tmpPro["createtime"] = now
@@ -809,18 +832,15 @@ func (p *ProjectTask) newPro(tmp, tmpPro map[string]interface{}, thisinfo *Info)
 	if thisinfo.TopType == "招标" {
 		if thisinfo.SubType != "变更" && thisinfo.SubType != "其它" {
 			tmpPro["zbtime"] = tmp["publishtime"]
-			p1.Zbtime = qu.Int64All(tmp["publishtime"])
 		}
 	} else if thisinfo.TopType == "结果" || thisinfo.SubType == "合同" {
 		tmpPro["jgtime"] = tmp["publishtime"]
-		p1.Jgtime = thisinfo.Publishtime
 	}
 	if len(thisinfo.Subscopeclass) > 0 {
 		tmpPro["s_subscopeclass"] = strings.Join(thisinfo.Subscopeclass, ",")
 	}
 	if len(thisinfo.Winners) > 0 {
 		tmpPro["s_winner"] = strings.Join(thisinfo.Winners, ",")
-		p1.Winners = thisinfo.Winners
 	}
 	if thisinfo.HasPackage {
 		tmpPro["multipackage"] = 1
@@ -831,12 +851,10 @@ func (p *ProjectTask) newPro(tmp, tmpPro map[string]interface{}, thisinfo *Info)
 	//项目评审专家
 	if len(thisinfo.ReviewExperts) > 0 {
 		tmpPro["review_experts"] = thisinfo.ReviewExperts
-		p1.ReviewExperts = thisinfo.ReviewExperts
 	}
 	//标的物
 	if thisinfo.Purchasing != "" {
 		tmpPro["purchasing"] = thisinfo.Purchasing
-		p1.Purchasing = thisinfo.Purchasing
 	}
 	//中标候选人
 	if len(thisinfo.WinnerOrder) > 0 {
@@ -847,9 +865,7 @@ func (p *ProjectTask) newPro(tmp, tmpPro map[string]interface{}, thisinfo *Info)
 			}
 		}
 		tmpPro["winnerorder"] = list
-		p1.Winnerorder = list
 	}
-	p1.InfoFiled = make(map[string]InfoField)
 	infofield := InfoField{
 		Budget:       thisinfo.Budget,
 		Bidamount:    thisinfo.Bidamount,
@@ -858,25 +874,20 @@ func (p *ProjectTask) newPro(tmp, tmpPro map[string]interface{}, thisinfo *Info)
 		ProjectCode:  thisinfo.ProjectCode,
 		Bidstatus:    bs,
 	}
-	p1.InfoFiled[thisinfo.Id] = infofield
 	res := StructToMap(infofield)
 	tmpPro["infofield"] = map[string]interface{}{
 		thisinfo.Id: res,
 	}
 	if tmp["budget"] != nil && tmp["budget"] != "" {
 		tmpPro["budget"] = thisinfo.Budget
-		p1.Budgettag = 0
 		tmpPro["budgettag"] = 0
 	} else {
-		p1.Budgettag = 1
 		tmpPro["budgettag"] = 1
 	}
 	if tmp["bidamount"] != nil && tmp["bidamount"] != "" {
 		tmpPro["bidamount"] = thisinfo.Bidamount
-		p1.Bidamounttag = 0
 		tmpPro["bidamounttag"] = 0
 	} else {
-		p1.Bidamounttag = 1
 		tmpPro["bidamounttag"] = 1
 	}
 	if p1.Bidamount > 0 {
@@ -893,39 +904,49 @@ func (p *ProjectTask) newPro(tmp, tmpPro map[string]interface{}, thisinfo *Info)
 }
 
 // 合并字段到老项目中
-func (p *ProjectTask) updateOldProField(pInfo *ProjectInfo, thisinfo *Info, tmpPro, tmp, m1 map[string]interface{}) {
+func (p *ProjectTask) updateOldProField(pInfo *ProjectCache, thisinfo *Info, tmpPro, tmp, m1 map[string]interface{}) {
+	pdata := redis.Get("project", pInfo.Id.Hex())
+	projectMap := pdata.(map[string]interface{})
+	bys, _ := json.Marshal(projectMap)
+	var project *Project
+	err := json.Unmarshal(bys, &project)
+	if err != nil {
+		qu.Debug("project Unmarshal err,", err)
+		return
+	}
 	if len(pInfo.Ids) > 30 {
 		//异常标记
 		tmpPro["listtag"] = 1
 	}
 	if thisinfo.Publishtime > pInfo.LastTime {
 		pInfo.LastTime = thisinfo.Publishtime
+		project.LastTime = thisinfo.Publishtime
 		tmpPro["lasttime"] = thisinfo.Publishtime
 	}
 	if thisinfo.TopType == "招标" {
-		if thisinfo.SubType != "变更" && thisinfo.SubType != "其它" && pInfo.Zbtime <= 0 {
+		if thisinfo.SubType != "变更" && thisinfo.SubType != "其它" && project.Zbtime <= 0 {
 			tmpPro["zbtime"] = tmp["publishtime"]
 		}
 	} else if thisinfo.TopType == "结果" {
 		if thisinfo.SubType == "中标" || thisinfo.SubType == "成交" || thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
-			if pInfo.Jgtime > 0 {
-				jg1 := int64(math.Abs(float64(pInfo.Jgtime - thisinfo.Publishtime)))
+			if project.Jgtime > 0 {
+				jg1 := int64(math.Abs(float64(project.Jgtime - thisinfo.Publishtime)))
 				//公告状态和项目状态同样都是中标或者成交,
 				if (thisinfo.SubType == "中标" || thisinfo.SubType == "成交") && (pInfo.Bidstatus == "中标" || pInfo.Bidstatus == "成交") {
 					if jg1 > p.jgTime {
 						tmpPro["jgtime"] = tmp["publishtime"]
-						pInfo.Jgtime = thisinfo.Publishtime
+						project.Jgtime = thisinfo.Publishtime
 					}
 				} else if (thisinfo.SubType == "流标" || thisinfo.SubType == "废标") && (pInfo.Bidstatus == "流标" || pInfo.Bidstatus == "废标") {
 					//公告状态和项目状态同样是流标或者废标
 					if jg1 > p.jgTime {
 						tmpPro["jgtime"] = tmp["publishtime"]
-						pInfo.Jgtime = thisinfo.Publishtime
+						project.Jgtime = thisinfo.Publishtime
 					}
 				}
 			} else {
 				tmpPro["jgtime"] = tmp["publishtime"]
-				pInfo.Jgtime = thisinfo.Publishtime
+				project.Jgtime = thisinfo.Publishtime
 			}
 		}
 	} else if thisinfo.SubType == "合同" {
@@ -933,67 +954,74 @@ func (p *ProjectTask) updateOldProField(pInfo *ProjectInfo, thisinfo *Info, tmpP
 			//中标、成交不更新jgtime
 		} else {
 			tmpPro["jgtime"] = tmp["publishtime"]
-			pInfo.Jgtime = thisinfo.Publishtime
+			project.Jgtime = thisinfo.Publishtime
 		}
 	}
-	if thisinfo.Bidopentime > pInfo.Bidopentime {
-		pInfo.Bidopentime = thisinfo.Bidopentime
-		tmpPro["bidopentime"] = pInfo.Bidopentime
+	if thisinfo.Bidopentime > project.Bidopentime {
+		project.Bidopentime = thisinfo.Bidopentime
+		tmpPro["bidopentime"] = thisinfo.Bidopentime
 	}
 	// bidtype、bidstatus
 	pInfo.Bidtype, pInfo.Bidstatus = p.GetBidTypeAndBidStatus(thisinfo)
+	project.Bidtype, project.Bidstatus = p.GetBidTypeAndBidStatus(thisinfo)
 	tmpPro["bidtype"] = pInfo.Bidtype
 	tmpPro["bidstatus"] = pInfo.Bidstatus
 
 	//相同城市的公告才会合并到一起(全国列外)
 	if thisinfo.Area != "全国" {
 		pInfo.Area = thisinfo.Area
+		project.Area = thisinfo.Area
 		tmpPro["area"] = thisinfo.Area
 		pInfo.City = thisinfo.City
+		project.City = thisinfo.City
 		tmpPro["city"] = thisinfo.City
 		if thisinfo.District != "" {
 			pInfo.District = thisinfo.District
+			project.District = thisinfo.District
 			tmpPro["district"] = thisinfo.District
 		}
 	}
 	// 项目名称
 	if (thisinfo.ProjectName != "" && pInfo.ProjectName == "") || (len([]rune(pInfo.ProjectName)) < 6 && thisinfo.LenPN > 6) {
 		pInfo.ProjectName = thisinfo.ProjectName
+		project.ProjectName = thisinfo.ProjectName
 		tmpPro["projectname"] = thisinfo.ProjectName
 	}
 	// 项目编号
 	if (pInfo.ProjectCode == "" && thisinfo.ProjectCode != "") || (len([]rune(pInfo.ProjectCode)) < 6 && len([]rune(thisinfo.ProjectCode)) > 6) {
 		pInfo.ProjectCode = thisinfo.ProjectCode
+		project.ProjectCode = thisinfo.ProjectCode
 		tmpPro["projectcode"] = thisinfo.ProjectCode
 	}
 	// 采购单位
 	if (pInfo.Buyer == "" && thisinfo.Buyer != "") || (len([]rune(pInfo.Buyer)) < 5 && len([]rune(thisinfo.Buyer)) > 5) {
 		pInfo.Buyer = thisinfo.Buyer
 		tmpPro["buyer"] = thisinfo.Buyer
-		pInfo.Buyerclass = thisinfo.Buyerclass
+		project.Buyerclass = thisinfo.Buyerclass
 		tmpPro["buyerclass"] = thisinfo.Buyerclass
 	}
 	if pInfo.Buyer == "" {
+		project.Buyerclass = ""
 		tmpPro["buyerclass"] = ""
 	}
 	// 采购单位联系人
 	if thisinfo.Buyerperson != "" {
-		pInfo.Buyerperson = thisinfo.Buyerperson
-		tmpPro["buyerperson"] = pInfo.Buyerperson
+		project.Buyerperson = thisinfo.Buyerperson
+		tmpPro["buyerperson"] = thisinfo.Buyerperson
 	} else {
-		pInfo.Buyerperson = ""
+		project.Buyerperson = ""
 		tmpPro["buyerperson"] = ""
 	}
 	// 采购单位電話
 	if thisinfo.Buyertel != "" {
-		pInfo.Buyertel = thisinfo.Buyertel
-		tmpPro["buyertel"] = pInfo.Buyertel
+		project.Buyertel = thisinfo.Buyertel
+		tmpPro["buyertel"] = thisinfo.Buyertel
 	} else {
-		pInfo.Buyertel = ""
+		project.Buyertel = ""
 		tmpPro["buyertel"] = ""
 	}
 	if thisinfo.ContractCode != "" {
-		tmpPro["contractcode"] = pInfo.ContractCode + "," + thisinfo.ContractCode
+		tmpPro["contractcode"] = project.ContractCode + "," + thisinfo.ContractCode
 	}
 	// 代理机构	相同的代理机构才会合并到一个项目 2020.11.9
 	//if (pInfo.Agency == "" && thisinfo.Agency != "") || (len([]rune(pInfo.Agency)) < 5 && len([]rune(thisinfo.Agency)) > 5) {
@@ -1001,26 +1029,26 @@ func (p *ProjectTask) updateOldProField(pInfo *ProjectInfo, thisinfo *Info, tmpP
 	//	set["agency"] = thisinfo.Agency
 	//}
 	if len(thisinfo.Topscopeclass) > 0 {
-		sort.Strings(pInfo.Topscopeclass)
+		sort.Strings(project.Topscopeclass)
 		for _, k := range thisinfo.Topscopeclass {
-			if BinarySearch(pInfo.Topscopeclass, k) == -1 {
-				pInfo.Topscopeclass = append(pInfo.Topscopeclass, k)
-				sort.Strings(pInfo.Topscopeclass)
+			if BinarySearch(project.Topscopeclass, k) == -1 {
+				project.Topscopeclass = append(project.Topscopeclass, k)
+				sort.Strings(project.Topscopeclass)
 			}
 		}
-		tmpPro["topscopeclass"] = pInfo.Topscopeclass
+		tmpPro["topscopeclass"] = project.Topscopeclass
 	}
 	// 项目评审专家
 	if len(thisinfo.ReviewExperts) > 0 {
 		tmpPro["review_experts"] = thisinfo.ReviewExperts
-		pInfo.ReviewExperts = thisinfo.ReviewExperts
+		project.ReviewExperts = thisinfo.ReviewExperts
 	}
 	if thisinfo.Purchasing != "" {
-		if pInfo.Purchasing == "" {
-			pInfo.Purchasing = thisinfo.Purchasing
+		if project.Purchasing == "" {
+			project.Purchasing = thisinfo.Purchasing
 			tmpPro["purchasing"] = thisinfo.Purchasing
 		} else {
-			list := strings.Split(pInfo.Purchasing, ",")
+			list := strings.Split(project.Purchasing, ",")
 			for _, k := range list {
 				if BinarySearch(strings.Split(thisinfo.Purchasing, ","), k) == -1 {
 					list = append(list, k)
@@ -1039,55 +1067,55 @@ func (p *ProjectTask) updateOldProField(pInfo *ProjectInfo, thisinfo *Info, tmpP
 			}
 		}
 		tmpPro["winnerorder"] = list
-		pInfo.Winnerorder = list
+		project.Winnerorder = list
 	}
 
 	if len(thisinfo.Subscopeclass) > 0 {
-		sort.Strings(pInfo.Subscopeclass)
+		sort.Strings(project.Subscopeclass)
 		for _, k := range thisinfo.Subscopeclass {
-			if BinarySearch(pInfo.Subscopeclass, k) == -1 {
-				pInfo.Subscopeclass = append(pInfo.Subscopeclass, k)
-				sort.Strings(pInfo.Subscopeclass)
+			if BinarySearch(project.Subscopeclass, k) == -1 {
+				project.Subscopeclass = append(project.Subscopeclass, k)
+				sort.Strings(project.Subscopeclass)
 			}
 		}
-		tmpPro["subscopeclass"] = pInfo.Subscopeclass
-		tmpPro["s_subscopeclass"] = strings.Join(pInfo.Subscopeclass, ",")
+		tmpPro["subscopeclass"] = project.Subscopeclass
+		tmpPro["s_subscopeclass"] = strings.Join(project.Subscopeclass, ",")
 	}
 
 	if len(thisinfo.Winners) > 0 {
-		if len(pInfo.Winners) <= 0 {
+		if len(project.Winners) <= 0 {
 			tmpPro["winner"] = qu.ObjToString(tmp["winner"])
 		}
-		sort.Strings(pInfo.Winners)
+		winners := strings.Split(project.Winners, ",")
 		for _, k := range thisinfo.Winners {
 			if thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
-				if BinarySearch(pInfo.Winners, k) != -1 {
-					deleteSlice(pInfo.Winners, k, "")
-					sort.Strings(pInfo.Winners)
+				if BinarySearch(winners, k) != -1 {
+					deleteSlice(winners, k, "")
 				}
 			} else {
-				if BinarySearch(pInfo.Winners, k) == -1 {
-					pInfo.Winners = append(pInfo.Winners, k)
-					sort.Strings(pInfo.Winners)
+				if BinarySearch(winners, k) == -1 {
+					winners = append(winners, k)
 				}
 			}
 		}
-		tmpPro["s_winner"] = strings.Join(pInfo.Winners, ",")
+		tmpPro["s_winner"] = strings.Join(winners, ",")
 	}
 
 	if thisinfo.HasPackage { //多包处理
 		tmpPro["multipackage"] = 1
-		pkg := PackageFormat(thisinfo, pInfo)
-		pInfo.Package = pkg
-		tmpPro["package"] = pInfo.Package
+		pkg := PackageFormat(thisinfo, project)
+		project.Package = pkg
+		tmpPro["package"] = project.Package
 	}
 	//处理多包后,计算预算金额、中标金额
-	CountAmount(pInfo, thisinfo, tmp)
-	if pInfo.Budget >= 0 && pInfo.Budgettag != 1 {
+	CountAmount(project, thisinfo, tmp)
+	if project.Budget >= 0 && project.Budgettag != 1 {
+		pInfo.Budget = project.Budget
 		tmpPro["budget"] = pInfo.Budget
 		tmpPro["budgettag"] = 0
 	}
-	if pInfo.Bidamount >= 0 && pInfo.Bidamounttag != 1 {
+	if project.Bidamount >= 0 && project.Bidamounttag != 1 {
+		pInfo.Bidamount = project.Bidamount
 		tmpPro["bidamount"] = pInfo.Bidamount
 		tmpPro["bidamounttag"] = 0
 	}
@@ -1105,14 +1133,14 @@ func (p *ProjectTask) updateOldProField(pInfo *ProjectInfo, thisinfo *Info, tmpP
 		ProjectCode:  thisinfo.ProjectCode,
 		Bidstatus:    pInfo.Bidstatus,
 	}
-	copyMap := Copy(pInfo.InfoFiled).(map[string]InfoField)
+	copyMap := Copy(project.InfoFiled).(map[string]InfoField)
 	copyMap[thisinfo.Id] = infofield
 	tmpMap := make(map[string]interface{})
 	for k, v := range copyMap {
 		tmpMap[k] = StructToMap(v)
 	}
 	tmpMap[thisinfo.Id] = StructToMap(infofield)
-	pInfo.InfoFiled = copyMap
+	project.InfoFiled = copyMap
 	tmpPro["infofield"] = tmpMap
 	tmpPro["mpn"] = pInfo.MPN
 	tmpPro["mpc"] = pInfo.MPC
@@ -1185,7 +1213,7 @@ func backupPro(tmp map[string]interface{}) {
 		tmp1[k] = v
 	}
 	if Sysconfig["backupFlag"].(bool) {
-		tmp1["sourceprojectid"] = BsonIdToSId(tmp1["_id"])
+		tmp1["sourceprojectid"] = mongodb.BsonIdToSId(tmp1["_id"])
 		delete(tmp1, "_id")
 		MongoTool.Save(BackupColl, tmp1)
 	}
@@ -1204,12 +1232,12 @@ func delOldPro(pid string) {
 // 修改内存中的数据
 func (p *ProjectTask) modifyMem(tmpPro map[string]interface{}) {
 	pid := qu.ObjToString(tmpPro["_id"])
-	var pro ProjectInfo
+	var pro ProjectCache
 	err := mapstructure.Decode(tmpPro, &pro)
 	if err != nil {
 		qu.Debug(err)
 	}
-	pro.Id = StringTOBsonId(pid)
+	pro.Id = mongodb.StringTOBsonId(pid)
 	tmpMap := make(map[string]InfoField)
 	infoMap := tmpPro["infofield"].(map[string]interface{})
 	for _, v := range infoMap {
@@ -1218,7 +1246,6 @@ func (p *ProjectTask) modifyMem(tmpPro map[string]interface{}) {
 		_ = json.Unmarshal(b, &field)
 		tmpMap[pid] = field
 	}
-	pro.InfoFiled = tmpMap
 	p.AllIdsMapLock.Lock()
 	if v, ok := p.AllIdsMap[pid]; ok {
 		v.P = &pro
@@ -1235,3 +1262,646 @@ func (p *ProjectTask) printMemPro(pid string) {
 	}
 	p.AllIdsMapLock.Unlock()
 }
+
+// @Description id不变,内容变化 重新进行项目合并
+// @Author J 2022/8/10 14:51
+func (p *ProjectTask) taskinfo(id string) {
+	tmpPro, _ := MongoTool.FindOneByField(ProjectColl, map[string]interface{}{"ids": id}, nil)
+	if tmpPro == nil || len(*tmpPro) == 0 {
+		qu.Debug(fmt.Sprintf("taskinfo bidding id=%s 未查询到项目数据", id))
+		return
+	}
+	pid := mongodb.BsonIdToSId((*tmpPro)["_id"])
+	ids := qu.ObjArrToStringArr((*tmpPro)["ids"].([]interface{}))
+	list := (*tmpPro)["list"].([]interface{})
+
+	var newP map[string]interface{}
+	var p1 *ProjectCache
+	for i, s := range ids {
+		temp, _ := MongoTool.FindById(ExtractColl, s, nil)
+		if temp == nil || len(*temp) == 0 {
+			temp, _ = MongoTool.FindById(ExtractColl1, s, nil)
+			if temp == nil || len(*temp) == 0 {
+				qu.Debug("extract not find id...", s)
+				return
+			}
+		}
+		push := p.PushListInfo(*temp, id)
+		if s == id {
+			list[i] = push
+		}
+
+		info := ParseInfo(*temp)
+		if i == 0 {
+			newP, p1 = p.createPro(*temp, info, pid)
+		} else {
+			p.updatePro(newP, *temp, p1, info)
+		}
+	}
+
+	newP["ids"] = ids
+	p.AllIdsMapLock.Lock()
+	_, ok := p.AllIdsMap[pid]
+	if ok {
+		redis.PutCKV("project", pid, newP)
+		p.AllIdsMap[id] = &ID{Id: id, P: p1}
+	}
+	p.AllIdsMapLock.Unlock()
+	newP["list"] = list
+	if len(newP) > 0 {
+		updateInfo := []map[string]interface{}{
+			{
+				"_id": mongodb.StringTOBsonId(pid),
+			},
+			{"$set": newP},
+		}
+		p.updatePool <- updateInfo
+	}
+}
+
+// @Description 创建项目
+// @Author J 2022/8/11 09:17
+func (p *ProjectTask) createPro(tmp map[string]interface{}, thisinfo *Info, pid string) (map[string]interface{}, *ProjectCache) {
+	set := map[string]interface{}{}
+	set["_id"] = mongodb.StringTOBsonId(pid)
+	for _, f := range FIELDS {
+		if tmp[f] != nil && tmp[f] != "" {
+			set[f] = tmp[f]
+		}
+	}
+	bidopentime := qu.Int64All(tmp["bidopentime"])
+	if bidopentime > 0 {
+		set["bidopentime"] = bidopentime
+	}
+	//异常标记
+	if thisinfo.TopType != "招标" && thisinfo.TopType != "拟建" && thisinfo.TopType != "预告" {
+		set["exception"] = 1
+	}
+	//projecthref保存
+	if jsonData, ok := tmp["jsondata"].(map[string]interface{}); ok {
+		if jsonData != nil && qu.ObjToString(jsonData["projecthref"]) != "" {
+			set["projecthref"] = jsonData["projecthref"]
+		}
+	}
+	//合同编号
+	if thisinfo.ContractCode != "" {
+		set["contractcode"] = thisinfo.ContractCode
+	}
+
+	bt := qu.ObjToString(tmp["toptype"])
+	bs := qu.ObjToString(tmp["subtype"])
+	p.mapBidLock.Lock()
+	if thisinfo.Infoformat == 2 || thisinfo.SubType == "拟建" {
+		set["bidstatus"] = "拟建"
+		bt = "拟建"
+	} else {
+		if bidtype[bs] != "" {
+			set["bidtype"] = bidtype[bs]
+		} else {
+			set["bidtype"] = "招标"
+		}
+		if bt == "招标" {
+			set["projectscope"] = qu.ObjToString(tmp["projectscope"])
+			set["bidstatus"] = bt
+		} else {
+			if bidstatus[bs] != "" {
+				set["bidstatus"] = thisinfo.SubType
+				bt = thisinfo.SubType
+			} else if bs == "" {
+				set["bidstatus"] = ""
+				bt = ""
+			} else {
+				set["bidstatus"] = "其它"
+				bt = "其它"
+			}
+		}
+	}
+	p.mapBidLock.Unlock()
+
+	pkg := PackageFormat(thisinfo, nil)
+	p1 := p.NewCachePinfo(mongodb.StringTOBsonId(pid), thisinfo, bs, bt)
+
+	now := time.Now().Unix()
+	set["createtime"] = now
+	set["sourceinfoid"] = thisinfo.Id
+	set["sourceinfourl"] = tmp["href"]
+	set["firsttime"] = tmp["publishtime"]
+	set["lasttime"] = tmp["publishtime"]
+	//增量用系统时间,全量(历史)入库时间
+	if p.currentType == "pl" {
+		set["pici"] = tmp["comeintime"]
+	} else {
+		set["pici"] = p.pici
+	}
+	set["ids"] = []string{thisinfo.Id}
+	if thisinfo.TopType == "招标" {
+		//if thisinfo.SubType != "变更" && thisinfo.SubType != "其它" {
+		set["zbtime"] = tmp["publishtime"]
+		//}
+	} else if thisinfo.TopType == "结果" || thisinfo.SubType == "合同" {
+		set["jgtime"] = tmp["publishtime"]
+	}
+	if len(thisinfo.Subscopeclass) > 0 {
+		set["s_subscopeclass"] = strings.Join(thisinfo.Subscopeclass, ",")
+	}
+	if len(thisinfo.Winners) > 0 {
+		set["s_winner"] = strings.Join(thisinfo.Winners, ",")
+	}
+	if thisinfo.HasPackage {
+		set["multipackage"] = 1
+		set["package"] = pkg
+	} else {
+		set["multipackage"] = 0
+	}
+	//项目评审专家
+	if len(thisinfo.ReviewExperts) > 0 {
+		set["review_experts"] = thisinfo.ReviewExperts
+	}
+	//标的物
+	if thisinfo.Purchasing != "" {
+		list := Duplicate(strings.Split(thisinfo.Purchasing, ",")) //标的物 去重 03/03
+		p := strings.Join(qu.ObjArrToStringArr(list), ",")
+		set["purchasing"] = p
+	}
+	//中标候选人
+	if len(thisinfo.WinnerOrder) > 0 {
+		var list = []string{}
+		for _, v := range thisinfo.WinnerOrder {
+			if BinarySearch(list, qu.ObjToString(v["entname"])) == -1 {
+				list = append(list, qu.ObjToString(v["entname"]))
+			}
+		}
+		set["winnerorder"] = list
+	}
+	//项目规模
+	if len(thisinfo.ProjectScale) > 0 {
+		set["project_scale"] = thisinfo.ProjectScale
+	}
+	//工期时长
+	if thisinfo.ProjectDuration > 0 {
+		set["project_duration"] = thisinfo.ProjectDuration
+	}
+	// 工期单位
+	if thisinfo.ProjectDuration > 0 && len(thisinfo.ProjectTimeUnit) > 0 {
+		set["project_timeunit"] = thisinfo.ProjectTimeUnit
+	}
+	//开工日期
+	if thisinfo.ProjectStartDate > 0 {
+		set["project_startdate"] = thisinfo.ProjectStartDate
+	}
+	//竣工日期
+	if thisinfo.ProjectCompleteDate > 0 {
+		set["project_completedate"] = thisinfo.ProjectCompleteDate
+	}
+	//付款方式
+	if len(thisinfo.Payway) > 0 {
+		set["payway"] = thisinfo.Payway
+	}
+	// 履约保证金
+	if tmp["contract_guarantee"] != nil {
+		set["contract_guarantee"] = thisinfo.ContractGuarantee
+	}
+	// 投标保证金
+	if tmp["bid_guarantee"] != nil {
+		set["bid_guarantee"] = thisinfo.BidGuarantee
+	}
+	// 资质条件
+	if len(thisinfo.Qualifies) > 0 {
+		var str []string
+		for _, v := range thisinfo.Qualifies {
+			if len(qu.ObjToString(v["key"])) > 0 {
+				if BinarySearch(str, qu.ObjToString(v["key"])) == -1 {
+					str = append(str, qu.ObjToString(v["key"]))
+				}
+			}
+		}
+		if len(str) > 0 {
+			set["qualifies"] = strings.Join(str, ",")
+		}
+	}
+	if len(thisinfo.EntIdList) > 0 {
+		set["entidlist"] = thisinfo.EntIdList
+	}
+	// first_cooperation
+	if p1.Buyer != "" && len(thisinfo.Winners) > 0 {
+		FirstCooperation(set, p1.Buyer, thisinfo.Winners, thisinfo.EntIdList)
+	}
+
+	infofield := InfoField{
+		Budget:       thisinfo.Budget,
+		Bidamount:    thisinfo.Bidamount,
+		ContractCode: thisinfo.ContractCode,
+		ProjectName:  thisinfo.ProjectName,
+		ProjectCode:  thisinfo.ProjectCode,
+		Bidstatus:    bs,
+	}
+	res := StructToMap(infofield)
+	set["infofield"] = map[string]interface{}{
+		thisinfo.Id: res,
+	}
+	if tmp["budget"] != nil && tmp["budget"] != "" {
+		set["budget"] = thisinfo.Budget
+		set["budgettag"] = 0
+	} else {
+		set["budgettag"] = 1
+	}
+	if tmp["bidamount"] != nil && tmp["bidamount"] != "" {
+		set["bidamount"] = thisinfo.Bidamount
+		set["bidamounttag"] = 0
+	} else {
+		set["bidamounttag"] = 1
+	}
+	if p1.Bidamount > 0 {
+		set["sortprice"] = p1.Bidamount
+	} else {
+		if p1.Budget > 0 {
+			set["sortprice"] = p1.Budget
+		}
+	}
+	return set, &p1
+}
+
+// @Description id不变,内容覆盖 修改项目
+// @Author J 2022/8/10 17:00
+func (p *ProjectTask) updatePro(set, tmp map[string]interface{}, pInfo *ProjectCache, thisinfo *Info) {
+	bys, _ := json.Marshal(set)
+	var project *Project
+	err := json.Unmarshal(bys, &project)
+	if err != nil {
+		qu.Debug("project Unmarshal err,", err)
+		return
+	}
+
+	//zbtime、lasttime、jgtime
+	pInfo.LastTime = thisinfo.Publishtime
+	set["lasttime"] = thisinfo.Publishtime
+
+	if thisinfo.TopType == "招标" {
+		if project.Zbtime <= 0 {
+			project.Zbtime = thisinfo.Publishtime
+			set["zbtime"] = tmp["publishtime"]
+		}
+		if project.Jgtime > 0 {
+			project.Jgtime = int64(0)
+			set["jgtime"] = int64(0)
+		}
+	} else if thisinfo.TopType == "结果" {
+		if thisinfo.SubType == "中标" || thisinfo.SubType == "成交" || thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
+			if project.Jgtime > 0 {
+				//jg1 := int64(math.Abs(float64(pInfo.Jgtime - thisinfo.Publishtime)))
+				//公告状态和项目状态同样都是中标或者成交,
+				if thisinfo.SubType == "成交" && project.Bidstatus == "中标" {
+					if p.jgTime < thisinfo.Publishtime {
+						project.Jgtime = thisinfo.Publishtime
+						set["jgtime"] = tmp["publishtime"]
+					}
+					//公告状态和项目状态同样是流标或者废标
+				} else if (thisinfo.SubType == "流标" || thisinfo.SubType == "废标") && (project.Bidstatus == "流标" || project.Bidstatus == "废标") {
+					if p.jgTime < thisinfo.Publishtime {
+						project.Jgtime = thisinfo.Publishtime
+						set["jgtime"] = tmp["publishtime"]
+					}
+				}
+			} else {
+				project.Jgtime = thisinfo.Publishtime
+				set["jgtime"] = tmp["publishtime"]
+			}
+		}
+	} else if thisinfo.SubType == "合同" {
+		if project.Bidstatus == "中标" || project.Bidstatus == "成交" || project.Bidstatus == "" {
+			//中标、成交不更新jgtime
+		} else {
+			project.Jgtime = thisinfo.Publishtime
+			set["jgtime"] = tmp["publishtime"]
+		}
+	}
+	if thisinfo.Bidopentime > project.Bidopentime {
+		project.Bidopentime = thisinfo.Bidopentime
+		set["bidopentime"] = project.Bidopentime
+	}
+
+	bt := qu.ObjToString(tmp["toptype"])
+	bs := qu.ObjToString(tmp["subtype"])
+	p.mapBidLock.Lock()
+	if bt == "招标" {
+		//招标状态,更新projectscope
+		if tmp["projectscope"] != nil {
+			set["projectscope"] = qu.ObjToString(tmp["projectscope"])
+		}
+		set["bidstatus"] = bt
+		project.Bidstatus = bt
+		if bidtype[bs] != "" {
+			set["bidtype"] = bidtype[bs]
+			project.Bidtype = bidtype[bs]
+		} else {
+			set["bidtype"] = "招标"
+			project.Bidtype = "招标"
+		}
+	} else {
+		if bidstatus[bs] != "" {
+			set["bidstatus"] = thisinfo.SubType
+			project.Bidstatus = thisinfo.SubType
+		} else if thisinfo.Infoformat == 2 {
+			set["bidstatus"] = "拟建"
+			project.Bidstatus = "拟建"
+		} else if bs == "" && bt == "结果" {
+			if project.Bidstatus == "招标" {
+				set["bidstatus"] = ""
+				project.Bidstatus = ""
+			}
+		} else {
+			set["bidstatus"] = "其它"
+			project.Bidstatus = "其它"
+		}
+	}
+	p.mapBidLock.Unlock()
+
+	//相同城市的公告才会合并到一起(全国列外)
+	if thisinfo.Area != "全国" {
+		pInfo.Area = thisinfo.Area
+		project.Area = thisinfo.Area
+		set["area"] = thisinfo.Area
+		if thisinfo.City != "" {
+			pInfo.City = thisinfo.City
+			project.City = thisinfo.City
+			set["city"] = thisinfo.City
+		}
+		if thisinfo.District != "" {
+			pInfo.District = thisinfo.District
+			project.District = thisinfo.District
+			set["district"] = thisinfo.District
+		}
+	}
+	//项目名称
+	//if (thisinfo.ProjectName != "" && pInfo.ProjectName == "") || (len([]rune(pInfo.ProjectName)) < 6 && thisinfo.LenPN > 6) {
+	if pInfo.ProjectName == "" && thisinfo.ProjectName != "" {
+		pInfo.ProjectName = thisinfo.ProjectName
+		project.ProjectName = thisinfo.ProjectName
+		set["projectname"] = thisinfo.ProjectName
+	}
+	//7--项目编号
+	//if (pInfo.ProjectCode == "" && thisinfo.ProjectCode != "") || (len([]rune(pInfo.ProjectCode)) < 6 && len([]rune(thisinfo.ProjectCode)) > 6) {
+	if pInfo.ProjectCode == "" && thisinfo.ProjectCode != "" {
+		pInfo.ProjectCode = thisinfo.ProjectCode
+		project.ProjectCode = thisinfo.ProjectCode
+		set["projectcode"] = thisinfo.ProjectCode
+	}
+	//7--采购单位
+	if (pInfo.Buyer == "" && thisinfo.Buyer != "") || (len([]rune(pInfo.Buyer)) < 5 && len([]rune(thisinfo.Buyer)) > 5) {
+		pInfo.Buyer = thisinfo.Buyer
+		project.Buyer = thisinfo.Buyer
+		set["buyer"] = thisinfo.Buyer
+
+		project.Buyerclass = thisinfo.Buyerclass
+		set["buyerclass"] = thisinfo.Buyerclass
+	}
+	if pInfo.Buyer == "" {
+		project.Buyerclass = ""
+		set["buyerclass"] = ""
+	}
+	//采购单位联系人
+	if thisinfo.Buyerperson != "" {
+		project.Buyerperson = thisinfo.Buyerperson
+		set["buyerperson"] = thisinfo.Buyerperson
+	} else {
+		project.Buyerperson = ""
+		set["buyerperson"] = ""
+	}
+	//采购单位電話
+	if thisinfo.Buyertel != "" {
+		project.Buyertel = thisinfo.Buyertel
+		set["buyertel"] = project.Buyertel
+	} else {
+		project.Buyertel = ""
+		set["buyertel"] = ""
+	}
+	if thisinfo.ContractCode != "" {
+		if project.ContractCode == "" {
+			set["contractcode"] = thisinfo.ContractCode
+		} else {
+			list := strings.Split(project.ContractCode, ",")
+			if BinarySearch(list, thisinfo.ContractCode) == -1 {
+				list = append(list, thisinfo.ContractCode)
+				sort.Strings(list)
+			}
+			set["contractcode"] = strings.Join(list, ",")
+		}
+	}
+
+	//8--代理机构
+	if (pInfo.Agency == "" && thisinfo.Agency != "") || (len([]rune(pInfo.Agency)) < 5 && len([]rune(thisinfo.Agency)) > 5) {
+		pInfo.Agency = thisinfo.Agency
+		project.Agency = thisinfo.Agency
+		set["agency"] = thisinfo.Agency
+	}
+
+	if len(thisinfo.Topscopeclass) > 0 {
+		sort.Strings(project.Topscopeclass)
+		for _, k := range thisinfo.Topscopeclass {
+			if BinarySearch(project.Topscopeclass, k) == -1 {
+				project.Topscopeclass = append(project.Topscopeclass, k)
+				sort.Strings(project.Topscopeclass)
+			}
+		}
+		set["topscopeclass"] = project.Topscopeclass
+	}
+
+	//项目评审专家
+	if len(thisinfo.ReviewExperts) > 0 {
+		set["review_experts"] = thisinfo.ReviewExperts
+		project.ReviewExperts = thisinfo.ReviewExperts
+	}
+	if thisinfo.Purchasing != "" {
+		if project.Purchasing == "" {
+			list := Duplicate(strings.Split(thisinfo.Purchasing, ",")) //标的物 去重 03/03
+			p := strings.Join(qu.ObjArrToStringArr(list), ",")
+			project.Purchasing = p
+			set["purchasing"] = p
+		} else {
+			list := strings.Split(project.Purchasing, ",")
+			list = qu.ObjArrToStringArr(Duplicate(list))
+			for _, k := range list {
+				if BinarySearch(strings.Split(thisinfo.Purchasing, ","), k) == -1 {
+					list = append(list, k)
+					sort.Strings(list)
+				}
+			}
+			set["purchasing"] = strings.Join(list, ",")
+		}
+	}
+
+	//中标候选人
+	if len(thisinfo.WinnerOrder) > 0 {
+		var list = []string{}
+		for _, v := range thisinfo.WinnerOrder {
+			if BinarySearch(list, qu.ObjToString(v["entname"])) == -1 {
+				list = append(list, qu.ObjToString(v["entname"]))
+			}
+		}
+		set["winnerorder"] = list
+		project.Winnerorder = list
+	}
+
+	if len(thisinfo.Subscopeclass) > 0 {
+		sort.Strings(project.Subscopeclass)
+		for _, k := range thisinfo.Subscopeclass {
+			if BinarySearch(project.Subscopeclass, k) == -1 {
+				project.Subscopeclass = append(project.Subscopeclass, k)
+				sort.Strings(project.Subscopeclass)
+			}
+		}
+		set["subscopeclass"] = project.Subscopeclass
+		set["s_subscopeclass"] = strings.Join(project.Subscopeclass, ",")
+	}
+
+	if len(thisinfo.Winners) > 0 {
+		if len(project.Winners) <= 0 {
+			set["winner"] = qu.ObjToString(tmp["winner"])
+		}
+		winners := strings.Split(project.Winners, ",")
+		for _, k := range thisinfo.Winners {
+			if thisinfo.SubType == "流标" || thisinfo.SubType == "废标" {
+				if BinarySearch(winners, k) != -1 {
+					deleteSlice(winners, k, "")
+				}
+			} else {
+				if BinarySearch(winners, k) == -1 {
+					winners = append(winners, k)
+				}
+			}
+		}
+
+		set["s_winner"] = strings.Join(qu.ObjArrToStringArr(Duplicate(winners)), ",")
+	}
+
+	if len(thisinfo.EntIdList) > 0 {
+		for _, v := range thisinfo.EntIdList {
+			if BinarySearch(project.EntIdList, v) == -1 {
+				project.EntIdList = append(project.EntIdList, v)
+			}
+		}
+		set["entidlist"] = project.EntIdList
+	}
+	// first_cooperation
+	if pInfo.Buyer != "" && len(strings.Split(project.Winners, ",")) > 0 {
+		FirstCooperation(set, pInfo.Buyer, strings.Split(project.Winners, ","), project.EntIdList)
+	}
+
+	//项目规模
+	if len(thisinfo.ProjectScale) > 0 {
+		project.ProjectScale = thisinfo.ProjectScale
+		set["project_scale"] = thisinfo.ProjectScale
+	}
+	//工期时长
+	if thisinfo.ProjectDuration > 0 {
+		project.ProjectDuration = thisinfo.ProjectDuration
+		set["project_duration"] = thisinfo.ProjectDuration
+	}
+	// 工期单位
+	if thisinfo.ProjectDuration > 0 && len(thisinfo.ProjectTimeUnit) > 0 {
+		project.ProjectTimeunit = thisinfo.ProjectTimeUnit
+		set["project_timeunit"] = thisinfo.ProjectTimeUnit
+	}
+	//开工日期
+	if thisinfo.ProjectStartDate > 0 {
+		if project.ProjectStartDate > 0 {
+			if project.ProjectStartDate < thisinfo.ProjectStartDate {
+				project.ProjectStartDate = thisinfo.ProjectStartDate
+				set["project_startdate"] = thisinfo.ProjectStartDate
+			}
+		} else {
+			project.ProjectStartDate = thisinfo.ProjectStartDate
+			set["project_startdate"] = thisinfo.ProjectStartDate
+		}
+	}
+	//竣工日期
+	if thisinfo.ProjectCompleteDate > 0 {
+		if project.ProjctCompleteDate > 0 {
+			if project.ProjctCompleteDate < thisinfo.ProjectCompleteDate {
+				project.ProjctCompleteDate = thisinfo.ProjectCompleteDate
+				set["project_completedate"] = thisinfo.ProjectCompleteDate
+			}
+		} else {
+			project.ProjctCompleteDate = thisinfo.ProjectCompleteDate
+			set["project_completedate"] = thisinfo.ProjectCompleteDate
+		}
+	}
+	// 付款方式
+	if len(thisinfo.Payway) > 0 {
+		project.Payway = thisinfo.Payway
+		set["payway"] = thisinfo.Payway
+	}
+	// 履约保证金
+	if tmp["contract_guarantee"] != nil {
+		project.ContractGuarantee = thisinfo.ContractGuarantee
+		set["contract_guarantee"] = thisinfo.ContractGuarantee
+	}
+	// 投标保证金
+	if tmp["bid_guarantee"] != nil {
+		project.BidGuarantee = thisinfo.BidGuarantee
+		set["bid_guarantee"] = thisinfo.BidGuarantee
+	}
+	// 资质条件
+	if len(thisinfo.Qualifies) > 0 {
+		var str []string
+		if len(project.Qualifies) > 0 {
+			str = append(str, strings.Split(project.Qualifies, ",")...)
+		}
+		for _, v := range thisinfo.Qualifies {
+			if len(qu.ObjToString(v["key"])) > 0 {
+				if BinarySearch(str, qu.ObjToString(v["key"])) == -1 {
+					str = append(str, qu.ObjToString(v["key"]))
+				}
+			}
+		}
+		if len(str) > 0 {
+			project.Qualifies = strings.Join(str, ",")
+			set["qualifies"] = strings.Join(str, ",")
+		}
+	}
+
+	if thisinfo.HasPackage { //多包处理
+		set["multipackage"] = 1
+		pkg := PackageFormat(thisinfo, project)
+		project.Package = pkg
+		set["package"] = project.Package
+	}
+	//处理多包后,计算预算金额、中标金额
+	CountAmount(project, thisinfo, tmp)
+	if project.Budget >= 0 && project.Budgettag != 1 {
+		pInfo.Budget = project.Budget
+		set["budget"] = project.Budget
+		set["budgettag"] = 0
+	}
+	if project.Bidamount >= 0 && project.Bidamounttag != 1 {
+		pInfo.Bidamount = project.Bidamount
+		set["bidamount"] = pInfo.Bidamount
+		set["bidamounttag"] = 0
+	}
+	if pInfo.Bidamount > 0 {
+		set["sortprice"] = pInfo.Bidamount
+	} else {
+		if pInfo.Budget > 0 {
+			set["sortprice"] = pInfo.Budget
+		}
+	}
+
+	infofield := InfoField{
+		Budget:       thisinfo.Budget,
+		Bidamount:    thisinfo.Bidamount,
+		ContractCode: thisinfo.ContractCode,
+		ProjectName:  thisinfo.ProjectName,
+		ProjectCode:  thisinfo.ProjectCode,
+		Bidstatus:    bs,
+	}
+
+	tmpMap := set["infofield"].(map[string]interface{})
+	tmpMap[thisinfo.Id] = StructToMap(infofield)
+	set["infofield"] = tmpMap
+	copyMap := Copy(project.InfoFiled).(map[string]InfoField)
+	copyMap[thisinfo.Id] = infofield
+	project.InfoFiled = copyMap
+
+	set["mpn"] = pInfo.MPN
+	set["mpc"] = pInfo.MPC
+}

+ 5 - 2
monitor/task.go

@@ -17,8 +17,11 @@ import (
 var taskA = 0 // 增量统计跳过
 
 var (
-	WebUrl     = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=45962efc-ca87-4996-9ffa-08bf6608ab7a"
-	skip, send = 0, 0
+	WebUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=45962efc-ca87-4996-9ffa-08bf6608ab7a"
+
+	WarningStr1 = "机器智能识别提醒,%d分钟未有数据入库,bidding表数据已积累%d条。"
+	WarningStr2 = "数据采集提醒,%d分钟未有数据入库。"
+	skip, send  = 0, 0
 )
 
 func TimeTask() {

+ 8 - 3
qyxy/qyxy_es/main.go

@@ -11,7 +11,7 @@ var (
 	Mgo        *mongodb.MongodbSim
 	Dbname     string
 	Dbcoll     string
-	Es         *es.Elastic
+	Es, Es1    *es.Elastic
 	Index      string
 	Itype      string
 	EsFields   []string
@@ -42,6 +42,11 @@ func init() {
 		I_size:  qu.IntAllDef(econf["pool"], 12),
 	}
 	Es.InitElasticSize()
+	Es1 = &es.Elastic{
+		S_esurl: econf["addr"].(string),
+		I_size:  qu.IntAllDef(econf["pool"], 12),
+	}
+	Es1.InitElasticSize()
 	EsFields = qu.ObjArrToStringArr(econf["esfields"].([]interface{}))
 	//TaskTime = qu.IntAll(Sysconfig["tasktime"])
 	Updatetime = qu.Int64All(Sysconfig["updatetime"])
@@ -52,8 +57,8 @@ func main() {
 	go SaveEs()
 
 	//go TimeTask()
-	//go StdAll()
-	go StdAdd()
+	go StdAll()
+	//go StdAdd()
 	ch := make(chan bool, 1)
 	<-ch
 }

+ 1 - 1
qyxy/qyxy_es/task.go

@@ -57,7 +57,7 @@ func StdAdd() {
 	it := sess.DB(Dbname).C(Dbcoll).Find(q).Iter()
 	count := 0
 	for tmp := make(map[string]interface{}); it.Next(&tmp); count++ {
-		if count%10000 == 0 {
+		if count%20000 == 0 {
 			log.Println("current:", count)
 		}
 		if util.IntAll(tmp["use_flag"]) > 5 {

+ 13 - 8
qyxy/qyxy_inc_data/main.go

@@ -14,7 +14,6 @@ import (
 	"net/url"
 	"os"
 	"qfw/util"
-	"strconv"
 	"strings"
 	"time"
 )
@@ -32,12 +31,13 @@ var (
 	sendMsg      string
 	collCount    int
 
+	saveLog map[string]int
 	saveArr [][]map[string]interface{}
 )
 
 func init() {
 	MongoTool = &mongodb.MongodbSim{
-		MongodbAddr: "172.17.4.181:27001",
+		MongodbAddr: "172.17.4.181:27001", //172.17.4.181:27001
 		Size:        10,
 		DbName:      "mixdata",
 	}
@@ -47,6 +47,7 @@ func init() {
 	updatePool = make(chan []map[string]interface{}, 10000)
 	updateSp = make(chan bool, 5)
 
+	saveLog = make(map[string]int)
 	SkipCollName = "annual_report_base,annual_report_website,company_base,company_employee,company_history_name,company_partner"
 
 }
@@ -54,7 +55,7 @@ func init() {
 func main() {
 
 	var path string
-	flag.StringVar(&path, "p", "", "/nas/qyxy/ftp/ftpuser/upload/20210811/")
+	flag.StringVar(&path, "p", "", "/nas/qyxy/ftp/ftpuser/upload/20200811/")
 	flag.Parse()
 	if path == "" {
 		flag.PrintDefaults()
@@ -110,19 +111,23 @@ func task(path string) {
 			subPath := path + f.Name() + "/"
 			subFiles, _ := ioutil.ReadDir(subPath)
 			for _, s := range subFiles {
-				if s.IsDir() {
-					taskinfo(subPath + s.Name())
-				}
+				util.Debug(s.Name())
+				//if s.IsDir() {
+				taskinfo(subPath + s.Name())
+				//}
 			}
 			if len(saveArr) > 0 {
 				tmps := saveArr
 				MongoTool.UpSertBulk(CurrentColl, tmps...)
 				saveArr = [][]map[string]interface{}{}
 			}
-			sendMsg += f.Name() + ":" + strconv.Itoa(collCount) + ";"
+			saveLog[f.Name()] = collCount
+			//sendMsg += f.Name() + ":" + strconv.Itoa(collCount) + ";"
 		}
 	}
-	SendMail(sendMsg)
+
+	MongoTool.Save("save_log", map[string]interface{}{"createtime": time.Now().String(), "result": saveLog})
+	//SendMail(sendMsg)
 }
 
 func taskinfo(path string) {

+ 2 - 2
qyxy/qyxy_std/config.json

@@ -3,7 +3,7 @@
   "dbName": "wjh",
   "dbSize": 10,
   "dbSave": "qyxy_std",
-  "uname": "SJZY_RWMIX_Other",
-  "upwd": "SJZY@M34I6x7D9ata",
+  "uname": "",
+  "upwd": "",
   "lastId": 261511180
 }

+ 2 - 3
qyxy/qyxy_std/init.go

@@ -7,7 +7,6 @@ import (
 	"mongodb"
 	"qfw/util"
 	"qfw/util/elastic"
-	"qfw/util/redis"
 )
 
 var (
@@ -60,7 +59,7 @@ func init() {
 	//MysqlTool.Init()
 
 	Es = &elastic.Elastic{
-		S_esurl: "http://172.17.145.170:9800", //http://172.17.145.170:9800
+		S_esurl: "http://127.0.0.1:9800", //http://172.17.145.170:9800
 		I_size:  10,
 	}
 	Es.InitElasticSize()
@@ -79,7 +78,7 @@ func init() {
 		log.Fatal("结巴分词出错...")
 		return
 	}
-	redis.InitRedis1("qyxy=172.17.4.189:8379", 3)
+	//redis.InitRedis1("qyxy=172.17.4.189:8379", 3)
 }
 
 func InitQyStype() {

+ 20 - 20
qyxy/qyxy_std/task.go

@@ -51,8 +51,8 @@ func TaskFun() {
 	sess := MongoTool1.GetMgoConn()
 	defer MongoTool1.DestoryMongoConn(sess)
 
-	client := Es.GetEsConn()
-	defer Es.DestoryEsConn(client)
+	//client := Es.GetEsConn()
+	//defer Es.DestoryEsConn(client)
 
 	pool := make(chan bool, 10)
 	wg := &sync.WaitGroup{}
@@ -407,25 +407,25 @@ func IncStd(tmp map[string]interface{}) {
 		if util.ObjToString(save["company_email"]) != "" {
 			types = append(types, "邮箱")
 		}
-		companyName := util.ObjToString(save["company_name"])
+		//companyName := util.ObjToString(save["company_name"])
 		// redis bid_unittype、bid_purchasing、bid_projectname
-		if b, err := redis.Exists("qyxy", companyName); err == nil && b {
-			maps := make(map[string]interface{})
-			text := redis.GetStr("qyxy", companyName)
-			err1 := json.Unmarshal([]byte(text), &maps)
-			if err1 != nil {
-				util.Debug(companyName, "winner-----map解析异常")
-			} else {
-				for k := range maps {
-					if k == "bid_contracttype" {
-						t1 := util.ObjArrToStringArr(maps[k].([]interface{}))
-						types = append(types, t1...)
-					} else {
-						save[k] = maps[k]
-					}
-				}
-			}
-		}
+		//if b, err := redis.Exists("qyxy", companyName); err == nil && b {
+		//	maps := make(map[string]interface{})
+		//	text := redis.GetStr("qyxy", companyName)
+		//	err1 := json.Unmarshal([]byte(text), &maps)
+		//	if err1 != nil {
+		//		util.Debug(companyName, "winner-----map解析异常")
+		//	} else {
+		//		for k := range maps {
+		//			if k == "bid_contracttype" {
+		//				t1 := util.ObjArrToStringArr(maps[k].([]interface{}))
+		//				types = append(types, t1...)
+		//			} else {
+		//				save[k] = maps[k]
+		//			}
+		//		}
+		//	}
+		//}
 		if len(types) == 0 {
 			types = append(types, "不存在")
 		}

+ 17 - 17
qyxy/save_ent/main.go

@@ -9,12 +9,12 @@ import (
 )
 
 var (
-	MongoTool			*mongodb.MongodbSim
-	StatusMap			map[string]string
-	WordsArr			[]string
+	MongoTool *mongodb.MongodbSim
+	StatusMap map[string]string
+	WordsArr  []string
 
-	updatePool          chan []map[string]interface{}
-	updateSp            chan bool
+	updatePool chan []map[string]interface{}
+	updateSp   chan bool
 )
 
 func init() {
@@ -22,8 +22,8 @@ func init() {
 		MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
 		Size:        10,
 		DbName:      "mixdata",
-		UserName: 	 "SJZY_RWESBid_Other",
-		Password:	 "SJZY@O17t8herB3B",
+		UserName:    "SJZY_RWESBid_Other",
+		Password:    "SJZY@O17t8herB3B",
 	}
 	MongoTool.InitPool()
 
@@ -31,9 +31,9 @@ func init() {
 	updateSp = make(chan bool, 4)
 
 	StatusMap = map[string]string{
-		"正常": "存续",
-		"其他": "存续",
-		"未注销": "吊销",
+		"正常":    "存续",
+		"其他":    "存续",
+		"未注销":   "吊销",
 		"个体转企业": "存续",
 	}
 	WordsArr = []string{"研发", "研制", "开发", "生产", "制造", "制作", "加工", "种植"}
@@ -72,7 +72,7 @@ func main() {
 			// employee_name
 			var ename []string
 			if emp, ok := tmp["employees"].([]interface{}); ok {
-				for _, v := range emp{
+				for _, v := range emp {
 					v1 := v.(map[string]interface{})
 					if util.ObjToString(v1["employee_name"]) != "" {
 						ename = append(ename, util.ObjToString(v1["employee_name"]))
@@ -84,7 +84,7 @@ func main() {
 			}
 			// bid_unittype		厂商
 			flag := false
-			for _, v := range WordsArr{
+			for _, v := range WordsArr {
 				if strings.Contains(util.ObjToString(tmp["business_scope"]), v) {
 					flag = true
 					break
@@ -98,7 +98,7 @@ func main() {
 			if phone := util.ObjToString(tmp["company_phone"]); phone != "" {
 				if len(phone) == 11 {
 					types = append(types, "手机号")
-				}else {
+				} else {
 					types = append(types, "固定电话")
 				}
 			}
@@ -114,7 +114,7 @@ func main() {
 			L:
 				for _, v := range annualReports {
 					v1 := v.(map[string]interface{})
-					if v1["report_websites"] != nil  {
+					if v1["report_websites"] != nil {
 						if reportWebsites, o := tmp["report_websites"].([]interface{}); o && len(reportWebsites) > 0 {
 							for _, m := range reportWebsites {
 								m1 := m.(map[string]interface{})
@@ -134,12 +134,12 @@ func main() {
 					name := util.ObjToString(tmp["company_name"])
 					if strings.Contains(t1, "有限合伙") {
 						updata["search_type"] = "有限合伙"
-					}else if strings.Contains(t1, "合伙") {
+					} else if strings.Contains(t1, "合伙") {
 						updata["search_type"] = "普通合伙"
-					}else if strings.Contains(name, "股份") ||
+					} else if strings.Contains(name, "股份") ||
 						(strings.Contains(t1, "上市") && !strings.Contains(t1, "非上市")) {
 						updata["search_type"] = "股份有限公司"
-					}else {
+					} else {
 						updata["search_type"] = "有限责任公司"
 					}
 				}

+ 1 - 1
udpcreateindex/src/biddingall.go

@@ -176,7 +176,7 @@ func (t *TaskInfo) biddingAllTask(data []byte, mapInfo map[string]interface{}) {
 			//go IS.Add("bidding")
 			UpdatesLock.Lock()
 			if qutil.IntAll(update["extracttype"]) != -1 {
-				newTmp := t.GetEsField(tmp, update)
+				newTmp := GetEsField(tmp, update, t.stype)
 				saveEsPool <- newTmp
 			}
 			if len(update) > 0 {

+ 1 - 1
udpcreateindex/src/biddingdata.go

@@ -62,7 +62,7 @@ func (t *TaskInfo) biddingDataTask(data []byte, mapInfo map[string]interface{})
 			defer func() {
 				<-mpool
 			}()
-			newTmp := t.GetEsField(tmp, nil)
+			newTmp := GetEsField(tmp, nil, t.stype)
 			newTmp["extracttype"] = qutil.IntAll(tmp["extracttype"])
 			saveEsAllPool <- newTmp
 		}(tmp)

+ 102 - 1
udpcreateindex/src/biddingindex.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"encoding/json"
+	"fmt"
 	mu "mfw/util"
 	"mongodb"
 	"qfw/util"
@@ -201,11 +202,23 @@ func (t *TaskInfo) doIndex(infos []map[string]interface{}, eMap map[string]map[s
 			}
 		}
 
+		// 附件有效字段
+		if i := validFile(tmp); i != 0 {
+			if i == -1 {
+				tmp["isValidFile"] = false
+				update["isValidFile"] = false
+			} else {
+				tmp["isValidFile"] = true
+				update["isValidFile"] = true
+			}
+		}
+
 		clearMap(tmp)
 		//go IS.Add("bidding")
 		if util.IntAll(update["extracttype"]) != -1 {
 			n2++
-			newTmp := t.GetEsField(tmp, update)
+			newTmp := GetEsField(tmp, update, t.stype)
+			newTmp["dataweight"] = 0 //索引数据新增 jy置顶字段
 			if util.ObjToString(newTmp["spidercode"]) == "a_jyxxfbpt_gg" {
 				// 剑鱼信息发布数据 通过udp通知信息发布程序
 				go UdpMethod(mongodb.BsonIdToSId(newTmp["_id"]))
@@ -398,3 +411,91 @@ func UdpMethod(id string) {
 	util.Debug(JyUdpAddr, string(datas))
 	_ = udpclient.WriteUdp(datas, mu.OP_TYPE_DATA, JyUdpAddr)
 }
+
+// @Description id不变,内容变化 重新索引数据
+// @Author J 2022/8/10 13:29
+func taskinfo(id string) {
+	tmp, _ := biddingMgo.FindById("bidding", id, nil)
+	if tmp == nil || len(*tmp) == 0 {
+		util.Debug(fmt.Sprintf("taskinfo bidding id=%s 未查询到数据", id))
+		return
+	}
+	extractM, _ := extractMgo.FindById(util.ObjToString(extract["collect"]), id, nil)
+	if extractM == nil || len(*extractM) == 0 {
+		extractM, _ = extractMgo.FindById(util.ObjToString(extract["collect1"]), id, nil)
+		if extractM == nil || len(*extractM) == 0 {
+			util.Debug(fmt.Sprintf("taskinfo extract id=%s 未查询到数据", id))
+			return
+		}
+	}
+	update := map[string]interface{}{} //要更新的mongo数据
+	//更新bidding表字段
+	for _, k := range biddingMgoFields {
+		v1 := (*extractM)[k] //extract
+		v2 := (*tmp)[k]      //bidding
+		if v2 == nil && v1 != nil {
+			update[k] = v1
+		} else if v2 != nil && v1 != nil {
+			update[k] = v1
+		} else if v2 != nil && v1 == nil {
+			if k == "area" || k == "city" || k == "district" {
+				update[k] = ""
+			}
+		}
+	}
+	if util.IntAll((*extractM)["repeat"]) == 1 {
+		update["extracttype"] = -1
+	} else {
+		update["extracttype"] = 1
+	}
+	if util.IntAll((*tmp)["dataging"]) == 1 { //修改未抽取的bidding数据的dataging
+		update["dataging"] = 0
+	}
+	//处理分类
+	FieldMethod(*extractM, update)
+
+	//同时保存到elastic
+	for tk, tv := range update {
+		(*tmp)[tk] = tv
+	}
+
+	extractMap := make(map[string]interface{})
+	if util.ObjToString((*tmp)["s_winner"]) != "" {
+		cid := FieldFun(*tmp)
+		if len(cid) > 0 {
+			(*tmp)["entidlist"] = cid
+			update["entidlist"] = cid
+			extractMap["entidlist"] = cid
+		}
+		updateExtractPool <- []map[string]interface{}{
+			{"_id": mongodb.StringTOBsonId(id)},
+			{"$set": extractMap},
+		}
+	}
+
+	// 附件有效字段
+	if i := validFile(*tmp); i != 0 {
+		if i == -1 {
+			(*tmp)["isValidFile"] = false
+			update["isValidFile"] = false
+		} else {
+			(*tmp)["isValidFile"] = true
+			update["isValidFile"] = true
+		}
+	}
+	clearMap(*tmp)
+	if util.IntAll(update["extracttype"]) != -1 {
+		newTmp := GetEsField(*tmp, update, "")
+		newTmp["dataweight"] = 0 //索引数据新增 jy置顶字段
+		saveEsPool <- newTmp
+
+	}
+	if len(update) > 0 {
+		delete(update, "winnerorder") //winnerorder不需要更新到bindding表,删除
+		updateBiddingPool <- []map[string]interface{}{{
+			"_id": mongodb.StringTOBsonId(id),
+		},
+			{"$set": update},
+		}
+	}
+}

+ 1 - 1
udpcreateindex/src/biddingindexback.go

@@ -55,7 +55,7 @@ func (t *TaskInfo) biddingBackTask(data []byte, mapInfo map[string]interface{})
 			defer func() {
 				<-mpool
 			}()
-			newTmp := t.GetEsField(tmp, nil)
+			newTmp := GetEsField(tmp, nil, t.stype)
 			saveEsElsePool <- newTmp
 		}(tmp)
 		tmp = make(map[string]interface{})

+ 104 - 21
udpcreateindex/src/biddingtask.go

@@ -124,7 +124,7 @@ func FieldMethod(compare, update map[string]interface{}) {
 
 // @Description ES保存字段
 // @Author J 2022/6/7 11:34 AM
-func (t *TaskInfo) GetEsField(tmp, update map[string]interface{}) map[string]interface{} {
+func GetEsField(tmp, update map[string]interface{}, stype string) map[string]interface{} {
 	newTmp := make(map[string]interface{})
 	for field, ftype := range biddingEsFields {
 		if tmp[field] != nil { //
@@ -192,7 +192,9 @@ func (t *TaskInfo) GetEsField(tmp, update map[string]interface{}) map[string]int
 			} else if field == "projectscope" {
 				ps, _ := tmp["projectscope"].(string)
 				if len(ps) > pscopeLength {
-					tmp["projectscope"] = string(([]rune(ps))[:pscopeLength])
+					newTmp["projectscope"] = string(([]rune(ps))[:pscopeLength])
+				} else {
+					newTmp["projectscope"] = ps
 				}
 			} else if field == "winnerorder" { //中标候选
 				winnerorder_new := []map[string]interface{}{}
@@ -253,7 +255,7 @@ func (t *TaskInfo) GetEsField(tmp, update map[string]interface{}) map[string]int
 					detail = detail[:detailLength]
 				}
 				detail = filterSpace.ReplaceAllString(detail, "")
-				if t.stype == "bidding" || t.stype == "bidding_history" {
+				if stype == "bidding" || stype == "bidding_history" {
 					text, b := FilterDetail(detail)
 					newTmp[field] = util.ObjToString(tmp["title"]) + " " + text
 					update["cleartag"] = b
@@ -286,26 +288,27 @@ func (t *TaskInfo) GetEsField(tmp, update map[string]interface{}) map[string]int
 	filetext := getFileText(tmp)
 	if len([]rune(filetext)) > 10 {
 		newTmp["filetext"] = filetext
-	} else {
-		// 附件未识别到内容,有附件且附件能够下载	filetext=""
-		if pinfo, o1 := tmp["projectinfo"].(map[string]interface{}); o1 {
-			if atts, o2 := pinfo["attachments"].(map[string]interface{}); o2 {
-				tag := false
-				for _, at := range atts {
-					at1 := at.(map[string]interface{})
-					if at1["fid"] != nil {
-						tag = true
-						break
-					}
-				}
-				if tag {
-					newTmp["filetext"] = ""
-				}
-			}
-		}
 	}
+	//else {
+	//	// 附件未识别到内容,有附件且附件能够下载	filetext=""
+	//	if pinfo, o1 := tmp["projectinfo"].(map[string]interface{}); o1 {
+	//		if atts, o2 := pinfo["attachments"].(map[string]interface{}); o2 {
+	//			tag := false
+	//			for _, at := range atts {
+	//				at1 := at.(map[string]interface{})
+	//				if at1["fid"] != nil {
+	//					tag = true
+	//					break
+	//				}
+	//			}
+	//			if tag {
+	//				newTmp["filetext"] = ""
+	//			}
+	//		}
+	//	}
+	//}
 	YuceEndtime(newTmp) // 预测结果时间
-	if t.stype == "bidding" {
+	if stype == "bidding" || stype == "bidding_history" {
 		newTmp["createtime"] = time.Now().Unix() // es库数据创建时间,只有增量数据有
 	}
 	return newTmp
@@ -514,6 +517,9 @@ func getMethod(str string) int64 {
 // @Author J 2022/6/7 8:04 PM
 func clearMap(tmp map[string]interface{}) {
 	for k := range tmp {
+		if tmp[k] == nil {
+			continue
+		}
 		if purchasinglist, ok := tmp["purchasinglist"].([]interface{}); ok && len(purchasinglist) == 0 {
 			delete(tmp, "purchasinglist")
 		} else if reflect.TypeOf(tmp[k]).String() == "string" && util.ObjToString(tmp[k]) == "" {
@@ -521,3 +527,80 @@ func clearMap(tmp map[string]interface{}) {
 		}
 	}
 }
+
+// @Description 附件有效字段(isValidFile)
+// @Author J 2022/7/8 14:41
+func validFile(tmp map[string]interface{}) int {
+	isContinue := false
+	if pinfo, o := tmp["projectinfo"].(map[string]interface{}); o {
+		if atts, o1 := pinfo["attachments"].(map[string]interface{}); o1 {
+			for _, att := range atts {
+				if att == nil {
+					util.Debug(tmp["_id"])
+					continue
+				}
+				if reflect.TypeOf(att).String() == "string" {
+					util.Debug(tmp["_id"])
+					continue
+				}
+				att1 := att.(map[string]interface{})
+				if fid := util.ObjToString(att1["fid"]); fid != "" {
+					isContinue = true
+					break
+				}
+			}
+			if isContinue {
+				if attachTxt, o := tmp["attach_text"].(map[string]interface{}); o {
+					if len(attachTxt) > 0 {
+						for _, at := range attachTxt {
+							at1 := at.(map[string]interface{})
+							if len(at1) > 0 {
+								for k, _ := range at1 {
+									if reflect.TypeOf(at1[k]).String() == "string" {
+										util.Debug(tmp["_id"])
+										continue
+									}
+									at2 := at1[k].(map[string]interface{})
+									s := strings.ToLower(util.ObjToString(at2["file_name"]))
+									if !strings.Contains(s, "jpg") || !strings.Contains(s, "jpeg") != strings.Contains(s, "png") ||
+										strings.Contains(s, "pdf") {
+										if strings.Contains(s, "swf") || strings.Contains(s, "html") {
+											return -1
+										} else if AnalysisFile(u.OssGetObject(util.ObjToString(at2["attach_url"]))) {
+											return 1
+										}
+									}
+								}
+								break
+							} else {
+								break
+							}
+						}
+					}
+				}
+				flag := false
+				for _, att := range atts {
+					if att == nil {
+						continue
+					}
+					if reflect.TypeOf(att).String() == "string" {
+						continue
+					}
+					att1 := att.(map[string]interface{})
+					if fid := util.ObjToString(att1["fid"]); fid != "" {
+						ftype := strings.ToLower(util.ObjToString(tmp["ftype"]))
+						if ftype != "swf" && ftype != "html" && u.OssObjExists("jy-datafile", fid) {
+							return 1
+						} else {
+							flag = true
+						}
+					}
+				}
+				if flag {
+					return -1
+				}
+			}
+		}
+	}
+	return 0
+}

+ 7 - 5
udpcreateindex/src/buyertask.go

@@ -29,8 +29,8 @@ func buyerEsTaskOnce() {
 	//区间id
 	q := map[string]interface{}{
 		"_id": map[string]interface{}{
-			"$gte": mongodb.StringTOBsonId(task_sid),
-			"$lt":  mongodb.StringTOBsonId(task_eid),
+			//"$gte": mongodb.StringTOBsonId(task_sid),
+			"$lt": mongodb.StringTOBsonId(task_eid),
 		},
 	}
 	//参数
@@ -57,7 +57,7 @@ func buyerEsTaskOnce() {
 	}).Sort("_id").Iter()
 	num_1 := 0
 	for tmp := make(map[string]interface{}); it_1.Next(&tmp); num_1++ {
-		if num_1%100 == 0 && num_1 > 0 {
+		if num_1%2000 == 0 && num_1 > 0 {
 			log.Println("当前表:", buyer_ent, "数量:", num_1)
 		}
 		pool <- true
@@ -95,7 +95,8 @@ func buyerEsTaskOnce() {
 			arrEs = append(arrEs, savetmp)
 			if len(arrEs) >= EsBulkSize {
 				tmps := arrEs
-				Es1.BulkSave(index, itype, &tmps, true)
+				//Es1.BulkSave(index, itype, &tmps, true)
+				Es2.BulkSave(index, itype, &tmps, true)
 				arrEs = []map[string]interface{}{}
 			}
 			buyerEsLock.Unlock()
@@ -146,7 +147,8 @@ func buyerEsTaskOnce() {
 	buyerEsLock.Lock()
 	if len(arrEs) > 0 {
 		tmps := arrEs
-		Es1.BulkSave(index, itype, &tmps, true)
+		//Es1.BulkSave(index, itype, &tmps, true)
+		Es2.BulkSave(index, itype, &tmps, true)
 		arrEs = []map[string]interface{}{}
 	}
 	buyerEsLock.Unlock()

+ 9103 - 0
udpcreateindex/src/common.txt

@@ -0,0 +1,9103 @@
+标	58819516
+人	39327632
+采	37936120
+的	37706721
+购	37481886
+公	36236358
+项	35631355
+目	33967273
+件	26066781
+中	24248928
+有	23875013
+工	23036670
+投	22866151
+名	21407564
+号	20671264
+市	19269013
+交	19033811
+应	18848999
+系	18504891
+文	18482498
+合	18472714
+时	18067230
+日	17950354
+招	17888352
+限	17325715
+联	17053179
+供	16297165
+方	16220463
+理	16165812
+司	16150407
+商	16003508
+价	15723465
+单	15684031
+称	15405229
+资	15092717
+电	14801139
+行	14290956
+信	14155867
+要	13825731
+程	13582836
+间	13557620
+本	13486562
+地	13426348
+务	13103530
+式	12939750
+金	12911438
+政	12791451
+建	12618565
+业	12450689
+同	12355117
+一	12177349
+设	12025515
+年	12008036
+格	11898630
+区	11850149
+元	11787621
+求	11629922
+成	11521187
+期	11447562
+证	11446141
+在	11348311
+及	10533500
+法	10372269
+报	10283071
+服	9784153
+不	9714957
+国	9649759
+提	9540450
+位	9525848
+告	9451662
+发	9378666
+机	9371225
+代	9351397
+为	9316699
+开	9309262
+规	9292674
+用	9284145
+定	9257293
+内	9196330
+月	9090142
+上	9008766
+网	8787776
+和	8738743
+量	8637377
+或	8430681
+息	8395952
+收	8243861
+备	7938980
+关	7895512
+编	7764352
+额	7686138
+府	7664619
+其	7632937
+保	7491743
+二	7468216
+分	7430224
+以	7359694
+下	7312858
+质	7298552
+址	7204975
+品	7153116
+管	7143789
+路	7054318
+大	6817743
+通	6781003
+三	6640535
+具	6519282
+计	6476683
+产	6321054
+点	6310657
+省	6308498
+数	6253031
+南	6085380
+询	6077527
+明	6067214
+包	6017638
+安	5958643
+作	5909347
+书	5831227
+构	5700053
+民	5652617
+验	5629225
+需	5612571
+体	5571681
+台	5571331
+于	5571030
+请	5524015
+自	5419321
+技	5398602
+北	5362314
+子	5338761
+准	5321892
+县	5312416
+参	5251467
+心	5230099
+源	5217124
+平	5202515
+进	5135833
+话	5108527
+注	5095567
+家	5077132
+取	5062035
+事	4986453
+后	4964046
+州	4954410
+医	4947546
+他	4925427
+第	4914147
+个	4908503
+无	4892453
+能	4855887
+责	4827705
+共	4823283
+易	4746731
+经	4729181
+等	4682049
+审	4644034
+加	4621486
+费	4620905
+可	4596597
+施	4580836
+止	4566158
+生	4562760
+对	4560231
+物	4534178
+评	4523552
+结	4501496
+四	4470421
+部	4437842
+料	4436663
+次	4409259
+东	4407033
+主	4376419
+江	4282625
+型	4275385
+出	4254273
+至	4244973
+新	4242474
+术	4239479
+现	4236283
+选	4232888
+西	4231203
+须	4200297
+院	4175189
+天	4174511
+相	4139154
+按	4135925
+布	4113542
+容	4061766
+与	4060170
+接	4048018
+所	4027172
+统	4011386
+办	4010128
+水	3993851
+山	3968762
+会	3960513
+动	3959106
+货	3957738
+过	3924695
+截	3798874
+监	3792703
+见	3746579
+全	3734245
+原	3692204
+并	3689534
+实	3684910
+企	3679242
+员	3655475
+制	3652198
+条	3620903
+录	3618905
+学	3613588
+查	3552078
+详	3544265
+果	3532413
+前	3514368
+五	3501341
+示	3498546
+如	3491606
+高	3446041
+华	3376518
+算	3374267
+附	3373930
+表	3368417
+小	3352573
+京	3351770
+预	3349917
+道	3343760
+城	3321651
+范	3314534
+情	3304161
+局	3290648
+记	3276988
+面	3268452
+楼	3256312
+门	3253149
+重	3226097
+印	3224345
+受	3215067
+场	3210992
+级	3193092
+总	3183047
+册	3174882
+议	3151135
+性	3138405
+委	3130202
+得	3127922
+器	3113768
+况	3097288
+任	3093234
+承	3085080
+海	3070804
+力	3046506
+划	3043746
+负	3041284
+专	3040204
+万	3036017
+类	3008622
+未	2992826
+递	2977149
+码	2974054
+化	2968585
+广	2937610
+集	2911090
+获	2907817
+执	2854796
+段	2854308
+效	2848833
+复	2835076
+将	2828753
+装	2824141
+六	2807725
+到	2794867
+营	2786367
+室	2761559
+财	2732123
+阳	2731002
+照	2719034
+否	2717402
+造	2706437
+响	2702722
+起	2686014
+被	2669621
+镇	2669036
+序	2668425
+份	2666035
+竞	2659169
+之	2658254
+是	2642337
+科	2618360
+传	2601158
+福	2601147
+入	2590900
+组	2564730
+材	2558388
+登	2556419
+支	2555946
+签	2550655
+问	2547868
+权	2545841
+湖	2526457
+七	2524657
+河	2463953
+线	2397851
+基	2389455
+处	2342891
+户	2316553
+载	2304768
+章	2295472
+知	2286348
+疗	2278376
+度	2265837
+据	2262838
+团	2252328
+清	2245080
+咨	2233629
+活	2219336
+修	2214296
+符	2185225
+站	2183927
+履	2175340
+满	2175306
+款	2167447
+完	2163147
+者	2152709
+向	2148274
+由	2139074
+补	2113953
+意	2085657
+改	2079798
+税	2072666
+售	2053677
+正	2050850
+外	2050049
+订	2016076
+运	2012633
+街	2008563
+必	2002018
+测	2000473
+充	1998204
+案	1986382
+邮	1983327
+最	1977975
+口	1970028
+宜	1967344
+筑	1965412
+达	1962867
+银	1962409
+约	1952071
+检	1947493
+十	1923604
+社	1917230
+足	1904144
+已	1902157
+违	1886809
+利	1860096
+控	1846022
+失	1816579
+密	1799438
+牌	1780836
+维	1743889
+整	1728112
+付	1724149
+展	1723353
+长	1714646
+村	1707377
+环	1698287
+纳	1682969
+围	1682073
+异	1676047
+云	1675338
+历	1671881
+八	1650409
+防	1649703
+光	1644023
+超	1642035
+列	1640257
+核	1639047
+当	1638361
+认	1636001
+盖	1635575
+确	1624651
+申	1620648
+套	1620502
+宁	1609579
+含	1608284
+股	1602058
+币	1600503
+械	1599592
+园	1586133
+因	1582770
+账	1577571
+配	1572687
+疑	1572451
+授	1570086
+林	1569986
+师	1559571
+立	1557217
+指	1552264
+特	1540052
+托	1536315
+治	1516899
+车	1498069
+批	1489197
+缴	1483000
+磋	1482588
+送	1482456
+页	1480137
+更	1477474
+则	1469191
+节	1463848
+图	1462932
+许	1456337
+形	1436368
+房	1428089
+龙	1427671
+来	1401990
+纸	1397182
+字	1391895
+候	1372832
+织	1368523
+各	1362012
+督	1361394
+介	1347730
+判	1342959
+解	1335683
+功	1331088
+属	1329554
+担	1322561
+视	1318483
+手	1314356
+除	1312429
+持	1311455
+存	1302933
+使	1300048
+库	1298811
+午	1296306
+细	1295534
+述	1288728
+身	1288311
+真	1286909
+根	1282324
+买	1276428
+依	1265894
+厂	1257546
+概	1246760
+张	1246529
+诉	1241188
+谈	1240393
+直	1238271
+箱	1232270
+答	1227754
+调	1220945
+农	1218421
+置	1216536
+九	1204848
+石	1198228
+简	1197159
+际	1194497
+比	1194391
+济	1185709
+甲	1180284
+说	1178859
+川	1178662
+描	1165155
+综	1161174
+境	1158081
+护	1152230
+苏	1142862
+操	1135255
+良	1128030
+争	1119630
+庆	1115380
+先	1108248
+策	1101585
+排	1091831
+层	1091273
+流	1083425
+试	1083088
+乙	1082814
+仪	1075257
+钢	1067532
+写	1066151
+兴	1053950
+转	1052534
+函	1049527
+乡	1047734
+色	1038789
+厦	1033927
+每	1031299
+米	1027902
+且	1011499
+好	1001482
+若	1001364
+职	1000882
+德	994605
+模	989962
+律	986850
+铁	977547
+予	972159
+该	971655
+拟	967470
+头	952926
+常	951499
+青	944357
+绩	941121
+低	936126
+均	924547
+双	924053
+凡	920874
+潜	918937
+严	901540
+汇	896222
+独	894595
+多	893667
+消	892593
+落	892344
+变	891450
+卫	887497
+闽	887130
+武	882437
+打	865467
+输	863569
+健	849511
+王	845662
+康	838924
+假	838390
+板	830632
+题	824597
+都	819962
+诺	819783
+率	812115
+校	810883
+免	799996
+票	796946
+教	796243
+障	792729
+我	792345
+险	790976
+带	790377
+李	790357
+声	789469
+桥	787112
+气	787074
+束	784727
+尔	783021
+致	776873
+协	774789
+风	772603
+土	771839
+领	764287
+别	764109
+优	763618
+黄	758961
+版	755180
+始	750320
+黑	749884
+导	743570
+此	742403
+终	732958
+座	729964
+退	728591
+临	721257
+厅	717619
+态	717526
+填	716332
+昌	715791
+媒	713721
+智	711668
+压	705360
+扫	702607
+红	701325
+热	698947
+括	685298
+育	682628
+看	679201
+它	672626
+普	672052
+浙	671796
+徽	671000
+没	665237
+微	663354
+租	663328
+少	662218
+放	661492
+永	659283
+油	656468
+泰	654782
+研	653029
+空	653016
+吉	652196
+近	651187
+白	645898
+深	645705
+族	645342
+连	642519
+察	640540
+周	636695
+诚	636461
+访	634730
+温	629821
+木	628892
+沙	627434
+何	627305
+非	626273
+考	625994
+卖	624840
+汉	624740
+暂	623664
+老	621887
+增	620848
+田	620595
+封	619285
+速	614710
+回	612668
+陈	611766
+续	609367
+从	608428
+状	605306
+卡	603216
+升	602959
+销	601662
+种	599399
+强	597368
+片	596808
+惠	593772
+软	590538
+途	589875
+启	588734
+贸	584442
+疾	583420
+络	578317
+创	576733
+即	575383
+刷	571485
+凭	571175
+顺	567131
+首	564841
+远	562521
+显	561006
+贵	558861
+两	557293
+花	555432
+刘	554439
+值	554414
+勘	553159
+然	550417
+港	549652
+古	548037
+估	547561
+步	545343
+决	544923
+块	543163
+养	540807
+域	538414
+只	537028
+绿	536529
+盘	534696
+适	534231
+推	525541
+积	522808
+丰	522470
+害	522180
+美	520428
+逾	518868
+频	514587
+克	513650
+波	513060
+病	510298
+彩	509235
+再	502802
+志	499488
+陆	499361
+誉	498431
+究	497083
+拒	495951
+架	495749
+档	495416
+津	494678
+延	493707
+益	493165
+春	490742
+马	488359
+澄	488264
+击	484520
+庄	483584
+停	483555
+栋	480547
+蒙	475415
+滨	475251
+影	470374
+了	470366
+例	468021
+博	463843
+星	462271
+圳	461268
+融	461076
+岛	456059
+盒	455555
+邀	455123
+就	454012
+液	452874
+残	451707
+客	450172
+队	450087
+士	449679
+药	449048
+择	446665
+景	444950
+湘	444038
+杨	441363
+换	440345
+宝	439426
+航	436031
+训	434164
+派	432880
+给	432546
+义	429575
+副	428467
+移	427259
+住	427172
+辆	427101
+疆	425981
+姓	423716
+损	423332
+兰	420834
+疫	419548
+泉	416974
+废	416783
+峰	416160
+齐	414265
+杭	411186
+胶	409107
+佰	408538
+拾	407902
+离	407322
+固	406132
+里	405771
+还	405579
+绝	404978
+宣	404414
+店	403264
+盛	402774
+溪	402289
+恒	401451
+助	398303
+晨	397791
+肥	395526
+促	394839
+端	394830
+郑	391935
+瑞	390973
+故	389524
+鑫	389423
+太	385905
+镜	385750
+儿	383975
+仟	380866
+扣	380252
+唐	379886
+便	379224
+女	378710
+幼	378459
+狱	377796
+拍	376537
+干	375794
+角	371351
+随	370540
+笔	370470
+允	367437
+乐	364749
+析	363915
+屋	363683
+携	363514
+辽	363429
+煤	363365
+玉	362396
+洲	362294
+反	362041
+急	359243
+血	358968
+屏	355456
+警	354122
+鲁	353796
+丽	353596
+但	353586
+脑	352475
+夏	352467
+侧	352380
+陵	350955
+柜	350837
+剂	347529
+衡	347243
+润	347039
+矿	345748
+甘	345383
+军	344710
+食	344272
+乌	343950
+切	343853
+池	343624
+观	342031
+竣	341366
+初	338222
+做	338083
+罚	337408
+陕	337243
+样	336863
+余	336281
+馆	334194
+污	333536
+音	333206
+宏	331776
+底	327448
+像	326855
+哈	325920
+壹	324938
+贰	323995
+威	323265
+精	322741
+吴	322740
+球	321429
+础	320076
+富	320058
+塘	318694
+漳	318585
+硬	317850
+培	317583
+徐	315872
+烟	313773
+岳	312843
+针	310659
+岗	309567
+洁	309091
+纪	306780
+佛	305187
+昆	304555
+嘉	303542
+拉	299470
+冷	297788
+叁	297036
+储	296875
+毒	295427
+抽	295271
+汽	293705
+革	292202
+栏	292014
+肃	291995
+佳	291589
+灯	290829
+断	290533
+阅	289715
+较	286451
+荐	286092
+似	285281
+诊	284445
+宇	283239
+渠	282893
+寸	281989
+绍	281806
+罗	281503
+寄	281110
+鼓	280308
+浦	280199
+旗	279901
+游	279710
+宽	278890
+火	277913
+荣	277707
+幢	277502
+伟	276430
+梁	275411
+英	274739
+览	274317
+沈	272754
+百	271595
+粉	270584
+禁	270268
+湾	269859
+快	268656
+另	267900
+床	267759
+零	267239
+慧	267000
+洪	265949
+珠	265518
+伍	263125
+锦	261538
+赁	261482
+涉	261101
+迎	260661
+锁	260381
+虚	260338
+互	259548
+潭	259206
+素	258795
+松	258060
+凤	255820
+链	255485
+耗	254175
+亚	252672
+洗	252370
+蓝	251176
+边	251174
+令	250416
+泵	249481
+季	249045
+留	248883
+世	248349
+呼	247725
+塔	247567
+颁	247545
+铜	247536
+界	247291
+袋	244777
+仅	244275
+轮	243430
+厚	242942
+浩	242699
+象	242590
+救	240884
+吨	240433
+巴	240203
+识	239326
+引	237841
+雨	235922
+隆	233912
+妇	233314
+届	232987
+振	232949
+飞	232669
+桂	232604
+弃	232079
+墙	232074
+晓	232059
+香	232031
+键	232005
+泽	231824
+夹	231485
+祥	231242
+而	231121
+论	230655
+阿	229886
+梅	229834
+赵	229576
+阀	228931
+螺	228855
+秀	226884
+署	226875
+辉	226188
+居	224886
+泥	224771
+桌	224541
+感	223961
+饰	223939
+贿	223293
+众	223027
+邵	222469
+径	220523
+钟	219549
+勒	218685
+旅	216138
+激	215429
+沟	214415
+胜	213757
+插	213111
+射	213089
+圾	212373
+鼎	212324
+玖	212118
+锈	211983
+垃	211956
+岭	211951
+官	210550
+党	210200
+挂	209284
+让	209074
+吸	208692
+皮	208390
+播	208291
+劳	207428
+误	206165
+斯	205871
+井	204974
+梯	204436
+抗	204374
+牛	204255
+洋	204000
+坊	203957
+艺	203665
+扩	203587
+把	203287
+混	203145
+才	201868
+塑	200340
+罪	199516
+尺	198578
+欢	198389
+草	198386
+酸	197182
+静	196475
+阶	195490
+犯	195319
+读	194884
+凯	194464
+极	193701
+叶	193576
+浮	193051
+冠	192907
+缆	191595
+淮	191494
+扶	191317
+株	191021
+善	190395
+苑	189944
+椅	189935
+聚	189808
+郭	189740
+索	189647
+神	188988
+捌	187419
+鸿	184524
+筹	183922
+酒	182089
+岩	181801
+吊	180177
+休	179503
+拆	179153
+灾	179135
+坪	178153
+杰	177776
+怀	176058
+肆	175935
+谷	175755
+征	175193
+胡	174584
+遵	173949
+丹	173835
+千	173487
+赣	173388
+群	173307
+毕	172966
+右	172565
+冻	172411
+卷	172383
+茂	172293
+树	171078
+顶	170996
+辅	170487
+菜	170385
+殊	169923
+杆	169776
+凝	169653
+措	169205
+破	169194
+芯	169096
+茶	168544
+堂	168315
+腾	166938
+差	166312
+守	165700
+柳	165444
+森	165414
+铺	164585
+轴	163913
+框	163747
+想	163678
+尚	163313
+己	163276
+朝	163016
+扬	162517
+偏	162114
+亮	161923
+洛	161788
+莞	161782
+鹏	161723
+仓	161293
+孙	161099
+迁	161010
+敏	160888
+思	160153
+谢	160060
+绘	159322
+瓶	159112
+氧	159035
+锡	158162
+宿	157642
+净	157197
+曲	156730
+朱	156174
+减	155980
+雅	155103
+避	154856
+宾	154706
+左	154417
+缺	154382
+染	153999
+越	153882
+苗	153819
+叉	153163
+燕	152938
+般	152606
+娄	152057
+友	151677
+摄	151340
+尾	151259
+仁	151065
+墨	150671
+滤	150421
+举	149480
+寿	149439
+享	149110
+亿	148510
+碳	148411
+裁	148340
+帐	148333
+透	148263
+浏	148228
+今	148074
+孔	148072
+踏	147564
+燃	146629
+冶	146553
+丝	146188
+也	146029
+筒	145719
+奖	145628
+隔	144845
+坝	143956
+晶	143511
+偿	142705
+触	142564
+柒	142547
+旧	142410
+桶	142247
+待	142001
+爱	141858
+半	141666
+班	141550
+距	140838
+菌	140760
+沂	140759
+骨	140674
+撤	139261
+垫	139098
+磁	138647
+吾	137985
+圆	137867
+靖	137807
+耐	137148
+喷	136761
+翔	136193
+刀	135479
+雷	135340
+赛	135140
+鄂	135135
+郴	135074
+坡	134846
+够	134787
+冲	134205
+晋	133711
+桃	133379
+盐	133265
+宋	132551
+窗	132251
+贫	131439
+毛	131414
+秒	130996
+磨	130773
+勤	129967
+岸	129828
+横	129400
+探	128766
+驻	128669
+腔	128086
+雪	127748
+败	127542
+往	127053
+央	127008
+藏	126959
+莱	126776
+餐	126495
+折	126438
+幅	126228
+缮	125581
+秦	125468
+炉	124986
+暖	124673
+练	124626
+童	124550
+雄	124453
+霞	123350
+弄	122135
+轨	121102
+植	120074
+捷	119952
+芜	119867
+汕	119757
+饮	118840
+仙	118785
+灵	118161
+潍	117968
+聊	117915
+降	117745
+援	117731
+鲜	117621
+散	117489
+拖	116874
+帮	116748
+晟	116725
+唯	116526
+错	116331
+望	116222
+欣	115814
+硒	115573
+粤	115122
+讯	114626
+渝	114047
+冀	113978
+罩	113764
+稳	113576
+芳	113400
+贷	113285
+纯	113283
+母	112877
+阜	112744
+贴	112718
+灭	112554
+麻	112403
+课	112320
+遗	112175
+铝	111887
+占	111816
+君	111784
+兵	111296
+滩	110628
+潮	110393
+紧	109256
+玛	108943
+史	108691
+戴	108558
+语	108472
+寻	108170
+艳	107904
+俊	107349
+奥	107307
+漏	106859
+焦	106433
+釆	106427
+牵	106314
+缩	106046
+壁	105952
+焊	105420
+颜	105375
+卓	105361
+膜	105327
+彭	105052
+漆	104206
+亦	104161
+杯	103568
+蔡	103541
+鹤	103473
+旭	103264
+紫	102862
+戒	102594
+什	102423
+阴	102323
+淀	102305
+沿	101600
+恶	101490
+勇	101473
+闭	101217
+柱	101189
+巷	101086
+竹	100898
+洞	100501
+晰	100405
+旺	100280
+辖	99990
+尽	99666
+拓	99630
+继	99243
+赤	98701
+曾	98521
+欧	98291
+曹	98258
+灌	98089
+累	97992
+豫	97580
+玲	97470
+肺	97441
+拨	97404
+邦	97373
+你	97096
+某	97029
+灰	96807
+旋	96378
+辰	95807
+纤	95676
+杂	95497
+伊	95412
+舍	94990
+黔	94778
+短	94717
+涛	94537
+馈	94396
+弹	94382
+柯	94306
+忠	93836
+玻	93608
+萍	93455
+棉	93256
+遇	92981
+屯	92897
+壮	92750
+危	92653
+湛	92430
+榆	92275
+亩	92035
+背	92034
+莲	91985
+丁	91774
+衣	91733
+崇	91712
+鞍	91696
+循	91627
+铭	91622
+赔	91300
+尼	91099
+辨	91071
+楚	90967
+迪	90950
+眼	90945
+庭	90789
+挥	90192
+栓	90022
+恩	89974
+圈	89927
+槽	89657
+棚	89582
+裕	89328
+沧	89320
+陷	89301
+禹	89187
+涂	89071
+悦	88930
+坤	88857
+滑	88857
+卸	88757
+伦	88728
+斌	88670
+韩	88401
+追	87762
+峡	87214
+阻	87071
+船	86963
+粮	86683
+靠	86576
+鉴	86240
+埠	86054
+兆	85893
+碎	85784
+廊	85764
+姚	85757
+缝	85691
+宗	85674
+骗	85549
+炎	85187
+幕	84929
+亭	84858
+脉	84856
+睿	84793
+襄	84240
+丘	84058
+患	83896
+虑	83895
+兼	83841
+锋	83816
+虹	83581
+伏	83544
+姐	83234
+债	83138
+肖	83093
+露	83078
+鸡	83043
+橡	82949
+纹	82726
+贤	82687
+侯	82346
+驱	82324
+绵	82290
+荆	82210
+豪	82133
+皇	81481
+刻	81450
+镀	81446
+澳	81267
+希	80839
+涵	80791
+钻	80737
+脱	80555
+湿	79898
+弘	79875
+贝	79699
+璃	79383
+奇	79376
+锌	78930
+瑶	78864
+麦	78751
+娟	78689
+顾	78607
+秋	78511
+邓	78485
+杜	78048
+渡	78046
+串	77955
+画	77376
+砂	77256
+命	77110
+钮	77090
+醒	77087
+震	76781
+钉	76474
+撑	76153
+蓉	76045
+习	75511
+韶	75289
+迟	75063
+聘	74398
+唱	74369
+仔	74349
+刚	74010
+讼	73937
+骤	73331
+斗	73295
+谱	73013
+愿	72737
+冬	72643
+荷	72636
+吕	72610
+寨	72588
+凉	72572
+困	72534
+宅	72425
+饶	72194
+锐	72137
+稿	72074
+难	72009
+闸	71562
+桩	71475
+牧	71385
+仲	71293
+畅	71158
+庐	71035
+冰	71028
+喀	70953
+听	70862
+仑	70798
+翠	70750
+脚	70730
+熟	70649
+雁	70518
+孚	70497
+弯	70484
+凌	70259
+寓	70251
+席	70129
+厨	69934
+剩	69768
+冯	69740
+昭	69730
+久	69643
+牙	69630
+释	69558
+董	69527
+盟	69408
+尘	69349
+贺	69252
+邢	69191
+泸	69057
+乳	68994
+典	68436
+抚	68432
+圣	68284
+鱼	68070
+冈	68017
+鼠	67149
+禾	66691
+硕	66455
+魏	66187
+萨	65996
+坑	65864
+锅	65777
+瓦	65498
+潘	65442
+恢	65400
+柏	65374
+邯	65064
+旁	65055
+桐	64903
+婷	64869
+晖	64765
+伤	64625
+舒	64596
+尝	64512
+轻	64377
+厕	64329
+慈	64305
+淄	64209
+丙	64174
+巡	63999
+芦	63875
+斤	63829
+陶	63635
+黎	63112
+揭	62949
+势	62949
+敬	62912
+肇	62780
+耀	62612
+羊	62605
+旦	62568
+枣	62562
+粒	62340
+映	62142
+替	61903
+爆	61757
+铸	61708
+言	61699
+穿	61393
+胞	61249
+袁	61208
+归	61074
+宫	61025
+肉	61023
+隐	60926
+刺	60755
+磊	60694
+琴	60628
+仍	60506
+搬	60021
+蒸	59723
+跨	59405
+去	59230
+堰	59196
+甸	59100
+姜	58721
+沥	58641
+钥	58625
+惩	58623
+缘	58574
+卢	58516
+虎	58212
+烧	58155
+壶	58102
+昊	58057
+腐	57755
+粘	57678
+沃	57656
+演	57578
+浆	57171
+凰	57125
+邹	57101
+迈	57022
+礼	57013
+廉	57012
+蒋	56973
+硅	56831
+砖	56823
+隧	56658
+郸	56630
+奉	56606
+蚌	56510
+咸	56423
+碧	56423
+汪	56356
+荧	56297
+剪	56288
+耳	56051
+战	56031
+馨	56007
+覆	55646
+巾	55368
+蓄	55196
+筋	55186
+盈	55171
+拥	55035
+堤	54948
+怡	54829
+找	54742
+泡	54527
+鸣	54527
+返	54264
+剑	54188
+彦	54133
+莉	53865
+祁	53845
+尿	53668
+舟	53631
+渣	53576
+皖	53418
+庙	53227
+钱	53194
+巨	53161
+挡	52918
+霍	52781
+疏	52723
+跃	52714
+沅	52629
+扎	52571
+孟	52391
+艾	52244
+割	52076
+逐	51870
+纬	51794
+耕	51622
+挖	51228
+辑	51149
+鹿	51060
+凳	50516
+筛	50474
+朗	50398
+炼	50356
+堡	50323
+肠	50315
+纠	50183
+遂	49916
+早	49911
+钦	49854
+腹	49692
+兑	49685
+喜	49664
+瓷	49551
+汤	49524
+翻	49435
+轧	49242
+沁	49210
+轩	49107
+谊	48897
+彝	48815
+珍	48814
+噪	48754
+绥	48733
+邑	48699
+彬	48634
+胎	48632
+枝	48603
+醉	48595
+顿	48478
+孝	48351
+野	48105
+柴	48042
+坚	47991
+绳	47745
+碱	47722
+芙	47698
+佩	47596
+匹	47591
+邱	47535
+纷	47435
+恕	47171
+梦	47169
+驰	47018
+脂	47001
+绑	46942
+蛋	46851
+枪	46342
+芝	46295
+蜀	46058
+谭	45998
+罐	45775
+瘤	45561
+您	45168
+坏	45144
+走	45049
+刑	45020
+励	45005
+贡	45005
+钳	44914
+韵	44821
+暨	44553
+突	44548
+肿	44533
+寺	44529
+删	44352
+琼	44347
+熊	44296
+莆	44283
+埔	44281
+臂	44134
+舜	44086
+仿	44019
+伸	43952
+衬	43888
+添	43866
+枫	43663
+娜	43413
+墩	43387
+炭	43383
+虫	43364
+狮	43213
+蔬	42993
+跟	42933
+琪	42582
+堵	42556
+抵	42443
+琳	42270
+欠	42234
+荔	42208
+毅	42151
+翼	42100
+陇	42085
+滚	41937
+伪	41839
+廖	41747
+乾	41604
+缓	41584
+埋	41551
+梧	41529
+柔	41339
+氏	41324
+堆	41317
+鹰	41304
+募	41250
+押	41241
+默	41186
+亲	41152
+奔	41131
+鼻	41123
+帆	40901
+烯	40722
+番	40693
+胃	40621
+症	40583
+汾	40547
+阵	40526
+纺	40409
+塞	40364
+扇	40276
+觉	40203
+斜	39973
+贾	39833
+盆	39821
+坛	39768
+崔	39668
+硫	39645
+畜	39622
+倒	39577
+嘴	39574
+讲	39568
+弱	39529
+窥	39460
+铅	39319
+摇	39316
+滁	39316
+赫	39198
+遥	39196
+殖	38944
+乔	38943
+葛	38911
+雾	38830
+御	38796
+衢	38728
+纽	38612
+薛	38496
+齿	38485
+榕	38029
+牡	37929
+扰	37917
+闻	37906
+渔	37869
+霄	37867
+孜	37687
+摸	37603
+盾	37454
+尖	37435
+肌	37404
+圩	37222
+侗	37141
+攻	37063
+秘	36979
+槐	36898
+帽	36777
+柄	36741
+壳	36731
+骏	36726
+辛	36724
+倍	36676
+味	36547
+毁	36534
+篮	36466
+曙	36431
+颖	36293
+浪	36291
+纵	36215
+坐	36049
+曼	36040
+略	36011
+垦	35841
+鞋	35728
+夫	35656
+男	35645
+喉	35573
+跳	35531
+借	35254
+闪	35253
+搜	35207
+几	35145
+侨	35142
+踪	35133
+泄	35060
+薄	34824
+逸	34795
+译	34739
+召	34697
+缸	34562
+尹	34460
+氯	34454
+匙	34357
+刊	34318
+抢	34246
+胸	34181
+攀	34144
+澧	34141
+遭	34086
+这	34059
+伙	34007
+籍	33974
+氢	33866
+禅	33863
+桑	33857
+擦	33737
+钩	33647
+芬	33642
+着	33425
+氨	33359
+私	33155
+沪	33101
+郊	32997
+鄞	32820
+醇	32783
+莹	32686
+醴	32664
+幸	32545
+枢	32482
+念	32408
+悉	32390
+叠	32299
+垂	32231
+麟	32202
+禺	32134
+弟	32131
+酌	32107
+驿	32037
+洱	32025
+泾	31925
+那	31913
+侵	31830
+披	31779
+溶	31712
+杀	31689
+渭	31584
+巩	31552
+棒	31489
+裂	31253
+丧	31216
+耒	31017
+辐	30920
+氟	30700
+帘	30686
+颗	30637
+碑	30629
+砌	30515
+淘	30312
+匀	30266
+脏	30262
+遴	30202
+伯	30167
+莫	29966
+麓	29931
+颤	29823
+菏	29765
+拌	29752
+搭	29750
+窑	29731
+蒲	29721
+兄	29639
+肤	29634
+趣	29632
+仕	29590
+泓	29589
+杏	29588
+宸	29564
+羽	29548
+沉	29478
+乘	29344
+菲	29332
+浓	29280
+岚	29247
+渗	29201
+役	29183
+绕	29105
+们	29093
+糖	28989
+砼	28777
+壤	28768
+歌	28743
+夷	28733
+舞	28644
+驶	28620
+韦	28604
+慎	28505
+秩	28496
+淑	28463
+萧	28416
+茅	28416
+驾	28340
+芷	28289
+末	28262
+菊	28151
+悬	28150
+澜	28024
+却	27991
+脸	27942
+摩	27846
+遣	27822
+蓬	27791
+阁	27758
+酯	27699
+诸	27602
+峪	27553
+迹	27535
+泗	27444
+涟	27394
+麒	27350
+楠	27293
+辊	27278
+稀	27077
+椒	27037
+芗	26948
+龚	26925
+巧	26864
+荫	26858
+朔	26837
+罕	26817
+虞	26763
+苍	26639
+猪	26623
+奎	26611
+酶	26587
+倩	26533
+烤	26488
+汝	26485
+泊	26456
+涌	26436
+抄	26412
+聪	26377
+掘	26376
+券	26281
+亳	26258
+豆	26094
+隅	26019
+淳	25994
+勿	25987
+磷	25944
+厢	25794
+梓	25712
+瑕	25701
+溯	25682
+巢	25582
+疵	25525
+熔	25518
+抑	25472
+舶	25465
+囊	25457
+敷	25423
+忻	25394
+呈	25311
+舱	25226
+珊	25180
+乱	25136
+姑	25132
+赖	25041
+倾	24952
+饭	24868
+绣	24858
+蚀	24840
+濮	24825
+溉	24802
+贯	24799
+肢	24791
+尧	24577
+矩	24499
+龄	24482
+揽	24460
+诏	24351
+拼	24313
+浑	24266
+磅	24196
+滇	24137
+伴	24079
+繁	24051
+瀚	24005
+郝	23937
+劣	23906
+蔽	23903
+掌	23891
+邻	23870
+眉	23794
+谋	23782
+碍	23771
+雕	23755
+闫	23754
+媛	23746
+琦	23676
+毫	23565
+亨	23543
+哲	23542
+拔	23516
+浴	23480
+岁	23441
+涪	23409
+弥	23362
+洽	23324
+谨	23301
+慢	23252
+卧	23217
+氮	23203
+粗	23194
+婴	23154
+淖	23125
+暗	23044
+傅	23025
+闵	22905
+淤	22888
+烈	22846
+迅	22772
+帅	22747
+樊	22697
+祝	22689
+楞	22679
+煌	22656
+昇	22653
+捏	22624
+献	22509
+昱	22391
+倪	22322
+祖	22320
+滦	22284
+妙	22269
+熙	22260
+敦	22189
+抓	22037
+煜	21974
+闲	21951
+菱	21942
+樟	21907
+炜	21851
+晚	21847
+握	21785
+霖	21701
+禄	21690
+蝶	21633
+翁	21628
+坎	21623
+抹	21553
+厘	21541
+腺	21540
+瑜	21521
+酷	21403
+著	21375
+滕	21373
+灶	21272
+粪	21225
+簧	21216
+浔	21201
+盗	21190
+垣	21186
+枚	21117
+蜜	21090
+涤	21085
+鸟	20978
+穗	20978
+棠	20948
+葫	20797
+摆	20718
+炬	20711
+钠	20653
+锥	20650
+又	20633
+锚	20633
+昕	20566
+骑	20535
+诗	20532
+皓	20492
+陀	20446
+陂	20414
+牟	20408
+犁	20389
+岔	20359
+冒	20305
+漯	20275
+胆	20174
+刮	20130
+墅	20114
+搏	20102
+攸	20071
+尤	20053
+吐	19986
+苯	19937
+践	19855
+孵	19794
+雯	19737
+诈	19710
+奶	19703
+肝	19648
+拱	19629
+既	19550
+璐	19485
+泌	19472
+醛	19351
+彻	19349
+扳	19324
+殡	19310
+磐	19275
+淞	19205
+莎	19176
+泛	19128
+潼	19103
+嵌	19038
+纱	19029
+酵	19003
+嵩	18946
+妥	18894
+蕾	18882
+鸭	18834
+稻	18834
+帝	18736
+泳	18727
+臭	18709
+玮	18691
+裙	18683
+浇	18631
+颅	18615
+奕	18580
+颍	18539
+死	18494
+伞	18476
+颈	18463
+滋	18441
+璧	18438
+衔	18438
+旱	18348
+祺	18319
+皂	18289
+夜	18234
+锂	18173
+渤	18126
+钰	18053
+些	17907
+庞	17862
+搅	17794
+臻	17697
+铲	17635
+聂	17607
+猜	17594
+吹	17535
+丛	17534
+俞	17467
+殷	17461
+涡	17455
+蔚	17436
+膏	17412
+燥	17392
+胺	17386
+翰	17360
+铃	17356
+瓜	17186
+皋	17154
+腰	17137
+汶	17090
+卉	16967
+涝	16962
+坦	16951
+拦	16945
+覃	16912
+薇	16894
+遮	16894
+佑	16816
+灿	16812
+蕉	16808
+叫	16764
+栅	16749
+晏	16740
+杉	16689
+滴	16688
+汛	16660
+溧	16583
+汀	16547
+剧	16468
+郡	16465
+佐	16445
+梨	16435
+莒	16432
+谐	16355
+岐	16340
+濉	16324
+沭	16276
+潞	16182
+碗	16123
+貌	16111
+掉	16105
+郎	16104
+歧	16096
+颐	16086
+巫	16057
+寰	16056
+箭	16055
+淋	16052
+恺	16033
+袖	16017
+朋	15948
+尊	15932
+斑	15903
+擅	15820
+耿	15799
+桦	15789
+膨	15750
+涧	15718
+跑	15713
+谅	15651
+沫	15590
+娇	15582
+赢	15539
+屈	15537
+寒	15527
+芒	15513
+拜	15510
+浅	15428
+烷	15344
+胀	15333
+沣	15332
+逻	15330
+曝	15315
+荒	15287
+岱	15237
+潇	15193
+溢	15191
+轿	15100
+鹅	15097
+肩	15069
+箕	14994
+腿	14987
+兽	14903
+玩	14902
+炳	14870
+屿	14868
+栽	14858
+眠	14853
+沐	14848
+戏	14823
+蚊	14777
+纲	14770
+栗	14730
+栖	14730
+莘	14691
+摘	14687
+屹	14680
+钛	14668
+骆	14637
+酬	14629
+炮	14595
+牢	14592
+郁	14474
+浚	14424
+猫	14356
+勐	14342
+渍	14331
+丢	14190
+匠	14078
+窝	14075
+侦	14069
+刹	14060
+尉	14056
+枕	14054
+劲	14024
+绒	14002
+昂	13992
+挤	13932
+巍	13931
+缠	13911
+沽	13884
+帧	13826
+椎	13784
+赋	13783
+穆	13779
+洼	13753
+赉	13745
+旌	13744
+荡	13734
+勾	13733
+皆	13723
+妃	13711
+沛	13690
+晴	13671
+瓯	13653
+洒	13649
+兹	13647
+栾	13619
+嘎	13601
+绞	13488
+浸	13477
+咽	13473
+潢	13437
+浠	13422
+扁	13399
+弧	13374
+撞	13248
+崂	13198
+崖	13193
+蜡	13178
+篇	13178
+谦	13118
+讨	13101
+萌	13071
+荟	13070
+冉	13059
+穴	13046
+曦	13039
+锻	13028
+郫	13013
+烨	13010
+笼	12992
+岑	12987
+催	12867
+邺	12854
+峨	12837
+缀	12832
+傣	12792
+禽	12790
+矫	12748
+玺	12716
+赠	12713
+墓	12703
+卜	12697
+垒	12663
+淼	12639
+藤	12635
+棋	12622
+勋	12619
+睡	12511
+坞	12499
+鲍	12465
+棕	12424
+峻	12424
+漫	12400
+痕	12376
+玄	12366
+霸	12354
+喇	12305
+肾	12262
+凸	12240
+乒	12219
+喻	12159
+蜂	12122
+滘	12079
+阮	12077
+芹	12067
+锯	12057
+矛	12056
+乓	12052
+鳌	11997
+坂	11939
+羌	11922
+碚	11888
+脊	11886
+伽	11862
+贞	11858
+泷	11829
+捆	11799
+渌	11794
+珞	11784
+毯	11770
+辩	11744
+彪	11709
+翟	11706
+诱	11682
+畴	11680
+嵊	11674
+兖	11656
+烘	11636
+剖	11599
+雀	11445
+茌	11433
+沱	11392
+妹	11387
+榄	11360
+儒	11337
+丈	11336
+帚	11327
+茹	11323
+削	11309
+妮	11238
+璟	11232
+硝	11184
+隙	11153
+猛	11151
+乃	11128
+爽	11126
+郧	11091
+廷	11061
+锤	11044
+痛	11040
+逆	10999
+叙	10995
+苹	10931
+孕	10896
+抛	10885
+屉	10884
+裤	10875
+詹	10812
+赂	10803
+舰	10686
+弓	10678
+睢	10635
+箍	10630
+彤	10584
+腊	10529
+竖	10519
+敖	10495
+鲤	10471
+亡	10469
+痰	10449
+忽	10439
+汰	10438
+铬	10424
+隶	10415
+瞒	10387
+庵	10384
+耽	10372
+铂	10349
+赞	10337
+迷	10332
+簸	10317
+寅	10309
+帕	10260
+暴	10218
+沾	10192
+卿	10176
+綦	10171
+恰	10166
+洮	10132
+茗	10124
+词	10101
+妍	10070
+碰	10043
+焕	10042
+媳	10029
+笑	9935
+拷	9841
+俗	9829
+靶	9772
+芸	9766
+顷	9743
+哨	9708
+籽	9698
+怒	9672
+溆	9591
+忆	9582
+钙	9579
+邗	9568
+擎	9540
+柘	9538
+戈	9529
+蚁	9527
+婧	9525
+盲	9525
+肯	9523
+娥	9516
+檀	9514
+茄	9502
+茜	9499
+糊	9498
+臣	9475
+掖	9473
+秤	9416
+衷	9335
+霉	9331
+弋	9323
+篷	9291
+塌	9282
+饱	9255
+樱	9220
+窄	9199
+桔	9179
+汗	9157
+琛	9153
+甬	9149
+挺	9136
+畔	9129
+淇	9127
+饲	9096
+氛	9068
+旬	9030
+铣	9024
+萝	8994
+甄	8955
+刨	8946
+涿	8935
+舆	8928
+寮	8925
+胁	8877
+岷	8877
+纶	8871
+翡	8861
+耦	8849
+咳	8827
+焚	8817
+乏	8812
+笛	8760
+圃	8730
+鹭	8720
+菁	8711
+垛	8709
+禧	8680
+柠	8647
+扭	8642
+砚	8619
+忘	8608
+婺	8607
+烽	8604
+硚	8587
+很	8574
+绪	8554
+桓	8545
+裴	8534
+梳	8510
+橙	8508
+汨	8481
+艇	8480
+棵	8477
+钧	8470
+窦	8469
+趋	8442
+剥	8435
+拐	8413
+秸	8370
+湄	8369
+贮	8351
+伐	8341
+阔	8340
+讫	8289
+漂	8274
+甜	8270
+哑	8265
+茵	8253
+蛟	8231
+奋	8228
+淡	8212
+宪	8210
+煲	8209
+咀	8204
+姆	8197
+秆	8191
+杠	8186
+捕	8165
+涞	8149
+盼	8139
+璜	8104
+湟	8101
+萃	8093
+甫	8077
+嫌	8070
+亏	8048
+辣	8028
+匾	8012
+驼	7958
+陪	7956
+樾	7950
+镍	7949
+雍	7915
+盏	7906
+葬	7904
+焱	7901
+吧	7897
+抱	7896
+氩	7860
+叭	7836
+蕴	7823
+熏	7810
+灸	7791
+骅	7788
+喆	7773
+蟠	7750
+宛	7734
+钾	7732
+衍	7725
+阎	7719
+棱	7715
+靴	7714
+烁	7709
+钨	7695
+冗	7686
+斥	7646
+珑	7641
+坳	7632
+楷	7572
+傲	7570
+葡	7565
+勃	7551
+篡	7538
+遍	7478
+厝	7474
+韬	7473
+刁	7457
+阐	7449
+浈	7448
+渚	7441
+珲	7417
+蛇	7411
+岙	7378
+哪	7377
+凹	7321
+偶	7302
+邸	7289
+埃	7283
+韧	7279
+漕	7246
+渊	7238
+驳	7233
+瑾	7188
+烫	7155
+胱	7115
+昶	7086
+瞿	7082
+蔺	7079
+胰	7075
+珂	7066
+慰	7054
+逊	7053
+庚	7049
+癌	7044
+迫	7039
+勺	6996
+咏	6991
+锗	6989
+鄢	6979
+枯	6964
+么	6963
+糕	6932
+氰	6927
+谯	6902
+忧	6825
+酮	6790
+榜	6782
+摊	6764
+奈	6754
+饼	6751
+仰	6742
+琅	6709
+邛	6706
+赶	6677
+酉	6676
+廓	6676
+篦	6659
+陡	6656
+筐	6649
+檬	6639
+萄	6636
+瀛	6636
+膀	6614
+殿	6606
+玫	6593
+啤	6582
+汞	6577
+秭	6574
+荥	6566
+毓	6557
+焰	6555
+彰	6548
+撒	6544
+垢	6543
+钊	6533
+坻	6533
+娱	6526
+蓟	6517
+匿	6497
+秉	6493
+姣	6450
+吞	6438
+劝	6416
+悔	6412
+焉	6400
+爬	6383
+炫	6373
+佘	6371
+蕊	6369
+榨	6357
+渑	6345
+颂	6342
+卞	6333
+姿	6332
+句	6329
+濠	6328
+裸	6309
+沚	6276
+皿	6247
+涨	6246
+鄱	6244
+嫩	6242
+靳	6237
+峒	6219
+鲲	6214
+裹	6212
+芽	6204
+褚	6192
+涯	6185
+耆	6181
+碘	6163
+欺	6153
+茨	6148
+拣	6144
+杞	6142
+锰	6134
+祠	6116
+滞	6107
+骄	6077
+腻	6060
+瑛	6059
+婚	6048
+镁	5989
+霜	5976
+薪	5955
+浜	5951
+芮	5945
+塬	5943
+畲	5937
+钼	5924
+盱	5887
+贻	5881
+罘	5876
+戚	5874
+晒	5858
+弗	5851
+玥	5777
+蕲	5772
+缪	5756
+匡	5751
+葵	5747
+颌	5714
+菇	5694
+酰	5680
+淅	5671
+慕	5655
+眙	5635
+璇	5620
+栈	5619
+拿	5605
+娅	5604
+撕	5594
+铵	5588
+儋	5570
+懿	5557
+抬	5495
+缔	5474
+棣	5464
+衰	5463
+朴	5459
+虽	5457
+畈	5455
+镊	5427
+剔	5427
+酱	5417
+婉	5417
+酚	5406
+崃	5398
+努	5381
+晔	5367
+刃	5357
+凿	5348
+斐	5337
+膝	5316
+烃	5313
+藁	5309
+碟	5299
+狗	5297
+抖	5295
+腈	5289
+骁	5272
+漠	5269
+矮	5267
+瞳	5266
+魁	5258
+铰	5254
+腕	5223
+镶	5223
+檐	5212
+炔	5208
+姬	5205
+垌	5198
+髓	5193
+笺	5182
+鞘	5157
+卤	5141
+晗	5132
+偃	5132
+哥	5125
+歙	5118
+帜	5117
+炸	5100
+樵	5095
+挑	5094
+瓣	5091
+篓	5090
+簿	5088
+曳	5087
+郯	5084
+邳	5079
+爵	5076
+琨	5075
+晃	5068
+槎	5063
+垄	5056
+霁	5054
+垭	5040
+臧	5006
+缙	4982
+匝	4981
+灞	4980
+卵	4974
+鸠	4961
+灏	4947
+撰	4932
+昀	4921
+朵	4913
+珺	4912
+厉	4901
+枞	4899
+瑚	4895
+碾	4890
+撮	4886
+娃	4882
+邕	4881
+榭	4873
+筷	4863
+肪	4862
+炒	4853
+咖	4841
+屑	4834
+钜	4831
+俱	4828
+铠	4821
+崩	4819
+荻	4812
+矸	4800
+樘	4798
+嵘	4797
+屠	4792
+矶	4786
+稽	4777
+漾	4770
+垚	4767
+蓓	4752
+兔	4744
+魔	4729
+埭	4719
+橱	4710
+姗	4709
+拘	4708
+钬	4686
+弦	4656
+汁	4656
+竟	4647
+蒜	4640
+醚	4608
+轶	4595
+瑰	4582
+婕	4568
+煎	4564
+葱	4548
+崆	4543
+铆	4531
+侠	4520
+迭	4516
+朐	4510
+钞	4509
+豹	4508
+浊	4487
+衫	4484
+濂	4482
+汴	4472
+雇	4458
+扑	4447
+跌	4431
+戳	4422
+坯	4404
+伺	4400
+歇	4394
+熠	4394
+胥	4390
+肋	4357
+舌	4356
+疃	4351
+箔	4351
+狼	4350
+蠡	4348
+碣	4328
+蒂	4320
+仆	4306
+薯	4299
+寇	4288
+谌	4286
+鹃	4282
+邬	4279
+啡	4270
+眩	4269
+酿	4266
+恐	4262
+盂	4260
+猴	4255
+掇	4254
+悟	4250
+锹	4248
+裱	4233
+虾	4230
+隽	4228
+丸	4219
+醋	4216
+峄	4206
+泺	4204
+犬	4203
+飘	4202
+爪	4202
+嗽	4200
+畸	4190
+宙	4172
+萱	4168
+邡	4159
+啸	4158
+钓	4127
+俐	4115
+歪	4092
+昔	4091
+棍	4085
+膳	4082
+惯	4068
+碶	4049
+疼	4047
+瓮	4036
+逢	4021
+祜	4001
+溜	4000
+拭	3990
+椿	3988
+幻	3971
+褥	3969
+堃	3961
+郏	3960
+毡	3948
+峥	3945
+孤	3938
+黏	3922
+贩	3918
+镐	3915
+捞	3915
+肛	3871
+钒	3868
+尕	3858
+妆	3846
+瞬	3846
+钣	3845
+狂	3842
+倡	3827
+吻	3813
+罡	3808
+笋	3795
+盔	3779
+笤	3772
+撬	3768
+勉	3743
+榴	3716
+氦	3699
+仇	3679
+鸽	3659
+娣	3659
+佟	3656
+咪	3626
+筠	3623
+棘	3607
+铄	3598
+蝇	3597
+坨	3590
+塍	3587
+戎	3584
+绛	3579
+咬	3562
+煮	3560
+垅	3535
+埕	3530
+桨	3526
+佬	3524
+杖	3523
+椰	3510
+瘦	3510
+溅	3509
+隋	3508
+磴	3498
+霆	3485
+稍	3484
+俭	3481
+姻	3478
+铖	3469
+梵	3465
+砾	3456
+曜	3440
+燊	3434
+佤	3432
+柑	3429
+阙	3428
+赐	3425
+俄	3417
+陉	3408
+馏	3407
+宴	3404
+婵	3403
+睦	3400
+徕	3398
+僳	3397
+娴	3394
+欲	3392
+傈	3390
+疸	3386
+砀	3383
+闯	3382
+毂	3379
+祎	3376
+偷	3360
+蚕	3359
+娘	3348
+苇	3342
+赟	3341
+汐	3338
+椭	3335
+铎	3316
+佣	3313
+铀	3301
+夯	3289
+璞	3279
+兜	3273
+宰	3269
+淦	3268
+琰	3266
+皱	3263
+蹈	3260
+绸	3258
+晾	3258
+猗	3246
+翊	3240
+浒	3229
+镉	3226
+龟	3226
+阈	3218
+疲	3216
+靓	3212
+祯	3209
+嘱	3201
+鲸	3184
+蹄	3182
+苟	3175
+磺	3173
+髋	3156
+胤	3143
+溴	3133
+粟	3132
+徒	3130
+姝	3120
+藻	3113
+烦	3113
+吃	3109
+梭	3109
+筱	3094
+飚	3091
+挠	3087
+耶	3080
+橘	3076
+箐	3073
+恋	3072
+柿	3070
+於	3069
+吗	3064
+崎	3063
+骥	3061
+硼	3054
+奚	3052
+胚	3050
+珏	3036
+钴	3029
+铮	3028
+凑	3026
+蜗	3018
+斡	3017
+矢	3005
+郓	2998
+埂	2994
+盎	2973
+戊	2972
+搁	2961
+蔓	2955
+鞠	2955
+霏	2949
+坭	2948
+拳	2947
+坠	2925
+踞	2920
+藕	2917
+珀	2915
+桁	2912
+滔	2911
+鸦	2906
+疮	2893
+碁	2887
+掺	2884
+曌	2878
+蹲	2870
+扒	2858
+蝴	2849
+趟	2848
+篱	2846
+苦	2844
+锉	2836
+墟	2825
+烹	2824
+茉	2819
+澎	2818
+窖	2814
+宕	2813
+卯	2813
+赴	2800
+蒗	2797
+旨	2793
+翘	2790
+辙	2790
+稷	2785
+沸	2782
+娩	2780
+竭	2773
+岘	2771
+锣	2766
+埇	2759
+踢	2755
+缤	2745
+喊	2738
+褪	2722
+垸	2716
+甚	2710
+踝	2708
+锟	2701
+岫	2697
+粱	2690
+旷	2679
+渐	2675
+囗	2674
+谁	2672
+唇	2671
+汊	2662
+琊	2661
+灼	2659
+壕	2652
+忱	2652
+耘	2651
+陌	2646
+迳	2638
+楔	2636
+蟑	2633
+柚	2625
+旻	2624
+鳄	2618
+泮	2614
+翌	2614
+钤	2612
+契	2601
+恭	2598
+冕	2587
+烂	2582
+翎	2578
+犹	2577
+琥	2568
+坟	2567
+絮	2563
+捐	2538
+坍	2532
+驹	2522
+狄	2516
+伶	2511
+丞	2508
+捣	2498
+愈	2494
+骼	2489
+砷	2488
+鄠	2487
+骞	2486
+珙	2484
+蔗	2478
+噶	2476
+帖	2476
+狭	2471
+锴	2471
+橄	2463
+竿	2461
+羡	2451
+竺	2449
+吋	2445
+郢	2445
+瞻	2433
+砸	2432
+燎	2431
+赏	2429
+侃	2424
+蓥	2419
+槟	2418
+耙	2418
+啄	2414
+翀	2413
+仫	2409
+父	2404
+瓴	2400
+厌	2396
+媚	2375
+亘	2373
+莓	2371
+妈	2367
+粥	2361
+暑	2359
+莺	2357
+艘	2354
+淆	2352
+桢	2350
+砍	2344
+幽	2343
+骋	2341
+斋	2338
+釜	2328
+俯	2325
+漱	2323
+熄	2323
+锑	2309
+枋	2307
+濞	2307
+犍	2305
+熹	2304
+峁	2302
+甩	2302
+浯	2296
+犀	2288
+踊	2285
+薰	2285
+鲅	2283
+颇	2279
+搪	2268
+锷	2262
+氙	2260
+婆	2259
+卒	2259
+缅	2258
+唤	2255
+逃	2254
+焙	2250
+敕	2248
+鸥	2245
+栩	2245
+瘟	2240
+澡	2239
+砟	2222
+翅	2218
+惟	2214
+啦	2214
+瘫	2212
+摔	2189
+袜	2184
+梗	2183
+唑	2182
+峙	2179
+讷	2170
+铨	2167
+阆	2165
+炊	2163
+沤	2161
+碌	2159
+钎	2157
+燚	2152
+糯	2146
+锭	2143
+钝	2138
+驷	2134
+邝	2134
+拧	2130
+陟	2127
+铧	2122
+脆	2121
+稠	2119
+恤	2118
+炯	2118
+肘	2102
+妻	2102
+濛	2090
+镭	2089
+倚	2084
+惕	2080
+淝	2079
+捉	2076
+辕	2068
+诬	2060
+贪	2057
+狐	2053
+寝	2050
+浉	2046
+蛛	2043
+崧	2042
+囱	2037
+螂	2037
+庸	2035
+煊	2035
+肽	2033
+祉	2031
+迦	2027
+懋	2026
+晕	2026
+洺	2025
+赈	2021
+垟	2015
+骐	2011
+箬	2010
+饪	2007
+蓼	2005
+挛	2001
+夕	1993
+孩	1990
+珩	1980
+裘	1980
+衙	1978
+悠	1966
+闹	1965
+袍	1960
+滢	1955
+礁	1953
+渎	1949
+镂	1947
+琉	1945
+鸾	1941
+脐	1940
+鄯	1933
+痉	1929
+弈	1929
+澍	1928
+鸯	1927
+秣	1926
+黟	1926
+潺	1919
+兢	1918
+忙	1915
+喂	1914
+弊	1912
+韭	1901
+沼	1891
+绷	1887
+劵	1883
+浣	1878
+巽	1877
+蠕	1874
+骎	1871
+淠	1870
+掏	1869
+掩	1867
+锆	1865
+猇	1864
+芋	1858
+俏	1848
+吡	1844
+牦	1838
+垱	1836
+萤	1836
+侬	1831
+虔	1827
+煦	1823
+滏	1822
+郜	1821
+阡	1813
+孢	1811
+敲	1803
+逄	1801
+銮	1796
+芃	1796
+聋	1795
+岢	1791
+烜	1789
+魅	1789
+淹	1784
+梢	1776
+祈	1772
+逗	1772
+臆	1769
+拽	1765
+吟	1759
+猎	1758
+遏	1756
+漓	1755
+鄄	1755
+挪	1750
+琶	1744
+鳞	1739
+胭	1737
+驭	1736
+丫	1734
+茫	1733
+砧	1731
+扈	1731
+鹊	1728
+搓	1728
+辜	1728
+浐	1727
+蚂	1720
+榔	1719
+圪	1707
+芭	1703
+犇	1702
+歆	1694
+蝉	1689
+窨	1687
+奏	1684
+泪	1676
+稔	1676
+谟	1675
+愉	1673
+舵	1670
+硐	1667
+蒿	1666
+郦	1666
+糙	1662
+踩	1646
+嶷	1636
+逼	1631
+羿	1628
+蜘	1626
+胖	1623
+胪	1614
+崴	1611
+壬	1603
+彼	1603
+牲	1600
+肚	1596
+珈	1596
+叔	1596
+珉	1588
+癿	1586
+郾	1585
+茎	1583
+枧	1580
+琚	1580
+疤	1572
+洹	1569
+绮	1562
+弛	1559
+纫	1557
+懒	1536
+圭	1533
+呆	1525
+苴	1520
+埗	1518
+骜	1515
+秧	1507
+敞	1506
+隘	1506
+匣	1505
+羟	1497
+漩	1496
+榫	1496
+绶	1492
+柬	1492
+纂	1488
+乎	1488
+疹	1487
+仝	1484
+侣	1481
+宠	1476
+辞	1474
+吓	1473
+恬	1468
+忌	1466
+旸	1464
+尸	1462
+膛	1458
+芊	1458
+毽	1451
+柞	1447
+冼	1444
+蟹	1444
+槛	1440
+喧	1434
+渲	1427
+翱	1421
+泖	1414
+斧	1412
+赭	1411
+妨	1407
+胫	1407
+苔	1407
+塅	1406
+璋	1398
+谤	1394
+诽	1394
+釉	1392
+睛	1387
+耸	1378
+漪	1376
+钡	1375
+榈	1374
+穹	1367
+羚	1360
+哗	1359
+瞩	1354
+骊	1354
+寥	1349
+邾	1349
+沔	1347
+逍	1346
+祚	1342
+龈	1342
+笃	1338
+佃	1336
+垠	1336
+昵	1332
+豚	1327
+盯	1324
+査	1315
+敌	1315
+瑙	1313
+鬃	1312
+窒	1311
+沌	1303
+桉	1302
+埚	1298
+垡	1295
+町	1294
+桷	1292
+颢	1290
+臀	1288
+崮	1285
+佗	1285
+毗	1284
+泼	1278
+篆	1278
+舫	1278
+蕙	1274
+绅	1271
+宵	1270
+馥	1267
+懂	1263
+惜	1259
+搞	1259
+坩	1251
+阚	1246
+洣	1243
+妊	1241
+璨	1241
+谛	1239
+钲	1236
+畚	1235
+锄	1235
+丕	1234
+腋	1232
+葭	1232
+昙	1230
+晁	1228
+苷	1227
+鹄	1224
+妤	1221
+黛	1217
+瀍	1216
+砻	1214
+饵	1214
+捡	1211
+堑	1206
+笙	1205
+躺	1205
+缎	1203
+扉	1203
+蚝	1201
+轲	1199
+茸	1199
+窟	1198
+笠	1198
+趸	1196
+浍	1189
+烙	1186
+蹬	1185
+氡	1182
+钵	1181
+丨	1177
+峤	1177
+敢	1176
+焜	1175
+鬼	1174
+砦	1171
+嵛	1169
+涓	1166
+垓	1164
+洵	1163
+洸	1162
+湫	1159
+闰	1158
+酃	1157
+篁	1157
+臼	1156
+瀑	1152
+帛	1151
+埝	1150
+嗜	1148
+挚	1144
+呢	1143
+芍	1143
+滂	1142
+戬	1139
+膈	1133
+苓	1130
+鸳	1127
+哇	1126
+荃	1125
+雒	1123
+拯	1120
+霓	1119
+隰	1118
+缨	1109
+蘑	1108
+汲	1101
+葆	1101
+夺	1098
+奢	1098
+芥	1098
+亓	1096
+愚	1090
+蛀	1089
+缉	1088
+褐	1088
+亢	1087
+脲	1084
+菩	1083
+俬	1083
+榉	1083
+褂	1082
+蛾	1081
+斛	1080
+啶	1079
+筏	1077
+嗣	1075
+瘘	1070
+筜	1066
+隍	1065
+筼	1061
+暮	1057
+曰	1050
+飒	1048
+瞭	1048
+淬	1043
+茭	1042
+豉	1042
+怎	1041
+涅	1039
+摹	1039
+掸	1037
+冢	1036
+湃	1034
+苫	1032
+镧	1030
+劼	1030
+嵇	1029
+栎	1028
+叩	1027
+俤	1025
+躯	1023
+疝	1020
+崛	1020
+枸	1017
+羲	1017
+蛙	1011
+囚	1009
+菠	1009
+拇	1007
+琵	1006
+舸	1004
+聿	1004
+镔	1003
+擂	1003
+橇	1000
+塱	999
+觅	997
+孪	996
+泻	995
+惰	993
+诋	993
+宦	992
+枹	992
+艮	990
+粑	989
+檩	989
+靛	988
+闷	988
+猕	985
+脓	980
+颉	980
+稼	980
+荀	973
+腱	972
+庾	971
+戛	970
+鋆	969
+丶	968
+苞	967
+茆	963
+珅	961
+颛	959
+闾	957
+帷	957
+瓢	956
+娠	953
+阑	950
+嗨	947
+莴	943
+亥	942
+楹	938
+嫦	937
+螨	936
+牯	934
+苕	932
+筇	931
+铿	930
+蛮	930
+弼	929
+镗	929
+樽	928
+啉	928
+涣	928
+脖	924
+歉	924
+酐	917
+呷	916
+钗	916
+缇	915
+廿	913
+砝	912
+爷	910
+诵	908
+窃	908
+钽	906
+桡	904
+泐	904
+玑	903
+濑	902
+驮	899
+脾	898
+雉	898
+堪	897
+瞰	894
+莽	893
+莼	893
+熨	890
+涔	888
+斓	887
+慷	885
+嫣	884
+喝	883
+鹗	880
+仡	880
+跆	880
+琢	879
+炀	876
+氐	876
+垴	875
+菡	873
+瑟	873
+剁	871
+炽	871
+沨	866
+雲	862
+赘	861
+琐	860
+荤	860
+肱	859
+葳	859
+奠	858
+凇	848
+沩	848
+虢	848
+烛	846
+濒	846
+祭	845
+逯	844
+淌	843
+馒	842
+傍	842
+卦	836
+佶	835
+蔷	833
+澈	833
+鲨	833
+洑	832
+暄	829
+叮	827
+祛	825
+槿	825
+铱	825
+桠	820
+籼	819
+朕	819
+趵	816
+咱	814
+俪	813
+呋	813
+鲢	812
+跷	811
+骖	810
+迤	808
+樑	808
+唾	807
+姥	806
+藩	803
+滹	802
+邰	801
+笆	801
+漷	800
+偲	800
+砺	800
+聯	799
+泞	796
+矾	794
+筝	793
+溃	793
+濯	790
+咕	790
+鞭	789
+阱	789
+內	789
+畋	786
+巅	784
+啟	784
+乍	783
+憩	783
+鮀	783
+巿	783
+僵	779
+畏	778
+湍	777
+唛	777
+泠	777
+饺	775
+潦	774
+惊	772
+徂	771
+癀	769
+磬	766
+劈	766
+铍	762
+呵	762
+朦	762
+褶	759
+瑄	759
+瞄	757
+奂	757
+噻	756
+绰	756
+愁	755
+畹	751
+胨	750
+淏	749
+睑	747
+贇	747
+捧	745
+鲇	741
+嶂	741
+陬	738
+笪	738
+挽	736
+矗	734
+嫔	732
+腥	731
+孰	727
+抠	726
+霾	722
+挟	722
+羧	720
+枇	718
+崤	714
+侍	714
+蟾	713
+潆	711
+膦	709
+酪	708
+谣	707
+庶	705
+骚	705
+俸	702
+扯	701
+扼	700
+荪	700
+簇	699
+呐	693
+啊	692
+嗪	692
+恪	691
+剡	691
+倘	687
+稚	686
+溺	685
+杷	683
+铛	683
+骇	682
+澹	680
+琏	679
+镰	678
+喃	672
+昝	671
+聆	670
+雌	669
+嫁	668
+滆	667
+揉	667
+痪	666
+琤	665
+誓	663
+锝	662
+垮	661
+墒	661
+扔	660
+糜	659
+菖	659
+宬	657
+洙	655
+跤	653
+鸬	652
+雹	652
+锨	651
+绚	649
+憬	648
+骉	645
+斩	639
+薮	635
+僧	635
+湧	633
+枭	632
+棺	629
+粹	629
+颚	628
+衅	626
+箅	625
+吲	624
+俩	623
+佼	622
+堌	621
+谏	619
+谎	619
+炕	619
+峃	618
+號	617
+苛	617
+髁	617
+圻	617
+怠	614
+萘	614
+墘	611
+潋	610
+痫	608
+崀	606
+茈	605
+骶	604
+沦	604
+淯	601
+皎	600
+澥	600
+鹦	599
+徳	598
+哚	598
+刍	597
+琮	597
+稞	595
+孺	595
+沮	595
+狸	593
+凼	593
+焓	592
+隗	589
+穷	587
+兮	587
+髂	585
+馕	583
+钺	582
+阊	582
+溇	581
+亟	581
+溱	578
+澴	577
+癣	577
+茁	576
+痒	575
+谓	575
+嵬	574
+拂	574
+裔	572
+嘛	571
+栢	570
+譬	570
+夼	567
+腌	566
+菉	564
+舷	564
+荞	564
+喹	563
+炖	563
+敛	562
+溥	561
+頔	560
+甪	560
+菅	556
+爸	555
+鳙	554
+苜	553
+铼	553
+酥	553
+碛	551
+痘	551
+擀	551
+砜	551
+邪	550
+夔	549
+眷	549
+楣	547
+芨	547
+箫	546
+憨	545
+岜	545
+咯	544
+嗅	542
+诿	542
+癫	541
+桅	539
+渫	538
+眸	537
+嬴	537
+沄	536
+彧	536
+蹉	535
+诞	535
+钿	534
+恳	532
+疱	532
+忍	531
+旖	527
+捻	526
+拴	526
+璠	525
+嵋	525
+壆	524
+厍	523
+涠	523
+凫	523
+锶	522
+镱	522
+趾	521
+镒	520
+螳	519
+镖	519
+勰	518
+颀	516
+笏	515
+碴	515
+滠	513
+乞	513
+鸢	512
+芩	512
+腩	511
+馀	511
+绎	511
+徘	510
+钕	509
+钏	506
+怕	506
+朽	504
+娉	504
+拢	503
+奴	500
+奓	500
+蓿	499
+镓	499
+藉	498
+徊	498
+崟	497
+酩	497
+蘭	497
+闳	497
+垵	494
+晞	493
+札	493
+檫	492
+哄	492
+茬	491
+盥	491
+漉	491
+贲	491
+豸	490
+硖	489
+雏	489
+糠	489
+窜	488
+峦	488
+熵	487
+哺	487
+嗓	487
+瑀	487
+苒	487
+鼾	486
+帼	485
+堽	484
+萎	484
+焘	484
+襟	482
+磕	482
+羔	481
+豁	481
+呕	481
+窠	480
+虬	479
+纾	478
+顽	478
+薏	478
+榛	478
+袭	476
+氖	476
+苄	475
+疙	474
+鹉	474
+邴	473
+怖	473
+贠	472
+旎	471
+戌	471
+翥	470
+鳅	468
+拎	468
+蚬	468
+囤	468
+陋	467
+镕	466
+粵	466
+葑	464
+藜	463
+羁	463
+蹇	462
+箩	461
+鳝	460
+劭	460
+挝	459
+崭	458
+掷	457
+喘	456
+瘩	454
+拙	453
+煅	453
+肼	452
+昼	451
+辋	451
+颊	450
+砲	449
+粕	449
+颞	448
+驴	446
+睾	446
+璀	446
+髙	446
+滥	445
+迩	445
+倬	445
+堎	444
+涑	443
+镛	440
+褒	440
+笨	439
+邨	438
+砬	438
+诣	435
+铯	433
+訾	431
+滟	431
+岀	429
+暾	429
+鲈	429
+蛳	429
+撇	429
+珮	425
+蔻	425
+笕	425
+礐	424
+幺	424
+铟	422
+鹚	422
+砥	422
+蜻	421
+菘	421
+昉	419
+橼	418
+荚	418
+蓖	417
+堇	415
+粽	415
+郗	415
+蛤	412
+棪	411
+庹	410
+丑	410
+铉	410
+茧	410
+麋	409
+硇	408
+毋	408
+颠	407
+赌	407
+雩	406
+晧	405
+鹍	405
+蟆	404
+菀	404
+殴	403
+汭	402
+剃	401
+驯	401
+峯	401
+铌	401
+嫱	399
+哔	398
+绊	398
+逵	397
+铐	397
+搐	397
+罍	396
+盅	395
+熬	395
+炘	395
+袂	393
+蹦	393
+莪	393
+仵	392
+龛	392
+楂	391
+扮	390
+蟒	390
+氘	390
+鎏	389
+稜	388
+韫	387
+槌	386
+篢	386
+郇	386
+瑢	382
+啮	382
+瀼	382
+辟	381
+噁	381
+徇	380
+孛	380
+掀	379
+瑭	379
+糟	378
+濡	377
+舂	377
+棟	377
+镫	376
+痔	375
+叽	373
+怿	373
+矣	373
+漖	373
+惺	372
+痤	372
+绽	371
+裝	371
+氿	370
+坌	370
+甽	370
+悍	369
+摒	369
+豌	368
+绢	368
+聃	367
+學	367
+鄣	366
+猷	366
+粳	365
+砣	363
+夸	363
+藿	361
+祐	361
+嫂	360
+戍	360
+蜱	360
+侏	360
+碓	359
+卑	358
+犊	358
+岽	356
+茚	356
+癸	355
+硷	354
+镟	353
+埌	353
+栀	352
+電	351
+嫚	350
+庠	350
+烺	350
+飙	349
+珣	349
+悲	348
+傢	348
+蒽	347
+樨	347
+陲	346
+嘧	346
+疽	346
+桧	344
+郅	342
+吿	341
+魂	340
+钇	340
+渱	340
+憾	339
+鳍	339
+黍	338
+仗	338
+肴	337
+镲	336
+忞	335
+诰	334
+锲	333
+涩	333
+喱	333
+袄	332
+邈	329
+椹	328
+眺	328
+橦	328
+怪	327
+磙	326
+泃	325
+銶	324
+洧	323
+蕨	322
+價	321
+郄	321
+鲫	321
+厥	320
+遐	320
+跋	320
+舀	320
+嬉	319
+挨	318
+轸	318
+酞	317
+琯	317
+宥	317
+昏	315
+浄	315
+洄	314
+汫	314
+堠	314
+腮	313
+艰	312
+窊	312
+诘	312
+钫	311
+涢	309
+禀	309
+戟	309
+挎	309
+捍	307
+疡	307
+淙	307
+蚣	307
+哮	307
+铥	307
+苋	306
+麗	305
+遒	305
+蓁	304
+紊	303
+呱	302
+焯	299
+鹞	299
+钯	299
+囡	298
+骡	298
+铋	297
+卅	297
+埒	296
+徵	296
+嵝	295
+嘟	295
+睫	295
+爻	294
+捺	294
+骝	294
+骈	293
+螯	292
+赓	292
+锃	292
+恼	292
+瘢	291
+嫘	291
+裳	291
+岣	291
+缚	291
+轰	290
+嫒	289
+蜓	289
+磜	289
+籁	288
+哌	288
+芘	288
+蕰	288
+寐	287
+葩	287
+扦	285
+財	285
+鲘	283
+蝗	283
+玎	283
+钶	282
+蔼	282
+坷	282
+洎	281
+啫	281
+茯	280
+粼	280
+贱	279
+楮	277
+煨	277
+僚	277
+渼	277
+荄	276
+窿	276
+馅	274
+東	273
+栟	273
+飓	273
+痧	273
+虒	271
+渥	271
+遨	271
+抒	270
+劢	269
+椤	269
+炅	269
+汈	268
+畛	266
+隼	266
+娆	266
+羹	265
+涕	265
+姊	265
+蒌	265
+槭	264
+璘	264
+機	264
+腓	264
+脯	264
+驩	263
+匮	263
+妞	263
+岈	262
+榻	262
+灈	261
+栌	260
+惑	260
+虓	259
+妖	258
+螟	258
+浛	258
+簕	258
+牤	257
+鹫	257
+鱿	257
+砭	257
+凋	256
+珐	255
+锘	255
+诒	255
+洈	254
+牺	254
+谍	254
+飏	254
+楸	254
+龋	253
+浬	252
+疣	251
+磻	251
+祟	251
+柅	251
+偌	250
+堯	249
+桀	249
+夭	248
+玠	248
+噢	247
+柽	246
+馗	246
+宓	245
+嵖	245
+浃	245
+請	244
+規	244
+钹	243
+幔	243
+増	242
+驸	242
+郚	241
+莅	241
+谆	241
+萬	241
+謇	241
+蔄	240
+茴	240
+翮	239
+渴	238
+崾	238
+铑	237
+剜	237
+阖	236
+焗	236
+罔	235
+塄	235
+疟	235
+叹	234
+铤	234
+報	233
+億	232
+蚤	232
+竑	231
+琎	231
+揿	230
+孱	230
+龍	230
+轭	230
+瑗	230
+琬	230
+廠	230
+谕	229
+酊	228
+佚	227
+梆	227
+逛	227
+暧	227
+塝	226
+耻	226
+湔	226
+昫	226
+镝	225
+顼	225
+劫	225
+鹂	224
+獐	224
+嫄	224
+陨	223
+蒯	223
+绗	223
+揣	223
+甦	223
+蕃	222
+蘸	222
+挫	222
+俎	221
+蹊	220
+螭	220
+牍	220
+葺	219
+虏	219
+廻	219
+榧	219
+廍	218
+瓒	218
+荏	218
+翕	217
+醪	217
+硌	217
+骢	217
+霈	217
+骧	217
+弶	216
+坔	216
+俶	216
+場	216
+哒	215
+扪	214
+鲷	213
+墁	213
+碉	213
+炙	213
+桕	213
+黉	213
+堀	212
+沺	212
+珥	211
+簪	211
+爨	211
+噜	211
+巳	211
+芪	211
+湉	210
+萼	210
+蜊	210
+塆	210
+獭	209
+澔	207
+锵	207
+榀	207
+梽	207
+弢	206
+圬	206
+痱	206
+迄	205
+厄	205
+坵	205
+髻	204
+蚜	204
+绀	203
+叄	202
+峭	202
+錾	202
+椑	202
+妩	201
+萁	201
+腭	200
+椽	200
+咚	200
+啬	200
+瑁	199
+垲	199
+胍	199
+胛	199
+袢	198
+璎	197
+孳	197
+蜈	197
+泔	196
+筎	196
+坼	196
+痼	195
+譞	195
+寡	194
+佲	194
+悖	194
+撷	193
+滍	193
+肟	193
+髌	191
+剅	191
+诠	191
+痣	191
+惹	191
+瞎	190
+湓	189
+岕	189
+聖	189
+杵	189
+珪	189
+輋	188
+崞	188
+苌	188
+祀	188
+芫	188
+泱	188
+義	188
+枡	187
+瘴	187
+迴	187
+铕	187
+乖	186
+湴	186
+捶	186
+篙	186
+忪	185
+骂	185
+躲	185
+倞	185
+屺	185
+垤	184
+惧	184
+邙	184
+冥	184
+俚	184
+氚	183
+鄚	183
+赊	183
+杓	183
+瓿	183
+囯	182
+麂	182
+躁	181
+镨	181
+搂	180
+躬	180
+仉	180
+質	180
+铊	179
+埫	178
+祸	177
+芾	177
+玢	177
+娑	177
+泯	176
+辫	176
+秃	176
+汌	175
+辔	175
+痹	175
+镦	175
+崯	175
+昨	175
+氾	174
+晩	174
+悼	174
+玟	174
+琍	174
+鲟	174
+旴	173
+吖	173
+烝	173
+箴	172
+烔	172
+岿	172
+笊	172
+掠	171
+垈	171
+竤	171
+炑	171
+讴	171
+蛔	170
+酋	170
+備	170
+佺	170
+恂	169
+呜	169
+琙	169
+邃	169
+僻	168
+漋	168
+殳	168
+虱	168
+禤	167
+項	167
+庇	167
+蓤	167
+棹	167
+測	167
+泫	167
+彗	166
+曈	166
+鄌	166
+珹	165
+舲	165
+昪	165
+鹑	165
+蜚	165
+裆	164
+矽	164
+咔	163
+屲	163
+嚼	163
+眭	163
+標	162
+瑷	162
+嵯	162
+焌	162
+箦	162
+佧	162
+鹧	162
+秽	161
+鳊	161
+潴	161
+汩	161
+粲	160
+灜	160
+龑	160
+桲	160
+铒	159
+碲	159
+歺	158
+墉	158
+呗	157
+現	157
+哩	157
+懈	157
+埜	157
+澉	156
+鹌	156
+眶	156
+臺	156
+铳	155
+垧	155
+尓	155
+廛	155
+鼐	155
+筻	155
+呙	154
+溦	154
+罢	154
+浭	154
+阪	154
+單	153
+倭	153
+貂	153
+疯	152
+辘	152
+祊	152
+她	151
+枳	151
+舾	151
+蜥	151
+竜	151
+時	150
+鸪	150
+玳	150
+筲	149
+歹	149
+碇	149
+撼	149
+嘡	149
+胧	148
+莳	148
+雳	148
+蒹	148
+恽	148
+峣	148
+珽	147
+凛	147
+杲	147
+壑	147
+吩	147
+凃	146
+動	146
+萸	146
+鲊	146
+娓	146
+绯	146
+傻	146
+汜	146
+萩	146
+麝	145
+镪	145
+憧	145
+迂	145
+塭	145
+岂	145
+戢	145
+趁	144
+莊	144
+浧	144
+缷	143
+壓	143
+赑	143
+進	143
+噬	143
+勍	143
+吼	142
+鳃	142
+蜍	142
+哦	142
+椴	142
+為	142
+鹮	141
+璴	141
+燮	141
+鳗	141
+呤	140
+苡	140
+徙	140
+荭	140
+缑	140
+涮	139
+發	138
+谧	138
+僰	138
+毳	138
+郪	138
+憎	138
+潓	137
+塾	137
+玹	137
+屛	137
+锬	137
+铡	136
+舣	136
+镣	136
+吁	136
+辈	136
+崚	136
+缗	136
+羞	136
+荘	136
+瘾	135
+堍	135
+囿	135
+脒	135
+呀	135
+嬿	135
+漈	135
+焖	135
+褔	134
+甾	134
+嶝	134
+苎	134
+楝	134
+皤	134
+哭	133
+隈	133
+娈	133
+镏	133
+貳	133
+俣	133
+麸	133
+琇	133
+崄	132
+仃	132
+粦	132
+湲	132
+吵	132
+垾	132
+馍	131
+吝	131
+藓	131
+冚	131
+杈	131
+雎	131
+镙	131
+镌	131
+喵	131
+幂	130
+頻	130
+爹	130
+娶	130
+镯	130
+蛉	130
+趴	130
+鲶	130
+倮	129
+蚯	129
+蝎	129
+颡	129
+榷	129
+缦	129
+撂	129
+痴	128
+斫	128
+谜	128
+诃	127
+酗	127
+捅	127
+贬	127
+統	127
+錱	126
+缥	126
+诫	126
+蚓	126
+啰	126
+楦	126
+強	125
+沓	125
+鲵	125
+辗	125
+铈	125
+潔	125
+岖	125
+铷	125
+稂	125
+鳖	124
+惢	124
+哆	124
+蒺	123
+吏	123
+澛	123
+鮓	123
+腘	123
+瞪	122
+辱	122
+傩	122
+擒	122
+绫	122
+倴	122
+硃	122
+轱	122
+嘶	121
+蛎	121
+赳	121
+孖	121
+毎	121
+椐	121
+鹁	121
+兀	120
+擘	120
+扛	120
+數	120
+維	120
+橫	119
+桄	119
+鋼	119
+姮	119
+復	119
+鑑	119
+櫈	118
+琟	118
+翩	118
+鲆	118
+豇	118
+凎	117
+膊	117
+髯	117
+軸	117
+悯	117
+歩	116
+仨	116
+煋	116
+甯	116
+溁	116
+哉	116
+坮	116
+嘈	115
+鲖	115
+稱	115
+坣	115
+沘	115
+甑	114
+痂	113
+艉	113
+娲	113
+赜	113
+頭	113
+癜	113
+偕	112
+弁	112
+胳	111
+谞	111
+翚	111
+恵	111
+鲹	111
+冮	111
+圐	110
+資	110
+嵴	110
+谄	110
+屡	110
+帏	109
+赪	109
+垩	109
+桫	109
+弩	109
+奘	109
+倜	108
+猝	108
+巉	108
+谬	108
+圙	108
+彐	108
+鸰	107
+眨	107
+墚	107
+俨	107
+褀	107
+跪	107
+袤	107
+楒	107
+蜒	107
+浞	106
+匯	106
+睐	106
+酂	106
+噗	106
+茱	106
+嶺	106
+蚶	106
+繆	106
+郐	106
+腑	106
+剌	105
+骦	105
+帶	105
+浤	105
+屎	105
+钭	105
+黃	105
+坜	105
+幄	104
+弸	104
+匈	104
+僮	104
+環	103
+逹	103
+垯	103
+鈺	103
+拈	102
+虛	102
+蜿	102
+膘	101
+漹	101
+饿	101
+痢	101
+蜇	101
+晙	101
+乜	101
+郞	101
+鹳	101
+浡	101
+幛	101
+螃	100
+屾	100
+涎	100
+匆	100
+無	99
+峧	99
+咛	99
+別	99
+蛹	99
+荼	99
+蚨	99
+洇	99
+湜	99
+務	99
+礤	98
+瑆	98
+挞	98
+線	98
+瑅	98
+劦	98
+贶	97
+爿	97
+淸	97
+渺	97
+晅	97
+紙	97
+囵	97
+國	97
+饯	97
+芎	96
+翃	96
+姁	96
+囫	96
+畦	96
+溫	96
+婳	96
+猩	96
+阗	95
+崽	95
+誌	95
+礴	95
+蚴	94
+氣	94
+燏	94
+弇	94
+砵	93
+蕤	93
+崑	93
+斟	93
+犋	93
+镑	92
+芡	92
+闩	92
+區	92
+溟	92
+杧	92
+檑	91
+贛	91
+唁	91
+悄	91
+墕	91
+赃	91
+嶙	91
+迢	90
+蛸	90
+胙	90
+篪	90
+潏	90
+桤	89
+霰	89
+艏	89
+坋	89
+巯	89
+燈	89
+慨	88
+黒	88
+瑝	88
+筵	88
+阄	88
+稅	88
+際	88
+姨	88
+採	88
+葶	88
+嘌	88
+胄	88
+涒	88
+夙	88
+啭	87
+觐	87
+堕	87
+倢	87
+傑	87
+砰	87
+寂	87
+蘋	87
+幵	87
+窘	86
+儲	86
+穰	86
+蘅	86
+經	86
+俘	86
+給	86
+翦	86
+塚	86
+晤	85
+聍	85
+矯	85
+膠	85
+皕	85
+罾	85
+藴	85
+運	85
+耵	84
+鲛	84
+翾	84
+氪	84
+跻	84
+醌	84
+赎	84
+磡	84
+钚	84
+狩	84
+珵	84
+稗	84
+鸶	83
+妺	83
+熺	83
+铪	83
+蝠	83
+個	83
+奡	83
+皙	82
+迓	82
+妲	82
+蠊	82
+頌	82
+車	82
+載	82
+氹	82
+啥	82
+蹭	82
+跸	82
+畬	81
+輸	81
+跖	81
+佀	81
+蓢	80
+枥	80
+皞	80
+馄	80
+滃	80
+瑧	80
+烊	80
+桴	80
+篾	80
+晌	80
+鱻	80
+彥	80
+伲	80
+灡	80
+墊	79
+耍	79
+舢	79
+帯	79
+饨	79
+榃	79
+贽	79
+颏	79
+锜	79
+蟥	78
+瘀	78
+朳	78
+蛭	78
+祗	78
+華	78
+蝙	78
+辂	78
+搽	78
+浥	78
+觀	77
+辇	77
+罹	77
+镬	77
+亊	77
+魄	76
+镠	76
+炤	76
+羰	76
+贼	76
+噸	76
+琻	76
+涴	76
+诤	76
+嗄	76
+铚	75
+诩	75
+缕	75
+橛	75
+閥	75
+巜	75
+韻	75
+妫	74
+檗	74
+鳜	74
+奀	74
+玙	74
+屁	74
+畎	74
+淫	74
+弭	73
+昮	73
+嚣	73
+滧	73
+雙	73
+荇	73
+書	73
+轵	73
+順	73
+蓋	72
+鞲	72
+彷	72
+腧	72
+浰	72
+恙	72
+豊	72
+鞅	72
+嘿	72
+鞴	71
+糍	71
+涸	71
+挣	71
+掰	71
+焮	71
+鎰	71
+吒	71
+妪	71
+長	71
+瘪	71
+橹	71
+钍	71
+揆	71
+袆	70
+莜	70
+岞	70
+勖	70
+園	70
+滓	70
+詠	70
+脿	69
+璁	69
+扆	69
+熳	69
+咋	69
+仞	69
+侮	68
+蕗	68
+奧	68
+璩	68
+昳	68
+佽	68
+須	68
+霭	68
+湑	68
+缜	67
+暇	67
+鋐	67
+潽	67
+飨	67
+侥	67
+栲	67
+肓	67
+啃	66
+俠	66
+鞣	66
+烆	66
+菟	66
+設	66
+翙	66
+淓	66
+蘖	66
+惇	66
+袱	66
+剿	66
+埼	65
+窈	65
+赚	65
+欹	65
+恣	65
+呦	65
+绦	65
+暘	65
+戥	65
+杼	64
+間	64
+咇	64
+圹	64
+缫	64
+閤	64
+眀	64
+哙	64
+捎	64
+蛆	64
+殓	63
+蜃	63
+關	63
+柁	63
+锢	63
+饥	63
+廒	63
+枰	63
+迥	63
+怜	63
+碼	63
+搋	63
+锞	62
+逮	62
+滈	62
+鸵	62
+岧	62
+茼	62
+茏	62
+湕	62
+換	62
+級	62
+霅	61
+衠	61
+厩	61
+條	61
+筆	61
+嗮	61
+轼	61
+證	61
+墈	61
+缄	61
+诀	61
+撩	61
+囟	61
+俵	61
+舔	61
+圏	61
+岌	60
+凶	60
+瀂	60
+椟	60
+堉	60
+対	60
+佴	60
+挹	60
+體	60
+睟	60
+哃	59
+岵	59
+臬	59
+盤	59
+熀	59
+掐	59
+購	59
+佾	59
+業	59
+廪	59
+製	58
+錧	58
+祾	58
+刈	58
+葚	58
+酝	58
+钋	58
+廨	58
+犸	58
+胴	58
+肜	57
+抟	57
+蔫	57
+悌	57
+膑	57
+儀	57
+記	57
+緑	57
+骸	57
+旃	56
+堼	56
+棆	56
+玏	56
+缶	56
+溋	56
+俑	56
+蚪	56
+茔	56
+栝	56
+鳕	56
+熱	56
+蓆	56
+銘	55
+淩	55
+闱	55
+衩	55
+苘	55
+溏	55
+煕	55
+畿	55
+檢	55
+朸	55
+氓	55
+愣	54
+亐	54
+兩	54
+镡	54
+硊	54
+匪	54
+荊	54
+漭	54
+後	54
+簰	54
+蔸	54
+掛	54
+暐	54
+喋	54
+鸷	54
+苖	54
+舁	54
+睁	54
+枨	53
+傳	53
+猬	53
+柸	53
+眯	53
+埤	53
+蛏	53
+鮋	53
+燿	53
+錶	53
+倉	53
+阇	52
+缵	52
+險	52
+喽	52
+侑	52
+翬	52
+窍	52
+颋	52
+罂	52
+纻	52
+酣	52
+礅	52
+攒	52
+苣	52
+烶	51
+猿	51
+繫	51
+冋	51
+圌	51
+炟	51
+鎮	51
+钆	51
+墻	51
+嘻	51
+蒡	51
+陞	51
+锺	50
+葸	50
+遁	50
+寀	50
+鸫	50
+剐	50
+滿	50
+荍	50
+衿	50
+狙	50
+鲩	50
+啼	50
+飛	49
+蝌	49
+槲	49
+開	49
+監	49
+鲂	49
+珰	49
+暹	49
+荑	49
+磑	49
+汆	49
+風	49
+煞	49
+烩	49
+韡	49
+梱	49
+缬	49
+岠	49
+纰	48
+坬	48
+檔	48
+峘	48
+帙	48
+缌	48
+胗	48
+睹	48
+掣	48
+摞	48
+衖	48
+俾	48
+瑯	48
+鲳	48
+乂	48
+噴	47
+組	47
+镎	47
+锔	47
+郵	47
+饴	47
+試	47
+旮	47
+耩	47
+罄	46
+襻	46
+嘹	46
+蓑	46
+淜	46
+莛	46
+戗	46
+逑	46
+鄃	46
+逞	46
+锎	46
+鉻	46
+蜕	46
+鳟	46
+洨	46
+樂	46
+酢	46
+姹	46
+垇	45
+蔴	45
+實	45
+繇	45
+鹛	45
+瑨	45
+笈	45
+寳	45
+谴	45
+曩	45
+敝	45
+锏	45
+怨	45
+編	45
+摁	44
+叡	44
+秫	44
+肄	44
+狠	44
+壅	44
+牂	44
+濾	44
+郤	44
+伉	44
+骰	44
+闺	44
+惬	44
+霹	44
+萦	44
+蜞	44
+鲴	44
+牁	44
+婀	44
+鲌	44
+靜	44
+圓	44
+則	43
+殪	43
+澂	43
+莠	43
+薹	43
+愫	43
+甡	43
+锕	43
+萋	43
+荦	43
+筘	43
+鼋	43
+計	43
+侕	43
+潩	43
+忐	43
+哎	43
+俅	43
+珎	43
+堨	43
+蚧	43
+铦	42
+虅	42
+蛰	42
+桎	42
+敔	42
+檵	42
+細	42
+喾	42
+臵	42
+樯	42
+膺	42
+將	42
+門	42
+哓	42
+槠	42
+洢	42
+惨	42
+渉	42
+貿	42
+珖	42
+糞	41
+枷	41
+荠	41
+嗒	41
+庥	41
+铙	41
+芶	41
+孽	41
+腙	41
+莨	41
+肈	41
+啜	41
+劑	41
+鲽	41
+朏	41
+鲃	41
+棧	41
+镥	41
+菽	41
+陝	40
+蠹	40
+鋁	40
+铔	40
+變	40
+慌	40
+録	40
+僖	40
+逝	40
+踵	40
+寬	40
+粜	40
+媲	40
+揪	40
+唢	40
+逅	40
+澞	39
+醍	39
+愛	39
+側	39
+冽	39
+槚	39
+葉	39
+伾	39
+慜	39
+袅	39
+忤	39
+悫	39
+嶍	39
+抺	39
+傧	39
+祤	39
+澌	39
+圴	39
+昴	39
+灋	39
+楻	39
+袪	39
+岡	39
+苊	39
+慑	39
+纛	39
+儆	39
+瓘	39
+喙	39
+梪	39
+瑱	39
+亁	38
+圖	38
+導	38
+昡	38
+淂	38
+侉	38
+拮	38
+蓠	38
+韮	38
+潲	38
+許	38
+晷	38
+護	38
+坽	38
+荨	38
+単	38
+甏	38
+苾	38
+丅	38
+俢	38
+悅	38
+赅	38
+貨	38
+匏	38
+蹼	38
+曁	37
+飬	37
+赡	37
+筌	37
+鏽	37
+剽	37
+钪	37
+秾	37
+迸	37
+嘀	37
+樓	37
+仄	37
+敉	37
+恻	37
+镢	37
+叱	37
+婓	37
+玗	37
+砒	37
+辍	37
+昄	36
+恨	36
+谙	36
+嘣	36
+煽	36
+犏	36
+榬	36
+嘏	36
+薤	36
+竦	36
+獾	36
+徑	36
+疌	36
+嗡	36
+話	36
+跺	36
+杳	36
+陛	35
+艭	35
+稣	35
+鴻	35
+胂	35
+岺	35
+皈	35
+對	35
+饸	35
+栊	35
+垆	35
+芴	35
+埙	35
+枉	35
+菪	35
+戽	35
+剀	35
+叟	35
+塊	35
+凱	35
+煖	35
+瞧	35
+鲀	34
+熤	34
+納	34
+過	34
+畝	34
+簖	34
+锠	34
+沆	34
+穂	34
+竽	34
+塨	34
+俫	34
+磏	34
+癞	34
+麾	34
+棤	34
+嗦	34
+诂	34
+荛	34
+應	34
+赧	34
+猁	34
+猞	34
+秝	34
+姺	34
+垞	33
+诶	33
+騰	33
+骛	33
+匍	33
+傥	33
+禇	33
+芈	33
+窎	33
+迮	33
+愷	33
+仂	33
+紅	33
+猄	33
+愽	33
+丼	33
+頫	33
+蕖	32
+霡	32
+鳯	32
+鐵	32
+鬲	32
+劬	32
+貮	32
+確	32
+诧	32
+點	32
+瞌	32
+屬	32
+昦	32
+羑	32
+滙	32
+厷	32
+冑	32
+卮	32
+尙	32
+辦	31
+爰	31
+呛	31
+嶕	31
+庫	31
+竝	31
+钌	31
+潥	31
+鋒	31
+逦	31
+軌	31
+離	31
+虻	31
+艿	31
+遄	31
+視	31
+處	31
+興	31
+轳	31
+調	31
+蚺	31
+俍	31
+貝	30
+堔	30
+鵾	30
+詳	30
+笥	30
+囍	30
+靡	30
+泣	30
+鸹	30
+谵	30
+鬓	30
+顔	30
+瘙	30
+張	30
+僅	30
+湙	30
+嗯	30
+昧	30
+埯	30
+簌	30
+惫	30
+苝	30
+菔	29
+髭	29
+曽	29
+灃	29
+馋	29
+弾	29
+類	29
+愤	29
+嚏	29
+銲	29
+売	29
+鞑	29
+窕	29
+楗	29
+倦	29
+峋	29
+暻	29
+谚	29
+燧	29
+榮	29
+轾	29
+骟	29
+捭	29
+遊	29
+蕻	29
+鯵	29
+奤	29
+耷	29
+媞	29
+農	29
+攝	29
+萂	29
+議	29
+骺	29
+甁	29
+绺	28
+軟	28
+喏	28
+搀	28
+咐	28
+腴	28
+栳	28
+嬛	28
+虐	28
+凊	28
+釡	28
+偻	28
+桖	28
+拗	28
+茑	28
+矜	28
+枊	28
+費	28
+吮	28
+苁	28
+呻	28
+畖	28
+唧	28
+總	28
+哀	28
+逖	27
+噤	27
+祼	27
+吱	27
+佈	27
+幹	27
+菓	27
+扥	27
+爾	27
+庒	27
+阝	27
+芰	27
+摧	27
+玕	27
+誊	27
+嚎	27
+掬	27
+禛	27
+玘	27
+拄	27
+槊	27
+連	27
+侓	27
+淨	27
+锖	27
+汘	27
+闼	27
+禚	27
+煺	27
+參	27
+苲	27
+蟛	27
+釘	27
+邽	26
+鲑	26
+負	26
+徼	26
+羯	26
+咫	26
+碡	26
+驗	26
+抡	26
+優	26
+伢	26
+搻	26
+耱	26
+彈	26
+撖	26
+蝰	26
+尭	26
+鲒	26
+洚	26
+翯	26
+憶	26
+術	26
+壇	26
+痨	26
+罟	26
+鲎	26
+濎	26
+哼	26
+菴	26
+塥	26
+滗	26
+祢	26
+笫	25
+繪	25
+藐	25
+絲	25
+蓦	25
+幌	25
+磹	25
+椋	25
+瓠	25
+詢	25
+嫡	25
+擢	25
+佞	25
+缰	25
+玷	25
+酇	25
+猊	25
+跛	25
+蚩	25
+卟	25
+奸	25
+耈	25
+笸	25
+懃	25
+孑	25
+镈	25
+厮	24
+庑	24
+藍	24
+丠	24
+艽	24
+幡	24
+廣	24
+菻	24
+椪	24
+柵	24
+媖	24
+鲮	24
+綠	24
+棂	24
+愧	24
+縮	24
+伋	24
+槃	24
+埉	24
+牒	24
+荽	24
+邠	24
+纭	24
+骠	24
+桿	24
+晢	24
+忏	24
+湮	24
+約	24
+遆	24
+甍	24
+柰	24
+碈	24
+奄	23
+終	23
+庖	23
+憋	23
+遼	23
+悸	23
+谒	23
+邊	23
+稹	23
+氵	23
+鏖	23
+糸	23
+笮	23
+畯	23
+觃	23
+洌	23
+襞	23
+宮	23
+赝	23
+潖	23
+炆	23
+額	23
+崐	23
+裢	23
+栆	23
+結	23
+圧	23
+沬	23
+玚	23
+泇	23
+嗥	22
+荸	22
+狒	22
+奭	22
+團	22
+跬	22
+鹣	22
+匐	22
+貉	22
+紹	22
+昃	22
+皝	22
+濫	22
+棻	22
+鍍	22
+楫	22
+诜	22
+專	22
+見	22
+茘	22
+诡	22
+樹	22
+哂	22
+裡	22
+蝮	22
+殇	22
+硗	22
+爃	22
+垻	22
+噉	22
+妄	22
+陣	22
+蔑	22
+叛	22
+齡	22
+嗖	22
+啵	22
+尬	22
+驫	22
+鲡	21
+讳	21
+柃	21
+鮠	21
+卲	21
+紋	21
+薜	21
+薷	21
+荖	21
+臾	21
+飲	21
+颙	21
+瓤	21
+銅	21
+圍	21
+崙	21
+镅	21
+員	21
+衎	21
+昰	21
+掲	21
+繞	21
+邂	21
+溎	21
+洳	21
+毙	21
+匕	21
+廈	21
+尴	21
+準	21
+収	21
+荩	21
+锪	21
+構	21
+賨	21
+纏	20
+鏡	20
+鲉	20
+乪	20
+裥	20
+顯	20
+達	20
+痿	20
+颓	20
+娼	20
+滾	20
+镳	20
+吳	20
+娙	20
+钐	20
+摺	20
+変	20
+僡	20
+咩	20
+塗	20
+菰	20
+藳	20
+舥	20
+嶲	20
+琲	20
+騄	20
+瓏	20
+酽	20
+俺	20
+枘	20
+戤	20
+茺	20
+銹	20
+氺	20
+滮	20
+嗞	20
+蚱	20
+褡	20
+竔	20
+祇	20
+唆	20
+偱	20
+艚	20
+俆	20
+棬	20
+叻	20
+屴	20
+芐	19
+蝽	19
+鳎	19
+膻	19
+颧	19
+佢	19
+艹	19
+咘	19
+鹓	19
+琀	19
+奿	19
+锽	19
+遺	19
+廢	19
+婼	19
+哟	19
+気	19
+埮	19
+銜	19
+倧	19
+頠	19
+帱	19
+琠	19
+鴒	19
+轫	19
+蟀	19
+與	19
+辄	19
+蛄	19
+歼	19
+儇	19
+烎	19
+磉	19
+愍	19
+陽	19
+蟋	19
+壸	18
+斷	18
+鍪	18
+幷	18
+跗	18
+嗑	18
+蹑	18
+埸	18
+谗	18
+樗	18
+種	18
+徨	18
+釰	18
+鯤	18
+盺	18
+杮	18
+廋	18
+崁	18
+拋	18
+錂	18
+铽	18
+兒	18
+瘸	18
+鼔	18
+棽	18
+姒	18
+決	18
+箸	18
+迀	18
+渰	18
+婶	18
+鏠	18
+岦	18
+丿	18
+訇	18
+迺	18
+蛊	18
+疚	18
+溝	18
+撸	18
+侈	18
+诲	18
+垕	18
+籣	18
+棰	18
+笳	18
+啓	18
+靬	18
+陔	17
+洴	17
+頂	17
+枼	17
+绾	17
+塢	17
+鹢	17
+蛐	17
+茳	17
+旄	17
+钘	17
+揺	17
+貟	17
+趄	17
+畓	17
+鎖	17
+沒	17
+矬	17
+瑸	17
+卾	17
+趙	17
+澫	17
+饹	17
+讶	17
+澐	17
+蛑	17
+锱	17
+怛	17
+伈	17
+糅	17
+鉄	17
+衕	17
+勝	17
+責	17
+夽	17
+蓸	17
+満	17
+耔	17
+蠖	17
+皛	17
+產	17
+溞	17
+祙	16
+暫	16
+諾	16
+苠	16
+鍵	16
+倔	16
+喔	16
+晥	16
+糁	16
+踌	16
+呇	16
+疁	16
+巣	16
+聩	16
+铢	16
+洰	16
+臃	16
+鎓	16
+歐	16
+瞾	16
+遛	16
+鉓	16
+酡	16
+橈	16
+钖	16
+呂	16
+悙	16
+骕	16
+樣	16
+鈜	16
+溵	16
+棁	16
+繕	16
+玓	16
+搔	16
+姌	16
+絡	16
+丐	16
+绉	16
+皑	16
+鉏	16
+獒	16
+說	16
+玭	16
+卣	15
+燔	15
+衮	15
+砩	15
+繘	15
+璛	15
+逶	15
+哝	15
+痊	15
+鄩	15
+噌	15
+靑	15
+鈉	15
+圜	15
+輪	15
+秕	15
+鉤	15
+婍	15
+疖	15
+鈦	15
+窩	15
+飖	15
+範	15
+堿	15
+泅	15
+饷	15
+冄	15
+問	15
+墡	15
+刂	15
+塵	15
+啷	15
+绨	15
+抉	15
+錦	15
+墺	15
+硍	15
+祧	15
+嗲	15
+豳	15
+溚	15
+朊	15
+寛	15
+玧	15
+蘇	15
+柢	15
+鮑	15
+傎	15
+蒨	15
+牮	15
+碹	15
+況	15
+欄	15
+锛	15
+刖	15
+偉	15
+谠	15
+揚	15
+荗	15
+攜	14
+轉	14
+镘	14
+澪	14
+蝈	14
+鄀	14
+緡	14
+稆	14
+氽	14
+牋	14
+篏	14
+詩	14
+硂	14
+铗	14
+枱	14
+叨	14
+嘤	14
+侖	14
+礽	14
+舖	14
+罴	14
+閉	14
+埊	14
+喈	14
+烬	14
+舅	14
+梃	14
+寶	14
+廬	14
+胯	14
+讬	14
+箜	14
+筸	14
+麿	14
+節	14
+蓊	14
+蕈	14
+浵	14
+蹴	14
+骔	14
+嵥	14
+講	14
+搧	14
+呃	14
+畫	14
+烑	14
+勀	14
+養	14
+餘	14
+審	14
+乸	14
+婿	14
+犟	14
+抿	13
+滉	13
+襁	13
+課	13
+佝	13
+篼	13
+帀	13
+貊	13
+狨	13
+枓	13
+啾	13
+罝	13
+栐	13
+妟	13
+曉	13
+渃	13
+禮	13
+淵	13
+鏈	13
+倌	13
+蕞	13
+恍	13
+袒	13
+咤	13
+圉	13
+軍	13
+砕	13
+狡	13
+跞	13
+砗	13
+堙	13
+萏	13
+钅	13
+夾	13
+裾	13
+硿	13
+瀹	13
+暠	13
+隩	13
+閣	13
+蟲	13
+埴	13
+缐	13
+嵄	13
+潾	13
+雜	13
+埏	13
+汹	13
+甙	13
+曵	13
+坉	13
+掮	13
+痈	13
+沵	13
+璿	13
+寔	13
+槜	13
+捩	13
+鲚	13
+嶶	13
+妘	13
+徴	13
+巻	13
+鉵	13
+铩	13
+薸	12
+夠	12
+弨	12
+瑔	12
+臊	12
+呖	12
+剎	12
+縫	12
+锒	12
+紐	12
+朩	12
+泜	12
+漴	12
+毐	12
+謝	12
+沋	12
+咭	12
+嚗	12
+枵	12
+籲	12
+枒	12
+叼	12
+栯	12
+躜	12
+櫻	12
+坧	12
+肫	12
+鶴	12
+玆	12
+澶	12
+仠	12
+蹻	12
+筢	12
+柝	12
+嘜	12
+簡	12
+碜	12
+硏	12
+剋	12
+俛	12
+酔	12
+飔	12
+乢	12
+渟	12
+伣	12
+頁	12
+讪	12
+惶	12
+偞	12
+稥	12
+坶	12
+歅	12
+芛	12
+係	12
+針	12
+沖	12
+厡	12
+嵕	12
+鉗	12
+倏	12
+霑	12
+瀞	12
+熖	12
+嗝	12
+鋅	12
+缯	12
+恃	12
+襦	12
+忒	12
+狍	12
+怦	12
+註	12
+腳	11
+妾	11
+銀	11
+顆	11
+淺	11
+佂	11
+菥	11
+唏	11
+簋	11
+壵	11
+澺	11
+楪	11
+臨	11
+圯	11
+讀	11
+緊	11
+滐	11
+骱	11
+炷	11
+偰	11
+扡	11
+寫	11
+陸	11
+澤	11
+觸	11
+燫	11
+廯	11
+郉	11
+碥	11
+轺	11
+鹼	11
+綜	11
+涳	11
+橢	11
+粿	11
+筀	11
+殉	11
+狀	11
+嚞	11
+減	11
+氶	11
+埲	11
+掊	11
+襯	11
+黠	11
+啁	11
+絢	11
+藠	11
+耨	11
+極	11
+筫	11
+嚓	11
+躇	11
+葙	11
+葏	11
+殘	11
+麇	11
+嶪	11
+嗵	11
+銷	11
+馚	11
+瀮	11
+蛲	11
+篝	11
+湭	11
+捂	10
+橧	10
+鄙	10
+栜	10
+蔣	10
+渂	10
+來	10
+顏	10
+葜	10
+汣	10
+箥	10
+嘢	10
+峛	10
+漤	10
+槺	10
+蓣	10
+題	10
+纮	10
+扞	10
+胼	10
+玶	10
+叵	10
+讽	10
+耄	10
+褓	10
+猖	10
+瀔	10
+氤	10
+暒	10
+崦	10
+捋	10
+诛	10
+菾	10
+譜	10
+盍	10
+铇	10
+菝	10
+吭	10
+瓌	10
+觞	10
+跶	10
+郃	10
+缒	10
+螈	10
+鲻	10
+屮	10
+佯	10
+泂	10
+怯	10
+鈡	10
+啪	10
+選	10
+耧	10
+鳘	10
+榑	10
+闇	10
+圫	10
+侒	10
+岄	10
+腆	10
+篌	10
+椆	10
+旒	10
+螅	10
+勗	10
+勻	10
+緣	10
+檺	10
+绱	10
+莀	10
+咡	10
+叒	10
+怵	10
+炻	10
+鸺	10
+杻	10
+镤	10
+鹜	10
+贋	10
+汚	10
+硋	9
+玿	9
+骓	9
+娌	9
+漢	9
+協	9
+峽	9
+彡	9
+蕺	9
+觜	9
+簏	9
+梣	9
+煸	9
+旯	9
+觎	9
+獎	9
+厎	9
+孓	9
+捲	9
+岬	9
+廸	9
+締	9
+掁	9
+玒	9
+菹	9
+訚	9
+芼	9
+膄	9
+鳢	9
+脘	9
+哞	9
+頜	9
+揖	9
+岎	9
+冇	9
+栒	9
+旼	9
+伵	9
+咎	9
+迨	9
+錡	9
+蘆	9
+辏	9
+轄	9
+寞	9
+杺	9
+鐡	9
+亍	9
+璆	9
+仸	9
+焬	9
+袷	9
+旳	9
+權	9
+叆	9
+抻	9
+珆	9
+窼	9
+饬	9
+鈎	9
+盉	9
+輌	9
+彎	9
+嘚	9
+晛	9
+哧	9
+孀	9
+酫	9
+尢	9
+昺	9
+夥	9
+氫	9
+網	9
+粬	9
+咆	9
+袓	9
+癔	9
+鋈	9
+鞥	9
+賀	9
+悃	9
+慊	9
+惚	9
+羮	9
+閱	9
+舭	9
+燄	9
+獗	9
+髦	9
+瘠	9
+貅	9
+燠	9
+箒	8
+瀨	8
+磦	8
+稊	8
+珝	8
+絕	8
+疥	8
+佥	8
+逬	8
+疔	8
+認	8
+侔	8
+頸	8
+翳	8
+虸	8
+囧	8
+恁	8
+晣	8
+夿	8
+琸	8
+迆	8
+頲	8
+鎔	8
+坫	8
+鍏	8
+鐘	8
+牽	8
+鲧	8
+齑	8
+膩	8
+蛴	8
+攪	8
+嫆	8
+沗	8
+潛	8
+層	8
+牳	8
+弍	8
+縠	8
+續	8
+薔	8
+谩	8
+爖	8
+肮	8
+灝	8
+撵	8
+懵	8
+斳	8
+枟	8
+闿	8
+冤	8
+鳛	8
+揩	8
+較	8
+苧	8
+裉	8
+薅	8
+貼	8
+酆	8
+殆	8
+椁	8
+咙	8
+伥	8
+鑚	8
+呰	8
+螬	8
+鼹	8
+荜	8
+忖	8
+礵	8
+盹	8
+喳	8
+鮰	8
+砉	8
+紗	8
+箧	8
+輛	8
+撅	8
+闐	8
+撝	8
+迖	8
+纨	8
+镆	8
+赦	8
+锫	8
+姫	8
+顣	8
+馫	8
+蝕	8
+錐	8
+悭	8
+寖	8
+飾	8
+饕	8
+窋	8
+蒞	8
+蚄	8
+沏	8
+閃	8
+苪	8
+臌	7
+語	7
+杄	7
+谼	7
+骍	7
+骙	7
+冐	7
+殃	7
+鱀	7
+蒴	7
+懸	7
+靯	7
+餮	7
+檞	7
+旵	7
+舻	7
+糨	7
+纡	7
+亞	7
+怔	7
+宖	7
+隨	7
+馬	7
+墰	7
+祷	7
+鄉	7
+暋	7
+婢	7
+淉	7
+隹	7
+绐	7
+擴	7
+乚	7
+繡	7
+呲	7
+豺	7
+冿	7
+咢	7
+礓	7
+侪	7
+妒	7
+肭	7
+埽	7
+堞	7
+柌	7
+鹇	7
+绡	7
+築	7
+滲	7
+纜	7
+鬣	7
+慆	7
+錫	7
+幾	7
+畑	7
+預	7
+帎	7
+邘	7
+馓	7
+嗉	7
+瘗	7
+創	7
+櫶	7
+燨	7
+饋	7
+戆	7
+仹	7
+晈	7
+撘	7
+禕	7
+愔	7
+純	7
+樁	7
+泙	7
+曐	7
+潟	7
+萜	7
+韾	7
+鵬	7
+熇	7
+瑩	7
+蔟	7
+阽	7
+遙	7
+醣	7
+踹	7
+厔	7
+囹	7
+滪	7
+螵	7
+鬟	7
+眞	7
+楿	7
+龆	7
+哽	7
+泚	7
+靈	7
+忑	7
+蘊	7
+愐	7
+豐	7
+嘲	6
+礳	6
+泩	6
+鞡	6
+眾	6
+硙	6
+駿	6
+碃	6
+瀜	6
+浕	6
+乗	6
+鏊	6
+醡	6
+玦	6
+睬	6
+邁	6
+髈	6
+鄜	6
+睺	6
+綁	6
+蔘	6
+昜	6
+卻	6
+箖	6
+沲	6
+菫	6
+矞	6
+耇	6
+湦	6
+堧	6
+戶	6
+嘘	6
+矴	6
+濩	6
+艨	6
+煩	6
+袈	6
+鈕	6
+尻	6
+櫞	6
+敍	6
+萆	6
+蝥	6
+蔹	6
+蕟	6
+唰	6
+濟	6
+斎	6
+岃	6
+釥	6
+唉	6
+骘	6
+夲	6
+奍	6
+鈤	6
+皴	6
+訊	6
+鹔	6
+奵	6
+魚	6
+槡	6
+輥	6
+鎯	6
+欐	6
+敀	6
+穑	6
+靰	6
+鉀	6
+睆	6
+據	6
+鋪	6
+嫜	6
+夆	6
+棨	6
+賠	6
+鍊	6
+攥	6
+籐	6
+傷	6
+奣	6
+茀	6
+黴	6
+虉	6
+鵝	6
+冊	6
+遠	6
+醫	6
+識	6
+椄	6
+嚢	6
+怅	6
+唔	6
+罅	6
+滶	6
+蹋	6
+笄	6
+匚	6
+耖	6
+顎	6
+蝾	6
+呸	6
+砘	6
+泘	6
+焟	6
+適	6
+鏵	6
+垉	6
+犮	6
+唻	6
+晫	6
+蕌	6
+畇	6
+澱	6
+呔	6
+尅	6
+抨	6
+厠	6
+嵉	6
+氷	6
+箇	6
+皊	6
+漰	6
+晻	6
+並	6
+丟	6
+糄	6
+矷	6
+荙	6
+胬	6
+旆	6
+菂	6
+竸	6
+佸	6
+霪	6
+萣	6
+棲	5
+歀	5
+鹡	5
+逡	5
+釋	5
+潤	5
+靥	5
+羴	5
+纖	5
+茝	5
+衛	5
+礌	5
+糥	5
+蓂	5
+褛	5
+洐	5
+氲	5
+訂	5
+獴	5
+鄅	5
+蘧	5
+侹	5
+媺	5
+琭	5
+缃	5
+帥	5
+帑	5
+伫	5
+缭	5
+咄	5
+鐩	5
+餈	5
+黾	5
+熘	5
+齒	5
+杩	5
+箢	5
+応	5
+蔵	5
+偖	5
+嫉	5
+侄	5
+箘	5
+裣	5
+蛘	5
+咧	5
+戾	5
+搠	5
+勞	5
+涘	5
+殼	5
+噹	5
+揹	5
+噐	5
+挍	5
+秄	5
+玊	5
+勠	5
+黯	5
+荺	5
+卬	5
+嚷	5
+苈	5
+鱔	5
+偈	5
+鲞	5
+讥	5
+瀅	5
+槔	5
+阼	5
+畄	5
+徃	5
+盞	5
+鬐	5
+炝	5
+蹰	5
+嘯	5
+谔	5
+蝲	5
+爐	5
+鹽	5
+徧	5
+鹩	5
+琞	5
+箋	5
+蒉	5
+黇	5
+憭	5
+殒	5
+嗌	5
+朿	5
+觊	5
+盡	5
+損	5
+飯	5
+鮮	5
+蒾	5
+懦	5
+瘳	5
+甭	5
+檾	5
+昤	5
+詺	5
+棑	5
+鉷	5
+爔	5
+扢	5
+庁	5
+襕	5
+叕	5
+壘	5
+甓	5
+態	5
+柷	5
+蝼	5
+翆	5
+榠	5
+湶	5
+榘	5
+訫	5
+殚	5
+戸	5
+揠	5
+婋	5
+觖	5
+髹	5
+跡	5
+珧	5
+侴	5
+濺	5
+苳	5
+軎	5
+徭	5
+昋	5
+鈣	5
+藟	5
+莙	5
+瀋	5
+芑	5
+敇	5
+楯	5
+骷	5
+戮	5
+咦	5
+吣	5
+薬	5
+杕	5
+韌	5
+虺	5
+蠧	5
+蒇	5
+婞	5
+雱	5
+摖	5
+垏	5
+畾	5
+蒎	5
+蓮	5
+阋	5
+瑊	5
+弎	5
+缢	5
+筯	5
+绔	5
+榞	5
+冭	5
+籃	5
+蟮	5
+姸	5
+効	5
+蟇	5
+鳈	5
+汔	5
+咼	5
+錩	5
+萫	5
+羅	5
+顕	5
+埖	5
+粻	5
+峱	5
+胝	5
+鸮	5
+葠	5
+燀	5
+倶	5
+鍛	5
+澋	5
+莰	4
+桜	4
+贏	4
+鮃	4
+鄰	4
+漍	4
+踱	4
+舯	4
+筞	4
+皲	4
+幁	4
+夢	4
+薢	4
+囝	4
+缋	4
+懑	4
+沝	4
+莯	4
+甠	4
+淢	4
+艁	4
+鰡	4
+燐	4
+旡	4
+岒	4
+頣	4
+牝	4
+雋	4
+箝	4
+锍	4
+綷	4
+盜	4
+汙	4
+苼	4
+烏	4
+吔	4
+蚰	4
+鱲	4
+寷	4
+蜴	4
+侀	4
+黙	4
+謦	4
+摭	4
+壺	4
+毖	4
+诹	4
+賽	4
+銩	4
+罱	4
+戡	4
+肸	4
+從	4
+娬	4
+糌	4
+葎	4
+铫	4
+籴	4
+蛞	4
+衝	4
+轟	4
+剤	4
+領	4
+驽	4
+頒	4
+舊	4
+刣	4
+疬	4
+阉	4
+阂	4
+谝	4
+鈊	4
+笩	4
+鞕	4
+楁	4
+厲	4
+簱	4
+詰	4
+鹘	4
+黝	4
+苽	4
+埦	4
+禔	4
+墎	4
+顫	4
+県	4
+搴	4
+積	4
+炐	4
+杪	4
+秞	4
+佔	4
+撐	4
+淲	4
+姉	4
+蟽	4
+陰	4
+挲	4
+仚	4
+茤	4
+喼	4
+苻	4
+銫	4
+滌	4
+廘	4
+鉑	4
+墐	4
+柲	4
+徍	4
+韋	4
+谖	4
+簣	4
+溡	4
+廚	4
+錠	4
+睎	4
+髅	4
+儂	4
+蛱	4
+簽	4
+晦	4
+洘	4
+澽	4
+橞	4
+鰤	4
+奮	4
+磘	4
+執	4
+鹋	4
+骀	4
+汋	4
+蝓	4
+秴	4
+瑪	4
+簾	4
+陎	4
+訁	4
+荮	4
+馐	4
+萊	4
+砱	4
+墣	4
+災	4
+芺	4
+楊	4
+噱	4
+愎	4
+倂	4
+擤	4
+衾	4
+诙	4
+玨	4
+侎	4
+燒	4
+纣	4
+吙	4
+渶	4
+竫	4
+袴	4
+錳	4
+旪	4
+鲭	4
+昑	4
+屷	4
+嫫	4
+瀟	4
+獠	4
+撈	4
+觇	4
+挻	4
+掃	4
+甶	4
+朮	4
+綿	4
+隊	4
+鈃	4
+舐	4
+唬	4
+锾	4
+鷹	4
+璊	4
+焛	4
+鑄	4
+諧	4
+踔	4
+栛	4
+鷽	4
+竼	4
+俜	4
+悝	4
+秠	4
+騵	4
+赬	4
+鱸	4
+衽	4
+噎	4
+缂	4
+裇	4
+粞	4
+帪	4
+硎	4
+撳	4
+萹	4
+暎	4
+硧	4
+響	4
+戙	4
+埪	4
+鉦	4
+獅	4
+闶	4
+嗾	4
+蕥	4
+蜢	4
+疍	4
+摈	4
+顢	4
+珒	4
+飕	4
+醼	4
+霎	4
+屐	4
+璕	4
+瘰	4
+曷	4
+婊	4
+瀢	4
+桝	4
+欯	4
+咗	4
+蕫	4
+衞	4
+蟳	4
+栱	4
+嗳	4
+斅	4
+顸	4
+攫	4
+绌	4
+療	3
+玍	3
+彀	3
+嵫	3
+牆	3
+妏	3
+嗔	3
+慠	3
+怍	3
+盬	3
+鎂	3
+谰	3
+淶	3
+柤	3
+螓	3
+爎	3
+輔	3
+楽	3
+屸	3
+墥	3
+湯	3
+嗷	3
+鋵	3
+貔	3
+禊	3
+寧	3
+銾	3
+啧	3
+夈	3
+凨	3
+韪	3
+脫	3
+穬	3
+堘	3
+莶	3
+湐	3
+併	3
+穩	3
+驛	3
+咝	3
+礠	3
+棿	3
+鲋	3
+柺	3
+鷃	3
+營	3
+齨	3
+虷	3
+瘐	3
+伬	3
+蠓	3
+肷	3
+泤	3
+補	3
+暌	3
+覩	3
+揷	3
+鍙	3
+袼	3
+塰	3
+昽	3
+茖	3
+箓	3
+谿	3
+甴	3
+孬	3
+絜	3
+娭	3
+踫	3
+杙	3
+沢	3
+尠	3
+颔	3
+咂	3
+拃	3
+奁	3
+簒	3
+缈	3
+顥	3
+珘	3
+噔	3
+飼	3
+咒	3
+匉	3
+杋	3
+缡	3
+倫	3
+藥	3
+筃	3
+圤	3
+扠	3
+鎧	3
+鉥	3
+掂	3
+铞	3
+尜	3
+桟	3
+檁	3
+琁	3
+饽	3
+哿	3
+擞	3
+锇	3
+湻	3
+髄	3
+坄	3
+螽	3
+酎	3
+苤	3
+剰	3
+茛	3
+郕	3
+劍	3
+伎	3
+厶	3
+刬	3
+橝	3
+杸	3
+輗	3
+垿	3
+蚍	3
+毬	3
+玡	3
+夌	3
+誤	3
+叅	3
+砫	3
+鴜	3
+崋	3
+軏	3
+湽	3
+勣	3
+圼	3
+樰	3
+値	3
+師	3
+宼	3
+仼	3
+貸	3
+姩	3
+瓅	3
+惦	3
+藝	3
+爲	3
+棷	3
+梀	3
+踇	3
+忭	3
+絔	3
+嗟	3
+耑	3
+欸	3
+僜	3
+帨	3
+亻	3
+篜	3
+閘	3
+曺	3
+谂	3
+鉚	3
+栃	3
+钔	3
+堅	3
+傘	3
+衲	3
+栺	3
+俟	3
+筈	3
+詀	3
+釦	3
+湊	3
+豨	3
+塹	3
+誾	3
+暝	3
+戩	3
+粧	3
+尛	3
+繤	3
+扱	3
+聽	3
+囮	3
+會	3
+诮	3
+悚	3
+咿	3
+黨	3
+荬	3
+貴	3
+讵	3
+鈥	3
+銆	3
+旿	3
+魃	3
+捃	3
+锊	3
+兗	3
+緖	3
+鋭	3
+徜	3
+幀	3
+藨	3
+墪	3
+搌	3
+碕	3
+坰	3
+灣	3
+姵	3
+圊	3
+夐	3
+墀	3
+鳠	3
+橐	3
+涇	3
+鸴	3
+毑	3
+暕	3
+掾	3
+夂	3
+妗	3
+冃	3
+徛	3
+鼯	3
+籀	3
+哏	3
+檠	3
+楢	3
+譽	3
+跚	3
+逴	3
+擬	3
+渖	3
+陳	3
+楡	3
+軋	3
+绁	3
+嘞	3
+蹺	3
+昖	3
+腚	3
+惭	3
+钸	3
+頦	3
+挌	3
+煚	3
+拚	3
+妚	3
+鮡	3
+彽	3
+袚	3
+蠢	3
+臤	3
+嫖	3
+旑	3
+鲯	3
+腦	3
+吆	3
+鈾	3
+曚	3
+镹	3
+嶽	3
+榅	3
+脹	3
+咻	3
+洩	3
+楲	3
+锿	3
+坲	3
+莸	3
+戓	3
+爣	3
+勲	3
+愠	3
+挈	3
+籓	3
+棓	3
+艼	3
+嵹	3
+鋸	3
+緾	3
+礡	3
+蝻	3
+伩	3
+鹬	3
+尨	3
+潪	3
+隠	3
+縱	3
+澣	3
+裬	3
+姳	3
+夅	3
+垍	3
+佷	2
+嶚	2
+鋌	2
+蘩	2
+蓍	2
+脈	2
+嵀	2
+鹴	2
+倷	2
+轷	2
+缊	2
+螠	2
+栁	2
+柖	2
+棡	2
+佫	2
+寤	2
+潄	2
+糗	2
+魰	2
+矅	2
+焺	2
+唷	2
+岍	2
+璪	2
+簊	2
+丌	2
+耠	2
+僬	2
+泒	2
+嗗	2
+詟	2
+禓	2
+禳	2
+寑	2
+趺	2
+嶐	2
+擊	2
+邶	2
+毨	2
+楛	2
+瞵	2
+鳡	2
+磵	2
+驺	2
+岝	2
+潰	2
+榶	2
+葐	2
+禥	2
+峖	2
+秱	2
+赍	2
+绋	2
+楾	2
+砢	2
+麽	2
+挢	2
+繳	2
+耜	2
+陴	2
+缱	2
+搳	2
+腠	2
+鑲	2
+禿	2
+蜺	2
+蘗	2
+躅	2
+癱	2
+憡	2
+獏	2
+蝟	2
+轚	2
+観	2
+鵰	2
+鉬	2
+衆	2
+咹	2
+蚋	2
+忝	2
+媄	2
+曞	2
+欽	2
+嶅	2
+蟎	2
+鏍	2
+兿	2
+亷	2
+醐	2
+漻	2
+簮	2
+磾	2
+霐	2
+掤	2
+庴	2
+躍	2
+砳	2
+莦	2
+漵	2
+栂	2
+濣	2
+鼬	2
+栨	2
+摻	2
+縛	2
+鍔	2
+堺	2
+綌	2
+焴	2
+麐	2
+鍥	2
+鳴	2
+甌	2
+館	2
+咅	2
+湎	2
+鎷	2
+釐	2
+踺	2
+鰼	2
+霦	2
+篑	2
+皁	2
+唎	2
+怄	2
+杦	2
+髀	2
+姖	2
+祘	2
+洟	2
+嚴	2
+翛	2
+渮	2
+睳	2
+髫	2
+怏	2
+罰	2
+漟	2
+綅	2
+礞	2
+犒	2
+煟	2
+蟬	2
+異	2
+剝	2
+鏪	2
+宄	2
+癭	2
+荳	2
+煇	2
+郷	2
+鈭	2
+凈	2
+伃	2
+恿	2
+擺	2
+旽	2
+杴	2
+斒	2
+賦	2
+當	2
+惮	2
+禸	2
+犄	2
+暁	2
+豢	2
+蓱	2
+窺	2
+練	2
+闆	2
+饣	2
+圮	2
+迕	2
+関	2
+瘿	2
+濱	2
+椀	2
+囦	2
+粣	2
+篐	2
+鉆	2
+篩	2
+眈	2
+媕	2
+悻	2
+聲	2
+傛	2
+杅	2
+酲	2
+诟	2
+矦	2
+櫆	2
+宒	2
+嫽	2
+饫	2
+発	2
+誠	2
+夬	2
+踯	2
+埈	2
+繭	2
+讹	2
+槕	2
+徉	2
+飊	2
+鍀	2
+徝	2
+翺	2
+揵	2
+櫡	2
+蹠	2
+鶄	2
+攉	2
+梌	2
+惆	2
+鬻	2
+訓	2
+帄	2
+硾	2
+勢	2
+斻	2
+燹	2
+脷	2
+鈖	2
+簟	2
+坈	2
+衄	2
+缲	2
+笞	2
+鸻	2
+醬	2
+晱	2
+襲	2
+栉	2
+腎	2
+鋇	2
+彳	2
+侘	2
+汦	2
+呠	2
+牚	2
+珋	2
+痍	2
+窸	2
+斶	2
+薶	2
+芣	2
+朾	2
+柩	2
+抷	2
+鳳	2
+峵	2
+朓	2
+馳	2
+冝	2
+鋹	2
+摂	2
+悕	2
+屣	2
+枬	2
+隻	2
+龃	2
+豋	2
+澆	2
+趯	2
+豕	2
+梍	2
+蹒	2
+筚	2
+鉛	2
+煉	2
+丄	2
+鹵	2
+鄫	2
+蹁	2
+冂	2
+唍	2
+訕	2
+靿	2
+妧	2
+覅	2
+抅	2
+袏	2
+棄	2
+蜷	2
+徤	2
+衹	2
+焀	2
+埑	2
+噩	2
+鼢	2
+絼	2
+忼	2
+阌	2
+虼	2
+実	2
+鰍	2
+屻	2
+涥	2
+涙	2
+耢	2
+牖	2
+拊	2
+馔	2
+冡	2
+噫	2
+曇	2
+鮊	2
+罣	2
+壌	2
+麩	2
+牣	2
+驵	2
+峇	2
+踉	2
+掳	2
+簃	2
+苿	2
+芄	2
+貎	2
+勬	2
+鶋	2
+滅	2
+棝	2
+硪	2
+賡	2
+渞	2
+膂	2
+哊	2
+瞐	2
+銳	2
+鋰	2
+脽	2
+嵱	2
+鐤	2
+鐳	2
+衦	2
+様	2
+竂	2
+襖	2
+挿	2
+醮	2
+蘘	2
+嗙	2
+紪	2
+捯	2
+瑋	2
+壽	2
+淿	2
+島	2
+鈞	2
+猢	2
+隺	2
+涼	2
+湨	2
+叏	2
+濆	2
+蕹	2
+羣	2
+燻	2
+鐗	2
+褃	2
+啛	2
+鐼	2
+麃	2
+郛	2
+砠	2
+玞	2
+癖	2
+齋	2
+鑛	2
+铻	2
+顱	2
+挄	2
+祔	2
+籿	2
+跕	2
+跏	2
+繼	2
+窅	2
+楺	2
+嫲	2
+盪	2
+煵	2
+挰	2
+莤	2
+刿	2
+魇	2
+犷	2
+還	2
+梼	2
+靚	2
+樞	2
+胊	2
+鸩	2
+棫	2
+媵	2
+彊	2
+牑	2
+韯	2
+垊	2
+掼	2
+遞	2
+觥	2
+赀	2
+競	2
+暅	2
+諨	2
+踅	2
+漶	2
+濊	2
+谥	2
+鮜	2
+嚇	2
+緩	2
+縋	1
+複	1
+涫	1
+喚	1
+愯	1
+栘	1
+兌	1
+绲	1
+陜	1
+幞	1
+貹	1
+仦	1
+蔲	1
+啇	1
+牞	1
+盝	1
+忺	1
+嬡	1
+葯	1
+洭	1
+顳	1
+紀	1
+澒	1
+騤	1
+逫	1
+楉	1
+櫒	1
+耋	1
+櫃	1
+忿	1
+汖	1
+偎	1
+塂	1
+駕	1
+幫	1
+醑	1
+塣	1
+錣	1
+侅	1
+溓	1
+垶	1
+孮	1
+馺	1
+嬾	1
+烋	1
+歴	1
+疎	1
+鼑	1
+萞	1
+祌	1
+荌	1
+訄	1
+梾	1
+柕	1
+祓	1
+槅	1
+兟	1
+隒	1
+洔	1
+莩	1
+笓	1
+甿	1
+禎	1
+鲥	1
+忂	1
+堟	1
+曬	1
+妳	1
+潙	1
+璥	1
+梴	1
+瘁	1
+眦	1
+猾	1
+脰	1
+錚	1
+湆	1
+臯	1
+稲	1
+梩	1
+釹	1
+绠	1
+敠	1
+袿	1
+偑	1
+墼	1
+謀	1
+匤	1
+揎	1
+霂	1
+遫	1
+惪	1
+敗	1
+瀲	1
+軽	1
+呮	1
+伧	1
+蔈	1
+鋠	1
+瘛	1
+扙	1
+呓	1
+緢	1
+隱	1
+鳂	1
+姼	1
+渁	1
+銦	1
+碏	1
+迚	1
+揸	1
+堈	1
+翉	1
+傾	1
+凵	1
+幪	1
+恔	1
+俳	1
+胩	1
+頑	1
+漁	1
+彍	1
+抦	1
+虮	1
+睚	1
+瘔	1
+缁	1
+樸	1
+尪	1
+顒	1
+軒	1
+伻	1
+睇	1
+濨	1
+屝	1
+墝	1
+矂	1
+検	1
+銃	1
+璍	1
+拸	1
+鮨	1
+嬰	1
+鉺	1
+艅	1
+伓	1
+阕	1
+卩	1
+鯷	1
+窬	1
+墹	1
+梛	1
+舉	1
+峢	1
+跣	1
+龠	1
+娢	1
+杌	1
+鴛	1
+輻	1
+眏	1
+鑁	1
+厫	1
+鐀	1
+醱	1
+猃	1
+枃	1
+鍫	1
+鑰	1
+扟	1
+憜	1
+庺	1
+倅	1
+亙	1
+晲	1
+敩	1
+崍	1
+詈	1
+喑	1
+貵	1
+汏	1
+闄	1
+竢	1
+瀴	1
+塺	1
+稃	1
+頋	1
+氭	1
+揮	1
+靆	1
+慬	1
+讠	1
+榿	1
+睞	1
+騠	1
+棌	1
+孫	1
+龅	1
+鍋	1
+釨	1
+階	1
+磚	1
+鄗	1
+薀	1
+飺	1
+抆	1
+粨	1
+漿	1
+欵	1
+砑	1
+刎	1
+庝	1
+崌	1
+寗	1
+觑	1
+蔃	1
+痞	1
+齻	1
+羭	1
+墄	1
+濓	1
+笵	1
+垀	1
+峸	1
+诓	1
+駉	1
+駸	1
+觳	1
+陖	1
+鱄	1
+汿	1
+飑	1
+踣	1
+楖	1
+窧	1
+傒	1
+剛	1
+汸	1
+魍	1
+鈷	1
+敫	1
+勆	1
+榖	1
+彔	1
+礪	1
+凄	1
+釭	1
+談	1
+荵	1
+擾	1
+珬	1
+暯	1
+礒	1
+榇	1
+潶	1
+礬	1
+湰	1
+豎	1
+穈	1
+鱇	1
+褙	1
+縯	1
+贔	1
+褆	1
+酄	1
+覺	1
+鍂	1
+滛	1
+痐	1
+迏	1
+腼	1
+灬	1
+熂	1
+綸	1
+縻	1
+羸	1
+鼰	1
+踴	1
+燓	1
+揑	1
+觚	1
+揍	1
+該	1
+週	1
+晸	1
+圁	1
+戯	1
+賄	1
+鏑	1
+掕	1
+錄	1
+梏	1
+紑	1
+揳	1
+違	1
+睶	1
+椥	1
+纥	1
+訟	1
+筶	1
+桾	1
+瓨	1
+歃	1
+枙	1
+暤	1
+獨	1
+駝	1
+吶	1
+鹪	1
+箤	1
+託	1
+訸	1
+嵠	1
+柆	1
+梲	1
+铓	1
+癃	1
+籨	1
+腫	1
+宻	1
+鐨	1
+澷	1
+凖	1
+琓	1
+穏	1
+筅	1
+爝	1
+裏	1
+浟	1
+畊	1
+籵	1
+凘	1
+锳	1
+裟	1
+閒	1
+焧	1
+毘	1
+穎	1
+煳	1
+劇	1
+裨	1
+汎	1
+鄪	1
+貢	1
+帰	1
+蠋	1
+鎵	1
+魯	1
+怙	1
+炲	1
+涽	1
+拡	1
+瑒	1
+漮	1
+曱	1
+粔	1
+塁	1
+謬	1
+菶	1
+媌	1
+輞	1
+畨	1
+眝	1
+拝	1
+鵷	1
+戋	1
+铴	1
+撚	1
+帳	1
+鐓	1
+岾	1
+刋	1
+蔀	1
+伅	1
+貯	1
+亜	1
+笯	1
+哳	1
+祫	1
+槸	1
+搙	1
+坿	1
+谪	1
+螣	1
+薿	1
+蛃	1
+鲱	1
+媂	1
+嫰	1
+橎	1
+鎣	1
+圄	1
+簺	1
+覌	1
+咣	1
+瓔	1
+枔	1
+枺	1
+縩	1
+唠	1
+掟	1
+吽	1
+埧	1
+蚽	1
+嫕	1
+眕	1
+懊	1
+俒	1
+兘	1
+廝	1
+揬	1
+稈	1
+痷	1
+斾	1
+艦	1
+屽	1
+鶼	1
+崡	1
+瞠	1
+敎	1
+擔	1
+踽	1
+崊	1
+晳	1
+攵	1
+鍖	1
+瑫	1
+朌	1
+坺	1
+惘	1
+聞	1
+凍	1
+饔	1
+鍦	1
+疳	1
+膽	1
+纄	1
+淰	1
+椇	1
+攬	1
+倆	1
+茷	1
+悊	1
+硁	1
+硤	1
+埆	1
+鮟	1
+舤	1
+雰	1
+茇	1
+遹	1
+湠	1
+啳	1
+堾	1
+厐	1
+虿	1
+懔	1
+烳	1
+秊	1
+織	1
+鎻	1
+攃	1
+豬	1
+垨	1
+踮	1
+畞	1
+阠	1
+琣	1
+熆	1
+筍	1
+蔥	1
+鴿	1
+彫	1
+憙	1
+珗	1
+疊	1
+槁	1
+駆	1
+嘠	1
+瞑	1
+袺	1
+簀	1
+哜	1
+鳐	1
+暈	1
+埾	1
+冦	1
+蹚	1
+矼	1
+冏	1
+鍺	1
+鄭	1
+鮪	1
+臥	1
+齊	1
+玔	1
+柊	1
+蹿	1
+媸	1
+鎗	1
+峈	1
+畤	1
+喣	1
+瑈	1
+囷	1
+籠	1
+瀬	1
+嬲	1
+杬	1
+頰	1
+涀	1
+鳥	1
+殑	1
+錘	1
+鱗	1
+愰	1
+嬫	1
+鍘	1
+灥	1
+圽	1
+醅	1
+嘨	1
+澦	1
+冨	1
+栭	1
+柈	1
+経	1
+癍	1
+嶆	1
+壩	1
+剷	1
+綂	1
+隑	1
+焐	1
+秂	1
+璈	1
+灴	1
+刄	1
+忓	1
+櫵	1
+枆	1
+幜	1
+枴	1
+恝	1
+匜	1
+溲	1
+窛	1
+呒	1
+檍	1
+慶	1
+迿	1
+飩	1
+乇	1
+嶸	1
+勁	1
+忚	1
+捜	1
+隃	1
+瘡	1
+廼	1
+泑	1
+韛	1
+窣	1
+穜	1
+缧	1
+銨	1
+詁	1
+靣	1
+侭	1
+洓	1
+揄	1
+祿	1
+嗬	1
+韓	1
+吠	1
+瓞	1
+婈	1
+鄮	1
+賃	1
+矚	1
+櫧	1
+檄	1
+摬	1
+檇	1
+缣	1
+鞒	1
+湇	1
+忉	1
+鏉	1
+慫	1
+滳	1
+亣	1
+狈	1
+醝	1
+薙	1
+湁	1
+昘	1
+幗	1
+仺	1
+煬	1
+暙	1
+誼	1
+醭	1
+昻	1
+崶	1
+勮	1
+習	1
+譯	1
+鍒	1
+巸	1
+蝪	1
+掎	1
+祅	1
+镚	1
+恆	1
+鈴	1
+騛	1
+碫	1
+唨	1
+鏐	1
+牻	1
+蹸	1
+睒	1
+巟	1
+蠔	1
+秌	1
+夎	1
+晹	1
+鐭	1
+謩	1
+拫	1
+遲	1
+悾	1
+垷	1
+綫	1
+鍨	1
+癯	1
+讣	1
+錋	1
+巺	1
+寵	1
+昞	1
+恊	1
+曧	1
+愭	1
+龉	1
+慣	1
+媱	1
+拰	1
+廇	1
+厈	1
+谘	1
+搢	1
+朣	1
+彘	1
+鏻	1
+垺	1
+眛	1

+ 11 - 4
udpcreateindex/src/config.json

@@ -13,7 +13,8 @@
     "addr": "192.168.3.207:27092",
     "size": 10,
     "db": "wjh",
-    "collect": "extract"
+    "collect": "extract",
+    "collect1": ""
   },
   "mgo_qyxy": {
     "addr": "192.168.3.207",
@@ -51,15 +52,21 @@
     }
   },
   "elastic_1": {
-    "addr": "http://127.0.0.1:9800",
+    "addr": "http://192.168.3.206:9800",
     "pool": 12,
     "label": "旧es集群库"
   },
   "elastic_2": {
-    "addr": "http://127.0.0.1:19800",
+    "addr": "http://192.168.3.206:9800",
     "pool": 12,
     "label": "新es集群库"
   },
+  "nsq_id": {
+    "addr": "192.168.3.166:4150",
+    "topic": "project-id",
+    "channel": "EsIndex",
+    "concurrent": 1
+  },
   "bidding_index": {
     "index": "bidding_v2",
     "type": "bidding",
@@ -73,7 +80,7 @@
       "projectinfo": "", "purchasing": "string", "purchasinglist": "", "channel": "string", "winnerorder": "", "project_scale": "string", "project_duration": "int32", "project_timeunit": "string",
       "project_startdate": "int64", "project_completedate": "int64", "payway": "string", "contract_guarantee": "bool", "bid_guarantee": "bool", "qualifies": "", "entidlist": "", "funds": "string",
       "review_experts": "", "bidmethod": "string", "bidendtime": "int64", "bidopenaddress": "string", "docamount": "float64", "agencyrate": "float64", "agencyfee": "float64", "bidway": "string",
-      "getdocmethod": "string", "china_bidding": "string", "purchasing_tag": "string", "multipackage": "int32"
+      "getdocmethod": "string", "china_bidding": "string", "purchasing_tag": "string", "multipackage": "int32", "isValidFile": "bool"
     },
     "mgofields": "buyerzipcode,winnertel,winnerperson,contractcode,winneraddr,agencyaddr,buyeraddr,signaturedate,projectperiod,projectaddr,agencytel,agencyperson,buyerperson,agency,projectscope,projectcode,bidopentime,supervisorrate,buyertel,bidamount,winner,buyer,budget,projectname,buyerclass,topscopeclass,s_topscopeclass,area,city,district,s_winner,toptype,subtype,subscopeclass,s_subscopeclass,dataging,winnerorder,project_scale,project_duration,project_timeunit,project_startdate,project_completedate, payway,contract_guarantee,bid_guarantee,qualifies,funds,review_experts,bidmethod,bidendtime,bidopenaddress,docamount,bidway,agencyrate,agencyfee,getdocmethod,purchasing_tag",
     "projectinfomap": {

+ 199 - 0
udpcreateindex/src/file.go

@@ -0,0 +1,199 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"io"
+	"os"
+	qu "qfw/util"
+	"regexp"
+	"strconv"
+	"strings"
+)
+
+var (
+	CmmonDFA        *DFA                                             //常用字
+	NotCommonDFA    *DFA                                             //不常用字
+	TimesLimit      int                                              //常用字界限
+	CmmLmt, NcmmLmt float64                                          //更新界限
+	HanReg          = regexp.MustCompile("[\u4e00-\u9fa5]+")         //中文正则
+	SpaceReg        = regexp.MustCompile("[\\s\u3000\u2003\u00a0]+") //空格正则
+	SpecialReg      = regexp.MustCompile("图片(\\d)+")                 //
+)
+
+func InitFileInfo() {
+	TimesLimit = 500
+	CmmLmt = 0.5
+	NcmmLmt = 0.1
+	CmmonDFA = &DFA{}
+	NotCommonDFA = &DFA{}
+	LoadDict("common.txt") //初始化常用字典
+}
+
+//DFA
+type DFA struct {
+	Link map[string]interface{}
+}
+
+func (d *DFA) AddWord(keys ...string) {
+	d.AddWordAll(true, keys...)
+}
+func (d *DFA) AddWordAll(haskey bool, keys ...string) {
+	if d.Link == nil {
+		d.Link = make(map[string]interface{})
+	}
+	for _, key := range keys {
+		nowMap := &d.Link
+		for i := 0; i < len(key); i++ {
+			kc := key[i : i+1]
+			if v, ok := (*nowMap)[kc]; ok {
+				nowMap, _ = v.(*map[string]interface{})
+			} else {
+				newMap := map[string]interface{}{}
+				newMap["YN"] = "0"
+				(*nowMap)[kc] = &newMap
+				nowMap = &newMap
+			}
+			if i == len(key)-1 {
+				(*nowMap)["YN"] = "1"
+				if haskey {
+					(*nowMap)["K"] = key
+				}
+			}
+		}
+	}
+}
+
+func (d *DFA) CheckSensitiveWord(src string) []string {
+	res := make([]string, 0)
+	for j := 0; j < len(src); j++ {
+		nowMap := &d.Link
+		for i := j; i < len(src); i++ {
+			word := src[i : i+1]
+			nowMap, _ = (*nowMap)[word].(*map[string]interface{})
+			if nowMap != nil { // 存在,则判断是否为最后一个
+				if "1" == qu.ObjToString((*nowMap)["YN"]) {
+					s := qu.ObjToString((*nowMap)["K"])
+					res = append(res, s)
+				}
+			} else {
+				break
+			}
+		}
+	}
+	return res
+}
+
+//加载统计的常用词
+func LoadDict(path string) {
+	dictFile, err := os.Open(path)
+	if err != nil {
+		qu.Debug("Load Common.txt Error")
+		os.Exit(-1)
+	}
+	defer dictFile.Close()
+	reader := bufio.NewReader(dictFile)
+	var (
+		text      string
+		frequency int
+	)
+
+	// 逐行读入分词
+	line := 0
+	for {
+		line++
+		size, fsErr := fmt.Fscanln(reader, &text, &frequency) //读每行赋值
+		if fsErr == io.EOF {                                  //读取到结尾
+			break
+		}
+		if size == 2 { //正确数据
+			if frequency >= TimesLimit { //常用字
+				CmmonDFA.AddWord(text)
+			} else { //非常用字
+				NotCommonDFA.AddWord(text)
+			}
+		} else {
+			qu.Debug("Read Line Error:", line)
+		}
+	}
+}
+
+//解析附件
+func AnalysisFile(filetext string) bool {
+	defer qu.Catch()
+	//过滤空格
+	filetextTmp := SpaceReg.ReplaceAllString(filetext, "")
+	if filetextTmp == "" { //附件为空
+		return false
+	}
+	//特殊情况:图片0 图片1
+	filetextTmp = SpecialReg.ReplaceAllString(filetextTmp, "")
+	if filetextTmp == "" { //附件为空
+		return false
+	}
+	//中文匹配
+	HanArr := HanReg.FindAllString(filetextTmp, -1)
+	hanText := strings.Join(HanArr, "")
+	hanTextLen := len([]rune(hanText))
+	//长度过滤
+	if hanTextLen <= 100 {
+		return false
+	}
+	//qu.Debug(hanTextLen, hanText)
+	commonArr := CmmonDFA.CheckSensitiveWord(hanText)
+	commonLen := len(commonArr)
+	//qu.Debug(commonLen, commonArr)
+	//commonText := strings.Join(commonArr, "")
+	notCommonArr := NotCommonDFA.CheckSensitiveWord(hanText)
+	notCommonLen := len(notCommonArr)
+	//qu.Debug(notCommonLen, notCommonArr)
+	//解析常用字和非常用字占比(由于常用字或非常用字集不全,会导致比例相加不为100%)
+	commonRatio := float64(commonLen) / float64(hanTextLen)
+	commonRatio, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", commonRatio), 64)
+	//qu.Debug(commonRatio)
+	notCommonRatio := float64(notCommonLen) / float64(hanTextLen)
+	notCommonRatio, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", notCommonRatio), 64)
+	if commonRatio >= CmmLmt && notCommonRatio < NcmmLmt {
+		return true
+	}
+	return false
+}
+
+//测试方法
+func AnalysisFileTest(detail string) (bool, string, int, float64, float64) {
+	//qu.Debug(detail)
+	defer qu.Catch()
+	//过滤空格
+	filetextTmp := SpaceReg.ReplaceAllString(detail, "")
+	if filetextTmp == "" { //附件为空
+		return false, "", 0, 0, 0
+	}
+	//特殊情况:图片0 图片1
+	filetextTmp = SpecialReg.ReplaceAllString(filetextTmp, "")
+	if filetextTmp == "" { //附件为空
+		return false, "", 1, 0, 0
+	}
+	//中文匹配
+	HanArr := HanReg.FindAllString(filetextTmp, -1)
+	hanText := strings.Join(HanArr, "")
+	hanTextLen := len([]rune(hanText))
+	//长度过滤
+	if hanTextLen <= 100 {
+		return false, "", 2, 0, 0
+	}
+	//qu.Debug(textLen, text)
+	commonArr := CmmonDFA.CheckSensitiveWord(hanText)
+	commonLen := len(commonArr)
+	qu.Debug(commonLen, commonArr)
+	//commonText := strings.Join(commonArr, "")
+	notCommonArr := NotCommonDFA.CheckSensitiveWord(hanText)
+	notCommonLen := len(notCommonArr)
+	qu.Debug(notCommonLen, notCommonArr)
+	//notCommonText := strings.Join(notCommonArr, "")
+	//解析常用字和非常用字占比(由于常用字或非常用字集不全,会导致比例相加不为100%)
+	commonRatio := float64(commonLen) / float64(hanTextLen)
+	commonRatio, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", commonRatio), 64)
+	notCommonRatio := float64(notCommonLen) / float64(hanTextLen)
+	notCommonRatio, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", notCommonRatio), 64)
+	return true, filetextTmp, 10, commonRatio, notCommonRatio
+}

+ 12 - 7
udpcreateindex/src/init.go

@@ -21,7 +21,7 @@ var (
 	projectMgo  *mongodb.MongodbSim
 	standardMgo *mongodb.MongodbSim
 
-	Es1 *elastic.Elastic
+	//Es1 *elastic.Elastic
 	Es2 *elastic.Elastic
 
 	currentColl string
@@ -41,11 +41,13 @@ var (
 	saveEsPool        chan map[string]interface{}
 	saveEsAllPool     chan map[string]interface{}
 	saveEsElsePool    chan map[string]interface{}
+	saveProjectEsPool chan map[string]interface{}
 	updateBiddingSp   chan bool
 	updateExtractSp   chan bool
 	saveEsSp          chan bool
 	saveEsAllSp       chan bool
 	saveEsElseSp      chan bool
+	saveProjectSp     chan bool
 
 	JyUdpAddr *net.UDPAddr
 
@@ -118,13 +120,13 @@ func init() {
 	}
 	standardMgo.InitPool()
 
-	econf1 := Sysconfig["elastic_1"].(map[string]interface{})
+	//econf1 := Sysconfig["elastic_1"].(map[string]interface{})
 	//esNode = econf1["node"].(string)
-	Es1 = &elastic.Elastic{
-		S_esurl: econf1["addr"].(string),
-		I_size:  util.IntAllDef(econf1["pool"], 5),
-	}
-	Es1.InitElasticSize()
+	//Es1 = &elastic.Elastic{
+	//	S_esurl: econf1["addr"].(string),
+	//	I_size:  util.IntAllDef(econf1["pool"], 5),
+	//}
+	//Es1.InitElasticSize()
 
 	econf2 := Sysconfig["elastic_2"].(map[string]interface{})
 	Es2 = &elastic.Elastic{
@@ -148,6 +150,7 @@ func init() {
 	initCheckCity()
 	//初始化oss
 	u.InitOss()
+	InitFileInfo()
 
 	m := Sysconfig["jyfb_udp"].(map[string]interface{})
 	JyUdpAddr = &net.UDPAddr{
@@ -165,6 +168,8 @@ func init() {
 	saveEsAllSp = make(chan bool, 5)
 	saveEsElsePool = make(chan map[string]interface{}, 5000)
 	saveEsElseSp = make(chan bool, 5)
+	saveProjectEsPool = make(chan map[string]interface{}, 5000)
+	saveProjectSp = make(chan bool, 5)
 }
 
 func NewTk(m map[string]interface{}) *TaskInfo {

+ 91 - 13
udpcreateindex/src/main.go

@@ -2,16 +2,24 @@ package main
 
 import (
 	"encoding/json"
+	"fmt"
 	"io/ioutil"
 	"log"
 	mu "mfw/util"
+	"mongodb"
 	"net"
 	"net/http"
+	nsq "nsq"
 	"qfw/util"
 	"qfw/util/redis"
+	"strings"
 	"time"
 )
 
+var (
+	Mcmer *nsq.Consumer
+)
+
 func main() {
 	// company_id
 	redis.InitRedis1("qyxy_id=172.17.4.189:8379", 4)
@@ -21,11 +29,14 @@ func main() {
 	go checkMapJob()
 	go task_index()
 
+	go nsqMethod()
+
 	go UpdateBidding()
 	go UpdateExtract()
 	go SaveEsMethod()
 	go SaveAllEsMethod()
 	go SaveElseEsMethod()
+	go SaveProjectEs()
 	updport := Sysconfig["udpport"].(string)
 	udpclient = mu.UdpClient{Local: updport, BufSize: 1024}
 	udpclient.Listen(processUdpMsg)
@@ -231,17 +242,17 @@ func SaveEsMethod() {
 		case v := <-saveEsPool:
 			arru[indexu] = v
 			indexu++
-			if indexu == 200 {
+			if indexu == EsBulkSize {
 				saveEsSp <- true
 				go func(arru []map[string]interface{}) {
 					defer func() {
 						<-saveEsSp
 					}()
-					Es1.BulkSave(util.ObjToString(biddingIndex["index"]), util.ObjToString(biddingIndex["type"]), &arru, true)
+					//Es1.BulkSave(util.ObjToString(biddingIndex["index"]), util.ObjToString(biddingIndex["type"]), &arru, true)
 					Es2.BulkSave(util.ObjToString(biddingIndex["index"]), util.ObjToString(biddingIndex["type"]), &arru, true)
-					if len(multiIndex) == 2 {
-						Es1.BulkSave(multiIndex[0], multiIndex[1], &arru, true)
-					}
+					//if len(multiIndex) == 2 {
+					//	Es1.BulkSave(multiIndex[0], multiIndex[1], &arru, true)
+					//}
 				}(arru)
 				arru = make([]map[string]interface{}, EsBulkSize)
 				indexu = 0
@@ -253,11 +264,11 @@ func SaveEsMethod() {
 					defer func() {
 						<-saveEsSp
 					}()
-					Es1.BulkSave(util.ObjToString(biddingIndex["index"]), util.ObjToString(biddingIndex["type"]), &arru, true)
+					//Es1.BulkSave(util.ObjToString(biddingIndex["index"]), util.ObjToString(biddingIndex["type"]), &arru, true)
 					Es2.BulkSave(util.ObjToString(biddingIndex["index"]), util.ObjToString(biddingIndex["type"]), &arru, true)
-					if len(multiIndex) == 2 {
-						Es1.BulkSave(multiIndex[0], multiIndex[1], &arru, true)
-					}
+					//if len(multiIndex) == 2 {
+					//	Es1.BulkSave(multiIndex[0], multiIndex[1], &arru, true)
+					//}
 				}(arru[:indexu])
 				arru = make([]map[string]interface{}, EsBulkSize)
 				indexu = 0
@@ -274,7 +285,7 @@ func SaveElseEsMethod() {
 		case v := <-saveEsElsePool:
 			arru[indexu] = v
 			indexu++
-			if indexu == 200 {
+			if indexu == EsBulkSize {
 				saveEsElseSp <- true
 				go func(arru []map[string]interface{}) {
 					defer func() {
@@ -309,13 +320,13 @@ func SaveAllEsMethod() {
 		case v := <-saveEsAllPool:
 			arru[indexu] = v
 			indexu++
-			if indexu == 200 {
+			if indexu == EsBulkSize {
 				saveEsAllSp <- true
 				go func(arru []map[string]interface{}) {
 					defer func() {
 						<-saveEsAllSp
 					}()
-					Es1.BulkSave("bidding_all", "bidding", &arru, true)
+					Es2.BulkSave("biddingall", "bidding", &arru, true)
 				}(arru)
 				arru = make([]map[string]interface{}, EsBulkSize)
 				indexu = 0
@@ -327,7 +338,44 @@ func SaveAllEsMethod() {
 					defer func() {
 						<-saveEsAllSp
 					}()
-					Es1.BulkSave("bidding_all", "bidding", &arru, true)
+					Es2.BulkSave("biddingall", "bidding", &arru, true)
+				}(arru[:indexu])
+				arru = make([]map[string]interface{}, EsBulkSize)
+				indexu = 0
+			}
+		}
+	}
+}
+
+func SaveProjectEs() {
+	arru := make([]map[string]interface{}, EsBulkSize)
+	indexu := 0
+	for {
+		select {
+		case v := <-saveProjectEsPool:
+			arru[indexu] = v
+			indexu++
+			if indexu == EsBulkSize {
+				saveProjectSp <- true
+				go func(arru []map[string]interface{}) {
+					defer func() {
+						<-saveProjectSp
+					}()
+					//Es1.BulkSave(util.ObjToString(project["index"]), util.ObjToString(project["type"]), &arru, true)
+					Es2.BulkSave(util.ObjToString(project["index"]), util.ObjToString(project["type"]), &arru, true)
+				}(arru)
+				arru = make([]map[string]interface{}, EsBulkSize)
+				indexu = 0
+			}
+		case <-time.After(1000 * time.Millisecond):
+			if indexu > 0 {
+				saveProjectSp <- true
+				go func(arru []map[string]interface{}) {
+					defer func() {
+						<-saveProjectSp
+					}()
+					//Es1.BulkSave(util.ObjToString(project["index"]), util.ObjToString(project["type"]), &arru, true)
+					Es2.BulkSave(util.ObjToString(project["index"]), util.ObjToString(project["type"]), &arru, true)
 				}(arru[:indexu])
 				arru = make([]map[string]interface{}, EsBulkSize)
 				indexu = 0
@@ -406,3 +454,33 @@ func UpdateExtract() {
 		}
 	}
 }
+
+// @Description nsq处理id不变,内容替换的竞品数据
+// @Author J 2022/8/10 11:40
+func nsqMethod() {
+	cof := Sysconfig["nsq_id"].(map[string]interface{})
+	var err error
+	Mcmer, err = nsq.NewConsumer(&nsq.Cconfig{
+		IsJsonEncode: true, //与生产者配置对应,设为true会取第1个字节进行类型判断
+		Addr:         util.ObjToString(cof["addr"]),
+		ConnectType:  0, //默认连接nsqd
+		Topic:        util.ObjToString(cof["topic"]),
+		Channel:      util.ObjToString(cof["channel"]),
+		Concurrent:   util.IntAllDef(cof["concurrent"], 1), //并发数
+	})
+	if err != nil {
+		util.Debug("nsqMethod err: ", err.Error())
+	}
+	for {
+		select {
+		case obj := <-Mcmer.Ch: //从通道读取即可
+			util.Debug("index nsq: " + fmt.Sprint(obj))
+			id := strings.Split(util.ObjToString(obj), "=")
+			if mongodb.IsObjectIdHex(id[1]) {
+				taskinfo(id[1])
+			} else {
+				util.Debug("jy nsq id err: ", id[1])
+			}
+		}
+	}
+}

+ 92 - 0
udpcreateindex/src/nsq/consumer.go

@@ -0,0 +1,92 @@
+package gonsq
+
+import (
+	"encoding/json"
+	"strings"
+	"time"
+
+	"github.com/nsqio/go-nsq"
+)
+
+type Consumer struct {
+	Ch           chan interface{}
+	C            *nsq.Consumer
+	Topic        string
+	Channel      string
+	IsJsonEncode bool
+	Conf         *Cconfig
+}
+
+type Cconfig struct {
+	IsJsonEncode         bool   //是否进行json序列化,解码也进行序列化,默认不进行json序列化
+	ConnectType          int    //连接类型 0连nsqd 1连nsqlookup
+	Interval             int    //设置服务发现的轮询时间,例如新的nsq出现,默认10秒
+	Addr, Topic, Channel string //连接地址(支持逗号分割多个),主题,通道
+	Concurrent           int    //并发数,默认为1
+}
+
+//处理消息
+func (c *Consumer) HandleMessage(msg *nsq.Message) error {
+	if c.IsJsonEncode {
+		if len(msg.Body) > 1 {
+			var err error
+			switch msg.Body[0] {
+			case 0x00:
+				var obj interface{}
+				err = json.Unmarshal(msg.Body[1:], &obj)
+				if err == nil && obj != nil {
+					c.Ch <- obj
+				}
+			case 0x01: //[]byte数组
+				var obj []byte
+				err = json.Unmarshal(msg.Body[1:], &obj)
+				if err == nil && obj != nil {
+					c.Ch <- obj
+				}
+			default:
+				var obj interface{}
+				err = json.Unmarshal(msg.Body, &obj)
+				if err == nil && obj != nil {
+					c.Ch <- obj
+				}
+			}
+			return err
+		}
+	} else {
+		c.Ch <- msg.Body
+	}
+	return nil
+}
+
+func NewConsumer(cc *Cconfig) (*Consumer, error) {
+	cfg := nsq.NewConfig()
+	if cc.Interval == 0 {
+		cc.Interval = 10
+	}
+	cfg.LookupdPollInterval = time.Duration(cc.Interval) * time.Second //设置服务发现的轮询时间,例如新的nsq出现
+	c, err := nsq.NewConsumer(cc.Topic, cc.Channel, cfg)               // 新建一个消费者
+	if err != nil {
+		return nil, err
+	}
+	if cc.Concurrent == 0 {
+		cc.Concurrent = 1
+	}
+	consumer := &Consumer{make(chan interface{}, cc.Concurrent), c, cc.Topic, cc.Channel, cc.IsJsonEncode, cc}
+	c.AddConcurrentHandlers(consumer, cc.Concurrent) // 添加消费者接口
+	addrs := strings.Split(cc.Addr, ",")
+	var err1 error
+	if cc.ConnectType == 0 {
+		err1 = c.ConnectToNSQDs(addrs)
+	} else if cc.ConnectType == 1 {
+		err1 = c.ConnectToNSQLookupds(addrs)
+	}
+	return consumer, err1
+}
+
+//处理消息
+func (c *Consumer) Close(msg *nsq.Message) error {
+	if c.Conf.ConnectType == 1 {
+		return c.C.DisconnectFromNSQLookupd(c.Conf.Addr)
+	}
+	return c.C.DisconnectFromNSQD(c.Conf.Addr)
+}

+ 51 - 0
udpcreateindex/src/nsq/producer.go

@@ -0,0 +1,51 @@
+package gonsq
+
+import (
+	"encoding/json"
+	"errors"
+
+	"github.com/nsqio/go-nsq"
+)
+
+type Producer struct {
+	//Ch    chan interface{}
+	P            *nsq.Producer
+	Topic        string
+	IsJsonEncode bool //是否进行json序列化,如果否则必须以[]byte传递,如果是则必须用对应的消费者对象[也设置了序列化]处理
+}
+
+func NewProducer(addr, toppic string, IsJsonEncode bool) (*Producer, error) {
+	config := nsq.NewConfig()
+	producer, err := nsq.NewProducer(addr, config)
+	if err != nil {
+		return nil, err
+	} else {
+		return &Producer{producer, toppic, IsJsonEncode}, nil
+	}
+}
+
+func (p *Producer) Publish(msg interface{}) error {
+	if p.IsJsonEncode {
+		//var infoType byte
+		//switch msg.(type) {
+		//case []byte: //原本就是byte数组
+		//	infoType = 0x01
+		//default:
+		//	infoType = 0x00
+		//}
+		data, err := json.Marshal(msg)
+		if err != nil {
+			return err
+		} else if len(data) > 0 { //头部插入类型,用于解码[]byte
+			//data = append([]byte{infoType}, data...)
+			return p.P.Publish(p.Topic, data)
+		} else {
+			return errors.New("producer msg err")
+		}
+	} else { //必须传入[]byte
+		if bs, ok := msg.([]byte); ok {
+			return p.P.Publish(p.Topic, bs)
+		}
+		return errors.New("producer msg err: no []byte")
+	}
+}

+ 13 - 38
udpcreateindex/src/projectindex.go

@@ -1,12 +1,10 @@
 package main
 
 import (
-	"log"
 	"math"
 	mgov "mongodb"
 	"qfw/util"
 	"strconv"
-	"time"
 )
 
 func projectTask(data []byte, project, mapInfo map[string]interface{}) {
@@ -37,19 +35,13 @@ func projectTask(data []byte, project, mapInfo map[string]interface{}) {
 	conn := projectMgo.GetMgoConn()
 	defer projectMgo.DestoryMongoConn(conn)
 	c, _ := project["collect"].(string)
-	index, _ := project["index"].(string)
-	itype, _ := project["type"].(string)
 	count, _ := conn.DB(projectMgo.DbName).C(c).Find(&q).Count()
-	savepool := make(chan bool, 10)
-
-	log.Println(c, "查询语句:", q, "同步总数:", count, "elastic库:", index, q["pici"])
+	util.Debug(c, "查询语句:", q, "同步总数:", count, "elastic库:", q["pici"])
 	query := conn.DB(projectMgo.DbName).C(c).Find(q).Iter()
-	arr := make([]map[string]interface{}, MgoBulkSize)
-	var n int
-	i := 0
-	for tmp := make(map[string]interface{}); query.Next(tmp); i++ {
-		if n%10000 == 0 {
-			log.Println("current---------", n)
+	n := 0
+	for tmp := make(map[string]interface{}); query.Next(tmp); n++ {
+		if n%20000 == 0 {
+			util.Debug("current---------", n)
 		}
 		pp := map[string]map[string]interface{}{}
 		if packages, ok := tmp["package"].(map[string]interface{}); ok {
@@ -179,33 +171,16 @@ func projectTask(data []byte, project, mapInfo map[string]interface{}) {
 		//			tmp["bidamount"] = nil
 		//		}
 		//go IS.Add("project")
-		tmp["s_projectname"] = tmp["projectname"]
-		arr[i] = tmp
-		n++
-		if i == MgoBulkSize-1 {
-			savepool <- true
-			tmps := arr
-			go func(tmpn *[]map[string]interface{}) {
-				defer func() {
-					<-savepool
-				}()
-				if StopFlag {
-					util.Debug("es队列紧张,暂停10s执行")
-					time.Sleep(time.Second * 10)
-				}
-				Es1.BulkSave(index, itype, tmpn, true)
-			}(&tmps)
-			i = 0
-			arr = make([]map[string]interface{}, MgoBulkSize)
+
+		if tmp["bidamount"] != nil && util.Float64All(tmp["bidamount"]) > 1000000000 {
+			delete(tmp, "bidamount")
 		}
-		if n%MgoBulkSize == 1000 {
-			log.Println("当前:", n)
+		if tmp["budget"] != nil && util.Float64All(tmp["budget"]) > 1000000000 {
+			delete(tmp, "budget")
 		}
+		tmp["s_projectname"] = tmp["projectname"]
+		saveProjectEsPool <- tmp
 		tmp = make(map[string]interface{})
 	}
-
-	if i > 0 {
-		Es1.BulkSave(index, itype, &arr, true)
-	}
-	log.Println(mapInfo, "create project index...over", n)
+	util.Debug(mapInfo, "create project index...over", n)
 }

+ 1 - 0
udpcreateindex/src/task.go

@@ -7,6 +7,7 @@ import (
 )
 
 func task_index() {
+
 	c := cron.New()
 	//c.AddFunc("20 30 5 * * *", func() { task_projects() })
 	//c.AddFunc("0 30 * * * *", func() { task_biddingfile() }) //每30分钟执行一次

+ 15 - 0
udpcreateindex/src/util/ossclient.go

@@ -49,3 +49,18 @@ func OssGetObject(objectName string) string {
 	}
 	return string(data)
 }
+
+func OssObjExists(bname, fid string) bool {
+	util.Catch()
+	// 获取存储空间。
+	bucket, err := ossclient.Bucket(bname)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	// 判断文件是否存在。
+	isExist, err := bucket.IsObjectExist(fid)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	return isExist
+}

+ 7 - 5
udpcreateindex/src/winnertask.go

@@ -27,8 +27,8 @@ func winnerEsTaskOnce() {
 	//区间id
 	q := map[string]interface{}{
 		"_id": map[string]interface{}{
-			"$gte": mongodb.StringTOBsonId(task_sid),
-			"$lt":  mongodb.StringTOBsonId(task_eid),
+			//"$gte": mongodb.StringTOBsonId(task_sid),
+			"$lt": mongodb.StringTOBsonId(task_eid),
 		},
 	}
 	//参数
@@ -45,7 +45,7 @@ func winnerEsTaskOnce() {
 	it_1 := sess.DB(standardMgo.DbName).C(win_ent).Find(&q).Sort("_id").Iter()
 	num_1 := 0
 	for tmp := make(map[string]interface{}); it_1.Next(&tmp); num_1++ {
-		if num_1%100 == 0 && num_1 > 0 {
+		if num_1%2000 == 0 && num_1 > 0 {
 			log.Println("当前表:", win_ent, "数量:", num_1)
 		}
 		pool <- true
@@ -75,7 +75,8 @@ func winnerEsTaskOnce() {
 			arrEs = append(arrEs, savetmp)
 			if len(arrEs) >= EsBulkSize {
 				tmps := arrEs
-				Es1.BulkSave(index, itype, &tmps, true)
+				//Es1.BulkSave(index, itype, &tmps, true)
+				Es2.BulkSave(index, itype, &tmps, true)
 				arrEs = []map[string]interface{}{}
 			}
 			winerEsLock.Unlock()
@@ -119,7 +120,8 @@ func winnerEsTaskOnce() {
 	winerEsLock.Lock()
 	if len(arrEs) > 0 {
 		tmps := arrEs
-		Es1.BulkSave(index, itype, &tmps, true)
+		//Es1.BulkSave(index, itype, &tmps, true)
+		Es2.BulkSave(index, itype, &tmps, true)
 		arrEs = []map[string]interface{}{}
 	}
 	winerEsLock.Unlock()