Преглед изворни кода

医院~科室~别名~产品~企业的生产经营产品

zhengkun пре 3 година
родитељ
комит
52f77e1b18

+ 14 - 32
filedproject_medical/data_preparation/src/class/initdata.go

@@ -3,11 +3,11 @@ package class
 import log "github.com/donnie4w/go-logger/logger"
 
 var (
-	Save_Mgo, Qy_Mgo, Spi_Mgo   *MongodbSim
+	Save_Mgo, Spi_Mgo           *MongodbSim
 	TimeLayout                  = "2006-01-02 15:04:05"
 	TimeTmeplate                = "2006-01-02"
 	MysqlTool                   *Mysql
-	Medical_type, Medical_level map[string]string
+	Medical_Type, Medical_Level map[string]string
 
 	isLocal bool
 )
@@ -22,32 +22,23 @@ func InitClass() {
 //初始化mgo
 func initMgo() {
 	if isLocal {
-		Save_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Save_Mgo.InitPool()
-
-		//save_mgo = &MongodbSim{
-		//	MongodbAddr: "192.168.3.207:27092",
+		//Save_Mgo = &MongodbSim{
+		//	MongodbAddr: "127.0.0.1:27017",
 		//	DbName:      "zhengkun",
 		//	Size:        10,
 		//	UserName:    "",
 		//	Password:    "",
 		//}
-		//save_mgo.InitPool()
+		//Save_Mgo.InitPool()
 
-		Qy_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "mixdata",
+		Save_Mgo = &MongodbSim{
+			MongodbAddr: "192.168.3.207:27092",
+			DbName:      "zhengkun",
 			Size:        10,
 			UserName:    "",
 			Password:    "",
 		}
-		Qy_Mgo.InitPool()
+		Save_Mgo.InitPool()
 
 		Spi_Mgo = &MongodbSim{
 			MongodbAddr: "127.0.0.1:27017",
@@ -60,22 +51,13 @@ func initMgo() {
 	} else {
 		Save_Mgo = &MongodbSim{
 			MongodbAddr: "172.17.4.87:27080",
-			DbName:      "hospital",
+			DbName:      "py_theme",
 			Size:        10,
 			UserName:    "",
 			Password:    "",
 		}
 		Save_Mgo.InitPool()
 
-		Qy_Mgo = &MongodbSim{
-			MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
-			DbName:      "mixdata",
-			Size:        10,
-			UserName:    "zhengkun",
-			Password:    "zk@123123",
-		}
-		Qy_Mgo.InitPool()
-
 		Spi_Mgo = &MongodbSim{
 			MongodbAddr: "172.17.4.181:27001",
 			DbName:      "mixdata",
@@ -92,15 +74,15 @@ func initMysql() {
 		Address:  "192.168.3.217:4000",
 		UserName: "root",
 		PassWord: "=PDT49#80Z!RVv52_z",
-		DBName:   "jy_lycp",
+		DBName:   "field_medical_data",
 	}
 	MysqlTool.Init()
 
 }
 
 func initClassCode() {
-	//临时加载~后续需要加载sql
-	Medical_level = map[string]string{
+	//加载代码表~
+	Medical_Level = map[string]string{
 		"一级甲等": "01",
 		"一级乙等": "02",
 		"一级丙等": "03",
@@ -117,7 +99,7 @@ func initClassCode() {
 		"其它":   "14",
 	}
 
-	Medical_type = map[string]string{
+	Medical_Type = map[string]string{
 		"综合医院":     "01",
 		"专科医院":     "02",
 		"中医医院":     "03",

+ 23 - 12
filedproject_medical/data_preparation/src/company/company.go

@@ -26,7 +26,7 @@ func dealWithCompanyProductInfo() {
 	wg := &sync.WaitGroup{}
 	total, isok1, isok2 := 0, 0, 0
 	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
-		if total%100 == 0 {
+		if total%1000 == 0 {
 			log.Debug("cur index ", total, isok1, isok2)
 		}
 		pool <- true
@@ -38,12 +38,24 @@ func dealWithCompanyProductInfo() {
 			}()
 			company_name := qu.ObjToString(tmp["company_name"])
 			business_type := qu.ObjToString(tmp["business_type"])
-			sc_info, jy_info := treatCompanyTypeInfo(company_name, business_type)
+			company_id := qu.ObjToString(tmp["company_id"])
+			sc_info_arr, jy_info_arr := treatCompanyTypeInfo(company_name, business_type, company_id)
 
 			companylock.Lock()
-			isok1 += len(sc_info)
-			isok2 += len(jy_info)
+			isok1 += len(sc_info_arr)
+			isok2 += len(jy_info_arr)
 			companylock.Unlock()
+			for _, info := range sc_info_arr {
+				info["comeintime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeTmeplate)
+				//插入sql
+
+			}
+			for _, info := range jy_info_arr {
+				info["comeintime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeTmeplate)
+				//插入sql
+
+			}
+
 		}(tmp)
 		tmp = make(map[string]interface{})
 	}
@@ -53,18 +65,17 @@ func dealWithCompanyProductInfo() {
 }
 
 //构建产品信息~
-func treatCompanyTypeInfo(company_name string, company_type string) ([]map[string]interface{}, []map[string]interface{}) {
+func treatCompanyTypeInfo(company_name string, company_type string, company_id string) ([]map[string]interface{}, []map[string]interface{}) {
 	sc_info := []map[string]interface{}{}
 	jy_info := []map[string]interface{}{}
-	arr := *class.MysqlTool.Find("v_bidclass", nil, "", "", -1, -1)
-	log.Debug(arr)
+
 	//关联的有product.id 需要生成产品表
 	dataArr := *class.MysqlTool.Find("f_product", map[string]interface{}{
 		"company_name": company_name,
-	}, "id,product_name,approve_date,company_id,medical_equipment_code", "", -1, -1)
-	//dataArr,_ := save_mgo.Find("zktest_mysql_product_info", map[string]interface{}{
-	//	"company_name":company_name,
-	//},nil,nil)
+	}, "id,product_name,approve_date,medical_equipment_code", "", -1, -1)
+	//dataArr, _ := class.Save_Mgo.Find("zktest_mysql_product_info", map[string]interface{}{
+	//	"company_name": company_name,
+	//}, nil, nil)
 
 	//是否过滤~信息~根绝名称去重~选取一个有效的信息
 	keys := map[string]map[string]interface{}{}
@@ -101,7 +112,7 @@ func treatCompanyTypeInfo(company_name string, company_type string) ([]map[strin
 
 	for _, v := range dataArr {
 		dict := map[string]interface{}{}
-		dict["company_id"] = qu.ObjToString(v["company_id"])
+		dict["company_id"] = company_id
 		dict["product_id"] = qu.ObjToString(v["id"])
 		dict["medical_equipment_code"] = qu.ObjToString(v["medical_equipment_code"])
 		if company_type == "1" { //生产

+ 6 - 337
filedproject_medical/data_preparation/src/hospital/hospital.go

@@ -1,343 +1,12 @@
 package hospital
 
-import (
-	"class"
-	log "github.com/donnie4w/go-logger/logger"
-	qu "qfw/util"
-	"strings"
-	"sync"
-	"time"
-	"unicode/utf8"
-)
-
-var hospitallock sync.Mutex
-var data_hospitals = map[string][]map[string]interface{}{}
-
 //开始执行医院数据
 func RunHospitalInfo() {
-	//医院信息处理
-	dealWithHospitalBaseInfo("f_hospital_39jk", "hospital_39jk_ain_depart")
-	dealWithHospitalBaseInfo("f_hospital_hdf", "hospital_hdf_ain_depart")
-	dealWithHospitalBaseInfo("f_hospital_yydq", "hospital_yydq_ain_depart")
-	dealWithHospitalBaseInfo("f_hospital_yyyc", "")
-	confirmHospitalData("zzzzzzkkkkkk")
-}
-
-//整合医院数据
-func confirmHospitalData(save_coll string) {
-	//处理~医院信息
-	log.Debug("整合医院信息~", len(data_hospitals))
-	for _, v := range data_hospitals {
-		data := mergeHospitalInfo(v)
-		class.Save_Mgo.Save(save_coll, data)
-	}
-	log.Debug("待判重数据存储完毕~")
-	time.Sleep(10 * time.Second)
-	repeatHospital(save_coll)
-}
-
-//判重~医院数据
-func repeatHospital(save_coll string) {
-	log.Debug("开始判重医院数据...")
-	sess := class.Save_Mgo.GetMgoConn()
-	defer class.Save_Mgo.DestoryMongoConn(sess)
-	data_hospitals_alias := make(map[string][]string, 0)
-	data_hospitals_id := make(map[string]string, 0)
-	data_hospitals_region := make(map[string]map[string]string, 0)
-	q := map[string]interface{}{}
-	it := sess.DB(class.Save_Mgo.DbName).C(save_coll).Find(&q).Sort("_id").Select(map[string]interface{}{
-		"name":  1,
-		"alias": 1,
-	}).Iter()
-	total, isok := 0, 0
-	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
-		if total%1000 == 0 {
-			log.Debug("cur index ", total, "~", isok)
-		}
-		region := map[string]string{
-			"area":     qu.ObjToString(tmp["area"]),
-			"city":     qu.ObjToString(tmp["city"]),
-			"district": qu.ObjToString(tmp["district"]),
-		}
-		alias := qu.ObjToString(tmp["alias"])
-		name := qu.ObjToString(tmp["name"])
-		alias_arr := strings.Split(alias, ",")
-		alias_arr = append(alias_arr, name)
-
-		//减少重复...待
-
-		tmpid := class.BsonTOStringId(tmp["_id"])
-		if data_hospitals_alias[name] == nil {
-			//对比名称~
-			is_r := false
-			is_r_n := ""
-			for _, name_new := range alias_arr {
-				if name_new == "" {
-					continue
-				}
-				for k, v := range data_hospitals_alias {
-					//地域不一致~过滤
-					if !repeatRegion(data_hospitals_region[k], region) {
-						continue
-					}
-					for _, v1 := range v {
-						if v1 == "" {
-							continue
-						}
-						if strings.Contains(v1, name_new) || strings.Contains(name_new, v1) {
-							is_r = true
-							is_r_n = k
-							break
-						}
-					}
-					if is_r {
-						break
-					}
-				}
-				if is_r {
-					break
-				}
-			}
-			if is_r {
-				isok++
-				if is_r_n != "" {
-
-				}
-				class.Save_Mgo.UpdateById(save_coll, tmpid, map[string]interface{}{
-					"$set": map[string]interface{}{
-						"repeat":    1,
-						"repeat_id": data_hospitals_id[is_r_n],
-					},
-				})
-			}
-			data_hospitals_id[name] = tmpid
-			data_hospitals_region[name] = region
-			data_hospitals_alias[name] = alias_arr
-		}
-		tmp = make(map[string]interface{})
-	}
-	log.Debug("is over ", total, "~", isok)
-
-	//合并判重后的数据
-	mergeRepeatHospital(save_coll)
-}
-
-//最终合并判重后的医院数据
-func mergeRepeatHospital(save_coll string) {
-	log.Debug("开始合并重复后的数据~待")
-	return
-	sess := class.Save_Mgo.GetMgoConn()
-	defer class.Save_Mgo.DestoryMongoConn(sess)
-	q := map[string]interface{}{}
-	it := sess.DB(class.Save_Mgo.DbName).C(save_coll).Find(&q).Sort("_id").Iter()
-	total, isok := 0, 0
-	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
-		if total%1000 == 0 {
-			log.Debug("cur index ", total, "~", isok)
-		}
-		//最终保存
-
-		tmp = make(map[string]interface{})
-	}
-	log.Debug("is over ", total, "~", isok)
-}
-
-//处理医院基本信息~涉及多张表
-func dealWithHospitalBaseInfo(hos_coll string, depart_coll string) {
-	log.Debug("处理医疗~医院基本信息")
-	sess := class.Save_Mgo.GetMgoConn()
-	defer class.Save_Mgo.DestoryMongoConn(sess)
-	q := map[string]interface{}{}
-	it := sess.DB(class.Save_Mgo.DbName).C(hos_coll).Find(&q).Sort("_id").Iter()
-	pool := make(chan bool, 6)
-	wg := &sync.WaitGroup{}
-	total, isok := 0, 0
-	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()
-			}()
-			name := qu.ObjToString(tmp["hospitalname"])
-			if name != "" && utf8.RuneCountInString(name) > 3 {
-				//医院基本信息
-				data_info := treatHospitalInfo(tmp)
-				name = qu.ObjToString(data_info["name"])
-				//科室相关信息
-				hos_id := qu.ObjToString(tmp["_id"])
-				data_depart := treatHospitalDepartment(hos_id, depart_coll)
-				data_info["departs"] = data_depart
-				//别名信息
-				data_info["alias"] = qu.ObjToString(tmp["alias"])
 
-				hospitallock.Lock()
-				if data_hospitals[name] == nil {
-					arr := []map[string]interface{}{data_info}
-					data_hospitals[name] = arr
-					isok++
-				} else {
-					arr := data_hospitals[name]
-					arr = append(arr, data_info)
-					data_hospitals[name] = arr
-				}
-				hospitallock.Unlock()
-			}
-		}(tmp)
-		tmp = make(map[string]interface{})
-	}
-	wg.Wait()
-	log.Debug("is cur over ", len(data_hospitals), "~", total, "~", isok)
-}
-
-//数据构建~医院基本信息
-func treatHospitalInfo(tmp map[string]interface{}) map[string]interface{} {
-	data := map[string]interface{}{}
-	hospitalname := qu.ObjToString(tmp["hospitalname"])
-	hospitalname = strings.ReplaceAll(hospitalname, " ", "")
-	//医院名称~
-	data["name"] = hospitalname
-	//医院简介
-	data["introduce"] = qu.ObjToString(tmp["introduce"])
-
-	//医院地址
-	data["address"] = qu.ObjToString(tmp["address"])
-	//医院设备
-	data["equipment"] = qu.ObjToString(tmp["equipment"])
-	//床位数~
-	beds := qu.IntAll(tmp["beds"])
-	if beds > 0 {
-		data["beds"] = beds
-	}
-	//门诊量/日
-	visit_perday := qu.IntAll(tmp["visit_perday"])
-	if visit_perday > 0 {
-		data["visit_perday"] = visit_perday
-	}
-	//员工人数
-	doctorsnum := qu.IntAll(tmp["doctorsnum"])
-	if doctorsnum > 0 {
-		data["doctorsnum"] = doctorsnum
-	}
-	//联系电话~
-	data["tel"] = qu.ObjToString(tmp["tel"])
-	//传真号码
-	data["fax_number"] = qu.ObjToString(tmp["fax_number"])
-	//医院网站
-	data["website"] = qu.ObjToString(tmp["website"])
-
-	//等级~性质~代码
-	//n_level, n_type, n_bus_type := inquirHospitalLevelType(qu.ObjToString(tmp["level"]), qu.ObjToString(tmp["type"]), qu.ObjToString(tmp["business_type"]))
-	//data["level_code"] = n_level
-	//data["mi_type_code"] = n_type
-	//data["business_type"] = qu.IntAll(n_bus_type)
-	data["level"] = qu.ObjToString(tmp["level"])
-	data["type"] = qu.ObjToString(tmp["type"])
-	data["business_type"] = qu.ObjToString(tmp["business_type"])
-
-	//省~市~区 ~可完善
-	area := qu.ObjToString(tmp["area"])
-	city := qu.ObjToString(tmp["city"])
-	district := qu.ObjToString(tmp["district"])
-	if city == "" { //补充~省份城市信息
-		//supplementRegionally(&area, &city, &district, hospitalname, qu.ObjToString(tmp["address"]))
-	}
-	data["area"] = area
-	data["city"] = city
-	data["district"] = district
-
-	company_id := ""
-	//关联企业信息~查询顺序~企业~特殊~自生
-	//company_id = inquirBaseInfoid(hospitalname)
-	data["company_id"] = company_id
-
-	//入库时间
-	//data["comeintime"] = time.Unix(qu.Int64All(tmp["comeintime"]), 0).Format(timeLayout)
-	//更新时间
-	//data["updatetime"] = time.Unix(qu.Int64All(tmp["updatetime"]), 0).Format(timeLayout)
-
-	return data
-}
-
-//数据构建~医院科室信息
-func treatHospitalDepartment(hos_id string, depart_coll string) []map[string]interface{} {
-	new_arr := []map[string]interface{}{}
-	if depart_coll == "" {
-		return new_arr
-	}
-	dataArr, _ := class.Save_Mgo.Find(depart_coll, map[string]interface{}{"hospital_id": hos_id}, nil, nil)
-	//考虑去重~相同科室
-	keys := map[string]string{}
-	for _, v := range dataArr {
-		main_departclass1 := qu.ObjToString(v["main_departclass1"])
-		main_departclass2 := qu.ObjToString(v["main_departclass2"])
-		key := main_departclass1 + "~" + main_departclass2
-		if keys[key] == "" {
-			new_arr = append(new_arr, map[string]interface{}{
-				"departclass1": main_departclass1,
-				"departclass2": main_departclass2,
-			})
-			keys[key] = key
-		} else {
-			//log.Debug("重复科室~",main_departclass1,main_departclass2)
-		}
-	}
-	return new_arr
-}
-
-//合并医院信息~
-func mergeHospitalInfo(dataArr []map[string]interface{}) map[string]interface{} {
-	data := map[string]interface{}{}
-	if len(dataArr) == 1 {
-		return dataArr[0]
-	} else if len(dataArr) > 1 {
-		//合并重复信息
-		temp := dataArr[0]
-		for k, v := range temp {
-			isMerge := false
-			//合并别名~
-
-			//合并科室信息
-
-			//选取最优值
-			if new_v, ok := v.(string); ok {
-				if new_v == "" { //查询其他数据~补充
-					for ks, vs := range dataArr {
-						if ks == 0 {
-							continue
-						}
-						if qu.ObjToString(vs[k]) != "" {
-							data[k] = vs[k]
-							isMerge = true
-							break
-						}
-					}
-				}
-			}
-			if new_v, ok := v.(int); ok {
-				if new_v == 0 { //查询其他数据~补充
-					for ks, vs := range dataArr {
-						if ks == 0 {
-							continue
-						}
-						if qu.IntAll(vs[k]) > 0 {
-							data[k] = vs[k]
-							isMerge = true
-							break
-						}
-					}
-				}
-			}
-			if !isMerge {
-				data[k] = v
-			}
-		}
-	} else {
-
-	}
-	return data
+	//医院信息处理
+	dealWithHospitalBaseInfo("f_hospital_39jk", "hospital_39jk_ain_depart", "39健康")
+	dealWithHospitalBaseInfo("f_hospital_hdf", "hospital_hdf_ain_depart", "好大夫")
+	dealWithHospitalBaseInfo("f_hospital_yydq", "hospital_yydq_ain_depart", "医院大全")
+	dealWithHospitalBaseInfo("f_hospital_yyyc", "", "医药英才网")
+	confirmHospitalData("zktest_hospital_info")
 }

+ 77 - 10
filedproject_medical/data_preparation/src/hospital/hospital_method.go

@@ -4,6 +4,7 @@ import (
 	"class"
 	"encoding/json"
 	log "github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson/primitive"
 	"io/ioutil"
 	"net/http"
 	qu "qfw/util"
@@ -49,14 +50,14 @@ func inquirHospitalLevelType(med_level string, med_type string, med_bus_type str
 
 	//最终核对
 	if new_level == "" {
-		new_level = class.Medical_level["其它"]
+		new_level = class.Medical_Level["其它"]
 	}
 	if new_type == "" {
-		new_type = class.Medical_type["其它"]
+		new_type = class.Medical_Type["其它"]
 		log.Debug(new_type)
 	}
 	if new_bus_type == "" {
-		new_bus_type = "2"
+		new_bus_type = "3"
 	}
 	return new_level, new_type, new_bus_type
 }
@@ -64,16 +65,16 @@ func inquirHospitalLevelType(med_level string, med_type string, med_bus_type str
 // level 医疗等级对比
 func relevanceLevel(med_level string) string {
 	new_level := ""
-	if class.Medical_level[med_level] != "" {
-		new_level = class.Medical_level[med_level]
+	if class.Medical_Level[med_level] != "" {
+		new_level = class.Medical_Level[med_level]
 	} else { //特殊描述映射关系
 		if med_lev_Reg1.MatchString(med_level) {
 			med_level = med_lev_Reg1.ReplaceAllString(med_level, "${1}级${2}等")
-			new_level = class.Medical_level[med_level]
+			new_level = class.Medical_Level[med_level]
 		}
 		if med_lev_Reg2.MatchString(med_level) {
 			med_level = med_lev_Reg2.ReplaceAllString(med_level, "${1}${2}其它")
-			new_level = class.Medical_level[med_level]
+			new_level = class.Medical_Level[med_level]
 		}
 	}
 	return new_level
@@ -83,7 +84,7 @@ func relevanceLevel(med_level string) string {
 func relevanceType(med_type string) string {
 	new_type := ""
 	//扩展~包含关系~等等规则
-	new_type = class.Medical_type[med_type]
+	new_type = class.Medical_Type[med_type]
 	return new_type
 }
 
@@ -92,10 +93,10 @@ func relevanceBusType(med_bus_type string) string {
 	new_bus_type := ""
 	//0公立、1民营、2其它
 	if strings.Contains(med_bus_type, "公立") {
-		new_bus_type = "0"
+		new_bus_type = "1"
 	}
 	if strings.Contains(med_bus_type, "民营") {
-		new_bus_type = "1"
+		new_bus_type = "2"
 	}
 	return new_bus_type
 }
@@ -180,6 +181,11 @@ func supplementRegionally(area *string, city *string, district *string, name str
 		}
 	}
 }
+func regionallyCode(area string, city string, district string) string {
+	region_code := "00"
+
+	return region_code
+}
 
 //是否相同地域
 func repeatRegion(region map[string]string, data map[string]string) bool {
@@ -199,3 +205,64 @@ func repeatRegion(region map[string]string, data map[string]string) bool {
 
 	return true
 }
+
+//合并别名
+func mergeAliasData(dataArr []map[string]interface{}, name string) string {
+	new_alias := ""
+	keys := map[string]string{}
+	keysArr := []string{}
+	for _, v := range dataArr {
+		alias := qu.ObjToString(v["alias"])
+		if alias == "" {
+			continue
+		}
+		arr := strings.Split(alias, ",")
+		for _, nv := range arr {
+			if nv != "" && nv != name && keys[nv] == "" {
+				keys[nv] = nv
+				keysArr = append(keysArr, nv)
+			}
+		}
+	}
+	if len(keysArr) > 0 {
+		new_alias = strings.Join(keysArr, ",")
+	}
+	return new_alias
+}
+
+//合并科室信息
+func mergeDepartData(dataArr []map[string]interface{}) []map[string]interface{} {
+	new_departs := []map[string]interface{}{}
+	keys := map[string]string{}
+	for _, v := range dataArr {
+		if arr, ok := v["departs"].([]interface{}); ok {
+			depart_arr := qu.ObjArrToMapArr(arr)
+			for _, vs := range depart_arr {
+				key := qu.ObjToString(vs["departclass1"]) + "~" + qu.ObjToString(vs["departclass2"])
+				if keys[key] == "" {
+					keys[key] = key
+					new_departs = append(new_departs, vs)
+				}
+			}
+		}
+		if arr, ok := v["departs"].(primitive.A); ok {
+			depart_arr := qu.ObjArrToMapArr(arr)
+			for _, vs := range depart_arr {
+				key := qu.ObjToString(vs["departclass1"]) + "~" + qu.ObjToString(vs["departclass2"])
+				if keys[key] == "" {
+					keys[key] = key
+					new_departs = append(new_departs, vs)
+				}
+			}
+		}
+	}
+	return new_departs
+}
+
+//规则计算科室对应代码等等
+func confirmDepartCode(class1 string, class2 string) string {
+	new_code := ""
+	//一系列对比~
+
+	return new_code
+}

+ 163 - 0
filedproject_medical/data_preparation/src/hospital/hospital_sql.go

@@ -0,0 +1,163 @@
+package hospital
+
+import (
+	"class"
+	log "github.com/donnie4w/go-logger/logger"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	qu "qfw/util"
+	"strings"
+	"sync"
+	"time"
+)
+
+var hossqllock sync.Mutex
+
+//医院基本信息
+func exportHospitalInfoToMysql() {
+	log.Debug("生成sql数据~医院信息~")
+	sess := class.Save_Mgo.GetMgoConn()
+	defer class.Save_Mgo.DestoryMongoConn(sess)
+	q := map[string]interface{}{}
+	it := sess.DB(class.Save_Mgo.DbName).C("zktest_hospital_info_new").Find(&q).Sort("_id").Iter()
+	pool := make(chan bool, 1)
+	wg := &sync.WaitGroup{}
+	total, isok := 0, 0
+	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()
+			}()
+
+			data := tmp
+			//等级~性质~代码
+			n_level, n_type, n_bus_type := inquirHospitalLevelType(qu.ObjToString(tmp["level"]), qu.ObjToString(tmp["type"]), qu.ObjToString(tmp["business_type"]))
+			data["level_code"] = n_level
+			data["mi_type_code"] = n_type
+			data["mi_business_type"] = qu.IntAll(n_bus_type)
+
+			//行政区划代码~匹配
+			region_code := regionallyCode(qu.ObjToString(tmp["area"]), qu.ObjToString(tmp["city"]), qu.ObjToString(tmp["district"]))
+			data["areacode"] = region_code
+
+			//时间相关
+			data["comeintime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeTmeplate)
+			data["updatetime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeTmeplate)
+
+			delete(data, "_id")
+			delete(data, "area")
+			delete(data, "city")
+			delete(data, "district")
+			delete(data, "level")
+			delete(data, "type")
+			delete(data, "business_type")
+			delete(data, "departs")
+			delete(data, "alias")
+
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+	wg.Wait()
+	log.Debug("is cur over ", total, "~", isok)
+
+}
+
+//医院别名信息
+func exportHospitalAliasToMysql() {
+	log.Debug("生成sql数据~医院信息~")
+	sess := class.Save_Mgo.GetMgoConn()
+	defer class.Save_Mgo.DestoryMongoConn(sess)
+	q := map[string]interface{}{}
+	it := sess.DB(class.Save_Mgo.DbName).C("zktest_hospital_info_new").Find(&q).Sort("_id").Iter()
+	pool := make(chan bool, 1)
+	wg := &sync.WaitGroup{}
+	total, isok := 0, 0
+	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()
+			}()
+
+			data := map[string]interface{}{}
+			name := qu.ObjToString(tmp["name"])
+			alias := qu.ObjToString(tmp["alias"])
+			aliasArr := strings.Split(alias, ",")
+			//查询关联id~
+			for _, v := range aliasArr {
+				if v == "" || v == name {
+					continue
+				}
+				data["company_id"] = qu.ObjToString(tmp["_id"])
+				data["alias"] = v
+				data["sourcetype"] = "2"
+				data["company_id"] = qu.ObjToString(tmp["_id"])
+				data["comeintime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeTmeplate)
+			}
+
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+	wg.Wait()
+	log.Debug("is cur over ", total, "~", isok)
+
+}
+
+//医院科室信息
+func exportHospitalDepartsToMysql() {
+	log.Debug("生成sql数据~医院信息~")
+	sess := class.Save_Mgo.GetMgoConn()
+	defer class.Save_Mgo.DestoryMongoConn(sess)
+	q := map[string]interface{}{}
+	it := sess.DB(class.Save_Mgo.DbName).C("zktest_hospital_info_new").Find(&q).Sort("_id").Iter()
+	pool := make(chan bool, 1)
+	wg := &sync.WaitGroup{}
+	total, isok := 0, 0
+	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()
+			}()
+			departsArr := []map[string]interface{}{}
+			if arr, ok := tmp["departs"].([]interface{}); ok {
+				departsArr = qu.ObjArrToMapArr(arr)
+			}
+			if arr, ok := tmp["departs"].(primitive.A); ok {
+				departsArr = qu.ObjArrToMapArr(arr)
+			}
+
+			for _, v := range departsArr {
+				data := map[string]interface{}{}
+				data["company_id"] = qu.ObjToString(tmp["company_id"])
+				data["departname_class1"] = qu.ObjToString(v["departclass1"])
+				data["departname_class2"] = qu.ObjToString(v["departclass2"])
+				data["introduce"] = qu.ObjToString(v["depart_introduce"])
+				data["comeintime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeTmeplate)
+				data["updatetime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeTmeplate)
+				departname_code := confirmDepartCode
+				data["departname_code"] = departname_code
+			}
+
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+	wg.Wait()
+	log.Debug("is cur over ", total, "~", isok)
+
+}

+ 346 - 0
filedproject_medical/data_preparation/src/hospital/hospital_work.go

@@ -0,0 +1,346 @@
+package hospital
+
+import (
+	"class"
+	log "github.com/donnie4w/go-logger/logger"
+	"github.com/uuid"
+	qu "qfw/util"
+	"strings"
+	"sync"
+	"time"
+	"unicode/utf8"
+)
+
+var hospitallock sync.Mutex
+var data_hospitals = map[string][]map[string]interface{}{}
+
+//整合医院数据
+func confirmHospitalData(save_coll string) {
+	//处理~医院信息
+	log.Debug("整合医院信息~", len(data_hospitals))
+	for _, v := range data_hospitals {
+		data := mergeHospitalInfo(v)
+		class.Save_Mgo.Save(save_coll, data)
+	}
+	log.Debug("待判重数据存储完毕~")
+	time.Sleep(10 * time.Second)
+	repeatHospital(save_coll)
+}
+
+//判重~医院数据
+func repeatHospital(save_coll string) {
+	log.Debug("开始判重医院数据...")
+	sess := class.Save_Mgo.GetMgoConn()
+	defer class.Save_Mgo.DestoryMongoConn(sess)
+	data_hospitals_alias := make(map[string][]string, 0)
+	data_hospitals_ids := make(map[string]string, 0)
+	data_hospitals_region := make(map[string]map[string]string, 0)
+
+	q := map[string]interface{}{}
+	it := sess.DB(class.Save_Mgo.DbName).C(save_coll).Find(&q).Sort("_id").Select(map[string]interface{}{
+		"name":  1,
+		"alias": 1,
+	}).Iter()
+	total, isok := 0, 0
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%1000 == 0 {
+			log.Debug("cur index ", total, "~", isok)
+		}
+		region := map[string]string{
+			"area":     qu.ObjToString(tmp["area"]),
+			"city":     qu.ObjToString(tmp["city"]),
+			"district": qu.ObjToString(tmp["district"]),
+		}
+		alias := qu.ObjToString(tmp["alias"])
+		name := qu.ObjToString(tmp["name"])
+		alias_arr := strings.Split(alias, ",")
+		alias_arr = append(alias_arr, name)
+		//减少重复对比...待
+		tmpid := class.BsonTOStringId(tmp["_id"])
+		temp_id := tmpid
+		//记录所有关联的id
+		if data_hospitals_alias[name] == nil {
+			//对比名称~
+			is_r := false
+			is_r_n := ""
+			for _, name_new := range alias_arr {
+				if name_new == "" {
+					continue
+				}
+				for k, v := range data_hospitals_alias {
+					//地域不一致~过滤
+					if !repeatRegion(data_hospitals_region[k], region) {
+						continue
+					}
+					for _, v1 := range v {
+						if v1 == "" {
+							continue
+						}
+						if strings.Contains(v1, name_new) || strings.Contains(name_new, v1) {
+							is_r = true
+							is_r_n = k
+							temp_id = data_hospitals_ids[is_r_n]
+							break
+						}
+					}
+					if is_r {
+						break
+					}
+				}
+				if is_r {
+					break
+				}
+			}
+			if is_r {
+				isok++
+				class.Save_Mgo.UpdateById(save_coll, tmpid, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"repeat":    1,
+						"repeat_id": temp_id,
+					},
+				})
+			}
+			//名称指向的id需要变更
+			data_hospitals_ids[name] = temp_id
+			data_hospitals_region[name] = region
+			data_hospitals_alias[name] = alias_arr
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ", total, "~", isok)
+
+	//合并判重后的数据
+	mergeRepeatHospital(save_coll)
+}
+
+//最终合并判重后的医院数据
+func mergeRepeatHospital(save_coll string) {
+	log.Debug("开始合并重复后的数据~待")
+	sess := class.Save_Mgo.GetMgoConn()
+	defer class.Save_Mgo.DestoryMongoConn(sess)
+	q := map[string]interface{}{
+		"repeat": 0,
+	}
+	it := sess.DB(class.Save_Mgo.DbName).C(save_coll).Find(&q).Sort("_id").Iter()
+	total, isok := 0, 0
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%1000 == 0 {
+			log.Debug("cur index ", total, "~", isok)
+		}
+		dataArr, _ := class.Save_Mgo.Find(save_coll, map[string]interface{}{
+			"repeat_id": class.BsonTOStringId(tmp["_id"]),
+		}, nil, nil)
+		isok = isok + len(dataArr) + 1
+		new_arr := []map[string]interface{}{tmp}
+		for _, v := range dataArr {
+			new_arr = append(new_arr, v)
+		}
+		new_data := mergeHospitalInfo(new_arr)
+		class.Save_Mgo.Save("zktest_hospital_info_new", new_data)
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ", total, "~", isok)
+}
+
+//处理医院基本信息~涉及多张表
+func dealWithHospitalBaseInfo(hos_coll string, depart_coll string, sourceweb string) {
+	log.Debug("处理医疗~医院基本信息")
+	sess := class.Save_Mgo.GetMgoConn()
+	defer class.Save_Mgo.DestoryMongoConn(sess)
+	q := map[string]interface{}{}
+	it := sess.DB(class.Save_Mgo.DbName).C(hos_coll).Find(&q).Sort("_id").Iter()
+	pool := make(chan bool, 6)
+	wg := &sync.WaitGroup{}
+	total, isok := 0, 0
+	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()
+			}()
+			name := qu.ObjToString(tmp["hospitalname"])
+			if name != "" && utf8.RuneCountInString(name) > 3 {
+				//医院基本信息
+				data_info := treatHospitalInfo(tmp)
+				name = qu.ObjToString(data_info["name"])
+				//科室相关信息
+				hos_id := qu.ObjToString(tmp["_id"])
+				data_depart := treatHospitalDepartment(hos_id, depart_coll)
+				data_info["departs"] = data_depart
+				//别名信息
+				data_info["alias"] = qu.ObjToString(tmp["alias"])
+				//网站来源
+				data_info["sourceweb"] = sourceweb
+
+				hospitallock.Lock()
+				if data_hospitals[name] == nil {
+					arr := []map[string]interface{}{data_info}
+					data_hospitals[name] = arr
+					isok++
+				} else {
+					arr := data_hospitals[name]
+					arr = append(arr, data_info)
+					data_hospitals[name] = arr
+				}
+				hospitallock.Unlock()
+			}
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+	wg.Wait()
+	log.Debug("is cur over ", len(data_hospitals), "~", total, "~", isok)
+}
+
+//数据构建~医院基本信息
+func treatHospitalInfo(tmp map[string]interface{}) map[string]interface{} {
+	data := map[string]interface{}{}
+	hospitalname := qu.ObjToString(tmp["hospitalname"])
+	hospitalname = strings.ReplaceAll(hospitalname, " ", "")
+	//医院名称~
+	data["name"] = hospitalname
+	//医院简介
+	data["introduce"] = qu.ObjToString(tmp["introduce"])
+	//医院地址
+	data["address"] = qu.ObjToString(tmp["address"])
+	//医院设备
+	data["equipment"] = qu.ObjToString(tmp["equipment"])
+	//床位数~
+	data["beds"] = qu.IntAll(tmp["beds"])
+	//门诊量/日
+	data["visit_perday"] = qu.IntAll(tmp["visit_perday"])
+	//医生人数
+	data["doctorsnum"] = qu.IntAll(tmp["doctorsnum"])
+
+	//联系电话~
+	data["tel"] = qu.ObjToString(tmp["tel"])
+	//传真号码
+	data["fax_number"] = qu.ObjToString(tmp["fax_number"])
+	//医院网站
+	data["website"] = qu.ObjToString(tmp["website"])
+
+	data["level"] = qu.ObjToString(tmp["level"])
+	data["type"] = qu.ObjToString(tmp["type"])
+	data["business_type"] = qu.ObjToString(tmp["business_type"])
+
+	//省市区
+	area := qu.ObjToString(tmp["area"])
+	city := qu.ObjToString(tmp["city"])
+	district := qu.ObjToString(tmp["district"])
+	if city == "" { //补充~省份城市信息
+		supplementRegionally(&area, &city, &district, hospitalname, qu.ObjToString(tmp["address"]))
+	}
+	data["area"] = area
+	data["area"] = city
+	data["area"] = district
+
+	company_id := ""
+	//关联企业信息~查询顺序~企业~特殊~自生
+	company_id = inquirBaseInfoid(hospitalname)
+	if company_id == "" {
+		company_id = uuid.New().String()
+		//新增一个信息来源
+		//需要完善
+
+	}
+	data["company_id"] = company_id
+
+	return data
+}
+
+//数据构建~医院科室信息
+func treatHospitalDepartment(hos_id string, depart_coll string) []map[string]interface{} {
+	new_arr := []map[string]interface{}{}
+	if depart_coll == "" {
+		return new_arr
+	}
+	dataArr, _ := class.Save_Mgo.Find(depart_coll, map[string]interface{}{"hospital_id": hos_id}, nil, nil)
+	//考虑去重~相同科室~
+	keys := map[string]string{}
+	for _, v := range dataArr {
+		main_departclass1 := qu.ObjToString(v["main_departclass1"])
+		main_departclass2 := qu.ObjToString(v["main_departclass2"])
+		depart_introduce := qu.ObjToString(v["depart_introduce"])
+
+		key := main_departclass1 + "~" + main_departclass2
+		if keys[key] == "" {
+			new_arr = append(new_arr, map[string]interface{}{
+				"departclass1":     main_departclass1,
+				"departclass2":     main_departclass2,
+				"depart_introduce": depart_introduce,
+			})
+			keys[key] = key
+		}
+	}
+	return new_arr
+}
+
+//合并医院信息~
+func mergeHospitalInfo(dataArr []map[string]interface{}) map[string]interface{} {
+	data := map[string]interface{}{}
+	if len(dataArr) == 1 {
+		data = dataArr[0]
+		delete(data, "repeat")
+		delete(data, "repeat_id")
+		return data
+	} else if len(dataArr) > 1 {
+		//合并重复信息
+		temp := dataArr[0]
+		name := qu.ObjToString(temp["name"])
+		delete(temp, "repeat")
+		delete(temp, "repeat_id")
+		for k, v := range temp {
+			isMerge := false
+			if k == "alias" { //合并别名~
+				new_alias := mergeAliasData(dataArr, name)
+				data[k] = new_alias
+				continue
+			}
+			if k == "departs" { //合并科室~
+				new_departs := mergeDepartData(dataArr)
+				data[k] = new_departs
+				continue
+			}
+			if k == "area" || k == "city" || k == "district" {
+				data[k] = v
+				continue
+			}
+			//选取最优值
+			if new_v, ok := v.(string); ok {
+				if new_v == "" { //非空补充
+					for ks, vs := range dataArr {
+						if ks == 0 {
+							continue
+						}
+						if qu.ObjToString(vs[k]) != "" {
+							data[k] = vs[k]
+							isMerge = true
+							break
+						}
+					}
+				}
+			}
+			if new_v, ok := v.(int); ok {
+				for ks, vs := range dataArr {
+					if ks == 0 {
+						continue
+					}
+					if qu.IntAll(vs[k]) > new_v {
+						data[k] = vs[k]
+						isMerge = true
+					}
+				}
+			}
+			if !isMerge {
+				data[k] = v
+			}
+		}
+	} else {
+
+	}
+	return data
+}

+ 2 - 1
filedproject_medical/data_preparation/src/main.go

@@ -4,6 +4,7 @@ import (
 	"class"
 	"flag"
 	log "github.com/donnie4w/go-logger/logger"
+	"hospital"
 	"net/http"
 	"time"
 )
@@ -14,7 +15,7 @@ func init() {
 func main() {
 	log.Debug("领域化产品准备......")
 
-	//具体数据处理
+	hospital.RunHospitalInfo()
 
 	time.Sleep(999 * time.Hour)
 }

+ 8 - 11
filedproject_medical/data_preparation/src/product/product.go

@@ -6,6 +6,7 @@ import (
 	qu "qfw/util"
 	"strings"
 	"sync"
+	"time"
 )
 
 var productlock sync.Mutex
@@ -36,12 +37,10 @@ func dealWithMedicalProductInfo() {
 				wg.Done()
 			}()
 
-			data := treatProductInfo(tmp)
-			if data != nil {
-				productlock.Lock()
-				isok++
-				productlock.Unlock()
-			}
+			treatProductInfo(tmp)
+			//插入sql
+			
+
 		}(tmp)
 		tmp = make(map[string]interface{})
 	}
@@ -55,10 +54,10 @@ func dealWithMedicalProductInfo() {
 func treatProductInfo(tmp map[string]interface{}) map[string]interface{} {
 	data := map[string]interface{}{}
 	data["regno"] = qu.ObjToString(tmp["regno"])
-	data["company_name"] = qu.ObjToString(tmp["company_name"])
 	data["company_address"] = qu.ObjToString(tmp["company_address"])
 	data["make_adress"] = qu.ObjToString(tmp["make_adress"])
-	data["make_country"] = qu.ObjToString(tmp["make_country"])
+	//国产进口
+	data["make_country"] = qu.IntAll(tmp["make_country"])
 	data["agent_name"] = qu.ObjToString(tmp["agent_name"])
 	data["agent_address"] = qu.ObjToString(tmp["agent_address"])
 	data["model"] = qu.ObjToString(tmp["model"])
@@ -84,15 +83,13 @@ func treatProductInfo(tmp map[string]interface{}) map[string]interface{} {
 	data["source_channel"] = qu.ObjToString(tmp["source_channel"])
 	data["manage_type"] = qu.ObjToString(tmp["manage_type"])
 	data["product_name"] = qu.ObjToString(tmp["product_name"])
-
 	data["medical_equipment_class1"] = qu.ObjToString(tmp["product_class1"])
 	data["medical_equipment_class2"] = qu.ObjToString(tmp["product_class2"])
 	data["medical_equipment_class3"] = qu.ObjToString(tmp["product_class3"])
 	data["sdproduct_name"] = qu.ObjToString(tmp["product_class4"])
-
-	//需要清洗
 	data["medical_equipment_code"] = qu.ObjToString(tmp["product_code"])
 	data["Isvalid"] = true
+	data["comeintime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeTmeplate)
 
 	return data
 }