zhengkun 2 лет назад
Родитель
Сommit
8e9644c9ed

+ 4 - 0
data_ylqx/src/dealer.go

@@ -199,3 +199,7 @@ func dealWithRegionCode(area string, city string, district string) (area_code st
 	}
 	return
 }
+
+func testDealerTag() {
+
+}

+ 80 - 0
data_ylqx/src/legal.go

@@ -0,0 +1,80 @@
+package main
+
+import (
+	log "github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson"
+	qu "qfw/util"
+)
+
+//法人基础信息表
+func exportLegalBaseInfo() {
+	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).Sort("_id").Select(map[string]interface{}{
+		"company_id":  1,
+		"dealer_name": 1,
+	}).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); {
+		if total%10000 == 0 {
+			log.Debug("curent index ", total)
+		}
+		company_id := qu.ObjToString(tmp["company_id"])
+		dealer_name := qu.ObjToString(tmp["dealer_name"])
+		createLegalBaseInfo(dealer_name, company_id)
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("经销商信息~~~", total)
+}
+
+func createLegalBaseInfo(company_name string, company_id string) {
+	info := map[string]interface{}{}
+	info["company_name"] = company_name
+	info["company_id"] = company_id
+	infoArr, _ := Qyxy_Mgo.Find("qyxy_std", map[string]interface{}{"company_name": company_name}, nil, nil)
+	if len(infoArr) > 0 {
+		ind := getOneBaseCompany(infoArr)
+		tmp := infoArr[ind]
+		info["company_code"] = qu.ObjToString(tmp["company_code"])
+		info["credit_no"] = qu.ObjToString(tmp["credit_no"])
+		info["org_code"] = qu.ObjToString(tmp["org_code"])
+		info["tax_code"] = qu.ObjToString(tmp["tax_code"])
+		info["establish_date"] = qu.ObjToString(tmp["establish_date"])
+		info["legal_person"] = qu.ObjToString(tmp["legal_person"])
+		info["legal_person_caption"] = qu.ObjToString(tmp["legal_person_caption"])
+		info["company_status"] = qu.ObjToString(tmp["company_status"])
+		info["company_type"] = qu.ObjToString(tmp["company_type"])
+		info["authority"] = qu.ObjToString(tmp["authority"])
+		info["issue_date"] = qu.ObjToString(tmp["issue_date"])
+		info["operation_startdate"] = qu.ObjToString(tmp["operation_startdate"])
+		info["operation_enddate"] = qu.ObjToString(tmp["operation_enddate"])
+
+		data := Spi_Mgo.FindOne("company_base", bson.M{"company_id": company_id})
+		new_capital := qu.ObjToString(data["capital"])
+		info["capital"] = new_capital
+
+		info["company_address"] = qu.ObjToString(tmp["company_address"])
+		info["business_scope"] = qu.ObjToString(tmp["business_scope"])
+		info["cancel_date"] = qu.ObjToString(tmp["cancel_date"])
+		info["cancel_reason"] = qu.ObjToString(tmp["cancel_reason"])
+		info["revoke_date"] = qu.ObjToString(tmp["revoke_date"])
+		info["revoke_reason"] = qu.ObjToString(tmp["revoke_reason"])
+		info["legal_person_type"] = qu.IntAll(tmp["legal_person_type"])
+		info["real_capital"] = qu.ObjToString(tmp["real_capital"])
+		info["list_code"] = qu.ObjToString(tmp["list_code"])
+
+		//区域代码
+		area_code, _, _ := dealWithRegionCode(qu.ObjToString(tmp["company_area"]), qu.ObjToString(tmp["company_city"]), qu.ObjToString(tmp["company_district"]))
+		info["area_code"] = area_code
+
+		info["employee_no"] = qu.IntAll(tmp["employee_num"])
+		info["company_phone"] = qu.ObjToString(tmp["company_phone"])
+		info["insurance_amount"] = qu.ObjToString(tmp["employee_num"])
+		info["company_email"] = qu.ObjToString(tmp["company_email"])
+		info["website"] = qu.ObjToString(tmp["website_url"])
+		info["sourcetype"] = 1
+
+		Save_Mgo.Save("nmpa_legal_baseinfo", info)
+	}
+}

+ 19 - 2
data_ylqx/src/main.go

@@ -1,5 +1,10 @@
 package main
 
+import (
+	log "github.com/donnie4w/go-logger/logger"
+	elastic_v7 "qfw/util/elastic_v7"
+)
+
 func init() {
 	IsLocal = true
 	initClass()
@@ -10,14 +15,26 @@ func main() {
 	//splitMergeMedicalInfo("nmpa_ylqx_2022")
 	//splitMergeMedicalInfo("nmpa_ylqx_2023")
 
+	//临时处理
+
 	//exportDealerBaseInfo()
 	//exportDealerRegisterInfo()
-	exportProductBaseInfo()
+	//exportProductBaseInfo()
+	//exportLegalBaseInfo()
 
 	//确认分类
-	//confirmYlqxInfoClass()
+	confirmYlqxInfoClass()
+
+	//临时邮件
 	//testInvestInfo()
 
 	lock := make(chan bool)
 	<-lock
 }
+
+func test() {
+	elastic_v7.InitElasticSize("http://127.0.0.1:13002", 10, "es_all", "TopJkO2E_d1x")
+	query := `{"query":{"filtered":{"filter":{"bool":{"must":[{"term":{"buyer":"成都东部新区管理委员会"}}]}}}},"_source":["_id","area","buyer"],"from":"0","size":"10"}`
+	es_data := *elastic_v7.Get("bidding", "bidding", query)
+	log.Debug("当前查询结果:", len(es_data))
+}

+ 151 - 306
data_ylqx/src/remarks.go

@@ -9,87 +9,6 @@ import (
 	"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": "骨科手术器械",
-	}
-	rangeRelation = map[string]string{
-		"6801": "无源手术器械",
-		"6831": "X射线附属及辅助设备",
-		"6812": "妇产科、辅助生殖和避孕器械",
-		"6813": "妇产科手术器械",
-		"6810": "骨科手术器械",
-		"6824": "光治疗设备",
-		"6854": "呼吸、麻醉和急救器械",
-		"6856": "呼吸、麻醉和急救器械",
-		"6806": "口腔科器械",
-		"6855": "口腔科器械",
-		"6863": "口腔科器械",
-		"6840": "临床检验器械",
-		"6841": "临床检验器械",
-		"6803": "神经和心血管手术器械",
-		"6807": "神经和心血管手术器械",
-		"6877": "神经和心血管手术器械-心血管介入器械",
-		"6845": "输血、透析和体外循环器械",
-		"6805": "无源手术器械",
-		"6809": "无源手术器械",
-		"6808": "无源手术器械",
-		"6816": "无源手术器械",
-		"6846": "无源植入器械",
-		"6826": "物理治疗器械",
-		"6804": "眼科器械",
-		"6857": "医疗器械消毒灭菌器械",
-		"6822": "医用成像器械",
-		"6828": "医用成像器械",
-		"6833": "医用成像器械",
-		"6870": "医用软件",
-		"6834": "医用射线防护设备",
-		"6820": "医用诊察和监护器械",
-		"6821": "医用诊察和监护器械",
-		"6827": "中医器械",
-		"6815": "注射、穿刺器械",
-		"6864": "注输、护理和防护器械",
-	}
-	productTemp  = map[string]string{}
-	companyTemp  = map[string]string{}
-	YlqxCodeName = map[string]string{}
-	YlqxNameCode = map[string]string{}
-
-	ScRangeReg1   = regexp.MustCompile("(\\d{2}|\\d{4})-(\\d{2}|\\d{1})([\\s -::]+)?([\u4e00-\u9fa5()、()/\\s ]+)")
-	ScRangeReg2   = regexp.MustCompile("\\d{2}([\\s -::]+)?([\u4e00-\u9fa5()、()/\\s ]+)")
-	ScRangeClean1 = regexp.MustCompile("[\\s ]+")
-	ScRangeClean2 = regexp.MustCompile("(生产范围).*")
-	JyRangeReg1   = regexp.MustCompile("(6801|6831|6812|6813|6810|6824|6854|6856|6806|6855|6863|6840|6841|6803|6807|6877|6845|6805|6809|6808|6816|6846|6826|6804|6857|6822|6828|6833|6870|6834|6820|6821|6827|6815|6864)")
-	SpecRangeReg  = regexp.MustCompile("(检测试剂|试剂盒|抗体试剂|保存试剂|提取试剂)")
-)
-
 func confirmYlqxInfoClass() {
 	loadYlqxInfo()
 	confirmFirst()
@@ -97,25 +16,17 @@ func confirmYlqxInfoClass() {
 	confirmThird()
 	confirmFourth()
 	confirmFifth()
-
-}
-
-//加载医疗器械代码
-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))
+	confirmSixth()
+	confirmSeventh()
+	log.Debug("彻底结束~~~")
 }
 
 //医疗分类打标记
 func confirmFirst() {
 	isok := 0
-	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{"product_name": 1})
+	dataArr, _ := Save_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 != "" {
@@ -126,6 +37,7 @@ func confirmFirst() {
 		if code := YlqxNameCode[product_name]; code != "" {
 			isok++
 			_, update := calculationYlqxCode(code)
+			update["isFlag"] = flagTagLog("", "1")
 			Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
 				"$set": update,
 			})
@@ -134,33 +46,21 @@ func confirmFirst() {
 	log.Debug("is over ... ", isok)
 	time.Sleep(time.Second * 2)
 }
-func calculationYlqxCode(yl_code string) (bool, 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 false, update
-	}
-	return true, update
-}
 func confirmSecond() {
 	codeReg := regexp.MustCompile("20\\d{3}(\\d{2})")
 	isok := 0
-	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{"reg_no": 1, "classify": 1})
+	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{
+		"reg_no":             1,
+		"classify":           1,
+		"product_class_code": 1,
+		"isFlag":             1,
+	})
 	for _, v := range dataArr {
 		tmpid := BsonTOStringId(v["_id"])
+		product_class_code := qu.ObjToString(v["product_class_code"])
+		if product_class_code != "" {
+			continue
+		}
 		reg_no := qu.ObjToString(v["reg_no"])
 		classify := qu.ObjToString(v["classify"])
 		if strings.Contains(classify, "注册") {
@@ -168,10 +68,14 @@ func confirmSecond() {
 			if code_str != "" {
 				code := codeReg.ReplaceAllString(code_str, "${1}")
 				name := codeRelation[code]
-				if name != "" {
+				if name != "" && code != "" {
 					isok++
 					Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
-						"$set": bson.M{"product_class_1": name},
+						"$set": bson.M{
+							"product_class_1":    name,
+							"product_class_code": YlqxNameCode[name],
+							"isFlag":             flagTagLog(qu.ObjToString(v["isFlag"]), "2"),
+						},
 					})
 				}
 			}
@@ -182,14 +86,22 @@ func confirmSecond() {
 }
 func confirmThird() {
 	isok := 0
-	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{"product_name": 1, "product_class_1": 1})
+	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{
+		"product_name":    1,
+		"product_class_1": 1,
+		"isFlag":          1,
+	})
 	for _, v := range dataArr {
 		tmpid := BsonTOStringId(v["_id"])
 		product_name := qu.ObjToString(v["product_name"])
 		product_class_1 := qu.ObjToString(v["product_class_1"])
 		if product_class_1 == "" && strings.Contains(product_name, "试剂") {
 			Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
-				"$set": bson.M{"product_class_1": "体外诊断试剂"},
+				"$set": bson.M{
+					"product_class_1":    "体外诊断试剂",
+					"product_class_code": "23",
+					"isFlag":             flagTagLog(qu.ObjToString(v["isFlag"]), "3"),
+				},
 			})
 			isok++
 		}
@@ -199,233 +111,166 @@ func confirmThird() {
 func confirmFourth() {
 	isok := 0
 	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{
-		"reg_company":     1,
-		"product_name":    1,
-		"product_class_1": 1,
-		"product_class_2": 1,
+		"reg_company":        1,
+		"product_name":       1,
+		"product_class_1":    1,
+		"product_class_2":    1,
+		"product_class_code": 1,
+		"isFlag":             1,
 	})
 	for _, v := range dataArr {
 		tmpid := BsonTOStringId(v["_id"])
 		old_name := qu.ObjToString(v["product_name"])
+		old_class_code := qu.ObjToString(v["product_class_code"])
 		reg_company := qu.ObjToString(v["reg_company"])
 		old_class_1 := qu.ObjToString(v["product_class_1"])
 		old_class_2 := qu.ObjToString(v["product_class_2"])
 		if old_class_2 != "" {
 			continue
 		}
-		resArr := calculationYlqxScRange(reg_company, old_class_1, old_name)
-		b, res := checkYlqxResultRight(resArr, old_class_1)
-		if b && res != nil && tmpid != "" {
-			isok++
-			Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
-				"$set": res,
-			})
+		resArr, codeArr := calculationYlqxScRange(reg_company, old_class_1, old_name)
+		b, res, code := checkYlqxResultRightFourth(resArr, codeArr, old_class_1)
+		if b && res != nil && code != "" && tmpid != "" {
+			if len(code) > len(old_class_code) {
+				isok++
+				res["product_class_code"] = code
+				res["isFlag"] = flagTagLog(qu.ObjToString(v["isFlag"]), "4")
+				Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
+					"$set": res,
+				})
+			}
 		}
 	}
 	log.Debug("is over ... ", isok)
 	time.Sleep(time.Second * 2)
 }
 func confirmFifth() {
+	temp := loadFifthInfo()
 	isok := 0
 	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{
-		"reg_company":     1,
-		"product_name":    1,
-		"product_class_1": 1,
-		"product_class_2": 1,
+		"product_name":       1,
+		"product_class_1":    1,
+		"product_class_2":    1,
+		"product_class_code": 1,
+		"isFlag":             1,
 	})
 	for _, v := range dataArr {
 		tmpid := BsonTOStringId(v["_id"])
 		old_name := qu.ObjToString(v["product_name"])
-		reg_company := qu.ObjToString(v["reg_company"])
+		old_class_code := qu.ObjToString(v["product_class_code"])
 		old_class_1 := qu.ObjToString(v["product_class_1"])
 		old_class_2 := qu.ObjToString(v["product_class_2"])
-		if old_class_2 != "" {
+		if old_class_2 != "" || tmpid == "" {
 			continue
 		}
-		resArr := calculationYlqxJyRange(reg_company, old_class_1, old_name)
-		b, res := checkYlqxResultRight(resArr, old_class_1)
-		if b && res != nil && tmpid != "" {
-			isok++
-			Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
-				"$set": res,
-			})
-		}
-		//Sour_Mgo.Save("123456", map[string]interface{}{
-		//	"_id":   v["_id"],
-		//	"name":  old_name,
-		//	"class": old_class_1,
-		//	"res":   res,
-		//})
-	}
-	log.Debug("is over ... ", isok)
-	time.Sleep(time.Second * 2)
-}
-func calculationYlqxScRange(company string, old_class string, old_name string) []map[string]interface{} {
-	dataArr, _ := Save_Mgo.Find("nmpa_company_new", bson.M{"company": company}, nil, bson.M{"product_range": 1})
-	infos := []map[string]interface{}{}
-	for _, v := range dataArr {
-		product_range := qu.ObjToString(v["product_range"])
-		matchArr1 := ScRangeReg1.FindAllString(product_range, -1)
-		if len(matchArr1) > 0 {
-			for _, v1 := range matchArr1 {
-				name := ScRangeReg1.ReplaceAllString(v1, "${4}")
-				name = ScRangeClean1.ReplaceAllString(name, "")
-				name = ScRangeClean2.ReplaceAllString(name, "")
-				b, res := calculationYlqxCode(YlqxNameCode[name])
-				//根据结果校验一下,是否有效合理
-				if b && checkYlqxInfoRight(res, old_class, old_name) {
-					infos = append(infos, res)
-				}
-			}
-		} else {
-			matchArr2 := ScRangeReg2.FindAllString(product_range, -1)
-			for _, v1 := range matchArr2 {
-				if strings.Contains(v1, "分类目录") {
-					continue
-				}
-				name := ScRangeReg2.ReplaceAllString(v1, "${2}")
-				name = ScRangeClean1.ReplaceAllString(name, "")
-				name = ScRangeClean2.ReplaceAllString(name, "")
-				b, res := calculationYlqxCode(YlqxNameCode[name])
-				//根据结果校验一下,是否有效合理
-				if b && checkYlqxInfoRight(res, old_class, old_name) {
-					infos = append(infos, res)
+		if name := temp[old_name]; name != "" {
+			if code := YlqxNameCode[name]; code != "" {
+				b, res := calculationYlqxCode(code)
+				if b && (old_class_1 == "" || (qu.ObjToString(res["product_class_1"]) == old_class_1 && len(code) > len(old_class_code))) {
+					isok++
+					res["isFlag"] = flagTagLog(qu.ObjToString(v["isFlag"]), "5")
+					Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
+						"$set": res,
+					})
 				}
 			}
 		}
+
 	}
-	//进行有效结果去重
-	new_infos := []map[string]interface{}{}
-	temp := map[string]string{}
-	for _, v := range infos {
-		c1, c2 := qu.ObjToString(v["product_class_1"]), qu.ObjToString(v["product_class_2"])
-		c3, c4 := qu.ObjToString(v["product_class_3"]), qu.ObjToString(v["product_class_4"])
-		key := c1 + "~" + c2 + "~" + c3 + "~" + c4 + "~"
-		if temp[key] == "" {
-			new_infos = append(new_infos, v)
-			temp[key] = key
-		}
-	}
-	return new_infos
-	return infos
+	log.Debug("is over ... ", isok)
+	time.Sleep(time.Second * 2)
 }
-func calculationYlqxJyRange(company string, old_class string, old_name string) []map[string]interface{} {
-	dataArr, _ := Save_Mgo.Find("nmpa_company_new", bson.M{"company": company}, nil, bson.M{"business_range": 1})
-	infos := []map[string]interface{}{}
+func confirmSixth() {
+	isok := 0
+	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{
+		"reg_company":        1,
+		"product_name":       1,
+		"product_class_1":    1,
+		"product_class_2":    1,
+		"product_class_code": 1,
+		"isFlag":             1,
+	})
 	for _, v := range dataArr {
-		business_range := qu.ObjToString(v["business_range"])
-		matchArr := JyRangeReg1.FindAllString(business_range, -1)
-		if len(matchArr) > 0 {
-			for _, v1 := range matchArr {
-				name := rangeRelation[v1]
-				b, res := calculationYlqxCode(YlqxNameCode[name])
-				//根据结果校验一下,是否有效合理
-				if b && checkYlqxInfoRight(res, old_class, old_name) {
-					infos = append(infos, res)
-				}
-			}
-		}
-	}
-	//进行有效结果去重
-	new_infos := []map[string]interface{}{}
-	temp := map[string]string{}
-	for _, v := range infos {
-		c1, c2 := qu.ObjToString(v["product_class_1"]), qu.ObjToString(v["product_class_2"])
-		c3, c4 := qu.ObjToString(v["product_class_3"]), qu.ObjToString(v["product_class_4"])
-		key := c1 + "~" + c2 + "~" + c3 + "~" + c4 + "~"
-		if temp[key] == "" {
-			new_infos = append(new_infos, v)
-			temp[key] = key
+		tmpid := BsonTOStringId(v["_id"])
+		old_name := qu.ObjToString(v["product_name"])
+		old_class_code := qu.ObjToString(v["product_class_code"])
+		old_class_1 := qu.ObjToString(v["product_class_1"])
+		old_class_2 := qu.ObjToString(v["product_class_2"])
+		if old_class_2 != "" || tmpid == "" {
+			continue
 		}
-	}
-	return new_infos
-}
-func checkYlqxInfoRight(res map[string]interface{}, class string, name string) bool {
-	if class != "" {
-		if qu.ObjToString(res["product_class_1"]) != class {
-			return false
-		} else {
-			if qu.ObjToString(res["product_class_2"]) == "" {
-				return false
+		new_name := cleanProductName(old_name)
+		if code := YlqxNameCode[new_name]; code != "" {
+			b, res := calculationYlqxCode(code)
+			if b && (old_class_1 == "" || (qu.ObjToString(res["product_class_1"]) == old_class_1 && len(code) > len(old_class_code))) {
+				isok++
+				res["isFlag"] = flagTagLog(qu.ObjToString(v["isFlag"]), "6")
+				Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
+					"$set": res,
+				})
 			}
 		}
 	}
-	if SpecRangeReg.MatchString(name) {
-		if qu.ObjToString(res["product_class_1"]) != "体外诊断试剂" {
-			return false
-		}
-	}
-	return true
-}
-func checkYlqxResultRight(resArr []map[string]interface{}, old_class string) (bool, map[string]interface{}) {
-	if len(resArr) == 0 {
-		return false, map[string]interface{}{}
-	}
-	if len(resArr) == 1 {
-		return true, resArr[0]
-	}
-	if old_class != "" {
-		return false, map[string]interface{}{}
-	}
-	infos := map[string]int{}
-	for _, v := range resArr {
-		key := qu.ObjToString(v["product_class_1"])
-		num := qu.IntAll(infos[key])
-		infos[key] = num + 1
-	}
-	new_class := ""
-	count := 0
-	for k, v := range infos {
-		if v > count {
-			new_class = k
-			count = v
-		} else if v == count {
-			new_class = ""
-		} else {
-
-		}
-	}
-	if new_class != "" {
-		return true, map[string]interface{}{"product_class_1": new_class}
-	}
-	return false, map[string]interface{}{}
+	log.Debug("is over ... ", isok)
+	time.Sleep(time.Second * 2)
 }
-
-//拆分合并医疗产品与企业信息
-func splitMergeMedicalInfo(coll string) {
-	sess := Old_Mgo.GetMgoConn()
-	defer Old_Mgo.DestoryMongoConn(sess)
-	q, total := map[string]interface{}{}, 0
-	it := sess.DB(Old_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{})
+func confirmSeventh() {
+	isok := 0
+	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{
+		"reg_company":     1,
+		"product_name":    1,
+		"product_class_1": 1,
+		"product_class_2": 1,
+		"isFlag":          1,
+	})
+	for _, v := range dataArr {
+		tmpid := BsonTOStringId(v["_id"])
+		old_name := qu.ObjToString(v["product_name"])
+		old_class_code := qu.ObjToString(v["product_class_code"])
+		old_class_1 := qu.ObjToString(v["product_class_1"])
+		old_class_2 := qu.ObjToString(v["product_class_2"])
+		if old_class_2 != "" || tmpid == "" {
 			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)
+		new_name := cleanProductName(old_name)
+		resArr := []map[string]interface{}{}
+		codeArr := []string{}
+		matchArr := []string{}
+		logArr := []map[string]interface{}{}
+		if new_name != "" {
+			for k1, v1 := range YlqxNameCode {
+				if (new_name == "医用退热凝胶" && k1 == "凝胶") || k1 == "蜡" {
+					continue
 				}
-			}
-		} 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)
+				if strings.Contains(new_name, k1) || strings.Contains(k1, new_name) {
+					b, res := calculationYlqxCode(YlqxNameCode[k1])
+					if b && checkYlqxInfoRight(res, old_class_1, old_name) {
+						logArr = append(logArr, map[string]interface{}{
+							"name":  k1,
+							"code":  v1,
+							"class": res,
+						})
+						resArr = append(resArr, res)
+						codeArr = append(codeArr, YlqxNameCode[k1])
+						matchArr = append(matchArr, k1)
+					}
 				}
 			}
 		}
-		tmp = make(map[string]interface{})
+		if len(resArr) > 0 {
+			resArr, codeArr, matchArr = resultRepeat(resArr, codeArr, matchArr)
+			resArr, codeArr, matchArr = resultMerge(resArr, codeArr, matchArr)
+			//根据结果进行-分类选取逻辑
+			b, res, code := checkYlqxResultRightSeventh(resArr, codeArr, matchArr, old_class_1)
+			if b && res != nil && tmpid != "" && len(code) > len(old_class_code) {
+				isok++
+				res["isFlag"] = flagTagLog(qu.ObjToString(v["isFlag"]), "7")
+				Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
+					"$set": res,
+				})
+			}
+		}
 	}
-	log.Debug("is over ", total)
+	log.Debug("is over ... ", isok)
+	time.Sleep(time.Second * 2)
 }

+ 1500 - 0
data_ylqx/src/remarks_method.go

@@ -0,0 +1,1500 @@
+package main
+
+import (
+	log "github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson"
+	qu "qfw/util"
+	"regexp"
+	"strings"
+	"unicode/utf8"
+)
+
+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": "骨科手术器械",
+	}
+	rangeRelation = map[string]string{
+		"6801": "无源手术器械",
+		"6831": "X射线附属及辅助设备",
+		"6812": "妇产科、辅助生殖和避孕器械",
+		"6813": "妇产科手术器械",
+		"6810": "骨科手术器械",
+		"6824": "光治疗设备",
+		"6854": "呼吸、麻醉和急救器械",
+		"6856": "呼吸、麻醉和急救器械",
+		"6806": "口腔科器械",
+		"6855": "口腔科器械",
+		"6863": "口腔科器械",
+		"6840": "临床检验器械",
+		"6841": "临床检验器械",
+		"6803": "神经和心血管手术器械",
+		"6807": "神经和心血管手术器械",
+		"6877": "神经和心血管手术器械-心血管介入器械",
+		"6845": "输血、透析和体外循环器械",
+		"6805": "无源手术器械",
+		"6809": "无源手术器械",
+		"6808": "无源手术器械",
+		"6816": "无源手术器械",
+		"6846": "无源植入器械",
+		"6826": "物理治疗器械",
+		"6804": "眼科器械",
+		"6857": "医疗器械消毒灭菌器械",
+		"6822": "医用成像器械",
+		"6828": "医用成像器械",
+		"6833": "医用成像器械",
+		"6870": "医用软件",
+		"6834": "医用射线防护设备",
+		"6820": "医用诊察和监护器械",
+		"6821": "医用诊察和监护器械",
+		"6827": "中医器械",
+		"6815": "注射、穿刺器械",
+		"6864": "注输、护理和防护器械",
+	}
+	productTemp  = map[string]string{}
+	companyTemp  = map[string]string{}
+	YlqxCodeName = map[string]string{}
+	YlqxNameCode = map[string]string{}
+
+	ScRangeReg1   = regexp.MustCompile("(\\d{2}|\\d{4})-(\\d{2}|\\d{1})([\\s -::]+)?([\u4e00-\u9fa5()、()/\\s ]+)")
+	ScRangeReg2   = regexp.MustCompile("\\d{2}([\\s -::]+)?([\u4e00-\u9fa5()、()/\\s ]+)")
+	ScRangeClean1 = regexp.MustCompile("[\\s ]+")
+	ScRangeClean2 = regexp.MustCompile("(生产范围).*")
+	SpecRangeReg  = regexp.MustCompile("(检测试剂|试剂盒|抗体试剂|保存试剂|提取试剂)")
+)
+
+var cleanPN0 = regexp.MustCompile("[ \\s]+")
+var cleanPN1 = regexp.MustCompile("[\u30A0-\u30FF]+")
+var cleanPN2 = regexp.MustCompile("([A-Za-z]+)$")
+var cleanPN3 = regexp.MustCompile("[()()]+")
+var cleanPN4 = regexp.MustCompile("^([0-9]+)")
+
+//清洗产品名称
+func cleanProductName(product_name string) string {
+	product_name = cleanPN0.ReplaceAllString(product_name, "")
+	product_name = cleanPN1.ReplaceAllString(product_name, "")
+	product_name = cleanPN2.ReplaceAllString(product_name, "")
+	product_name = cleanParenthesesName(product_name)
+	product_name = cleanPN4.ReplaceAllString(product_name, "")
+	return product_name
+}
+func cleanParenthesesName(name string) string {
+	indexArr := cleanPN3.FindAllStringIndex(name, -1)
+	strArr, start, end := []string{}, 0, 0
+	for k, v := range indexArr {
+		if k%2 == 0 {
+			start, end = 0, 0
+			start = v[0]
+		} else {
+			end = v[1]
+			str := name[start:end]
+			strArr = append(strArr, str)
+		}
+	}
+	for _, v := range strArr {
+		name = strings.ReplaceAll(name, v, "")
+	}
+	return name
+}
+
+//加载医疗器械代码
+func loadYlqxInfo() {
+	ylqxs := *MysqlMedicalTool.Find("code_productclass", nil, "", "", -1, -1)
+	for _, v := range ylqxs {
+		name := qu.ObjToString(v["name"])
+		code := qu.ObjToString(v["code"])
+		if name != "" && code != "" {
+			YlqxCodeName[code] = name
+			YlqxNameCode[name] = code
+		}
+	}
+	log.Debug("产品数量~", len(YlqxCodeName))
+}
+func loadFifthInfo() map[string]string {
+	info := map[string]string{}
+	arr1 := []string{
+		"手术刀、疣体剥离刀、皮屑刮刀",
+		"手术刀片",
+		"手术刀柄、刀片夹持器",
+		"备皮刀",
+		"医用剪、基础外科用剪、组织剪、手术剪、精细剪、精细手术剪、不锈钢手术剪",
+		"拆线剪、纱布绷带剪",
+		"止血钳、蚊式止血钳、血管钳、微血管止血钳",
+		"组织钳、小切口组织钳、微针钳、异物钳、子弹钳、淋巴结钳、取样钳、分离结扎钳、息肉钳",
+		"器械钳、持针钳、持针器、微血管持针钳、硬质合金镶片持针钳、小切口持针钳、皮管钳、置放钳、夹持钳、夹持器、结扎钳、帕巾钳、海绵钳",
+		"施夹钳(不带夹)、施夹器",
+		"拆钉钳、拆钉器、拆针器",
+		"组织镊、医用镊",
+		"探针、外科手术探针",
+		"刺探针",
+		"拔松针",
+		"钩针",
+		"动脉瘤针",
+		"医用拉钩、基础外科用钩、拉钩、创口钩、扁平拉钩、皮肤拉钩、手术拉钩、双头拉钩、组织拉钩",
+		"外科牵开器、钳式牵开器",
+		"刮匙、皮肤刮匙",
+		"皮肤组织钻孔器",
+		"剥离器、医用剥离器、软组织剥离器",
+		"吸引管、外科吸引管、吸引头、医用吸引头",
+		"显微刀、显微喉刀",
+		"显微剪、显微组织剪、显微枪形手术剪、显微喉剪",
+		"显微钳、显微喉钳、微持针钳",
+		"显微镊、显微组织镊、显微持针镊",
+		"显微止血夹",
+		"显微针、显微耳针、显微喉针",
+		"显微平头冲洗针",
+		"显微钩、显微耳钩、显微喉钩",
+		"显微冲洗吸引管、显微喉用冲洗吸引管",
+		"显微剥离器、显微喉剥离器",
+		"动脉瘤夹钳、银夹钳、头皮夹钳、U型夹钳",
+		"脑乳突牵开器、软轴牵开器、后颅凹牵开器",
+		"颈椎牵开器",
+		"颅骨牵引器",
+		"手摇颅骨钻、颅骨钻",
+		"颅骨线锯条",
+		"线锯导引器",
+		"脑压板",
+		"手术用头架、手术头架",
+		"眼内膜刀、扩口刀、眼科手术刀、显微眼用刀",
+		"眼科手术刀片",
+		"眼科手术刀柄",
+		"眼用剪、角膜剪、虹膜剪、巩膜剪、结膜剪、囊膜剪、膜状内障剪、眼内剪、小梁剪、显微眼用手术剪、显微眼用剪、显微虹膜剪",
+		"眼科镊、虹膜镊、视网膜镊、角膜移植镊、膜瓣镊、医用睫毛镊、眼内异物镊、睑板腺囊肿镊、剥膜镊、晶体植入镊、晶体折叠镊、碎核镊、抱核镊、撕囊镊、辅助夹持镊、翻眼镊、角膜固定镊、巩膜塞夹持镊、显微结膜镊、显微眼内鳄鱼镊、显微眼内非对称性视网膜镊、显微眼内镐头镊、显微眼内内界膜镊、显微眼内钳式镊、显微眼内视网膜镊、显微眼用镊、显微虹膜镊",
+		"系线镊、缝线结扎镊、弹簧镊、眼用结扎镊",
+		"眼科钳、眼用止血钳、显微眼用钳",
+		"小梁切开器、巩膜咬切器",
+		"眼用持针钳、眼用显微持针钳",
+		"泪囊拉钩、斜视钩、眼睑拉钩、眼内膜钩、视网膜钩、虹膜拉钩、角膜上皮扒钩、角膜线钩、角膜异物钩、晶体定位钩、眼科手术辅助用钩、显微眼用钩具",
+		"眼用破囊针、眼用注液针、眼用放液针、泪道探针、角膜异物针、冲洗针",
+		"眼用笛针",
+		"角膜上皮环锯、角膜环钻",
+		"注吸器、注吸冲洗器、冲洗器",
+		"冲洗器手柄、注吸器手柄",
+		"晶体线环",
+		"泪点扩张器、泪小点扩张器、显微眼用泪道扩张器",
+		"开睑器",
+		"泪囊牵开器",
+		"眼球固定器",
+		"眼用测量规、眼用测量器、眼用测量尺、眼窝测量球",
+		"眼用刮匙",
+		"双头片铲、眼内膜铲",
+		"角膜异物铲",
+		"碎核垫板、单头碎核垫板",
+		"巩膜剥离子、眼用巩膜剥离器",
+		"扁桃体刀、扁桃体切除器、耳鼓膜刀、耳道皮瓣刀、盒式切除刀、鼻粘膜刀、鼻中隔旋转刀",
+		"鼻骨凿、乳突骨凿、耳用骨凿、鼻中隔凿",
+		"耳息肉剪、镫骨足弓剪、耳用槌骨咬骨剪、耳剪、中耳剪、槌骨剪",
+		"鼻剪、鼻组织剪、鼻粘膜剪、鼻中隔骨剪",
+		"喉剪、甲状腺剪、扁桃体剪",
+		"耳钳、中耳息肉钳、耳异物钳、耵聍钳",
+		"鼻组织钳、鼻筛窦钳、鼻咬切钳、鼻咽活体取样钳、鼻粘膜钳、鼻(窦)息肉钳、鼻腔填塞钳、鼻骨复位钳、上颌窦咬骨钳、蝶窦咬骨钳、鼻中隔咬骨钳、上颌窦止血钳",
+		"鼻息肉圈断器",
+		"喉用钳、间接喉钳、喉分离钳、喉息肉钳、喉取样钳、异物喉钳、粘膜抓钳、扁桃体用钳",
+		"耳用镊、耳用膝状镊、鼻用镊",
+		"耳钩、耵聍钩、甲状腺拉钩、扁桃体拉钩、鼻腔拉钩",
+		"上颌窦探针、耳用探针、鼻穿刺针",
+		"内耳张开器",
+		"乳突牵开器、鼻腔撑开器、鼻窥器",
+		"五官科吸引管、鼻腔吸引管、扁桃体吸引管、鼻窦冲吸器",
+		"鼻剥离器、鼻骨膜剥离器、鼻中隔剥离器",
+		"鼻骨锉",
+		"鼻骨锤",
+		"牙龈刀、软组织环切刀、牙用刀、牙用手术刀、拔牙刀",
+		"牙骨凿、牙釉凿、阻生牙骨凿",
+		"牙科剪、牙龈剪",
+		"咬骨钳、牙槽咬骨钳、拔牙钳、舌钳、切断钳、切断牙钳、正颌专用钳",
+		"正畸钳、正畸切断钳、正畸弯制钳、粘合锁槽去除钳、正畸带环安置夹钳、磨牙带环就位器",
+		"牙用镊、牙科镊",
+		"成形片夹",
+		"颌部组织拉钩、口角拉钩",
+		"拔髓针",
+		"牙周袋探针、牙用探针、牙探针",
+		"根管扩大针、根管锉",
+		"牙周锉、牙骨锉、牙用锉",
+		"扭力扳手、螺丝起",
+		"上颌窦提升器、置骨器、牙科种植定位器",
+		"牙种植导向模板、种植用手术导板",
+		"橡皮障",
+		"橡皮障打孔器",
+		"橡皮障夹",
+		"橡皮障夹钳",
+		"橡皮障支架",
+		"牙用尺、牙用测力计",
+		"牙挺、牙根尖挺、丁字形牙挺",
+		"牙用充填器、银汞合金充填器、水门汀充填器、牙胶充填器、根管充填器、牙科树脂充填器、排龈线填塞器、粘固粉充填器",
+		"牙用输送器、银汞合金输送器、汞合金输送器、树脂输送器、硅橡胶输送器",
+		"牙用分离器、牙龈分离器",
+		"口镜",
+		"颌外牵引装置、唇颊牵开器、上颌窦牵开器",
+		"口腔冲洗器、牙龈冲洗器",
+		"口腔开口器、丁字式开口器、双头开口器",
+		"洁治器、刮治器",
+		"牙刮匙",
+		"研光器",
+		"剔挖器、挖匙",
+		"去冠器",
+		"牙骨锤",
+		"牙正畸结扎器",
+		"胸骨刀",
+		"心脏手术剪、胸骨剪、肋骨剪",
+		"心房持针钳、结扎钳、胸腔组织钳、三角肺叶钳、双关节肋骨咬骨钳、咬骨钳、直视大型肺叶钳",
+		"胸腔止血钳",
+		"凹凸齿止血夹",
+		"胸腔镊、胸腔组织镊、肺组织镊",
+		"心房拉钩、心室拉钩、二尖瓣膜拉钩",
+		"双头剥离匙",
+		"肋骨骨膜剥离器、内膜剥离器",
+		"肋骨合拢器",
+		"腹部用直视直剪、腹部用直视弯剪、双向剪、组织剪、腹部用双动直剪、腹部用双动弯剪、腹部用直剪、腹部用钩剪",
+		"分离钳、三叶钳、三叶扇形钳、五叶扇形钳、五叶钳、无齿钳、牵引钳、腹膜钳、V形钳、O形钳、器官固定钳、剥离钳、扳克钳、撑开钳、大型分离钳、胆囊钳、胆管钳、钝头钳、中空竖齿钳、中空横齿钳、胃钳、芯轴钳、脾蒂钳、抵钉座对合钳、活检钳、取石钳、造影钳、抓钳、阑尾肠钳",
+		"钛夹钳施、夹钳(不带夹)",
+		"荷包钳、取物钳、钉座夹持钳、持针钳、缝合钳",
+		"大腹钩、前列腺拉钩、胆道拉钩、腹部拉钩、腹壁拉钩、阑尾拉钩、深部拉钩、悬吊拉钩、活动拉钩、S状拉钩、L状拉钩、导光拉钩、腹部外科用拉钩、小切口拉钩、万向拉钩、直角拉钩",
+		"气腹针",
+		"腹部手术牵开器、下腹部牵开器、腹部手术单侧牵开器、可调式腹壁牵开器、框架式牵开器、环形牵开器、和式牵开器、腹壁牵开器、腹壁固定牵开器",
+		"胆石匙 、胆囊刮匙",
+		"荷包成型器",
+		"腹腔吸引管",
+		"压肠板",
+		"拉钩装置器",
+		"胆道探条",
+		"前列腺剪",
+		"肠剪",
+		"爪钳、痔核钳、抓钳肠钳",
+		"膀胱肿瘤钳、输尿管夹持钳、膀胱钳、后尿道钳、膀胱颈钳、前列腺组织钳",
+		"取石钳、肾石钳、膀胱取石钳、碎石钳",
+		"痔漏探针、导引针、肛门探针",
+		"前列腺拉钩、膀胱拉钩、肾盂拉钩、肾窦拉钩",
+		"膀胱前列腺牵开器、肛门牵开器、尿道扩张器 、扩肛器",
+		"肛门镜、塑制肛门镜、不锈钢肛门镜、窥肛器",
+		"阴茎夹",
+		"全玻璃灌肠器",
+		"医用排便清肠器",
+		"截断刀、截骨刀、胫骨切刀、胫骨切割器、半月板刀、骨刀、削切刀",
+		"髓腔铰刀、加压螺纹钉铰刀、骨铰刀",
+		"髓腔扩大器、柔性扩髓器",
+		"石膏刀",
+		"骨用丝锥、丝攻",
+		"骨锥、开口锥",
+		"骨科用螺丝刀",
+		"导钻",
+		"骨科钻头、铰孔钻、骨钻",
+		"手摇颅骨钻",
+		"手枪式手摇骨钻、手摇式骨钻、弓形钻",
+		"埋头钻",
+		"髋关节成型凹凸钻",
+		"髓腔扩大钻",
+		"骨剪、双关节咬骨剪、双关节棘突骨剪、膝关节韧带手术剪、咬骨剪",
+		"钢丝剪、钢针剪、钛网剪、钛笼剪",
+		"石膏剪",
+		"咬骨钳、腐骨钳、膝关节息肉钳",
+		"骨科用撑开钳、椎体撑开钳、骨科撑开器、骨盆撑开器、股骨撑开器、颈椎撑开器、椎体撑开器、脊柱撑开器",
+		"压缩钳",
+		"持骨钳、髌骨钳、骨科复位钳、骨盆复位钳、三爪骨复位钳、持钉钳、持板钳、持棒钳、持钩钳、螺杆夹持钳、持针钳",
+		"骨克丝钳、钢丝钳、钢针钳、剪切钳、断棒钳、钢丝结扎钳、钢板弯曲钳、弯棒钳、折弯钳",
+		"热弯曲钳",
+		"转棒钳、取出钳",
+		"弓锯、骨锯、指骨锯、胸骨锯",
+		"线锯",
+		"锯片",
+		"线锯条",
+		"石膏锯",
+		"骨凿、小圆刮凿、丁字凿、弧形凿、髋关节成型凿、肘关节肱骨成型骨凿、座导凿、平骨凿、圆骨凿、脱臼凿、峨眉凿",
+		"骨锉、髓腔锉、椎管锉、隧道锉、髋臼锉",
+		"梯形铲",
+		"(单侧)椎板拉钩、半月板钩、下肢截断拉钩、颈椎拉钩、骨拉钩、髋关节拉钩、肩胛骨拉钩、膝关节拉钩",
+		"神经根拉钩",
+		"骨用牵开器、手摇式牵开器、自动牵开器、多(双)向牵开器、可调式牵开器、微创牵开器、胫骨牵开器、关节微创牵开器、后颅牵开器、坐骨神经牵开器、脊柱牵开器、椎板牵开器、颈椎椎体牵开器、颈椎关节牵开器、颈椎组织牵开器、颈椎微创牵开器、环形椎骨牵开器、不对称牵开器、髋关节牵开器、腰椎微创牵开器、手摇式颈椎牵开器",
+		"骨钩",
+		"骨牵引针、加压螺纹钉导引针、骨导引针、骨定位针、固定针",
+		"骨探针",
+		"穿孔针",
+		"钩针",
+		"骨刮匙",
+		"骨膜剥离器(子)、可变神经剥离器(子)、神经剥离器(子)",
+		"电动石膏剪、电动石膏锯、电动石膏切割器",
+		"直径尺、医用尺、角度尺、测深器、骨测量器、试模、填充块、量规",
+		"钢板塑型片",
+		"膝关节伸直间隙评估垫片",
+		"线锯导引器",
+		"骨科定位片、骨科钻孔瞄准器",
+		"钢丝穿引器、钢丝穿孔器",
+		"石膏撑开器",
+		"打入器、打拔器、拔出器、取钉器、螺钉取出器、断钉取出器、髂骨取出器、螺钉打滑取出器、扳手、起子",
+		"持针镊、持钉镊、持钉夹、夹持器",
+		"骨锤、骨撬、撬棒、骨锨",
+		"开路器、打孔器、扩孔器",
+		"植骨漏斗、双室漏斗、弯型漏斗、植骨器、骨移植搅拌器",
+		"骨科吸引器",
+		"骨质活检提取器",
+		"膝关节固定器、肩关节固定器、踝关节固定器、髌骨加压固定器、颈椎固定器、腰椎固定器、足托固定器、臂外展固定器、膝关节加压固定器、骨盆固定器、骨科保护支具、肢体固定器、可调式固定支具、医用外固定支具",
+		"骨把持器、三爪骨把持器、骨折固定夹",
+		"骨折固定夹板、医用高分子夹板、肋骨固定板、医用固定带、胸骨固定板、植骨夹板、医用外固定夹板",
+		"石膏绷带(粉状型)、石膏绷带(粘胶型)",
+		"锁针加压器",
+		"护套、快装手柄",
+		"下肢骨折整复器",
+		"钢板弯曲扳手、钢板弯曲器",
+		"弯棒器",
+		"扭断器、剪断器、剪棒器、断棒器、钢针切断器",
+		"椎弓根钉尾部切断器",
+		"负气压式骨折固定保护气垫",
+		"股骨髓腔对线手柄套",
+		"股骨髓腔探棒",
+		"骨科冲头",
+		"导引袖套、环状套扎器",
+		"碎胎刀",
+		"妇产科用剪、剖腹产剪、会阴剪、阴道环切剪、宫腔手术剪、子宫剪",
+		"脐带剪",
+		"产钳、剖腹产切口钳、妇科组织钳、子宫颈活体取样钳、子宫夹持钳、子宫颈钳、宫腔异物钳、卵巢钳、举宫钳、宫腔活检钳、子宫内取物钳、妇科分离钳",
+		"产钳、头皮钳",
+		"环形输卵管镊",
+		"子宫拉钩、阴道拉钩",
+		"子宫探针",
+		"腹水穿刺针",
+		"侧开式阴道扩张器、双翼阴道扩张器、双翼阴道检查扩张器、双翼阴道手术扩张器",
+		"子宫颈扩张器、阴道牵开器、会阴牵开器",
+		"输卵管通液器",
+		"骨盆测量计",
+		"子宫内膜刮吸管",
+		"子宫拨棒",
+		"阴道压板",
+		"宫颈压板",
+		"刮宫片、宫内刮片",
+		"肌瘤剥离器",
+		"举宫器、可冲洗举宫器、李式举宫器、杯式举宫器",
+		"宫内节育器取出钳、宫内节育器取出钩、宫内节育器放置叉",
+		"输精管分离钳、输精管皮外固定钳",
+		"输卵管提取板",
+		"子宫刮匙、子宫刮",
+		"宫颈刮片",
+		"放气针、输液用放气针",
+		"无针注射推进器、弹簧驱动式无针注射推进器",
+		"辊轴取皮刀、鼻手术刀",
+		"鼻骨凿、指骨凿",
+		"颌骨夹持钳、肌腱夹持钳",
+		"整形镊、皮肤镊、眼睑镊",
+		"唇夹",
+		"鼻骨整形锯锉",
+		"整形分离器、整形肌腱分离器、整形肌腱剥离器",
+		"整形拉钩、光导整形拉钩",
+		"鼓式取皮机、烧伤植皮机",
+		"鼻导引器",
+		"腋臭匙",
+		"鼻假体导引器",
+		"压舌板",
+		"打诊锤、脑打诊锤、叩诊锤",
+		"额戴反光镜",
+		"单用听诊器、二用听诊器、三用听诊器、胎音听诊器",
+		"视力表灯、视力表灯箱",
+		"标准对数视力表、综合视力表、点状视力表",
+		"遮眼板",
+		"幼儿视锐度(视力)检测卡、儿童图形视力卡、婴幼儿选择性注视检测卡",
+		"反光灯、医用检查灯、聚光灯",
+		"医用头灯、额戴式照明灯、头灯",
+		"手术放大镜、医用手术放大镜、双目手术放大镜、头戴式放大镜、医用放大镜",
+		"超声耦合剂、医用超声耦合剂",
+		"火罐、火罐瓶",
+		"真空拔罐器、负压罐、负压拔罐器",
+		"刮痧板、刮痧器、刮痧砭板",
+		"医用X射线胶片、医用X光胶片",
+		"医用红外激光胶片、医用激光胶片、医用干式胶片",
+		"医用中速增感屏、医用高速增感屏、极光增感屏、增感纸、牙用增感屏、钨酸钙中速医用增感屏",
+		"医用透视荧光屏、医用诊断X射线透视荧光屏",
+		"影像板、影像IP板",
+		"手动摄影平床、手动X射线摄影平床",
+		"吊架、立柱/导轨、立式摄片架",
+		"硬拷贝照相机、医用图像打印机、干式激光成像仪",
+		"暗盒、成像板暗盒、暗匣、X射线摄影暗匣",
+		"X射线胶片显影液、X射线胶片定影液、X射线胶片显影粉、X射线胶片定影粉",
+		"X射线胶片观片灯、X射线胶片观片仪、X光片观片灯、X射线胶片观片灯箱",
+		"医用X射线自动洗片机、医用牙科X光胶片全自动冲洗机、全自动洗片机",
+		"放疗用患者体位固定袋、人体定位袋、定位膜、人体定位垫(用于放疗时)",
+		"人体定位袋、人体定位垫(用于诊断时)",
+		"医用射线防护面罩、医用射线防护手套、医用射线防护眼镜、防辐射衣、防辐射帽、防辐射裙、防辐射围领、医用射线防护帘、医用射线性腺防护帘、防辐射背心、医用射线防护玻璃板",
+		"射线防护椅",
+		"医用射线立式摄片架防护装置、医用射线防护悬吊屏风、医用射线防护屏",
+		"全自动电泳仪、电泳仪、电泳装置、全自动毛细管电泳仪",
+		"核酸提纯仪、全自动核酸提取仪、全自动核酸纯化仪、全自动核酸提取纯化仪",
+		"采血笔、扁形采血笔、筒形采血笔、可调式医用采血笔",
+		"切片机、轮转式切片机、手摇切片机、自动切片机、 冷冻切片机",
+		"制片机、自动制片机、液基薄层细胞制片机",
+		"脱水机、组织脱水机、自动组织脱水机",
+		"包埋机、石蜡包埋机、 病理石蜡包埋机",
+		"涂片机、离心涂片机、液基薄层细胞涂片机",
+		"染色机、自动染片机、组织染色机",
+		"免疫组化预处理系统、自动脱蜡抗原修复仪",
+		"医用离心机、高速离心机、高速冷冻离心机、低速离心机、低速冷冻离心机、大容量冷冻离心机",
+		"钠石灰、钙石灰、二氧化碳吸收剂、碱石灰",
+		"普通产床、妇科手术台、妇科检查床、妇产科综合手术台",
+		"普通手术台、简易手术台、手术床、手术台、骨科手术台、眼科手术台",
+		"检查床、诊疗台、诊疗床",
+		"手术辅助照明灯、手术辅助移动式手术照明灯",
+		"转运车、医用转移车、病人推车、病人推床、平车、楼梯担架、担架、折叠担架、担架车、车载担架车、铲式担架、救护车担架、抢救床",
+		"浮标式氧气吸入器、墙式氧气吸入器、手提式氧气吸入器、供氧系统氧气吸入器",
+		"机械牙科椅、简易牙科椅、轻便牙科椅",
+		"牙医师座椅、医师椅",
+		"牙科电动抽吸机、牙科电动抽吸系统",
+		"牙科电动空压机、牙科电动无油空压机",
+		"水枪头、热气枪头",
+		"吸唾管",
+		"抛光杯",
+		"银汞胶囊调合器、银汞合金调合器、银汞调合器",
+		"口腔灯、口腔照明灯",
+		"口腔观察仪",
+		"体外牙胶加热器",
+		"平型病床、医用平床、普通病床",
+		"手动病床、手摇式病床、手摇式二折病床、手摇式三折病床",
+		"婴儿/新生儿床、母婴床、儿童病床",
+		"充气防褥疮床垫、防褥疮气床垫",
+		"病人转移板、移动滑垫、病人转移垫、电动移位机/车",
+		"医用清洗机、超声波清洗机、超声波清洗器、医用超声波清洗机、内镜清洗机、超声清洗器",
+		"医用冷敷贴、医用降温贴、医用退热贴",
+		"医用冰袋、医用冰垫、医用冰帽、医用冷敷头带、医用冷敷眼罩",
+		"吸潮纸尖",
+		"咬合纸",
+		"基托蜡、铸造蜡、预成型蜡、模型蜡、间接嵌体蜡、代型材料、牙科石膏",
+		"石膏铸造包埋材料、磷酸盐铸造包埋材料、硅胶包埋材料、铸钛包埋材料、模型包埋材料",
+		"牙科分离剂",
+		"琼脂复制材料、硅橡胶复制材料、藻酸盐复制材料",
+		"菌斑指示剂、菌斑显示液",
+		"研磨材料、牙科用研磨材料",
+		"刷手衣、洗手衣",
+		"检查手套、检查指套、卫生帽、护士帽",
+		"石膏衬垫",
+		"聚酯衬垫、冷敷隔离垫",
+		"妇科检查垫、医用护理垫(看护垫)",
+		"医用检查垫",
+		"医用体位胶垫",
+		"急救毯",
+		"脱脂棉球、消毒刷(擦拭器)、棉签、棉片",
+		"弹性创可贴、防水创可贴、棉布创可贴、透气创可贴、橡皮膏、创口贴",
+		"弹性绷带、弹力绷带、纱布绷带、无纺布绷带、三角绷带、高分子固定绷带、玻璃纤维绷带、聚酯纤维绷带、聚氨酯衬垫绷带",
+		"压敏胶带、透气胶贴(非织造布胶带)、透气胶带、弹性胶带、网纹易撕胶带、绑扎胶布、弹性柔棉宽胶带、丝绸布胶带、聚乙烯胶带",
+		"压力绷带、乳腺压力绷带、腹股沟压力绷带、腹带",
+		"卡扣式止血带",
+		"疝气带",
+		"引流袋、吸液袋、负压引流器、负压引流(吸引)接管、集尿袋、尿套",
+		"医用导管夹",
+		"造口袋、肛门袋、造口腰带、裤形造口绷带",
+		"咬口、口垫、咬嘴",
+		"洗耳球、医用洗耳球、塑料洗耳球、橡胶洗耳球",
+		"医用阴道洗涤器、医用阴道冲洗器",
+		"髋膝踝足截瘫行走支具",
+		"造口灌洗器",
+		"测瓣器",
+		"医用打印胶片",
+		"医用干式胶片",
+		"一次性雾化吸入管",
+		"四面镜",
+		"斜视检查镜",
+		"手背静脉显像仪",
+		"打磨抛光组件",
+		"倒像镜及装置",
+		"移动式X射线检查支架",
+		"",
+		"血压袖套(带)",
+		"自动血涂片制备仪",
+		"护牙弯角",
+		"孵育器",
+		"持钉器",
+		"医疗废液收集装置:",
+		"超声治疗固定贴",
+		"医用超声耦合贴片",
+		"X线摄片乳头定位贴",
+		"",
+		"医学图像体外定位贴",
+		"",
+		"显影胶带",
+		"",
+		"一次性使用三用喷枪头",
+		"踝关节无创牵引系统",
+		"血管显像仪",
+		"非接触式眼底广角观察镜",
+		"咽喉镜",
+		"医用胶片打印机",
+		"多功能自助取片机:",
+		"心电导联线",
+		"医用X射线立式摄片架防护装置",
+		"X射线防护舱",
+		"放疗定位球",
+		"超声探头穿刺架",
+		"牙钻清洁工具",
+		"隔离透声膜",
+		"冲洗液袋用压力器",
+		"供氧系统氧气吸入器",
+		"支撑喉镜",
+		"医用X射线悬挂防护服装置",
+		"移动式床旁X射线机防护装置",
+		"电动遥控式医用X射线立式摄片架防护装置",
+		"视力表投影仪",
+		"结扎缝合引线器",
+		"肌腱套取器",
+		"气管扩张钳",
+		"拆钉钳",
+		"异物钳",
+		"微创手术扩张钳",
+		"一次性使用敷料镊",
+		"显微血管吻合牵线夹",
+		"卷棉子",
+		"虹膜刀",
+		"截囊刀",
+		"角巩膜缘切开刀",
+		"劈核刀",
+		"眼球摘出剪",
+		"视网膜剥离镊",
+		"眼用四面镜夹持镊",
+		"眼科前房用针",
+		"截囊钩",
+		"视网膜铲",
+		"人工晶体辅助植入器",
+		"巩膜塞",
+		"巩膜压迫器",
+		"眼科微型器械手柄",
+		"角膜标记环",
+		"白内障手术切口测量尺",
+		"咽喉部脓疱切开器",
+		"乳突咬骨钳",
+		"耳止血钳",
+		"镫骨钳",
+		"鼻异物钳",
+		"喉异物钳",
+		"气管导管夹持钳",
+		"内耳手术剥离针",
+		"耳刮匙",
+		"鼻刮匙",
+		"外耳道扩张器",
+		"喉扩张器",
+		"乳突器械敲击锤",
+		"耳息肉圈断器",
+		"扁桃体圈断器",
+		"鼻骨复位器",
+		"喉显微手术器械手柄",
+		"牙科器械钳",
+		"牙科钛板(网)",
+		"针孔镊",
+		"成形片",
+		"成形片夹",
+		"楔子",
+		"楔形保护片",
+		"转移帽",
+		"牙科祛腐工作尖",
+		"根管中器械取出器",
+		"牙科种植体种植工具",
+		"口腔麻醉注射架(不含针头",
+		"旋入扳手",
+		"自锁托槽开启工具",
+		"托槽定位器",
+		"方丝弓成型器",
+		"方丝扭转器",
+		"颌面外科钛板定位器",
+		"颌面外科手术颊部穿通器",
+		"微创手术用胆总管切开刀",
+		"引导棒",
+		"颈椎前路手术定位针",
+		"髓内定位杆",
+		"膝关节植入物试模",
+		"股骨试模",
+		"膝关节间隙评估块",
+		"膝关节伸直间隙评估片",
+		"胫骨冲头",
+		"胫骨冲头导板",
+		"截骨板",
+		"对线杆",
+		"股骨测定导板",
+		"胫骨截骨定位工具",
+		"股骨截骨定位工具",
+		"对线手柄",
+		"固定平台胫骨托试模",
+		"膝关节骨撬",
+		"膝关节手术用打击器",
+		"关节假体夹持器",
+		"上肢关节骨撬",
+		"髋关节骨撬",
+		"膝关节手术通用手柄",
+		"快装手柄",
+		"指骨夹板",
+		"上/下肢医用外固定支具",
+		"颈椎固定带",
+		"腰椎固定带",
+		"子宫深度测量棒",
+		"输卵管提取钩",
+		"注射助推器(不含注射器",
+		"盆底肌肉康复器",
+		"热塑固定板",
+		"外科手术固定装置",
+		"一次性使用捆扎止血带",
+		"硬膜外穿刺体位约束带",
+		"口腔正畸用反光镜",
+		"牙科用毛刷",
+		"造口减压环",
+		"造口凸面嵌圈",
+		"口腔撑开器",
+		"非封闭式负压引流装置产品",
+		"医用冲洗头",
+		"肛门冲洗器",
+		"一次性使用口腔涂药棒",
+		"制片染色一体机",
+		"细胞分离制片染色一体机",
+		"试剂卡孵育器",
+		"细胞过滤采集器",
+		"组织微阵列制作仪",
+		"标本液化处理仪",
+		"全自动推片染片系统",
+		"粪便检验预处理装置",
+		"一次性使用微量采血吸管",
+		"细胞过滤器",
+		"一次性使用细胞过滤采集器",
+		"马镫形多功能腿架",
+		"飞秒透镜分离铲",
+		"飞秒透镜镊",
+		"飞秒分离匙",
+		"位置定位器",
+		"钻针深度停止器",
+		"钻针引导器",
+		"骨磨引导器",
+		"一次性使用胃镜咬口",
+		"种植体扫描体",
+		"机用螺丝刀",
+		"胸腰骶固定器",
+		"一次性五官科清洗套装",
+		"自助取片机",
+		"热敏胶片",
+		"超声波清洗机",
+	}
+	arr2 := []string{
+		"手术器械-刀",
+		"手术器械-刀",
+		"手术器械-其他器械",
+		"手术器械-刀",
+		"手术器械-剪",
+		"手术器械-剪",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-吻(缝)合器械及材料",
+		"手术器械-钳",
+		"手术器械-镊",
+		"手术器械-针",
+		"手术器械-针",
+		"手术器械-针",
+		"手术器械-针",
+		"手术器械-针",
+		"手术器械-钩",
+		"手术器械-牵开器",
+		"手术器械-刮匙",
+		"手术器械-穿刺导引器",
+		"手术器械-剥离器",
+		"手术器械-冲吸器",
+		"手术器械-刀",
+		"手术器械-剪",
+		"手术器械-钳",
+		"手术器械-镊",
+		"手术器械-夹",
+		"手术器械-针",
+		"手术器械-冲吸器",
+		"手术器械-钩",
+		"手术器械-冲吸器",
+		"手术器械-剥离器",
+		"神经和心血管手术器械-钳",
+		"神经和心血管手术器械-牵开器",
+		"骨科用钩",
+		"外固定及牵引器械",
+		"神经和心血管手术器械-穿刺导引器",
+		"神经和心血管手术器械-其他器械",
+		"神经和心血管手术器械-穿刺导引器",
+		"神经和心血管手术器械-牵开器",
+		"神经和心血管手术器械-其他器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科治疗和手术设备、辅助器具",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源手术器械",
+		"手术器械-刀",
+		"手术器械-凿",
+		"手术器械-剪",
+		"手术器械-剪",
+		"手术器械-剪",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-其他器械",
+		"手术器械-钳",
+		"手术器械-镊",
+		"手术器械-钩",
+		"手术器械-针",
+		"手术器械-牵开器",
+		"手术器械-牵开器",
+		"手术器械-冲吸器",
+		"手术器械-剥离器",
+		"手术器械-其他器械",
+		"手术器械-凿",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔植入及组织重建材料",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔诊察器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔诊察器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"神经和心血管手术器械-刀",
+		"神经和心血管手术器械-剪",
+		"神经和心血管手术器械-钳",
+		"神经和心血管手术器械-钳",
+		"神经和心血管手术器械-夹",
+		"神经和心血管手术器械-镊",
+		"神经和心血管手术器械-钩",
+		"手术器械-剥离器",
+		"骨科其他手术器械",
+		"神经和心血管手术器械-其他器械",
+		"手术器械-剪",
+		"手术器械-钳",
+		"手术器械-吻(缝)合器械及材料",
+		"手术器械-钳",
+		"手术器械-钩",
+		"手术器械-针",
+		"手术器械-牵开器",
+		"手术器械-刮匙",
+		"手术器械-钳",
+		"手术器械-冲吸器",
+		"手术器械-牵开器",
+		"手术器械-牵开器",
+		"手术器械-牵开器",
+		"手术器械-剪",
+		"手术器械-剪",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-针",
+		"手术器械-钩",
+		"手术器械-牵开器",
+		"手术器械-其他器械",
+		"手术器械-夹",
+		"清洗、灌洗、吸引、给药器械",
+		"清洗、灌洗、吸引、给药器械",
+		"骨科用刀",
+		"骨科用刀",
+		"创伤外科辅助器械",
+		"骨科用刀",
+		"骨科用锥",
+		"骨科用锥",
+		"基础通用辅助器械",
+		"骨科用钻",
+		"骨科用钻",
+		"神经和心血管手术器械-穿刺导引器",
+		"骨科用钻",
+		"骨科用钻",
+		"骨科用钻",
+		"骨科用钻",
+		"骨科用剪",
+		"骨科用剪",
+		"骨科用剪",
+		"骨科用钳",
+		"骨科用钳",
+		"骨科用钳",
+		"骨科用钳",
+		"骨科用钳",
+		"骨科用钳",
+		"外固定及牵引器械",
+		"骨科用锯",
+		"骨科用锯",
+		"骨科用锯",
+		"骨科用锯",
+		"骨科用锯",
+		"骨科用凿",
+		"骨科用锉、铲",
+		"骨科用锉、铲",
+		"骨科用钩",
+		"骨科用钩",
+		"骨科用钩",
+		"骨科用钩",
+		"骨科用针",
+		"骨科用针",
+		"骨科用针",
+		"骨科用针",
+		"骨科用刮",
+		"骨科其他手术器械",
+		"骨科用有源器械",
+		"基础通用辅助器械",
+		"创伤外科辅助器械",
+		"关节外科辅助器械",
+		"骨科用锯",
+		"基础通用辅助器械",
+		"创伤外科辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"外固定及牵引器械",
+		"创伤外科辅助器械",
+		"外固定及牵引器械",
+		"外固定及牵引器械",
+		"创伤外科辅助器械",
+		"基础通用辅助器械",
+		"创伤外科辅助器械",
+		"创伤外科辅助器械",
+		"创伤外科辅助器械",
+		"创伤外科辅助器械",
+		"脊柱外科辅助器械",
+		"外固定及牵引器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"骨科其他手术器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科测量、监护设备",
+		"手术器械-针",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科测量、监护设备",
+		"妊娠控制器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妇产科诊断器械",
+		"妇产科手术器械",
+		"妇产科手术器械",
+		"妊娠控制器械",
+		"妊娠控制器械",
+		"妊娠控制器械",
+		"妇产科手术器械",
+		"妇产科诊断器械",
+		"血管内输液器械",
+		"注射、穿刺器械",
+		"手术器械-刀",
+		"手术器械-凿",
+		"手术器械-钳",
+		"手术器械-镊",
+		"手术器械-夹",
+		"手术器械-其他器械",
+		"手术器械-剥离器",
+		"手术器械-钩",
+		"手术器械-其他器械",
+		"手术器械-穿刺导引器",
+		"手术器械-刮匙",
+		"手术器械-穿刺导引器",
+		"诊察辅助器械",
+		"诊察辅助器械",
+		"诊察辅助器械",
+		"诊察辅助器械",
+		"视光设备和器具",
+		"视光设备和器具",
+		"视光设备和器具",
+		"视光设备和器具",
+		"诊察辅助器械",
+		"诊察辅助器械",
+		"光学成像诊断设备",
+		"超声影像诊断附属设备",
+		"中医器具",
+		"中医器具",
+		"中医器具",
+		"X射线影像接收处理装置",
+		"图像显示、处理、传输及打印设备",
+		"X射线影像接收处理装置",
+		"X射线影像接收处理装置",
+		"X射线影像接收处理装置",
+		"X射线附属及辅助设备",
+		"X射线附属及辅助设备",
+		"图像显示、处理、传输及打印设备",
+		"X射线附属及辅助设备",
+		"X射线附属及辅助设备",
+		"X射线附属及辅助设备",
+		"X射线附属及辅助设备",
+		"放射治疗配套器械",
+		"X射线附属及辅助设备",
+		"医用射线防护设备",
+		"医用射线防护设备",
+		"医用射线防护设备",
+		"其他医用分析设备",
+		"样本分离设备",
+		"采样设备和器具",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"样本分离设备",
+		"呼吸、麻醉、急救设备辅助装置",
+		"妇产科承载器械",
+		"手术台",
+		"诊疗台",
+		"手术照明设备",
+		"患者转运器械",
+		"呼吸、麻醉、急救设备辅助装置",
+		"口腔治疗设备",
+		"口腔治疗设备",
+		"口腔治疗设备",
+		"口腔治疗设备",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗设备",
+		"口腔诊察设备",
+		"口腔诊察设备",
+		"口腔治疗设备",
+		"医用病床",
+		"医用病床",
+		"医用病床",
+		"防压疮(褥疮)垫",
+		"患者转运器械",
+		"清洗消毒设备",
+		"温热(冷)治疗设备/器具",
+		"温热(冷)治疗设备/器具",
+		"口腔治疗辅助材料",
+		"口腔治疗辅助材料",
+		"口腔治疗辅助材料",
+		"口腔治疗辅助材料",
+		"口腔治疗辅助材料",
+		"口腔治疗辅助材料",
+		"其他口腔材料",
+		"口腔治疗辅助材料",
+		"手术室感染控制用品",
+		"医护人员防护用品",
+		"外固定及牵引器械",
+		"病人护理防护用品",
+		"妇产科手术器械",
+		"病人护理防护用品",
+		"防压疮(褥疮)垫",
+		"其它器械",
+		"其它器械",
+		"创面敷料",
+		"包扎敷料",
+		"包扎敷料",
+		"其它器械",
+		"止血器具",
+		"矫形固定器械",
+		"与非血管内导管配套用体外器械",
+		"其它器械",
+		"造口、疤痕护理用品",
+		"内窥镜辅助用品",
+		"清洗、灌洗、吸引、给药器械",
+		"妇产科手术器械",
+		"助行器械",
+		"造口、疤痕护理用品",
+		"神经和心血管手术器械-其他器械",
+		"图像显示、处理、传输及打印设备",
+		"图像显示、处理、传输及打印设备",
+		"呼吸、麻醉用管路、面罩",
+		"眼科测量诊断设备和器具",
+		"眼科测量诊断设备和器具",
+		"其它器械",
+		"口腔治疗器具",
+		"眼科测量诊断设备和器具",
+		"X射线附属及",
+		"辅助设备",
+		"附件、耗材",
+		"形态学分析前样本处理设备",
+		"口腔治疗器具",
+		"培养与孵育设备",
+		"口腔治疗器具",
+		"与非血管内导管配套用体外器械",
+		"超声治疗设备",
+		"超声影像诊断附属设备",
+		"X射线附属及",
+		"辅助设备",
+		"X射线附属及",
+		"辅助设备",
+		"X射线附属及",
+		"辅助设备",
+		"口腔治疗器具",
+		"外固定及牵引器械",
+		"其它器械",
+		"口腔充填修复材料",
+		"诊察辅助器械",
+		"图像显示、处理、传输及打印设备",
+		"图像显示、处理、传输及打印设备",
+		"附件、耗材",
+		"医用射线防护设备",
+		"医用射线防护设备",
+		"放射治疗配套器械",
+		"超声影像诊断附属设备",
+		"清洗消毒设备",
+		"超声治疗设备",
+		"与非血管内导管配套用体外器械",
+		"呼吸、麻醉、急救设备辅助装置",
+		"诊察辅助器械",
+		"医用射线防护设备",
+		"医用射线防护设备",
+		"医用射线防护设备",
+		"口腔治疗设备",
+		"手术器械-其他器械",
+		"手术器械-其他器械",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-镊",
+		"手术器械-夹",
+		"手术器械-其他器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科植入物及辅助器械",
+		"眼科无源辅助手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源辅助手术器械",
+		"眼科无源辅助手术器械",
+		"手术器械-刀",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-钳",
+		"手术器械-针",
+		"手术器械-刮匙",
+		"手术器械-刮匙",
+		"手术器械-牵开器",
+		"手术器械-牵开器",
+		"手术器械-凿",
+		"手术器械-其他器械",
+		"手术器械-其他器械",
+		"手术器械-其他器械",
+		"手术器械-其他器械",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗辅助材料",
+		"口腔治疗器具",
+		"口腔治疗辅助材料",
+		"口腔治疗辅助材料",
+		"口腔植入及组织重建材料",
+		"口腔治疗设备",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"手术器械-刀",
+		"手术器械-穿刺导引器",
+		"骨科用针",
+		"基础通用辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"基础通用辅助器械",
+		"关节外科辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"基础通用辅助器械",
+		"关节外科辅助器械",
+		"关节外科辅助器械",
+		"外固定及牵引器械",
+		"外固定及牵引器械",
+		"外固定及牵引器械",
+		"外固定及牵引器械",
+		"妇产科测量、监护设备",
+		"妊娠控制器械",
+		"注射、穿刺器械",
+		"运动康复训练器械",
+		"放射治疗配套器械",
+		"患者位置固定辅助器械",
+		"止血器具",
+		"患者位置固定辅助器械",
+		"口腔诊察器具",
+		"口腔治疗器具",
+		"造口、疤痕护理用品",
+		"造口、疤痕护理用品",
+		"手术器械-牵开器",
+		"与非血管内导管配套用体外器械",
+		"清洗、灌洗、吸引、给药器械",
+		"清洗、灌洗、吸引、给药器械",
+		"其它器械",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"培养与孵育设备",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"检验及其他辅助设备",
+		"形态学分析前样本处理设备",
+		"检验及其他辅助设备",
+		"采样设备和器具",
+		"形态学分析前样本处理设备",
+		"形态学分析前样本处理设备",
+		"患者位置固定辅助器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"眼科无源手术器械",
+		"口腔植入及组织重建材料",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"内窥镜辅助用品",
+		"口腔治疗器具",
+		"口腔治疗器具",
+		"外固定及牵引器械",
+		"外固定及牵引器械",
+		"图像显示、处理、传输及打印设备",
+		"图像显示、处理、传输及打印设备",
+		"清洗消毒设备",
+	}
+	for k, v := range arr1 {
+		arr := strings.Split(v, "、")
+		for _, v1 := range arr {
+			info[v1] = arr2[k]
+		}
+	}
+	log.Debug("加载数量~", len(info))
+	return info
+}
+
+//具体方法
+func calculationYlqxCode(yl_code string) (bool, 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 false, update
+	}
+	update["product_class_code"] = yl_code
+	return true, update
+}
+func calculationYlqxScRange(company string, old_class string, old_name string) ([]map[string]interface{}, []string) {
+	dataArr, _ := Save_Mgo.Find("nmpa_company_new", bson.M{"company": company}, nil, bson.M{"product_range": 1})
+	infoArr := []map[string]interface{}{}
+	codeArr := []string{}
+	for _, v := range dataArr {
+		product_range := qu.ObjToString(v["product_range"])
+		matchArr1 := ScRangeReg1.FindAllString(product_range, -1)
+		if len(matchArr1) > 0 {
+			for _, v1 := range matchArr1 {
+				name := ScRangeReg1.ReplaceAllString(v1, "${4}")
+				name = ScRangeClean1.ReplaceAllString(name, "")
+				name = ScRangeClean2.ReplaceAllString(name, "")
+				b, res := calculationYlqxCode(YlqxNameCode[name])
+				//根据结果校验一下,是否有效合理
+				if b && checkYlqxInfoRight(res, old_class, old_name) {
+					infoArr = append(infoArr, res)
+					codeArr = append(codeArr, YlqxNameCode[name])
+				}
+			}
+		} else {
+			matchArr2 := ScRangeReg2.FindAllString(product_range, -1)
+			for _, v1 := range matchArr2 {
+				if strings.Contains(v1, "分类目录") {
+					continue
+				}
+				name := ScRangeReg2.ReplaceAllString(v1, "${2}")
+				name = ScRangeClean1.ReplaceAllString(name, "")
+				name = ScRangeClean2.ReplaceAllString(name, "")
+				b, res := calculationYlqxCode(YlqxNameCode[name])
+				//根据结果校验一下,是否有效合理
+				if b && checkYlqxInfoRight(res, old_class, old_name) {
+					infoArr = append(infoArr, res)
+					codeArr = append(codeArr, YlqxNameCode[name])
+				}
+			}
+		}
+	}
+	//进行有效结果去重
+	infoArr, codeArr, _ = resultRepeat(infoArr, codeArr, nil)
+	//进行有效结果合并
+	infoArr, codeArr, _ = resultMerge(infoArr, codeArr, nil)
+
+	return infoArr, codeArr
+}
+func resultRepeat(infos []map[string]interface{}, codes []string, matchs []string) ([]map[string]interface{}, []string, []string) {
+	new_infos := []map[string]interface{}{}
+	new_codes := []string{}
+	new_matchs := []string{}
+	temp := map[string]string{}
+	for k, v := range infos {
+		c1, c2 := qu.ObjToString(v["product_class_1"]), qu.ObjToString(v["product_class_2"])
+		c3, c4 := qu.ObjToString(v["product_class_3"]), qu.ObjToString(v["product_class_4"])
+		key := c1 + "~" + c2 + "~" + c3 + "~" + c4 + "~"
+		if temp[key] == "" {
+			new_infos = append(new_infos, v)
+			new_codes = append(new_codes, codes[k])
+			if matchs != nil && len(matchs) > 0 {
+				new_matchs = append(new_matchs, matchs[k])
+			}
+			temp[key] = key
+		}
+	}
+	return new_infos, new_codes, new_matchs
+}
+func resultMerge(infoArr []map[string]interface{}, codeArr []string, matchArr []string) ([]map[string]interface{}, []string, []string) {
+	new_infos := []map[string]interface{}{}
+	new_codes := []string{}
+	new_matchs := []string{}
+	for k, v := range codeArr {
+		isValid := true
+		l := utf8.RuneCountInString(v)
+		for k1, v1 := range codeArr {
+			if k == k1 {
+				continue
+			}
+			l1 := utf8.RuneCountInString(v1)
+			if l1 > l {
+				if v1[:l] == v {
+					isValid = false
+					break
+				}
+			}
+		}
+		if isValid {
+			new_infos = append(new_infos, infoArr[k])
+			new_codes = append(new_codes, codeArr[k])
+			if matchArr != nil && len(matchArr) > 0 {
+				new_matchs = append(new_matchs, matchArr[k])
+			}
+		}
+	}
+	return new_infos, new_codes, new_matchs
+}
+func checkYlqxInfoRight(res map[string]interface{}, class string, name string) bool {
+	if class != "" {
+		if qu.ObjToString(res["product_class_1"]) != class {
+			return false
+		} else {
+			if qu.ObjToString(res["product_class_2"]) == "" {
+				return false
+			}
+		}
+	}
+	if SpecRangeReg.MatchString(name) {
+		if qu.ObjToString(res["product_class_1"]) != "体外诊断试剂" {
+			return false
+		}
+	}
+	return true
+}
+func checkYlqxResultRightFourth(resArr []map[string]interface{}, codeArr []string, old_class string) (bool, map[string]interface{}, string) {
+	if len(resArr) == 0 {
+		return false, map[string]interface{}{}, ""
+	}
+	if len(resArr) == 1 {
+		return true, resArr[0], codeArr[0]
+	}
+	if old_class != "" {
+		return false, map[string]interface{}{}, ""
+	}
+	return false, map[string]interface{}{}, ""
+}
+func checkYlqxResultRightSeventh(resArr []map[string]interface{}, codeArr []string, matchArr []string, old_class string) (bool, map[string]interface{}, string) {
+	if len(resArr) == 0 {
+		return false, map[string]interface{}{}, ""
+	}
+	if len(resArr) == 1 {
+		return true, resArr[0], codeArr[0]
+	}
+	//取最大配词
+	if index := getMaxLengthMatchName(matchArr); index > -1 {
+		return true, resArr[index], codeArr[index]
+	}
+	//取最大一级类别
+	if old_class != "" {
+		return false, map[string]interface{}{}, ""
+	}
+	if new_class := getMaxFirstClassName(resArr); new_class != "" {
+		code := YlqxNameCode[new_class]
+		return true, map[string]interface{}{"product_class_1": new_class, "product_class_code": code}, code
+	}
+	return false, map[string]interface{}{}, ""
+}
+func getMaxFirstClassName(resArr []map[string]interface{}) string {
+	infos := map[string]int{}
+	for _, v := range resArr {
+		key := qu.ObjToString(v["product_class_1"])
+		num := qu.IntAll(infos[key])
+		infos[key] = num + 1
+	}
+	new_class := ""
+	info_count := 0
+	for k, v := range infos {
+		if v > info_count {
+			new_class = k
+			info_count = v
+		} else if v == info_count {
+			new_class = ""
+		} else {
+
+		}
+	}
+	return new_class
+}
+func getMaxLengthMatchName(matchArr []string) int {
+	//取长度最长的词
+	match_count := 0
+	match_index := -1
+	for k, v := range matchArr {
+		l := utf8.RuneCountInString(v)
+		if l > match_count {
+			match_index = k
+			match_count = l
+		} else if l == match_count {
+			match_index = -1
+		} else {
+
+		}
+	}
+	return match_index
+}
+
+func flagTagLog(flag string, tag string) string {
+	if flag == "" {
+		return tag
+	}
+	return flag + "," + tag
+}
+
+//拆分合并医疗产品与企业信息
+func splitMergeMedicalInfo(coll string) {
+	sess := Old_Mgo.GetMgoConn()
+	defer Old_Mgo.DestoryMongoConn(sess)
+	q, total := map[string]interface{}{}, 0
+	it := sess.DB(Old_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)
+}

+ 3 - 3
listen_data/src/main.go

@@ -138,9 +138,9 @@ func main() {
 	//decodeFeedBackInfo()
 	//export0427wininfo()
 
-	decodeSEUrl("QltFK2gnbAIIUFwVV0dybyZpVAkEWkNb")
-	decodeSEUrl("QltFK2h2OQMIUFwVV0dybyZpVAkFWEdY")
-
+	//decodeSEUrl("QltFK2gnbAIIUFwVV0dybyZpVAkEWkNb")
+	//decodeSEUrl("QltFK2h2OQMIUFwVV0dybyZpVAkFWEdY")
+	exportErrInfo0515()
 	return
 
 	/*

+ 60 - 0
listen_data/src/zkmethod.go

@@ -169,6 +169,66 @@ func decodeFeedBackInfo() {
 	}
 }
 
+func exportErrInfo0515() {
+	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.NewTermQuery("area", "广西")
+	query2 := es_elastic.NewQueryStringQuery("兵团").DefaultField("buyer.mbuyer")
+	cursor, err := esclient.Scan("bidding").Query(es_elastic.NewBoolQuery().Must(query1, query2)).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
+	pool_es := make(chan bool, 10)
+	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()
+				}()
+				site := qu.ObjToString(tmp["site"])
+				save_mgo.Save("111111", map[string]interface{}{
+					"_id":  StringTOBsonId(qu.ObjToString(tmp["_id"])),
+					"site": site,
+				})
+
+			}(tmp)
+		}
+	}
+	wg_es.Wait()
+	log.Debug("遍历完毕...", total, numDocs, isok)
+}
+
 //清洗医疗名称
 func testCleanMedicalName() {
 	dataArr, _ := save_mgo.Find("111111", nil, bson.M{"_id": 1}, nil)