Jelajahi Sumber

医疗数据处理-备份

zhengkun 3 tahun lalu
induk
melakukan
ee1b060db7

+ 251 - 0
listen_data/src/1.txt

@@ -0,0 +1,251 @@
+
+
+农一师,第一师,阿克苏地区,阿克苏市
+1团,阿克苏地区,阿克苏市
+2团,阿克苏地区,阿克苏市
+3团,阿克苏地区,阿瓦提县
+4团,阿克苏地区,乌什县
+5团,阿克苏地区,温宿县
+6团,阿克苏地区,温宿县
+7团,阿拉尔市,阿拉尔市
+8团,阿拉尔市,阿拉尔市
+9团,阿拉尔市,阿拉尔市
+10团,阿拉尔市,阿拉尔市
+11团,阿拉尔市,阿拉尔市
+12团,阿拉尔市,阿拉尔市
+13团,阿拉尔市,阿拉尔市
+14团,阿拉尔市,阿拉尔市
+15团,阿拉尔市,阿拉尔市
+16团,阿拉尔市,阿拉尔市
+托海牧场,阿拉尔市,阿拉尔市
+
+
+
+农二师,第二师,巴音郭楞蒙古自治州,库尔勒市
+21团,巴音郭楞蒙古自治州,和静县
+22团,巴音郭楞蒙古自治州,和静县
+23团,巴音郭楞蒙古自治州,和静县
+24团,巴音郭楞蒙古自治州,和硕县
+25团,巴音郭楞蒙古自治州,博湖县
+26团,巴音郭楞蒙古自治州,和硕县
+27团,巴音郭楞蒙古自治州,焉耆回族自治县
+28团,巴音郭楞蒙古自治州,库尔勒市
+29团,巴音郭楞蒙古自治州,库尔勒市
+30团,巴音郭楞蒙古自治州,库尔勒市
+31团,巴音郭楞蒙古自治州,尉犁县
+32团,巴音郭楞蒙古自治州,尉犁县
+33团,巴音郭楞蒙古自治州,尉犁县
+34团,巴音郭楞蒙古自治州,尉犁县
+35团,巴音郭楞蒙古自治州,尉犁县
+36团,巴音郭楞蒙古自治州,若羌县
+223团,巴音郭楞蒙古自治州,和静县
+
+
+
+农三师,第三师,喀什地区,喀什市
+41团,喀什地区,疏勒县
+42团,喀什地区,岳普湖县
+43团,喀什地区,麦盖提县
+44团,图木舒克市,图木舒克市
+45团,喀什地区,麦盖提县
+46团,喀什地区,麦盖提县
+48团,喀什地区,巴楚县
+49团,图木舒克市,图木舒克市
+50团,图木舒克市,图木舒克市
+51团,图木舒克市,图木舒克市
+52团,图木舒克市,图木舒克市
+53团,图木舒克市,图木舒克市
+54团,图木舒克市,图木舒克市
+伽师总场,喀什地区,伽师县
+托云牧场,克孜勒苏柯尔克孜自治州,乌恰县托云乡
+叶城牧场,喀什地区,叶城县
+叶城二牧场,喀什地区,叶城县
+莎车农场,喀什地区,莎车县
+红旗农场,图木舒克市,阿图什市
+东风农场,喀什地区,英吉沙县
+工程团,喀什地区,巴楚县
+
+
+
+农四师,第四师,伊犁哈萨克自治州,伊宁市
+61团,伊犁哈萨克自治州,霍城县
+62团,伊犁哈萨克自治州,霍城县
+63团,伊犁哈萨克自治州,霍城县
+64团,伊犁哈萨克自治州,霍城县
+65团,伊犁哈萨克自治州,霍城县
+66团,伊犁哈萨克自治州,霍城县
+67团,伊犁哈萨克自治州,察布查尔锡伯族自治县
+68团,伊犁哈萨克自治州,察布查尔锡伯族自治县
+69团,伊犁哈萨克自治州,察布查尔锡伯族自治县
+70团,伊犁哈萨克自治州,伊宁县
+71团,伊犁哈萨克自治州,新源县
+72团,伊犁哈萨克自治州,新源县
+73团,伊犁哈萨克自治州,巩留县
+74团,伊犁哈萨克自治州,昭苏县
+75团,伊犁哈萨克自治州,昭苏县
+76团,伊犁哈萨克自治州,昭苏县
+77团,伊犁哈萨克自治州,昭苏县
+78团,伊犁哈萨克自治州,特克斯县
+79团,伊犁哈萨克自治州,尼勒克县
+拜什墩农场,伊犁哈萨克自治州,伊宁县
+
+
+
+
+农五师,第五师,博尔塔拉蒙古自治州,博乐市
+81团,博尔塔拉蒙古自治州,博乐市
+82团,博尔塔拉蒙古自治州,精河县
+83团,博尔塔拉蒙古自治州,精河县
+84团,博尔塔拉蒙古自治州,博乐市
+85团,博尔塔拉蒙古自治州,博乐市
+86团,博尔塔拉蒙古自治州,博乐市
+87团,博尔塔拉蒙古自治州,温泉县
+88团,博尔塔拉蒙古自治州,温泉县
+89团,博尔塔拉蒙古自治州,博乐市
+90团,博尔塔拉蒙古自治州,博乐市
+91团,博尔塔拉蒙古自治州,精河县
+
+
+
+
+农六师,第六师,五家渠市,五家渠市
+101团,五家渠市,五家渠市
+102团,五家渠市,五家渠市
+103团,五家渠市,五家渠市
+105团,昌吉回族自治州,昌吉市
+106团,昌吉回族自治州,呼图壁县
+107团,昌吉回族自治州,吉木萨尔县
+108团,昌吉回族自治州,奇台县
+109团,昌吉回族自治州,奇台县
+110团,昌吉回族自治州,奇台县
+111团,昌吉回族自治州,呼图壁县
+芳草湖农场,昌吉回族自治州,呼图壁县
+新湖农场,昌吉回族自治州,玛纳斯县
+六运湖农场,昌吉回族自治州,阜康市
+土墩子农场,昌吉回族自治州,阜康市
+红旗农场,昌吉回族自治州,吉木萨尔县
+军户农场,昌吉回族自治州,昌吉市
+共青团农场,昌吉回族自治州,昌吉市
+奇台农场,昌吉回族自治州,奇台县
+北塔山牧场,昌吉回族自治州,奇台县
+
+
+
+
+农七师,第七师,伊犁哈萨克自治州,奎屯市
+123团,塔城地区,乌苏市
+124团,塔城地区,乌苏市
+125团,塔城地区,乌苏市
+126团,塔城地区,乌苏市
+127团,塔城地区,乌苏市
+128团,塔城地区,乌苏市
+129团,克拉玛依市,克拉玛依区
+130团,克拉玛依市,克拉玛依区
+131团,伊犁哈萨克自治州,奎屯市
+137团,克拉玛依市,乌尔禾区
+
+
+
+
+农八师,第八师,石河子市,石河子市
+121团,塔城地区,沙湾县
+122团,塔城地区,沙湾县
+132团,塔城地区,沙湾县
+133团,塔城地区,沙湾县
+134团,塔城地区,沙湾县
+135团,塔城地区,沙湾县
+136团,克拉玛依市,克拉玛依区
+141团,塔城地区,沙湾县
+142团,塔城地区,沙湾县
+143团,塔城地区,沙湾县
+144团,塔城地区,沙湾县
+147团,昌吉回族自治州,玛纳斯县
+148团,昌吉回族自治州,玛纳斯县
+149团,昌吉回族自治州,玛纳斯县
+150团,昌吉回族自治州,玛纳斯县
+151团,塔城地区,沙湾县
+152团,石河子市,石河子市
+石河子总场,石河子市,石河子市
+
+
+
+
+农九师,第九师,塔城地区,
+161团,塔城地区,裕民县
+162团,塔城地区,塔城市
+163团,塔城地区,塔城市
+164团,塔城地区,塔城市
+165团,塔城地区,额敏县
+166团,塔城地区,额敏县
+167团,塔城地区,额敏县
+168团,塔城地区,额敏县
+169团,塔城地区,额敏县
+170团,塔城地区,额敏县
+团结农场,塔城地区,额敏县
+
+
+
+
+农十师,第十师,北屯市,北屯市
+181团,北屯市,北屯市
+182团,阿勒泰地区,福海县
+183团,阿勒泰地区,福海县
+184团,塔城地区,和布克赛尔蒙古自治县
+185团,阿勒泰地区,哈巴河县
+186团,阿勒泰地区,吉木乃县
+187团,阿勒泰地区,福海县
+188团,北屯市,北屯市
+189团,北屯市,北屯市
+190团,阿勒泰地区,福海县
+191团,阿勒泰地区,福海县
+
+
+
+
+建筑工程师,建筑工程师,乌鲁木齐市,
+1团,石河子市,石河子市
+2团,乌鲁木齐市,
+3团,巴音郭楞蒙古自治州,库尔勒市
+4团,乌鲁木齐市,
+5团,石河子市,石河子市
+6团,石河子市,石河子市
+7团,乌鲁木齐市,
+8团,伊犁哈萨克自治州,奎屯市
+
+
+
+
+农十二师,第十二师,乌鲁木齐市,
+104团,乌鲁木齐市,沙依巴克区
+西山农牧场,乌鲁木齐市,沙依巴克区
+五一农场,乌鲁木齐市,头屯河区
+三坪农场,乌鲁木齐市,头屯河区
+头屯河农场,乌鲁木齐市,头屯河区
+养禽场,乌鲁木齐市,新市区
+221团场,吐鲁番市,高昌区
+
+
+
+
+农十三师,第十三师,哈密市,
+黄田农场,哈密市,伊州区
+火箭农场,哈密市,伊州区
+红山农场,哈密市,巴里坤哈萨克自治县
+柳树泉农场,哈密市,伊州区
+淖毛湖农场,哈密市,伊吾县
+红星一场,哈密市,伊州区
+红星二场,哈密市,伊州区
+红星三场,哈密市,伊州区
+红星四场,哈密市,伊州区
+红星一牧场,哈密市,巴里坤哈萨克自治县
+红星二牧场,哈密市,伊州区
+
+
+
+
+农十四师,第十四师,和田地区,和田市
+47团,和田地区,墨玉县
+224团,和田地区,皮山县
+皮山农场,和田地区,皮山县
+一牧场,和田地区,策勒县
+222团,昌吉回族自治州,阜康市

+ 14 - 13
listen_data/src/main.go

@@ -125,20 +125,23 @@ func main()  {
 	//save_mgo.InitPool()
 
 
+	//MysqlTool = &Mysql{
+	//	Address: "127.0.0.1:3306",
+	//	UserName: "root",
+	//	PassWord: "123456",
+	//	DBName: "zhengkun",
+	//}
+	//MysqlTool.Init()
+
+
 	MysqlTool = &Mysql{
-		Address: "127.0.0.1:3306",
-		UserName: "root",
-		PassWord: "135781012",
-		DBName: "zhengkun",
+		Address: "192.168.3.109:4000",
+		UserName: "jianyu",
+		PassWord: "top@123",
+		DBName: "zktest",
 	}
 	MysqlTool.Init()
 
-
-
-
-
-
-
 	/*
 		repairYiXieChaData() 		//医械查
 		dealWithClassData()			//AB 匹配
@@ -148,9 +151,7 @@ func main()  {
 	*/
 
 
-
-
-	mysqlTest()
+	decodeJyUrl()
 
 	return
 

+ 2 - 1
listen_data/src/mysql.go

@@ -29,8 +29,9 @@ func (m *Mysql) Init() {
 	if m.MaxIdleConns <= 0 {
 		m.MaxIdleConns = 20
 	}
-	var err error
+	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))
+	log.Println(fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4", m.UserName, m.PassWord, m.Address, m.DBName))
 	if err != nil {
 		log.Println(err)
 		return

+ 69 - 11
listen_data/src/zkmethod.go

@@ -71,30 +71,88 @@ func encodeJyUrl()  {
 	log.Debug(Encode)
 }
 
+
+
 func mysqlTest() {
 
-	marksql := "create table if not exists test (id int(20) primary key auto_increment,name text(255),name1 text(255));"
+	marksql := `create table if not exists test (
+    id int(20) primary key auto_increment,
+    name varchar(255) not null unique,
+    name1 varchar (255) not null default ""
+    )ENGINE=InnoDB DEFAULT CHARSET=utf8;`
 	smt, _ := MysqlTool.DB.Prepare(marksql)
 	smt.Exec()
 
 	MysqlTool.Insert("test", map[string]interface{}{
-		"name":"测试1",
-		"name1":"测试1_1",
-	})
-	MysqlTool.Insert("test", map[string]interface{}{
-		"name":"测试2",
-		"name1":"测试1_1",
-	})
-	MysqlTool.Insert("test", map[string]interface{}{
-		"name":"测试1",
-		"name1":"测试1_3",
+		"name":"222",
 	})
 
+}
+
 
+func dealWithBingTuanData() {
+	f, err := os.Open("1.txt")
+	if err != nil {
+		panic(err)
+	}
+	defer f.Close()
+	rd := bufio.NewReader(f)
+	total:=0
+	isHead := false
+	savedata := map[string]interface{}{}
+	for {
+		total++
+		line, err := rd.ReadString('\n') //以'\n'为结束符读入一行
+		if err != nil || io.EOF == err {
+			break
+		}
+		if line=="\n" {
+			isHead = true
+			continue
+		}
+		line = strings.ReplaceAll(line,"\n","")
+		strArr := strings.Split(line,",")
 
+		if isHead {
+			if len(savedata)>2 {
+				save_mgo.Save("111",savedata)
+			}
+			savedata = map[string]interface{}{}
+			pre1 := "新疆生产建设兵团"+strArr[0]
+			pre2 := "新疆生产建设兵团"+strArr[1]
+			isHead=false
+			savedata["name"] = pre1
+			savedata["alias"] = pre2
+			savedata["area"] = "新疆"
+			savedata["city"] = strArr[2]
+			savedata["district"] = strArr[3]
+		}else {
+			list := []map[string]interface{}{}
+			if res, ok := savedata["list"].([]map[string]interface{}); ok {
+				list  = res
+			}
+			list = append(list, map[string]interface{}{
+				"name":strArr[0],
+				"area" :"新疆",
+				"city" : strArr[1],
+				"district" : strArr[2],
+			})
+			savedata["list"] = list
+		}
+	}
 
+	if len(savedata)>2 {
+		save_mgo.Save("111",savedata)
+	}
+	log.Debug("总计",total,"行")
 }
 
+
+
+
+
+
+
 //导出相关数据
 func exporToptypeRealData(){
 	os.Remove("类别字段统计.xlsx")

+ 34 - 0
process_ medical/src/main.go

@@ -0,0 +1,34 @@
+package main
+
+var (
+	sysconfig    		map[string]interface{} //配置文件
+	save_mgo        	*MongodbSim            //mongodb操作对象
+    MysqlTool			*Mysql
+)
+
+func init()  {
+	save_mgo = &MongodbSim{
+		MongodbAddr: "127.0.0.1:27017",
+		DbName:      "mixdata",
+		Size:        10,
+		UserName: "",
+		Password: "",
+	}
+	save_mgo.InitPool()
+
+	//MysqlTool = &Mysql{
+	//	Address: "192.168.3.109:4000",
+	//	UserName: "jianyu",
+	//	PassWord: "top@123",
+	//	DBName: "zktest",
+	//}
+	//MysqlTool.Init()
+
+}
+
+func main()  {
+	v_area()
+	//v_ylqxclass()
+
+}
+

+ 196 - 0
process_ medical/src/medical_v.go

@@ -0,0 +1,196 @@
+package main
+
+import (
+	"fmt"
+	log "github.com/donnie4w/go-logger/logger"
+	"github.com/tealeg/xlsx"
+	qu "qfw/util"
+	"regexp"
+	"strings"
+)
+
+func v_ylqxclass() {
+
+}
+func v_area() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q,total:=map[string]interface{}{},0
+	it := sess.DB(save_mgo.DbName).C("mysql_area").Sort("_id").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("curent index ",total)
+		}
+		delete(tmp,"_id")
+
+
+
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total)
+}
+
+
+//城市划分-mgo
+func citysClassification() {
+	sess := save_mgo.GetMgoConn()
+	defer save_mgo.DestoryMongoConn(sess)
+	q,total:=map[string]interface{}{
+		"town":map[string]interface{}{
+			"$exists":0,
+		},
+	},0
+	//tagDict := map[string]map[string]interface{}{}
+	it := sess.DB(save_mgo.DbName).C("address_jy_2021").Find(&q).Iter()
+	for tmp := make(map[string]interface{}); it.Next(&tmp);total++{
+		if total%1000==0 {
+			log.Debug("curent index ",total)
+		}
+		province:=qu.ObjToString(tmp["province"])
+		city:=qu.ObjToString(tmp["city"])
+		district:=qu.ObjToString(tmp["district"])
+		province_code := fmt.Sprintf("%d",tmp["province_code"])
+		city_code:= fmt.Sprintf("%d",tmp["city_code"])
+		district_code:=fmt.Sprintf("%d",tmp["district_code"])
+		//code pcode level name
+		data := map[string]interface{}{}
+		if district =="" {
+			if city=="" { //一级
+				data = map[string]interface{}{
+					"name":province,
+					"code":province_code,
+					"pcode":"",
+					"level":"1",
+				}
+			}else { //二级
+				data = map[string]interface{}{
+					"name":city,
+					"code":city_code,
+					"pcode":province_code,
+					"level":"2",
+				}
+			}
+		}else {
+			//三级
+			data = map[string]interface{}{
+				"name":district,
+				"code":district_code,
+				"pcode":city_code,
+				"level":"3",
+			}
+		}
+		save_mgo.Save("mysql_area",data)
+		tmp = make(map[string]interface{})
+	}
+	log.Debug("is over ",total)
+}
+
+
+
+//医疗分类-mgo
+func medicalClassification() {
+	ff,_ := xlsx.OpenFile("table.xlsx")
+	spaceReg := regexp.MustCompile(`([ \n]+)`)
+	proReg := regexp.MustCompile(`(^[0-9][0-9])`)
+	for index, sheet := range ff.Sheets {
+		v := sheet
+		class := v.Name
+		sort := 0
+		num_sort :=0
+		pre_str := ""
+		code_1 := dealSortStr(index+1)
+		dict_1 := map[string]interface{}{
+			"code":code_1,
+			"pcode":"",
+			"level":"1",
+			"name":class,
+		}
+		save_mgo.Save("mysql_ylqxclass",dict_1)
+
+		for k, row := range sheet.Rows {
+			if k==0 {
+				continue
+			}
+			var str []string
+			for _, cell := range row.Cells {
+				str = append(str, cell.String())
+			}
+			class_2,class_3,class_example := str[1],str[2],str[5]
+			class_2 = spaceReg.ReplaceAllString(class_2,"")
+			class_3 = spaceReg.ReplaceAllString(class_3,"")
+			new_class_3 := proReg.ReplaceAllString(class_3,"")
+			sort_1 := qu.IntAll(str[0])
+			if sort_1 > sort { //1-4
+				sort = sort_1
+				code_2 := code_1+dealSortStr(sort)
+				dict_2 := map[string]interface{}{
+					"code":code_2,
+					"pcode":code_1,
+					"level":"2",
+					"name":class_2,
+				}
+				save_mgo.Save("mysql_ylqxclass",dict_2)
+				code_3 := code_2+proReg.FindString(class_3)
+				dict_3 := map[string]interface{}{
+					"code":code_3,
+					"pcode":code_2,
+					"level":"3",
+					"name":new_class_3,
+				}
+				save_mgo.Save("mysql_ylqxclass",dict_3)
+				e_arr := strings.Split(class_example,"、")
+				pre_str = proReg.FindString(class_3)//重置一下
+				num_sort = 0 //重置一下
+				for _,v := range e_arr {
+					num_sort++
+					code4 := code_3+dealSortStr(num_sort)
+					dict_4 := map[string]interface{}{
+						"code":code4,
+						"pcode":code_3,
+						"level":"4",
+						"name":v,
+					}
+					save_mgo.Save("mysql_ylqxclass",dict_4)
+				}
+
+			}else { //3-4
+				str_3 := proReg.FindString(class_3)
+				code_2:=dealSortStr(index+1)+dealSortStr(sort)
+				code_3 := code_2+proReg.FindString(class_3)
+				if str_3 != pre_str {
+					pre_str = proReg.FindString(class_3)//重置一下
+					num_sort = 0 //重置一下
+					dict_3 := map[string]interface{}{
+						"code":code_3,
+						"pcode":code_2,
+						"level":"3",
+						"name":class_3,
+					}
+					save_mgo.Save("mysql_ylqxclass",dict_3)
+				}
+				e_arr := strings.Split(class_example,"、")
+				for _,v := range e_arr {
+					num_sort++
+					code4 := code_3+dealSortStr(num_sort)
+					dict_4 := map[string]interface{}{
+						"code":code4,
+						"pcode":code_3,
+						"level":"4",
+						"name":v,
+					}
+					save_mgo.Save("mysql_ylqxclass",dict_4)
+				}
+
+			}
+		}
+	}
+}
+func dealSortStr(index int) string {
+	code :=""
+	if index<10{
+		code = fmt.Sprintf("0%d",index)
+	}else {
+		code = fmt.Sprintf("%d",index)
+	}
+	return code
+}

+ 329 - 0
process_ medical/src/mgo.go

@@ -0,0 +1,329 @@
+package main
+
+import (
+	"context"
+	"log"
+	"time"
+
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"go.mongodb.org/mongo-driver/mongo"
+	"go.mongodb.org/mongo-driver/mongo/options"
+)
+
+type MgoSess struct {
+	Db     string
+	Coll   string
+	Query  interface{}
+	Sorts  []string
+	fields interface{}
+	limit  int64
+	skip   int64
+	M      *MongodbSim
+}
+
+type MgoIter struct {
+	Cursor *mongo.Cursor
+}
+
+func (mt *MgoIter) Next(result interface{}) bool {
+	if mt.Cursor != nil {
+		if mt.Cursor.Next(nil) {
+			err := mt.Cursor.Decode(result)
+			if err != nil {
+				log.Println("mgo cur err", err.Error())
+				mt.Cursor.Close(nil)
+				return false
+			}
+			return true
+		} else {
+			mt.Cursor.Close(nil)
+			return false
+		}
+	} else {
+		return false
+	}
+
+}
+
+func (ms *MgoSess) DB(name string) *MgoSess {
+	ms.Db = name
+	return ms
+}
+
+func (ms *MgoSess) C(name string) *MgoSess {
+	ms.Coll = name
+	return ms
+}
+
+func (ms *MgoSess) Find(q interface{}) *MgoSess {
+	ms.Query = q
+	return ms
+}
+
+func (ms *MgoSess) Select(fields interface{}) *MgoSess {
+	ms.fields = fields
+	return ms
+}
+
+func (ms *MgoSess) Limit(limit int64) *MgoSess {
+	ms.limit = limit
+	return ms
+}
+func (ms *MgoSess) Skip(skip int64) *MgoSess {
+	ms.skip = skip
+	return ms
+}
+
+func (ms *MgoSess) Sort(sorts ...string) *MgoSess {
+	ms.Sorts = sorts
+	return ms
+}
+
+func (ms *MgoSess) Iter() *MgoIter {
+	it := &MgoIter{}
+	find := options.Find()
+	if ms.skip > 0 {
+		find.SetSkip(ms.skip)
+	}
+	if ms.limit > 0 {
+		find.SetLimit(ms.limit)
+	}
+	find.SetBatchSize(100)
+	if len(ms.Sorts) > 0 {
+		sort := bson.M{}
+		for _, k := range ms.Sorts {
+			switch k[:1] {
+			case "-":
+				sort[k[1:]] = -1
+			case "+":
+				sort[k[1:]] = 1
+			default:
+				sort[k] = 1
+			}
+		}
+		find.SetSort(sort)
+	}
+	if ms.fields != nil {
+		find.SetProjection(ms.fields)
+	}
+	cur, err := ms.M.C.Database(ms.Db).Collection(ms.Coll).Find(ms.M.Ctx, ms.Query, find)
+	if err != nil {
+		log.Println("mgo find err", err.Error())
+	} else {
+		it.Cursor = cur
+	}
+	return it
+}
+
+type MongodbSim struct {
+	MongodbAddr string
+	Size        int
+	//	MinSize     int
+	DbName   string
+	C        *mongo.Client
+	Ctx      context.Context
+	ShortCtx context.Context
+	pool     chan bool
+	UserName string
+	Password string
+}
+
+func (m *MongodbSim) GetMgoConn() *MgoSess {
+	//m.Open()
+	ms := &MgoSess{}
+	ms.M = m
+	return ms
+}
+
+func (m *MongodbSim) DestoryMongoConn(ms *MgoSess) {
+	//m.Close()
+	ms.M = nil
+	ms = nil
+}
+
+func (m *MongodbSim) InitPool() {
+	opts := options.Client()
+	opts.SetConnectTimeout(3 * time.Second)
+	opts.ApplyURI("mongodb://" + m.MongodbAddr)
+	opts.SetMaxPoolSize(uint64(m.Size))
+	m.pool = make(chan bool, m.Size)
+
+	if m.UserName !="" && m.Password !="" {
+		cre := options.Credential{
+			Username:m.UserName,
+			Password:m.Password,
+		}
+		opts.SetAuth(cre)
+	}
+
+
+
+	opts.SetMaxConnIdleTime(2 * time.Hour)
+	m.Ctx, _ = context.WithTimeout(context.Background(), 99999*time.Hour)
+	m.ShortCtx, _ = context.WithTimeout(context.Background(), 1*time.Minute)
+	client, err := mongo.Connect(m.ShortCtx, opts)
+	if err != nil {
+		log.Println("mgo init error:", err.Error())
+	} else {
+		m.C = client
+		log.Println("init success")
+	}
+}
+
+func (m *MongodbSim) Open() {
+	m.pool <- true
+}
+func (m *MongodbSim) Close() {
+	<-m.pool
+}
+
+//批量插入
+func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	var writes []mongo.WriteModel
+	for _, d := range doc {
+		write := mongo.NewUpdateOneModel()
+		write.SetFilter(d[0])
+		write.SetUpdate(d[1])
+		write.SetUpsert(true)
+		writes = append(writes, write)
+	}
+	r, e := coll.BulkWrite(m.Ctx, writes)
+	if e != nil {
+		log.Println("mgo upsert error:", e.Error())
+		return nil, false
+	}
+	//	else {
+	//		if r.UpsertedCount != int64(len(doc)) {
+	//			log.Println("mgo upsert uncomplete:uc/dc", r.UpsertedCount, len(doc))
+	//		}
+	//		return true
+	//	}
+	return r.UpsertedIDs, true
+}
+
+//批量插入
+func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	var writes []mongo.WriteModel
+	for _, d := range doc {
+		write := mongo.NewInsertOneModel()
+		write.SetDocument(d)
+		writes = append(writes, write)
+	}
+	_, e := coll.BulkWrite(m.Ctx, writes)
+	if e != nil {
+		log.Println("mgo savebulk error:", e.Error())
+		return false
+	}
+	return true
+}
+
+//保存
+func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r, err := coll.InsertOne(m.Ctx, doc)
+	if err != nil {
+		return nil
+	}
+	return r.InsertedID
+}
+
+//更新by Id
+func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	_, err := coll.UpdateOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)}, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+//删除by id
+func (m *MongodbSim) DeleteById(c, id string) int64 {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r, err := coll.DeleteOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)})
+	if err != nil {
+		return 0
+	}
+	return r.DeletedCount
+}
+
+//通过条件删除
+func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r, err := coll.DeleteMany(m.Ctx, query)
+	if err != nil {
+		return 0
+	}
+	return r.DeletedCount
+}
+
+//findbyid
+func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r := coll.FindOne(m.Ctx, map[string]interface{}{"_id": StringTOBsonId(id)})
+	v := map[string]interface{}{}
+	r.Decode(&v)
+	return v
+}
+
+//findone
+func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]interface{} {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	r := coll.FindOne(m.Ctx, query)
+	v := map[string]interface{}{}
+	r.Decode(&v)
+	return v
+}
+
+//find
+func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields interface{}) ([]map[string]interface{}, error) {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	op := options.Find()
+	r, err := coll.Find(m.Ctx, query, op.SetSort(sort), op.SetProjection(fields))
+	if err != nil {
+		log.Fatal(err)
+		return nil, err
+	}
+
+	var results []map[string]interface{}
+	if err = r.All(m.Ctx, &results); err != nil {
+		log.Fatal(err)
+		return nil, err
+	}
+	return results, nil
+}
+
+//创建_id
+func NewObjectId() primitive.ObjectID {
+	return primitive.NewObjectID()
+}
+
+func StringTOBsonId(id string) primitive.ObjectID {
+	objectId, _ := primitive.ObjectIDFromHex(id)
+	return objectId
+}
+
+func BsonTOStringId(id interface{}) string {
+	return id.(primitive.ObjectID).Hex()
+}

+ 505 - 0
process_ 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))
+	log.Println(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)
+		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
+}

TEMPAT SAMPAH
process_ medical/src/table.xlsx