Ver Fonte

医疗器械

zhengkun há 2 anos atrás
pai
commit
1b7199ba89

+ 74 - 21
data_ylqx/src/dealer.go

@@ -2,6 +2,8 @@ package main
 
 import (
 	log "github.com/donnie4w/go-logger/logger"
+	"github.com/uuid"
+	"go.mongodb.org/mongo-driver/bson"
 	qu "qfw/util"
 	"strings"
 )
@@ -38,19 +40,38 @@ func exportDealerBaseInfo() {
 			}
 		}
 	}
-	log.Debug("经销商基本信息预处理~", len(dataArr))
+	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"])
+	//查询主题库
+	dealer_name := qu.ObjToString(tmp["company_name"])
+	company_id := qu.ObjToString(tmp["_id"])
+	name_id := ""
+	ent := MysqlGlobalTool.FindOne("dws_f_ent_baseinfo", map[string]interface{}{
+		"name": dealer_name,
+	}, "name_id", "-id")
+	if ent != nil {
+		name_id = qu.ObjToString((*ent)["name_id"])
+		info["exists_id"] = 1
+	} else {
+		name_id = uuid.New().String()
+		name_id = strings.ReplaceAll(name_id, "-", "")
+		info["exists_id"] = 0
+	}
+	info["dealer_name"] = dealer_name
+	info["company_id"] = company_id
+	info["name_id"] = name_id
+	area_code, city_code, district_code := dealWithRegionCode(qu.ObjToString(tmp["company_area"]), qu.ObjToString(tmp["company_city"]), qu.ObjToString(tmp["company_district"]))
+	info["area_code"] = area_code
+	info["city_code"] = city_code
+	info["district_code"] = district_code
 	info["business_model"] = qu.IntAll(business_model)
 	info["company_address"] = qu.ObjToString(tmp["company_address"])
+	data := Spi_Mgo.FindOne("company_base", bson.M{"company_id": company_id})
+	new_capital := qu.ObjToString(data["capital"])
 	capital, capital_code := qu.Float64All(tmp["capital"]), 1
 	if capital >= float64(0) && capital < float64(100) {
 		capital_code = 1
@@ -61,7 +82,7 @@ func createDealerInfo(tmp map[string]interface{}, business_model string) map[str
 	} else {
 		capital_code = 4
 	}
-	info["capital"] = capital
+	info["capital"] = new_capital
 	info["capital_code"] = capital_code
 	return info
 }
@@ -89,13 +110,12 @@ func getOneBaseCompany(arr []map[string]interface{}) int {
 
 //重复企业-过滤
 func repeatNameQyxyInfo() []map[string]string {
-	sess := Sour_Mgo.GetMgoConn()
-	defer Sour_Mgo.DestoryMongoConn(sess)
+	sess := Save_Mgo.GetMgoConn()
+	defer Save_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{}{
+	it := sess.DB(Save_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{}
@@ -104,26 +124,26 @@ func repeatNameQyxyInfo() []map[string]string {
 			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 = "经营"
+		classify := qu.ObjToString(tmp["classify"])
+		model := ""
+		if strings.Contains(classify, "生产") {
+			model = "生产"
+		} else if strings.Contains(classify, "经营") {
+			model = "经营"
 		} else {
 			log.Debug("类型异常~~~~~~")
 		}
 		if company != "" {
 			if temp[company] == "" {
-				temp[company] = classify
+				temp[company] = model
 				qyArr = append(qyArr, company)
 			} else {
-				pre_classify := temp[company]
-				if pre_classify != classify && classify != "" && !strings.Contains(pre_classify, "&&") {
-					temp[company] = pre_classify + "&&" + classify
+				pre_model := temp[company]
+				if pre_model != model && model != "" && !strings.Contains(pre_model, "&&") {
+					temp[company] = pre_model + "&&" + model
 				}
 			}
 		}
-		break
 		tmp = make(map[string]interface{})
 	}
 	newArr := []map[string]string{}
@@ -146,3 +166,36 @@ func repeatNameQyxyInfo() []map[string]string {
 	log.Debug("企业去重~", total, len(newArr))
 	return newArr
 }
+
+//处理地域代码
+func dealWithRegionCode(area string, city string, district string) (area_code string, city_code string, district_code string) {
+	area_code, city_code, district_code = "000000", "", ""
+	if district != "" {
+		key := area + "~" + city + "~" + district + "~"
+		code := RegionCodeData[key]
+		if code != "" {
+			district_code = code
+			city_code = code[:4] + "00"
+			area_code = code[:2] + "0000"
+			return
+		}
+	}
+	if city != "" {
+		key := area + "~" + city + "~" + "" + "~"
+		code := RegionCodeData[key]
+		if code != "" {
+			city_code = code
+			area_code = city_code[:2] + "0000"
+			return
+		}
+	}
+	if area != "" {
+		key := area + "~" + "" + "~" + "" + "~"
+		code := RegionCodeData[key]
+		if code != "" {
+			area_code = code
+			return
+		}
+	}
+	return
+}

+ 33 - 15
data_ylqx/src/dealer_register.go

@@ -13,41 +13,59 @@ func exportDealerRegisterInfo() {
 	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{}{
+		"name_id":        1,
 		"dealer_name":    1,
 		"business_model": 1,
 	}).Iter()
-	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+	for tmp := make(map[string]interface{}); it.Next(&tmp); {
 		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)
+		num := createDealerRegisterInfo(tmp)
+		total += num
 		tmp = make(map[string]interface{})
 	}
+	log.Debug("经销商信息~~~", total)
 }
 
 //构建注册备案基本信息
-func createDealerRegisterInfo(dealer_name string, business_model int) {
-	infoArr, _ := Sour_Mgo.Find("nmpa_company_new", bson.M{"company": dealer_name}, nil, nil)
+func createDealerRegisterInfo(tmp map[string]interface{}) int {
+	company_name := qu.ObjToString(tmp["dealer_name"])
+	dealer_id := qu.ObjToString(tmp["name_id"])
+	business_model := qu.IntAll(tmp["business_model"])
+	infoArr, _ := Save_Mgo.Find("nmpa_company_new", bson.M{"company": company_name}, bson.M{"_id": 1}, nil)
+	num := 0
 	for _, v := range infoArr {
+		num++
 		info := map[string]interface{}{}
-		info["company_name"] = dealer_name
-		info["regnum"] = qu.ObjToString(v["reg_no"])
-		if strings.Contains(qu.ObjToString(v["classify"]), "许可") {
+		info["dealer_id"] = dealer_id
+		info["company_name"] = company_name
+		reg_no := qu.ObjToString(v["reg_no"])
+		classify := qu.ObjToString(v["classify"])
+		info["regnum"] = reg_no
+		if strings.Contains(classify, "许可") {
 			info["type"] = 1
-		} else if strings.Contains(qu.ObjToString(v["classify"]), "备案") {
+		} else if strings.Contains(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["scope"] = pickfirst(qu.ObjToString(v["product_range"]), qu.ObjToString(v["business_range"]))
+		info["approve_depart"] = pickfirst(qu.ObjToString(v["fzbm"]), qu.ObjToString(v["badw"]))
+		info["approve_date"] = pickfirst(qu.ObjToString(v["fzrq"]), qu.ObjToString(v["barq"]))
+		info["type_address"] = pickfirst(qu.ObjToString(v["product_address"]), qu.ObjToString(v["business_address"]))
 		info["responsible_person"] = qu.ObjToString(v["responsible_persons"])
 		info["legal_person"] = qu.ObjToString(v["legal_person"])
-		//待保存
+		Save_Mgo.Save("nmpa_company_register", info)
+	}
+	return num
+}
+
+func pickfirst(s1 string, s2 string) string {
+	if s1 != "" {
+		return s1
 	}
+	return s2
 }

+ 36 - 7
data_ylqx/src/init.go

@@ -1,30 +1,47 @@
 package main
 
+import (
+	log "github.com/donnie4w/go-logger/logger"
+	qu "qfw/util"
+)
+
 var (
-	Sour_Mgo, Save_Mgo                *MongodbSim
+	Old_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"
+	RegionCodeData                    = map[string]string{}
 )
 
 func initClass() {
 	initMgo()
 	initMysql()
+	initCode()
 }
 
 //初始化mgo
 func initMgo() {
+	//Spi_Mgo = &MongodbSim{
+	//	MongodbAddr: "127.0.0.1:12004",
+	//	DbName:      "mixdata",
+	//	Size:        10,
+	//	UserName:    "",
+	//	Password:    "",
+	//}
+	//Spi_Mgo.InitPool()
+	//return
+
 	if IsLocal {
-		Sour_Mgo = &MongodbSim{
+		Old_Mgo = &MongodbSim{
 			MongodbAddr: "127.0.0.1:27017",
 			DbName:      "medical",
 			Size:        10,
 			UserName:    "",
 			Password:    "",
 		}
-		Sour_Mgo.InitPool()
+		Old_Mgo.InitPool()
 
 		Save_Mgo = &MongodbSim{
 			MongodbAddr: "127.0.0.1:27017",
@@ -53,14 +70,14 @@ func initMgo() {
 		}
 		Qyxy_Mgo.InitPool()
 	} else {
-		Sour_Mgo = &MongodbSim{
+		Old_Mgo = &MongodbSim{
 			MongodbAddr: "172.17.4.87:27080",
 			DbName:      "py_theme",
 			Size:        10,
 			UserName:    "",
 			Password:    "",
 		}
-		Sour_Mgo.InitPool()
+		Old_Mgo.InitPool()
 
 		Save_Mgo = &MongodbSim{
 			MongodbAddr: "172.17.4.87:27080",
@@ -95,8 +112,6 @@ 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{
@@ -116,3 +131,17 @@ func initMysql() {
 	MysqlGlobalTool.Init()
 
 }
+
+func initCode() {
+	data_regions := MysqlGlobalTool.Find("code_area", nil, "", "", -1, -1)
+	//先构建所有一级数据
+	for _, v := range *data_regions {
+		area := qu.ObjToString(v["area"])
+		city := qu.ObjToString(v["city"])
+		district := qu.ObjToString(v["district"])
+		code := qu.ObjToString(v["code"])
+		key := area + "~" + city + "~" + district + "~"
+		RegionCodeData[key] = code
+	}
+	log.Debug("地域信息数量~", len(RegionCodeData))
+}

+ 3 - 2
data_ylqx/src/main.go

@@ -10,12 +10,13 @@ func main() {
 	//splitMergeMedicalInfo("nmpa_ylqx_2022")
 	//splitMergeMedicalInfo("nmpa_ylqx_2023")
 
-	exportDealerBaseInfo()
+	//exportDealerBaseInfo()
 	//exportDealerRegisterInfo()
-	//exportProductBaseInfo()
+	exportProductBaseInfo()
 
 	//确认分类
 	//confirmYlqxInfoClass()
+	//testInvestInfo()
 
 	lock := make(chan bool)
 	<-lock

+ 65 - 103
data_ylqx/src/product.go

@@ -4,6 +4,7 @@ import (
 	log "github.com/donnie4w/go-logger/logger"
 	"go.mongodb.org/mongo-driver/bson"
 	qu "qfw/util"
+	"strings"
 )
 
 //导出产品信息相关
@@ -14,123 +15,84 @@ func exportProductBaseInfo() {
 	it := sess.DB(Save_Mgo.DbName).C("nmpa_company_dealer").Find(&q).Select(map[string]interface{}{
 		"dealer_name": 1,
 		"company_id":  1,
+		"name_id":     1,
 	}).Iter()
-	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+	for tmp := make(map[string]interface{}); it.Next(&tmp); {
 		if total%10000 == 0 {
 			log.Debug("curent index ", total)
 		}
-		createProductBaseInfo(tmp)
+		num := createProductBaseInfo(tmp)
+		total += num
 		tmp = make(map[string]interface{})
 	}
+	log.Debug("产品信息~~~", total)
 }
 
-func createProductBaseInfo(dealerInfo map[string]interface{}) {
+func createProductBaseInfo(dealerInfo map[string]interface{}) int {
+	num := 0
 	dealer_name := qu.ObjToString(dealerInfo["dealer_name"])
-	infoArr, _ := Sour_Mgo.Find("nmpa_company_new", bson.M{"reg_company": dealer_name}, nil, nil)
+	infoArr, _ := Save_Mgo.Find("nmpa_product_new", bson.M{"reg_company": dealer_name}, nil, nil)
 	for _, v := range infoArr {
+		num++
 		info := dealWithProductInfo(v, dealerInfo)
-		if info != nil {
-
-		}
+		Save_Mgo.Save("nmpa_product_baseinfo", info)
 	}
+	return num
 }
 
 //信息处理
 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
+	info := map[string]interface{}{}
+	info["dealer_id"] = qu.ObjToString(dealerInfo["name_id"])
+	info["company_id"] = qu.ObjToString(dealerInfo["company_id"])
+	info["company_name"] = qu.ObjToString(dealerInfo["dealer_name"])
+	classify, reg_no := qu.ObjToString(tmp["classify"]), qu.ObjToString(tmp["reg_no"])
+	info["regno"] = reg_no
+	info["company_address"] = qu.ObjToString(tmp["reg_address"])
+	info["make_adress"] = qu.ObjToString(tmp["product_address"])
+
+	if strings.Contains(classify, "进口") || strings.Contains(reg_no, "国") {
+		info["make_country"] = 2
+	} else {
+		info["make_country"] = 1
+	}
+	info["agent_name"] = qu.ObjToString(tmp["agent_name"])
+	info["agent_address"] = qu.ObjToString(tmp["agent_address"])
+	info["brand"] = ""
+	info["model"] = qu.ObjToString(tmp["model"])
+	if strings.Contains(classify, "注册") || strings.Contains(reg_no, "注") {
+		info["main_part"] = qu.ObjToString(tmp["product_depict"])
+		info["main_part"] = ""
+		info["regist_type"] = 1
+	} else {
+		info["main_part"] = ""
+		info["product_descrip"] = qu.ObjToString(tmp["product_depict"])
+		info["regist_type"] = 2
+	}
+	info["use_scope "] = qu.ObjToString(tmp["application"])
+	info["storage_conditions"] = qu.ObjToString(tmp["conditions_use"])
+	info["remark "] = qu.ObjToString(tmp["remark"])
+	info["approve_depart"] = pickfirst(qu.ObjToString(tmp["spbm"]), qu.ObjToString(tmp["badw"]))
+	info["approve_date"] = pickfirst(qu.ObjToString(tmp["pzrq"]), qu.ObjToString(tmp["barq"]))
+	info["validity_date"] = qu.ObjToString(tmp["yxqz"])
+	info["changes"] = qu.ObjToString(tmp["changes"])
+	info["source_channel"] = classify
+	info["changes"] = qu.ObjToString(tmp["changes"])
+	if qu.ObjToString(tmp["class"]) == "第一类" {
+		info["manage_type"] = "Ⅰ"
+	} else if qu.ObjToString(tmp["class"]) == "第二类" {
+		info["manage_type"] = "Ⅱ"
+	} else {
+		info["manage_type"] = "Ⅲ"
+	}
+
+	//产品相关信息
+	info["product_name"] = qu.ObjToString(tmp["product_name"])
+	info["medical_equipment_class1"] = qu.ObjToString(tmp["product_class_1"])
+	info["medical_equipment_class2"] = qu.ObjToString(tmp["product_class_2"])
+	info["medical_equipment_class3"] = qu.ObjToString(tmp["product_class_3"])
+	info["sdproduct_name"] = qu.ObjToString(tmp["product_class_4"])
+	info["sdequipment_code"] = qu.ObjToString(tmp["product_class_code"])
+
+	return info
 }

+ 232 - 56
data_ylqx/src/remarks.go

@@ -40,23 +40,64 @@ var (
 		"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{}
 
-	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("(生产范围).*")
+	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()
-	//confirmSecond()
+	confirmFirst()
+	confirmSecond()
 	confirmThird()
+	confirmFourth()
+	confirmFifth()
+
 }
 
 //加载医疗器械代码
@@ -74,7 +115,7 @@ func loadYlqxInfo() {
 //医疗分类打标记
 func confirmFirst() {
 	isok := 0
-	dataArr, _ := Sour_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 != "" {
@@ -84,8 +125,8 @@ func confirmFirst() {
 		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{}{
+			_, update := calculationYlqxCode(code)
+			Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
 				"$set": update,
 			})
 		}
@@ -93,7 +134,7 @@ func confirmFirst() {
 	log.Debug("is over ... ", isok)
 	time.Sleep(time.Second * 2)
 }
-func calculationYlqxCode(yl_code string) map[string]interface{} {
+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]
@@ -110,14 +151,14 @@ func calculationYlqxCode(yl_code string) map[string]interface{} {
 		update["product_class_3"] = YlqxCodeName[yl_code[:7]]
 		update["product_class_4"] = YlqxCodeName[yl_code]
 	} else {
-
+		return false, update
 	}
-	return update
+	return true, 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})
+	dataArr, _ := Save_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"])
@@ -129,7 +170,7 @@ func confirmSecond() {
 				name := codeRelation[code]
 				if name != "" {
 					isok++
-					Sour_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
+					Save_Mgo.UpdateById("nmpa_product_new", tmpid, map[string]interface{}{
 						"$set": bson.M{"product_class_1": name},
 					})
 				}
@@ -141,86 +182,221 @@ func confirmSecond() {
 }
 func confirmThird() {
 	isok := 0
-	dataArr, _ := Sour_Mgo.Find("nmpa_product_new", nil, nil, bson.M{
+	dataArr, _ := Save_Mgo.Find("nmpa_product_new", nil, nil, bson.M{"product_name": 1, "product_class_1": 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": "体外诊断试剂"},
+			})
+			isok++
+		}
+	}
+	log.Debug("is over ... ", isok)
+}
+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,
 	})
 	for _, v := range dataArr {
-		product_name := qu.ObjToString(v["product_name"])
+		tmpid := BsonTOStringId(v["_id"])
+		old_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 != "" {
+		old_class_1 := qu.ObjToString(v["product_class_1"])
+		old_class_2 := qu.ObjToString(v["product_class_2"])
+		if old_class_2 != "" {
 			continue
 		}
-		infos := calculationYlqxRange(reg_company, product_class_1)
-		isTure := 0
-		if len(infos) == 1 {
-			isTure = 1
+		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,
+			})
+		}
+	}
+	log.Debug("is over ... ", isok)
+	time.Sleep(time.Second * 2)
+}
+func confirmFifth() {
+	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,
+	})
+	for _, v := range dataArr {
+		tmpid := BsonTOStringId(v["_id"])
+		old_name := qu.ObjToString(v["product_name"])
+		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
 		}
-		if len(infos) > 0 {
+		resArr := calculationYlqxJyRange(reg_company, old_class_1, old_name)
+		b, res := checkYlqxResultRight(resArr, old_class_1)
+		if b && res != nil && tmpid != "" {
 			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,
+			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 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})
+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{}{}
-	temp := map[string]string{}
 	for _, v := range dataArr {
 		product_range := qu.ObjToString(v["product_range"])
-		matchArr1 := rangeReg1.FindAllString(product_range, -1)
+		matchArr1 := ScRangeReg1.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,
-					})
+				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 := rangeReg2.FindAllString(product_range, -1)
+			matchArr2 := ScRangeReg2.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,
-					})
+				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)
 				}
 			}
 		}
 	}
+	//进行有效结果去重
+	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
 }
+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{}{}
+	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
+		}
+	}
+	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
+			}
+		}
+	}
+	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{}{}
+}
 
 //拆分合并医疗产品与企业信息
 func splitMergeMedicalInfo(coll string) {
-	sess := Sour_Mgo.GetMgoConn()
-	defer Sour_Mgo.DestoryMongoConn(sess)
+	sess := Old_Mgo.GetMgoConn()
+	defer Old_Mgo.DestoryMongoConn(sess)
 	q, total := map[string]interface{}{}, 0
-	it := sess.DB(Sour_Mgo.DbName).C(coll).Find(&q).Sort("_id").Iter()
+	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)

+ 1 - 4
data_ylqx/src/test.go

@@ -28,10 +28,7 @@ func testInvestInfo() {
 	row3 = sheet3.AddRow()
 	row3.AddCell().Value = "企业名称"
 	row3.AddCell().Value = "父级企业名称"
-	b := testGetInvests("158308314d4cfdefe6f5e943d4dcaf4e", "中国核工业集团有限公司", 3)
-	if b {
-		log.Debug("企业有问题......")
-	}
+	testGetInvests("158308314d4cfdefe6f5e943d4dcaf4e", "中国核工业集团有限公司", 3)
 	err := f.Save("1.xlsx")
 	if err != nil {
 		log.Debug("保存xlsx失败:", err)