Bläddra i källkod

医疗备份 0510

zhengkun 2 år sedan
förälder
incheckning
ab14c7122c

+ 1 - 1
data_medical/src/main.go

@@ -33,7 +33,7 @@ func main() {
 	confirmHospitalData("zzzzzzkkkkkk")
 
 	//生产经营企业~产品信息
-	//dealWithCompanyInfo()
+	dealWithCompanyInfo()
 
 	//医疗产品表~信息
 	//dealWithProductInfo()

+ 72 - 30
data_purchasing/src/bidclass.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	log "github.com/donnie4w/go-logger/logger"
 	qu "qfw/util"
+	"sync"
 )
 
 var Url = "https://www.jianyu360.com/article/content/%s.html"
@@ -11,12 +12,15 @@ var Url = "https://www.jianyu360.com/article/content/%s.html"
 func CreateBaseUpdateInfo(tmp map[string]interface{}) map[string]interface{} {
 	return map[string]interface{}{
 		"_id":             tmp["_id"],
+		"buyer":           qu.ObjToString(tmp["buyer"]),
 		"s_topscopeclass": qu.ObjToString(tmp["s_topscopeclass"]),
 		"s_subscopeclass": qu.ObjToString(tmp["s_subscopeclass"]),
-		"toptype":         qu.ObjToString(tmp["toptype"]),
+		"subtype":         qu.ObjToString(tmp["subtype"]),
 		"site":            qu.ObjToString(tmp["site"]),
 		"basicClass":      qu.ObjToString(tmp["basicClass"]),
+		"buyerclass":      qu.ObjToString(tmp["buyerclass"]),
 		"title":           qu.ObjToString(tmp["title"]),
+		"detail":          qu.ObjToString(tmp["detail"]),
 		"projectname":     qu.ObjToString(tmp["projectname"]),
 		"href":            qu.ObjToString(tmp["href"]),
 		"jyhref":          fmt.Sprintf(Url, qu.CommonEncodeArticle("content", qu.ObjToString(tmp["_id"]))),
@@ -28,40 +32,78 @@ func BeaconInfoPurchasingClass() {
 	sess := data_mgo.GetMgoConn()
 	defer data_mgo.DestoryMongoConn(sess)
 	q, total := map[string]interface{}{}, 0
-	isok := 0
+	pool_mgo := make(chan bool, 5)
+	wg_mgo := &sync.WaitGroup{}
 	it := sess.DB(data_mgo.DbName).C(SourceColl).Find(&q).Sort("_id").Select(SelectFields).Iter()
 	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
 		if total%1000 == 0 {
-			log.Debug("cur index ", total, "~", isok)
+			log.Debug("cur index ", total)
 		}
-		update := CreateBaseUpdateInfo(tmp)
-		//前置特殊~单标的
-		if qu.ObjToString(update["class_code"]) == "" {
-			prejudgmentListInfo(&update, tmp)
-		}
-		//标准分类
-		if qu.ObjToString(update["class_code"]) == "" {
-			acquirePlistClassInfo(&update, tmp)
-		}
-		//补充分类
-		if qu.ObjToString(update["class_code"]) == "" {
-			replenishRuleClassInfo(&update, tmp)
-		}
-		//相似度分类
-		if qu.ObjToString(update["class_code"]) == "" {
-			similarPurClass(&update, tmp)
-		}
-
-		//class_1, class_2, class_3, class_4, class_5 := relevanceEntireClassCode(ab_code)
-		//update["class_1"] = class_1
-		//update["class_2"] = class_2
-		//update["class_3"] = class_3
-		//update["class_4"] = class_4
-		//update["class_5"] = class_5
-
-		data_mgo.Save(SourceColl+"_new", update)
+		pool_mgo <- true
+		wg_mgo.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-pool_mgo
+				wg_mgo.Done()
+			}()
+			dealWithBidInfoClass(tmp)
+		}(tmp)
 		tmp = make(map[string]interface{})
 	}
-	log.Debug("is over ", total, "~", isok)
+	wg_mgo.Wait()
+	log.Debug("彻底结束~~~", total)
+}
 
+func dealWithBidInfoClass(tmp map[string]interface{}) {
+	update := CreateBaseUpdateInfo(tmp)
+	//前置特殊~单标的
+	if qu.ObjToString(update["class_code"]) == "" {
+		prejudgmentListInfo(&update, tmp)
+	}
+	//标准分类
+	if qu.ObjToString(update["class_code"]) == "" {
+		acquirePlistClassInfo(&update, tmp)
+	}
+	//补充分类
+	if qu.ObjToString(update["class_code"]) == "" {
+		replenishRuleClassInfo(&update, tmp)
+	}
+	//相似度分类
+	if qu.ObjToString(update["class_code"]) == "" {
+		similarPurClass(&update, tmp)
+	}
+	//特别需求
+	relevanceFiveClassCode(qu.ObjToString(update["class_code"]), &update)
+	//class_1, class_2, class_3, class_4, class_5 := relevanceEntireClassCode(ab_code)
+	//update["class_1"] = class_1
+	//update["class_2"] = class_2
+	//update["class_3"] = class_3
+	//update["class_4"] = class_4
+	//update["class_5"] = class_5
+	data_mgo.Save(SourceColl+"_new", update)
+}
+
+//测试数据
+func TestBeaconInfoPurchasingClass(tmpid string) {
+	tmp := data_mgo.FindOne(SourceColl, map[string]interface{}{"_id": tmpid})
+	update := CreateBaseUpdateInfo(tmp)
+	//前置特殊~单标的
+	if qu.ObjToString(update["class_code"]) == "" {
+		prejudgmentListInfo(&update, tmp)
+	}
+	//标准分类
+	if qu.ObjToString(update["class_code"]) == "" {
+		acquirePlistClassInfo(&update, tmp)
+	}
+	//补充分类
+	if qu.ObjToString(update["class_code"]) == "" {
+		replenishRuleClassInfo(&update, tmp)
+	}
+	//相似度分类
+	if qu.ObjToString(update["class_code"]) == "" {
+		similarPurClass(&update, tmp)
+	}
+	//特别需求
+	relevanceFiveClassCode(qu.ObjToString(update["class_code"]), &update)
+	log.Debug(update)
 }

+ 577 - 8
data_purchasing/src/bidexport.go

@@ -3,6 +3,7 @@ package main
 import (
 	"bufio"
 	"encoding/json"
+	"fmt"
 	log "github.com/donnie4w/go-logger/logger"
 	"github.com/tealeg/xlsx"
 	"io"
@@ -10,11 +11,442 @@ import (
 	es_elastic "qfw/common/src/gopkg.in/olivere/elastic.v1"
 	qu "qfw/util"
 	"qfw/util/elastic"
+	"regexp"
 	"strings"
 	"sync"
 	"unicode/utf8"
 )
 
+var tidyArr = []string{
+	"365410",
+	"365409",
+	"40130401",
+	"40130402",
+	"62020105",
+	"365411",
+	"36540903",
+	"400101",
+	"40010101",
+	"40010103",
+	"4008030102",
+	"400203",
+	"400599",
+	"40059901",
+	"40059902",
+	"4008049903",
+	"4008049902",
+	"4008022201",
+	"40090101",
+	"4009010101",
+	"4009010102",
+	"40090103",
+	"40090104",
+	"401001",
+	"40100301",
+	"40100302",
+	"40100305",
+	"40100401",
+	"401002",
+	"40100203",
+	"401101",
+	"40110206",
+	"40110103",
+	"40110212",
+	"401104",
+	"40110402",
+	"40110405",
+	"4011040401",
+	"4011040402",
+	"40110503",
+	"40110504",
+	"40120101",
+	"401202",
+	"40120201",
+	"40120202",
+	"40129901",
+	"40130201",
+	"401303",
+	"40130301",
+	"40130302",
+	"40130303",
+	"40130304",
+	"401304",
+	"4016120101",
+	"40190603",
+	"402002",
+	"390904",
+	"39090203",
+	"391001",
+	"39100101",
+	"391002",
+	"620101",
+	"620201",
+	"620202",
+	"620303",
+	"62030301",
+	"62030302",
+	"620401",
+	"610102",
+	"600103",
+	"60010303",
+	"60010304",
+	"76020205",
+	"400803",
+	"402201",
+	"480102",
+	"4022020103",
+}
+
+var LdxArr_1 = []string{"365410", "365409", "40130401", "40130402", "62020105", "365411", "36540903", "4008030102", "4008049903", "4008049902", "40110206", "40110212", "40130301", "76020205", "4022020103", "480102", "480202", "40080301"}
+var LdxArr_2 = []string{"4701", "4013", "61", "62", "8301", "40", "4127", "6101", "6202", "83", "4899", "8405", "7417"}
+var LdxReg_2 *regexp.Regexp = regexp.MustCompile("(安防|监控|校园安全|视频监控|校园安防|校园监控|监控系统|安防监控|学校监控|标准化考场|标准化考点|网络安全)")
+var LdxArr_3 = []string{"400101", "401906", "40010101", "402201", "40010103", "400203", "400599", "40059901", "40059902", "4008022201", "40090101", "4009010101", "4009010102", "40090103", "40090104", "401001", "40100301", "40100302", "40100305", "40100401", "401002", "40100203", "401101", "40110103", "401104", "40110402", "40110405", "4011040401", "4011040402", "40110503", "40110504", "40120101", "401202", "40120201", "40120202", "40129901", "40130201", "401303", "40130302", "40130303", "40130304", "401304", "4016120101", "40190603", "402002", "390904", "39090203", "391001", "39100101", "391002", "620101", "620201", "620202", "620303", "62030301", "62030302", "620401", "610102", "600103", "60010303", "60010304"}
+var LdxReg_3 *regexp.Regexp = regexp.MustCompile("(明厨亮灶|安防|监控|校园安全|视频监控|校园安防|校园监控|监控系统|安防监控|学校监控|标准化考场|摄录一体机|标准化考点|平安校园|摄像头|摄像机)")
+
+var LdxMark1 *regexp.Regexp = regexp.MustCompile("(校园安全|校园安防|校园监控|安防监控|平安校园|智慧校园|监控改造|监控升级|标准化考场|明厨亮灶|监控设备)")
+var LdxMark2 *regexp.Regexp = regexp.MustCompile("(校园监控安防监控|平安校园|智慧校园|监控改造|监控升级|标准化考场|明厨亮灶|人脸识别|摄像设备安装|一键报警器|视频监控设备|人脸闸机|监控设备|门禁一体机|监控摄像头|视频监控|安防监控系统|监控可视化|平安校园建设|智能测温人脸|摄像头|考勤门禁)")
+
+//更新新标记
+func updateNewLdxTag() {
+	sess := data_mgo.GetMgoConn()
+	defer data_mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	isok := 0
+	it := sess.DB(data_mgo.DbName).C(SourceColl + "_new").Find(&q).Sort("_id").Select(map[string]interface{}{
+		"class_code": 1,
+		"title":      1,
+		"detail":     1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("cur index ", total, "~", isok)
+		}
+		tmpid := qu.ObjToString(tmp["_id"])
+		code := qu.ObjToString(tmp["class_code"])
+		codeArr := strings.Split(code, "~")
+		title := qu.ObjToString(tmp["title"])
+		detail := qu.ObjToString(tmp["detail"])
+		if len(codeArr) > 0 {
+			isUpdate := false
+			isLdx := 0
+			isLdx_code := ""
+			if b1, code1 := firstLdxInfo(codeArr); b1 {
+				isUpdate = true
+				isLdx = 1
+				isLdx_code = code1
+			} else {
+				if b2, code2 := secondLdxInfo(code, title); b2 {
+					isUpdate = true
+					isLdx = 2
+					isLdx_code = code2
+				} else {
+					if b3, code3 := thirdLdxInfo(codeArr, title, detail); b3 {
+						isUpdate = true
+						isLdx = 3
+						isLdx_code = code3
+					}
+				}
+			}
+			if isUpdate {
+				isok++
+				data_mgo.Save(SourceColl+"_test", map[string]interface{}{
+					"_id":        tmpid,
+					"isLdx":      isLdx,
+					"isLdx_code": isLdx_code,
+				})
+				//data_mgo.UpdateStrId(SourceColl+"_new", tmpid, map[string]interface{}{
+				//	"$set": map[string]interface{}{
+				//		"isLdx":      isLdx,
+				//		"isLdx_code": isLdx_code,
+				//	},
+				//})
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over~", total, "~", isok)
+}
+
+//第一步校验
+func firstLdxInfo(codeArr []string) (bool, string) {
+	for _, code := range codeArr {
+		for _, v := range LdxArr_1 {
+			if v == code {
+				return true, v
+			}
+		}
+	}
+	return false, ""
+}
+
+//第二步校验
+func secondLdxInfo(code string, title string) (bool, string) {
+	for _, v := range LdxArr_2 {
+		if v == code {
+			if LdxReg_2.MatchString(title) {
+				return true, code
+			}
+		}
+	}
+	return false, ""
+}
+
+//第三步校验
+func thirdLdxInfo(codeArr []string, title string, detail string) (bool, string) {
+	for _, code := range codeArr {
+		for _, v := range LdxArr_3 {
+			if v == code {
+				//if LdxReg_3.MatchString(title) {
+				//	return true, v
+				//}
+				//if LdxReg_3.MatchString(detail) {
+				//	return true, v
+				//}
+				return true, v
+			}
+		}
+	}
+	return false, ""
+}
+
+//打匹配上的标记-source isMatch
+func updateLdxSourceMatchInfo() {
+	dataArr, _ := data_mgo.Find(SourceColl+"_source", nil, nil, map[string]interface{}{"id": 1})
+	ok := 0
+	for k, v := range dataArr {
+		if k%1000 == 0 {
+			log.Debug("cur index ", k, "~", ok)
+		}
+		tmpid := qu.ObjToString(v["id"])
+		data := data_mgo.FindByStrId(SourceColl, tmpid)
+		if data != nil && len(data) > 0 {
+			ok++
+			data_mgo.UpdateById(SourceColl+"_source", BsonTOStringId(v["_id"]), map[string]interface{}{
+				"$set": map[string]interface{}{
+					"isMatch": 1,
+				},
+			})
+		}
+	}
+	log.Debug(len(dataArr), "~", ok)
+}
+
+//根据关键词~更新不同的标记
+func updateLdxMark0410() {
+	sess := data_mgo.GetMgoConn()
+	defer data_mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{
+		"isLdx_1": 1,
+	}, 0
+	it := sess.DB(data_mgo.DbName).C(SourceColl + "_new").Find(&q).Sort("_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("cur index ", total)
+		}
+		tmpid := qu.ObjToString(tmp["_id"])
+		data := data_mgo.FindOne(SourceColl, map[string]interface{}{
+			"_id": tmpid,
+		})
+		if data != nil {
+			title := qu.ObjToString(data["title"])
+			detail := qu.ObjToString(data["detail"])
+			if LdxMark1.MatchString(title) {
+				data_mgo.UpdateStrId(SourceColl+"_new", tmpid, map[string]interface{}{
+					"$set": map[string]interface{}{"Ldx_mark": 1},
+				})
+			} else {
+				if LdxMark2.MatchString(detail) {
+					data_mgo.UpdateStrId(SourceColl+"_new", tmpid, map[string]interface{}{
+						"$set": map[string]interface{}{"Ldx_mark": 1},
+					})
+				}
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over~", total)
+}
+
+//更新~五级类别分组
+func updateFiveClassInfo() {
+	sess := data_mgo.GetMgoConn()
+	defer data_mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	pool := make(chan bool, 6)
+	wg := &sync.WaitGroup{}
+	it := sess.DB(data_mgo.DbName).C(SourceColl + "_new").Find(&q).Sort("_id").Select(map[string]interface{}{
+		"class_code": 1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("cur index ", total)
+		}
+		pool <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-pool
+				wg.Done()
+			}()
+			tmpid := qu.ObjToString(tmp["_id"])
+			codeArr := strings.Split(qu.ObjToString(tmp["class_code"]), "~")
+			update := splitFiveInfo(codeArr, tmpid)
+			if tmpid != "" && update != nil {
+				//data_mgo.UpdateStrId(SourceColl+"_new", tmpid, map[string]interface{}{
+				//	"$set": update,
+				//})
+			}
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+	wg.Wait()
+	log.Debug("is over ", total)
+}
+
+func splitFiveInfo(codeArr []string, tmpid string) map[string]interface{} {
+	arr1, arr2, arr3, arr4, arr5 := []string{}, []string{}, []string{}, []string{}, []string{}
+	for _, v := range codeArr {
+		if v == "" {
+			continue
+		}
+		l := utf8.RuneCountInString(v)
+		switch l {
+		case 2:
+			arr1 = append(arr1, v)
+		case 4:
+			arr2 = append(arr2, v)
+		case 6:
+			arr3 = append(arr3, v)
+		case 8:
+			arr4 = append(arr4, v)
+		case 10:
+			arr5 = append(arr5, v)
+		default:
+			log.Debug("异常~", tmpid, "~", v)
+		}
+	}
+	update := map[string]interface{}{
+		"class_1": strings.Join(arr1, "~"),
+		"class_2": strings.Join(arr2, "~"),
+		"class_3": strings.Join(arr3, "~"),
+		"class_4": strings.Join(arr4, "~"),
+		"class_5": strings.Join(arr5, "~"),
+	}
+	return update
+}
+
+//更新字段~buyerclass
+func updateBuyerClassInfo() {
+	sess := data_mgo.GetMgoConn()
+	defer data_mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	pool := make(chan bool, 6)
+	wg := &sync.WaitGroup{}
+	it := sess.DB(data_mgo.DbName).C(SourceColl).Find(&q).Sort("_id").Select(map[string]interface{}{
+		"buyerclass": 1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("cur index ", total)
+		}
+		pool <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-pool
+				wg.Done()
+			}()
+			tmpid := qu.ObjToString(tmp["_id"])
+			data_mgo.UpdateStrId(SourceColl+"_new", tmpid, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"buyerclass": qu.ObjToString(tmp["buyerclass"]),
+				},
+			})
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+	wg.Wait()
+	log.Debug("is over ", total)
+}
+
+//分析数据~打匹配的数据
+func tidyMactchTheLdxInfo() {
+	sess := data_mgo.GetMgoConn()
+	defer data_mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	temp := map[string]string{}
+	it := sess.DB(data_mgo.DbName).C(SourceColl + "_new").Find(&q).Sort("_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("cur index ", total, "~", len(temp))
+		}
+		tmpid := qu.ObjToString(tmp["_id"])
+		temp[tmpid] = tmpid
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("符合条件加载完毕~", total, "~", len(temp))
+
+	dataArr, _ := data_mgo.Find("zktest_lidaxin_info_source", nil, nil, map[string]interface{}{"id": 1})
+	ok := 0
+	for k, v := range dataArr {
+		if k%1000 == 0 {
+			log.Debug("cur index ", k, "~", ok)
+		}
+		tmpid := qu.ObjToString(v["id"])
+		if temp[tmpid] != "" {
+			ok++
+			data_mgo.UpdateById(SourceColl+"_source", BsonTOStringId(v["_id"]), map[string]interface{}{
+				"$set": map[string]interface{}{
+					"isMatch": 1,
+				},
+			})
+		}
+	}
+	log.Debug(len(dataArr), "~", ok)
+}
+
+//分析数据~打疑似立达信标记
+func tidyMatchTheLdxData() {
+	sess := data_mgo.GetMgoConn()
+	defer data_mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	isok := 0
+	it := sess.DB(data_mgo.DbName).C(SourceColl + "_new").Find(&q).Sort("_id").Select(map[string]interface{}{
+		"class_code": 1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("cur index ", total, "~", isok)
+		}
+		class_code := qu.ObjToString(tmp["class_code"])
+		if class_code != "" {
+			codeArr := strings.Split(class_code, "~")
+			b, ldx_code := isTidyInfo(codeArr)
+			if b {
+				isok++
+				data_mgo.UpdateStrId(SourceColl+"_new", qu.ObjToString(tmp["_id"]), map[string]interface{}{
+					"$set": map[string]interface{}{
+						"isLdx_1":      1,
+						"isLdx_code_1": ldx_code,
+					},
+				})
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over~", total, "~", isok)
+}
+func isTidyInfo(codeArr []string) (bool, string) {
+	for _, code := range codeArr {
+		for _, v := range tidyArr {
+			if v == code {
+				return true, v
+			}
+		}
+	}
+	return false, ""
+}
+
 //导出指定数据
 func exportLdxInfo() {
 	log.Debug("准备~标讯信息~~~")
@@ -82,10 +514,11 @@ func exportLdxInfo() {
 						<-pool_es
 						wg_es.Done()
 					}()
-					p_list := IsMarkInterfaceMap(tmp["purchasinglist"])
-					if len(p_list) > 0 {
-						data_mgo.Save("zktest_lidaxin_info", tmp)
-					}
+					//p_list := IsMarkInterfaceMap(tmp["purchasinglist"])
+					//if len(p_list) > 0 {
+					//	data_mgo.Save("zktest_lidaxin_info", tmp)
+					//}
+					data_mgo.Save("zktest_lidaxin_info", tmp)
 				}(tmp)
 			}
 		}
@@ -94,7 +527,6 @@ func exportLdxInfo() {
 	}
 	log.Debug("最后真结束了~~~~~~~~~~~~~")
 }
-
 func exportSimilarText() {
 	r, err := os.Open("res/similar.txt")
 	if err != nil {
@@ -159,6 +591,44 @@ func exportSimilarText() {
 	}
 }
 
+//导出特殊校验的数据
+func exportSpecLdxInfo() {
+	//elastic.InitElasticSize("http://172.17.4.184:19800", 10)
+	elastic.InitElasticSize("http://127.0.0.1:13002", 10)
+	query := `{"query":{"filtered":{"filter":{"bool":{"must":[{"terms":{"subtype":["成交","中标"]}},{"range":{"publishtime":{"gte":1609498796,"lt":1672502400}}}],"must_not":[{"term":{"bidding.buyerclass":"学校"}},{"term":{"bidding.buyerclass":"教育"}}]}},"query":{"bool":{"should":[{"multi_match":{"query":"学校","type":"phrase","fields":["title"]}},{"multi_match":{"query":"幼儿园","type":"phrase","fields":["title"]}},{"multi_match":{"query":"小学","type":"phrase","fields":["title"]}},{"multi_match":{"query":"中学","type":"phrase","fields":["title"]}},{"multi_match":{"query":"高中","type":"phrase","fields":["title"]}},{"multi_match":{"query":"大学","type":"phrase","fields":["title"]}},{"multi_match":{"query":"职业技术学院","type":"phrase","fields":["title"]}}]}}}},"_source":["_id","title"],"sort":{"comeintime":{"order":"asc"}}}`
+	ccc := elastic.Count("bidding", "bidding", query)
+	log.Debug(ccc)
+	return
+	size, total := 200, 0
+	pool_es := make(chan bool, 7)
+	wg_es := &sync.WaitGroup{}
+	for i := 0; i < 2030; i++ {
+		if total%5000 == 0 {
+			log.Debug("cur index ", i, "~", total)
+		}
+		pool_es <- true
+		wg_es.Add(1)
+		go func(i int) {
+			defer func() {
+				<-pool_es
+				wg_es.Done()
+			}()
+			from := fmt.Sprintf("%d", i*size)
+			q1 := `{"query":{"filtered":{"filter":{"bool":{"must":[{"terms":{"subtype":["成交","中标"]}},{"range":{"publishtime":{"gte":1609430400,"lt":1672502400}}}],"must_not":[{"term":{"bidding.buyerclass":"学校"}},{"term":{"bidding.buyerclass":"教育"}}]}},"query":{"bool":{"should":[{"multi_match":{"query":"学校","type":"phrase","fields":["title"]}},{"multi_match":{"query":"幼儿园","type":"phrase","fields":["title"]}},{"multi_match":{"query":"小学","type":"phrase","fields":["title"]}},{"multi_match":{"query":"中学","type":"phrase","fields":["title"]}},{"multi_match":{"query":"高中","type":"phrase","fields":["title"]}},{"multi_match":{"query":"大学","type":"phrase","fields":["title"]}},{"multi_match":{"query":"职业技术学院","type":"phrase","fields":["title"]}}]}}}},`
+			q2 := `"sort":{"comeintime":{"order":"asc"}},"from":"` + from + `","size":"200"}`
+			dataArr := *elastic.Get("bidding", "bidding", q1+q2)
+			numLock.Lock()
+			total += len(dataArr)
+			numLock.Unlock()
+			for _, v := range dataArr {
+				data_mgo.Save("zktest_lidaxin_info", v)
+			}
+		}(i)
+	}
+	wg_es.Wait()
+	log.Debug("is over ", total)
+}
+
 //词林信息
 func CiLinInfo(strArr []string) (bool, string, string, string, string, string) {
 	code, code_1, code_2, code_3 := "", "", "", ""
@@ -318,7 +788,7 @@ func exportPurSourceInfo() {
 				}
 				for _, v := range p_list {
 					itemname := qu.ObjToString(v["itemname"])
-					if itemname == "" || utf8.RuneCountInString(itemname) > 50 {
+					if itemname == "" || utf8.RuneCountInString(itemname) > PurLength {
 						continue
 					}
 					if toptype == "招标" {
@@ -418,7 +888,7 @@ func exportIndustryPurchasingInfo() {
 				p_list := IsMarkInterfaceMap(tmp["purchasinglist"])
 				for _, v := range p_list {
 					itemname := qu.ObjToString(v["itemname"])
-					if itemname != "" && utf8.RuneCountInString(itemname) <= 50 {
+					if itemname != "" && utf8.RuneCountInString(itemname) <= PurLength {
 						num := qu.IntAll(infos[itemname])
 						infos[itemname] = num + 1
 					}
@@ -470,7 +940,7 @@ func exportEmptyClassInfo() {
 			p_list := IsMarkInterfaceMap(tmp["purchasinglist"])
 			for _, v := range p_list {
 				itemname := qu.ObjToString(v["itemname"])
-				if itemname != "" && utf8.RuneCountInString(itemname) <= 50 {
+				if itemname != "" && utf8.RuneCountInString(itemname) <= PurLength {
 					num := qu.IntAll(infos[itemname])
 					infos[itemname] = num + 1
 					bas := qu.ObjToString(basic[itemname])
@@ -522,3 +992,102 @@ func updateBasicClassInfo() {
 	}
 	log.Debug("is over~", total)
 }
+
+//导出统计出现频次的数据
+func integrateInfoTest() {
+	dataArr, _ := data_mgo.Find("11111", nil, nil, nil)
+	log.Debug(len(dataArr))
+	temp := map[string]int{}
+	for _, info := range dataArr {
+		code := qu.ObjToString(info["class_code"])
+		if code == "" {
+			continue
+		}
+		arr := strings.Split(code, "~")
+		for _, v := range arr {
+			num := temp[v]
+			num++
+			temp[v] = num
+		}
+	}
+	for k, v := range temp {
+		data_mgo.Save("22222", map[string]interface{}{
+			"code": k,
+			"num":  v,
+		})
+	}
+	log.Debug("is over ~")
+}
+
+//测试调试
+func testEsQuery() {
+	//elastic.InitElasticSize("http://172.17.4.184:19800", 10)
+	elastic.InitElasticSize("http://127.0.0.1:13002", 10)
+	total := int64(0)
+	esclient := elastic.GetEsConn()
+	defer elastic.DestoryEsConn(esclient)
+	if esclient == nil {
+		log.Debug("连接池异常")
+	}
+	query1 := es_elastic.NewRangeQuery("publishtime").Gte(1681833600).Lt(1681920000)
+	query2 := es_elastic.NewTermQuery("subtype", "成交")
+	query3 := es_elastic.NewMissingFilter("bidamount")
+	query4 := es_elastic.NewMissingFilter("winner")
+	cursor, err := esclient.Scan("bidding").Query(es_elastic.NewBoolQuery().Must(query1, query2, query3, query4)).Size(200).Do()
+	if err != nil {
+		log.Debug("cursor", err)
+	}
+	if cursor.Results == nil {
+		log.Debug("results != nil; got nil")
+	}
+	if cursor.Results.Hits == nil {
+		log.Debug("expected results.Hits != nil; got nil")
+	}
+	total += cursor.TotalHits()
+	log.Debug("当前查询正常数:", cursor.TotalHits(), "总数:", total)
+
+	numDocs, isok := 0, 0
+	var packageReg *regexp.Regexp = regexp.MustCompile("(标段|分包)")
+	//多线程 - 处理数据
+	pool_es := make(chan bool, 1)
+	wg_es := &sync.WaitGroup{}
+	for {
+		searchResult, err := cursor.Next()
+		if err != nil {
+			if err.Error() == "EOS" {
+				break
+			} else {
+				log.Debug("cursor searchResult", err)
+			}
+		}
+		for _, hit := range searchResult.Hits.Hits {
+			tmp := make(map[string]interface{})
+			err := json.Unmarshal(*hit.Source, &tmp)
+			if err != nil {
+				log.Debug("json Unmarshal error")
+				continue
+			}
+			if numDocs%1000 == 0 {
+				log.Debug("当前条数:", numDocs, " 符合条数:", isok)
+			}
+			numDocs++
+			pool_es <- true
+			wg_es.Add(1)
+			go func(tmp map[string]interface{}) {
+				defer func() {
+					<-pool_es
+					wg_es.Done()
+				}()
+				tmpid := qu.ObjToString(tmp["_id"])
+				detail := qu.ObjToString(tmp["detail"])
+				if packageReg.MatchString(detail) {
+					isok++
+					tmp["_id"] = StringTOBsonId(tmpid)
+					data_mgo.Save("zktest_chatglm_info", tmp)
+				}
+			}(tmp)
+		}
+	}
+	wg_es.Wait()
+	log.Debug("遍历完毕...", total, numDocs, isok)
+}

+ 21 - 68
data_purchasing/src/bidinit.go

@@ -6,8 +6,6 @@ import (
 	qu "qfw/util"
 	"regexp"
 	"sensitive"
-	"strings"
-	"unicode/utf8"
 )
 
 type PurInfo struct {
@@ -42,7 +40,6 @@ var RulePreReg1 *regexp.Regexp = regexp.MustCompile("(费|费用)(】)?$")
 var RulePreReg2 *regexp.Regexp = regexp.MustCompile("(维护|维修|保养|检修|维保|修复)")
 var RulePreReg3 *regexp.Regexp = regexp.MustCompile("(费|费用|手册|修缮|工程|施工|装修)")
 var RulePreReg4 *regexp.Regexp = regexp.MustCompile("(修缮|工程|改造|施工|房屋)")
-
 var RulePreReg5 *regexp.Regexp = regexp.MustCompile("(服务)$")
 
 //拆分
@@ -58,6 +55,7 @@ const (
 //行业对应关系
 var TopScopeClass = map[string]string{}
 
+//筛选字段
 var SelectFields = map[string]interface{}{
 	"purchasinglist":  1,
 	"s_topscopeclass": 1,
@@ -69,6 +67,8 @@ var SelectFields = map[string]interface{}{
 	"projectname":     1,
 	"detail":          1,
 	"basicClass":      1,
+	"buyerclass":      1,
+	"buyer":           1,
 }
 
 //敏感词
@@ -77,10 +77,10 @@ var SensitiveInfo *sensitive.Filter
 //切词
 var Gse *gse.Segmenter = &gse.Segmenter{}
 
-var IsSaveLog bool
+var PurLength = 100
+var IsSaveLog = true
 
 func initReadyInfo() {
-	IsSaveLog = true
 	initPurchasingCode()
 	initScopeCode()
 	initSensitiveInfo()
@@ -131,18 +131,12 @@ func initPurchasingCode() {
 }
 
 func initScopeCode() {
-	nameArr := []string{"行政办公", "建筑工程", "交通工程", "弱电安防", "市政设施", "水利水电", "信息技术", "医疗卫生", "服务采购", "能源化工", "机械设备", "行政办公_办公家具", "行政办公_通用办公设备", "行政办公_专业设备", "行政办公_办公用品", "行政办公_生活用品", "建筑工程_勘察设计", "建筑工程_工程施工", "建筑工程_材料准备", "建筑工程_机电安装", "建筑工程_监理咨询", "交通工程_道路", "交通工程_轨道", "交通工程_桥梁", "交通工程_隧道", "交通工程_其他", "弱电安防_综合布线", "弱电安防_智能系统", "弱电安防_智能家居", "市政设施_道路", "市政设施_绿化", "市政设施_线路管网", "市政设施_综合项目", "水利水电_水利工程", "水利水电_发电工程", "水利水电_航运工程", "水利水电_其他工程", "信息技术_运维服务", "信息技术_软件开发", "信息技术_系统集成及安全", "信息技术_其他", "医疗卫生_设备", "医疗卫生_耗材", "医疗卫生_药品", "服务采购_法律咨询", "服务采购_会计", "服务采购_物业", "服务采购_审计", "服务采购_安保", "服务采购_仓储物流", "服务采购_广告宣传印刷", "服务采购_其他", "能源化工_新能源", "能源化工_原材料", "能源化工_化工产品", "能源化工_仪器仪表", "能源化工_设备物资", "机械设备_矿山机械", "机械设备_工程机械", "机械设备_机械零部件", "机械设备_机床相关", "机械设备_车辆", "机械设备_其他机械设备", "农林牧渔_生产物资", "农林牧渔_生产设备", "农林牧渔_相关服务"}
-	codeArr := []string{"4127", "4701", "4701002", "4899", "4702", "4701002", "", "27", "", "", "36", "2101", "4127", "4127", "4127", "", "7607", "4701", "4702", "4803001", "7607007", "4701002", "4701002", "4701002", "4701002", "4701002", "4899", "4899", "4899", "4702", "4702", "4702", "4702", "4701002", "4701002", "4701002", "4701002", "61", "62", "6101", "6199099", "3643", "2708", "2706", "7404", "7405", "7202", "7405", "7417", "58", "89", "", "", "07", "26", "4102", "", "3601", "3603", "3699002", "3610", "37", "3699001", "", "3618", "05"}
+	nameArr := []string{"行政办公", "建筑工程", "交通工程", "弱电安防", "市政设施", "水利水电", "信息技术", "医疗卫生", "服务采购", "能源化工", "机械设备", "农林牧渔", "行政办公_办公家具", "行政办公_通用办公设备", "行政办公_专业设备", "行政办公_办公用品", "行政办公_生活用品", "建筑工程_勘察设计", "建筑工程_工程施工", "建筑工程_材料准备", "建筑工程_机电安装", "建筑工程_监理咨询", "交通工程_道路", "交通工程_轨道", "交通工程_桥梁", "交通工程_隧道", "交通工程_其他", "弱电安防_综合布线", "弱电安防_智能系统", "弱电安防_智能家居", "市政设施_道路", "市政设施_绿化", "市政设施_线路管网", "市政设施_综合项目", "水利水电_水利工程", "水利水电_发电工程", "水利水电_航运工程", "水利水电_其他工程", "信息技术_运维服务", "信息技术_软件开发", "信息技术_系统集成及安全", "信息技术_其他", "医疗卫生_设备", "医疗卫生_耗材", "医疗卫生_药品", "服务采购_法律咨询", "服务采购_会计", "服务采购_物业", "服务采购_审计", "服务采购_安保", "服务采购_仓储物流", "服务采购_广告宣传印刷", "服务采购_其他", "能源化工_新能源", "能源化工_原材料", "能源化工_化工产品", "能源化工_仪器仪表", "能源化工_设备物资", "机械设备_矿山机械", "机械设备_工程机械", "机械设备_机械零部件", "机械设备_机床相关", "机械设备_车辆", "机械设备_其他机械设备", "农林牧渔_生产物资", "农林牧渔_生产设备", "农林牧渔_相关服务"}
+	codeArr := []string{"4127", "47", "470102", "4899", "4702", "470102", "", "27", "", "", "36", "", "2101", "4127", "4127", "4127", "", "7607", "4701", "4702", "480301", "760707", "470102", "470102", "470102", "470102", "470102", "4899", "4899", "4899", "4702", "4702", "4702", "4702", "470102", "470102", "470102", "470102", "61", "62", "6101", "619999", "3643", "2708", "2706", "7404", "7405", "7202", "7405", "7417", "58", "89", "", "", "07", "26", "4102", "", "3601", "3603", "369902", "3610", "37", "369901", "", "3618", "05"}
 	for k, v := range nameArr {
 		if v != "" && codeArr[k] != "" {
 			TopScopeClass[v] = codeArr[k]
 		}
-		//if v != "" && codeArr[k] == "" {
-		//	log.Debug("异常~", v, "~", codeArr[k])
-		//}
-		//if v == "" && codeArr[k] != "" {
-		//	log.Debug("异常~", v, "~", codeArr[k])
-		//}
 	}
 	log.Debug("行业对应代码~", len(nameArr), "~", len(codeArr), "~", len(TopScopeClass))
 }
@@ -150,67 +144,26 @@ func initScopeCode() {
 //加载特殊词库信息
 func initSensitiveInfo() {
 	SensitiveInfo = sensitive.New()
-	temp_2 := map[string]interface{}{"08": 1, "09": 1, "26": 1, "27": 1, "40": 1, "41": 1, "48": 1, "49": 1, "50": 1}
-	temp_4 := map[string]interface{}{"3643": 1, "3644": 1, "3645": 1, "3646": 1, "4701": 1}
+	temp_2 := map[string]interface{}{"08": 1, "09": 1, "26": 1, "27": 1, "40": 1, "41": 1, "48": 1, "49": 1, "50": 1, "61": 1, "62": 1}
+	temp_4 := map[string]interface{}{"3643": 1, "3644": 1, "3645": 1, "3646": 1, "4701": 1, "3654": 1, "4801": 1, "4802": 1, "8301": 1}
 	dataArr, _ := data_mgo.Find(InitialColl, nil, nil, nil)
+	total := 0
 	for _, v := range dataArr {
 		code := qu.ObjToString(v["code"])
 		level := qu.IntAll(v["level"])
-		path := qu.ObjToString(v["path"])
-		i_code_2, i_code_4 := "", ""
-		i_code_2 = code[:2]
-		if level > 1 {
-			i_code_4 = code[:4]
+		name := qu.ObjToString(v["name"])
+		if name == "" {
+			continue
 		}
-		if temp_2[i_code_2] != nil {
-			arr := strings.Split(path, "~")
-			for _, v1 := range arr {
-				if utf8.RuneCountInString(v1) > 1 {
-					SensitiveInfo.AddWord(v1)
-				}
-			}
+		code_2, code_4 := "", ""
+		code_2 = code[:2]
+		if level > 1 {
+			code_4 = code[:4]
 		}
-		if temp_4[i_code_4] != nil {
-			arr := strings.Split(path, "~")
-			for _, v1 := range arr {
-				if utf8.RuneCountInString(v1) > 1 {
-					SensitiveInfo.AddWord(v1)
-				}
-			}
+		if temp_2[code_2] != nil || temp_4[code_4] != nil {
+			total++
+			SensitiveInfo.AddWord(name)
 		}
 	}
-	log.Debug("is sensitive over ~~~")
+	log.Debug("is sensitive over ~~~", total)
 }
-
-//暂时弃用
-//func initBasicCode() {
-//	dataArr, _ := data_mgo.Find(BasicClassColl, nil, map[string]interface{}{"_id": 1}, nil)
-//	for _, v := range dataArr {
-//		b_name := qu.ObjToString(v["name"])
-//		b_code := qu.ObjToString(v["code"])
-//		if b_name == "" || b_code == "" {
-//			continue
-//		}
-//		l := utf8.RuneCountInString(b_code)
-//		arr := BasicClassInfo[b_name]
-//		if arr == nil {
-//			arr = []string{}
-//		}
-//		for k1, v1 := range PurClassInfo {
-//			if utf8.RuneCountInString(k1) <= 1 {
-//				continue
-//			}
-//			for _, v2 := range v1 {
-//				if utf8.RuneCountInString(v2.code) >= l {
-//					c := v2.code[:l]
-//					if b_code == c {
-//						arr = append(arr, k1)
-//						break
-//					}
-//				}
-//			}
-//		}
-//		BasicClassInfo[b_name] = arr
-//	}
-//	log.Debug("三大类加载完毕~", len(BasicClassInfo["工程"]), len(BasicClassInfo["货物"]), len(BasicClassInfo["服务"]))
-//}

+ 2 - 3
data_purchasing/src/bidmethod.go

@@ -42,7 +42,7 @@ func acquirePlistClassInfo(update *map[string]interface{}, tmp map[string]interf
 		itemname := qu.ObjToString(v["itemname"])
 		logInfo := map[string]interface{}{}
 		logInfo["itemname"] = itemname
-		if itemname != "" && utf8.RuneCountInString(itemname) <= 50 {
+		if itemname != "" && utf8.RuneCountInString(itemname) <= PurLength {
 			info := processPurNameClass(itemname, basic) //标的打分类
 			if len(info) > 0 {
 				class_code := qu.ObjToString(info["class_code"])
@@ -214,7 +214,6 @@ func similarPurClass(update *map[string]interface{}, tmp map[string]interface{})
 		return
 	}
 	basicArr := BasicClassNameInfo[basicClass]
-
 	if len(basicArr) > 0 {
 		p_list := IsMarkInterfaceMap(tmp["purchasinglist"])
 		codeArr := []string{}
@@ -223,7 +222,7 @@ func similarPurClass(update *map[string]interface{}, tmp map[string]interface{})
 			itemname := qu.ObjToString(v["itemname"])
 			logInfo := map[string]interface{}{}
 			logInfo["itemname"] = itemname
-			if itemname != "" && utf8.RuneCountInString(itemname) <= 50 {
+			if itemname != "" && utf8.RuneCountInString(itemname) <= PurLength {
 				textArr := cleanItemName(itemname)
 				if len(textArr) == 0 {
 					continue

+ 23 - 2
data_purchasing/src/main.go

@@ -30,7 +30,7 @@ func initMgo() {
 }
 
 func init() {
-	//IsLocal = true
+	IsLocal = true
 	initMgo()
 	initReadyInfo()
 }
@@ -39,13 +39,34 @@ func main() {
 	log.Debug("main...")
 	//准备代码表
 	//prparePurClassCode()
-	//补充映射表
 	//prepareReplenishInfo()
 	//prepareBasicInfo()
 
+	//prepareMedicalNameClass()
+
 	//标讯信息打分类
 	//BeaconInfoPurchasingClass()
+	//TestBeaconInfoPurchasingClass("5feede7ec2c0c99d52d6c13f")
+	//testEsQuery()
 
 	lock := make(chan bool)
 	<-lock
 }
+
+func test() {
+	//dataArr, _ := data_mgo.Find("111111", nil, nil, nil)
+	//for _, v := range dataArr {
+	//	code := qu.ObjToString(v["code"])
+	//	tmpid := BsonTOStringId(v["_id"])
+	//	update := map[string]interface{}{}
+	//	class_1, class_2, class_3, class_4, class_5 := relevanceEntireClassCode(code)
+	//	update["class_1"] = class_1
+	//	update["class_2"] = class_2
+	//	update["class_3"] = class_3
+	//	update["class_4"] = class_4
+	//	update["class_5"] = class_5
+	//	data_mgo.UpdateById("111111", tmpid, map[string]interface{}{
+	//		"$set": update,
+	//	})
+	//}
+}

+ 21 - 0
data_purchasing/src/mgo.go

@@ -245,6 +245,16 @@ 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
+}
 
 //删除by id
 func (m *MongodbSim) DeleteById(c, id string) int64 {
@@ -281,6 +291,17 @@ func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
 	return v
 }
 
+//findbystrid
+func (m *MongodbSim) FindByStrId(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": 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()

+ 75 - 2
data_purchasing/src/purclass.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	log "github.com/donnie4w/go-logger/logger"
 	qu "qfw/util"
 	"strings"
 	"unicode/utf8"
@@ -15,6 +16,9 @@ func processPurNameClass(name string, basic string) map[string]interface{} {
 	}
 	for _, text := range textArr {
 		//2、完全匹配~唯一解
+		if utf8.RuneCountInString(text) <= 1 {
+			continue
+		}
 		ab_name, ab_code := absoluteMatchingMethod(text)
 		if ab_name != "" && ab_code != "" {
 			update["matching"] = 1
@@ -168,8 +172,10 @@ func multiClassSelectionInfo(text string, basic string, codeArr []string, matchA
 	}
 
 	//比例选取大类
-	code := proportionSelection(codeArr)
+	code := proportionSelectionFirst(codeArr)
 	if code != "" {
+		//根据比例选择-最小级别代码
+		code = proportionSelectionSecond(code, codeArr)
 		return code
 	}
 	//后缀词是否为合理的后缀词
@@ -213,7 +219,7 @@ func isPostfixText(str_1 string, str_2 string) bool {
 }
 
 //比例选取
-func proportionSelection(codeArr []string) string {
+func proportionSelectionFirst(codeArr []string) string {
 	infos := map[string]int{}
 	for _, v := range codeArr {
 		code_1 := v[:2]
@@ -234,6 +240,42 @@ func proportionSelection(codeArr []string) string {
 	}
 	return class_code
 }
+func proportionSelectionSecond(code string, codeArr []string) string {
+	level_2, level_3, level_4, level_5 := []string{}, []string{}, []string{}, []string{}
+	for _, v := range codeArr {
+		if v == "" || v == code {
+			continue
+		}
+		if code == v[:2] {
+			switch len(v) {
+			case 4:
+				level_2 = append(level_2, v)
+			case 6:
+				level_3 = append(level_3, v)
+			case 8:
+				level_4 = append(level_4, v)
+			case 10:
+				level_5 = append(level_5, v)
+			default:
+				log.Debug("异常代码~", v)
+			}
+		}
+	}
+
+	if len(level_5) == 1 {
+		return level_5[0]
+	}
+	if len(level_4) == 1 {
+		return level_4[0]
+	}
+	if len(level_3) == 1 {
+		return level_3[0]
+	}
+	if len(level_2) == 1 {
+		return level_2[0]
+	}
+	return code
+}
 
 //根据三大类判处多选~冗余的选项
 func excludePartClassInfo(text string, basic string, codeArr []string) []string {
@@ -313,3 +355,34 @@ func relevanceEntireClassCode(class_code string) (string, string, string, string
 	class_5 := strings.Join(class_5_arr, "~")
 	return class_1, class_2, class_3, class_4, class_5
 }
+
+//关联五级代码组~特别需求
+func relevanceFiveClassCode(code string, update *map[string]interface{}) {
+	codeArr := strings.Split(code, "~")
+	arr1, arr2, arr3, arr4, arr5 := []string{}, []string{}, []string{}, []string{}, []string{}
+	for _, v := range codeArr {
+		if v == "" {
+			continue
+		}
+		l := utf8.RuneCountInString(v)
+		switch l {
+		case 2:
+			arr1 = append(arr1, v)
+		case 4:
+			arr2 = append(arr2, v)
+		case 6:
+			arr3 = append(arr3, v)
+		case 8:
+			arr4 = append(arr4, v)
+		case 10:
+			arr5 = append(arr5, v)
+		default:
+			log.Debug("异常~", v)
+		}
+	}
+	(*update)["class_1"] = strings.Join(arr1, "~")
+	(*update)["class_2"] = strings.Join(arr2, "~")
+	(*update)["class_3"] = strings.Join(arr3, "~")
+	(*update)["class_4"] = strings.Join(arr4, "~")
+	(*update)["class_5"] = strings.Join(arr5, "~")
+}

+ 49 - 3
data_purchasing/src/purcode.go

@@ -3,6 +3,7 @@ package main
 import (
 	log "github.com/donnie4w/go-logger/logger"
 	"github.com/tealeg/xlsx"
+	"go.mongodb.org/mongo-driver/bson"
 	qu "qfw/util"
 	"regexp"
 	"strings"
@@ -46,9 +47,9 @@ func prparePurClassCode() {
 			default:
 				log.Debug("异常~~~", str)
 			}
-			if code == "47" || code == "48" || code == "49" || code == "50" {
-				name = CleanTailReg.ReplaceAllString(name, "")
-			}
+			//if code == "47" || code == "48" || code == "49" || code == "50" {
+			//	name = CleanTailReg.ReplaceAllString(name, "")
+			//}
 			data_mgo.Save(InitialColl, map[string]interface{}{
 				"name":  name,
 				"code":  code,
@@ -59,6 +60,7 @@ func prparePurClassCode() {
 		}
 	}
 	log.Debug("is over ~ ", isok)
+
 }
 
 //补充数据表
@@ -218,3 +220,47 @@ func updateBasicCode(coll_name string, temp map[string]string) {
 	}
 	log.Debug("更新完毕~", coll_name)
 }
+
+//计算医疗数据
+func prepareMedicalNameClass() {
+	temp := map[string]string{}
+	ff, _ := xlsx.OpenFile("res/medical.xlsx")
+	for _, sheet := range ff.Sheets {
+		for _, row := range sheet.Rows {
+			var str []string
+			for _, cell := range row.Cells {
+				s := cell.String()
+				s = strings.ReplaceAll(s, " ", "")
+				s = strings.ReplaceAll(s, " ", "")
+				str = append(str, s)
+			}
+			class_1, class_2, class_3, class_code := str[0], str[1], str[2], str[3]
+			if class_1 == "" || class_2 == "" || class_3 == "" || class_code == "" {
+				log.Debug("异常~~~")
+			}
+			query := bson.M{
+				"product_class1": class_1,
+				"product_class2": class_2,
+				"product_class3": class_3,
+			}
+			dataArr, _ := data_mgo.Find("zktest_mysql_product_info", query, nil, bson.M{"product_name": 1})
+			if len(dataArr) > 0 {
+				for _, v := range dataArr {
+					product_name := qu.ObjToString(v["product_name"])
+					if product_name != "" {
+						if temp[product_name] == "" {
+							temp[product_name] = class_code
+						}
+					}
+				}
+			}
+		}
+	}
+	for k, v := range temp {
+		data_mgo.Save("111111", map[string]interface{}{
+			"name": k,
+			"code": v,
+		})
+	}
+	log.Debug("is over ", len(temp))
+}

BIN
data_purchasing/src/res/medical.xlsx


BIN
data_purchasing/src/res/replenish.xlsx


BIN
data_purchasing/src/res/similar.xlsx


BIN
data_purchasing/src/res/source.xlsx


+ 148 - 0
data_ylqx/src/dealer.go

@@ -0,0 +1,148 @@
+package main
+
+import (
+	log "github.com/donnie4w/go-logger/logger"
+	qu "qfw/util"
+	"strings"
+)
+
+//企业信息处理
+func exportDealerBaseInfo() {
+	//企业信息去重
+	dataArr := repeatNameQyxyInfo()
+	for index, tmp := range dataArr {
+		if index%10000 == 0 {
+			log.Debug("curent index ", index)
+		}
+		for k, v := range tmp {
+			infoArr, _ := Qyxy_Mgo.Find("qyxy_std", map[string]interface{}{
+				"company_name": k,
+			}, nil, map[string]interface{}{
+				"company_name":     1,
+				"company_area":     1,
+				"company_city":     1,
+				"company_district": 1,
+				"company_address":  1,
+				"capital":          1,
+			})
+			if len(infoArr) > 0 { //选取最优-企业信息
+				ind := getOneBaseCompany(infoArr)
+				info := infoArr[ind]
+				new_info := createDealerInfo(info, v)
+				Save_Mgo.Save("nmpa_company_dealer", new_info)
+			} else {
+				Save_Mgo.Save("nmpa_company_dealer_err", map[string]interface{}{
+					"dealer_name":    k,
+					"business_model": v,
+				})
+			}
+		}
+	}
+	log.Debug("经销商基本信息预处理~", len(dataArr))
+}
+
+//构建更新数据
+func createDealerInfo(tmp map[string]interface{}, business_model string) map[string]interface{} {
+	info := map[string]interface{}{}
+	info["company_id"] = qu.ObjToString(tmp["_id"])
+	info["dealer_name"] = qu.ObjToString(tmp["company_name"])
+	info["area"] = qu.ObjToString(tmp["company_area"])
+	info["city"] = qu.ObjToString(tmp["company_city"])
+	info["district"] = qu.ObjToString(tmp["company_district"])
+	info["business_model"] = qu.IntAll(business_model)
+	info["company_address"] = qu.ObjToString(tmp["company_address"])
+	capital, capital_code := qu.Float64All(tmp["capital"]), 1
+	if capital >= float64(0) && capital < float64(100) {
+		capital_code = 1
+	} else if capital >= float64(100) && capital < float64(500) {
+		capital_code = 2
+	} else if capital >= float64(500) && capital < float64(1000) {
+		capital_code = 3
+	} else {
+		capital_code = 4
+	}
+	info["capital"] = capital
+	info["capital_code"] = capital_code
+	return info
+}
+
+//获取最优企业
+func getOneBaseCompany(arr []map[string]interface{}) int {
+	index := 0
+	flag := 100
+	if len(arr) > 1 {
+		for k, tmp := range arr {
+			use_flag := qu.IntAll(tmp["use_flag"])
+			if use_flag == 0 {
+				index = k
+				break
+			} else {
+				if use_flag < flag {
+					flag = use_flag
+					index = k
+				}
+			}
+		}
+	}
+	return index
+}
+
+//重复企业-过滤
+func repeatNameQyxyInfo() []map[string]string {
+	sess := Sour_Mgo.GetMgoConn()
+	defer Sour_Mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	it := sess.DB(Sour_Mgo.DbName).C("nmpa_company_new").Find(&q).Select(map[string]interface{}{
+		"company":  1,
+		"classify": 1,
+		"reg_no":   1,
+	}).Iter()
+	temp := map[string]string{}
+	qyArr := []string{}
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("curent index ", total)
+		}
+		company := qu.ObjToString(tmp["company"])
+		classify := ""
+		if strings.Contains(qu.ObjToString(tmp["classify"]), "生产") {
+			classify = "生产"
+		} else if strings.Contains(qu.ObjToString(tmp["classify"]), "经营") {
+			classify = "经营"
+		} else {
+			log.Debug("类型异常~~~~~~")
+		}
+		if company != "" {
+			if temp[company] == "" {
+				temp[company] = classify
+				qyArr = append(qyArr, company)
+			} else {
+				pre_classify := temp[company]
+				if pre_classify != classify && classify != "" && !strings.Contains(pre_classify, "&&") {
+					temp[company] = pre_classify + "&&" + classify
+				}
+			}
+		}
+		break
+		tmp = make(map[string]interface{})
+	}
+	newArr := []map[string]string{}
+	for _, v := range qyArr {
+		tag := ""
+		if temp[v] == "生产" {
+			tag = "1"
+		} else if temp[v] == "经营" {
+			tag = "2"
+		} else if temp[v] == "" {
+			tag = "4"
+		} else {
+			tag = "3"
+		}
+		newArr = append(newArr, map[string]string{
+			v: tag,
+		})
+	}
+
+	log.Debug("企业去重~", total, len(newArr))
+	return newArr
+}

+ 53 - 0
data_ylqx/src/dealer_register.go

@@ -0,0 +1,53 @@
+package main
+
+import (
+	"github.com/go-xweb/log"
+	"go.mongodb.org/mongo-driver/bson"
+	qu "qfw/util"
+	"strings"
+)
+
+//导出经销商注册备案信息
+func exportDealerRegisterInfo() {
+	sess := Save_Mgo.GetMgoConn()
+	defer Save_Mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	it := sess.DB(Save_Mgo.DbName).C("nmpa_company_dealer").Find(&q).Select(map[string]interface{}{
+		"dealer_name":    1,
+		"business_model": 1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("curent index ", total)
+		}
+		dealer_name := qu.ObjToString(tmp["dealer_name"])
+		business_model := qu.IntAll(tmp["business_model"])
+		createDealerRegisterInfo(dealer_name, business_model)
+		tmp = make(map[string]interface{})
+	}
+}
+
+//构建注册备案基本信息
+func createDealerRegisterInfo(dealer_name string, business_model int) {
+	infoArr, _ := Sour_Mgo.Find("nmpa_company_new", bson.M{"company": dealer_name}, nil, nil)
+	for _, v := range infoArr {
+		info := map[string]interface{}{}
+		info["company_name"] = dealer_name
+		info["regnum"] = qu.ObjToString(v["reg_no"])
+		if strings.Contains(qu.ObjToString(v["classify"]), "许可") {
+			info["type"] = 1
+		} else if strings.Contains(qu.ObjToString(v["classify"]), "备案") {
+			info["type"] = 2
+		}
+		info["address"] = qu.ObjToString(v["address"])
+		info["scope"] = qu.ObjToString(v["product_range"])
+		info["business_type"] = business_model
+		info["approve_depart"] = qu.ObjToString(v["fzbm"])
+		info["validity_date"] = qu.ObjToString(v["yxqx"])
+		info["approve_date"] = qu.ObjToString(v["fzrq"])
+		info["type_address"] = qu.ObjToString(v["product_address"])
+		info["responsible_person"] = qu.ObjToString(v["responsible_persons"])
+		info["legal_person"] = qu.ObjToString(v["legal_person"])
+		//待保存
+	}
+}

+ 118 - 0
data_ylqx/src/init.go

@@ -0,0 +1,118 @@
+package main
+
+var (
+	Sour_Mgo, Save_Mgo                *MongodbSim
+	Spi_Mgo, Qyxy_Mgo                 *MongodbSim
+	MysqlMedicalTool, MysqlGlobalTool *Mysql
+	IsLocal                           bool
+	TimeLayout                        = "2006-01-02 15:04:05"
+	TimeTmeplate                      = "2006-01-02"
+)
+
+func initClass() {
+	initMgo()
+	initMysql()
+}
+
+//初始化mgo
+func initMgo() {
+	if IsLocal {
+		Sour_Mgo = &MongodbSim{
+			MongodbAddr: "127.0.0.1:27017",
+			DbName:      "medical",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		Sour_Mgo.InitPool()
+
+		Save_Mgo = &MongodbSim{
+			MongodbAddr: "127.0.0.1:27017",
+			DbName:      "medical",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		Save_Mgo.InitPool()
+
+		Spi_Mgo = &MongodbSim{
+			MongodbAddr: "127.0.0.1:27017",
+			DbName:      "medical",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		Spi_Mgo.InitPool()
+
+		Qyxy_Mgo = &MongodbSim{
+			MongodbAddr: "127.0.0.1:27017",
+			DbName:      "medical",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		Qyxy_Mgo.InitPool()
+	} else {
+		Sour_Mgo = &MongodbSim{
+			MongodbAddr: "172.17.4.87:27080",
+			DbName:      "py_theme",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		Sour_Mgo.InitPool()
+
+		Save_Mgo = &MongodbSim{
+			MongodbAddr: "172.17.4.87:27080",
+			DbName:      "zk_sqldata",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		Save_Mgo.InitPool()
+
+		Spi_Mgo = &MongodbSim{
+			MongodbAddr: "172.17.4.181:27001",
+			DbName:      "mixdata",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		Spi_Mgo.InitPool()
+
+		Qyxy_Mgo = &MongodbSim{
+			MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
+			DbName:      "mixdata",
+			Size:        10,
+			UserName:    "zhengkun",
+			Password:    "zk@123123",
+		}
+		Qyxy_Mgo.InitPool()
+	}
+}
+
+func initMysql() {
+	username, password := "zhengkun", "Zk#20220824"
+	address := "127.0.0.1:15001"
+	if !IsLocal {
+		username = "zhengkun"
+		password = "Zk#20220824"
+		address = "172.17.4.242:4000"
+	}
+	MysqlMedicalTool = &Mysql{
+		Address:  address,
+		UserName: username,
+		PassWord: password,
+		DBName:   "medical_field_data",
+	}
+	MysqlMedicalTool.Init()
+
+	MysqlGlobalTool = &Mysql{
+		Address:  address,
+		UserName: username,
+		PassWord: password,
+		DBName:   "global_common_data",
+	}
+	MysqlGlobalTool.Init()
+
+}

+ 22 - 0
data_ylqx/src/main.go

@@ -0,0 +1,22 @@
+package main
+
+func init() {
+	IsLocal = true
+	initClass()
+}
+
+func main() {
+	//拆分合并产品与企业表
+	//splitMergeMedicalInfo("nmpa_ylqx_2022")
+	//splitMergeMedicalInfo("nmpa_ylqx_2023")
+
+	exportDealerBaseInfo()
+	//exportDealerRegisterInfo()
+	//exportProductBaseInfo()
+
+	//确认分类
+	//confirmYlqxInfoClass()
+
+	lock := make(chan bool)
+	<-lock
+}

+ 348 - 0
data_ylqx/src/mgo.go

@@ -0,0 +1,348 @@
+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
+}
+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
+}
+
+//findbystrid
+func (m *MongodbSim) FindByStrId(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": 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()
+}

+ 505 - 0
data_ylqx/src/mysql.go

@@ -0,0 +1,505 @@
+package main
+
+import (
+	"bytes"
+	"database/sql"
+	"fmt"
+	"log"
+	"reflect"
+	"strings"
+	"time"
+
+	_ "github.com/go-sql-driver/mysql"
+)
+
+type Mysql struct {
+	Address      string  //数据库地址:端口
+	UserName     string  //用户名
+	PassWord     string  //密码
+	DBName       string  //数据库名
+	DB           *sql.DB //数据库连接池对象
+	MaxOpenConns int     //用于设置最大打开的连接数,默认值为0表示不限制。
+	MaxIdleConns int     //用于设置闲置的连接数。
+}
+
+func (m *Mysql) Init() {
+	if m.MaxOpenConns <= 0 {
+		m.MaxOpenConns = 20
+	}
+	if m.MaxIdleConns <= 0 {
+		m.MaxIdleConns = 20
+	}
+	var err error //utf8mb4
+	m.DB, err = sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", m.UserName, m.PassWord, m.Address, m.DBName))
+	if err != nil {
+		log.Println(err)
+		return
+	}
+	m.DB.SetMaxOpenConns(m.MaxOpenConns)
+	m.DB.SetMaxIdleConns(m.MaxIdleConns)
+	m.DB.SetConnMaxLifetime(time.Minute * 3)
+	err = m.DB.Ping()
+	if err != nil {
+		log.Println(err)
+	}
+}
+
+//新增
+func (m *Mysql) Insert(tableName string, data map[string]interface{}) int64 {
+	return m.InsertByTx(nil, tableName, data)
+}
+
+//带有事务的新增
+func (m *Mysql) InsertByTx(tx *sql.Tx, tableName string, data map[string]interface{}) int64 {
+	fields := []string{}
+	values := []interface{}{}
+	placeholders := []string{}
+	if tableName == "dataexport_order" {
+		if _, ok := data["user_nickname"]; ok {
+			data["user_nickname"] = ""
+		}
+	}
+	for k, v := range data {
+		fields = append(fields, k)
+		values = append(values, v)
+		placeholders = append(placeholders, "?")
+	}
+	q := fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s)", tableName, strings.Join(fields, ","), strings.Join(placeholders, ","))
+	//log.Println("mysql", q, values)
+	return m.InsertBySqlByTx(tx, q, values...)
+}
+
+//sql语句新增
+func (m *Mysql) InsertBySql(q string, args ...interface{}) int64 {
+	return m.InsertBySqlByTx(nil, q, args...)
+}
+
+//带有事务的sql语句新增
+func (m *Mysql) InsertBySqlByTx(tx *sql.Tx, q string, args ...interface{}) int64 {
+	result, _ := m.ExecBySqlByTx(tx, q, args...)
+	if result == nil {
+		return -1
+	}
+	id, err := result.LastInsertId()
+	if err != nil {
+		log.Println(err)
+		return -1
+	}
+	return id
+}
+
+//批量新增
+func (m *Mysql) InsertIgnoreBatch(tableName string, fields []string, values []interface{}) (int64, int64) {
+	return m.InsertIgnoreBatchByTx(nil, tableName, fields, values)
+}
+
+//带事务的批量新增
+func (m *Mysql) InsertIgnoreBatchByTx(tx *sql.Tx, tableName string, fields []string, values []interface{}) (int64, int64) {
+	return m.insertOrReplaceBatchByTx(tx, "INSERT", "IGNORE", tableName, fields, values)
+}
+
+//批量新增
+func (m *Mysql) InsertBatch(tableName string, fields []string, values []interface{}) (int64, int64) {
+	return m.InsertBatchByTx(nil, tableName, fields, values)
+}
+
+//带事务的批量新增
+func (m *Mysql) InsertBatchByTx(tx *sql.Tx, tableName string, fields []string, values []interface{}) (int64, int64) {
+	return m.insertOrReplaceBatchByTx(tx, "INSERT", "", tableName, fields, values)
+}
+
+//批量更新
+func (m *Mysql) ReplaceBatch(tableName string, fields []string, values []interface{}) (int64, int64) {
+	return m.ReplaceBatchByTx(nil, tableName, fields, values)
+}
+
+//带事务的批量更新
+func (m *Mysql) ReplaceBatchByTx(tx *sql.Tx, tableName string, fields []string, values []interface{}) (int64, int64) {
+	return m.insertOrReplaceBatchByTx(tx, "REPLACE", "", tableName, fields, values)
+}
+
+func (m *Mysql) insertOrReplaceBatchByTx(tx *sql.Tx, tp string, afterInsert, tableName string, fields []string, values []interface{}) (int64, int64) {
+	placeholders := []string{}
+	for range fields {
+		placeholders = append(placeholders, "?")
+	}
+	placeholder := strings.Join(placeholders, ",")
+	array := []string{}
+	for i := 0; i < len(values)/len(fields); i++ {
+		array = append(array, fmt.Sprintf("(%s)", placeholder))
+	}
+	q := fmt.Sprintf("%s %s INTO %s (%s) VALUES %s", tp, afterInsert, tableName, strings.Join(fields, ","), strings.Join(array, ","))
+	result, _ := m.ExecBySqlByTx(tx, q, values...)
+	if result == nil {
+		return -1, -1
+	}
+	v1, e1 := result.RowsAffected()
+	if e1 != nil {
+		log.Println(e1)
+		return -1, -1
+	}
+	v2, e2 := result.LastInsertId()
+	if e2 != nil {
+		log.Println(e2)
+		return -1, -1
+	}
+	return v1, v2
+}
+
+//sql语句执行
+func (m *Mysql) ExecBySql(q string, args ...interface{}) (sql.Result, error) {
+	return m.ExecBySqlByTx(nil, q, args...)
+}
+
+//sql语句执行,带有事务
+func (m *Mysql) ExecBySqlByTx(tx *sql.Tx, q string, args ...interface{}) (sql.Result, error) {
+	var stmtIns *sql.Stmt
+	var err error
+	if tx == nil {
+		stmtIns, err = m.DB.Prepare(q)
+	} else {
+		stmtIns, err = tx.Prepare(q)
+	}
+	if err != nil {
+		log.Println(err)
+		return nil, err
+	}
+	defer stmtIns.Close()
+	result, err := stmtIns.Exec(args...)
+	if err != nil {
+		//log.Println(args, err)
+		log.Println(err)
+		return nil, err
+	}
+	return result, nil
+}
+
+/*不等于 map[string]string{"ne":"1"}
+ *不等于多个 map[string]string{"notin":[]interface{}{1,2}}
+ *字段为空 map[string]string{"name":"$isNull"}
+ *字段不为空 map[string]string{"name":"$isNotNull"}
+ */
+func (m *Mysql) Find(tableName string, query map[string]interface{}, fields, order string, start, pageSize int) *[]map[string]interface{} {
+	fs := []string{}
+	vs := []interface{}{}
+	for k, v := range query {
+		rt := reflect.TypeOf(v)
+		rv := reflect.ValueOf(v)
+		if rt.Kind() == reflect.Map {
+			for _, rv_k := range rv.MapKeys() {
+				if rv_k.String() == "ne" {
+					fs = append(fs, fmt.Sprintf("%s!=?", k))
+					vs = append(vs, rv.MapIndex(rv_k).Interface())
+				}
+				if rv_k.String() == "notin" {
+					if len(rv.MapIndex(rv_k).Interface().([]interface{})) > 0 {
+						for _, v := range rv.MapIndex(rv_k).Interface().([]interface{}) {
+							fs = append(fs, fmt.Sprintf("%s!=?", k))
+							vs = append(vs, v)
+						}
+					}
+				}
+				if rv_k.String() == "in" {
+					if len(rv.MapIndex(rv_k).Interface().([]interface{})) > 0 {
+						_fs := fmt.Sprintf("%s in (?", k)
+						for k, v := range rv.MapIndex(rv_k).Interface().([]interface{}) {
+							if k > 0 {
+								_fs += ",?"
+							}
+							vs = append(vs, v)
+						}
+						_fs += ")"
+						fs = append(fs, _fs)
+					}
+				}
+			}
+		} else {
+			if v == "$isNull" {
+				fs = append(fs, fmt.Sprintf("%s is null", k))
+			} else if v == "$isNotNull" {
+				fs = append(fs, fmt.Sprintf("%s is not null", k))
+			} else {
+				fs = append(fs, fmt.Sprintf("%s=?", k))
+				vs = append(vs, v)
+			}
+		}
+	}
+	var buffer bytes.Buffer
+	buffer.WriteString("select ")
+	if fields == "" {
+		buffer.WriteString("*")
+	} else {
+		buffer.WriteString(fields)
+	}
+	buffer.WriteString(" from ")
+	buffer.WriteString(tableName)
+	if len(fs) > 0 {
+		buffer.WriteString(" where ")
+		buffer.WriteString(strings.Join(fs, " and "))
+	}
+	if order != "" {
+		buffer.WriteString(" order by ")
+		buffer.WriteString(order)
+	}
+	if start > -1 && pageSize > 0 {
+		buffer.WriteString(" limit ")
+		buffer.WriteString(fmt.Sprint(start))
+		buffer.WriteString(",")
+		buffer.WriteString(fmt.Sprint(pageSize))
+	}
+	q := buffer.String()
+	//log.Println(q, vs)
+	return m.SelectBySql(q, vs...)
+}
+
+//sql语句查询
+func (m *Mysql) SelectBySql(q string, args ...interface{}) *[]map[string]interface{} {
+	return m.SelectBySqlByTx(nil, q, args...)
+}
+func (m *Mysql) SelectBySqlByTx(tx *sql.Tx, q string, args ...interface{}) *[]map[string]interface{} {
+	return m.Select(0, nil, tx, q, args...)
+}
+func (m *Mysql) Select(bath int, f func(l *[]map[string]interface{}), tx *sql.Tx, q string, args ...interface{}) *[]map[string]interface{} {
+	var stmtOut *sql.Stmt
+	var err error
+	if tx == nil {
+		stmtOut, err = m.DB.Prepare(q)
+	} else {
+		stmtOut, err = tx.Prepare(q)
+	}
+	if err != nil {
+		log.Println(err)
+		return nil
+	}
+	defer stmtOut.Close()
+	rows, err := stmtOut.Query(args...)
+	if err != nil {
+		log.Println(err)
+		return nil
+	}
+	if rows != nil {
+		defer rows.Close()
+	}
+	columns, err := rows.Columns()
+	if err != nil {
+		log.Println(err)
+		return nil
+	}
+	list := []map[string]interface{}{}
+	for rows.Next() {
+		scanArgs := make([]interface{}, len(columns))
+		values := make([]interface{}, len(columns))
+		ret := make(map[string]interface{})
+		for k, _ := range values {
+			scanArgs[k] = &values[k]
+		}
+		err = rows.Scan(scanArgs...)
+		if err != nil {
+			log.Println(err)
+			break
+		}
+		for i, col := range values {
+			if v, ok := col.([]uint8); ok {
+				ret[columns[i]] = string(v)
+			} else {
+				ret[columns[i]] = col
+			}
+		}
+		list = append(list, ret)
+		if bath > 0 && len(list) == bath {
+			f(&list)
+			list = []map[string]interface{}{}
+		}
+	}
+	if bath > 0 && len(list) > 0 {
+		f(&list)
+		list = []map[string]interface{}{}
+	}
+	return &list
+}
+func (m *Mysql) SelectByBath(bath int, f func(l *[]map[string]interface{}), q string, args ...interface{}) {
+	m.SelectByBathByTx(bath, f, nil, q, args...)
+}
+func (m *Mysql) SelectByBathByTx(bath int, f func(l *[]map[string]interface{}), tx *sql.Tx, q string, args ...interface{}) {
+	m.Select(bath, f, tx, q, args...)
+}
+func (m *Mysql) FindOne(tableName string, query map[string]interface{}, fields, order string) *map[string]interface{} {
+	list := m.Find(tableName, query, fields, order, 0, 1)
+	if list != nil && len(*list) == 1 {
+		temp := (*list)[0]
+		return &temp
+	}
+	return nil
+}
+
+//修改
+func (m *Mysql) Update(tableName string, query, update map[string]interface{}) bool {
+	return m.UpdateByTx(nil, tableName, query, update)
+}
+
+//带事务的修改
+func (m *Mysql) UpdateByTx(tx *sql.Tx, tableName string, query, update map[string]interface{}) bool {
+	q_fs := []string{}
+	u_fs := []string{}
+	values := []interface{}{}
+	for k, v := range update {
+		q_fs = append(q_fs, fmt.Sprintf("%s=?", k))
+		values = append(values, v)
+	}
+	for k, v := range query {
+		u_fs = append(u_fs, fmt.Sprintf("%s=?", k))
+		values = append(values, v)
+	}
+	q := fmt.Sprintf("update %s set %s where %s", tableName, strings.Join(q_fs, ","), strings.Join(u_fs, " and "))
+	//log.Println(q, values)
+	return m.UpdateOrDeleteBySqlByTx(tx, q, values...) >= 0
+}
+
+//删除
+func (m *Mysql) Delete(tableName string, query map[string]interface{}) bool {
+	return m.DeleteByTx(nil, tableName, query)
+}
+func (m *Mysql) DeleteByTx(tx *sql.Tx, tableName string, query map[string]interface{}) bool {
+	fields := []string{}
+	values := []interface{}{}
+	for k, v := range query {
+		fields = append(fields, fmt.Sprintf("%s=?", k))
+		values = append(values, v)
+	}
+	q := fmt.Sprintf("delete from %s where %s", tableName, strings.Join(fields, " and "))
+	log.Println(q, values)
+	return m.UpdateOrDeleteBySqlByTx(tx, q, values...) > 0
+}
+
+//修改或删除
+func (m *Mysql) UpdateOrDeleteBySql(q string, args ...interface{}) int64 {
+	return m.UpdateOrDeleteBySqlByTx(nil, q, args...)
+}
+
+//带事务的修改或删除
+func (m *Mysql) UpdateOrDeleteBySqlByTx(tx *sql.Tx, q string, args ...interface{}) int64 {
+	result, err := m.ExecBySqlByTx(tx, q, args...)
+	if err != nil {
+		log.Println(err)
+		return -1
+	}
+	count, err := result.RowsAffected()
+	if err != nil {
+		log.Println(err)
+		return -1
+	}
+	return count
+}
+
+//总数
+func (m *Mysql) Count(tableName string, query map[string]interface{}) int64 {
+	fields := []string{}
+	values := []interface{}{}
+	for k, v := range query {
+		rt := reflect.TypeOf(v)
+		rv := reflect.ValueOf(v)
+		if rt.Kind() == reflect.Map {
+			for _, rv_k := range rv.MapKeys() {
+				if rv_k.String() == "ne" {
+					fields = append(fields, fmt.Sprintf("%s!=?", k))
+					values = append(values, rv.MapIndex(rv_k).Interface())
+				}
+				if rv_k.String() == "notin" {
+					if len(rv.MapIndex(rv_k).Interface().([]interface{})) > 0 {
+						for _, v := range rv.MapIndex(rv_k).Interface().([]interface{}) {
+							fields = append(fields, fmt.Sprintf("%s!=?", k))
+							values = append(values, v)
+						}
+					}
+				}
+				if rv_k.String() == "in" {
+					if len(rv.MapIndex(rv_k).Interface().([]interface{})) > 0 {
+						_fs := fmt.Sprintf("%s in (?", k)
+						for k, v := range rv.MapIndex(rv_k).Interface().([]interface{}) {
+							if k > 0 {
+								_fs += ",?"
+							}
+							values = append(values, v)
+						}
+						_fs += ")"
+						fields = append(fields, _fs)
+					}
+				}
+			}
+		} else if v == "$isNull" {
+			fields = append(fields, fmt.Sprintf("%s is null", k))
+		} else if v == "$isNotNull" {
+			fields = append(fields, fmt.Sprintf("%s is not null", k))
+		} else {
+			fields = append(fields, fmt.Sprintf("%s=?", k))
+			values = append(values, v)
+		}
+	}
+	q := fmt.Sprintf("select count(1) as count from %s", tableName)
+	if len(query) > 0 {
+		q += fmt.Sprintf(" where %s", strings.Join(fields, " and "))
+	}
+	log.Println(q, values)
+	return m.CountBySql(q, values...)
+}
+func (m *Mysql) CountBySql(q string, args ...interface{}) int64 {
+	stmtIns, err := m.DB.Prepare(q)
+	if err != nil {
+		log.Println(err)
+		return -1
+	}
+	defer stmtIns.Close()
+
+	rows, err := stmtIns.Query(args...)
+	if err != nil {
+		log.Println(err)
+		return -1
+	}
+	if rows != nil {
+		defer rows.Close()
+	}
+	var count int64 = -1
+	if rows.Next() {
+		err = rows.Scan(&count)
+		if err != nil {
+			log.Println(err)
+		}
+	}
+	return count
+}
+
+//执行事务
+func (m *Mysql) ExecTx(msg string, f func(tx *sql.Tx) bool) bool {
+	tx, err := m.DB.Begin()
+	if err != nil {
+		log.Println(msg, "获取事务错误", err)
+	} else {
+		if f(tx) {
+			if err := tx.Commit(); err != nil {
+				log.Println(msg, "提交事务错误", err)
+			} else {
+				return true
+			}
+		} else {
+			if err := tx.Rollback(); err != nil {
+				log.Println(msg, "事务回滚错误", err)
+			}
+		}
+	}
+	return false
+}
+
+/*************方法命名不规范,上面有替代方法*************/
+func (m *Mysql) Query(query string, args ...interface{}) *[]map[string]interface{} {
+	return m.SelectBySql(query, args...)
+}
+
+func (m *Mysql) QueryCount(query string, args ...interface{}) (count int) {
+	count = -1
+	if !strings.Contains(strings.ToLower(query), "count(*)") {
+		fmt.Println("QueryCount need query like < select count(*) from ..... >")
+		return
+	}
+	count = int(m.CountBySql(query, args...))
+	return
+}

+ 136 - 0
data_ylqx/src/product.go

@@ -0,0 +1,136 @@
+package main
+
+import (
+	log "github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson"
+	qu "qfw/util"
+)
+
+//导出产品信息相关
+func exportProductBaseInfo() {
+	sess := Save_Mgo.GetMgoConn()
+	defer Save_Mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	it := sess.DB(Save_Mgo.DbName).C("nmpa_company_dealer").Find(&q).Select(map[string]interface{}{
+		"dealer_name": 1,
+		"company_id":  1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("curent index ", total)
+		}
+		createProductBaseInfo(tmp)
+		tmp = make(map[string]interface{})
+	}
+}
+
+func createProductBaseInfo(dealerInfo map[string]interface{}) {
+	dealer_name := qu.ObjToString(dealerInfo["dealer_name"])
+	infoArr, _ := Sour_Mgo.Find("nmpa_company_new", bson.M{"reg_company": dealer_name}, nil, nil)
+	for _, v := range infoArr {
+		info := dealWithProductInfo(v, dealerInfo)
+		if info != nil {
+
+		}
+	}
+}
+
+//信息处理
+func dealWithProductInfo(tmp map[string]interface{}, dealerInfo map[string]interface{}) map[string]interface{} {
+	//info := map[string]interface{}{}
+	//info["company_id"] = qu.ObjToString(dealerInfo["company_id"])
+	//info["company_name"] = qu.ObjToString(dealerInfo["dealer_name"])
+	//info["company_address"] = qu.ObjToString(dealerInfo["company_address"])
+	//info["regno"] = qu.ObjToString(tmp["reg_no"])
+	//if strings.Contains(qu.ObjToString(tmp["classify"]), "进口") ||
+	//	strings.Contains(qu.ObjToString(tmp["reg_no"]), "国") {
+	//	info["make_country"] = "1"
+	//} else {
+	//	info["make_country"] = ""
+	//}
+	//info["agent_name"] = qu.ObjToString(tmp["agent_name"])
+	//info["agent_address"] = qu.ObjToString(tmp["agent_address"])
+	//info["brand"] = ""
+	//info["model"] = qu.ObjToString(tmp["model"])
+	//
+	//info["product_descrip"] = qu.ObjToString(tmp["product_depict"])
+	//info["use_scope "] = qu.ObjToString(tmp["application"])
+	//info["storage_conditions"] = qu.ObjToString(tmp["conditions_use"])
+	//data["approve_depart"] = qu.ObjToString(tmp["badw"])
+	//
+	//main_part := qu.ObjToString(tmp["main_component"])
+	//changes := qu.ObjToString(tmp["changes"])
+	//make_adress := qu.ObjToString(tmp["product_address"])
+	//remark := qu.ObjToString(tmp["remark"])
+	//if utf8.RuneCountInString(main_part) > 2000 {
+	//	main_part = ""
+	//}
+	//if utf8.RuneCountInString(changes) > 2000 {
+	//	changes = ""
+	//}
+	//if utf8.RuneCountInString(make_adress) > 800 {
+	//	make_adress = ""
+	//}
+	//if utf8.RuneCountInString(remark) > 800 {
+	//	remark = ""
+	//}
+	//data["main_part"] = main_part
+	//data["changes"] = changes
+	//data["make_adress"] = make_adress
+	//data["remark"] = remark
+	//
+	//type_str := qu.ObjToString(tmp["type"])
+	//approve_date, validity_date := "", ""
+	//validity_date = qu.ObjToString(tmp["yxqz"])
+	//if type_str == "注册" {
+	//	data["regist_type"] = "1"
+	//	approve_date = qu.ObjToString(tmp["pzrq"])
+	//} else if type_str == "备案" {
+	//	data["regist_type"] = "2"
+	//	approve_date = qu.ObjToString(tmp["barq"])
+	//} else {
+	//	data["regist_type"] = ""
+	//}
+	////处理-日期-格式-多变
+	//if approve_date != "" {
+	//	approve_date_new := timeStandata(approve_date)
+	//	if approve_date_new != "" {
+	//		data["approve_date"] = approve_date_new
+	//	}
+	//}
+	//if validity_date != "" {
+	//	validity_date_new := timeStandata(validity_date)
+	//	if validity_date_new != "" {
+	//		data["validity_date"] = validity_date_new
+	//	}
+	//}
+	//data["source_channel"] = qu.ObjToString(tmp["jy_class"])
+	//class := qu.ObjToString(tmp["class"])
+	//if class == "/" {
+	//	class = ""
+	//}
+	//data["manage_type"] = class
+	//product_name := qu.ObjToString(tmp["product_name"])
+	//data["product_name"] = product_name
+	//product_class_1 := qu.ObjToString(tmp["product_class"])
+	//product_class_2 := qu.ObjToString(tmp["product_class_1"])
+	//product_class_3 := qu.ObjToString(tmp["product_class_2"])
+	//key_4 := "四级_" + product_name
+	//code_4 := proclass_name_dict[key_4]
+	//if code_4 != "" {
+	//	data["product_code"] = code_4
+	//	data["product_class1"] = proclass_code_dict[code_4[:2]]
+	//	data["product_class2"] = proclass_code_dict[code_4[:4]]
+	//	data["product_class3"] = proclass_code_dict[code_4[:8]]
+	//	data["product_class4"] = product_name
+	//} else {
+	//	pro_key := fmt.Sprintf("%s_%s_%s", product_class_1, product_class_2, product_class_3)
+	//	code := proclass_name_dict[pro_key]
+	//	data["product_code"] = code
+	//	data["product_class1"] = product_class_1
+	//	data["product_class2"] = product_class_2
+	//	data["product_class3"] = product_class_3
+	//	data["product_class4"] = ""
+	//}
+	return nil
+}

+ 255 - 0
data_ylqx/src/remarks.go

@@ -0,0 +1,255 @@
+package main
+
+import (
+	log "github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson"
+	qu "qfw/util"
+	"regexp"
+	"strings"
+	"time"
+)
+
+var (
+	codeRelation = map[string]string{
+		"06": "医用成像器械",
+		"01": "有源手术器械",
+		"02": "无源手术器械",
+		"14": "注输、护理和防护器械",
+		"16": "眼科器械",
+		"03": "神经和心血管手术器械",
+		"12": "有源植入器械",
+		"40": "体外诊断试剂",
+		"13": "无源植入器械",
+		"18": "妇产科、辅助生殖和避孕器械",
+		"17": "口腔科器械",
+		"22": "临床检验器械",
+		"07": "医用诊察和监护器械",
+		"04": "骨科手术器械",
+		"20": "中医器械",
+		"09": "物理治疗器械",
+		"08": "呼吸、麻醉和急救器械",
+		"19": "医用康复器械",
+		"21": "医用软件",
+		"10": "输血、透析和体外循环器械",
+		"11": "医疗器械消毒灭菌器械",
+		"15": "患者承载器械",
+		"05": "放射治疗器械",
+		"57": "医疗器械消毒灭菌器械",
+		"68": "体外诊断试剂",
+		"27": "中医器械",
+		"26": "物理治疗器械",
+		"46": "骨科手术器械",
+	}
+	productTemp  = map[string]string{}
+	companyTemp  = map[string]string{}
+	YlqxCodeName = map[string]string{}
+	YlqxNameCode = map[string]string{}
+
+	rangeReg1 = regexp.MustCompile("(\\d{2}|\\d{4})-(\\d{2}|\\d{1})([\\s -::]+)?([\u4e00-\u9fa5()、()/\\s ]+)")
+	rangeReg2 = regexp.MustCompile("\\d{2}([\\s -::]+)?([\u4e00-\u9fa5()、()/\\s ]+)")
+
+	rangeClean1 = regexp.MustCompile("[\\s ]+")
+	rangeClean2 = regexp.MustCompile("(生产范围).*")
+)
+
+func confirmYlqxInfoClass() {
+	loadYlqxInfo()
+	//confirmFirst()
+	//confirmSecond()
+	confirmThird()
+}
+
+//加载医疗器械代码
+func loadYlqxInfo() {
+	ylqxs := *MysqlMedicalTool.Find("code_productclass", nil, "", "", -1, -1)
+	for _, v := range ylqxs {
+		name := qu.ObjToString(v["name"])
+		code := qu.ObjToString(v["code"])
+		YlqxCodeName[code] = name
+		YlqxNameCode[name] = code
+	}
+	log.Debug("产品数量~", len(YlqxCodeName))
+}
+
+//医疗分类打标记
+func confirmFirst() {
+	isok := 0
+	dataArr, _ := Sour_Mgo.Find("nmpa_product_new", nil, nil, bson.M{"product_name": 1})
+	for _, v := range dataArr {
+		product_class_1 := qu.ObjToString(v["product_class_1"])
+		if product_class_1 != "" {
+			continue
+		}
+		tmpid := BsonTOStringId(v["_id"])
+		product_name := qu.ObjToString(v["product_name"])
+		if code := YlqxNameCode[product_name]; code != "" {
+			isok++
+			update := calculationYlqxCode(code)
+			Sour_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
+				"$set": update,
+			})
+		}
+	}
+	log.Debug("is over ... ", isok)
+	time.Sleep(time.Second * 2)
+}
+func calculationYlqxCode(yl_code string) map[string]interface{} {
+	update := map[string]interface{}{}
+	if len(yl_code) == 2 {
+		update["product_class_1"] = YlqxCodeName[yl_code]
+	} else if len(yl_code) == 4 {
+		update["product_class_1"] = YlqxCodeName[yl_code[:2]]
+		update["product_class_2"] = YlqxCodeName[yl_code]
+	} else if len(yl_code) == 7 {
+		update["product_class_1"] = YlqxCodeName[yl_code[:2]]
+		update["product_class_2"] = YlqxCodeName[yl_code[:4]]
+		update["product_class_3"] = YlqxCodeName[yl_code]
+	} else if len(yl_code) == 11 {
+		update["product_class_1"] = YlqxCodeName[yl_code[:2]]
+		update["product_class_2"] = YlqxCodeName[yl_code[:4]]
+		update["product_class_3"] = YlqxCodeName[yl_code[:7]]
+		update["product_class_4"] = YlqxCodeName[yl_code]
+	} else {
+
+	}
+	return update
+}
+func confirmSecond() {
+	codeReg := regexp.MustCompile("20\\d{3}(\\d{2})")
+	isok := 0
+	dataArr, _ := Sour_Mgo.Find("nmpa_product_new", nil, nil, bson.M{"reg_no": 1, "classify": 1})
+	for _, v := range dataArr {
+		tmpid := BsonTOStringId(v["_id"])
+		reg_no := qu.ObjToString(v["reg_no"])
+		classify := qu.ObjToString(v["classify"])
+		if strings.Contains(classify, "注册") {
+			code_str := codeReg.FindString(reg_no)
+			if code_str != "" {
+				code := codeReg.ReplaceAllString(code_str, "${1}")
+				name := codeRelation[code]
+				if name != "" {
+					isok++
+					Sour_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
+						"$set": bson.M{"product_class_1": name},
+					})
+				}
+			}
+		}
+	}
+	log.Debug("is over ... ", isok)
+	time.Sleep(time.Second * 2)
+}
+func confirmThird() {
+	isok := 0
+	dataArr, _ := Sour_Mgo.Find("nmpa_product_new", nil, nil, bson.M{
+		"reg_company":     1,
+		"product_name":    1,
+		"product_class_1": 1,
+		"product_class_2": 1,
+	})
+	for _, v := range dataArr {
+		product_name := qu.ObjToString(v["product_name"])
+		reg_company := qu.ObjToString(v["reg_company"])
+		product_class_1 := qu.ObjToString(v["product_class_1"])
+		product_class_2 := qu.ObjToString(v["product_class_2"])
+		if product_class_2 != "" {
+			continue
+		}
+		infos := calculationYlqxRange(reg_company, product_class_1)
+		isTure := 0
+		if len(infos) == 1 {
+			isTure = 1
+		}
+		if len(infos) > 0 {
+			isok++
+			Sour_Mgo.Save("nmpa_product_ylqx_log", map[string]interface{}{
+				"product_name":    product_name,
+				"product_class_1": product_class_1,
+				"log":             infos,
+				"isTure":          isTure,
+			})
+		}
+	}
+	log.Debug("is over ... ", isok)
+	time.Sleep(time.Second * 2)
+}
+func calculationYlqxRange(company string, old_class_1 string) []map[string]interface{} {
+	dataArr, _ := Sour_Mgo.Find("nmpa_company_new", bson.M{"company": company}, nil, bson.M{"product_range": 1})
+	infos := []map[string]interface{}{}
+	temp := map[string]string{}
+	for _, v := range dataArr {
+		product_range := qu.ObjToString(v["product_range"])
+		matchArr1 := rangeReg1.FindAllString(product_range, -1)
+		if len(matchArr1) > 0 {
+			for _, v1 := range matchArr1 {
+				name := rangeReg1.ReplaceAllString(v1, "${4}")
+				name = rangeClean1.ReplaceAllString(name, "")
+				name = rangeClean2.ReplaceAllString(name, "")
+				if temp[name] == "" {
+					temp[name] = name
+					log := calculationYlqxCode(YlqxNameCode[name])
+					infos = append(infos, map[string]interface{}{
+						name: log,
+					})
+				}
+			}
+		} else {
+			matchArr2 := rangeReg2.FindAllString(product_range, -1)
+			for _, v1 := range matchArr2 {
+				if strings.Contains(v1, "分类目录") {
+					continue
+				}
+				name := rangeReg2.ReplaceAllString(v1, "${2}")
+				name = rangeClean1.ReplaceAllString(name, "")
+				name = rangeClean2.ReplaceAllString(name, "")
+				if temp[name] == "" {
+					temp[name] = name
+					log := calculationYlqxCode(YlqxNameCode[name])
+					infos = append(infos, map[string]interface{}{
+						name: log,
+					})
+				}
+			}
+		}
+	}
+	return infos
+}
+
+//拆分合并医疗产品与企业信息
+func splitMergeMedicalInfo(coll string) {
+	sess := Sour_Mgo.GetMgoConn()
+	defer Sour_Mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	it := sess.DB(Sour_Mgo.DbName).C(coll).Find(&q).Sort("_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("cur index ", total)
+		}
+		classify := qu.ObjToString(tmp["classify"])
+		reg_no := qu.ObjToString(tmp["reg_no"])
+		if reg_no == "" { //异常数据
+			tmp = make(map[string]interface{})
+			continue
+		}
+		if classify == "医疗器械生产企业(许可)" || classify == "医疗器械生产企业(备案)" ||
+			classify == "医疗器械经营企业(许可)" || classify == "医疗器械经营企业(备案)" {
+			company := qu.ObjToString(tmp["company"])
+			if company != "" {
+				if companyTemp[reg_no] == "" {
+					companyTemp[reg_no] = company
+					Save_Mgo.Save("nmpa_company_new", tmp)
+				}
+			}
+		} else {
+			product_name := qu.ObjToString(tmp["product_name"])
+			if product_name != "" {
+				if productTemp[reg_no] == "" {
+					productTemp[reg_no] = product_name
+					Save_Mgo.Save("nmpa_product_new", tmp)
+				}
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ", total)
+}

+ 101 - 0
data_ylqx/src/test.go

@@ -0,0 +1,101 @@
+package main
+
+import (
+	"fmt"
+	log "github.com/donnie4w/go-logger/logger"
+	"github.com/tealeg/xlsx"
+	"os"
+	qu "qfw/util"
+)
+
+var sheet1, sheet2, sheet3 *xlsx.Sheet
+var row1, row2, row3 *xlsx.Row
+var index2, index3 = 1, 1
+
+//父子级结构写表格-超链接
+func testInvestInfo() {
+	os.Remove("1.xlsx")
+	f := xlsx.NewFile()
+	sheet1, _ = f.AddSheet("Sheet1")
+	sheet2, _ = f.AddSheet("Sheet2")
+	sheet3, _ = f.AddSheet("Sheet3")
+	row1 = sheet1.AddRow()
+	row1.AddCell().Value = "企业名称"
+	row1.AddCell().Value = "父级企业名称"
+	row2 = sheet2.AddRow()
+	row2.AddCell().Value = "企业名称"
+	row2.AddCell().Value = "父级企业名称"
+	row3 = sheet3.AddRow()
+	row3.AddCell().Value = "企业名称"
+	row3.AddCell().Value = "父级企业名称"
+	b := testGetInvests("158308314d4cfdefe6f5e943d4dcaf4e", "中国核工业集团有限公司", 3)
+	if b {
+		log.Debug("企业有问题......")
+	}
+	err := f.Save("1.xlsx")
+	if err != nil {
+		log.Debug("保存xlsx失败:", err)
+	} else {
+		log.Debug("保存xlsx成功:", err)
+	}
+}
+func testGetInvests(tmpid string, pre_name string, level int) bool {
+	q := map[string]interface{}{"stock_name_id": tmpid}
+	info, _ := Spi_Mgo.Find("company_partner", q, nil, nil)
+	var infos []map[string]interface{}
+	temp := map[string]string{}
+	for _, v := range info {
+		company_id := qu.ObjToString(v["company_id"])
+		if temp[company_id] == "" && qu.ObjToString(v["company_name"]) != "" && qu.IntAll(v["use_flag"]) == 0 {
+			infos = append(infos, v)
+			temp[company_id] = company_id
+		}
+	}
+	if level <= 1 {
+		for _, v := range infos {
+			infos = append(infos, v)
+			row3 = sheet3.AddRow()
+			row3.AddCell().Value = qu.ObjToString(v["company_name"])
+			row3.AddCell().Value = pre_name
+			index3++
+		}
+		if len(infos) > 0 {
+			return true
+		}
+		return false
+	}
+	for _, invest := range infos {
+		b := testGetInvests(qu.ObjToString(invest["company_id"]), qu.ObjToString(invest["company_name"]), level-1)
+		if level == 2 {
+			row2 = sheet2.AddRow()
+			index2++
+			row2.AddCell().Value = qu.ObjToString(invest["company_name"])
+			row2.AddCell().Value = pre_name
+			if b {
+				cell := row2.AddCell()
+				link := "=HYPERLINK(" + "\"#Sheet3!A" + fmt.Sprintf("%d", index3) + "\",\"" + "下一级链接" + "\")"
+				cell.SetFormula(link)
+				style := cell.GetStyle()
+				style.Font.Underline = true
+				style.Font.Color = "FF0000FF"
+			}
+		}
+		if level == 3 {
+			row1 = sheet1.AddRow()
+			row1.AddCell().Value = qu.ObjToString(invest["company_name"])
+			row1.AddCell().Value = pre_name
+			if b {
+				cell := row1.AddCell()
+				link := "=HYPERLINK(" + "\"#Sheet2!A" + fmt.Sprintf("%d", index2) + "\",\"" + "下一级链接" + "\")"
+				cell.SetFormula(link)
+				style := cell.GetStyle()
+				style.Font.Underline = true
+				style.Font.Color = "FF0000FF"
+			}
+		}
+	}
+	if len(infos) > 0 {
+		return true
+	}
+	return false
+}

+ 17 - 16
listen_data/src/main.go

@@ -115,30 +115,31 @@ func main() {
 	//}
 	//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()
-
 	//save_mgo = &MongodbSim{
-	//	MongodbAddr: "127.0.0.1:27017",
-	//	DbName:      "zhengkun",
+	//	MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
+	//	DbName:      "qfw",
 	//	Size:        10,
-	//	UserName:    "",
-	//	Password:    "",
+	//	UserName:    "zhengkun",
+	//	Password:    "zk@123123",
 	//}
 	//save_mgo.InitPool()
 
+	save_mgo = &MongodbSim{
+		MongodbAddr: "127.0.0.1:27017",
+		DbName:      "zhengkun",
+		Size:        10,
+		UserName:    "",
+		Password:    "",
+	}
+	save_mgo.InitPool()
+
 	//decodeJyUrl("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
-	//decodeSEUrl("QlxHe2B7PAUGAggSCUErOnE8AQUCC0JW")
+	//decodeSEUrl("QltDeTokbwUCBA0WV0V6anBgCwIGW0VZ")
 	//decodeFeedBackInfo()
+	//export0427wininfo()
 
-	exportFromArrToBiddingData("zktest_kdxf_info")
-	//exportAllDataYXT()
+	decodeSEUrl("QltFK2gnbAIIUFwVV0dybyZpVAkEWkNb")
+	decodeSEUrl("QltFK2h2OQMIUFwVV0dybyZpVAkFWEdY")
 
 	return
 

+ 23 - 5
listen_data/src/mgo.go

@@ -149,16 +149,14 @@ func (m *MongodbSim) InitPool() {
 	opts.SetMaxPoolSize(uint64(m.Size))
 	m.pool = make(chan bool, m.Size)
 
-	if m.UserName !="" && m.Password !="" {
+	if m.UserName != "" && m.Password != "" {
 		cre := options.Credential{
-			Username:m.UserName,
-			Password:m.Password,
+			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)
@@ -336,6 +334,26 @@ func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields i
 	return results, nil
 }
 
+//find
+func (m *MongodbSim) FindLimit(c string, query map[string]interface{}, sort, fields interface{}, limit int64) ([]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), op.SetLimit(limit))
+	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()

BIN
listen_data/src/res/1.xlsx


BIN
listen_data/src/res/2.xlsx


BIN
listen_data/src/res/3.xlsx


+ 616 - 200
listen_data/src/zkmethod.go

@@ -8,6 +8,7 @@ import (
 	log "github.com/donnie4w/go-logger/logger"
 	"github.com/go-ego/gse"
 	"github.com/tealeg/xlsx"
+	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
 	"io"
 	"io/ioutil"
@@ -44,106 +45,7 @@ var (
 
 //导出数据-bidding相关
 func exportFromArrToBiddingData(coll_name string) {
-	arr := []string{
-		"640fcb4556e044e9137e8d76",
-		"64102c5a8aea8786d1cf2252",
-		"64102cb28aea8786d1cf23e3",
-		"64102c5b8aea8786d1cf2266",
-		"641424cf779467cff193c9b6",
-		"640e94c7779467cff188ec14",
-		"640efcac8aea8786d1ce8dae",
-		"640ea0f88aea8786d1ce0767",
-		"6413d13f56e044e9138b3ee8",
-		"64117b818aea8786d1cffbf9",
-		"64142a108aea8786d1d1cc90",
-		"6417b1408aea8786d1d2782c",
-		"64104dd1779467cff18cd583",
-		"6413e37a8aea8786d1d17828",
-		"6412148456e044e91386c106",
-		"641685da56e044e91391551c",
-		"640ff99856e044e9137f6193",
-		"640e9509779467cff188ece2",
-		"6412817a56e044e91387d432",
-		"64118dce8aea8786d1d02185",
-		"6412b48d779467cff190ba27",
-		"6415dc5f779467cff1952d6d",
-		"64127ada779467cff190087b",
-		"6415dc5a779467cff1952d6c",
-		"641509ec779467cff194b6a4",
-		"640fe3ec779467cff18b530e",
-		"640e9767779467cff188f76b",
-		"640fd583779467cff18b140a",
-		"6412b613779467cff190bfd1",
-		"641299ce779467cff19083b3",
-		"64116f49779467cff18e791f",
-		"640fea318aea8786d1cede7e",
-		"641025618aea8786d1cf17dc",
-		"641173568aea8786d1cff098",
-		"6412b0258aea8786d1d0b6a1",
-		"6412d2388aea8786d1d0e31f",
-		"6412d2388aea8786d1d0e31c",
-		"6413f6a48aea8786d1d18fa1",
-		"640e99ed8aea8786d1cdfaa6",
-		"6410296f8aea8786d1cf1d64",
-		"641029708aea8786d1cf1d7d",
-		"641031678aea8786d1cf2b35",
-		"641031688aea8786d1cf2b49",
-		"641031688aea8786d1cf2b55",
-		"641031688aea8786d1cf2b5e",
-		"641031688aea8786d1cf2b61",
-		"641031698aea8786d1cf2b77",
-		"641031698aea8786d1cf2b71",
-		"64119a3a56e044e91385475d",
-		"640efb4456e044e9137d9b0f",
-		"6411db9e56e044e913861625",
-		"6415894856e044e9138f867d",
-		"64103b4256e044e9138061fe",
-		"640fda5756e044e9137edcc3",
-		"6411a5e056e044e91385785f",
-		"641138d456e044e913838d6d",
-		"64120bce56e044e91386a8e9",
-		"6411e9cf56e044e913863a76",
-		"6411433556e044e91383bcc7",
-		"6412b6ec56e044e913888145",
-		"640fd3ad56e044e9137eb73f",
-		"64162c6e56e044e91390ab01",
-		"641215d356e044e91386c4b6",
-		"641320e356e044e91389d08b",
-		"640e8e9f56e044e9137bc09f",
-		"6410222756e044e9137fe011",
-		"641138d356e044e913838d4f",
-		"641755db56e044e91392e551",
-		"6411433556e044e91383bcc2",
-		"640fd3b556e044e9137eb907",
-		"6412f21356e044e913896c76",
-		"6416dd4f56e044e91391e1d4",
-		"6410713b56e044e9138127d1",
-		"640e8ea956e044e9137bc1e5",
-		"640eddf6779467cff189d726",
-		"641033c8779467cff18c6852",
-		"64111023779467cff18d411e",
-		"6412cfd5779467cff1913608",
-		"6411234d779467cff18d818c",
-		"6413ae8c779467cff1923893",
-		"64126e1e779467cff18fd257",
-		"640e847d779467cff188a713",
-		"640eec62779467cff18a254a",
-		"6411366d779467cff18dd385",
-		"640ec8e6779467cff18973ea",
-		"64113681779467cff18dd40b",
-		"64144303779467cff1944f06",
-		"641598f1779467cff195188f",
-		"6413bd6a779467cff19254c1",
-		"640fe753779467cff18b6144",
-		"641421ec779467cff193b896",
-		"6412e314779467cff191957d",
-		"64140864779467cff19345b6",
-		"6412ff8b779467cff191f1a6",
-		"6415a2e5779467cff1951c91",
-		"640e7fc8779467cff188953c",
-		"640f04bb779467cff18a72f9",
-		"6412cfd9779467cff191361e",
-	}
+	arr := []string{}
 	isok := 0
 	for _, v := range arr {
 		data := save_mgo.FindById("bidding", v)
@@ -237,6 +139,8 @@ func encodeSEUrl(str string) {
 	var SE = qu.SimpleEncrypt{Key: "topJYBX2019"}
 	log.Debug(SE.EncodeString(str))
 }
+
+//解密~base64
 func decodeSEUrl(str string) {
 	var SE = qu.SimpleEncrypt{Key: "topJYBX2019"}
 	log.Debug(SE.DecodeString(str))
@@ -259,111 +163,623 @@ func encodeJyUrl() {
 
 //解密数据id
 func decodeFeedBackInfo() {
-	arr := []string{
-		"QltALDogbAcFB1xEW0QvYHNrBVUJXUNZ",
-		"QltBemshbVMIUFwVV0dybyZpUVYDC0Fd",
-		"QltBemshOgAIUFwVV0dybyZpUVYDChFc",
-		"QltBemshbVAIUFwVV0dybyZpUVYDC0JZ",
-		"QltBfmt2O1QHBgBAWUcpPyRpCwNSABZZ",
-		"QltAL2B2OwUHBgBAWUcpPyRpCghUWkVb",
-		"QltALz8hOVEIUFwVV0dybyZpUVUJXRUK",
-		"QltALzhyPgoIUFwVV0dybyZpUVUBDkJY",
-		"QltBeT1za1QFB1xEW0QvYHNrClICXBFX",
-		"QltBe24gYAMIUFwVV0dybyZpUVZXWxJW",
-		"QltBfmsjaQIIUFwVV0dybyZpVgFSWk1f",
-		"QltBfTtzbAIIUFwVV0dybyZpVgIGAUYM",
-		"QltBem0mPAMHBgBAWUcpPyRpClNVDExc",
-		"QltBeTxxb1MIUFwVV0dybyZpVgEGAUZX",
-		"QltBeGh2YAYFB1xEW0QvYHNrCgZSCERZ",
-		"QltBfGF3PFMFB1xEW0QvYHNrCwEEDEUM",
-		"QltALD97YQoFB1xEW0QvYHNrBVYHCE1c",
-		"QltAL2B3aAsHBgBAWUcpPyRpCghUWhFd",
-		"QltBeGFzb1MFB1xEW0QvYHNrCgdVDUdd",
-		"QltBe2EmO1cIUFwVV0dybyZpVgADCExa",
-		"QltBeDt2YFYHBgBAWUcpPyRpCwBTWEZY",
-		"QltBfz0hbVQHBgBAWUcpPyRpCwUDXUIL",
-		"QltBeG4jPFMHBgBAWUcpPyRpCwABAUMN",
-		"QltBfz0hbVMHBgBAWUcpPyRpCwUDXUIM",
-		"QltBf2l7PVEHBgBAWUcpPyRpCwRTDxVb",
-		"QltALDxxPVEHBgBAWUcpPyRpClIECkQK",
-		"QltAL2B1bgUHBgBAWUcpPyRpCghXDkIN",
-		"QltALD13YAEHBgBAWUcpPyRpClIADUQO",
-		"QltBeDt0aQEHBgBAWUcpPyRpCwBTXxBe",
-		"QltBeGB7O1cHBgBAWUcpPyRpCwAJChZc",
-		"QltBe28kbAsHBgBAWUcpPyRpClUGAEUJ",
-		"QltALDwjawMIUFwVV0dybyZpUVVVXEMK",
-		"QltBemt3bgMIUFwVV0dybyZpUVYADhAM",
-		"QltBe25xbQQIUFwVV0dybyZpUVZXCU1X",
-		"QltBeDtyagcIUFwVV0dybyZpVgBTDxVe",
-		"QltBeD1wawoIUFwVV0dybyZpVgBUCkUJ",
-		"QltBeD1wawoIUFwVV0dybyZpVgBUCkUM",
-		"QltBeT90OQYIUFwVV0dybyZpVgEJXxVe",
-		"QltAL2B7PVYIUFwVV0dybyZpUVRXWBVZ",
-		"QltBemt7blQIUFwVV0dybyZpUVYAXUJb",
-		"QltBemt7bwIIUFwVV0dybyZpUVYAXUML",
-		"QltBempzbgUIUFwVV0dybyZpUVYDW0da",
-		"QltBempzbgoIUFwVV0dybyZpUVYDW0BW",
-		"QltBempzbgoIUFwVV0dybyZpUVYDW0Fa",
-		"QltBempzbgoIUFwVV0dybyZpUVYDW0EK",
-		"QltBempzbgoIUFwVV0dybyZpUVYDW0Je",
-		"QltBempzbgsIUFwVV0dybyZpUVYDW0NY",
-		"QltBempzbgsIUFwVV0dybyZpUVYDW0Ne",
-		"QltBe2Aja1MFB1xEW0QvYHNrCgUFDkEL",
-		"QltALz8gbAYFB1xEW0QvYHNrBVQIW0QJ",
-		"QltBez0gYVcFB1xEW0QvYHNrCgYAD0Za",
-		"QltBf2F7bAoFB1xEW0QvYHNrClYJD0ML",
-		"QltBemogbAAFB1xEW0QvYHNrCgAHCBIK",
-		"QltALD0jbQUFB1xEW0QvYHNrBVVVWhdc",
-		"QltBezh3PQIFB1xEW0QvYHNrCgUGAUEJ",
-		"QltBe2p6PAYFB1xEW0QvYHNrCgMJXUIL",
-		"QltBeGkgO1cFB1xEW0QvYHNrCgZQARFW",
-		"QltBezx7O1QFB1xEW0QvYHNrCgYCWENZ",
-		"QltBe21xawcFB1xEW0QvYHNrCgNTWhdY",
-		"QltBeDt0PVEFB1xEW0QvYHNrCggJCEBa",
-		"QltALD1xOVYFB1xEW0QvYHNrBVVTDkcJ",
-		"QltBfGshblcFB1xEW0QvYHNrCwBQW0Re",
-		"QltBeGh3PAEFB1xEW0QvYHNrCgZSDRZZ",
-		"QltBeWtyPQEFB1xEW0QvYHNrCglVCUwN",
-		"QltAL2EnYVQFB1xEW0QvYHNrBVJSCU0J",
-		"QltBemtwagUFB1xEW0QvYHNrBVZUCUVe",
-		"QltBe2p6PAEFB1xEW0QvYHNrCgMJXUAJ",
-		"QltBfWx3PFAFB1xEW0QvYHNrCwJUDEFe",
-		"QltBe21xawcFB1xEW0QvYHNrCgNTWhdd",
-		"QltALD1xOgcFB1xEW0QvYHNrBVVTAERY",
-		"QltBeD9waQEFB1xEW0QvYHNrCgkHWkNZ",
-		"QltBfD0mbFQFB1xEW0QvYHNrCwFUCBBb",
-		"QltBem5za1AFB1xEW0QvYHNrCgEDDhBe",
-		"QltAL2EnOQsFB1xEW0QvYHNrBVJSCBFa",
-		"QltALz0mPgQHBgBAWUcpPyRpCglVDkZZ",
-		"QltBempxOwoHBgBAWUcpPyRpClMHAUFd",
-		"QltBe2hyagEHBgBAWUcpPyRpClQFCEUK",
-		"QltBeDokPAcHBgBAWUcpPyRpCwECD0RX",
-		"QltBe2txbFYHBgBAWUcpPyRpClQJCEwM",
-		"QltBeTgnYFEHBgBAWUcpPyRpCwICAU1c",
-		"QltBeG8naVcHBgBAWUcpPyRpClZVC0FY",
-		"QltAL2F2b1YHBgBAWUcpPyRpCghQDkVc",
-		"QltALzwhbgAHBgBAWUcpPyRpClEDDEAO",
-		"QltBe2p0blYHBgBAWUcpPyRpClRVCkxa",
-		"QltALzp6PQQHBgBAWUcpPyRpCgkGChEO",
-		"QltBe2p0YAMHBgBAWUcpPyRpClRVDUQN",
-		"QltBfm1xaAEHBgBAWUcpPyRpCwQFX0RZ",
-		"QltBf2B6PgMHBgBAWUcpPyRpCwUAAUwJ",
-		"QltBeTsmblMHBgBAWUcpPyRpCwIEDRde",
-		"QltALDx1bQEHBgBAWUcpPyRpClIHCEBb",
-		"QltBfmtzPVEHBgBAWUcpPyRpCwNTAU1Z",
-		"QltBeDxxaQYHBgBAWUcpPyRpCwEIDEML",
-		"QltBfml6bgYHBgBAWUcpPyRpCwMFDBZZ",
-		"QltBeD8kYFAHBgBAWUcpPyRpCwFXCBVZ",
-		"QltBfzhwPQcHBgBAWUcpPyRpCwUAWk1e",
-		"QltAL24kOwoHBgBAWUcpPyRpCggIDEcM",
-		"QltALGl2OlAHBgBAWUcpPyRpClEGCxJW",
-		"QltBeDokPAsHBgBAWUcpPyRpCwECD0UK",
-	}
+	arr := []string{}
 	for _, v := range arr {
 		decodeSEUrl(v)
 	}
 }
 
+//清洗医疗名称
+func testCleanMedicalName() {
+	dataArr, _ := save_mgo.Find("111111", nil, bson.M{"_id": 1}, nil)
+	isok := 0
+	var reg1 *regexp.Regexp = regexp.MustCompile("[((].*[))]")
+	var reg2 *regexp.Regexp = regexp.MustCompile("^([\u4E00-\u9FA5]+)([A-Za-z]+)$")
+
+	for _, v := range dataArr {
+		tmpid := BsonTOStringId(v["_id"])
+		new_name := qu.ObjToString(v["name"])
+		new_name = strings.ReplaceAll(new_name, " ", "")
+		if reg1.MatchString(new_name) {
+			new_name = reg1.ReplaceAllString(new_name, "")
+		}
+		if reg2.MatchString(new_name) {
+			new_name = reg2.ReplaceAllString(new_name, "${1}")
+		}
+		if utf8.RuneCountInString(new_name) > 10 {
+			new_name = ""
+		}
+		save_mgo.UpdateById("111111", tmpid, map[string]interface{}{
+			"$set": map[string]interface{}{
+				"new_name": new_name,
+			},
+		})
+		isok++
+	}
+	log.Debug("is over ", isok)
+}
+
+func cleanName(s string) string {
+	news := ""
+	isTrue := false
+	for _, c := range s {
+		if unicode.Is(unicode.Han, c) || unicode.IsLetter(c) {
+			isTrue = true
+		}
+		if isTrue {
+			news += string(c)
+		}
+	}
+	return news
+}
+
+//迭代性能测试
+func testMongoLevel1() {
+	tmpid, total := "403655e927198cc9c10fcc49", 0
+	for {
+		q := bson.M{"_id": bson.M{"$gt": StringTOBsonId(tmpid)}}
+		dataArr, _ := save_mgo.FindLimit("bidding", q, bson.M{"_id": 1}, nil, 5000)
+		total += len(dataArr)
+		if total > 3000000 {
+			break
+		}
+		if len(dataArr) == 0 {
+			break
+		}
+		tmpid = BsonTOStringId(dataArr[len(dataArr)-1]["_id"])
+	}
+	log.Debug("is page over ", total)
+}
+func testMongoLevel2() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q, total := bson.M{"_id": bson.M{"$gt": StringTOBsonId("403655e927198cc9c10fcc49")}}, 0
+	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 > 3000000 {
+			break
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is iter over ", total)
+}
+
+//接口调用大模型数据
+func callChatGlmApi(from string) {
+	prompt := ""
+	if from == "buyer" {
+		prompt = "你是一名数据标注员,请抽取文中的采购单位"
+	} else if from == "area" {
+		prompt = "你是一名数据识别员,请识别文中的项目地区"
+	} else if from == "winner" {
+		prompt = "你是一名数据标注员,请抽取文中的中标单位"
+	} else if from == "bidamount" {
+		prompt = "你是一名数据识别员,请抽取文中的中标金额"
+	} else {
+		log.Debug("参数参数有误~~~")
+		return
+	}
+
+	dataArr, _ := save_mgo.Find("zktest_chatglm_"+from, nil, nil, map[string]interface{}{"detail": 1, "href": 1})
+	for k, v := range dataArr {
+		if k%10 == 0 {
+			log.Debug("cur index ", k)
+		}
+		detail := qu.ObjToString(v["detail"])
+		new_prompt := detail + "\n" + prompt
+		body := map[string]interface{}{"identity": "剑鱼chat", "prompt": new_prompt}
+		data := postChatGlm("http://192.168.3.109:12001",
+			body, "application/json")
+		response := ""
+		if qu.IntAll(data["status"]) == 200 {
+			response = qu.ObjToString(data["response"])
+		} else {
+			response = "请求异常"
+		}
+		tmpid := qu.ObjToString(v["_id"])
+		save_mgo.Save("111111_"+from, map[string]interface{}{
+			"_id":      tmpid,
+			"jyhref":   fmt.Sprintf(Url, qu.CommonEncodeArticle("content", tmpid)),
+			"href":     qu.ObjToString(v["href"]),
+			"detail":   detail,
+			"response": response,
+		})
+	}
+	log.Debug("is over ~~~")
+}
+
+func postChatGlm(url string, data interface{}, contentType string) map[string]interface{} {
+	task <- struct{}{}
+	defer func() {
+		<-task
+	}()
+	client := &http.Client{Timeout: 10 * time.Second}
+	jsonStr, _ := json.Marshal(data)
+	resp, err := client.Post(url, contentType, bytes.NewBuffer(jsonStr))
+	if err != nil {
+		log.Debug("请求错误~", err)
+		return map[string]interface{}{}
+	}
+	result, _ := ioutil.ReadAll(resp.Body)
+	dict := make(map[string]interface{})
+	json.Unmarshal(result, &dict)
+	//fmt.Println("post...start")
+	return dict
+}
+
+//导出无中标单位的数据
+func export0427wininfo() {
+	elastic.InitElasticSize("http://127.0.0.1:13002", 10)
+	total := int64(0)
+	esclient := elastic.GetEsConn()
+	defer elastic.DestoryEsConn(esclient)
+	if esclient == nil {
+		log.Debug("连接池异常")
+	}
+	//26号当天数据
+	query1 := es_elastic.NewRangeQuery("publishtime").Gte(1682438400).Lt(1682524800)
+	query2 := es_elastic.NewMissingFilter("winner")
+	query3 := es_elastic.NewMissingFilter("bidamount")
+
+	cursor, err := esclient.Scan("bidding").Query(es_elastic.NewBoolQuery().Must(query1, query2, query3)).Size(200).Do()
+	if err != nil || cursor.Results == nil || cursor.Results.Hits == nil {
+		log.Debug("异常~", err)
+	}
+	total += cursor.TotalHits()
+	log.Debug("当前查询正常数:", cursor.TotalHits(), "总数:", total)
+	numDocs, isok := 0, 0
+	//多线程 - 处理数据
+	temp := map[string]int{}
+	pool_es := make(chan bool, 1)
+	wg_es := &sync.WaitGroup{}
+	for {
+		searchResult, err := cursor.Next()
+		if err != nil {
+			if err.Error() == "EOS" {
+				break
+			} else {
+				log.Debug("cursor searchResult", err)
+			}
+		}
+		for _, hit := range searchResult.Hits.Hits {
+			tmp := make(map[string]interface{})
+			err := json.Unmarshal(*hit.Source, &tmp)
+			if err != nil {
+				log.Debug("json Unmarshal error")
+				continue
+			}
+			if numDocs%1000 == 0 {
+				log.Debug("当前条数:", numDocs, " 符合条数:", isok)
+			}
+			numDocs++
+			if isok >= 100 {
+				break
+			}
+			pool_es <- true
+			wg_es.Add(1)
+			go func(tmp map[string]interface{}) {
+				defer func() {
+					<-pool_es
+					wg_es.Done()
+				}()
+				site := qu.ObjToString(tmp["site"])
+				subtype := qu.ObjToString(tmp["subtype"])
+				if subtype == "中标" || subtype == "成交" || subtype == "合同" {
+					num := qu.IntAll(temp[site])
+					if num < 2 {
+						isok++
+						temp[site] = num + 1
+						save_mgo.Save("zktest_chatglm_wininfo", tmp)
+					}
+				}
+			}(tmp)
+		}
+	}
+	wg_es.Wait()
+	log.Debug("遍历完毕...", total, numDocs, isok)
+}
+
+//导出-大模型验证的-疑似问题-buyer与地域
+func export0425buyer() {
+	elastic.InitElasticSize("http://127.0.0.1:13002", 10)
+	total := int64(0)
+	esclient := elastic.GetEsConn()
+	defer elastic.DestoryEsConn(esclient)
+	if esclient == nil {
+		log.Debug("连接池异常")
+	}
+	query1 := es_elastic.NewRangeQuery("publishtime").Gte(1682265600).Lt(1682352000)
+	query2 := es_elastic.NewTermQuery("toptype", "招标")
+	query4 := es_elastic.NewMissingFilter("buyer")
+	cursor, err := esclient.Scan("bidding").Query(es_elastic.NewBoolQuery().Must(query1, query2, query4)).Size(200).Do()
+	if err != nil || cursor.Results == nil || cursor.Results.Hits == nil {
+		log.Debug("异常~", err)
+	}
+	total += cursor.TotalHits()
+	log.Debug("当前查询正常数:", cursor.TotalHits(), "总数:", total)
+	numDocs, isok := 0, 0
+	//多线程 - 处理数据
+	temp := map[string]int{}
+	pool_es := make(chan bool, 1)
+	wg_es := &sync.WaitGroup{}
+	for {
+		searchResult, err := cursor.Next()
+		if err != nil {
+			if err.Error() == "EOS" {
+				break
+			} else {
+				log.Debug("cursor searchResult", err)
+			}
+		}
+		for _, hit := range searchResult.Hits.Hits {
+			tmp := make(map[string]interface{})
+			err := json.Unmarshal(*hit.Source, &tmp)
+			if err != nil {
+				log.Debug("json Unmarshal error")
+				continue
+			}
+			if numDocs%1000 == 0 {
+				log.Debug("当前条数:", numDocs, " 符合条数:", isok)
+			}
+			numDocs++
+			if isok >= 100 {
+				break
+			}
+			pool_es <- true
+			wg_es.Add(1)
+			go func(tmp map[string]interface{}) {
+				defer func() {
+					<-pool_es
+					wg_es.Done()
+				}()
+				site := qu.ObjToString(tmp["site"])
+				num := qu.IntAll(temp[site])
+				if num < 2 {
+					isok++
+					temp[site] = num + 1
+					save_mgo.Save("zktest_chatglm_buyer", tmp)
+				}
+			}(tmp)
+		}
+	}
+	wg_es.Wait()
+	log.Debug("遍历完毕...", total, numDocs, isok)
+}
+func export0425region() {
+	elastic.InitElasticSize("http://127.0.0.1:13002", 10)
+	total := int64(0)
+	esclient := elastic.GetEsConn()
+	defer elastic.DestoryEsConn(esclient)
+	if esclient == nil {
+		log.Debug("连接池异常")
+	}
+	query1 := es_elastic.NewRangeQuery("publishtime").Gte(1682265600).Lt(1682352000)
+	query4 := es_elastic.NewTermQuery("area", "全国")
+	cursor, err := esclient.Scan("bidding").Query(es_elastic.NewBoolQuery().Must(query1, query4)).Size(200).Do()
+	if err != nil || cursor.Results == nil || cursor.Results.Hits == nil {
+		log.Debug("异常~", err)
+	}
+	total += cursor.TotalHits()
+	log.Debug("当前查询正常数:", cursor.TotalHits(), "总数:", total)
+	numDocs, isok := 0, 0
+	//多线程 - 处理数据
+	temp := map[string]int{}
+	pool_es := make(chan bool, 1)
+	wg_es := &sync.WaitGroup{}
+	for {
+		searchResult, err := cursor.Next()
+		if err != nil {
+			if err.Error() == "EOS" {
+				break
+			} else {
+				log.Debug("cursor searchResult", err)
+			}
+		}
+		for _, hit := range searchResult.Hits.Hits {
+			tmp := make(map[string]interface{})
+			err := json.Unmarshal(*hit.Source, &tmp)
+			if err != nil {
+				log.Debug("json Unmarshal error")
+				continue
+			}
+			if numDocs%1000 == 0 {
+				log.Debug("当前条数:", numDocs, " 符合条数:", isok)
+			}
+			numDocs++
+			if isok >= 100 {
+				break
+			}
+			pool_es <- true
+			wg_es.Add(1)
+			go func(tmp map[string]interface{}) {
+				defer func() {
+					<-pool_es
+					wg_es.Done()
+				}()
+				site := qu.ObjToString(tmp["site"])
+				num := qu.IntAll(temp[site])
+				if num < 2 {
+					isok++
+					temp[site] = num + 1
+					save_mgo.Save("zktest_chatglm_region", tmp)
+				}
+			}(tmp)
+		}
+	}
+	wg_es.Wait()
+	log.Debug("遍历完毕...", total, numDocs, isok)
+}
+func tongji0424() {
+	var SE = qu.SimpleEncrypt{Key: "topJYBX2019"}
+	temp := map[string]string{}
+	fileNameArr := []string{"1.xlsx", "2.xlsx", "3.xlsx"}
+	for _, filename := range fileNameArr {
+		isok := 0
+		ff, _ := xlsx.OpenFile("res/" + filename)
+		for _, sheet := range ff.Sheets {
+			for row_index, row := range sheet.Rows {
+				var str []string
+				for _, cell := range row.Cells {
+					s := cell.String()
+					s = strings.ReplaceAll(s, " ", "")
+					s = strings.ReplaceAll(s, " ", "")
+					str = append(str, s)
+				}
+				if row_index > 0 {
+					area := qu.ObjToString(str[0])
+					city := qu.ObjToString(str[1])
+					subtype := qu.ObjToString(str[2])
+					budget := qu.Float64All(str[3])
+					bidamount := qu.Float64All(str[4])
+					buyer := qu.ObjToString(str[5])
+					s_winner := qu.ObjToString(str[6])
+					encry_id := qu.ObjToString(str[7])
+					tmpid := SE.DecodeString(encry_id)
+					if temp[encry_id] == "" {
+						temp[encry_id] = encry_id
+						isok++
+						data := map[string]interface{}{
+							"_id":       StringTOBsonId(tmpid),
+							"area":      area,
+							"city":      city,
+							"subtype":   subtype,
+							"budget":    budget,
+							"bidamount": bidamount,
+							"buyer":     buyer,
+							"s_winner":  s_winner,
+							"encry_id":  encry_id,
+						}
+						if data != nil {
+							save_mgo.Save("111111", data)
+						}
+					}
+				}
+			}
+		}
+		log.Debug("is over ", isok)
+	}
+
+}
+func export0424() {
+	q := map[string]interface{}{}
+	dataArr, _ := save_mgo.Find("zktest_accuracy_new", q, nil, map[string]interface{}{
+		"_id": 1,
+	})
+	for _, v := range dataArr {
+		tmpid := BsonTOStringId(v["_id"])
+		info := save_mgo.FindById("bidding", tmpid)
+		if info != nil && len(info) > 0 {
+			data := map[string]interface{}{
+				"_id":       info["_id"],
+				"area":      qu.ObjToString(info["area"]),
+				"city":      qu.ObjToString(info["city"]),
+				"subtype":   qu.ObjToString(info["subtype"]),
+				"budget":    qu.Float64All(info["budget"]),
+				"bidamount": qu.Float64All(info["bidamount"]),
+				"buyer":     qu.ObjToString(info["buyer"]),
+				"s_winner":  qu.ObjToString(info["s_winner"]),
+			}
+			save_mgo.Save("zktest_accuracy_info", data)
+		}
+	}
+}
+func accuracy0424() {
+	q := map[string]interface{}{}
+	dataArr1, _ := save_mgo.Find("zktest_accuracy_info", q, nil, nil)
+	dataArr2, _ := save_mgo.Find("zktest_accuracy_new", q, nil, nil)
+	temp1 := map[string]map[string]interface{}{}
+	temp2 := map[string]map[string]interface{}{}
+	for _, v := range dataArr1 {
+		tmpid := BsonTOStringId(v["_id"])
+		temp1[tmpid] = v
+	}
+	for _, v := range dataArr2 {
+		tmpid := BsonTOStringId(v["_id"])
+		temp2[tmpid] = v
+	}
+	log.Debug(len(temp1), "~", len(temp2))
+	fieldArr := []string{"buyer", "s_winner", "budget", "bidamount", "area", "city"}
+	t1, t2, t3, t4, t5, t6 := 0, 0, 0, 0, 0, 0
+	c1, c2, c3, c4, c5, c6 := 0, 0, 0, 0, 0, 0
+	for tmpid, info2 := range temp2 {
+		info1 := temp1[tmpid]
+		for _, key := range fieldArr {
+			if key == "buyer" {
+				t1++
+				if qu.ObjToString(info1[key]) == qu.ObjToString(info2[key]) {
+					c1++
+				}
+			} else if key == "s_winner" {
+				t2++
+				if qu.ObjToString(info1[key]) == qu.ObjToString(info2[key]) {
+					c2++
+				}
+			} else if key == "budget" {
+				t3++
+				if qu.Float64All(info1[key]) == qu.Float64All(info2[key]) {
+					c3++
+				}
+			} else if key == "bidamount" {
+				t4++
+				if qu.Float64All(info1[key]) == qu.Float64All(info2[key]) {
+					c4++
+				}
+			} else if key == "area" {
+				t5++
+				if qu.ObjToString(info1[key]) == qu.ObjToString(info2[key]) {
+					c5++
+				}
+			} else if key == "city" {
+				t6++
+				if qu.ObjToString(info1[key]) == qu.ObjToString(info2[key]) {
+					c6++
+				}
+			} else {
+
+			}
+		}
+	}
+	log.Debug("数据数", t1, t2, t3, t4, t5, t6)
+	log.Debug("正确数", c1, c2, c3, c4, c5, c6)
+	log.Debug("正确率", accuracyRate(t1, c1), "~", accuracyRate(t2, c2), "~", accuracyRate(t3, c3), "~", accuracyRate(t4, c4), "~", accuracyRate(t5, c5), "~", accuracyRate(t6, c6))
+
+}
+
+//统计筛选数据
+func statisticalScreeningDataInfo() {
+	collArr := []string{
+		"20230207Ldx_jsfk_qx",
+		"20230207Ldx_sxsgl_qx",
+		"20230207Ldx_xljk_qx",
+		"20230209Ldx_xyaq",
+		"20230213Ldx_zhxy_2_1",
+		"20230213Ldx_zhxy_2_2",
+		"20230223Ldx_zhjs",
+		"20230317Ldx_zhty",
+	}
+	t1, t2, t3, t4, t5, t6 := 0, 0, 0, 0, 0, 0
+	c1, c2, c3, c4, c5, c6 := 0, 0, 0, 0, 0, 0
+	for _, coll := range collArr {
+		q := map[string]interface{}{}
+		dataArr, _ := save_mgo.Find(coll, q, nil, map[string]interface{}{
+			"v_baseinfo.toptype": 1,
+			"v_taginfo":          1,
+		})
+		//t1, t2, t3, t4, t5, t6 := 0, 0, 0, 0, 0, 0
+		//c1, c2, c3, c4, c5, c6 := 0, 0, 0, 0, 0, 0
+		for _, v := range dataArr {
+			v_baseinfo := *qu.ObjToMap(v["v_baseinfo"])
+			v_taginfo := *qu.ObjToMap(v["v_taginfo"])
+			toptype := qu.ObjToString(v_baseinfo["toptype"])
+			for k1, v1 := range v_taginfo {
+				b := false
+				if qu.IntAll(v1) == 1 {
+					b = true
+				}
+				switch k1 {
+				case "buyer":
+					{
+						t1++
+						if b {
+							c1++
+						}
+					}
+				case "s_winner":
+					{
+						if toptype == "结果" {
+							t2++
+							if b {
+								c2++
+							}
+						}
+					}
+				case "budget":
+					{
+						t3++
+						if b {
+							c3++
+						}
+					}
+				case "bidamount":
+					{
+						if toptype == "结果" {
+							t4++
+							if b {
+								c4++
+							}
+						}
+					}
+				case "area":
+					{
+						t5++
+						if b {
+							c5++
+						}
+					}
+				case "city":
+					{
+						t6++
+						if b {
+							c6++
+						}
+					}
+				default:
+
+				}
+			}
+		}
+		log.Debug("当前表~", coll, "~完毕~")
+	}
+
+	log.Debug("is over ~~~~~")
+	log.Debug("数据数", t1, t2, t3, t4, t5, t6)
+	log.Debug("正确数", c1, c2, c3, c4, c5, c6)
+	log.Debug("正确率", accuracyRate(t1, c1), "~", accuracyRate(t2, c2), "~", accuracyRate(t3, c3), "~", accuracyRate(t4, c4), "~", accuracyRate(t5, c5), "~", accuracyRate(t6, c6))
+}
+
+func accuracyRate(n2 int, n1 int) string {
+	str := fmt.Sprintf("%.2f", float64(n1)/float64(n2))
+	return str
+}
+
+//筛选异常数据
+func filterTheAbnormalInfo() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	isok := 0
+	it := sess.DB(save_mgo.DbName).C("zzzzzzkkk_rg_info_new").Find(&q).Sort("_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("curent index ", total, "~", isok)
+		}
+		subtype := qu.ObjToString(tmp["subtype"])
+		s_winner := qu.ObjToString(tmp["s_winner"])
+		bidamount := qu.Float64All(tmp["bidamount"])
+		if subtype == "中标" || subtype == "成交" || subtype == "合同" {
+			if s_winner == "" && bidamount == float64(0) {
+				isok++
+				if tmp["package"] != nil {
+					log.Debug(tmp["_id"])
+				}
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ", total, "~", isok)
+}
+
+//解析数据
+func exportErrInfo0328() {
+	dataArr, _ := save_mgo.Find("zzzzzzkkk_rg_info_err", nil, nil, nil)
+	for _, v := range dataArr {
+		tmpid := BsonTOStringId(v["_id"])
+		info := save_mgo.FindById("zzzzzzkkk_rg_source", tmpid)
+		save_mgo.Save("zzzzzzkkk_rg_info", info)
+	}
+}
+
+//修复数据
 func repair0317() {
 	//20230314Zdx_xx_new
 	dataArr, _ := save_mgo.Find("20230314Zdx_xx_new", nil, nil, nil)

+ 49 - 63
process_medical/src/main.go

@@ -9,43 +9,41 @@ import (
 )
 
 var (
-	sysconfig    		map[string]interface{} //配置文件
-	save_mgo,qy_mgo,spi_mgo     *MongodbSim            //mongodb操作对象
-    MysqlTool			*Mysql
-	s_area_coll,s_product_coll,s_company_coll,s_qybase_coll			string
-	o_area_coll,o_class_coll,o_company_coll,o_product_coll	string
-	s_class_xlsx_name,s_area_xlsx_name	string
-	o_company_err_coll	string
-	s_bidding_coll,o_bidding_coll,s_company_history_coll	string
-	o_hospital_coll,o_company_history_coll 	string
+	sysconfig                                                  map[string]interface{} //配置文件
+	save_mgo, qy_mgo, spi_mgo                                  *MongodbSim            //mongodb操作对象
+	MysqlTool                                                  *Mysql
+	s_area_coll, s_product_coll, s_company_coll, s_qybase_coll string
+	o_area_coll, o_class_coll, o_company_coll, o_product_coll  string
+	s_class_xlsx_name, s_area_xlsx_name                        string
+	o_company_err_coll                                         string
+	s_bidding_coll, o_bidding_coll, s_company_history_coll     string
+	o_hospital_coll, o_company_history_coll                    string
 )
 
 var timeReg = regexp.MustCompile(`^(\d{4}-[0-1][0-9]-[0-3][0-9])$`)
 var timeReg1 = regexp.MustCompile(`^(\d{4}-\d{1,2}-\d{1,2})$`)
 var Url = "https://www.jianyu360.com/article/content/%s.html"
 
-var bidclass_dict = map[string]string{}   	//v表-招标类别
-var buyerclass_dict = map[string]string{}	//v表-采购类别
-var industry_dict = map[string]string{}		//v表-行业类别
-var area_dict = map[string]string{}			//v表-行政区划
-var proclass_name_dict = map[string]string{}		//v表-医疗分类-名称对应-代码
-var proclass_code_dict = map[string]string{}		//v表-医疗分类-代码对应-名称
+var bidclass_dict = map[string]string{}      //v表-招标类别
+var buyerclass_dict = map[string]string{}    //v表-采购类别
+var industry_dict = map[string]string{}      //v表-行业类别
+var area_dict = map[string]string{}          //v表-行政区划
+var proclass_name_dict = map[string]string{} //v表-医疗分类-名称对应-代码
+var proclass_code_dict = map[string]string{} //v表-医疗分类-代码对应-名称
 var timeLayout = "2006-01-02 15:04:05"
 
-func init()  {
+func init() {
 	qu.ReadConfig(&sysconfig)
 	initConfig()
 	log.Debug("初始化完毕...")
 }
 
-
-func main()  {
+func main() {
 	//initMySqlMgoData()
 	//saveBiddingPurMysql()
 	//exportAreaMysql()
 	//saveHospitalMysql()
 
-
 	saveYlqxclassMysql()
 
 	//医械分类数据
@@ -55,78 +53,66 @@ func main()  {
 		repairEqRegNoClassData()	//注册号-截取匹配
 		repairEqClassData()			//同分类-补充-0123
 	*/
+	repairEqRegNoClassData() //注册号-截取匹配
 	return
 
-	arr:= *MysqlTool.Find("f_bidproduct",nil,"product_name,product_brand,bid_company_name,bid_company_ysname","",-1,-1)
+	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==""{
+	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 { //拼接
+		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)
+					tmp_arr = append(tmp_arr, product_name+"~"+product_brand)
 					data_arr[value] = tmp_arr
 				}
 			}
 		}
 	}
-	for k,v := range data_arr{
+	for k, v := range data_arr {
 		str := ""
-		for _,v1 := range v{
-			if str=="" {
+		for _, v1 := range v {
+			if str == "" {
 				str = v1
 				continue
 			}
-			if !strings.Contains(str,v1) {
-				str+=","+v1
+			if !strings.Contains(str, v1) {
+				str += "," + v1
 			}
 		}
 		insertMysqlData("f_brandname_ys", map[string]interface{}{
-			"company_name":k,
-			"brands":str,
-		},"")
+			"company_name": k,
+			"brands":       str,
+		}, "")
 	}
-	log.Debug("结束~",len(data_arr))
+	log.Debug("结束~", len(data_arr))
 }
 
-
-
-
-
-
-
-
-
 //插入数据
-func insertMysqlData(name string,data map[string]interface{},mark string) {
-	inb := MysqlTool.Insert(name,data)
+func insertMysqlData(name string, data map[string]interface{}, mark string) {
+	inb := MysqlTool.Insert(name, data)
 	if inb == -1 {
-		log.Debug("插入数据异常...",name,"~",mark)
+		log.Debug("插入数据异常...", name, "~", mark)
 	}
 }
 
-
-
-
-
-
-
 type Info struct {
-	id int
-	product_name string
-	project_brand string
+	id               int
+	product_name     string
+	project_brand    string
 	bid_company_name string
-	bid_company_id	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)
@@ -151,4 +137,4 @@ func test() {
 		}
 		log.Debug(info)
 	}
-}
+}