Explorar el Código

信息~准备~医疗信息

zhengkun hace 3 años
padre
commit
40a3b55804

+ 200 - 104
data_medical/src/hospital.go

@@ -3,24 +3,145 @@ package main
 import (
 	log "github.com/donnie4w/go-logger/logger"
 	qu "qfw/util"
+	"strings"
 	"sync"
 	"unicode/utf8"
 )
 
+var data_hospitals = map[string][]map[string]interface{}{}
+
+//重复数据~判断
+func repeatHospital() {
+	sess := save_mgo.GetMgoConn()
+	defer 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(save_mgo.DbName).C("zzzzzz").Find(&q).Sort("name").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 := 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 != "" {
+
+				}
+				//log.Debug(name, "~", is_r_n)
+				//save_mgo.UpdateById("zzzzzz", 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)
+}
+
+//是否相同地域
+func repeatRegion(region map[string]string, data map[string]string) bool {
+	if region["district"] != "" && data["district"] != "" &&
+		region["district"] != data["district"] {
+		return false
+	}
+	if region["city"] != "" && data["city"] != "" &&
+		region["city"] != data["city"] {
+		return false
+	}
+	if region["area"] != "" && data["area"] != "" &&
+		region["area"] != data["area"] &&
+		region["area"] != "全国" && data["area"] != "全国" {
+		return false
+	}
+
+	return true
+}
+
+//整合医院数据
+func confirmhHospitalData() {
+	//处理~医院信息
+	log.Debug("is ", len(data_hospitals))
+	for k, v := range data_hospitals {
+		data := mergeHospitalInfo(v)
+		if data != nil && len(data) > 2 {
+			//保存新表~
+			save_mgo.Save("zzzzzz", data)
+		} else {
+			log.Debug("异常数据...", k)
+			save_mgo.Save("kkkkkk", data)
+		}
+	}
+	log.Debug("最终~", len(data_hospitals))
+}
 
 //处理医院基本信息~涉及多张表
-func dealWithHospitalInfo(hos_coll string,depart_coll string , save_coll string) {
+func dealWithHospitalInfo(hos_coll string, depart_coll string) {
 	log.Debug("处理医疗~医院基本信息")
 	sess := save_mgo.GetMgoConn()
 	defer save_mgo.DestoryMongoConn(sess)
 	q := map[string]interface{}{}
 	it := sess.DB(save_mgo.DbName).C(hos_coll).Find(&q).Sort("_id").Iter()
-	data_hospitals := map[string][]map[string]interface{}{}
-	pool := make(chan bool, 5)
+	pool := make(chan bool, 6)
 	wg := &sync.WaitGroup{}
-	total := 0
+	total, isok := 0, 0
 	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
-		if total %10000 == 0 {
+		if total%10000 == 0 {
 			log.Debug("cur index ", total)
 		}
 		pool <- true
@@ -31,23 +152,25 @@ func dealWithHospitalInfo(hos_coll string,depart_coll string , save_coll string)
 				wg.Done()
 			}()
 			name := qu.ObjToString(tmp["hospitalname"])
-			if name!="" &&utf8.RuneCountInString(name)>3 {
+			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_depart := treatHospitalDepartment(hos_id, depart_coll)
 				data_info["departs"] = data_depart
 				//别名信息
 				data_info["alias"] = qu.ObjToString(tmp["alias"])
 
 				datalock.Lock()
-				if data_hospitals[name]==nil {
+				if data_hospitals[name] == nil {
 					arr := []map[string]interface{}{data_info}
 					data_hospitals[name] = arr
-				}else {
+					isok++
+				} else {
 					arr := data_hospitals[name]
-					arr = append(arr,data_info)
+					arr = append(arr, data_info)
 					data_hospitals[name] = arr
 				}
 				datalock.Unlock()
@@ -56,118 +179,92 @@ func dealWithHospitalInfo(hos_coll string,depart_coll string , save_coll string)
 		tmp = make(map[string]interface{})
 	}
 	wg.Wait()
-
-
-	//处理~医院信息
-	for _,v := range data_hospitals {
-		data := mergeHospitalInfo(v)
-		if data!=nil && len(data)>2 {
-			//保存新表~
-
-		}
-	}
-
-
-	log.Debug("is over ",total,len(data_hospitals))
-
+	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"])
-	//医院名称
-	data["name"] = hospitalname
+	hospitalname = strings.ReplaceAll(hospitalname, " ", "")
+	//医院名称~
+	data["mi_name"] = hospitalname
 	//医院简介
 	data["introduce"] = qu.ObjToString(tmp["introduce"])
-	//医院等级
-	data["level"] = qu.ObjToString(tmp["introduce"])
-	//医院等级名称
-	data["levelname"] = ""
-	//医院类型
-	data["type"] = qu.ObjToString(tmp["type"])
-	//医院性质
-	data["business_type"] = qu.ObjToString(tmp["business_type"])
+
+	//等级~性质~代码
+	n_level, n_type, n_bus_type := inquirHospitalLevelType(qu.ObjToString(tmp["level"]), qu.ObjToString(tmp["type"]), qu.ObjToString(tmp["business_type"]))
+	data["level"] = n_level
+	data["type"] = n_type
+	data["business_type"] = n_bus_type
+
 	//医院地址
 	data["address"] = qu.ObjToString(tmp["address"])
 	//医院设备
 	data["equipment"] = qu.ObjToString(tmp["equipment"])
-	//床位数
-	data["beds"] = qu.IntAll(tmp["beds"])
+	//床位数~
+	beds := qu.IntAll(tmp["beds"])
+	if beds > 0 {
+		data["beds"] = beds
+	}
 	//门诊量/日
-	data["visit_perday"] = qu.IntAll(tmp["visit_perday"])
+	visit_perday := qu.IntAll(tmp["visit_perday"])
+	if visit_perday > 0 {
+		data["visit_perday"] = visit_perday
+	}
 	//员工人数
-	data["employees"] = qu.IntAll(tmp["doctorsnum"])
-	//联系电话~需要去重中文
+	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"])
-	//省
-	data["area"] = qu.ObjToString(tmp["area"])
-	//市
-	data["city"] = qu.ObjToString(tmp["city"])
-	//区
-	data["district"] = qu.ObjToString(tmp["district"])
-
-	//spec_data := spi_mgo.FindOne("special_enterprise", map[string]interface{}{
-	//	"company_name":hospitalname,
-	//})
-	//if spec_data!=nil && len(spec_data)>2 {
-	//
-	//}else {
-	//
-	//}
-	//宗旨和业务范围
-	data["business_scope"] = ""
-	//注册资本
-	data["capital"] = ""
-	//资本来源
-	data["capital_source"] = ""
-	//统一信用代码
-	data["credit_no"] = ""
-	//法定代表人
-	data["legal_person"] = ""
-	//有效期起
-	data["operation_startdate"] = ""
-	//有效期止
-	data["operation_enddate"] = ""
-	//状态
-	data["company_status"] = ""
-	//举办单位
-	data["organizer"] = ""
-	//登记机关
-	data["company_status"] = ""
-
-
-	////入库时间
-	//data["comeintime"] = time.Unix(qu.Int64All(tmp["comeintime"]), 0).Format(timeLayout)
-	////更新时间
-	//data["updatetime"] = time.Unix(qu.Int64All(tmp["updatetime"]), 0).Format(timeLayout)
+	//省~市~区 ~可完善
+	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
 
+	//关联企业信息~查询顺序~企业~特殊~自生
+	inquirBaseInfoid(hospitalname)
 
+	//入库时间
+	//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{} {
+func treatHospitalDepartment(hos_id string, depart_coll string) []map[string]interface{} {
 	new_arr := []map[string]interface{}{}
-	dataArr,_:= save_mgo.Find(depart_coll, map[string]interface{}{"hospital_id":hos_id},nil,nil)
+	if depart_coll == "" {
+		return new_arr
+	}
+	dataArr, _ := save_mgo.Find(depart_coll, map[string]interface{}{"hospital_id": hos_id}, nil, nil)
 	//考虑去重~相同科室
 	keys := map[string]string{}
-	for _,v := range dataArr {
+	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,
+		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 {
+		} else {
 			//log.Debug("重复科室~",main_departclass1,main_departclass2)
 		}
 	}
@@ -175,23 +272,23 @@ func treatHospitalDepartment(hos_id string,depart_coll string) []map[string]inte
 }
 
 //合并医院信息~
-func mergeHospitalInfo(dataArr []map[string]interface{}) map[string]interface{}{
+func mergeHospitalInfo(dataArr []map[string]interface{}) map[string]interface{} {
 	data := map[string]interface{}{}
-	if len(dataArr)==1 {
+	if len(dataArr) == 1 {
 		return dataArr[0]
-	}else if len(dataArr)>1 {
+	} else if len(dataArr) > 1 {
 		//合并重复信息
 		temp := dataArr[0]
-		for k,v := range temp {
+		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 {
+			if new_v, ok := v.(string); ok {
+				if new_v == "" { //查询其他数据~补充
+					for ks, vs := range dataArr {
+						if ks == 0 {
 							continue
 						}
-						if qu.ObjToString(vs[k]) !="" {
+						if qu.ObjToString(vs[k]) != "" {
 							data[k] = vs[k]
 							isMerge = true
 							break
@@ -199,10 +296,10 @@ func mergeHospitalInfo(dataArr []map[string]interface{}) map[string]interface{}{
 					}
 				}
 			}
-			if new_v,ok := v.(int);ok  {
-				if new_v==0 { //查询其他数据~补充
-					for ks,vs := range dataArr{
-						if ks==0 {
+			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 {
@@ -217,9 +314,8 @@ func mergeHospitalInfo(dataArr []map[string]interface{}) map[string]interface{}{
 				data[k] = v
 			}
 		}
-	}else {
+	} else {
 
 	}
 	return data
 }
-

+ 180 - 0
data_medical/src/hospital_method.go

@@ -0,0 +1,180 @@
+package main
+
+import (
+	"encoding/json"
+	log "github.com/donnie4w/go-logger/logger"
+	"io/ioutil"
+	"net/http"
+	qu "qfw/util"
+	"regexp"
+	"strings"
+)
+
+var med_lev_Reg1 = regexp.MustCompile("^([一二三])([甲乙丙特])$")
+var med_lev_Reg2 = regexp.MustCompile("^([一二三])(级)(医院)?$")
+
+//类型 等级 性质  ~ 综合清洗分析验证
+func inquirHospitalLevelType(med_level string, med_type string, med_bus_type string) (string, string, string) {
+	new_level, new_type, new_bus_type := "", "", ""
+	//医疗性质相关
+	if med_bus_type != "" {
+		new_bus_type = relevanceBusType(med_bus_type)
+		//针对~类型划分
+		arr := strings.Split(med_bus_type, "/")
+		if len(arr) == 2 {
+			new_type = relevanceType(arr[1])
+		}
+	}
+	//医疗等级相关
+	if med_level != "" {
+		new_level = relevanceLevel(med_level)
+		//针对~性质划分
+		new_bus_type = relevanceBusType(med_bus_type)
+	}
+
+	//医疗类型相关~采集异常~需要清洗
+	if med_type != "" && new_type == "" {
+		//医疗类型
+		new_type = relevanceType(med_type)
+
+		if new_level == "" {
+			new_level = relevanceLevel(new_type)
+		}
+		if new_bus_type == "" {
+			new_bus_type = relevanceBusType(new_type)
+		}
+	}
+
+	//最终核对
+	if new_level == "" {
+		new_level = medical_level["其它"]
+	}
+	if new_type == "" {
+		new_type = medical_type["其它"]
+		log.Debug(new_type)
+	}
+	if new_bus_type == "" {
+		new_bus_type = "2"
+	}
+	return new_level, new_type, new_bus_type
+}
+
+// level 医疗等级对比
+func relevanceLevel(med_level string) string {
+	new_level := ""
+	if medical_level[med_level] != "" {
+		new_level = medical_level[med_level]
+	} else { //特殊描述映射关系
+		if med_lev_Reg1.MatchString(med_level) {
+			med_level = med_lev_Reg1.ReplaceAllString(med_level, "${1}级${2}等")
+			new_level = medical_level[med_level]
+		}
+		if med_lev_Reg2.MatchString(med_level) {
+			med_level = med_lev_Reg2.ReplaceAllString(med_level, "${1}${2}其它")
+			new_level = medical_level[med_level]
+		}
+	}
+	return new_level
+}
+
+//type 类型划分
+func relevanceType(med_type string) string {
+	new_type := ""
+	//扩展~包含关系~等等规则
+	new_type = medical_type[med_type]
+	return new_type
+}
+
+//bus_type 性质划分
+func relevanceBusType(med_bus_type string) string {
+	new_bus_type := ""
+	//0公立、1民营、2其它
+	if strings.Contains(med_bus_type, "公立") {
+		new_bus_type = "0"
+	}
+	if strings.Contains(med_bus_type, "民营") {
+		new_bus_type = "1"
+	}
+	return new_bus_type
+}
+
+//查询企业id
+func inquirBaseInfoid(name string) (company_id string) {
+	company_id = ""
+	query := map[string]interface{}{
+		"company_name": name,
+	}
+	data_base := spi_mgo.FindOne("company_base", query)
+	if data_base != nil && len(data_base) > 2 {
+		company_id = qu.ObjToString(data_base["company_id"])
+	} else {
+		data_spec := spi_mgo.FindOne("special_enterprise", query)
+		if data_spec != nil && len(data_spec) > 2 {
+			company_id = qu.ObjToString(data_spec["company_id"])
+		}
+	}
+	return
+}
+
+//补充~地域区划
+func supplementRegionally(area *string, city *string, district *string, name string, address string) {
+	//查询其他表~
+	if *area == "" || *area == "全国" {
+		*area = "全国"
+		*city = ""
+		*district = ""
+	}
+	data := save_mgo.FindOne("data_info", map[string]interface{}{
+		"name": name,
+	})
+	if data != nil && len(data) > 2 {
+		data_area := qu.ObjToString(data["area"])
+		data_city := qu.ObjToString(data["city"])
+		data_district := qu.ObjToString(data["district"])
+		if data_district != "" {
+			*area = data_area
+			*city = data_city
+			*district = data_district
+		} else {
+			if data_city != "" {
+				*area = data_area
+				*city = data_city
+			} else {
+				if data_area != "" && data_area != "全国" {
+					*area = data_area
+				}
+			}
+		}
+	}
+	if *city != "" {
+		return
+	}
+
+	//地址字段抽取~请求接口
+	resp, err := http.Get("http://extcity.spdata.jianyu360.com/getcity?detail=" + address)
+	if err == nil {
+		defer resp.Body.Close()
+		bs, _ := ioutil.ReadAll(resp.Body)
+		var rep map[string]interface{}
+		json.Unmarshal(bs, &rep)
+
+		rep_area := qu.ObjToString(rep["area"])
+		rep_city := qu.ObjToString(rep["city"])
+		rep_district := qu.ObjToString(rep["district"])
+
+		if rep_district != "" {
+			*area = rep_area
+			*city = rep_city
+			*district = rep_district
+		} else {
+			if rep_city != "" {
+				*area = rep_area
+				*city = rep_city
+			} else {
+				if rep_area != "" && rep_area != "全国" {
+					*area = rep_area
+				}
+			}
+		}
+	}
+}

+ 121 - 0
data_medical/src/initdata.go

@@ -0,0 +1,121 @@
+package main
+
+//初始化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",
+		//	DbName:      "zhengkun",
+		//	Size:        10,
+		//	UserName: "",
+		//	Password: "",
+		//}
+		//save_mgo.InitPool()
+
+		qy_mgo = &MongodbSim{
+			MongodbAddr: "127.0.0.1:27017",
+			DbName:      "mixdata",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		qy_mgo.InitPool()
+
+		spi_mgo = &MongodbSim{
+			MongodbAddr: "127.0.0.1:27017",
+			DbName:      "zhengkun",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		spi_mgo.InitPool()
+	} else {
+		save_mgo = &MongodbSim{
+			MongodbAddr: "172.17.4.87:27080",
+			DbName:      "hospital",
+			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",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		spi_mgo.InitPool()
+	}
+}
+
+func initMysql() {
+	MysqlTool = &Mysql{
+		Address:  "192.168.3.217:4000",
+		UserName: "root",
+		PassWord: "=PDT49#80Z!RVv52_z",
+		DBName:   "medical_lycp",
+	}
+	MysqlTool.Init()
+}
+
+func initClassCode() {
+	medical_level = map[string]string{
+		"一级甲等": "01",
+		"一级乙等": "02",
+		"一级丙等": "03",
+		"一级其它": "04",
+		"二级甲等": "05",
+		"二级乙等": "06",
+		"二级丙等": "07",
+		"二级其它": "08",
+		"三级甲等": "09",
+		"三级乙等": "10",
+		"三级丙等": "11",
+		"三级特等": "12",
+		"三级其它": "13",
+		"其它":   "14",
+	}
+
+	medical_type = map[string]string{
+		"综合医院":     "01",
+		"专科医院":     "02",
+		"中医医院":     "03",
+		"民族医院":     "04",
+		"康复医院":     "05",
+		"妇幼保健院":    "06",
+		"社区卫生服务中心": "07",
+		"乡镇卫生院":    "08",
+		"疗养院":      "09",
+		"门诊部":      "10",
+		"诊所及卫生所":   "11",
+		"村卫生室":     "12",
+		"急救中心":     "13",
+		"防治院":      "14",
+		"护理中心":     "15",
+		"检验诊断中心":   "16",
+		"美容整形":     "17",
+		"公司医院":     "18",
+		"校医院":      "19",
+		"其它":       "20",
+	}
+}

+ 26 - 155
data_medical/src/main.go

@@ -7,92 +7,31 @@ import (
 )
 
 var (
-	save_mgo,qy_mgo,spi_mgo		*MongodbSim
-	datalock 		sync.Mutex
-	timeLayout = "2006-01-02 15:04:05"
-    timeTmeplate = "2006-01-02"
-	isLocal	bool
+	save_mgo, qy_mgo, spi_mgo   *MongodbSim
+	datalock                    sync.Mutex
+	timeLayout                  = "2006-01-02 15:04:05"
+	timeTmeplate                = "2006-01-02"
+	isLocal                     bool
+	MysqlTool                   *Mysql
+	medical_type, medical_level map[string]string
 )
-//初始化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",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName: "",
-			Password: "",
-		}
-		save_mgo.InitPool()
-
-
-		qy_mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "mixdata",
-			Size:        10,
-			UserName: "",
-			Password: "",
-		}
-		qy_mgo.InitPool()
-
-		spi_mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName: "",
-			Password: "",
-		}
-		spi_mgo.InitPool()
-	}else {
-		save_mgo = &MongodbSim{
-			MongodbAddr: "172.17.4.87:27080",
-			DbName:      "hospital",
-			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",
-			Size:        10,
-			UserName: "",
-			Password: "",
-		}
-		spi_mgo.InitPool()
-	}
-}
-
-
-func init()  {
+func init() {
 	isLocal = true //本地
 	initMgo()
-
+	initMysql()
+	initClassCode() //加载相关代码表
 }
-func main(){
+func main() {
 	log.Debug("领域化产品准备......")
 
 	//医院信息处理
-	//dealWithHospitalInfo("f_hospital_39jk","hospital_39jk_ain_depart","zktest_hospital_39")
+	dealWithHospitalInfo("f_hospital_39jk", "hospital_39jk_ain_depart")
+	//dealWithHospitalInfo("f_hospital_hdf", "hospital_hdf_ain_depart")
+	//dealWithHospitalInfo("f_hospital_yydq", "hospital_yydq_ain_depart")
+	//dealWithHospitalInfo("f_hospital_yyyc", "")
+	//confirmhHospitalData()
+	//repeatHospital()
 
 	//生产经营企业~产品信息
 	//dealWithCompanyInfo()
@@ -100,86 +39,21 @@ func main(){
 	//医疗产品表~信息
 	//dealWithProductInfo()
 
-
-
-
-
-
 	//分类代码v表修复
 	//modifyylqxclass()
 
-
-
-
-
-
-
-
-
-
-	//sess := save_mgo.GetMgoConn()
-	//defer save_mgo.DestoryMongoConn(sess)
-	//q := map[string]interface{}{}
-	//dict := map[string]string{}
-	//it := sess.DB(save_mgo.DbName).C("zktest_hospital").Find(&q).Sort("_id").Iter()
-	//total:= 0
-	//for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
-	//	if total %10000 == 0 {
-	//		log.Debug("cur index ", total)
-	//	}
-	//	name := qu.ObjToString(tmp["name"])
-	//	if name!="" {
-	//		dict[name]=name
-	//	}
-	//	tmp = make(map[string]interface{})
-	//}
-	//log.Debug(len(dict))
-	////临时读 ~ xlsx表
-	//f,_ := xlsx.OpenFile("医疗采购单位名称.xlsx")
-	//isok:=0
-	//ttt:=0
-	//for _, sheet := range f.Sheets {
-	//	for _, row := range sheet.Rows {
-	//		var str []string
-	//		for _, cell := range row.Cells {
-	//			str = append(str, cell.String())
-	//		}
-	//		ttt++
-	//		if ttt%1000 == 0 {
-	//			log.Debug(ttt,isok)
-	//		}
-	//		if len(str)>0 {
-	//			name := str[0]
-	//			for _,v := range dict{
-	//				if strings.Contains(name,v)||strings.Contains(v,name) {
-	//					isok++
-	//					log.Debug(name,"~",v)
-	//					break
-	//				}
-	//			}
-	//			//data := save_mgo.FindOne("zktest_hospital", map[string]interface{}{
-	//			//	"name":name,
-	//			//})
-	//			//if data!=nil && len(data)>0 {
-	//			//	isok++
-	//			//}
-	//		}
-	//	}
-	//}
-	//log.Debug(ttt,isok)
-
-
-
-	time.Sleep(999*time.Hour)
+	time.Sleep(999 * time.Hour)
 }
 
+//插入数据
+func insertMysqlData(name string, data map[string]interface{}, mark string) {
+	inb := MysqlTool.Insert(name, data)
+	if inb == -1 {
+		log.Debug("插入数据异常...", name, "~", mark)
+	}
+}
 
-
-
-
-
-
-func test()  {
+func testPort() {
 	//dealWithDataFieldAccuracy("a_marked_bidding_old")
 	//increaseTemplateData("zktest_upload_data","zktest_upload_data")
 
@@ -191,6 +65,3 @@ func test()  {
 	//log.Debug("port:", port)
 	//http.ListenAndServe(":"+port, nil)
 }
-
-
-

+ 505 - 0
data_medical/src/mysql.go

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

+ 28 - 2
data_medical/src/product.go

@@ -3,6 +3,7 @@ package main
 import (
 	log "github.com/donnie4w/go-logger/logger"
 	qu "qfw/util"
+	"strings"
 	"sync"
 )
 
@@ -61,8 +62,17 @@ func treatProductInfo(tmp map[string]interface{}) map[string]interface{}{
 	data["storage_conditions"] = qu.ObjToString(tmp["storage_conditions"])
 	data["remark"] = qu.ObjToString(tmp["remark"])
 	data["approve_depart"] = qu.ObjToString(tmp["approve_depart"])
-	data["approve_date"] = qu.ObjToString(tmp["approve_date"])
-	data["validity_date"] = qu.ObjToString(tmp["validity_date"])
+
+	//日期清洗
+	approve_date := qu.ObjToString(tmp["approve_date"])
+	validity_date := qu.ObjToString(tmp["validity_date"])
+	if !cleanErrDateTime(approve_date) {
+		data["approve_date"] = approve_date
+	}
+	if !cleanErrDateTime(validity_date) {
+		data["validity_date"] = validity_date
+	}
+
 	data["changes"] = qu.ObjToString(tmp["changes"])
 	data["regist_type"] = qu.ObjToString(tmp["regist_type"])
 	data["source_channel"] = qu.ObjToString(tmp["source_channel"])
@@ -81,3 +91,19 @@ func treatProductInfo(tmp map[string]interface{}) map[string]interface{}{
 
 	return data
 }
+
+
+//清洗日期~
+func cleanErrDateTime(datetime string)(bool) {
+	/*
+	1、有效年1900 ~  2200年
+	*/
+	arr := strings.Split(datetime,"-")
+	if len(arr)>0 {
+		year := qu.IntAll(arr[0])
+		if year<1900 || year>2200 {
+			return true
+		}
+	}
+	return false
+}