ソースを参照

数据准备~医疗科室信息~补充

zhengkun 2 年 前
コミット
f4206e07e0

+ 5 - 1
fieldproject_medical/data_preparation/src/class/initdata.go

@@ -35,9 +35,12 @@ const (
 var (
 	Save_Mgo, Spi_Mgo                 *MongodbSim
 	MysqlMedicalTool, MysqlGlobalTool *Mysql
-	Config                            map[string]interface{}
+	TypeConfig, DepartConfig          map[string]interface{}
 	//类型规则
 	Medical_RuleType = []map[string]interface{}{}
+	//科室规则
+	Medical_RuleDepart = []map[string]interface{}{}
+
 	//涉及的代码表
 	Medical_Type_Datas    = map[string]string{}
 	Medical_Level_Datas   = map[string]string{}
@@ -137,6 +140,7 @@ func initVCode() {
 
 func initLocalData() {
 	initRuleTypeData()
+	initRuleDepartData()
 	initYiXueData()
 }
 

+ 15 - 3
fieldproject_medical/data_preparation/src/class/initlocal.go

@@ -8,16 +8,28 @@ import (
 
 //加载类型规则
 func initRuleTypeData() {
-	qu.ReadConfig("./rule_type.json", &Config)
-	if arr, ok := Config["rule"].([]interface{}); ok {
+	qu.ReadConfig("./rule_type.json", &TypeConfig)
+	if arr, ok := TypeConfig["rule"].([]interface{}); ok {
 		Medical_RuleType = qu.ObjArrToMapArr(arr)
 	}
-	if arr, ok := Config["rule"].(primitive.A); ok {
+	if arr, ok := TypeConfig["rule"].(primitive.A); ok {
 		Medical_RuleType = qu.ObjArrToMapArr(arr)
 	}
 	log.Debug("类型规则~", len(Medical_RuleType))
 }
 
+//加载科室规则
+func initRuleDepartData() {
+	qu.ReadConfig("./rule_depart.json", &DepartConfig)
+	if arr, ok := DepartConfig["rule"].([]interface{}); ok {
+		Medical_RuleDepart = qu.ObjArrToMapArr(arr)
+	}
+	if arr, ok := DepartConfig["rule"].(primitive.A); ok {
+		Medical_RuleDepart = qu.ObjArrToMapArr(arr)
+	}
+	log.Debug("科室规则~", len(Medical_RuleDepart))
+}
+
 //加载医学百科数据
 func initYiXueData() {
 	sess := Save_Mgo.GetMgoConn()

+ 72 - 0
fieldproject_medical/data_preparation/src/hospital/hospital_pingan.go

@@ -0,0 +1,72 @@
+package hospital
+
+import (
+	"class"
+	log "github.com/donnie4w/go-logger/logger"
+	qu "qfw/util"
+	"time"
+)
+
+var province_map = map[string]string{
+	"BJ": "北京", "TJ": "天津", "SH": "上海", "CQ": "重庆", "HB": "河北", "SX": "山西", "NMG": "内蒙古", "LN": "辽宁", "JL": "吉林",
+	"HLJ": "黑龙江", "JS": "江苏", "ZJ": "浙江", "AH": "安徽", "FJ": "福建", "JX": "江西", "SD": "山东", "HEN": "河南", "HUB": "湖北",
+	"HUN": "湖南", "GD": "广东", "GX": "广西", "HAIN": "海南", "SC": "四川", "GZ": "贵州", "YN": "云南", "XZ": "西藏", "SAX": "陕西",
+	"GS": "甘肃", "QH": "青海", "NX": "宁夏", "XJ": "新疆",
+}
+
+//补充凭安数据~ special_enterprise_use
+func SupplementPingAnMedicalData() {
+	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("special_enterprise_use").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)
+		}
+		company_id := qu.ObjToString(tmp["company_id"])
+		if company_id != "" {
+			data := class.MysqlMedicalTool.FindOne(class.V_Institution_Baseinfo, map[string]interface{}{
+				"company_id": company_id,
+			}, "company_id", "")
+			if data == nil { //可以补充
+				isok++
+				//构建数据信息
+				dealWithPingAnInfo(tmp)
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("凭安补充医疗机构~~over~~ ", total, isok)
+}
+
+func dealWithPingAnInfo(tmp map[string]interface{}) {
+	data_info := map[string]interface{}{}
+	data_info["company_id"] = qu.ObjToString(tmp["company_id"])
+	data_info["mi_name"] = qu.ObjToString(tmp["company_name"])
+	data_info["address"] = qu.ObjToString(tmp["company_address"])
+	data_info["introduce"] = qu.ObjToString(tmp["business_scope"])
+
+	new_level, new_type, new_bustype, new_sdequipment := codificationOfInfo("其它", "其它~", "其它")
+	data_info["level_code"] = new_level
+	data_info["mi_type_code"] = new_type
+	data_info["business_type"] = new_bustype
+	data_info["sdequipment_code"] = new_sdequipment
+
+	province_short := qu.ObjToString(tmp["province_short"])
+	area := province_map[province_short]
+	//地域代码
+	area_code := regionallyCode(area, "", "")
+	data_info["area_code"] = area_code
+
+	data_info["sourceweb"] = "凭安"
+	data_info["pcompany_id"] = ""
+	data_info["mark_id"] = 4
+	data_info["comeintime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeLayout)
+	data_info["updatetime"] = time.Unix(time.Now().Unix(), 0).Format(class.TimeLayout)
+	//插入sql
+	class.InsertMedicalMysqlData(class.V_Institution_Baseinfo, data_info, qu.ObjToString(tmp["company_id"]))
+
+}

+ 118 - 13
fieldproject_medical/data_preparation/src/hospital/hospital_ways.go

@@ -17,6 +17,7 @@ var med_lev_Reg1 = regexp.MustCompile("^([一二三])([甲乙丙特])$")
 var med_lev_Reg2 = regexp.MustCompile("^([一二三])(级)(医院)?$")
 var dataLock sync.Mutex
 var addressReg = regexp.MustCompile("(.*市).*")
+var departSpecReg1 = regexp.MustCompile("(小儿眼科与斜弱视学科|眼表疾病学科|眼科|眼眶及眼肿瘤学科|青光眼与视神经疾病学科|视光学科|白内障与晶状体疾病学科|玻璃体视网膜疾病学科|角膜科)")
 
 //查询企业id
 func inquirBaseInfoid(name string) string {
@@ -199,28 +200,132 @@ func mergeDepartData(dataArr []map[string]interface{}) []map[string]interface{}
 //规则计算科室对应代码等等
 func confirmDepartNameCode(class1 string, class2 string) (string, string) {
 	new_name := ""
-	new_code := "" //默认其它~
-	//一系列对比~
-	departs := class.Medical_Departs_Datas[class1]
-	if departs != nil { //一级科室能匹配上
+	new_code := ""
+	if class1 == "" {
+		return "其它", class.Medical_Departs_Datas["其它"]["departs_code"]
+	}
+	pre_b, pre_name, pre_code := confirmDepartPreRule(class1, class2)
+	if pre_b {
+		return pre_name, pre_code
+	}
+
+	if class.Medical_Departs_Datas[class1] != nil {
 		new_name = class1
-		new_code = departs["departs_code"]
-		if departs[class2] != "" { //二级科室能匹配上
-			new_name = class1 + "~" + class2
-			new_code = departs[class2]
-		} else {
-			if departs["其它"] != "" {
-				new_name = new_name + "~" + "其它"
-				new_code = departs["其它"]
+		new_code = class.Medical_Departs_Datas[class1]["departs_code"]
+	} else {
+		spec_data := map[string][]map[string]interface{}{}
+	F:
+		for _, v := range class.Medical_RuleDepart {
+			for k, v1 := range v {
+				rule := *qu.ObjToMap(v1)
+				exclude := qu.ObjToString(rule["exclude"])
+				first := qu.ObjToString(rule["first"])
+				second := convertInterfaceMap(rule["second"])
+				if first != "" && regexp.MustCompile(first).MatchString(class1) {
+					new_name = k
+					new_code = class.Medical_Departs_Datas[new_name]["departs_code"]
+					spec_data = map[string][]map[string]interface{}{}
+					break F
+				}
+				if exclude != "" && class2 != "" && regexp.MustCompile(exclude).MatchString(class1) {
+					spec_data[k] = second
+				}
 			}
 		}
-	} else {
+		if len(spec_data) > 0 {
+			for k, v := range spec_data {
+				if class.Medical_Departs_Datas[k][class2] != "" {
+					new_name = k + "~" + class2
+					new_code = class.Medical_Departs_Datas[k][class2]
+					return new_name, new_code
+				}
+				for _, v1 := range v {
+					for k2, v2 := range v1 {
+						rule := qu.ObjToString(v2)
+						if rule != "" && regexp.MustCompile(rule).MatchString(class2) {
+							new_name = k + "~" + k2
+							new_code = class.Medical_Departs_Datas[k][k2]
+							return new_name, new_code
+						}
+					}
+				}
+			}
+			return "其它", class.Medical_Departs_Datas["其它"]["departs_code"]
+		}
+	}
+
+	//已找到一级需要~关联二级
+	if new_name != "" && new_code != "" {
+		departs := class.Medical_Departs_Datas[new_name]
+		if class2 != "" {
+			if departs[class2] != "" {
+				new_name += "~" + class2
+				new_code = departs[class2]
+				return new_name, new_code
+			} else {
+				for _, v := range class.Medical_RuleDepart {
+					for k, v1 := range v {
+						if k == new_name {
+							data := *qu.ObjToMap(v1)
+							second := convertInterfaceMap(data["second"])
+							for _, v2 := range second {
+								for k3, v3 := range v2 {
+									rule := qu.ObjToString(v3)
+									if rule != "" && regexp.MustCompile(rule).MatchString(class2) {
+										new_name += "~" + k3
+										new_code = class.Medical_Departs_Datas[k][k3]
+										return new_name, new_code
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		//未找到合适的二级数据~
+		if departs["其它"] != "" {
+			new_name += "~" + "其它"
+			new_code = departs["其它"]
+		}
+	}
+	if new_name == "" || new_code == "" {
 		new_name = "其它"
 		new_code = class.Medical_Departs_Datas[new_name]["departs_code"]
 	}
 	return new_name, new_code
 }
 
+//确认科室~前置规则~
+func confirmDepartPreRule(class1 string, class2 string) (bool, string, string) {
+	//前置规则比对~
+	if class1 == "骨科" {
+		return true, "外科" + "~" + "骨科", class.Medical_Departs_Datas["外科"]["骨科"]
+	}
+	if class1 == "五官" && departSpecReg1.MatchString(class2) {
+		return true, "眼科", class.Medical_Departs_Datas["眼科"]["departs_code"]
+	}
+	if (class1 == "传染病科" && strings.Contains(class2, "结核病")) ||
+		((class1 == "传染病科" || class1 == "其他科室") && strings.Contains(class2, "地方病科")) {
+		return true, "结核病科", class.Medical_Departs_Datas["结核病科"]["departs_code"]
+	}
+	if class1 == "其他科室" {
+		if strings.Contains(class2, "临终关怀") {
+			return true, "临终关怀科", class.Medical_Departs_Datas["临终关怀科"]["departs_code"]
+		}
+		if strings.Contains(class2, "特种医学科") {
+			return true, "特种医学与军事医学科", class.Medical_Departs_Datas["特种医学与军事医学科"]["departs_code"]
+		}
+		if strings.Contains(class2, "重症医学科") {
+			return true, "重症医学科", class.Medical_Departs_Datas["重症医学科"]["departs_code"]
+		}
+		if strings.Contains(class2, "中西医结合") {
+			return true, "中西医结合科", class.Medical_Departs_Datas["中西医结合科"]["departs_code"]
+		}
+	}
+	return false, "", ""
+}
+
 //类型规则
 func cleanHospitalType(tmp map[string]interface{}, update *map[string]interface{}) {
 	med_type := qu.ObjToString(tmp["type"])

+ 5 - 0
fieldproject_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,6 +15,10 @@ func init() {
 }
 func main() {
 	log.Debug("run main ... ")
+	hospital.SupplementPingAnMedicalData()
+
+	//hospital.RunMergeHospitalInfo("zktest_hospital_info", "zktest_hospital_info_new")
+
 	//处理医院
 	//hospital.RunHospital()
 	//导入信息~医疗关联sql表

+ 212 - 0
fieldproject_medical/data_preparation/src/rule_depart.json

@@ -0,0 +1,212 @@
+{
+    "rule": [        {
+            "妇产科": {
+                "exclude": "^(其他科室)$",
+                "first": "^(妇产科学)$",
+                "second": [
+                    {"计划生育科": "(计划生育|计划生育服务部|计划生育服务指导中心|计划生育服务中心|计划生育技术服务部|计划生育技术服务中心|计划生育科|计划生育门诊|计划生育与不孕不育科|计划生育中心|计划生育综合科)"},
+                    {"优生学科": "(婚检优生科|遗传、优生科|遗传优生科|遗传优生与妇保|遗传优生咨询|遗传与优生门诊|优生科|优生遗传、同位素科|优生遗传科|优生遗传咨询专病门诊|优生优育科|优生优育门诊|优生优育遗传中心|优生优育指导部)"},
+                    {"生殖健康与不孕症科": "(不孕不育科|不孕症门诊|生殖健康门诊|生殖健康与不孕症科|遗传生殖医学中心|生殖中心|生殖不孕|生殖医学中心|17楼生殖中心|北城生殖医学科|不孕不育生殖科|不孕不育生殖医学中心|不孕不育与生殖健康科|不孕不育与生殖男科|大学城生殖医学科|大学城五楼生殖医学科|福强生殖健康科|福强生殖医学中心|福强生殖综合门诊|福强生殖综合特诊|福强生殖综合诊|福强院区生殖健康科|河西生殖中心门诊|湖北省生殖保健中心|焦作市生殖医学中心|临床生殖医学中心|生殖保健|生殖保健科|生殖保健门诊|生殖保健中心|生殖不孕|生殖不孕科|生殖不孕中心|生殖健康|生殖健康科|生殖健康科福强院|生殖健康科治疗室|生殖健康门诊|生殖健康男科|生殖健康男性门诊|生殖健康与不孕|生殖健康与不孕不育|生殖健康与不孕不育科|生殖健康与不孕不育门诊|生殖健康与不孕不育症科|生殖健康与不孕科|生殖健康与不孕门诊|生殖健康与不孕症|生殖健康中心|生殖健康助孕中心|生殖健康专家|生殖健康专科|生殖健康咨询专科|生殖科|生殖门诊|生殖与不孕不育科|生殖与不孕门诊|生殖与不孕研究所|生殖与不孕专家)"}
+               ]
+            }
+        },   {
+            "儿科": {
+                "exclude": "^(儿科学)$",
+                "first": "",
+                "second": [
+					{"新生儿科":"(新生儿)"},
+					{"小儿传染病科":"(结核科)"},
+					{"小儿消化科":"(消化科|消化内科|消化营养科)"},
+					{"小儿呼吸科":"(呼吸哮喘|呼吸|呼吸科)"},
+					{"小儿心脏病科":"(儿童心脏科|儿童心脏中心|小儿心脏科|小儿心脏中心|心脏小儿科|心儿科|心内科)"},
+					{"小儿肾病科":"(肾病专科|肾病科|肾病内科^消化|肾内科|肾脏科|肾脏内科|肾脏病)"},
+					{"小儿血液病科":"(血液病专科|血液专科|血液科|血液内科|小儿血液)"},
+					{"小儿神经病学科":"(儿科(神经专业组)|儿科神经内分泌专科|儿神经科|儿童神经科|神经内科|小儿神经病科|小儿神经内科|小儿神经消化科|小儿神经专科)"},
+					{"小儿内分泌科":"(儿科内分泌|儿科神经内分泌专科|儿童内分泌遗传代谢科|内分泌科|小儿内分泌遗传科|小儿内分泌专科|小儿血液内分泌科)"},
+					{"小儿免疫科":"(儿科风湿免疫专科|儿科肾脏风湿免疫科|儿童变态反应(过敏)与免疫科|儿童风湿免疫过敏科|儿童肾脏风湿免疫科|小儿风湿免疫科|小儿肾脏风湿免疫科|风湿科)"}
+               ]
+            }
+        },  {
+            "小儿外科": {
+                "exclude": "^(儿科学)$",
+                "first": "",
+                "second": [
+					{"小儿普通外科":"(儿童基础外科|儿童外科|儿外科|普通外科二科(儿外科)|普通小儿外科|普外儿外科|小儿普外科|小儿外科|小儿外科、普外科|新生儿外科)"},
+					{"小儿骨科":"(矫形及肢体重建外科/小儿骨科|小儿骨外科)"},
+					{"小儿泌尿外科":"(儿童泌尿外科|泌尿外科|泌尿小儿外科|泌尿与小儿外科|女性泌尿与小儿外科|小儿泌尿外科)"},
+					{"小儿胸心外科":"(儿童心胸外科|儿外胸外科|小儿心胸外科|小儿胸外科|胸心小儿外科)"},
+					{"小儿神经外科":"(儿童神经外科|小儿神经外科)"}
+
+               ]
+            }
+        },   {
+            "儿童保健科": {
+                "exclude": "^(儿科学)$",
+                "first": "",
+                "second": [
+					{"儿童生长发育科":"(儿童生长发育科|儿童生长发育专科|儿童发育行为科|儿童行为发育中心|发育儿科|发育行为儿科|发育行为儿童保健科|神经发育科|语言发育科)"},
+					{"儿童营养科":"(小儿消化营养科|小儿营养保健科)"},
+					{"儿童心理卫生科":"(儿少心理科|儿童心理科|儿童心理门诊|儿童心理指导部|青少年儿童心理中心|小儿精神心理科)"},
+					{"儿童康复科":"(儿科康复|儿科康复中心|儿童保健康复科|儿童保健康复中心|儿童孤独症康复治疗中心|儿童康复保健科|儿童康复科|儿童康复医学科|儿童康复治疗部|儿童康复中心|儿童脑病康复中心|儿童神经康复科|儿童医学康复中心|小儿康复科|小儿脑病康复中心|小儿神经康复科|小儿神经康复中心)"}
+               ]
+            }
+        },  
+        {
+            "耳鼻咽喉科": {
+                "exclude": "^(耳鼻喉头颈外科|五官)$",
+                "first": "",
+                "second": [
+                    {"耳科": "(耳病|耳疾|耳科|耳聋|耳鸣|耳内科|耳专科)"},
+                    {"鼻科": "(鼻炎|鼾病|鼾症)"},
+                    {"咽喉科": "(喉疾病|甲状腺病)"}
+               ]
+            }
+        },
+        {
+            "口腔科": {
+                "exclude": "^(耳鼻喉头颈外科|五官)$",
+                "first": "^(口腔)$",
+                "second": [
+                    {"口腔内科": "(口腔内科)"},
+                    {"口腔颌面外科": "(颌面)"},
+                    {"正畸科": "(矫形|正畸)"},
+                    {"口腔修复科": "(口腔修复|口腔科)"},
+                    {"口腔预防保健科": "(口腔预防)"}
+                ]
+            }
+        },
+        {
+            "皮肤科": {
+                "exclude": "",
+                "first": "^(皮肤性病科)$",
+                "second": [
+                    {"皮肤病科": "(皮肤科)"},
+                    {"性传播疾病科": "(艾滋病专科)"}
+                ]
+            }
+        },
+        {
+            "医疗美容科": {
+                "exclude": "",
+                "first": "^(皮肤美容|整形美容科)$",
+                "second": []
+            }
+        },
+        {
+            "精神科": {
+                "exclude": "^(其他科室)$",
+                "first": "^(精神|精神心理科)$",
+                "second": [
+					{"精神病科":"(精神病科)"},
+					{"精神卫生科":"(精神卫生)"},
+					{"药物依赖科":"(药物依赖|酒药依赖|药物和酒精依赖)"},
+					{"精神康复科":"(精神康复科)"},
+					{"临床心理科":"(临床心理|精神(心理)临床康复中心|临床.{1}科)"},
+					{"司法精神科":"(司法精神科)"}
+                ]
+            }
+        },
+        {
+            "传染科": {
+                "exclude": "^(传染|传染病科)$",
+                "first": "",
+                "second": [
+					{"肠道传染病科":"(肠道传染病|肠道传染病科)"},
+					{"肝炎科":"(肝病|肝炎|肝科|肝一科)"}
+                ]
+            }
+        },
+        {
+            "肿瘤科": {
+                "exclude": "",
+                "first": "^(肿瘤|肿瘤专科护理)$",
+                "second": [
+                ]
+            }
+        },
+        {
+            "急诊医学科": {
+                "exclude": "",
+                "first": "^(急诊科)$",
+                "second": [
+                ]
+            }
+        },
+        {
+            "康复医学科": {
+                "exclude": "",
+                "first": "^(康复)$",
+                "second": [
+                ]
+            }
+        },
+        {
+            "职业病科": {
+                "exclude": "^(其他科室)$",
+                "first": "",
+                "second": [
+					{"职业中毒科":"(职业病与中毒科|职业病与中毒医学科|职业中毒|中毒职业病)"},
+					{"尘肺科":"(尘肺)"}
+                ]
+            }
+        }, 
+        {
+            "麻醉科": {
+                "exclude": "",
+                "first": "^(麻醉医学科)$",
+                "second": [
+                ]
+            }
+        },
+        {
+            "医学影像科": {
+                "exclude": "^(其他科室|其它|核医学科)$",
+                "first": "",
+                "second": [
+					{"X线诊断科":"(X线科|X线诊断科)"},
+					{"CT诊断科":"(CT诊断)"},
+					{"磁共振成像诊断科":"(磁共振(MR)室|磁共振成像诊断科|磁共振检查|磁共振检查科|磁共振科|磁共振普通|磁共振室|磁共振影像科|磁共振诊断室|磁共振中心|放射科(磁共振室)|核磁共振科|核磁共振室|磁共振影像科|磁共振中心)"},
+					{"核医学科":"(核医学科|核医学普通|核医学实验检查|核医学室|核医学中心|核医学门诊|核医学实验室|核医学研究室|核医学专科)"},
+					{"超声诊断科":"(超声诊断)"},
+					{"神经肌肉电图科":"(神经肌肉检查室)"},
+					{"介入放射学科":"(介入放射)"},
+					{"放射治疗科":"(放射治疗科|放射治疗中心)"}
+                ]
+            }
+        },
+        {
+			"中医科": {
+                "exclude": "",
+                "first": "^(中医)$",
+                "second": [
+					{"内科":"(内.{1}科|内科)"},
+					{"外科":"(外科|外.{1}科)"},
+					{"妇产科":"(妇产|妇儿|妇科)"},
+					{"儿科":"(儿科|儿内科)"},
+					{"皮肤科":"(皮肤)"},
+					{"耳鼻咽喉科":"(耳、鼻、喉科|耳鼻喉|耳鼻喉科|耳鼻喉头颈外科|耳鼻喉咽科|耳鼻咽喉科|耳鼻咽喉头颈科|耳鼻咽喉头颈外科|耳鼻咽喉-头颈外科)"},
+					{"骨伤科":"(骨伤|骨科|骨外科)"},
+					{"肛肠科":"(肛肠)"},
+					{"老年病科":"(老年病|老年科|老年干部科|老年医学)"},
+					{"针灸科":"(针灸)"},
+					{"推拿科":"(推拿)"},
+					{"康复医学":"(康复)"},
+					{"急诊科":"(急诊)"}
+
+                ]
+            }
+        },
+        {
+			"民族医学科": {
+                "exclude": "^(其他科室)$",
+                "first": "",
+                "second": [
+					{"藏医学科":"(藏医、回医科|藏医科|藏医全科)"},
+					{"蒙医学科":"(布病蒙医科|蒙医儿科|蒙医耳鼻喉科|蒙医肺病科|蒙医风湿病科|蒙医妇科|蒙医骨伤科|蒙医康复科|蒙医科|蒙医老年病科|蒙医疗术科|蒙医脑病科|蒙医内分泌科|蒙医内科|蒙医脾胃病科|蒙医贴敷疗法科|蒙医五疗科|蒙医心血管内科|蒙医心脏病科|蒙医学科|蒙医血液病科|蒙医血液疑难病科|蒙医针灸五疗科|蒙医针推科|蒙医整骨科|蒙医肿瘤科|蒙医紫癜科)"},
+					{"彝医学科":"(彝医)"}
+                ]
+            }
+        }
+    ]
+
+}

+ 71 - 22
fieldproject_medical/data_service/src/bidding/bidding.go

@@ -12,23 +12,31 @@ import (
 	ul "util"
 )
 
-var fields = map[string]interface{}{"toptype": 1, "subtype": 1, "s_topscopeclass": 1, "s_subscopeclass": 1, "buyerclass": 1, "buyer": 1, "extracttype": 1, "purchasinglist": 1}
+var BidFields = map[string]interface{}{"toptype": 1, "subtype": 1, "s_topscopeclass": 1, "s_subscopeclass": 1, "buyerclass": 1, "buyer": 1, "extracttype": 1, "purchasinglist": 1}
 var datalock, numlock sync.Mutex
 
 var A_FieldReg *regexp.Regexp = regexp.MustCompile("(医疗卫生_设备|医疗卫生_耗材)")
 var B_FieldReg *regexp.Regexp = regexp.MustCompile("^(医疗|卫健委)$")
 
-func RunPurchasingInfo(gtid string, lteid string) {
-	log.Debug("开始处理标讯信息~~~", gtid, "~", lteid)
+func RunPurchasingInfo(gtid string, lteid string, obj_id bool) {
+	log.Debug("开始处理标讯信息~~~", ul.S_Bidding_Coll, "~", gtid, "~", lteid)
 	sess := ul.Mgo.GetMgoConn()
 	defer ul.Mgo.DestoryMongoConn(sess)
 	q := map[string]interface{}{
 		"_id": map[string]interface{}{
-			"$gt":  class.StringTOBsonId(gtid),
-			"$lte": class.StringTOBsonId(lteid),
+			"$gt":  gtid,
+			"$lte": lteid,
 		},
 	}
-	it := sess.DB(ul.Mgo.DbName).C(ul.S_Bidding_Coll).Find(&q).Sort("_id").Select(fields).Iter()
+	if obj_id {
+		q = map[string]interface{}{
+			"_id": map[string]interface{}{
+				"$gt":  class.StringTOBsonId(gtid),
+				"$lte": class.StringTOBsonId(lteid),
+			},
+		}
+	}
+	it := sess.DB(ul.Mgo.DbName).C(ul.S_Bidding_Coll).Find(&q).Sort("_id").Select(BidFields).Iter()
 	pool := make(chan bool, 8)
 	wg := &sync.WaitGroup{}
 	total, isok := 0, 0
@@ -47,11 +55,17 @@ func RunPurchasingInfo(gtid string, lteid string) {
 				<-pool
 				wg.Done()
 			}()
-			b := createBaseInfo(tmp) //构建信息
+			infoid := ""
+			if obj_id {
+				infoid = class.BsonTOStringId(tmp["_id"])
+			} else {
+				infoid = qu.ObjToString(tmp["_id"])
+			}
+			b := createBaseInfo(tmp, infoid) //构建信息
 			if b {
 				numlock.Lock()
 				isok++
-				ul.Mgo.UpdateById(ul.S_Bidding_Coll, class.BsonTOStringId(tmp["_id"]), map[string]interface{}{
+				ul.Mgo.UpdateById(ul.U_Bidding_Coll, class.BsonTOStringId(tmp["_id"]), map[string]interface{}{
 					"$set": map[string]interface{}{
 						"bid_field": "0101",
 					},
@@ -67,17 +81,18 @@ func RunPurchasingInfo(gtid string, lteid string) {
 }
 
 //构建标的物基本信息~模式一~规则型
-func createBaseInfo(tmp map[string]interface{}) bool {
+func createBaseInfo(tmp map[string]interface{}, infoid string) bool {
 	p_list := IsMarkInterfaceMap(tmp["purchasinglist"])
 	new_plist := []map[string]interface{}{}
-	infoid := class.BsonTOStringId(tmp["_id"])
 	bid_topsubtype_code := confrimTopSubCode(qu.ObjToString(tmp["toptype"]), qu.ObjToString(tmp["subtype"]))
 	industry_code := confrimIndustryCode(qu.ObjToString(tmp["s_topscopeclass"]), qu.ObjToString(tmp["s_subscopeclass"]))
-	isField := IsMedicalIndustryFieldInfo(tmp)
+	isField := IsMedicalFieldInfoRuleFirst(tmp)
 	if isField {
-		_, new_plist = createNewPurchasingInfo(p_list)
-	} else { //其他规则~验证是否能~通过验证
-		isField, new_plist = createNewPurchasingInfo(p_list)
+		_, new_plist = createNewPurchasingInfo(p_list, infoid)
+	} else {
+		if IsMedicalFieldInfoRuleSecond(tmp) {
+			isField, new_plist = createNewPurchasingInfo(p_list, infoid)
+		}
 	}
 	if isField { //最终根据是否为领域数据灌入数据
 		//标的物基本信息~记录标签
@@ -88,13 +103,25 @@ func createBaseInfo(tmp map[string]interface{}) bool {
 		insertIndustryTag(industry_code, infoid)
 	}
 
+	//临时处理
+	//isField, new_plist := createNewPurchasingInfo(p_list, infoid)
+	//if isField { //最终根据是否为领域数据灌入数据
+	//	//标的物基本信息~记录标签
+	//	insertBaseInfo(new_plist, infoid, bid_topsubtype_code)
+	//	//招标信息领域标签
+	//	insertFiledTag(infoid)
+	//	//招标信息行业标签
+	//	insertIndustryTag(industry_code, infoid)
+	//}
+
 	//阻止注释~报错
-	//if infoid == "" || bid_topsubtype_code == "" || industry_code == "" || len(new_plist) == 0 {}
+	//if bid_topsubtype_code == "" || industry_code == "" || len(new_plist) == 0 {}
+
 	return isField
 }
 
 //返回新的~标的物信息(分类+整合)
-func createNewPurchasingInfo(p_list []map[string]interface{}) (bool, []map[string]interface{}) {
+func createNewPurchasingInfo(p_list []map[string]interface{}, infoid string) (bool, []map[string]interface{}) {
 	new_plist := []map[string]interface{}{}
 	isExists := false
 	for _, v := range p_list {
@@ -105,8 +132,7 @@ func createNewPurchasingInfo(p_list []map[string]interface{}) (bool, []map[strin
 			continue
 		}
 		//根据标的物名字~打上具体的分类数据~
-		//重要重要重要
-		yl_code := confrimTargetMedicalClass(itemname)
+		yl_code := confrimTargetMedicalClass(itemname, infoid)
 		if yl_code != "" {
 			isExists = true
 		}
@@ -144,18 +170,29 @@ func createNewPurchasingInfo(p_list []map[string]interface{}) (bool, []map[strin
 }
 
 //是否为医疗行业数据
-func IsMedicalIndustryFieldInfo(tmp map[string]interface{}) bool {
+func IsMedicalFieldInfoRuleFirst(tmp map[string]interface{}) bool {
 	top_class := qu.ObjToString(tmp["s_topscopeclass"])
 	sub_class := qu.ObjToString(tmp["s_subscopeclass"])
 	buyer_class := qu.ObjToString(tmp["buyerclass"])
 	buyer := qu.ObjToString(tmp["buyer"])
-	//第一组规则条件
 	if isFieldInfoMethodFirst(top_class, sub_class, buyer_class, buyer) {
 		return true
 	}
 	return false
 }
 
+//是否为医疗行业数据
+func IsMedicalFieldInfoRuleSecond(tmp map[string]interface{}) bool {
+	top_class := qu.ObjToString(tmp["s_topscopeclass"])
+	sub_class := qu.ObjToString(tmp["s_subscopeclass"])
+	buyer_class := qu.ObjToString(tmp["buyerclass"])
+	buyer := qu.ObjToString(tmp["buyer"])
+	if isFieldInfoMethodSecond(top_class, sub_class, buyer_class, buyer) {
+		return true
+	}
+	return false
+}
+
 //第一组规则条件是否校验通过
 func isFieldInfoMethodFirst(top_class string, sub_class string, buyer_class string, buyer string) bool {
 	is_A, is_B := false, false
@@ -165,12 +202,24 @@ func isFieldInfoMethodFirst(top_class string, sub_class string, buyer_class stri
 	if !is_A {
 		return false
 	}
-	if B_FieldReg.MatchString(buyer_class) || (buyer_class == "制造业" && strings.Contains(buyer, "医疗器械")) {
+	if B_FieldReg.MatchString(buyer_class) || (buyer_class == "制造业" && strings.Contains(buyer, "医疗器械") && strings.Contains(buyer, "公司")) {
 		is_B = true
 	}
-	if !is_B {
+	return is_A && is_B
+}
+
+//第二组规则条件是否校验通过
+func isFieldInfoMethodSecond(top_class string, sub_class string, buyer_class string, buyer string) bool {
+	is_A, is_B := false, false
+	if A_FieldReg.MatchString(sub_class) || (sub_class == "" && strings.Contains(top_class, "医疗卫生")) {
+		is_A = true
+	}
+	if !is_A {
 		return false
 	}
+	if !(B_FieldReg.MatchString(buyer_class) || (buyer_class == "制造业" && strings.Contains(buyer, "医疗器械") && strings.Contains(buyer, "公司"))) {
+		is_B = true
+	}
 	return is_A && is_B
 }
 

+ 54 - 28
fieldproject_medical/data_service/src/bidding/purchasing.go

@@ -9,7 +9,7 @@ import (
 )
 
 //计算相似度分类
-func confrimTargetMedicalClass(name string) string {
+func confrimTargetMedicalClass(name string, infoid string) string {
 	//清洗~名称
 	name = cleanItemName(name)
 	if utf8.RuneCountInString(name) <= 2 || utf8.RuneCountInString(name) >= 30 {
@@ -32,16 +32,15 @@ func confrimTargetMedicalClass(name string) string {
 			}
 		}
 	}
-	return calculateSimilarityScore(indexDocs, itemArr)
+	if ul.IsLocal {
+		return calculateSimilarityScoreTest(indexDocs, itemArr, infoid)
+	}
+	return calculateSimilarityScore(indexDocs, itemArr, infoid)
 }
 
 //计算相似度得分
-func calculateSimilarityScore(indexDocs map[int][]string, itemArr []string) string {
+func calculateSimilarityScore(indexDocs map[int][]string, itemArr []string, infoid string) string {
 	scoreDocs := map[int]float64{}
-	//临时记录~
-	//scoreDocs_1 := map[int]float64{}
-	//scoreDocs_2 := map[int]float64{}
-
 	itemName := strings.Join(itemArr, "")
 	for k, v := range indexDocs {
 		v_str := strings.Join(v, "")
@@ -53,11 +52,6 @@ func calculateSimilarityScore(indexDocs map[int][]string, itemArr []string) stri
 		finally_score := (base_score + dice_score) / 2
 		if finally_score >= 0.55 && dice_score > 0.0 {
 			scoreDocs[k] = qu.FloatFormat(finally_score, 2)
-
-			//临时记录一下分数
-			//scoreDocs_1[k] = qu.FloatFormat(base_score, 2)
-			//scoreDocs_2[k] = qu.FloatFormat(dice_score, 2)
-
 		}
 	}
 	if len(scoreDocs) == 0 {
@@ -67,22 +61,6 @@ func calculateSimilarityScore(indexDocs map[int][]string, itemArr []string) stri
 	index, _ := getMaxScore(scoreDocs)
 	match_str := strings.Join(ul.NgrmDocIndex[index], "")
 	med_code := ul.ProductDocText[match_str]
-
-	//测试使用~存数据
-	//catalog := ul.CodeCatalog[med_code]
-	//ul.Mgo.Save("zzzzzz_query", map[string]interface{}{
-	//	"name":       strings.Join(itemArr, ""),
-	//	"match_name": match_str,
-	//	"score":      score,
-	//	"score_1":    scoreDocs_1[index],
-	//	"score_2":    scoreDocs_2[index],
-	//	"code":       med_code,
-	//	"class_1":    catalog["class_1"],
-	//	"class_2":    catalog["class_2"],
-	//	"class_3":    catalog["class_3"],
-	//	"class_4":    catalog["class_4"],
-	//})
-
 	return med_code
 }
 
@@ -223,3 +201,51 @@ func completeMatching(name string) (bool, string) {
 	}
 	return is_b, med_code
 }
+
+//测试版~导出数据
+func calculateSimilarityScoreTest(indexDocs map[int][]string, itemArr []string, infoid string) string {
+	scoreDocs := map[int]float64{}
+	scoreDocs_1 := map[int]float64{}
+	scoreDocs_2 := map[int]float64{}
+	itemName := strings.Join(itemArr, "")
+	for k, v := range indexDocs {
+		v_str := strings.Join(v, "")
+		//基础分计算
+		base_score := confrimBaseScore(v, itemArr)
+		//近义词计算
+		dice_score := strsim.Compare(v_str, itemName, strsim.DiceCoefficient())
+		//优化空间~高分选取阈值~低分过滤阈值~综合阈值
+		finally_score := (base_score + dice_score) / 2
+		if finally_score >= 0.55 && dice_score > 0.0 {
+			scoreDocs[k] = qu.FloatFormat(finally_score, 2)
+			//临时记录一下分数
+			scoreDocs_1[k] = qu.FloatFormat(base_score, 2)
+			scoreDocs_2[k] = qu.FloatFormat(dice_score, 2)
+
+		}
+	}
+	if len(scoreDocs) == 0 {
+		return ""
+	}
+	//取出最高有效分~数据
+	index, score := getMaxScore(scoreDocs)
+	match_str := strings.Join(ul.NgrmDocIndex[index], "")
+	med_code := ul.ProductDocText[match_str]
+
+	//测试使用~存数据
+	catalog := ul.CodeCatalog[med_code]
+	ul.Mgo.Save("zzzzzz_query", map[string]interface{}{
+		"infoid":     infoid,
+		"name":       strings.Join(itemArr, ""),
+		"match_name": match_str,
+		"score":      score,
+		"score_1":    scoreDocs_1[index],
+		"score_2":    scoreDocs_2[index],
+		"code":       med_code,
+		"class_1":    catalog["class_1"],
+		"class_2":    catalog["class_2"],
+		"class_3":    catalog["class_3"],
+		"class_4":    catalog["class_4"],
+	})
+	return med_code
+}

+ 145 - 0
fieldproject_medical/data_service/src/export/export.go

@@ -1,11 +1,73 @@
 package export
 
 import (
+	"bidding"
 	"class"
 	log "github.com/donnie4w/go-logger/logger"
+	qu "qfw/util"
+	"sync"
 	ul "util"
 )
 
+var n_lock sync.Mutex
+
+//导出规则二测试的数据
+func ExportRuleSecondTestData(coll_name string) {
+	log.Debug("开始处理标讯信息~~~")
+	sess := ul.Mgo.GetMgoConn()
+	defer ul.Mgo.DestoryMongoConn(sess)
+	q := map[string]interface{}{
+		"_id": map[string]interface{}{
+			"$gt":  class.StringTOBsonId("130e34000000000000000000"),
+			"$lte": class.StringTOBsonId("630e34000000000000000000"),
+		},
+	}
+	it := sess.DB(ul.Mgo.DbName).C(ul.S_Bidding_Coll).Find(&q).Sort("_id").Select(bidding.BidFields).Iter()
+	pool := make(chan bool, 24)
+	wg := &sync.WaitGroup{}
+	total, isok1, isok2 := 0, 0, 0
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%10000 == 0 {
+			log.Debug("cur index ", total, "~", isok1, "~", isok2)
+		}
+		if qu.IntAll(tmp["extracttype"]) != 1 {
+			tmp = make(map[string]interface{})
+			continue
+		}
+		pool <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-pool
+				wg.Done()
+			}()
+			p_list := bidding.IsMarkInterfaceMap(tmp["purchasinglist"])
+			if bidding.IsMedicalFieldInfoRuleSecond(tmp) && len(p_list) > 0 {
+				n_lock.Lock()
+				isok1++
+				n_lock.Unlock()
+				ul.Mgo.Save(coll_name, tmp)
+
+				//tmpid := class.BsonTOStringId(tmp["_id"])
+				//data := ul.MysqlGlobalTool.FindOne(ul.V_Bid_Fieldtags, map[string]interface{}{
+				//	"infoid": tmpid,
+				//}, "infoid", "")
+				//if data == nil {
+				//	n_lock.Lock()
+				//	isok2++
+				//	n_lock.Unlock()
+				//} else {
+				//	log.Debug("存在~", tmpid)
+				//}
+			}
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+	wg.Wait()
+
+	log.Debug("is over ", total, "~", isok1, "~", isok2)
+}
+
 //更新修复导出的数据
 func UpdateRepairExportTestData(coll_name string) {
 	sess := ul.Mgo.GetMgoConn()
@@ -29,3 +91,86 @@ func UpdateRepairExportTestData(coll_name string) {
 	}
 	log.Debug("is over ", total, "~", isok)
 }
+
+//临时短暂修复地域数据~非领域
+func ShortRepairCityData() {
+	log.Debug("临时短暂修复地域数据~非领域~~~")
+	sess := ul.Mgo.GetMgoConn()
+	defer ul.Mgo.DestoryMongoConn(sess)
+	q := map[string]interface{}{}
+	total, isok := 0, 0
+	it := sess.DB(ul.Mgo.DbName).C("zzzzz_uncity_new").Find(&q).Sort("_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%100 == 0 {
+			log.Debug("cur index ", total, "~", isok)
+		}
+		tmpid := ul.BsonTOStringId(tmp["_id"])
+		area := qu.ObjToString(tmp["area"])
+		city := qu.ObjToString(tmp["city"])
+		district := qu.ObjToString(tmp["district"])
+		update := map[string]interface{}{
+			"_id":      tmp["_id"],
+			"area":     area,
+			"city":     city,
+			"district": district,
+		}
+		if city != "" {
+			data := ul.Mgo.FindById("zzzzz_uncity", tmpid)
+			d_city := qu.ObjToString(data["city"])
+			d_district := qu.ObjToString(data["district"])
+
+			if (d_city == "" && city != "") || d_district == "" && district != "" {
+				isok++
+				ul.Mgo.Save("zktest_uncity_repair", update)
+			}
+		}
+
+		tmp = make(map[string]interface{})
+	}
+
+	log.Debug("is over ", total, "~", isok)
+}
+
+//临时短暂删除重复数据
+func ShortDeleteRepeatData() {
+	log.Debug("短暂计算待删除重复数据~~~")
+	sess := ul.Mgo.GetMgoConn()
+	defer ul.Mgo.DestoryMongoConn(sess)
+	q := map[string]interface{}{}
+	pool := make(chan bool, 6)
+	wg := &sync.WaitGroup{}
+	total, isok1, isok2 := 0, 0, 0
+	it := sess.DB(ul.Mgo.DbName).C("bidding_field_0101").Find(&q).Sort("_id").Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
+		if total%5000 == 0 {
+			log.Debug("cur index ", total, "~", isok1, "~", isok2)
+		}
+		pool <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-pool
+				wg.Done()
+			}()
+			tmpid := ul.BsonTOStringId(tmp["_id"])
+			data := ul.Mgo.FindById("bidding_field_0901", tmpid)
+			if data != nil && len(data) > 2 {
+				isok1++
+				ul.Mgo.DeleteById("bidding_field_0101", tmpid)
+				log.Debug(tmpid)
+			} else {
+				s := ul.MysqlGlobalTool.FindOne(ul.V_Bid_Fieldtags, map[string]interface{}{
+					"infoid": tmpid,
+				}, "infoid", "")
+				if s != nil {
+					isok2++
+					ul.Mgo.DeleteById("bidding_field_0101", tmpid)
+					log.Debug(tmpid)
+				}
+			}
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+
+	log.Debug("is over ", total, "~", isok1, "~", isok2)
+}

+ 4 - 9
fieldproject_medical/data_service/src/main.go

@@ -3,28 +3,23 @@ package main
 import (
 	"bidding"
 	log "github.com/donnie4w/go-logger/logger"
-	"net/http"
-	"service"
 	"time"
 	ul "util"
 )
 
 func init() {
-	//ul.IsLocal = true
 	ul.InitClass()
-	service.InitService()
 }
 
 func main() {
-	//测试相似度计算
-	http.ListenAndServe(":9991", nil)
+	//http.ListenAndServe(":9991", nil)
 	time.Sleep(999 * time.Hour)
 }
 
 func mainT() {
-	gtid := "116cf96744ff2888b4a0c71b"
-	lteid := "930e34000000000000000000"
+	gtid := "5a868de3ddb36226a5764a75"
+	lteid := "5fc49168f0f9d716c165a22c"
 	log.Debug("run main ... ...", gtid, "~", lteid)
-	bidding.RunPurchasingInfo(gtid, lteid)
+	bidding.RunPurchasingInfo(gtid, lteid, true)
 	time.Sleep(999 * time.Hour)
 }

+ 18 - 0
fieldproject_medical/data_service/src/mark

@@ -35,4 +35,22 @@ for k, v := range Medical_Class_Code {
 
     616cf96744ff2888b4a0c71b
     630e34000000000000000000
+*/
+
+
+/*
+    5a865ba4ddb36226a576530f  //少一条
+	5fbe3b91f0f9d716c16205eb
+
+    5fbe3b91f0f9d716c16205eb
+    630e33f9555d34cf90e0c283
+*/
+
+
+/*
+    5a868de3ddb36226a5764a75
+	5fc49168f0f9d716c165a22c
+
+    5fc49168f0f9d716c165a22c
+    630e30ad555d34cf90e0aed1
 */

+ 2 - 1
fieldproject_medical/data_service/src/service/service.go

@@ -14,7 +14,8 @@ func InitService() {
 	http.HandleFunc("/getbid/fieldtags", func(w http.ResponseWriter, r *http.Request) {
 		gtid := r.FormValue("gtid")
 		lteid := r.FormValue("lteid")
-		bidding.RunPurchasingInfo(gtid, lteid)
+		bidding.RunPurchasingInfo(gtid, lteid, true)
+		//mgo~
 		res, _ := json.Marshal("ok")
 		w.Write(res)
 	})

+ 6 - 5
fieldproject_medical/data_service/src/util/initcfg.go

@@ -16,8 +16,9 @@ const (
 	V_Code_Productclass  = "code_productclass"
 	V_Product_Baseinfo   = "product_baseinfo"
 
-	//S_Bidding_Coll = "bidding"
-	S_Bidding_Coll = "zktest_mysql_bidding_test"
+	S_Bidding_Coll = "bidding_field_0101"
+
+	U_Bidding_Coll = "bidding"
 )
 
 var (
@@ -57,9 +58,9 @@ func initMgo() {
 		//}
 		//Mgo.InitPool()
 		Mgo = &MongodbSim{
-			MongodbAddr: "192.168.3.207:27092",
+			MongodbAddr: "127.0.0.1:27017",
 			DbName:      "zhengkun",
-			Size:        10,
+			Size:        30,
 			UserName:    "",
 			Password:    "",
 		}
@@ -68,7 +69,7 @@ func initMgo() {
 		Mgo = &MongodbSim{
 			MongodbAddr: "172.17.145.163:27083,172.17.4.187:27082",
 			DbName:      "qfw",
-			Size:        10,
+			Size:        30,
 			UserName:    "zhengkun",
 			Password:    "zk@123123",
 		}