Forráskód Böngészése

统计程序~各种备份

zhengkun 3 éve
szülő
commit
e39619af03

+ 2 - 2
data_export_bank/src/config.json

@@ -24,8 +24,8 @@
   "py_mgodb": {
     "addr": "127.0.0.1:27017",
     "db": "mixdata",
-    "coll_1": "company",
-    "coll_2": "jz_company",
+    "coll_1": "jz_company",
+    "coll_2": "company",
     "pool": 10,
     "u_name":"",
     "p_word":""

+ 159 - 89
data_export_bank/src/export_bidata.go

@@ -82,7 +82,7 @@ func isToLongNewFile(num int) (bool,string)  {
 	}
 	return false,""
 }
-
+//导出-招标相关-信息
 func exportBidata() {
 	log.Debug("导出~标讯信息表...")
 	sess := bid_mgo.GetMgoConn()
@@ -93,50 +93,36 @@ func exportBidata() {
 			"$lt": 1646064000,
 		},
 	},0
-	num_1,num_2,num_3,num_4:=0,0,0,0
+	num_1,num_2,num_4:=0,0,0
 	it := sess.DB(bid_mgo.DbName).C(bid_coll).Find(&q).Iter()
 	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
 		if total%10000==0 {
-			log.Debug("curent index ",total,num_1,num_2,num_3,num_4)
-			//f_1.Save(x_name_1+x_tag_1+".xlsx")
-			//f_2.Save(x_name_2+x_tag_2+".xlsx")
-			//f_3.Save(x_name_3+x_tag_3+".xlsx")
+			log.Debug("curent index ",total,num_1,num_2,num_4)
+			f_1.Save(x_name_1+x_tag_1+".xlsx")
+			f_2.Save(x_name_2+x_tag_2+".xlsx")
 			f_4.Save(x_name_4+x_tag_4+".xlsx")
 
-			//b_1,tag_1 := isToLongNewFile(num_1)
-			//if b_1 && !strings.Contains(x_tag_1,tag_1) {
-			//	x_tag_1 = tag_1
-			//	f_1 = xlsx.NewFile()
-			//	sheet_1, _= f_1.AddSheet("招标信息")
-			//	row_1:= sheet_1.AddRow()
-			//	for _,v := range bid_tagText[0]{
-			//		row_1.AddCell().Value = v
-			//	}
-			//}
-			//
-			//b_2,tag_2 := isToLongNewFile(num_2)
-			//if b_2 && !strings.Contains(x_tag_2,tag_2) {
-			//	x_tag_2 = tag_2
-			//	f_2 = xlsx.NewFile()
-			//	sheet_2, _= f_2.AddSheet("中标信息")
-			//	row_2:= sheet_2.AddRow()
-			//	for _,v := range bid_tagText[1]{
-			//		row_2.AddCell().Value = v
-			//	}
-			//
-			//
-			//}
-			//
-			//b_3,tag_3 := isToLongNewFile(num_3)
-			//if b_3 && !strings.Contains(x_tag_3,tag_3) {
-			//	x_tag_3 = tag_3
-			//	f_3 = xlsx.NewFile()
-			//	sheet_3, _= f_3.AddSheet("招标项目")
-			//	row_3:= sheet_3.AddRow()
-			//	for _,v := range bid_tagText[2]{
-			//		row_3.AddCell().Value = v
-			//	}
-			//}
+			b_1,tag_1 := isToLongNewFile(num_1)
+			if b_1 && !strings.Contains(x_tag_1,tag_1) {
+				x_tag_1 = tag_1
+				f_1 = xlsx.NewFile()
+				sheet_1, _= f_1.AddSheet("招标信息")
+				row_1:= sheet_1.AddRow()
+				for _,v := range bid_tagText[0]{
+					row_1.AddCell().Value = v
+				}
+			}
+
+			b_2,tag_2 := isToLongNewFile(num_2)
+			if b_2 && !strings.Contains(x_tag_2,tag_2) {
+				x_tag_2 = tag_2
+				f_2 = xlsx.NewFile()
+				sheet_2, _= f_2.AddSheet("中标信息")
+				row_2:= sheet_2.AddRow()
+				for _,v := range bid_tagText[1]{
+					row_2.AddCell().Value = v
+				}
+			}
 
 			b_4,tag_4 := isToLongNewFile(num_4)
 			if b_4 && !strings.Contains(x_tag_4,tag_4) {
@@ -151,19 +137,18 @@ func exportBidata() {
 		}
 		spidercode := qu.ObjToString(tmp["spidercode"])
 		extracttype := qu.IntAll(tmp["extracttype"])
-		//subtype := qu.ObjToString(tmp["subtype"])
-		//toptype := qu.ObjToString(tmp["toptype"])
+		subtype := qu.ObjToString(tmp["subtype"])
+		toptype := qu.ObjToString(tmp["toptype"])
 		site := qu.ObjToString(tmp["site"])
 		if extracttype==-1&&site!="中国政府采购网"&&site!="中国招标投标公共服务平台"{
 			tmp = make(map[string]interface{})
 			continue
 		}
-		if kb_spicode[spidercode]=="" {
+		if kb_spicode[spidercode]=="" && xm_spicode[spidercode]=="" {
 			tmp = make(map[string]interface{})
 			continue
 		}
 
-
 		topscopeclass := []string{}
 		if t_class, ok := tmp["topscopeclass"].(primitive.A); ok {
 			topscopeclass = qu.ObjArrToStringArr(t_class)
@@ -188,32 +173,22 @@ func exportBidata() {
 
 
 
-		//if toptype=="招标" {
-		//	num_1++
-		//	data_1 := dealWithZhaoBiao(tmp,num_1,topscope)
-		//	row_1:= sheet_1.AddRow()
-		//	for _,v := range data_1{
-		//		row_1.AddCell().Value = v
-		//	}
-		//}
-		//
-		//
-		//if subtype == "中标" || subtype == "成交" || subtype == "合同" {
-		//	num_2++
-		//	data_2 := dealWithZhongBiao(tmp,num_2,topscope)
-		//	row_2:= sheet_2.AddRow()
-		//	for _,v := range data_2{
-		//		row_2.AddCell().Value = v
-		//	}
-		//}
-		//if xm_spicode[spidercode]!="" {
-		//	num_3++
-		//	data_3 := dealWithXiangMu(tmp,num_3,topscope)
-		//	row_3:= sheet_3.AddRow()
-		//	for _,v := range data_3{
-		//		row_3.AddCell().Value = v
-		//	}
-		//}
+		if toptype=="招标" {
+			num_1++
+			data_1 := dealWithZhaoBiao(tmp,num_1,topscope)
+			row_1:= sheet_1.AddRow()
+			for _,v := range data_1{
+				row_1.AddCell().Value = v
+			}
+		}
+		if subtype == "中标" || subtype == "成交" || subtype == "合同" {
+			num_2++
+			data_2 := dealWithZhongBiao(tmp,num_2,topscope)
+			row_2:= sheet_2.AddRow()
+			for _,v := range data_2{
+				row_2.AddCell().Value = v
+			}
+		}
 		if kb_spicode[spidercode]!=""{
 			num_4++
 			data_4 := dealWithKaiBiao(tmp,num_4,topscope)
@@ -226,17 +201,101 @@ func exportBidata() {
 	}
 
 
-	log.Debug("is over bidding ",total,num_1,num_2,num_3,num_4)
+	log.Debug("is over bidding ",total,num_1,num_2,num_4)
 
 	if total>0 {
-		//f_1.Save(x_name_1+x_tag_1+".xlsx")
-		//f_2.Save(x_name_2+x_tag_2+".xlsx")
-		//f_3.Save(x_name_3+x_tag_3+".xlsx")
+		f_1.Save(x_name_1+x_tag_1+".xlsx")
+		f_2.Save(x_name_2+x_tag_2+".xlsx")
 		f_4.Save(x_name_4+x_tag_4+".xlsx")
 	}
 }
+//导出-项目相关-信息
+func exportProjectSetData() {
+	log.Debug("导出~标讯信息表...")
+	sess := ext_mgo.GetMgoConn()
+	defer ext_mgo.DestoryMongoConn(sess)
+	q,total := map[string]interface{}{
+		"_id": map[string]interface{}{
+			"$gte": StringTOBsonId("61cf29000000000000000000"),
+			"$lte": StringTOBsonId("621cf1800000000000000000"),
+		},
+	},0
+	//1640966400    1646064000
+	num_3 := 0
+	it := sess.DB(ext_mgo.DbName).C("projectset_20200918").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("curent index ",total,num_3)
+			f_3.Save(x_name_3+x_tag_3+".xlsx")
+			b_3,tag_3 := isToLongNewFile(num_3)
+			if b_3 && !strings.Contains(x_tag_3,tag_3) {
+				x_tag_3 = tag_3
+				f_3 = xlsx.NewFile()
+				sheet_3, _= f_3.AddSheet("招标项目")
+				row_3:= sheet_3.AddRow()
+				for _,v := range bid_tagText[2]{
+					row_3.AddCell().Value = v
+				}
+			}
+		}
+		zbtime := qu.IntAll(tmp["zbtime"])
+		if zbtime<1640966400 || zbtime>=1646064000 {
+			tmp = make(map[string]interface{})
+			continue
+		}
+		topscopeclass := []string{}
+		if t_class, ok := tmp["topscopeclass"].(primitive.A); ok {
+			topscopeclass = qu.ObjArrToStringArr(t_class)
+		}else {
+			if t_class, ok := tmp["topscopeclass"].([]interface{}); ok {
+				topscopeclass = qu.ObjArrToStringArr(t_class)
+			}
+		}
+
+		list := []map[string]interface{}{}
+		if l, ok := tmp["list"].(primitive.A); ok {
+			list = qu.ObjArrToMapArr(l)
+		}else {
+			if l, ok := tmp["list"].([]interface{}); ok {
+				list = qu.ObjArrToMapArr(l)
+			}
+		}
+
+		site := ""
+		if len(list)>0 {
+			site = qu.ObjToString(list[0]["site"])
+			if strings.Contains(site,"元博网") {
+				site = "剑鱼发布"
+			}
+		}
+		topscope := ""
+		for k,v := range topscopeclass{
+			length := utf8.RuneCountInString(v)
+			new_v := string([]rune(v)[0:length-1])
+			if k==0 {
+				topscope = new_v
+			}else {
+				if! strings.Contains(topscope,new_v) {
+					topscope = topscope+","+new_v
+				}
+			}
+		}
 
-//导出抽取数据-评标相关
+		num_3++
+		data_3 := dealWithXiangMu(tmp,num_3,topscope,site)
+		row_3:= sheet_3.AddRow()
+		for _,v := range data_3{
+			row_3.AddCell().Value = v
+		}
+		tmp = make(map[string]interface{})
+	}
+
+	log.Debug("is over bidding ",total,num_3)
+	if total>0 {
+		f_3.Save(x_name_3+x_tag_3+".xlsx")
+	}
+}
+//导出-评标相关-信息
 func exportExtdata() {
 	log.Debug("导出~评标信息表...")
 	sess := ext_mgo.GetMgoConn()
@@ -346,7 +405,11 @@ func exportExtdata() {
 func dealWithZhaoBiao(tmp map[string]interface{},index int,topscope string)[]string {
 	dataArr := []string{}
 	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,qu.ObjToString(tmp["site"]))
+	site := qu.ObjToString(tmp["site"])
+	if strings.Contains(site,"元博网") {
+		site = "剑鱼发布"
+	}
+	dataArr = append(dataArr,site)
 	dataArr = append(dataArr,qu.ObjToString(tmp["projectname"]))
 	dataArr = append(dataArr,qu.ObjToString(tmp["area"]))
 	dataArr = append(dataArr,qu.ObjToString(tmp["city"]))
@@ -395,12 +458,15 @@ func dealWithZhaoBiao(tmp map[string]interface{},index int,topscope string)[]str
 
 	return dataArr
 }
-
 //中标信息
 func dealWithZhongBiao(tmp map[string]interface{},index int,topscope string)[]string {
 	dataArr := []string{}
 	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,qu.ObjToString(tmp["site"]))
+	site := qu.ObjToString(tmp["site"])
+	if strings.Contains(site,"元博网") {
+		site = "剑鱼发布"
+	}
+	dataArr = append(dataArr,site)
 	dataArr = append(dataArr,qu.ObjToString(tmp["projectname"]))
 	dataArr = append(dataArr,qu.ObjToString(tmp["area"]))
 	dataArr = append(dataArr,qu.ObjToString(tmp["city"]))
@@ -441,25 +507,23 @@ func dealWithZhongBiao(tmp map[string]interface{},index int,topscope string)[]st
 
 	return dataArr
 }
-
 //项目信息
-func dealWithXiangMu(tmp map[string]interface{},index int,topscope string)[]string {
+func dealWithXiangMu(tmp map[string]interface{},index int,topscope string,site string)[]string {
 	dataArr := []string{}
 	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,qu.ObjToString(tmp["site"]))
+	dataArr = append(dataArr,site)
 	dataArr = append(dataArr,qu.ObjToString(tmp["projectname"]))
 	dataArr = append(dataArr,topscope)
 	dataArr = append(dataArr,qu.ObjToString(tmp["area"]))
 	dataArr = append(dataArr,qu.ObjToString(tmp["city"]))
 	dataArr = append(dataArr,qu.ObjToString(tmp["district"]))
 	dataArr = append(dataArr,"")
-	publishtime := qu.Int64All(tmp["publishtime"])
-	if publishtime>0 { //招标项目建立时间
-		dataArr = append(dataArr,time.Unix(publishtime, 0).Format(timeLayout))
+	zbtime := qu.Int64All(tmp["zbtime"])
+	if zbtime>0 { //招标项目建立时间
+		dataArr = append(dataArr,time.Unix(zbtime, 0).Format(timeLayout))
 	}else {
 		dataArr = append(dataArr,"")
 	}
-
 	agency := qu.ObjToString(tmp["agency"])
 	if agency!="" {
 		qy_data := qy_mgo.FindOne(qy_coll, map[string]interface{}{
@@ -481,12 +545,15 @@ func dealWithXiangMu(tmp map[string]interface{},index int,topscope string)[]stri
 
 	return dataArr
 }
-
 //开标信息
 func dealWithKaiBiao(tmp map[string]interface{},index int,topscope string)[]string {
 	dataArr := []string{}
 	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,qu.ObjToString(tmp["site"]))
+	site := qu.ObjToString(tmp["site"])
+	if strings.Contains(site,"元博网") {
+		site = "剑鱼发布"
+	}
+	dataArr = append(dataArr,site)
 	projectname := qu.ObjToString(tmp["projectname"])
 	if projectname != "" {
 		dataArr = append(dataArr,qu.ObjToString(tmp["projectname"]))
@@ -506,12 +573,15 @@ func dealWithKaiBiao(tmp map[string]interface{},index int,topscope string)[]stri
 	}
 	return dataArr
 }
-
 //评标信息
 func dealWithPingBiao(tmp map[string]interface{},index int,winners string,topscope string)[]string {
 	dataArr := []string{}
 	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,qu.ObjToString(tmp["site"]))
+	site := qu.ObjToString(tmp["site"])
+	if strings.Contains(site,"元博网") {
+		site = "剑鱼发布"
+	}
+	dataArr = append(dataArr,site)
 	dataArr = append(dataArr,qu.ObjToString(tmp["projectname"]))
 	dataArr = append(dataArr,topscope)
 	dataArr = append(dataArr,qu.ObjToString(tmp["area"]))

+ 280 - 109
data_export_bank/src/export_qydata.go

@@ -4,7 +4,10 @@ import (
 	"fmt"
 	"github.com/go-xweb/log"
 	"github.com/tealeg/xlsx"
+	"go.mongodb.org/mongo-driver/bson/primitive"
 	"os"
+	qu "qfw/util"
+	"strings"
 )
 
 var (
@@ -17,7 +20,6 @@ var (
 	sheet_6 ,sheet_7,sheet_8,sheet_9,sheet_10,sheet_11 	*xlsx.Sheet
 )
 
-
 func initQydata()  {
 	os.Remove("公司资质.xlsx")
 	os.Remove("注册人员.xlsx")
@@ -67,7 +69,7 @@ func initQydata()  {
 
 //导出企业信息表
 func exportQydataOne() {
-	log.Debug("导出~企业信息表...")
+	log.Println("导出~企业信息表...")
 	sess := py_mgo.GetMgoConn()
 	defer py_mgo.DestoryMongoConn(sess)
 	q,total := map[string]interface{}{},0
@@ -75,20 +77,37 @@ func exportQydataOne() {
 	it := sess.DB(py_mgo.DbName).C(py_coll_one).Find(&q).Iter()
 	for tmp := make(map[string]interface{}); it.Next(&tmp);total++ {
 		if total%1000 == 0 {
-			log.Debug("curent index ",total,num_6,num_7,num_8,num_9,num_10)
+			log.Println("curent index ",total,num_6,num_7,num_8,num_9,num_10)
+			f_6.Save("公司资质.xlsx")
+			f_7.Save("注册人员.xlsx")
+			f_8.Save("黑名单.xlsx")
+			f_9.Save("不良名单.xlsx")
+			f_10.Save("诚信惩戒.xlsx")
 		}
-		//区分导出不同表
 
+		//公共字段数据数据
+		num_6 = dealWithGSZZ(tmp,num_6)
+		num_7 = dealWithZCRY(tmp,num_7)
+		num_8 = dealWithHMD(tmp,num_8)
+		num_9 = dealWithBLMD(tmp,num_9)
+		num_10 = dealWithCXCJ(tmp,num_10)
 
-		
 		tmp = make(map[string]interface{})
 	}
+
+	if total > 0 {
+		f_6.Save("公司资质.xlsx")
+		f_7.Save("注册人员.xlsx")
+		f_8.Save("黑名单.xlsx")
+		f_9.Save("不良名单.xlsx")
+		f_10.Save("诚信惩戒.xlsx")
+	}
+
 	log.Println("is over one ",total,num_6,num_7,num_8,num_9,num_10)
 }
-
 //导出围标串标表
 func exportQydataTwo()  {
-	log.Debug("导出~围标串标表...")
+	log.Println("导出~围标串标表...")
 	sess := py_mgo.GetMgoConn()
 	defer py_mgo.DestoryMongoConn(sess)
 	q,total := map[string]interface{}{},0
@@ -96,129 +115,281 @@ func exportQydataTwo()  {
 	it := sess.DB(py_mgo.DbName).C(py_coll_two).Find(&q).Iter()
 	for tmp := make(map[string]interface{}); it.Next(&tmp);total++ {
 		if total%1000 == 0 {
-			log.Debug("curent index ",total,num_11)
+			log.Println("curent index ",total,num_11)
+			f_11.Save("围标串标.xlsx")
 		}
-
-
-
+		num_11 = dealWithWBCB(tmp,num_11)
 		tmp = make(map[string]interface{})
 	}
+	if total > 0 {
+		f_11.Save("围标串标.xlsx")
+	}
 	log.Println("is over two ",total,num_11)
 }
 
 
-
 //公司资质
-func dealWithGSZZ(tmp map[string]interface{},index int) []string {
-	dataArr := []string{}
-	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-
-	dataArr = append(dataArr,"")//所属行业
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
+func dealWithGSZZ(tmp map[string]interface{},index int)int{
+	company_quality := []map[string]interface{}{}
+	if info , ok := tmp["company_quality"].(primitive.A); ok {
+		company_quality = qu.ObjArrToMapArr(info)
+	}else {
+		if info, ok := tmp["company_quality"].([]interface{}); ok {
+			company_quality = qu.ObjArrToMapArr(info)
+		}
+	}
+	//公共字段
+	credit_no := qu.ObjToString(tmp["credit_no"])
+	legal_person := qu.ObjToString(tmp["legal_person"])
+	company_type := qu.ObjToString(tmp["company_type"])
+	company_name := qu.ObjToString(tmp["company_name"])
+	address := qu.ObjToString(tmp["address"])
+	business_address := qu.ObjToString(tmp["business_address"])
+	industry := qu.ObjToString(tmp["industry"])
+	register_date := qu.ObjToString(tmp["register_date"])
+	tel_phone := qu.ObjToString(tmp["tel_phone"])
+	area,city,district := analyseACD(address)
+	for _,v := range company_quality {
+		index++
+		dataArr := []string{}
+		dataArr = append(dataArr,fmt.Sprintf("%d",index))
+		dataArr = append(dataArr,"全国建筑市场监管公共服务平台")
+		dataArr = append(dataArr,company_name)//企业名称
+		dataArr = append(dataArr,credit_no)
+		dataArr = append(dataArr,legal_person)
+		dataArr = append(dataArr,qu.ObjToString(company_type))
+		dataArr = append(dataArr,industry)//所属行业
+		dataArr = append(dataArr,area)
+		dataArr = append(dataArr,city)
+		dataArr = append(dataArr,district)
+		dataArr = append(dataArr,business_address) //企业地址
+
+		dataArr = append(dataArr,qu.ObjToString(v["quality_type"])) //企业资质类别
+		dataArr = append(dataArr,qu.ObjToString(v["quality_no"]))
+		dataArr = append(dataArr,qu.ObjToString(v["fzrq"]))//发证日期
+		dataArr = append(dataArr,qu.ObjToString(v["fzyxq"]))
+		dataArr = append(dataArr,qu.ObjToString(v["fzjg"]))
+		dataArr = append(dataArr,qu.ObjToString(v["quality_name"]))
+
+		dataArr = append(dataArr,register_date)//注册时间
+		dataArr = append(dataArr,tel_phone)
+		dataArr = append(dataArr,"")
+		dataArr = append(dataArr,"")
+		dataArr = append(dataArr,"")//失信标记
+
+		row_6:= sheet_6.AddRow()
+		for _,v_1 := range dataArr{
+			row_6.AddCell().Value = v_1
+		}
+	}
+	return index
+}
+//注册人员
+func dealWithZCRY(tmp map[string]interface{},index int) int {
+	company_staff := []map[string]interface{}{}
+	if info , ok := tmp["company_staff"].(primitive.A); ok {
+		company_staff = qu.ObjArrToMapArr(info)
+	}else {
+		if info, ok := tmp["company_staff"].([]interface{}); ok {
+			company_staff = qu.ObjArrToMapArr(info)
+		}
+	}
+	company_name := qu.ObjToString(tmp["company_name"])
+	register_date := qu.ObjToString(tmp["register_date"])
+
+	dict := map[string]string{}
+
+	for _,v := range company_staff {
+		id_no := qu.ObjToString(v["id_no"])
+		reg_type := qu.ObjToString(v["reg_type"])
+		reg_no := qu.ObjToString(v["reg_no"])
+		reg_major := qu.ObjToString(v["reg_major"])
+		key := fmt.Sprintf("%s_%s_%s_%s_%s",company_name,id_no,reg_type,reg_no,reg_major)
+		if dict[key]=="" {
+			index++
+			dict[key] = key
+		}else {
+			continue
+		}
+		dataArr := []string{}
+		dataArr = append(dataArr,fmt.Sprintf("%d",index))
+		dataArr = append(dataArr,"全国建筑市场监管公共服务平台")
+		dataArr = append(dataArr,qu.ObjToString(v["name"]))
+		dataArr = append(dataArr,company_name)//企业名称
+		dataArr = append(dataArr,qu.ObjToString(v["id_no"]))
+		dataArr = append(dataArr,qu.ObjToString(v["reg_type"]))
+		dataArr = append(dataArr,qu.ObjToString(v["reg_no"]))
+		dataArr = append(dataArr,qu.ObjToString(v["reg_major"]))
+		dataArr = append(dataArr,register_date)//注册时间
+
+		row_7:= sheet_7.AddRow()
+		for _,v_1 := range dataArr{
+			row_7.AddCell().Value = v_1
+		}
+	}
+	return index
+}
+//黑名单
+func dealWithHMD(tmp map[string]interface{},index int) int {
+	black_list := []map[string]interface{}{}
+	if info , ok := tmp["black_list"].(primitive.A); ok {
+		black_list = qu.ObjArrToMapArr(info)
+	}else {
+		if info, ok := tmp["black_list"].([]interface{}); ok {
+			black_list = qu.ObjArrToMapArr(info)
+		}
+	}
+	company_name := qu.ObjToString(tmp["company_name"])
+	for _,v := range black_list {
+		index++
+		dataArr := []string{}
+		dataArr = append(dataArr, fmt.Sprintf("%d", index))
+		dataArr = append(dataArr, "全国建筑市场监管公共服务平台")
+		dataArr = append(dataArr, company_name)//企业名称
+		dataArr = append(dataArr, qu.ObjToString(v["black_list_no"]))
+		dataArr = append(dataArr, qu.ObjToString(v["black_list_rdyj"]))
+		dataArr = append(dataArr, qu.ObjToString(v["rdbm"]))
+
+		dataArr = append(dataArr, "") //文号
+		dataArr = append(dataArr, "")
+		dataArr = append(dataArr, "")
+
+		row_8:= sheet_8.AddRow()
+		for _,v_1 := range dataArr{
+			row_8.AddCell().Value = v_1
+		}
+	}
+	return index
+}
+//不良名单
+func dealWithBLMD(tmp map[string]interface{},index int) int {
+	bad_behavior := []map[string]interface{}{}
+	if info , ok := tmp["bad_behavior"].(primitive.A); ok {
+		bad_behavior = qu.ObjArrToMapArr(info)
+	}else {
+		if info, ok := tmp["bad_behavior"].([]interface{}); ok {
+			bad_behavior = qu.ObjArrToMapArr(info)
+		}
+	}
+	company_name := qu.ObjToString(tmp["company_name"])
+	for _,v := range bad_behavior {
+		index++
+		dataArr := []string{}
+		dataArr = append(dataArr, fmt.Sprintf("%d", index))
+		dataArr = append(dataArr, "全国建筑市场监管公共服务平台")
+		dataArr = append(dataArr, company_name)//企业名称
+
+		dataArr = append(dataArr, qu.ObjToString(v["integrity_no"]))
+		dataArr = append(dataArr, qu.ObjToString(v["decide_content"]))
+		dataArr = append(dataArr, qu.ObjToString(v["ssbm"]))
+
+		dataArr = append(dataArr, "") //文号
+		dataArr = append(dataArr, "")
+		dataArr = append(dataArr, "")
+
+		row_9:= sheet_9.AddRow()
+		for _,v_1 := range dataArr{
+			row_9.AddCell().Value = v_1
+		}
+	}
 
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
+	return index
+}
+//诚信惩戒
+func dealWithCXCJ(tmp map[string]interface{},index int) int {
+	punish := []map[string]interface{}{}
+	if info , ok := tmp["punish"].(primitive.A); ok {
+		punish = qu.ObjArrToMapArr(info)
+	}else {
+		if info, ok := tmp["punish"].([]interface{}); ok {
+			punish = qu.ObjArrToMapArr(info)
+		}
+	}
+	company_name := qu.ObjToString(tmp["company_name"])
+	for _,v := range punish {
+		index++
+		dataArr := []string{}
+		dataArr = append(dataArr, fmt.Sprintf("%d", index))
+		dataArr = append(dataArr, "全国建筑市场监管公共服务平台")
+		dataArr = append(dataArr, company_name)//企业名称
+		dataArr = append(dataArr, qu.ObjToString(v["punish_no"]))
+		dataArr = append(dataArr, qu.ObjToString(v["legal_person"]))
+		dataArr = append(dataArr, qu.ObjToString(v["reason"]))
+		dataArr = append(dataArr, qu.ObjToString(v["rdbm"]))
+
+		dataArr = append(dataArr, "") //文号
+		dataArr = append(dataArr, qu.ObjToString(v["join_date"]))
+		dataArr = append(dataArr, "")
+
+		row_10:= sheet_10.AddRow()
+		for _,v_1 := range dataArr{
+			row_10.AddCell().Value = v_1
+		}
+	}
 
-	dataArr = append(dataArr,"")//发证日期
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
+	return index
+}
 
-	dataArr = append(dataArr,"")//联系方式
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
 
 
+//围标串标
+func dealWithWBCB(tmp map[string]interface{},index int) int {
+	info := []map[string]interface{}{}
+	if info_data , ok := tmp["info"].(primitive.A); ok {
+		info = qu.ObjArrToMapArr(info_data)
+	}else {
+		if info_data, ok := tmp["info"].([]interface{}); ok {
+			info = qu.ObjArrToMapArr(info_data)
+		}
+	}
+	company_name := qu.ObjToString(tmp["company"])
+	key_words := qu.ObjToString(tmp["key_words"])
+	if strings.Contains(key_words,"串") {
+		key_words = "串标"
+	}else if strings.Contains(key_words,"围") {
+		key_words = "围标"
+	}else {
+		key_words = "其他"
+	}
+	for _,v := range info {
+		index++
+		dataArr := []string{}
+		dataArr = append(dataArr, fmt.Sprintf("%d", index))
+		dataArr = append(dataArr, qu.ObjToString(v["source"]))
+		dataArr = append(dataArr, company_name)
+		dataArr = append(dataArr, qu.ObjToString(v["time"]))
+		dataArr = append(dataArr, key_words)
+		dataArr = append(dataArr, qu.ObjToString(v["url"]))
+
+		row_11:= sheet_11.AddRow()
+		for _,v_1 := range dataArr{
+			row_11.AddCell().Value = v_1
+		}
+	}
 
 
-	return dataArr
-}
-//注册人员
-func dealWithZCRY(tmp map[string]interface{},index int) []string {
-	dataArr := []string{}
-	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-
-	dataArr = append(dataArr,"")//注册类别
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-
-	return dataArr
-}
-//黑名单
-func dealWithHMD(tmp map[string]interface{},index int) []string {
-	dataArr := []string{}
-	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-
-	dataArr = append(dataArr,"")//文号
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-
-	return dataArr
+	return index
 }
-//不良名单
-func dealWithBLMD(tmp map[string]interface{},index int) []string {
-	dataArr := []string{}
-	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
 
-	dataArr = append(dataArr,"")//文号
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
 
 
-	return dataArr
-}
-//诚信惩戒
-func dealWithCXYC(tmp map[string]interface{},index int) []string {
-	dataArr := []string{}
-	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
 
 
-	dataArr = append(dataArr,"")//文号
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
 
+func analyseACD(str string) (string,string,string) {
+	area,city,district := "","",""
+	arr := strings.Split(str,"-")
+	if len(arr)==1 {
+		area = arr[0]
+	}else if len(arr)==2 {
+		area = arr[0]
+		city = arr[1]
+	}else if len(arr)>=3 {
+		area = arr[0]
+		city = arr[1]
+		district = arr[2]
+	}else {
 
-	return dataArr
-}
-//围标串标
-func dealWithWBCB(tmp map[string]interface{},index int) []string {
-	dataArr := []string{}
-	dataArr = append(dataArr,fmt.Sprintf("%d",index))
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	dataArr = append(dataArr,"")
-	return dataArr
+	}
+	return area,city,district
 }

+ 8 - 3
data_export_bank/src/main.go

@@ -115,11 +115,16 @@ func init()  {
 	log.Println("初始化~完毕...")
 }
 func main()  {
+
 	//go exportExtdata() //评标
-	//go exportBidata() //招标-中标-项目-开标
+	//go exportProjectSetData()//项目
+	//go exportBidata() //招标-中标-开标
 
-	//exportQydataOne()
-	//exportQydataTwo()
+	//go exportQydataOne()
+	//go exportQydataTwo()
 
 	time.Sleep(99999*time.Hour)
+
+
+
 }

+ 7 - 2
data_export_yx/src/clean_time.go

@@ -146,13 +146,18 @@ func cleanStrToTimestamp(time_str string,publishtime int64) int64 {
 		}
 		if m>0&&m<13 {
 			m_s := fmt.Sprintf("%d",m)
-			y_s := fmt.Sprintf("%d",time.Now().Year())
+			//优先取发布时间-的年份--待完善
+			y_s := fmt.Sprintf("%d",time.Unix(publishtime, 0).Year())
+			//y_s := fmt.Sprintf("%d",time.Now().Year())
 			timestr = y_s + "-" + MDhmsRepair(m_s) + "-01"
 			t, _ := time.ParseInLocation("2006-01-02", timestr, time.Local)
 			if t.Unix()>publishtime {
 				timestamp = t.Unix()
 			}else {
-				timestamp = t.Unix()+int64(365*86400)
+				y_s = fmt.Sprintf("%d",time.Unix(publishtime, 0).Year()+1)
+				timestr = y_s + "-" + MDhmsRepair(m_s) + "-01"
+				t1, _ := time.ParseInLocation("2006-01-02", timestr, time.Local)
+				timestamp = t1.Unix()
 			}
 		}
 	}

+ 1 - 1
data_export_yx/src/config.json

@@ -2,7 +2,7 @@
   "save_mgodb": {
     "addr": "127.0.0.1:27017",
     "db": "zhengkun",
-    "coll": "zktest_cgyx_data",
+    "coll": "20220510Rj_cgyx",
     "pool": 5
   },
   "export_coll": "1111122222",

+ 1 - 2
data_export_yx/src/main.go

@@ -30,7 +30,7 @@ func initMgo()  {
 	save_mgo.InitPool()
 	export_coll = qu.ObjToString(sysconfig["export_coll"])
 
-	start_time = time.Date(time.Now().Year(), 3, 1, 0, 0, 0, 0, time.Local).Unix()
+	start_time = time.Date(time.Now().Year(), 5, 1, 0, 0, 0, 0, time.Local).Unix()
 	end_time = time.Date(time.Now().Year()+1, 1, 1, 0, 0, 0, 0, time.Local).Unix()
 
 	words_arr = qu.ObjArrToMapArr(sysconfig["words_arr"].([]interface{}))
@@ -90,7 +90,6 @@ func init()  {
 func main()  {
 	log.Println("测试...")
 	//dealWithCgyxData()
-
 	exportExcle()
 
 }

+ 192 - 0
data_template/src/expdata.go

@@ -0,0 +1,192 @@
+package main
+
+import (
+	log "github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	qu "qfw/util"
+)
+
+
+//导出数据
+func expExampleExtractData() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total, isok := map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_unit_bidding").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+
+		data_new := save_mgo.FindById("zktest_extract_new",tmpid)
+		save_mgo.Save("zktest_unit_ext_new",data_new)
+
+		data_old := save_mgo.FindById("zktest_extract_old",tmpid)
+		save_mgo.Save("zktest_unit_ext_old",data_old)
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,isok)
+}
+//从源数据处-导出单元测试样例
+func expExampleBiddingData()  {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total, isok := map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_extract_bidding").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+		if total%7==0 {
+			isok++
+			save_mgo.Save("zktest_unit_bidding",tmp)
+			data := save_mgo.FindById("zktest_extract_marked",tmpid)
+			save_mgo.Save("zktest_unit_marked",data)
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,isok)
+}
+//同步marked数据
+func synchronizationMarkedata(){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total, isok := map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_extract_old").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+
+		data := save_mgo.FindById("marked",tmpid)
+		if data!=nil && len(data)>2 {
+			update := data
+			update["id"] = tmpid
+			save_mgo.Save("zktest_marked",update)
+		} else {
+			data = save_mgo.FindOne("marked", map[string]interface{}{
+				"id":tmpid,
+			})
+			if data!=nil && len(data)>2 {
+				update := data
+				update["id"] = tmpid
+				update["_id"] = tmp["_id"]
+				save_mgo.Save("zktest_marked",update)
+			}else {
+				isok++
+			}
+		}
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,isok)
+}
+//导出bidding源数据
+func expSourceBidding() {
+	log.Debug("导出源数据...")
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total, isok := map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_marked_id").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		tmpid := qu.ObjToString(tmp["id"])
+		data := save_mgo.FindById("bidding",tmpid)
+		if data!=nil && len(data)>2 {
+			isok++
+			save_mgo.Save("zktest_marked_data",data)
+		}else {
+			data_back := save_mgo.FindById("bidding_back",tmpid)
+			if data_back!=nil && len(data_back)>2 {
+				isok++
+				save_mgo.Save("zktest_marked_data",data_back)
+			}else {
+				log.Debug("使用id字段查不到数据",tmp["_id"])
+				tmpid = BsonTOStringId(tmp["_id"])
+				data_other := save_mgo.FindById("bidding",tmpid)
+				if data_other!=nil && len(data_other)>2 {
+					isok++
+					save_mgo.Save("zktest_marked_data",data_other)
+				}else {
+					data_other_back := save_mgo.FindById("bidding_back",tmpid)
+					if data_other_back!=nil && len(data_other_back)>2 {
+						isok++
+						save_mgo.Save("zktest_marked_data",data_other_back)
+					}else {
+						log.Debug("两个id均查不到",tmp["_id"])
+					}
+				}
+			}
+		}
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,isok)
+
+}
+
+
+
+
+
+
+//导出错误金额-中标金额,预算金额
+func expdataJinEr(){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total, isok := map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_extract_new").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		wrong_key_item := []string{}
+		if res, ok := tmp["wrong_key_item"].(primitive.A); ok {
+			wrong_key_item = qu.ObjArrToStringArr(res)
+		}else {
+			if res, ok := tmp["wrong_key_item"].([]interface{}); ok {
+				wrong_key_item = qu.ObjArrToStringArr(res)
+			}
+		}
+		isWrong  := false
+		for _,v:= range wrong_key_item {
+			if qu.ObjToString(v)=="bidamount" {
+				isWrong = true
+				break
+			}
+		}
+		if isWrong {
+			isok++
+			money := qu.Float64All(tmp["bidamount"])
+			tmpid := BsonTOStringId(tmp["_id"])
+			data := save_mgo.FindById("zktest_extract_marked",tmpid)
+			save_dict := map[string]interface{}{}
+			save_dict["_id"] = tmp["_id"]
+			save_dict["money"] = tmp["bidamount"]
+			save_dict["new_money"] = data["bidamount"]
+			save_dict["href"] = tmp["href"]
+			save_dict["jytest_href"] = tmp["jytest_href"]
+			mark := ""
+			if money == 0.0 {
+				mark = "空"
+			}else if money > 0.0 && money <=1000.0 {
+				mark = "过小"
+			}else if money > 1000.0 && money <=100000000.0 {
+				mark = "正常"
+			}else if money > 100000000.0 {
+				mark = "过大"
+			}
+			save_dict["mark"] = mark
+			save_mgo.Save("zktest_zktest_bidamount",save_dict)
+		}
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,isok)
+}

+ 40 - 0
data_template/src/main.go

@@ -0,0 +1,40 @@
+package main
+
+var (
+	save_mgo        	*MongodbSim
+)
+
+func init()  {
+	save_mgo = &MongodbSim{
+		MongodbAddr: "127.0.0.1:27017",
+		DbName:      "zhengkun",
+		Size:        10,
+		UserName: "",
+		Password: "",
+	}
+	save_mgo.InitPool()
+
+	//save_mgo = &MongodbSim{
+	//	MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
+	//	DbName:      "qfw",
+	//	Size:        10,
+	//	UserName: "zhengkun",
+	//	Password: "zk@123123",
+	//}
+	//save_mgo.InitPool()
+}
+
+func main()  {
+	//根据标注数据id导出bidding源数据
+	//expSourceBidding()//导出源数据
+	//synchronizationMarkedata() //同步marked数据
+	//expExampleBiddingData() //导出单元测试数据
+	//expExampleExtractData()//导出-测试数据的抽取数据
+
+
+
+
+	expdataJinEr()//导出错误金额数据
+
+}
+

+ 329 - 0
data_template/src/mgo.go

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

+ 54 - 1
listen_data/src/config.json

@@ -27,5 +27,58 @@
     "user":     "zhengkun@topnet.net.cn",
     "pwd":      "Zheng123456"
   },
-  "xlsx_name" : "site_data.xlsx"
+  "xlsx_name" : "site_data.xlsx",
+
+  "rp_blacklist": ["采购项目","所在地", "中标", "公告", "中标公告", "成交", "入围", "变更", "开标结果", "入围招标变更", "成交信息", "资格预审", "资格", "供应商", "购置合同", "五标段", "六标段", "合同", "竞争性谈判", "竞争性", "谈判", "公示时间", "招标公告", "废标", "流标", "废标公告", "流标公告", "磋商", "询价", "项目联系人", "中标工期", "随机抽取", "全过程",
+    "中标信息", "定标日期", "单价", "中标标的名称", "单位名称", "经济类", "法律类", "其他事项", "其它事项", "行政法规", "学历", "澄清", "无法律", "成员", "说明", "公示期", "时至", "时止)",
+    "中标候选人", "中标结果", "招标人名称", "项目名称", "业主代表", "中标金额", "本项目", "不接受", "招标人代表", "信誉", "业绩", "合法", "完整", "有效", "在此", "资格标", "商务标", "公告期", "成交价", "经评审",
+    "招标人", "求真", "无气泡", "毛刺", "进场安排", "由技术", "但是", "支付条件", "索赔", "管理费用",
+    "合格", "天内", "高风险", "终止合同", "任何加行", "涂改", "其它费", "改期的", "税收等", "第一名", "第二名", "第三名", "时间较紧", "能评", "洪评", "第400章", "清单", "第200章", "合计",
+    "第100章", "应及", "印存", "宇视", "法令", "公正廉洁", "不徇私", "法令", "公正廉洁", "但是", "支付条件", "索赔", "务费", "年份", "宣传费", "业务总额", "包装物料", "第四部分", "委员会由",
+    "其余", "台式电脑", "公告期限", "第十八条", "项目用途", "随时", "利润", "年1", "时3", "包号", "开户行", "户名", "安装调试", "时0", "万元", "运费", "建筑面积", "平方米", "成交金额",
+    "其他", "通过", "支票", "谈判小组", "本票", "业主评委", "年0", "计划员", "大写", "合价", "安全员", "资质", "其他要求", "施工员", "中标单位", "答疑", "方式", "第十条", "五.", "暴风", "滑坡", "保险负责赔偿",
+    "万元", "大写", "利润", "其它费用", "第二包", "甲方", "已方", "业主专家", "中国官网", "检验报告", "同时", "第四条", "答复", "时间", "银行支票", "生产厂家",
+    "第二章", "权值", "有无发热", "干咳", "姓名", "权值", "在各评委", "首先", "务条款", "应以支票", "本票", "有效性", "符合性", "完整性", "公告期限", "合价", "类别", "楼民", "性别", "保险费等", "运费", "以最", "行评审", "经查实",
+    "同时", "合同包", "来源地", "答复", "利润", "支票", "年龄", "本票", "用途", "合同内容", "金额为", "不限", "世达", "须在", "招标方式", "合同履约", "进度", "方法", "包料", "其中",
+    "出厂单价", "接管", "查封", "天线", "开关电源", "无源器件", "海商等", "第二条", "元整", "生产加工", "运杂", "税前价格", "税额", "管理费", "税金等", "项目概况", "风险费", "都不", "母公司", "但银行", "将以",
+    "委托", "第五部分", "包括晋钢", "计划号", "大件运输", "旅工", "完整的", "不围标", "不造假", "通过询价", "税率",
+    "计量单位", "包括价格", "营业执照", "中主", "以水电", "包件", "九德路", "包件号", "包件售价", "国标", "类型", "保养", "保函",
+    "信用证", "商业秘密", "应付", "应收", "中共党员", "不可卸载", "商的澄清", "项目编号", "运杂费", "严重火灾", "初审表", "不交货", "不含税", "不通过", "不含税价", "东北区域", "中班台",
+    "中班椅", "书架", "休息台", "不争辩", "不准确", "不压缩", "不处于", "不挑剔", "不留密码", "中标候选",  "不存", "南方基地", "不处", "中材", "中美合资", "五效", "万元整", "不漏项", "东进西移",
+    "中级职称", "税率为", "保养等", "万张图片", "中标人", "中标内容", "书桌", "不卡顿", "不跳帧", "不完整", "不组织", "之中",
+    "凭借栏杆", "不含", "不含斜", "中杯", "光分纤箱", "光交箱", "合柜", "性质", "不及格等", "中检", "五个环", "乙方", "人民币", "无效", "以活动", "休息室", "位置", "储入", "中间件",
+    "关键", "水产等", "羊肉", "定标",
+    "本科", "理由", "第五章", "利益", "在家", "不得", "不提供", "中职教材", "以及", "种类",
+    "从业人员", "公告于"
+  ],
+
+  "winner": {
+    "pre_regexp": ["及报价\\d拟中标人第一:", "中标金额(元)", "第\\d中标候单位:", "第\\d中标侯选人:", "及报价\\d", "成交金额(元)", "成交金额", "成交金额包\\d", "成交金额(元)", "成交金额", "中标供应商为", "</tr><tr><tdcolspan=\"8\">",
+      "中标供应商如下:", "中标供应商为", "中标供应商联系地址中标金额(万元)\\d", "基本情况名称:", "基本情况中标候选人第\\d+名:", "______", "第一中标侯选人名称: \\d", "第一中标侯选单位:", "第一中标供应商-", "第一中标排序人:", "第一中标排序人",
+      "第一成交侯选人:", "第一成交供应商-", "第一成交候选供应商及报价:", "拟定供应商名称:", "名单及其排序名次第一名单位名称", "名单及其排序名\\d次第一名单位名称", "名单及其排序推荐中标人单位名称", "名单及其排序", "名称:", "是:", "\\(成交\\)", "\\)¥41100.00",
+      "\\)为:", "预成交单位:", "最终报价第(二|三)低的", "同意推荐最终报价最低的", "单位名称", "的供应商", "推荐", "第一名", "\\([A-Z]\\)", "([A-Z])", "<[^>]*>", "[^a-zA-Z\\p{Han}]{1,}", "[A-Z](-|、)", "A\\d+", "B\\d+", "?[a-zA-Z]?[段]",
+      "①", "投标人被人民法院[,]{0,}"],
+    "back_regexp": ["为中标人$", "为预中标供应商$", "为成交候选人$", "为该项目的预成交单位$", "为成交单位$", "为本次招标项目的中标单位$", "(公司$", "工期:0质量要求:null保证金金额:null$", ",报价:182391224.2900工期$", "786000元$", "预成交人地址",
+      "为该项目的预成交单位$", "为成交单位$", "预成交单位$", ",投标人被人民法院$",
+      ",?(投标报价|报价)\\d{1,}\\.\\d{1,}(万?)元$", ",?(投标报价|报价)\\d+.?\\d+(万?)元$", ",?(投标报价|报价)\\d+.?\\d+(万?)元/平方米$", ",\\[慧通主要产品报价点击下载\\]$", ",$", ",?中标金额\\d{1,}(万?)元$",",?中标金额\\d{1,}\\.\\d{1,}(万?)元$",
+      ",_$", "单位名称$", ",为本项目.*$", "[^a-zA-Z\\p{Han}]{1,}$"],
+    "back_rep_regexp": ["(有限公$)#有限公司", "(有限责任公$)#有限责任公司", "(公司公司&)#公司", "(公司等&)#公司"],
+    "blacklist": ["项目废标", "标项内容", "单位名称", "null", "不足3家", "中标单位", "公告时间", "(或印鉴)", "中标金额", "法定代表人", "员会名单", "含全部内", "工期", "报价", "名称得分", "元)备注", "的全部内", "地址", "\\.\\.", "法定家数", "的投标人",
+      "流水号", "到我公司", "投标报价", "工期", "一致确认", "多家中标商", "违法违规行", "中标人名称", "格式一致", "寄送中心", "\\.\\.\\.元", "电话地址", "全部内", "合同包合计", "楼青年公寓装修工程"]
+  },
+  "buyer": {
+    "pre_regexp": ["\\(不见面开标\\)", "\\(买方)", "\\(\\d+个月\\)", "\\d{4}年", "\\d+月", "<[^>]*>", "AB", "CC", "CB", "CA", "[A-Z]?\\d+", "\\(第(\\d+|一|二|三|四|五|六|七)(批|次)?\\)", "\\(\\d+局\\)", "\\d+标段", "\\(二次)", "(重招\\d)", "(\\(|(?)周(五|四|三|二|一|日|六)?(\\)|))",
+      "(\\(|()?[a-zA-Z](\\)|))?", "(\\(|()?\\d{0,8}.?\\d+(\\)|))?", "#(~|、)?", "#\\d{1,};?", "(\\+|\\.|、|-|#|%|:|:)+"],
+    "back_regexp": ["采购人$", "[^a-zA-Z\\p{Han}]{1,}$"],
+    "back_rep_regexp": ["(有限公$)#有限公司", "(有限责任公$)#er有限责任公司", "(公司公司&)#公司", "(公司等&)#公司"],
+    "blacklist": ["有问题", "个县公司", "T及分公司", "大厦\\d+室", "住宅楼", "购物中心", "盖法人章", "东侧路面拓宽", "、技术研发中心", "地下室", "车库", "二类居住", "钢芯铝绞线", "已仔细"]
+  },
+  "agency": {
+    "pre_regexp": ["发布人:", "<[^>]*>", "(\\(|()?[a-zA-Z](\\)|))?", "(\\(|()?\\d{0,8}.?\\d+(\\)|))?", "#(~|、)?", "#\\d{1,};?", "(\\+|\\.|、|-|#|%|:|:)+"],
+    "back_regexp": ["为其所$", "(简称$", ":我公司$"],
+    "back_rep_regexp": ["(有限公$)#有限公司", "(有限公同$)#有限公司", "(有限责任公$)#有限责任公司", "(公司公司&)#公司", "(公司等&)#公司", "([a-z]限公司$)#有限公司", "(有公司$)#有限公司", "(招标代理有$)#招标代理有限公司"],
+    "blacklist": ["承包项目", "(二标段", "举行了", "提交一份公司", "驱动更新", "邱海丽", "集中代理采购", "公司组织的", "利用项目", "地址:", "交易网", "年龄:", "性别:", "竞争性谈判", "null", "停车场", "招标人", "制造项目", "(中|招)标公告",
+      "“组组通”工程", "备案单位(章)", "小时", "梁工"]
+  }
+
 }

+ 33 - 16
listen_data/src/main.go

@@ -58,12 +58,11 @@ func initMgo()  {
 }
 
 func init() {
+	qu.ReadConfig(&sysconfig)
 	return
 	//加载配置文件
-	qu.ReadConfig(&sysconfig)
 	flag.StringVar(&startRun, "sr", "", "是否启动") //增量
 	flag.StringVar(&startSend, "ss", "", "是否发送") //增量
-
 	flag.Parse()
 	initMgo()
 }
@@ -71,10 +70,9 @@ func init() {
 
 func main()  {
 
-
 	//python_mgo = &MongodbSim{
 	//	MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
-	//	DbName:      "mixdata",
+	//	DbName:      "qfw",
 	//	Size:        10,
 	//	UserName: "zhengkun",
 	//	Password: "zk@123123",
@@ -99,14 +97,24 @@ func main()  {
 	//}
 	//save_mgo.InitPool()
 
-	save_mgo = &MongodbSim{
-		MongodbAddr: "127.0.0.1:27017",
-		DbName:      "mixdata",
-		Size:        10,
-		UserName: "",
-		Password: "",
-	}
-	save_mgo.InitPool()
+	//save_mgo = &MongodbSim{
+	//	MongodbAddr: "172.17.4.85:27080",
+	//	DbName:      "qfw",
+	//	Size:        10,
+	//	UserName: "",
+	//	Password: "",
+	//}
+	//save_mgo.InitPool()
+
+
+	//save_mgo = &MongodbSim{
+	//	MongodbAddr: "192.168.3.207:27092",
+	//	DbName:      "zhaolongyue",
+	//	Size:        10,
+	//	UserName: "",
+	//	Password: "",
+	//}
+	//save_mgo.InitPool()
 
 	save_mgo = &MongodbSim{
 		MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
@@ -117,16 +125,27 @@ func main()  {
 	}
 	save_mgo.InitPool()
 
+	//save_mgo = &MongodbSim{
+	//	MongodbAddr: "192.168.3.166:27082",
+	//	DbName:      "zhaolongyue",
+	//	Size:        10,
+	//	UserName: "",
+	//	Password: "",
+	//}
+	//save_mgo.InitPool()
 
 	//save_mgo = &MongodbSim{
-	//	MongodbAddr: "172.17.4.85:27080",
-	//	DbName:      "qfw",
+	//	MongodbAddr: "127.0.0.1:27017",
+	//	DbName:      "zhengkun",
 	//	Size:        10,
 	//	UserName: "",
 	//	Password: "",
 	//}
 	//save_mgo.InitPool()
 
+	decodeJyUrl()
+
+	return
 
 	/*
 		repairYiXieChaData() 		//医械查
@@ -136,8 +155,6 @@ func main()  {
 	*/
 
 
-	return
-
 
 
 	c := cron.New()

+ 22 - 0
listen_data/src/mgo.go

@@ -248,6 +248,28 @@ func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
 	return true
 }
 
+func (m *MongodbSim) UpdateStrId(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": id}, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+func (m *MongodbSim) UpdateQueryData(c string, query map[string]interface{}, doc map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	_, err := coll.UpdateOne(m.Ctx, query, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
 //删除by id
 func (m *MongodbSim) DeleteById(c, id string) int64 {
 	m.Open()

+ 957 - 30
listen_data/src/zkmethod.go

@@ -38,21 +38,971 @@ var Url = "https://www.jianyu360.com/article/content/%s.html"
 var wordsArr = []string{}
 var MysqlTool	*Mysql
 
+//导出数据-bidding相关
+func exportFromMongoToBiddingData(from string,to string){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q,total:=map[string]interface{}{},0
+	it := sess.DB(save_mgo.DbName).C(from).Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("curent index ",total)
+		}
+		tmpid := qu.ObjToString(tmp["_id"])
+		data := save_mgo.FindById("bidding",tmpid)
+		if data!=nil && len(data)>2 {
+			save_mgo.Save(to,data)
+		}else {
+			data = save_mgo.FindById("bidding_back",tmpid)
+			if data!=nil && len(data)>2 {
+				save_mgo.Save(to,data)
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total)
+}
+//导出数据-extract相关
+func exportFromMongoToExtractData(from string,to string){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q,total:=map[string]interface{}{},0
+	it := sess.DB(save_mgo.DbName).C(from).Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("curent index ",total)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+		data := save_mgo.FindById("result_20220219",tmpid)
+		if data!=nil && len(data)>2 {
+			save_mgo.Save(to,data)
+		}else {
+			data = save_mgo.FindById("result_20220218",tmpid)
+			if data!=nil && len(data)>2 {
+				save_mgo.Save(to,data)
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total)
+}
+
+//秘钥~base64
+func encodeSEUrl(){
+	var SE = qu.SimpleEncrypt{Key: "topJYBX2019"}
+	SE.EncodeString("tmpid_string")
+}
+
 //解密
 func decodeJyUrl()  {
-	test := "ABCY1wAdTwFLy0vNFV5cAdaJSc%2FCj1mcVVhKCg7LS43a2BzdCNUCXg%3D"
+	test := "ABCY1wAfikFIywvEmd5cwcOCzIoIDRgYWR0KB4nIC4ee2Bzfw1UCLw%3D"
 	var Decode  = qu.CommonDecodeArticle("content", test)
 	log.Debug(Decode[0])
 	return
 }
+//加密
+func encodeJyUrl()  {
+	var Url = "https://www.jianyu360.com/article/content/%s.html"
+	var Encode  = fmt.Sprintf(Url, qu.CommonEncodeArticle("content", "595a08e261a0721f158d0f90"))
+	log.Debug(Encode)
+}
+
+
+
+//导出错误中标单位数据
+func exportWinnerErrData()  {
+	elastic.InitElasticSize("http://127.0.0.1:13001",10)
+	//es_data:=*elastic.Get("bidding","bidding",query)
+	num:=0
+	arr := make([]string,0)
+	for i:=0;i<2;i++ {
+		str := ""
+		if i==0 {
+			str = fmt.Sprintf("%d",0)
+		}else {
+			str = fmt.Sprintf("%d",i*200+1)
+		}
+		query := `{"query":{"bool":{"must":[{"term":{"bidding.winner":"注册地在国家级贫困县域内物业公司"}}],"must_not":[],"should":[]}},`+`"from":"`+str+`","size":"200","sort":[],"facets":{},"_source":["_id"]}`
+		es_data:=*elastic.Get("bidding","bidding",query)
+		log.Debug("当前查询结果:",len(es_data))
+		for _,v := range es_data {
+			num++
+			tmpid := qu.ObjToString(v["_id"])
+			arr = append(arr,tmpid)
+		}
+		if num%1000==0 {
+			log.Debug("cur index ",num,"~",len(arr))
+		}
+		if  es_data==nil || len(es_data)==0{
+			break
+		}
+	}
+	log.Debug("is over ",num,"~",len(arr))
+	for _,v := range arr {
+		save_mgo.Save("1111", map[string]interface{}{
+			"bidding_id":v,
+		})
+	}
+}
+
+//导出新标注~数据 字段验证
+func exportNewMarkedata(){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total,isok:= map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("marked_new").Find(&q).Iter()
+	key_map ,key_arr := map[string]interface{}{
+		"area":1,
+		"city":1,
+		"buyer":1,
+		"agency":1,
+		"s_winner":1,
+		"budget":1,
+		"bidamount":1,
+		"projectcode":1,
+		"contractcode":1,
+	},[]string{
+		"area",
+		"city",
+		"buyer",
+		"agency",
+		"s_winner",
+		"budget",
+		"bidamount",
+		"projectcode",
+		"contractcode",
+	}
+	os.Remove("111111.xlsx")
+	f :=xlsx.NewFile()
+	sheet, _ := f.AddSheet("新标注~验证~")
+	row := sheet.AddRow()
+	row.AddCell().Value = "唯一标识"
+	for i := 0; i < len(key_arr); i++ {
+		row.AddCell().Value = key_arr[i]
+	}
+	row.AddCell().Value = "原文链接"
+	row.AddCell().Value = "剑鱼链接"
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		v_baseinfo:= *qu.ObjToMap(tmp["v_baseinfo"])
+		v_taginfo := *qu.ObjToMap(tmp["v_taginfo"])
+		dict := map[string]interface{}{}
+		for k,v := range v_taginfo {
+			if qu.IntAll(v)>1 && key_map[k]!=nil {
+				dict[k] = v_baseinfo[k]
+			}
+		}
+		if len(dict)>0 {
+			isok++
+			row := sheet.AddRow()
+			row.AddCell().Value = BsonTOStringId(tmp["_id"])
+			for _,v := range key_arr{
+				if v=="budget" || v=="bidamount" {
+					if v_baseinfo[v]!=nil {
+						row.AddCell().SetString(fmt.Sprintf("%f",qu.Float64All(v_baseinfo[v])))
+					}else {
+						row.AddCell().Value = ""
+					}
+				}else {
+					row.AddCell().Value = qu.ObjToString(v_baseinfo[v])
+				}
+			}
+			row.AddCell().Value = qu.ObjToString(v_baseinfo["href"])
+			jyhref := fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"])))
+			row.AddCell().Value = jyhref
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+
+	err := f.Save("111111.xlsx")
+	if err != nil {
+		log.Debug("保存xlsx失败:", err)
+		return
+	}else {
+		log.Debug("保存xlsx成功:", err)
+	}
+
+}
+
+
+//导出当前标签~
+func exportTagInfo(){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total,isok:= map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_tag_info").Find(&q).Iter()
+
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		content := []string{}
+		if list, ok := tmp["content"].(primitive.A); ok {
+			content = qu.ObjArrToStringArr(list)
+		}else {
+			if list, ok := tmp["content"].([]interface{}); ok {
+				content = qu.ObjArrToStringArr(list)
+			}
+		}
+		s_name := qu.ObjToString(tmp["s_name"])
+		s_field := qu.ObjToString(tmp["s_field"])
+		for _,v := range content {
+			isok++
+			save_mgo.Save("zktest_tag_unique", map[string]interface{}{
+				"s_name":s_name,
+				"s_field":s_field,
+				"t_name":v,
+			})
+		}
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+}
+
+//对比数据...
+func comparativedata(){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total,isok:= map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_alpha_bidding_new").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+		winner:= qu.ObjToString(tmp["winner"])
+		data := save_mgo.FindById("zktest_alpha_data",tmpid)
+		if data!=nil && len(data)>2 {
+			winner_ys := qu.ObjToString(data["winner_ys"])
+			is_ys := false
+			if ys,ok := data["is_ys"].(bool);ok {
+				is_ys = ys
+			}
+			if is_ys && winner==winner_ys {
+				isok++
+			}
+		}else {
+			log.Debug("异常~",tmpid)
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+}
+
+//对疑似单位打标记
+func playtagYswinner(){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total,isok:= map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_alpha_data").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+		winner_ys:= qu.ObjToString(tmp["winner_ys"])
+		data := save_mgo.FindOne("qyxy_std", map[string]interface{}{
+			"company_name":winner_ys,
+		})
+		if data!=nil && len(data)>2 {
+			save_mgo.UpdateById("zktest_alpha_data",tmpid, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"is_ys":true,
+				},
+			})
+			isok++
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+}
+
+
+//导出~正文可能含有的单位数据
+func exportAZwinnerdata() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total,isok:= map[string]interface{}{
+		"_id": map[string]interface{}{
+			"$lt": StringTOBsonId("626d5d000000000000000000"),
+		},
+	},0,0
+	it := sess.DB(save_mgo.DbName).C("bidding").Find(&q).Sort("-_id").Select(map[string]interface{}{
+		"subtype":1,
+		"detail":1,
+		"winner":1,
+	}).Iter()
+	var reg_str = regexp.MustCompile("[\u4E00-\u9FA5]{1,10}[A-Za-z]{1,5}[\u4E00-\u9FA5]{1,10}(公司|集团|单位|机构|企业|厂|场|院|所|店|中心|市|局|站|城|处|行|部|队|联合[会|体])")
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		subtype := qu.ObjToString(tmp["subtype"])
+		detail := qu.ObjToString(tmp["detail"])
+		winner := qu.ObjToString(tmp["winner"])
+		tmpid := BsonTOStringId(tmp["_id"])
+		if (subtype=="中标"||subtype=="成交"||subtype=="合同"||subtype=="单一") &&
+			winner != "" {
+			str := reg_str.FindString(detail)
+			if str!="" {
+				if isHeadWordEqual(winner,str) {
+					total, hit := dealWithWordsRules(winner, str)
+					if hit>=total/2 {
+						isok++
+						log.Debug(tmpid,"~",str,"~",winner)
+						save_mgo.Save("zktest_alpha_data", map[string]interface{}{
+							"_id":tmp["_id"],
+							"winner":winner,
+							"winner_ys":str,
+						})
+					}
+				}
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+}
+
+//计算首部词语是否一致
+func isHeadWordEqual(a string,b string) bool{
+	namea,nameb := []rune(a),[]rune(b)
+	new_a := string(namea[:2])
+	new_b := string(nameb[:2])
+	if new_a==new_b {
+		return true
+	}
+	return false
+}
+//击中数量以及比例
+func dealWithWordsRules(info_name string, source_name string) (int, int) {
+	total, hit := 0, 0
+	nameArr, _ := calculateWordCount(info_name)
+	_, total = calculateWordCount(source_name)
+	for _, v1 := range nameArr {
+		if strings.Contains(source_name, v1) {
+			hit++
+		}
+	}
+	return total, hit
+}
+//分词结果
+func calculateWordCount(name string) ([]string, int) {
+	arr, space := make([]string, 0), 2
+	total := utf8.RuneCountInString(name) - (space - 1)
+	if name == "" || total <= 0 {
+		return arr, 0
+	}
+	nameRune := []rune(name)
+	for i := 0; i < total; i++ {
+		new_str := string(nameRune[i : space+i])
+		arr = append(arr, new_str)
+	}
+	return arr, len(arr)
+}
+
+
+
+
+
+//更新大金额数据~
+func updateToMuchMoneyData(){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total,isok:= map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("20220406_bidamount_data").Find(&q).Sort("_id").Iter()
+
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		p_list := []string{}
+		if list, ok := tmp["data_flag_list"].(primitive.A); ok {
+			p_list = qu.ObjArrToStringArr(list)
+		}else {
+			if list, ok := tmp["data_flag_list"].([]interface{}); ok {
+				p_list = qu.ObjArrToStringArr(list)
+			}
+		}
+		if isConformWrong(p_list) {
+			bidamount := qu.Float64All(tmp["bidamount"])
+			new_bidamount := bidamount/float64(10000)
+			save_mgo.Save("00000", map[string]interface{}{
+				"bidamount":new_bidamount,
+				"_id" :StringTOBsonId(qu.ObjToString(tmp["_id"])),
+			})
+			isok++
+		}
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+}
+
+func isConformWrong(arr []string) bool {
+	if len(arr)>0 {
+		for _,v := range arr {
+			if v=="wrong_2"||v=="wrong_3"||v=="wrong_4" {
+
+			}else {
+				return false
+			}
+		}
+		return true
+	}
+	return false
+}
+
+
+//导出新版标注数据
+func exportMarkNewData() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total ,isok:= map[string]interface{}{
+		"comeintime": map[string]interface{}{
+			"$gte": 1653494400,
+			"$lt": 1653580800,
+		},
+		"publishtime": map[string]interface{}{
+			"$gte": 1653494400,
+			"$lt": 1653580800,
+		},
+	},0,0
+	limit := 500
+	dict := make(map[string]map[string]interface{},0)
+	log.Debug("准备遍历数据...")
+	it := sess.DB(save_mgo.DbName).C("result_20220219").Find(&q).Select(map[string]interface{}{
+		"site":1,
+		"subtype":1,
+		"toptype":1,
+		"repeat":1,
+	}).Sort("-_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+			s := ""
+			s1 := ""
+			for k,v := range dict{
+				if len(v) <= limit {
+					s1 += k+","
+				}else {
+					s += k+","
+				}
+			}
+			log.Debug("满足~",s)
+			log.Debug("不满足~",s1)
+		}
+		repeat := qu.IntAll(tmp["repeat"])
+		if repeat==1 {
+			tmp = make(map[string]interface{})
+			continue
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+		subtype := qu.ObjToString(tmp["subtype"])
+		toptype := qu.ObjToString(tmp["toptype"])
+		site := qu.ObjToString(tmp["site"])
+		if toptype=="招标"|| subtype=="中标"||subtype=="成交"||subtype=="合同" {
+			isNext := true
+			if subtype=="招标"||subtype=="中标"||subtype=="竞谈"||subtype=="成交" {
+				if total % 3 !=0 {
+					isNext = false
+				}
+			}
+			if isNext {
+				if dict[subtype]==nil  {//无数据
+					dict[subtype] = map[string]interface{}{
+						site:tmpid,
+					}
+					isok++
+					save_mgo.Save("zktest_data", map[string]interface{}{
+						"_id":tmp["_id"],
+					})
+				}else {
+					d := dict[subtype]
+					if d[site]==nil && len(d)<=limit {
+						d[site] = tmpid
+						dict[subtype] = d
+						isok++
+						save_mgo.Save("zktest_data", map[string]interface{}{
+							"_id":tmp["_id"],
+						})
+					}
+				}
+			}
+
+		}
+
+		if isok>10000 {
+			log.Debug("超过限制~结束")
+			break
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+
+	for k,v := range dict{
+		log.Debug(k,"~",len(v))
+	}
+
+
+}
+
+
+//分析中标单位 不同数据
+func fenxiDiffWinnerData() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total ,isok:= map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("222222").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+		winner := qu.ObjToString(tmp["winner"])
+
+		data := save_mgo.FindById("111111",tmpid)
+		if data!=nil && len(data)>2 {
+			if winner!=qu.ObjToString(data["winner"]) {
+				isok++
+
+				save_mgo.Save("333333", map[string]interface{}{
+					"_id":tmp["_id"],
+					"new_winner":winner,
+					"old_winner":qu.ObjToString(data["winner"]),
+					"href":tmp["href"],
+					"jytest_href":tmp["jytest_href"],
+				})
+			}
+		}else {
+			log.Debug("异常...",tmp["_id"])
+		}
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+}
+
+
+func update0519Data() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total ,isok:= map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("a_repair_bidding_data_new").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total)
+		}
+		update := map[string]interface{}{}
+		if tmp["bidamount"]!=nil {
+			update["bidamount"]  = tmp["bidamount"]
+		}
+		if tmp["biddiscount"]!=nil {
+			update["biddiscount"]  = tmp["biddiscount"]
+		}
+
+		if len(update)>0 {
+			isok++
+			python_mgo.UpdateQueryData("20220505Hs_kcsj", map[string]interface{}{
+				"id":BsonTOStringId(tmp["_id"]),
+			}, map[string]interface{}{
+				"$set": update,
+			})
+		}
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ...",total,isok)
+}
+
+//导出空数据
+func exportBidamountKongData(){
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total := map[string]interface{}{},0
+	dict := map[string]interface{}{}
+	it := sess.DB(save_mgo.DbName).C("111111111").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total)
+		}
+		site := qu.ObjToString(tmp["site"])
+		if dict[site] != nil {
+			num := qu.IntAll(dict[site])+ 1
+			dict[site] = num
+		}else {
+			dict[site] =1
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over buyer...",total)
+	rankArr :=  []int{}
+	siteArr := []string{}
+	for k,v := range dict {
+		siteArr = append(siteArr,k)
+		rankArr = append(rankArr,qu.IntAll(v))
+	}
+	rankArr,siteArr = preMethodSort(rankArr,siteArr)
+	log.Debug(len(rankArr),len(siteArr))
+	for k,v := range rankArr{
+		save_mgo.Save("aaaaaa", map[string]interface{}{
+			"rank" : k+1,
+			"total":v,
+			"site" : siteArr[k],
+		})
+	}
+
+}
+
+func preMethodSort(slice []int , site []string) ([]int,[]string) {
+	for n := 0; n <= len(slice); n++ {
+		for i := 1; i < len(slice)-n; i++ {
+			if slice[i] > slice[i-1] {
+				slice[i], slice[i-1] = slice[i-1], slice[i]
+				site[i], site[i-1] = site[i-1], site[i]
+			}
+		}
+	}
+	return slice,site
+}
+
+
+
+//更新
+func updateBuyerCGYX() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total,isok := map[string]interface{}{},0,0
+	it := sess.DB(save_mgo.DbName).C("aaaaaaa").Find(&q).Select(map[string]interface{}{
+		"buyer":1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+		buyer := qu.ObjToString(tmp["buyer"])
+		if buyer!="" {
+			save_mgo.UpdateById("20220514_Rj_bidding",tmpid, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"buyer":buyer,
+				},
+			})
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over buyer...",total,isok)
+}
+
+
+
+//处理错误异常数据...
+func dealWithErrWordata() {
+
+	str_arr := qu.ObjArrToStringArr(sysconfig["rp_blacklist"].([]interface{}))
+	strs := strings.Join(str_arr,"|")
+	strs = "("+strs+")"
+	var reg = regexp.MustCompile(strs)
+
+
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total := map[string]interface{}{},0
+	is_err := 0
+
+	dict := map[string][]string{}
+	it := sess.DB(save_mgo.DbName).C("winner_err").Find(&q).Sort("_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,is_err)
+		}
+		name := qu.ObjToString(tmp["name"])
+		s := reg.FindString(name)
+		if s!="" {
+			//log.Debug(reg.FindString(name),"~",name)
+			if dict[s]==nil {
+				dict[s] = []string{name}
+			}else {
+				arr := dict[s]
+				arr = append(arr,name)
+				dict[s] = arr
+			}
+			is_err++
+		}
+		tmp = make(map[string]interface{})
+	}
+
+	for k,v := range dict{
+		save_mgo.Save("winner_err_data", map[string]interface{}{
+			"word":k,
+			"name":v,
+		})
+	}
+
+	log.Debug(len(dict))
+	log.Debug("is over ",total,is_err)
+
+}
+
+
+
+
+
+func exportNewCityFieldData() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total := map[string]interface{}{
+		"_id": map[string]interface{}{
+			"$lte": StringTOBsonId("6245d0000000000000000000"),
+		},
+	},0
+	isok := 0
+	site_data := map[string]int{}
+	it := sess.DB(save_mgo.DbName).C("bidding").Find(&q).Sort("-_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		site := qu.ObjToString(tmp["site"])
+		area := qu.ObjToString(tmp["area"])
+		city := qu.ObjToString(tmp["city"])
+		if area!="全国"&&area!=""&&city=="" {
+			num := qu.IntAll(site_data[site])+1
+			if num<10 {
+				site_data[site] = num
+				isok++
+				save_mgo.Save("zktest_city_field_test",tmp)
+			}
+		}
+		if isok>=1000 {
+			break
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,isok)
+
+}
+
+//导出-bidding-新字段数据
+func exportNewFieldData() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total := map[string]interface{}{
+		"_id": map[string]interface{}{
+			"$lte": StringTOBsonId("61cf29000000000000000000"),
+		},
+	},0
+	isok := 0
+	var reg_str = regexp.MustCompile("(递交开始)")
+
+	it := sess.DB(save_mgo.DbName).C("bidding").Find(&q).Sort("-_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%10000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		toptype := qu.ObjToString(tmp["toptype"])
+		if toptype!="招标" {
+			tmp = make(map[string]interface{})
+			continue
+		}
+		detail := qu.ObjToString(tmp["detail"])
+		if reg_str.MatchString(detail) {
+			isok++
+			save_mgo.Save("zktest_extract_field",tmp)
+		}
+		if isok>=200 {
+			break
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,isok)
+
+}
+
+
+
+
+
+
+//万倍金额标记
+func isMarkMuchMoney() {
+	var reg1 = regexp.MustCompile("0000.000000$")
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total := map[string]interface{}{},0
+	isok := 0
+	it := sess.DB(save_mgo.DbName).C("20220406_bidamount_data").Find(&q).Select(map[string]interface{}{
+		"bidamount":1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,isok)
+		}
+		bidamount := qu.Float64All(tmp["bidamount"])
+		money_str := fmt.Sprintf("%f",bidamount)
+		if reg1.MatchString(money_str) {
+			isok++
+			save_mgo.UpdateStrId("20220406_bidamount_data",qu.ObjToString(tmp["_id"]), map[string]interface{}{
+				"$set": map[string]interface{}{
+					"is_wan":1,
+				},
+			})
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,isok)
+
+}
+
+//导出模板数据
+func expMoBanShuJu() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total := map[string]interface{}{},0
+	ok_1,ok_2 := 0,0
+	it := sess.DB(save_mgo.DbName).C("zktest_marked").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,ok_1,ok_2)
+		}
+		if total % 3 != 0 {
+			tmp = make(map[string]interface{})
+			continue
+		}
+		//预计1200  4800拉取数据
+		ck_buyer := qu.Int64All(tmp["ck_buyer"])
+		ck_s_winner := qu.Int64All(tmp["ck_s_winner"])
+		ck_agency := qu.Int64All(tmp["ck_agency"])
+		ck_budget := qu.Int64All(tmp["ck_budget"])
+		ck_bidamount := qu.Int64All(tmp["ck_bidamount"])
+		if ck_buyer>1 || ck_s_winner>1 || ck_agency>1 || ck_budget>1 || ck_bidamount>1{
+			ok_1++
+			save_mgo.Save("zktest_ext_example",tmp)
+		}else {
+			ok_2++
+			save_mgo.Save("zktest_ext_example",tmp)
+		}
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,ok_1,ok_2)
+}
+
+//修复城市数据
+func repairExtCity() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total := map[string]interface{}{},0
+	ok_1,ok_2 := 0,0
+	it := sess.DB("qfw").C("zktest_xxs_city_new").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,ok_1,ok_2)
+		}
+		tmpid := BsonTOStringId(tmp["_id"])
+		new_area := qu.ObjToString(tmp["area"])
+		new_city := qu.ObjToString(tmp["city"])
+		new_district := qu.ObjToString(tmp["district"])
+		data_1 := save_mgo.FindById("result_20220218",tmpid)
+		if data_1!=nil && len(data_1)>2 {
+			ok_1++
+			save_mgo.UpdateById("result_20220218",tmpid, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"area":new_area,
+					"city":new_city,
+					"district":new_district,
+				},
+			})
+		}
+		data_2 := save_mgo.FindById("result_20220219",tmpid)
+		if data_2!=nil && len(data_2)>2 {
+			ok_2++
+			save_mgo.UpdateById("result_20220219",tmpid, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"area":new_area,
+					"city":new_city,
+					"district":new_district,
+				},
+			})
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total,ok_1,ok_2)
+}
+
+func repairRepeatData0308() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q ,total := map[string]interface{}{},0
+	ok_1,ok_2 := 0,0
+	it := sess.DB("qfw").C("zktest_repeat_test").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("cur index ",total,ok_1,ok_2)
+		}
+
+		tmpid := BsonTOStringId(tmp["_id"])
+		repeat_id := qu.ObjToString(tmp["repeat_id"])
+		repeat_reason := qu.ObjToString(tmp["repeat_reason"])
+
+		bidding_data := python_mgo.FindById("bidding",tmpid)
+		if bidding_data!=nil && len(bidding_data)>2 {
+			publishtime := qu.Int64All(bidding_data["publishtime"])
+			data_1 := save_mgo.FindById("result_20220218",tmpid)
+			if data_1!=nil && len(data_1)>2 {
+				if publishtime < 0 {
+					log.Debug(tmpid)
+					ok_1++
+					save_mgo.UpdateById("result_20220218",tmpid, map[string]interface{}{
+						"$set": map[string]interface{}{
+							"repeat":1,
+							"repeat_id":repeat_id,
+							"repeat_reason":repeat_reason,
+							"publishtime":publishtime,
+						},
+					})
+				}
+			}
+			data_2 := save_mgo.FindById("result_20220219",tmpid)
+			if data_2!=nil && len(data_2)>2 {
+				if publishtime < 0 {
+					log.Debug(tmpid)
+					ok_2++
+					save_mgo.UpdateById("result_20220219",tmpid, map[string]interface{}{
+						"$set": map[string]interface{}{
+							"repeat":1,
+							"repeat_id":repeat_id,
+							"repeat_reason":repeat_reason,
+							"publishtime":publishtime,
+						},
+					})
+				}
+			}
+		}else {
+			log.Debug("异常-需要处理...",tmpid)
+			//data_1 := save_mgo.FindById("result_20220218",tmpid)
+			//if data_1!=nil && len(data_1)>2  {
+			//	save_mgo.DeleteById("result_20220218",tmpid)
+			//}
+			//data_2 := save_mgo.FindById("result_20220219",tmpid)
+			//if data_2!=nil && len(data_2)>2 {
+			//	save_mgo.DeleteById("result_20220219",tmpid)
+			//}
+		}
+
+		tmp = make(map[string]interface{})
+	}
+
+	log.Debug("is over ",total,ok_1,ok_2)
+
 
-//加密
-func encodeJyUrl()  {
-	var Url = "https://www.jianyu360.com/article/content/%s.html"
-	var Encode  = fmt.Sprintf(Url, qu.CommonEncodeArticle("content", "5fd2f37bf0f9d716c171c021"))
-	log.Debug(Encode)
 }
 
+
 //修复抽取数据
 func addCityXinXingExt() {
 	/*
@@ -833,30 +1783,7 @@ func updateMarkData()  {
 	}
 	log.Debug("is over ",total)
 }
-//导出数据-bidding相关
-func expoetFromMongoToBiddingData(){
-	sess := save_mgo.GetMgoConn()
-	defer save_mgo.DestoryMongoConn(sess)
-	q,total:=map[string]interface{}{},0
-	it := sess.DB(save_mgo.DbName).C("zktest_allfield_id").Find(&q).Iter()
-	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
-		if total%1000==0 {
-			log.Debug("curent index ",total)
-		}
-		tmpid := BsonTOStringId(tmp["_id"])
-		data := save_mgo.FindById("bidding",tmpid)
-		if data!=nil && len(data)>2 {
-			save_mgo.Save("zktest_allfield_bidding",data)
-		}else {
-			data = save_mgo.FindById("bidding_back",tmpid)
-			if data!=nil && len(data)>2 {
-				save_mgo.Save("zktest_allfield_bidding",data)
-			}
-		}
-		tmp = make(map[string]interface{})
-	}
-	log.Debug("is over ",total)
-}
+
 //导出标注数据-id
 func exportAllFieldBiaoZhuData() {
 	elastic.InitElasticSize("http://127.0.0.1:12003",10)

+ 85 - 3
process_medical/src/main.go

@@ -1,9 +1,11 @@
 package main
 
 import (
+	"fmt"
 	log "github.com/donnie4w/go-logger/logger"
 	qu "qfw/util"
 	"regexp"
+	"strings"
 )
 
 var (
@@ -41,12 +43,53 @@ func main()  {
 	//initMySqlMgoData()
 	//saveBiddingPurMysql()
 	//exportAreaMysql()
+	//saveHospitalMysql()
+
+
+
+	arr:= *MysqlTool.Find("f_bidproduct",nil,"product_name,product_brand,bid_company_name,bid_company_ysname","",-1,-1)
+	data_arr := map[string][]string{}
+	for _,v := range arr {
+		product_name:= qu.ObjToString(v["product_name"])
+		product_brand:= qu.ObjToString(v["product_brand"])
+		bid_company_ysname:= qu.ObjToString(v["bid_company_ysname"])
+		if product_name==""||product_brand==""{
+			continue
+		}
+		if bid_company_ysname!=""{
+			arr_name := strings.Split(bid_company_ysname,",")
+			for _,value := range arr_name{
+				if data_arr[value]==nil {
+					data_arr[value] =  []string{product_name+"~"+product_brand}
+				}else { //拼接
+					tmp_arr := data_arr[value]
+					tmp_arr = append(tmp_arr,product_name+"~"+product_brand)
+					data_arr[value] = tmp_arr
+				}
+			}
+		}
+	}
+	for k,v := range data_arr{
+		str := ""
+		for _,v1 := range v{
+			if str=="" {
+				str = v1
+				continue
+			}
+			if !strings.Contains(str,v1) {
+				str+=","+v1
+			}
+		}
+		insertMysqlData("f_brandname_ys", map[string]interface{}{
+			"company_name":k,
+			"brands":str,
+		},"")
+	}
+	log.Debug("结束~",len(data_arr))
+}
 
 
-	saveHospitalMysql()
-
 
-}
 
 
 
@@ -60,3 +103,42 @@ func insertMysqlData(name string,data map[string]interface{},mark string) {
 		log.Debug("插入数据异常...",name,"~",mark)
 	}
 }
+
+
+
+
+
+
+
+type Info struct {
+	id int
+	product_name string
+	project_brand string
+	bid_company_name string
+	bid_company_id	string
+}
+func test() {
+	sqlStr := "select id,product_name,project_brand,bid_company_name,bid_company_id, from f_bidproduct where id > ?"
+	rows, err := MysqlTool.DB.Query(sqlStr, 0)
+	if err != nil {
+		fmt.Printf("query failed, err:%v\n", err)
+		return
+	}
+	defer rows.Close()
+	// 循环读取结果集中的数据
+	for rows.Next() {
+		var info Info
+		err := rows.Scan(
+			&info.id,
+			&info.product_name,
+			&info.project_brand,
+			&info.bid_company_name,
+			&info.bid_company_id,
+		)
+		if err != nil {
+			fmt.Printf("scan failed, err:%v\n", err)
+			return
+		}
+		log.Debug(info)
+	}
+}

+ 2 - 1
process_medical/src/medical_bidding.go

@@ -213,9 +213,10 @@ func dealWithPurData(tmp map[string]interface{},tmpid string){
 		}
 		insertMysqlData("f_bidproduct",data,tmpid)
 	}
+}
+
 
 
-}
 //根据品牌字段匹配-有效生产企业-过多10条
 func matchedManufacturer(brandName string,infoArr []map[string]interface{}) (bool,string,string) {
 	c_name :=""

+ 101 - 0
upd_simulate/src/main.go

@@ -0,0 +1,101 @@
+package main
+
+import (
+	"encoding/json"
+	log "github.com/donnie4w/go-logger/logger"
+	mu "mfw/util"
+	"net"
+	qu "qfw/util"
+	"sync"
+	"time"
+)
+
+var (
+	udpclient    		mu.UdpClient
+	udplock 			sync.Mutex
+	data_mgo     		*MongodbSim
+)
+func initMgo()  {
+	data_mgo = &MongodbSim{
+		MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
+		DbName:      "qfw",
+		Size:        3,
+		UserName: "zhengkun",
+		Password: "zk@123123",
+	}
+	data_mgo.InitPool()
+}
+func init() {
+	udpclient = mu.UdpClient{Local: ":6500", BufSize: 1024}
+	udpclient.Listen(processUdpMsg)
+	log.Debug("Udp服务监听", ":6500")
+	initMgo()
+}
+
+func main()  {
+	sendUdp()//模拟第一次先发一次
+
+	lock := make(chan bool)
+	<-lock
+}
+
+func getSidAndEid()(string,string)  {
+	//ocr_goods_over
+	sess := data_mgo.GetMgoConn()
+	defer data_mgo.DestoryMongoConn(sess)
+	q:=map[string]interface{}{
+		"is_repeat_status":1,
+	}
+	sid,eid := "",""
+	it := sess.DB(data_mgo.DbName).C("ocr_goods_over").Find(&q).Sort("-_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); {
+		sid = qu.ObjToString(tmp["gtid"])
+		eid = qu.ObjToString(tmp["lteid"])
+		tmp = make(map[string]interface{})
+		break
+	}
+	return sid,eid
+}
+
+func sendUdp()  {
+	sid,eid := getSidAndEid()
+	if sid!=""&&eid!=""{
+		log.Debug("获取当前有效:",sid,"~",eid)
+		by, _ := json.Marshal(map[string]interface{}{
+			"gtid":  sid,
+			"lteid": eid,
+			"stype": "simulate_udp_start",
+		})
+		udpclient.WriteUdp(by, mu.OP_TYPE_DATA, &net.UDPAddr{
+			IP:   net.ParseIP("172.17.4.238"),
+			Port: 6600,
+		})
+	}else {
+		log.Debug("获取当前无效")
+	}
+}
+
+//udp接收
+func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
+	switch act {
+	case mu.OP_TYPE_DATA:
+		var mapInfo map[string]interface{}
+		err := json.Unmarshal(data, &mapInfo)
+		if err != nil {
+			udpclient.WriteUdp([]byte("err:"+err.Error()), mu.OP_NOOP, ra)
+		} else if mapInfo != nil {
+			stype, _ := mapInfo["stype"].(string)
+			log.Debug(stype,"重新获取段落~~~")
+			log.Debug("休息~5分钟")
+			time.Sleep(time.Second*300)
+			sendUdp()
+		}
+	case mu.OP_NOOP: //下个节点回应
+		str := string(data)
+		log.Debug("接收成功回应:",str)
+	}
+}
+
+
+
+

+ 349 - 0
upd_simulate/src/mgo.go

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