wcc 9 小时之前
父节点
当前提交
80df86563b

+ 39 - 0
bidding_test/bidd.go

@@ -19,6 +19,45 @@ import (
 	"time"
 )
 
+func getBidding2233() {
+	MgoB = &mongodb.MongodbSim{
+		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+		//MongodbAddr: "127.0.0.1:27083",
+		Size:     10,
+		DbName:   "qfw",
+		UserName: "SJZY_RWbid_ES",
+		Password: "SJZY@B4i4D5e6S",
+		//Direct:      true,
+	}
+	MgoB.InitPool()
+
+	sess := MgoB.GetMgoConn()
+	defer MgoB.DestoryMongoConn(sess)
+
+	where := map[string]interface{}{
+		"comeintime": map[string]interface{}{
+			"$gt": 1753113600,
+			"$lt": time.Now().Unix(),
+		},
+	}
+
+	query := sess.DB("qfw").C("bidding").Find(where).Select(nil).Iter()
+	count := 0
+
+	for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
+		if count%10000 == 0 {
+			log.Println("current:", count)
+		}
+
+		spicode := util.ObjToString(tmp["spidercode"])
+		if spicode == "sdxzbiddingsjzypc" {
+			MgoB.SaveByOriID("wcc_sdxzbiddingsjzypc", tmp)
+		}
+	}
+
+	log.Println("count:", count)
+}
+
 // exportBidding exportBidding
 func exportBidding() {
 	MgoB = &mongodb.MongodbSim{

二进制
bidding_test/getBidding2233


+ 14 - 8
bidding_test/main.go

@@ -5,19 +5,23 @@ import (
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils"
 	es "jygit.jydev.jianyu360.cn/data_processing/common_utils/elastic"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/udp"
 	"log"
+	"net"
 	"strings"
 	"time"
 )
 
 var (
-	MgoB         *mongodb.MongodbSim
-	MgoQy        *mongodb.MongodbSim
-	MgoP         *mongodb.MongodbSim
-	Es           *es.Elastic
-	updatePool   = make(chan []map[string]interface{}, 5000)
-	updateEsPool = make(chan []map[string]interface{}, 5000)
-	updateEsSp   = make(chan bool, 5) //保存协程
+	MgoB            *mongodb.MongodbSim
+	MgoQy           *mongodb.MongodbSim
+	MgoP            *mongodb.MongodbSim
+	Es              *es.Elastic
+	updatePool      = make(chan []map[string]interface{}, 5000)
+	updateEsPool    = make(chan []map[string]interface{}, 5000)
+	updateEsSp      = make(chan bool, 5) //保存协程
+	UdpClient       udp.UdpClient
+	biddingDataAddr *net.UDPAddr //bidding 地址
 )
 
 func InitMgo() {
@@ -90,7 +94,9 @@ func InitEs() {
 }
 
 func main() {
-	exportBidding()
+	updatePici() //更新bidding pici 字段
+	//getBidding2233()
+	//exportBidding()
 	log.Println("数据处理完毕")
 
 	return

+ 94 - 0
bidding_test/udp_ids.go

@@ -0,0 +1,94 @@
+package main
+
+import (
+	"encoding/json"
+	"fmt"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/udp"
+	"log"
+	"net"
+	"time"
+)
+
+// udpDatas  通过udp;补充数据  生 索引
+func udpDatas() {
+	UdpClient = udp.UdpClient{Local: ":18888", BufSize: 1024}
+	UdpClient.Listen(processUdpMsg)
+
+	biddingDataAddr = &net.UDPAddr{
+		Port: util.IntAll(1783),
+		IP:   net.ParseIP("127.0.0.1"),
+	}
+
+	MgoB = &mongodb.MongodbSim{
+		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+		//MongodbAddr: "127.0.0.1:27083",
+		Size:     10,
+		DbName:   "qfw",
+		UserName: "SJZY_RWbid_ES",
+		Password: "SJZY@B4i4D5e6S",
+		//Direct:      true,
+	}
+	MgoB.InitPool()
+
+	sess := MgoB.GetMgoConn()
+	defer MgoB.DestoryMongoConn(sess)
+
+	where := map[string]interface{}{
+		"comeintime": map[string]interface{}{
+			"$gt": 1753113600,
+			"$lt": time.Now().Unix(),
+		},
+	}
+
+	query := sess.DB("qfw").C("bidding").Find(where).Select(nil).Iter()
+	count := 0
+
+	for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
+		if count%10000 == 0 {
+			log.Println("current:", count)
+		}
+
+		//id := mongodb.BsonIdToSId(tmp["_id"])
+		//data := map[string]interface{}{
+		//	"stype": "index-by-id",
+		//	"_id":   id,
+		//}
+
+	}
+
+	log.Println("count:", count)
+}
+
+// processUdpMsg 处理udp
+func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
+	switch act {
+	case udp.OP_TYPE_DATA:
+		var mapInfo map[string]interface{}
+		err := json.Unmarshal(data, &mapInfo)
+		//print().Println("processUdpMsg", zap.Any("mapInfo:", mapInfo))
+		util.Debug("processUdpMsg :=>", mapInfo)
+		if err != nil {
+			fmt.Println(err)
+		}
+		if mapInfo != nil {
+			key, _ := mapInfo["key"].(string)
+			if key == "" {
+				key = "udpok"
+			}
+			go UdpClient.WriteUdp([]byte(key), udp.OP_NOOP, ra)
+		}
+
+	default:
+		fmt.Println("qyxy_listen : processUdpMsg =====")
+	}
+}
+
+// SendUdpMsg 通知处理企业新增数据
+func SendUdpMsg(data map[string]interface{}, target *net.UDPAddr) {
+	bytes, _ := json.Marshal(data)
+	UdpClient.WriteUdp(bytes, udp.OP_TYPE_DATA, target)
+	util.Debug("SendUdpMsg:=>", data)
+	util.Debug("target :=>", target.IP, target.Port)
+}

+ 34 - 0
bidding_test/updateBidding.go

@@ -7,6 +7,40 @@ import (
 	"log"
 )
 
+func updatePici() {
+	Mgo := &mongodb.MongodbSim{
+		//MongodbAddr: "172.17.189.140:27080",
+		MongodbAddr: "127.0.0.1:27083",
+		Size:        10,
+		DbName:      "qfw",
+		UserName:    "SJZY_RWbid_ES",
+		Password:    "SJZY@B4i4D5e6S",
+		Direct:      true,
+	}
+	Mgo.InitPool()
+
+	sess := Mgo.GetMgoConn()
+	defer Mgo.DestoryMongoConn(sess)
+	query := sess.DB("qfw").C("wcc_qlm_0801").Find(nil).Select(nil).Iter()
+	count := 0
+	for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
+		if count%100 == 0 {
+			log.Println("current:", count)
+		}
+
+		id := mongodb.BsonIdToSId(tmp["_id"])
+		update := map[string]interface{}{
+			"pici":        tmp["pici"],
+			"extracttype": tmp["extracttype"],
+		}
+
+		Mgo.UpdateById("bidding", id, map[string]interface{}{"$set": update})
+		tmp = make(map[string]interface{})
+	}
+
+	log.Println("over")
+}
+
 // updateBidding 更新bidding数据
 func updateBidding() {
 	//mongodb

二进制
environment/environment.exe


+ 12 - 0
environment/init.go

@@ -17,6 +17,7 @@ var (
 	nameMap      = make(map[string]string) //企业类型 -> code
 	Mgo181       *mongodb.MongodbSim       //
 	MgoB         *mongodb.MongodbSim       //
+	MgoQY        *mongodb.MongodbSim       // qyxy_std
 	MgoP         *mongodb.MongodbSim       //
 	GF           GlobalConf
 )
@@ -72,6 +73,17 @@ func InitMgo() {
 	//}
 	//
 	//MgoB.InitPool()
+
+	MgoQY = &mongodb.MongodbSim{
+		MongodbAddr: GF.MongoB.Host,
+		Size:        10,
+		DbName:      "mixdata",
+		UserName:    GF.MongoB.Username,
+		Password:    GF.MongoB.Password,
+		Direct:      GF.MongoB.Direct,
+	}
+
+	MgoQY.InitPool()
 }
 
 // readXlsx 读取央企 央企下属

+ 9 - 0
environment/main.go

@@ -98,6 +98,15 @@ func updateXlsx() {
 		//	f.SetCellValue(GF.Env.Sheet, fmt.Sprintf("H%v", i+1), tab2)
 		//}
 
+		//注册地点
+		where := map[string]interface{}{
+			"company_name": name,
+		}
+
+		std, _ := MgoQY.FindOne("qyxy_std", where)
+		if util.ObjToString((*std)["company_area"]) != "" {
+			f.SetCellValue(GF.Env.Sheet, fmt.Sprintf("G%v", i+1), (*std)["company_area"])
+		}
 		if i%100 == 0 {
 			log.Println(name, res1, tab1, tab2)
 		}

+ 14 - 18
getEs/bidding.go

@@ -71,11 +71,11 @@ func getBiddingLimitData() {
 
 // getBidding2 获取bidding数据
 func getBidding2() {
-	url := "http://172.17.4.184:19908"
-	//url := "http://127.0.0.1:19908"
+	//url := "http://172.17.4.184:19908"
+	url := "http://127.0.0.1:19905"
 	username := "jybid"
 	password := "Top2023_JEB01i@31"
-	index := "bidding" //索引名
+	index := "bidding_temp" //索引名
 	// 创建 Elasticsearch 客户端
 	client, err := elastic.NewClient(
 		elastic.SetURL(url),
@@ -115,14 +115,17 @@ func getBidding2() {
 	//	Filter(elastic.NewTermQuery("company_area", "广东"))      // 过滤 company_area 为 "广东"
 
 	//rangeQuery := elastic.NewRangeQuery("comeintime").Gte("1640966400").Lt("1703952000")
+	//query := elastic.NewBoolQuery().
+	//	Should(
+	//		elastic.NewMatchQuery("subtype", "合同"),
+	//		elastic.NewMatchQuery("toptype", "结果"),
+	//		elastic.NewMatchQuery("toptype", "招标"),
+	//	).
+	//	MinimumShouldMatch("1"). // 至少满足一个Should条件                           // buyer = "中国建筑股份有限公司"
+	//	Must(elastic.NewRangeQuery("publishtime").Gte(1704038400).Lt(1735660800))
+
 	query := elastic.NewBoolQuery().
-		Should(
-			elastic.NewMatchQuery("subtype", "合同"),
-			elastic.NewMatchQuery("toptype", "结果"),
-			elastic.NewMatchQuery("toptype", "招标"),
-		).
-		MinimumShouldMatch("1"). // 至少满足一个Should条件                           // buyer = "中国建筑股份有限公司"
-		Must(elastic.NewRangeQuery("publishtime").Gte(1704038400).Lt(1735660800))
+		Must(elastic.NewRangeQuery("id").Gt("6882d8d0d5d8e4081fd3ada6").Lte("6882d8e4d5d8e4081fd3addf"))
 
 	ctx := context.Background()
 	//开始滚动搜索
@@ -161,15 +164,8 @@ func getBidding2() {
 				log.Printf("解析文档失败:%s", err)
 				continue
 			}
-			//存入新表
-			insert := map[string]interface{}{
-				"buyer":   doc["buyer"],
-				"id":      doc["id"],
-				"toptype": doc["toptype"],
-				"subtype": doc["subtype"],
-			}
 
-			err = MgoB.InsertOrUpdate("qfw", "wcc_20250311_bidding", insert)
+			err = MgoB.InsertOrUpdate("qfw", "wcc_95_bidding_temp", doc)
 			if err != nil {
 				log.Println("error", doc["id"])
 			}

+ 14 - 10
getEs/main.go

@@ -22,20 +22,23 @@ var (
 
 func InitMgo() {
 	MgoB = &mongodb.MongodbSim{
-		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
-		//MongodbAddr: "127.0.0.1:27083",
-		Size:     10,
-		DbName:   "qfw",
-		UserName: "SJZY_RWbid_ES",
-		Password: "SJZY@B4i4D5e6S",
-		//Direct:      true,
+		//MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+		MongodbAddr: "127.0.0.1:27083",
+		Size:        10,
+		DbName:      "qfw",
+		UserName:    "SJZY_RWbid_ES",
+		Password:    "SJZY@B4i4D5e6S",
+		Direct:      true,
 	}
 	MgoB.InitPool()
 }
 
 func main() {
 	InitMgo()
-	getCountProjectWinner3()
+	getBidding2()
+
+	//InitMgo()
+	//getCountProjectWinner3()
 	//CountProjectWinner()
 	//getBiddingLimitData()
 	//getQyxyNationToFiles()
@@ -295,7 +298,8 @@ func getProjectDataFromEs() {
 	//2023-10-1 2024-1-1;1696089600-1704038400
 	//areaTermsQuery := elastic.NewTermsQuery("area", "江苏", "安徽", "上海", "天津", "河北", "浙江", "天津市", "上海市", "河北省", "安徽省", "江苏省", "浙江省", "北京", "北京市")
 	//rangeQuery := elastic.NewRangeQuery("firsttime").Gte(1711900800).Lt(1719763200) //2024年4-7月
-	rangeQuery := elastic.NewRangeQuery("firsttime").Gte(1735660800).Lt(1743436800) //2025年1-3月
+	//rangeQuery := elastic.NewRangeQuery("firsttime").Gte(1735660800).Lt(1743436800) //2025年1-3月;25年第一季度数据
+	rangeQuery := elastic.NewRangeQuery("firsttime").Gte(1743436800).Lt(1751299200) //2025年4.1-7.1 ;25年第二季度数据
 	query := elastic.NewBoolQuery().
 		//Must(areaTermsQuery).
 		Must(elastic.NewTermsQuery("bidstatus", "中标", "单一", "成交", "合同")).
@@ -355,7 +359,7 @@ func getProjectDataFromEs() {
 				insert := doc
 				insert["s_winner"] = v
 				//存入新表
-				err = Mgo.InsertOrUpdate("top", "wcc_allcity_2025Q1", insert)
+				err = Mgo.InsertOrUpdate("top", "wcc_allcity_2025Q2", insert)
 				if err != nil {
 					log.Println("error", doc["id"])
 				}

二进制
project_chuan/6月份未匹配到剑鱼的项目清单.xlsx


+ 2 - 0
project_chuan/go.mod

@@ -14,6 +14,7 @@ require (
 
 require (
 	github.com/PuerkitoBio/goquery v1.8.0 // indirect
+	github.com/adrg/strutil v0.3.1 // indirect
 	github.com/andybalholm/cascadia v1.3.1 // indirect
 	github.com/dchest/captcha v1.0.0 // indirect
 	github.com/fsnotify/fsnotify v1.8.0 // indirect
@@ -42,6 +43,7 @@ require (
 	github.com/xdg-go/stringprep v1.0.3 // indirect
 	github.com/xuri/efp v0.0.1 // indirect
 	github.com/xuri/nfp v0.0.1 // indirect
+	github.com/yanyiwu/gojieba v1.4.6 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	go.mongodb.org/mongo-driver v1.10.1 // indirect
 	go.uber.org/atomic v1.9.0 // indirect

+ 9 - 0
project_chuan/go.sum

@@ -4,6 +4,8 @@ github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0
 github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
 github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
+github.com/adrg/strutil v0.3.1 h1:OLvSS7CSJO8lBii4YmBt8jiK9QOtB9CzCzwl4Ic/Fz4=
+github.com/adrg/strutil v0.3.1/go.mod h1:8h90y18QLrs11IBffcGX3NW/GFBXCMcNg4M7H6MspPA=
 github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
 github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
@@ -117,9 +119,14 @@ github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
 github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4=
 github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
 github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
@@ -140,6 +147,8 @@ github.com/xuri/excelize/v2 v2.9.1 h1:VdSGk+rraGmgLHGFaGG9/9IWu1nj4ufjJ7uwMDtj8Q
 github.com/xuri/excelize/v2 v2.9.1/go.mod h1:x7L6pKz2dvo9ejrRuD8Lnl98z4JLt0TGAwjhW+EiP8s=
 github.com/xuri/nfp v0.0.1 h1:MDamSGatIvp8uOmDP8FnmjuQpu90NzdJxo7242ANR9Q=
 github.com/xuri/nfp v0.0.1/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
+github.com/yanyiwu/gojieba v1.4.6 h1:9oKbZijSHBdoTabXK34romSWj4aQLvs+j1ctIQjSxPk=
+github.com/yanyiwu/gojieba v1.4.6/go.mod h1:JUq4DddFVGdHXJHxxepxRmhrKlDpaBxR8O28v6fKYLY=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=

+ 150 - 3
project_chuan/project.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"context"
+	"encoding/base64"
 	"encoding/json"
 	"fmt"
 	"github.com/olivere/elastic/v7"
@@ -549,6 +550,145 @@ func removeDuplicates(arr []string) []string {
 	return result
 }
 
+func printInterfaceAsJSON(v interface{}) string {
+	data, err := json.MarshalIndent(v, "", "  ")
+	if err != nil {
+		fmt.Println("JSON 序列化失败:", err)
+		return ""
+	}
+
+	return string(data)
+	//fmt.Println("JSON 格式输出:\n", string(data))
+}
+
+// searchESCommonQuery  common 方式查询语句
+func searchESCommonQuery(client *elastic.Client, projectName, buyer2 string, scoreThreshold float64, maxResults int) ([]map[string]interface{}, error) {
+	// 设置多个字段的 common 查询
+	queryMap := map[string]interface{}{
+		"bool": map[string]interface{}{
+			"should": []interface{}{
+				map[string]interface{}{
+					"common": map[string]interface{}{
+						"projectname.pname": map[string]interface{}{
+							"query":             projectName,
+							"cutoff_frequency":  0.01,
+							"low_freq_operator": "and",
+							"boost":             0.2,
+						},
+					},
+				},
+				map[string]interface{}{
+					"common": map[string]interface{}{
+						"title": map[string]interface{}{
+							"query":             projectName,
+							"cutoff_frequency":  0.01,
+							"low_freq_operator": "and",
+							"boost":             0.2,
+						},
+					},
+				},
+				map[string]interface{}{
+					"common": map[string]interface{}{
+						"detail": map[string]interface{}{
+							"query":             projectName,
+							"cutoff_frequency":  0.01,
+							"low_freq_operator": "and",
+							"boost":             0.1,
+						},
+					},
+				},
+			},
+			"minimum_should_match": 1,
+		},
+	}
+
+	queryBytes, err := json.Marshal(queryMap)
+	if err != nil {
+		log.Error("marshal failed", zap.Error(err))
+		return nil, err
+	}
+
+	// ✅ 正确用法:Base64 编码
+	queryBase64 := base64.StdEncoding.EncodeToString(queryBytes)
+
+	// ✅ 构建 WrapperQuery
+	query := elastic.NewWrapperQuery(queryBase64)
+
+	// 指定需要返回的字段
+	fetchFields := elastic.NewFetchSourceContext(true).Include(
+		"id", "title", "projectname", "projectcode", "bidamount", "score",
+		"area", "city", "toptype", "subtype", "buyer", "budget", "buyerperson",
+		"buyertel", "s_winner", "winnertel", "agency", "publishtime",
+	)
+
+	// 执行查询
+	searchResult, err := client.Search().
+		Index("bidding").
+		Query(query).
+		Size(maxResults).
+		FetchSourceContext(fetchFields).
+		Do(context.Background())
+	if err != nil {
+		return nil, fmt.Errorf("search failed: %v", err)
+	}
+
+	// 处理结果
+	var results []map[string]interface{}
+	seenProjectNames := make(map[string]bool)
+	seenProjectCodes := make(map[string]bool)
+	bidamountMap := make(map[float64]bool)
+
+	for _, hit := range searchResult.Hits.Hits {
+		var doc map[string]interface{}
+		if err := json.Unmarshal(hit.Source, &doc); err != nil {
+			log.Info("解析文档失败", zap.Error(err))
+			continue
+		}
+
+		projectNameValue := util.ObjToString(doc["projectname"])
+		if projectNameValue == "" || seenProjectNames[projectNameValue] {
+			continue
+		}
+		seenProjectNames[projectNameValue] = true
+
+		projectCode := util.ObjToString(doc["projectcode"])
+		if projectCode != "" {
+			if seenProjectCodes[projectCode] {
+				continue
+			}
+			seenProjectCodes[projectCode] = true
+		}
+
+		bidamount := util.Float64All(doc["bidamount"])
+		if bidamount != 0 {
+			if bidamountMap[bidamount] {
+				continue
+			}
+			bidamountMap[bidamount] = true
+		}
+
+		id := util.ObjToString(doc["id"])
+		bidd, _ := MgoB.FindById("bidding", id, nil)
+		detail := util.ObjToString((*bidd)["detail"])
+
+		if buyer2 != "" && !strings.Contains(detail, buyer2) {
+			continue
+		}
+
+		doc["detail"] = detail
+		if hit.Score != nil {
+			doc["score"] = *hit.Score
+		}
+
+		results = append(results, doc)
+		if len(results) >= maxResults {
+			break
+		}
+	}
+
+	return results, nil
+}
+
 // searchES24 添加分词查询
 func searchES24(client *elastic.Client, projectName, buyer2 string, scoreThreshold float64, maxResults int) ([]map[string]interface{}, error) {
 	fieldsToTry := []string{"projectname.pname", "title", "detail"}
@@ -586,6 +726,13 @@ func searchES24(client *elastic.Client, projectName, buyer2 string, scoreThresho
 				return nil, err
 			}
 
+			// 打印 query JSON(调试用)
+			if len(searchResult.Hits.Hits) > 0 {
+				if sourceQ, err := query.Source(); err == nil {
+					fmt.Println(printInterfaceAsJSON(sourceQ))
+				}
+			}
+
 			for _, hit := range searchResult.Hits.Hits {
 				if !seenIDs[hit.Id] {
 					seenIDs[hit.Id] = true
@@ -697,9 +844,9 @@ func searchES24(client *elastic.Client, projectName, buyer2 string, scoreThresho
 		bidd, _ := MgoB.FindById("bidding", id, nil)
 		detail := util.ObjToString((*bidd)["detail"])
 
-		if detail != "" && !strings.Contains(detail, projectName) {
-			continue
-		}
+		//if detail != "" && !strings.Contains(detail, projectName) {
+		//	continue
+		//}
 		if buyer2 != "" && !strings.Contains(detail, buyer2) {
 			continue
 		}

+ 733 - 0
project_chuan/project_new.go

@@ -0,0 +1,733 @@
+package main
+
+import (
+	"context"
+	"encoding/base64"
+	"encoding/json"
+	"fmt"
+	"github.com/olivere/elastic/v7"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"log"
+	"sort"
+
+	//"sort"
+	"strings"
+	"time"
+)
+
+func SearchProjectFullScoring(client *elastic.Client, target InputData, projectName, areacode, publish string) ([]map[string]interface{}, error) {
+	seenIDs := make(map[string]*elastic.SearchHit)
+
+	province, city := "", ""
+	if areacode != "" {
+		code := areacode[:6]
+		where := map[string]interface{}{
+			"code": code,
+		}
+
+		res, _ := MgoQY.FindOne("address_new_2020", where)
+		province = util.ObjToString((*res)["province"])
+		city = util.ObjToString((*res)["city"])
+	}
+
+	// 1. 精准查询(权重 1.0)
+	preciseHits, err := searchPrecise(client, projectName, province, city, publish, 20)
+	if err != nil {
+		return nil, err
+	}
+	for _, hit := range preciseHits {
+		if _, exists := seenIDs[hit.Id]; !exists {
+			seenIDs[hit.Id] = hit
+		}
+	}
+
+	// 2. 分词查询(权重 0.8)
+	tokenHits, err := searchByToken(client, projectName, province, city, publish, 20)
+	if err != nil {
+		return nil, err
+	}
+	for _, hit := range tokenHits {
+		if _, exists := seenIDs[hit.Id]; !exists {
+			seenIDs[hit.Id] = hit
+		}
+	}
+
+	// 3. common 查询(权重 0.5)
+	commonHits, err := searchCommon(client, projectName, province, city, publish, 10)
+	if err != nil {
+		return nil, err
+	}
+	for _, hit := range commonHits {
+		if _, exists := seenIDs[hit.Id]; !exists {
+			seenIDs[hit.Id] = hit
+		}
+	}
+
+	// 4. 合并 + 打分增强
+	var results []map[string]interface{}
+	//nameScore := computeNameScore(projectName)
+	var allCandidates = []EsDocument{}
+
+	for id, hit := range seenIDs {
+		var doc map[string]interface{}
+		if err := json.Unmarshal(hit.Source, &doc); err != nil {
+			continue
+		}
+
+		// 从 Mongo 读取 detail 字段用于后续 buyer 过滤
+		bidd, _ := MgoB.FindById("bidding", id, nil)
+		detail := util.ObjToString((*bidd)["detail"])
+
+		doc["detail"] = detail
+		/**
+		"id", "title", "projectname", "projectcode", "bidamount", "area", "city",
+					"toptype", "subtype", "buyer", "budget", "buyerperson", "buyertel",
+					"s_winner", "winnertel", "agency", "publishtime"
+		*/
+		candidate := EsDocument{
+			Id:          util.ObjToString(doc["id"]),
+			Title:       util.ObjToString(doc["title"]),
+			Projectname: util.ObjToString(doc["projectname"]),
+			Toptype:     util.ObjToString(doc["toptype"]),
+			Subtype:     util.ObjToString(doc["subtype"]),
+			Area:        util.ObjToString(doc["area"]),
+			City:        util.ObjToString(doc["city"]),
+			Buyer:       util.ObjToString(doc["buyer"]),
+			SWinner:     util.ObjToString(doc["s_winner"]),
+			Bidamount:   util.Float64All(doc["bidamount"]),
+			Publishtime: util.Int64All(doc["publishtime"]),
+			Agency:      util.ObjToString(doc["agency"]),
+			WinnerTel:   util.ObjToString(doc["winnertel"]),
+			BuyerTel:    util.ObjToString(doc["buyertel"]),
+			BuyerPerson: util.ObjToString(doc["buyerperson"]),
+			Budget:      util.Float64All(doc["budget"]),
+		}
+
+		score := calculateConfidenceScore(target, candidate)
+		candidate.Score = score
+		allCandidates = append(allCandidates, candidate)
+	}
+
+	// 打印打分调试
+	//for i, c := range allCandidates {
+	//	fmt.Printf("Candidat 排序前: %d Score: %.4f\n", i, c.Score)
+	//}
+
+	// 排序(降序)
+	sort.SliceStable(allCandidates, func(i, j int) bool {
+		return allCandidates[i].Score > allCandidates[j].Score
+	})
+
+	//for i, c := range allCandidates {
+	//	fmt.Printf("Candidate 排序后: %d Score: %.4f\n", i, c.Score)
+	//}
+	//// 5. 排序
+	//sort.Slice(allCandidates, func(i, j int) bool {
+	//	return allCandidates[i].Score > allCandidates[j].Score
+	//})
+
+	for _, doc := range allCandidates {
+		item := map[string]interface{}{
+			"id":          doc.Id,
+			"title":       doc.Title,
+			"projectname": doc.Projectname,
+			"projectcode": doc.ProjectCode,
+			"toptype":     doc.Toptype,
+			"subtype":     doc.Subtype,
+			"area":        doc.Area,
+			"city":        doc.City,
+			"buyer":       doc.Buyer,
+			"budget":      doc.Budget,
+			"bidamount":   doc.Bidamount,
+			"winner":      doc.Winner,
+			"detail":      doc.Detail,
+			"publishtime": doc.Publishtime,
+			"agency":      doc.Agency,
+			"s_winner":    doc.SWinner,
+			"winnertel":   doc.WinnerTel,
+			"buyertel":    doc.BuyerTel,
+			"buyerperson": doc.BuyerPerson,
+			"score":       doc.Score,
+		}
+		results = append(results, item)
+	}
+	return results, nil
+}
+
+// searchPrecise 精准查询
+func searchPrecise22(client *elastic.Client, projectName, province, city, publish string, maxResults int) ([]*elastic.SearchHit, error) {
+	fieldsToTry := []string{"projectname.pname", "title", "detail"}
+	filtersToTry := [][]elastic.Query{
+		{elastic.NewTermsQuery("subtype", "中标", "成交", "合同", "单一")},
+		{elastic.NewTermsQuery("toptype", "招标", "预告", "采购意向")},
+		{elastic.NewTermsQuery("toptype", "拟建")},
+	}
+	var allResults []*elastic.SearchHit
+	seenIDs := make(map[string]bool)
+
+	query := elastic.NewBoolQuery()
+
+	for _, field := range fieldsToTry {
+		if field == "detail" && len(allResults) > maxResults {
+			break
+		}
+		for _, filter := range filtersToTry {
+			//query := elastic.NewBoolQuery().
+			query.Must(elastic.NewMultiMatchQuery(projectName, field).Type("phrase")).
+				Filter(filter...)
+
+			fetchFields := elastic.NewFetchSourceContext(true).Include("id", "title", "projectname", "projectcode", "bidamount", "area", "city", "toptype", "subtype", "buyer", "budget", "buyerperson", "buyertel", "s_winner", "winnertel", "agency", "publishtime")
+
+			searchResult, err := client.Search().
+				Index("bidding").
+				Query(query).
+				Size(maxResults).
+				FetchSourceContext(fetchFields).
+				Do(context.Background())
+			if err != nil {
+				return nil, err
+			}
+
+			for _, hit := range searchResult.Hits.Hits {
+				if !seenIDs[hit.Id] {
+					seenIDs[hit.Id] = true
+					allResults = append(allResults, hit)
+				}
+			}
+		}
+	}
+	return allResults, nil
+}
+
+func searchPrecise(client *elastic.Client, projectName, province, city, publish string, maxResults int) ([]*elastic.SearchHit, error) {
+	fieldsToTry := []string{"projectname.pname", "title", "detail"}
+	filtersToTry := [][]elastic.Query{
+		{elastic.NewTermsQuery("subtype", "中标", "成交", "合同", "单一")},
+		{elastic.NewTermsQuery("toptype", "招标", "预告", "采购意向")},
+		{elastic.NewTermsQuery("toptype", "拟建")},
+	}
+	var allResults []*elastic.SearchHit
+	seenIDs := make(map[string]bool)
+
+	// 解析发布时间
+	var t time.Time
+	var err error
+	if publish != "" {
+		t, err = time.Parse("200601", publish)
+		if err != nil {
+			log.Println("时间解析失败:", err)
+		}
+	}
+
+	for _, field := range fieldsToTry {
+		var dateRangeStart, dateRangeEnd int64
+		if !t.IsZero() {
+			if field == "detail" {
+				dateRangeStart, dateRangeEnd = getYearRange(t, 60)
+			} else {
+				dateRangeStart, dateRangeEnd = getYearRange(t, 36)
+			}
+		}
+
+		for _, filters := range filtersToTry {
+			var queries []*elastic.BoolQuery
+
+			if field == "detail" {
+				// detail 只加时间 + filter
+				query := elastic.NewBoolQuery()
+				query = query.Must(elastic.NewMultiMatchQuery(projectName, field).Type("phrase"))
+				query = query.Filter(filters...)
+				if !t.IsZero() {
+					query = query.Must(elastic.NewRangeQuery("publishtime").Gte(dateRangeStart).Lt(dateRangeEnd))
+				}
+				queries = append(queries, query)
+
+			} else {
+				// 1. 省 + 市 查询
+				if province != "" && city != "" {
+					query1 := elastic.NewBoolQuery()
+					query1 = query1.Must(elastic.NewMultiMatchQuery(projectName, field).Type("phrase"))
+					query1 = query1.Must(elastic.NewTermQuery("province", province))
+					query1 = query1.Must(elastic.NewTermQuery("city", city))
+					query1 = query1.Filter(filters...)
+					if !t.IsZero() {
+						query1 = query1.Must(elastic.NewRangeQuery("publishtime").Gte(dateRangeStart).Lt(dateRangeEnd))
+					}
+					queries = append(queries, query1)
+				}
+				// 2. 仅省份(城市为空或不同)
+				if province != "" {
+					query2 := elastic.NewBoolQuery()
+					query2 = query2.Must(elastic.NewMultiMatchQuery(projectName, field).Type("phrase"))
+					query2 = query2.Must(elastic.NewTermQuery("province", province))
+					query2 = query2.Filter(filters...)
+					if !t.IsZero() {
+						query2 = query2.Must(elastic.NewRangeQuery("publishtime").Gte(dateRangeStart).Lt(dateRangeEnd))
+					}
+					queries = append(queries, query2)
+				}
+
+				// 3. 不限制省市
+				if province != "" {
+					query3 := elastic.NewBoolQuery()
+					query3 = query3.Must(elastic.NewMultiMatchQuery(projectName, field).Type("phrase"))
+					query3 = query3.Filter(filters...)
+					if !t.IsZero() {
+						query3 = query3.Must(elastic.NewRangeQuery("publishtime").Gte(dateRangeStart).Lt(dateRangeEnd))
+					}
+					queries = append(queries, query3)
+				}
+			}
+
+			for _, query := range queries {
+				fetchFields := elastic.NewFetchSourceContext(true).Include(
+					"id", "title", "projectname", "projectcode", "bidamount", "area", "city",
+					"toptype", "subtype", "buyer", "budget", "buyerperson", "buyertel",
+					"s_winner", "winnertel", "agency", "publishtime")
+
+				searchResult, err := client.Search().
+					Index("bidding").
+					Query(query).
+					Size(maxResults).
+					FetchSourceContext(fetchFields).
+					Do(context.Background())
+				if err != nil {
+					return nil, err
+				}
+
+				// 打印 query JSON(调试用)
+				//if sourceQ, err := query.Source(); err == nil {
+				//	log.Println(printInterfaceAsJSON(sourceQ))
+				//}
+
+				for _, hit := range searchResult.Hits.Hits {
+					if !seenIDs[hit.Id] {
+						seenIDs[hit.Id] = true
+						allResults = append(allResults, hit)
+					}
+				}
+			}
+		}
+
+		// detail 的命中足够就提前结束
+		if field == "detail" && len(allResults) > maxResults {
+			break
+		}
+	}
+
+	return allResults, nil
+}
+
+// searchByToken 分词查询
+func searchByToken22(client *elastic.Client, projectName, province, city, publish string, maxResults int) ([]*elastic.SearchHit, error) {
+	fieldsToTry := []string{"projectname.pname", "title", "detail"}
+	filtersToTry := [][]elastic.Query{
+		{elastic.NewTermsQuery("subtype", "中标", "成交", "合同", "单一")},
+		{elastic.NewTermsQuery("toptype", "招标", "预告", "采购意向")},
+		{elastic.NewTermsQuery("toptype", "拟建")},
+	}
+	analyzeResp, err := client.IndexAnalyze().
+		Index("bidding").
+		Analyzer("ik_smart").
+		Text(projectName).
+		Do(context.Background())
+	if err != nil {
+		return nil, err
+	}
+
+	var tokens []string
+	for _, token := range analyzeResp.Tokens {
+		tokens = append(tokens, token.Token)
+	}
+	if len(tokens) == 0 {
+		return nil, fmt.Errorf("no tokens found from ik_smart")
+	}
+	queryText := strings.Join(tokens, " ")
+
+	var allHits []*elastic.SearchHit
+	seen := make(map[string]bool)
+
+	for _, filter := range filtersToTry {
+		query := elastic.NewBoolQuery().
+			Must(elastic.NewMultiMatchQuery(queryText, fieldsToTry...).MinimumShouldMatch("100%")).
+			Filter(filter...)
+
+		searchResult, err := client.Search().
+			Index("bidding").
+			Query(query).
+			Size(maxResults).
+			Do(context.Background())
+		if err != nil {
+			continue
+		}
+
+		for _, hit := range searchResult.Hits.Hits {
+			if !seen[hit.Id] {
+				seen[hit.Id] = true
+				allHits = append(allHits, hit)
+				if len(allHits) >= maxResults {
+					break
+				}
+			}
+		}
+
+		if len(allHits) >= maxResults {
+			break
+		}
+	}
+	return allHits, nil
+}
+
+func searchByToken(client *elastic.Client, projectName, province, city, publish string, maxResults int) ([]*elastic.SearchHit, error) {
+	fieldsToTry := []string{"projectname.pname", "title", "detail"}
+	filtersToTry := [][]elastic.Query{
+		{elastic.NewTermsQuery("subtype", "中标", "成交", "合同", "单一")},
+		{elastic.NewTermsQuery("toptype", "招标", "预告", "采购意向")},
+		{elastic.NewTermsQuery("toptype", "拟建")},
+	}
+
+	// 解析时间
+	var t time.Time
+	var err error
+	if publish != "" {
+		t, err = time.Parse("200601", publish)
+		if err != nil {
+			log.Println("时间解析失败:", err)
+		}
+	}
+
+	// 分词处理
+	analyzeResp, err := client.IndexAnalyze().
+		Index("bidding").
+		Analyzer("ik_smart").
+		Text(projectName).
+		Do(context.Background())
+	if err != nil {
+		return nil, err
+	}
+
+	var tokens []string
+	for _, token := range analyzeResp.Tokens {
+		tokens = append(tokens, token.Token)
+	}
+	if len(tokens) == 0 {
+		return nil, fmt.Errorf("no tokens found from ik_smart")
+	}
+	queryText := strings.Join(tokens, " ")
+
+	// 指定返回字段
+	fetchFields := elastic.NewFetchSourceContext(true).Include(
+		"id", "title", "projectname", "projectcode", "bidamount", "area", "city",
+		"toptype", "subtype", "buyer", "budget", "buyerperson", "buyertel",
+		"s_winner", "winnertel", "agency", "publishtime")
+
+	var allHits []*elastic.SearchHit
+	seen := make(map[string]bool)
+
+	for _, field := range fieldsToTry {
+		var dateRangeStart, dateRangeEnd int64
+		if !t.IsZero() {
+			if field == "detail" {
+				dateRangeStart, dateRangeEnd = getYearRange(t, 60)
+			} else {
+				dateRangeStart, dateRangeEnd = getYearRange(t, 36)
+			}
+		}
+
+		for _, filters := range filtersToTry {
+			var queries []*elastic.BoolQuery
+
+			if field == "detail" {
+				query := elastic.NewBoolQuery().
+					Must(elastic.NewMatchQuery(field, queryText)).
+					Filter(filters...)
+				if !t.IsZero() {
+					query = query.Must(elastic.NewRangeQuery("publishtime").Gte(dateRangeStart).Lt(dateRangeEnd))
+				}
+				queries = append(queries, query)
+			} else {
+				// 省+市
+				if province != "" && city != "" {
+					q := elastic.NewBoolQuery().
+						Must(elastic.NewMatchQuery(field, queryText)).
+						Must(elastic.NewTermQuery("province", province)).
+						Must(elastic.NewTermQuery("city", city)).
+						Filter(filters...)
+					if !t.IsZero() {
+						q = q.Must(elastic.NewRangeQuery("publishtime").Gte(dateRangeStart).Lt(dateRangeEnd))
+					}
+					queries = append(queries, q)
+				}
+				// 仅省
+				if province != "" {
+					q := elastic.NewBoolQuery().
+						Must(elastic.NewMatchQuery(field, queryText)).
+						Must(elastic.NewTermQuery("province", province)).
+						Filter(filters...)
+					if !t.IsZero() {
+						q = q.Must(elastic.NewRangeQuery("publishtime").Gte(dateRangeStart).Lt(dateRangeEnd))
+					}
+					queries = append(queries, q)
+				}
+				// 无省市
+				q := elastic.NewBoolQuery().
+					Must(elastic.NewMatchQuery(field, queryText)).
+					Filter(filters...)
+				if !t.IsZero() {
+					q = q.Must(elastic.NewRangeQuery("publishtime").Gte(dateRangeStart).Lt(dateRangeEnd))
+				}
+				queries = append(queries, q)
+			}
+
+			for _, query := range queries {
+				searchResult, err := client.Search().
+					Index("bidding").
+					Query(query).
+					Size(maxResults).
+					FetchSourceContext(fetchFields).
+					Do(context.Background())
+				if err != nil {
+					continue
+				}
+
+				for _, hit := range searchResult.Hits.Hits {
+					if !seen[hit.Id] {
+						seen[hit.Id] = true
+						allHits = append(allHits, hit)
+						if len(allHits) >= maxResults {
+							return allHits, nil
+						}
+					}
+				}
+			}
+		}
+
+		if field == "detail" && len(allHits) >= maxResults {
+			break
+		}
+	}
+
+	return allHits, nil
+}
+
+// searchCommon common 查询
+func searchCommon22(client *elastic.Client, projectName, province, city, publish string, maxResults int) ([]*elastic.SearchHit, error) {
+	queryMap := map[string]interface{}{
+		"bool": map[string]interface{}{
+			"should": []interface{}{
+				map[string]interface{}{"common": map[string]interface{}{"projectname.pname": map[string]interface{}{"query": projectName, "cutoff_frequency": 0.01, "low_freq_operator": "and", "boost": 0.2}}},
+				map[string]interface{}{"common": map[string]interface{}{"title": map[string]interface{}{"query": projectName, "cutoff_frequency": 0.01, "low_freq_operator": "and", "boost": 0.2}}},
+				map[string]interface{}{"common": map[string]interface{}{"detail": map[string]interface{}{"query": projectName, "cutoff_frequency": 0.01, "low_freq_operator": "and", "boost": 0.1}}},
+			},
+			"minimum_should_match": 1,
+		},
+	}
+	queryBytes, _ := json.Marshal(queryMap)
+	queryBase64 := base64.StdEncoding.EncodeToString(queryBytes)
+	query := elastic.NewWrapperQuery(queryBase64)
+
+	fetchFields := elastic.NewFetchSourceContext(true).Include("id", "title", "projectname", "projectcode", "bidamount", "area", "city", "toptype", "subtype", "buyer", "budget", "buyerperson", "buyertel", "s_winner", "winnertel", "agency", "publishtime")
+
+	searchResult, err := client.Search().
+		Index("bidding").
+		Query(query).
+		Size(maxResults).
+		FetchSourceContext(fetchFields).
+		Do(context.Background())
+	if err != nil {
+		return nil, err
+	}
+
+	var allHits []*elastic.SearchHit
+	seen := make(map[string]bool)
+
+	for _, hit := range searchResult.Hits.Hits {
+		if !seen[hit.Id] {
+			seen[hit.Id] = true
+			allHits = append(allHits, hit)
+		}
+	}
+
+	return allHits, nil
+}
+
+func searchCommon(client *elastic.Client, projectName, province, city, publish string, maxResults int) ([]*elastic.SearchHit, error) {
+	fields := []string{"projectname.pname", "title", "detail"}
+	var t time.Time
+	var err error
+	if publish != "" {
+		t, err = time.Parse("200601", publish)
+		if err != nil {
+			log.Println("时间解析失败:", err)
+		}
+	}
+
+	var allHits []*elastic.SearchHit
+	seen := make(map[string]bool)
+
+	fetchFields := elastic.NewFetchSourceContext(true).Include(
+		"id", "title", "projectname", "projectcode", "bidamount", "area", "city",
+		"toptype", "subtype", "buyer", "budget", "buyerperson", "buyertel",
+		"s_winner", "winnertel", "agency", "publishtime")
+
+	for _, field := range fields {
+		var dateRangeStart, dateRangeEnd int64
+		if !t.IsZero() {
+			if field == "detail" {
+				dateRangeStart, dateRangeEnd = getYearRange(t, 60)
+			} else {
+				dateRangeStart, dateRangeEnd = getYearRange(t, 36)
+			}
+		}
+
+		var queries []map[string]interface{}
+
+		commonQuery := func(f string, boost float64) map[string]interface{} {
+			return map[string]interface{}{
+				"common": map[string]interface{}{
+					f: map[string]interface{}{
+						"query":             projectName,
+						"cutoff_frequency":  0.01,
+						"low_freq_operator": "and",
+						"boost":             boost,
+					},
+				},
+			}
+		}
+
+		if field == "detail" {
+			// 只做普通匹配 + 时间
+			boolQuery := map[string]interface{}{
+				"bool": map[string]interface{}{
+					"must": []interface{}{
+						commonQuery(field, 0.1),
+					},
+				},
+			}
+			if !t.IsZero() {
+				boolQuery["bool"].(map[string]interface{})["filter"] = []interface{}{
+					map[string]interface{}{
+						"range": map[string]interface{}{
+							"publishtime": map[string]interface{}{
+								"gte": dateRangeStart,
+								"lt":  dateRangeEnd,
+							},
+						},
+					},
+				}
+			}
+			queries = append(queries, boolQuery)
+
+		} else {
+			// 1. 省+市
+			if province != "" && city != "" {
+				q := map[string]interface{}{
+					"bool": map[string]interface{}{
+						"must": []interface{}{
+							commonQuery(field, 0.2),
+							map[string]interface{}{"term": map[string]interface{}{"province": province}},
+							map[string]interface{}{"term": map[string]interface{}{"city": city}},
+						},
+					},
+				}
+				if !t.IsZero() {
+					q["bool"].(map[string]interface{})["filter"] = []interface{}{
+						map[string]interface{}{
+							"range": map[string]interface{}{
+								"publishtime": map[string]interface{}{
+									"gte": dateRangeStart,
+									"lt":  dateRangeEnd,
+								},
+							},
+						},
+					}
+				}
+				queries = append(queries, q)
+			}
+
+			// 2. 仅省
+			if province != "" {
+				q := map[string]interface{}{
+					"bool": map[string]interface{}{
+						"must": []interface{}{
+							commonQuery(field, 0.2),
+							map[string]interface{}{"term": map[string]interface{}{"province": province}},
+						},
+					},
+				}
+				if !t.IsZero() {
+					q["bool"].(map[string]interface{})["filter"] = []interface{}{
+						map[string]interface{}{
+							"range": map[string]interface{}{
+								"publishtime": map[string]interface{}{
+									"gte": dateRangeStart,
+									"lt":  dateRangeEnd,
+								},
+							},
+						},
+					}
+				}
+				queries = append(queries, q)
+			}
+
+			// 3. 不加省市
+			q := map[string]interface{}{
+				"bool": map[string]interface{}{
+					"must": []interface{}{
+						commonQuery(field, 0.2),
+					},
+				},
+			}
+			if !t.IsZero() {
+				q["bool"].(map[string]interface{})["filter"] = []interface{}{
+					map[string]interface{}{
+						"range": map[string]interface{}{
+							"publishtime": map[string]interface{}{
+								"gte": dateRangeStart,
+								"lt":  dateRangeEnd,
+							},
+						},
+					},
+				}
+			}
+			queries = append(queries, q)
+		}
+
+		for _, q := range queries {
+			// 编码 query 为 base64
+			queryBytes, _ := json.Marshal(q)
+			queryBase64 := base64.StdEncoding.EncodeToString(queryBytes)
+			query := elastic.NewWrapperQuery(queryBase64)
+
+			searchResult, err := client.Search().
+				Index("bidding").
+				Query(query).
+				Size(maxResults).
+				FetchSourceContext(fetchFields).
+				Do(context.Background())
+			if err != nil {
+				log.Println("searchCommon 查询失败:", err)
+				continue
+			}
+
+			for _, hit := range searchResult.Hits.Hits {
+				if !seen[hit.Id] {
+					seen[hit.Id] = true
+					allHits = append(allHits, hit)
+					if len(allHits) >= maxResults {
+						return allHits, nil
+					}
+				}
+			}
+		}
+	}
+
+	return allHits, nil
+}
+
+// getYearRange calculates a date range of +/- 1 year from the base date.
+func getYearRange(baseDate time.Time, m int) (start, end int64) {
+	endTime := baseDate.AddDate(0, m, 0)
+	startTime := baseDate.AddDate(0, -m, 0)
+	return startTime.Unix(), endTime.Unix()
+}

+ 103 - 5
project_chuan/project_test.go

@@ -6,7 +6,11 @@ import (
 	"github.com/xuri/excelize/v2"
 	"go.uber.org/zap"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"strconv"
+	"strings"
 	"testing"
+	"time"
 )
 
 func TestBiddng(t *testing.T) {
@@ -62,16 +66,110 @@ func TestBiddng(t *testing.T) {
 }
 
 func TestSearchES23(t *testing.T) {
+	//client, err := elastic.NewClient(
+	//	elastic.SetURL(GF.Es.URL),
+	//	elastic.SetBasicAuth(GF.Es.Username, GF.Es.Password),
+	//	elastic.SetSniff(false),
+	//)
+	//if err != nil {
+	//	log.Fatal("创建 Elasticsearch 客户端失败", zap.Error(err))
+	//}
+	//
+	//projectName := "卡秋生物生产研发中心建设项目"
+	//results, err := searchES24(client, projectName, "", 20, 50)
+	//results, err := searchESCommonQuery(client, projectName, "", 20, 30)
+	//results, err := SearchProjectFullScoring(client, projectName, "", "", "")
+	//log.Info("aaa", zap.Any("results", results))
+}
+
+func TestSearchProjectFullScoring(t *testing.T) {
+
+	url := "http://127.0.0.1:19908"
+	username := "jybid"
+	password := "Top2023_JEB01i@31"
+
 	client, err := elastic.NewClient(
-		elastic.SetURL(GF.Es.URL),
-		elastic.SetBasicAuth(GF.Es.Username, GF.Es.Password),
+		elastic.SetURL(url),
+		elastic.SetBasicAuth(username, password),
 		elastic.SetSniff(false),
 	)
 	if err != nil {
 		log.Fatal("创建 Elasticsearch 客户端失败", zap.Error(err))
 	}
+	MgoQY = &mongodb.MongodbSim{
+		//MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+		MongodbAddr: "127.0.0.1:27083",
+		Size:        10,
+		DbName:      "mixdata",
+		UserName:    "SJZY_RWbid_ES",
+		Password:    "SJZY@B4i4D5e6S",
+		Direct:      true,
+	}
+	MgoQY.InitPool()
+
+	f, err := excelize.OpenFile("./项目信息.xlsx")
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer func() {
+		f.Save()
+		if err := f.Close(); err != nil {
+			fmt.Println(err)
+		}
+	}()
+
+	rows, err := f.GetRows("Sheet1")
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	//读取 Excel文件 条件参数
+	//var targets []InputData
+	// Start from row 1 to skip the header
+	for i, row := range rows {
+		if i == 0 {
+			continue
+		}
+		if len(row) < 6 { // Ensure row has enough columns
+			continue
+		}
+
+		investment, _ := strconv.ParseFloat(row[4], 64)
+		dateStr := strings.TrimPrefix(row[5], "Y")
+		baseDate, _ := time.Parse("200601", dateStr)
+
+		target := InputData{
+			ProjectCode:       row[0],
+			ProjectName:       row[1],
+			AreaCode:          row[2],
+			ConstructionUnit:  row[3],
+			PlannedInvestment: investment,
+			BaseDate:          baseDate,
+		}
+		//targets = append(targets, target)
+
+		projectName := rows[i][1]
+		areacode := rows[i][2]
+		publish := rows[i][5]
+
+		res, err := SearchProjectFullScoring(client, target, projectName, areacode, publish)
+		fmt.Println(res, err)
+
+	}
+
+	//for i := 2; i < len(rows); i++ {
+	//	projectName := rows[i][1]
+	//	areacode := rows[i][2]
+	//	publish := rows[i][5]
+	//
+	//	res, err := SearchProjectFullScoring(client, projectName, areacode, publish)
+	//	fmt.Println(res, err)
+	//	results, err := searchES24(client, projectName, "", 20, 50)
+	//
+	//	fmt.Println(results, err)
+	//
+	//}
 
-	projectName := "赤壁市综合养老中心项目"
-	results, err := searchES24(client, projectName, "", 50, 50)
-	log.Info("aaa", zap.Any("results", results))
 }

+ 214 - 0
project_chuan/score.go

@@ -0,0 +1,214 @@
+package main
+
+import (
+	"fmt"
+	"math"
+	"strings"
+	"time"
+
+	"github.com/adrg/strutil"
+	"github.com/adrg/strutil/metrics"
+)
+
+type ScoredResult struct {
+	Document   EsDocument
+	Confidence float64
+}
+
+type InputData struct {
+	ProjectCode       string
+	Area              string
+	City              string
+	ProjectName       string
+	ConstructionUnit  string
+	AreaCode          string
+	PlannedInvestment float64
+	BaseDate          time.Time
+}
+
+type EsDocument struct {
+	Id          string  `json:"id"`
+	Title       string  `json:"title"`
+	Projectname string  `json:"projectname"`
+	ProjectCode string  `json:"projectcode"`
+	Toptype     string  `json:"toptype"`
+	Subtype     string  `json:"subtype"`
+	Area        string  `json:"area"`
+	City        string  `json:"city"`
+	Buyer       string  `json:"buyer"`
+	Budget      float64 `json:"budget"`
+	Bidamount   float64 `json:"bidamount"`
+	Winner      string  `json:"winner"`
+	Detail      string  `json:"detail"`
+	Publishtime int64   `json:"publishtime"`
+	Agency      string  `json:"agency"`
+	SWinner     string  `json:"s_winner"`
+	WinnerTel   string  `json:"winnertel"`
+	BuyerTel    string  `json:"buyertel"`
+	BuyerPerson string  `json:"buyerperson"`
+	Score       float64 `json:"score"`
+}
+
+// calculateConfidenceScore calculates a score from 0-100 based on multiple factors.
+func calculateConfidenceScore(target InputData, candidate EsDocument) float64 {
+	var totalScore float64 = 0.0
+	nameSimilarity := EnhancedSimilarity(strings.ReplaceAll(target.ProjectName, target.ConstructionUnit, ""), strings.ReplaceAll(strings.ReplaceAll(candidate.Projectname, candidate.Buyer, ""), target.ConstructionUnit, ""))
+	// 1. Project Name Similarity (Weight: 40 points)
+	totalScore += nameSimilarity * 70.0
+	//log.Println(target.ProjectName, candidate.Projectname, nameSimilarity)
+
+	// 2. Construction Unit Similarity (Weight: 30 points)
+	unitSimilarity := EnhancedSimilarity(target.ConstructionUnit, candidate.Buyer)
+	totalScore += unitSimilarity * 10.0
+
+	//log.Println(target.ConstructionUnit, candidate.Buyer, unitSimilarity)
+
+	if target.Area != "" && target.Area == candidate.Area {
+		totalScore += 5
+		if target.City != "" && target.City == candidate.City {
+			totalScore += 5
+		}
+	}
+
+	// 3. Project Code Presence
+	if target.ProjectCode != "" && strings.Contains(candidate.Detail, target.ProjectCode) {
+		totalScore += 5.0
+	}
+
+	// 4. 投资额
+	if target.PlannedInvestment > 0 && candidate.Budget > 0 {
+		diff := math.Abs(target.PlannedInvestment - candidate.Budget)
+		percentDiff := diff / math.Max(target.PlannedInvestment, 1) // Avoid division by zero
+		// Simple linear decay: 100% score for 0% diff, 0% score for 100% diff or more
+		investmentScore := math.Max(0, (1.0-percentDiff)*5.0)
+		totalScore += investmentScore
+	}
+
+	//计算时间
+	if target.BaseDate.Year() > 2000 && candidate.Publishtime > 1600000000 {
+		totalScore += TimeProximity(target.BaseDate, time.Unix(candidate.Publishtime, 0)) * 5
+	}
+
+	return totalScore
+}
+
+// 计算时间
+func TimeProximity(t1, t2 time.Time) float64 {
+	// 解析时间
+	// 计算天数差值(取绝对值)
+	days := int(t1.Sub(t2).Abs().Hours() / 24)
+	// 根据天数差值返回不同的相似度
+	switch {
+	case days < 100:
+		return 1.0
+	case days < 200:
+		return 0.7
+	case days < 365:
+		return 0.55
+	case days < 700:
+		return 0.3
+	default:
+		return 0.15
+	}
+}
+
+func EnhancedSimilarity(str1, str2 string) float64 {
+	// 标准化:去除空格和标点(根据中文需求调整)
+	s1 := strings.TrimSpace(str1)
+	s2 := strings.TrimSpace(str2)
+
+	// 1. 检查完全相等
+	if s1 == "" || s2 == "" {
+		return 0
+	} else if s1 == s2 {
+		return 1.0
+	}
+
+	// 2. 检查包含关系(权重50%)
+	if containmentScore := checkContainment(s1, s2); containmentScore > 0 {
+		return containmentScore
+	}
+
+	// 3. 使用改进的Jaro-Winkler(考虑中文分词)
+	jw := metrics.NewJaroWinkler()
+	baseScore := strutil.Similarity(s1, s2, jw)
+
+	// 4. 添加公共子串权重
+	substringScore := checkLongestCommonSubstring(s1, s2)
+
+	// 5. 组合得分
+	finalScore := 0.5*baseScore + 0.5*substringScore
+
+	return finalScore
+}
+
+// 检查包含关系,返回0-1的得分
+func checkContainment(s1, s2 string) float64 {
+	// 确保s1是较短的字符串
+	if len(s1) > len(s2) {
+		s1, s2 = s2, s1
+	}
+
+	// 完全包含
+	if strings.Contains(s2, s1) {
+		// 被包含部分占长字符串的比例
+		ratio := float64(len(s1)) / float64(len(s2))
+		// 基础分0.7 + 比例调整(最多加到0.95)
+		return 0.9 + ratio*0.1
+	}
+	return 0
+}
+
+// 检查最长公共子串
+func checkLongestCommonSubstring(s1, s2 string) float64 {
+	m := len(s1)
+	n := len(s2)
+
+	// 动态规划表
+	dp := make([][]int, m+1)
+	for i := range dp {
+		dp[i] = make([]int, n+1)
+	}
+
+	maxLen := 0
+	for i := 1; i <= m; i++ {
+		for j := 1; j <= n; j++ {
+			if s1[i-1] == s2[j-1] {
+				dp[i][j] = dp[i-1][j-1] + 1
+				if dp[i][j] > maxLen {
+					maxLen = dp[i][j]
+				}
+			}
+		}
+	}
+
+	// 计算得分:最长公共子串占两个字符串平均长度的比例
+	avgLen := (m + n) / 2
+	if avgLen == 0 {
+		return 0
+	}
+	return float64(maxLen) / float64(avgLen)
+}
+
+func main000() {
+	str1 := "绿色低碳节能项目"
+	str2 := "河北纵横集团丰南钢铁有限公司绿色低碳节能项目"
+
+	similarity := EnhancedSimilarity(str1, str2)
+	fmt.Printf("相似度: %.4f\n", similarity)
+
+	// 更多测试用例
+	testCases := []struct {
+		s1, s2 string
+	}{
+		{"绿色低碳", "绿色低碳节能项目"},
+		{"钢铁项目", "丰南钢铁有限公司项目"},
+		{"节能环保", "新能源开发"},
+		{"相同的字符串", "相同的字符串"},
+	}
+
+	for _, tc := range testCases {
+		sim := EnhancedSimilarity(tc.s1, tc.s2)
+		fmt.Printf("'%s' vs '%s': %.4f\n", tc.s1, tc.s2, sim)
+	}
+}

二进制
project_chuan/项目信息.xlsx


+ 3 - 3
qyxy_zsl/config.toml

@@ -1,4 +1,4 @@
-[mongo]  ## bidding 链接
+[mongo]  ## 181
     host = "127.0.0.1:27001"
 #        host = "172.17.4.181:27001"
     db = "mixdata"
@@ -9,5 +9,5 @@
 
 
 [env]
-    file  = "./平顶山.xlsx" ## 读取的文件名
-    sheet = "企业名单" ## 企业名单所在的sheet
+    file  = "./tieta.xlsx" ## 读取的文件名
+    sheet = "Sheet1" ## 企业名单所在的sheet

+ 1 - 1
qyxy_zsl/main.go

@@ -63,7 +63,7 @@ func main() {
 	getBaseInfo() //基础信息
 	//dealXuKe()    //许可信息
 	//getChanges()  //变更记录
-	//getGuDong() //股东信息
+	getGuDong() //股东信息
 	//getEmployee() //高管
 	//getInves()    //投资单位
 	//getBranch()   //分支结构

二进制
qyxy_zsl/tieta.xlsx


+ 1 - 1
top_clickhouse/clickhouse.go

@@ -115,7 +115,7 @@ func click() {
 	sess := Mgo.GetMgoConn()
 	defer Mgo.DestoryMongoConn(sess)
 
-	query := sess.DB("top").C("wcc_allcity_2025Q1").Find(nil).Select(map[string]interface{}{"list": 0}).Iter()
+	query := sess.DB("top").C("wcc_allcity_2025Q2").Find(nil).Select(map[string]interface{}{"list": 0}).Iter()
 	count := 0
 	ch := make(chan bool, 20)
 	wg := &sync.WaitGroup{}

+ 4 - 3
top_clickhouse/mian.go

@@ -59,8 +59,9 @@ func getProjectDataFromEs() {
 	//2024-1 - 2024-4;1704038400-1711900800
 	//2023-10-1 2024-1-1;1696089600-1704038400
 	//areaTermsQuery := elastic.NewTermsQuery("area", "江苏", "安徽", "上海", "天津", "河北", "浙江", "天津市", "上海市", "河北省", "安徽省", "江苏省", "浙江省", "北京", "北京市")
-	//rangeQuery := elastic.NewRangeQuery("firsttime").Gte(1711900800).Lt(1719763200) //2024年4-7月
-	rangeQuery := elastic.NewRangeQuery("jgtime").Gte(1735660800).Lt(1743436800) //2025年1-3月
+	//rangeQuery := elastic.NewRangeQuery("jgtime").Gte(1711900800).Lt(1719763200) //2024年4-7月
+	//rangeQuery := elastic.NewRangeQuery("jgtime").Gte(1735660800).Lt(1743436800) //2025年1-3月
+	rangeQuery := elastic.NewRangeQuery("jgtime").Gte(1743436800).Lt(1751299200) //2025年4.1-7.1 ;25年第二季度数据
 	query := elastic.NewBoolQuery().
 		//Must(areaTermsQuery).
 		Must(elastic.NewTermsQuery("bidstatus", "中标", "单一", "成交", "合同")).
@@ -120,7 +121,7 @@ func getProjectDataFromEs() {
 				insert := doc
 				insert["s_winner"] = v
 				//存入新表
-				err = Mgo.InsertOrUpdate("top", "wcc_allcity_2025Q1", insert)
+				err = Mgo.InsertOrUpdate("top", "wcc_allcity_2025Q2", insert)
 				if err != nil {
 					log.Println("error", doc["id"])
 				}

二进制
top_clickhouse/top_clickhouse


+ 36 - 0
updateBidding/bidding.go

@@ -414,3 +414,39 @@ func updateBiddingToptype() {
 	}
 
 }
+
+// updateBiddingBuyer g 更新buyer
+func updateBiddingBuyer() {
+	defer util.Catch()
+	sess := MgoB.GetMgoConn()
+	defer MgoB.DestoryMongoConn(sess)
+
+	it := sess.DB("qfw").C("wcc_buyer_test").Find(nil).Select(nil).Iter()
+	count := 0
+
+	for tmp := make(map[string]interface{}); it.Next(&tmp); count++ {
+		if count%100 == 0 {
+			log.Info("current", log.Int("count", count), log.Any("_id", tmp["_id"]))
+		}
+
+		biddingID := util.ObjToString(tmp["id"])
+		update := make(map[string]interface{})
+		update["buyer"] = "海南警察学院(筹)"
+
+		// 更新Es 数据
+		if len(update) > 0 {
+			//更新MongoDB
+			MgoB.UpdateById("bidding", biddingID, map[string]interface{}{"$set": update})
+			//2.es 项目 更新字段
+			err := Es.UpdateDocument("bidding", biddingID, update)
+			err = EsNew.UpdateDocument("bidding", biddingID, update)
+			err = EsNew.UpdateDocument("bidding_temp", biddingID, update)
+			if err != nil && err.Error() != "Document not updated: noop" {
+				log.Info("bidding es update err", err, biddingID)
+			}
+
+		}
+
+	}
+
+}

+ 101 - 0
updateBidding/buyer.go

@@ -0,0 +1,101 @@
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/olivere/elastic/v7"
+	"io"
+	"log"
+)
+
+func getBuyer() {
+	//url := "http://172.17.4.184:19908"
+	url := "http://127.0.0.1:19908"
+	username := "jybid"
+	password := "Top2023_JEB01i@31"
+	index := "bidding" //索引名
+	// 创建 Elasticsearch 客户端
+	client, err := elastic.NewClient(
+		elastic.SetURL(url),
+		elastic.SetBasicAuth(username, password),
+		elastic.SetSniff(false),
+	)
+	if err != nil {
+		log.Fatalf("创建 Elasticsearch 客户端失败:%s", err)
+	}
+
+	query := elastic.NewBoolQuery()
+	query.Must(elastic.NewTermQuery("buyer", "海南警察学院(筹)"))
+	//query.Must(elastic.NewTermQuery("company_type", "北京市"))
+	ctx := context.Background()
+	//开始滚动搜索
+	scrollID := ""
+	scroll := "10m"
+	searchSource := elastic.NewSearchSource().
+		Query(query).
+		Size(10000).
+		Sort("_doc", true) //升序排序
+	//Sort("_doc", false) //降序排序
+
+	searchService := client.Scroll(index).
+		Size(10000).
+		Scroll(scroll).
+		SearchSource(searchSource)
+
+	res, err := searchService.Do(ctx)
+
+	if err != nil {
+		if err == io.EOF {
+			fmt.Println("没有数据")
+		} else {
+			panic(err)
+		}
+
+	}
+	//defer client.ClearScroll().ScrollId(scrollID).Do(ctx) // 在退出时清理资源
+	fmt.Println("总数是:", res.TotalHits())
+
+	total := 0
+	for len(res.Hits.Hits) > 0 {
+		for _, hit := range res.Hits.Hits {
+			var doc map[string]interface{}
+			err := json.Unmarshal(hit.Source, &doc)
+			if err != nil {
+				log.Printf("解析文档失败:%s", err)
+				continue
+			}
+			//存入新表
+			insert := map[string]interface{}{
+				"buyer": "海南警察学院",
+				"id":    doc["id"],
+			}
+
+			err = MgoB.InsertOrUpdate("qfw", "wcc_buyer_test", insert)
+			if err != nil {
+				log.Println("error", doc["id"])
+			}
+
+		}
+
+		total = total + len(res.Hits.Hits)
+		scrollID = res.ScrollId
+		res, err = client.Scroll().ScrollId(scrollID).Scroll(scroll).Do(ctx)
+		log.Println("current count:", total)
+		if err != nil {
+			if err == io.EOF {
+				// 滚动到最后一批数据,退出循环
+				break
+			}
+			log.Println("滚动搜索失败:", err, res)
+			break // 处理错误时退出循环
+		}
+	}
+	// 在循环外调用 ClearScroll
+	_, err = client.ClearScroll().ScrollId(scrollID).Do(ctx)
+	if err != nil {
+		log.Printf("清理滚动搜索失败:%s", err)
+	}
+
+	fmt.Println("结束~~~~~~~~~~~~~~~")
+}

+ 16 - 12
updateBidding/main.go

@@ -41,13 +41,13 @@ var (
 
 func Init() {
 	MgoB = &mongodb.MongodbSim{
-		MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
-		//MongodbAddr: "127.0.0.1:27083",
-		DbName:   "qfw",
-		Size:     10,
-		UserName: "SJZY_RWbid_ES",
-		Password: "SJZY@B4i4D5e6S",
-		//Direct:      true,
+		//MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
+		MongodbAddr: "127.0.0.1:27083",
+		DbName:      "qfw",
+		Size:        10,
+		UserName:    "SJZY_RWbid_ES",
+		Password:    "SJZY@B4i4D5e6S",
+		Direct:      true,
 	}
 	MgoB.InitPool()
 
@@ -106,8 +106,8 @@ func Init() {
 
 	//es
 	Es = &elastic.Elastic{
-		//S_esurl: "http://127.0.0.1:19908",
-		S_esurl:  "http://172.17.4.184:19908",
+		S_esurl: "http://127.0.0.1:19908",
+		//S_esurl:  "http://172.17.4.184:19908",
 		I_size:   5,
 		Username: "jybid",
 		Password: "Top2023_JEB01i@31",
@@ -116,8 +116,8 @@ func Init() {
 
 	//es 新集群
 	EsNew = &elastic.Elastic{
-		//S_esurl: "http://127.0.0.1:19905",
-		S_esurl:  "http://172.17.4.184:19905",
+		S_esurl: "http://127.0.0.1:19905",
+		//S_esurl:  "http://172.17.4.184:19905",
 		I_size:   5,
 		Username: "jybid",
 		Password: "Top2023_JEB01i@31",
@@ -129,6 +129,10 @@ func main() {
 	//updatePing()
 	//return
 	Init()
+
+	updateBiddingBuyer()
+
+	return
 	//InitEsBiddingField()
 	go updateMethod()   //更新mongodb
 	go updateEsMethod() //更新es
@@ -155,7 +159,7 @@ func main() {
 	//updateBiddingBasicClass() 	//更新 存量数据 basicClass 字段
 	//updateBiddingBasicClassTest() //更新测试环境 	basicClass 字段
 
-	updateBiddingToptype() // 更新招标分类结果
+	//updateBiddingToptype() // 更新招标分类结果
 	log.Info("over")
 	//c := make(chan bool, 1)
 	//<-c

+ 42 - 0
xlsx/xlsx_test.go

@@ -27,6 +27,48 @@ var (
 	countyRe   = regexp.MustCompile(`(?P<county>[^县区旗]+县|[^县区旗]+区|[^县区旗]+旗|[^县区旗]+自治县|[^县区旗]+自治旗)`)
 )
 
+func Test2222(T *testing.T) {
+	filePath := "大气-企业类型程序抽取全为民企-实际核查有非民企0714.xlsx"
+	// 打开文件
+	f, err := excelize.OpenFile(filePath)
+	if err != nil {
+		panic(err)
+	}
+
+	// 遍历 Sheet1,每行拿 B/C 列去匹配
+	sheet1Rows, err := f.GetRows("Sheet1")
+	if err != nil {
+		panic(err)
+	}
+
+	//181 凭安库
+	Mgo181 := &mongodb.MongodbSim{
+		//MongodbAddr: "172.17.4.181:27001",
+		MongodbAddr: "127.0.0.1:27001",
+		DbName:      "mixdata",
+		Size:        10,
+		UserName:    "",
+		Password:    "",
+		Direct:      true,
+	}
+	Mgo181.InitPool()
+
+	for i, row := range sheet1Rows {
+		if i < 1 {
+			continue
+		}
+		name := row[0]
+		log.Println(name)
+
+		where := map[string]interface{}{
+			"company_name": name,
+			"use_flag":     0,
+		}
+
+		base, _ := Mgo181.FindOne("company_base", where)
+	}
+}
+
 func TestXlsx2(T *testing.T) {
 	filePath := "中国政府机构目录树0425.xlsx"
 

二进制
xlsx/大气-企业类型程序抽取全为民企-实际核查有非民企0714.xlsx