zhengkun пре 1 недеља
родитељ
комит
86cb9192d0

+ 2 - 0
data_extown/src/ext_util/init.go

@@ -10,10 +10,12 @@ var (
 	Sysconfig map[string]interface{}
 	ExtMgo    *MongodbSim //抽取初始化-相关
 	TestMgo   *MongodbSim
+	TestCol   string
 )
 
 func InitExt() {
 	qu.ReadConfig("./res/config.json", &Sysconfig)
+	TestCol = qu.ObjToString(Sysconfig["test_col"])
 	if len(Sysconfig) == 0 {
 		log.Fatalln("init config err")
 	}

+ 8 - 3
data_extown/src/main.go

@@ -15,7 +15,6 @@ func init() {
 }
 func main() {
 	//以下测试测试
-	//test()
 	runTask()
 	lock := make(chan bool)
 	<-lock
@@ -25,19 +24,25 @@ func runTask() {
 	sess := ext_util.TestMgo.GetMgoConn()
 	defer ext_util.TestMgo.DestoryMongoConn(sess)
 	q, total := map[string]interface{}{}, 0
-	it := sess.DB(ext_util.TestMgo.DbName).C("xzh").Find(&q).Sort("_id").Iter()
+	it := sess.DB(ext_util.TestMgo.DbName).C(ext_util.TestCol).Find(&q).Sort("_id").Iter()
 	isok := 0
 	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
 		if total%5000 == 0 {
 			log.Debug("cur index ", total, "~", isok)
 		}
 		city := qu.ObjToString(tmp["city"])
+		tmpid := ext_util.BsonTOStringId(tmp["_id"])
 		if city == "中山市" {
 			town := ext.Ext.ExtractRegionTownInfo(tmp)
 			if town != "" {
 				isok++
+				ext_util.TestMgo.UpdateById(ext_util.TestCol, tmpid, map[string]interface{}{
+					"$set": map[string]interface{}{
+						"district": town,
+					},
+				})
 			} else {
-				log.Debug(ext_util.BsonTOStringId(tmp["_id"]))
+				//log.Debug(ext_util.BsonTOStringId(tmp["_id"]))
 			}
 		}
 		tmp = make(map[string]interface{})

+ 2 - 1
data_extown/src/res/config.json

@@ -12,5 +12,6 @@
     "user": "",
     "password": "",
     "direct": false
-  }
+  },
+  "test_col": "xzh"
 }

+ 127 - 0
data_mhxy/src/front/front.go

@@ -0,0 +1,127 @@
+package front
+
+import (
+	"encoding/json"
+	"github.com/go-xweb/xweb"
+	"io/ioutil"
+	qu "qfw/util"
+)
+
+func init() {
+
+}
+
+type Front struct {
+	*xweb.Action
+	index   xweb.Mapper `xweb:"/front/index"`
+	refresh xweb.Mapper `xweb:"/front/refresh"`
+	reset   xweb.Mapper `xweb:"/front/reset"`
+	save    xweb.Mapper `xweb:"/front/save"`
+}
+
+func (f *Front) Index() {
+	_ = f.Render("index.html")
+}
+
+// 刷新
+func (f *Front) Refresh() {
+	defer qu.Catch()
+	//读···
+	info, price := map[string]interface{}{}, map[string]interface{}{}
+	qu.ReadConfig("web/data/info.json", &info)
+	qu.ReadConfig("web/data/price.json", &price)
+	money, total, score := 0, 0, 0
+	for k, v := range info {
+		if k == "key1" {
+			money += qu.IntAll(v) * qu.IntAll(price[k])
+			total += qu.IntAll(v)
+			score += qu.IntAll(v) * 2
+		} else if k == "key2" {
+			money += qu.IntAll(v) * qu.IntAll(price[k])
+			total += qu.IntAll(v)
+			score += qu.IntAll(v) * 3
+		} else if k == "key3" {
+			money += qu.IntAll(v) * qu.IntAll(price[k])
+			total += qu.IntAll(v)
+			score += qu.IntAll(v) * 5
+		} else if k == "key4" {
+			money += qu.IntAll(v) * qu.IntAll(price[k])
+			total += qu.IntAll(v)
+			score += qu.IntAll(v) * 2
+		} else if k == "key5" {
+			money += qu.IntAll(v) * qu.IntAll(price[k])
+			total += qu.IntAll(v)
+			score += qu.IntAll(v) * 2
+		} else if k == "key6" {
+			money += qu.IntAll(v) * qu.IntAll(price[k])
+			total += qu.IntAll(v)
+			score += qu.IntAll(v) * 5
+		} else if k == "key7" {
+			money += qu.IntAll(v) * qu.IntAll(price[k])
+			total += qu.IntAll(v)
+			score += qu.IntAll(v) * 4
+		} else if k == "key8" {
+			money += qu.IntAll(v) * qu.IntAll(price[k])
+			total += qu.IntAll(v)
+			score += qu.IntAll(v) * 0
+		} else {
+
+		}
+	}
+	info["money"] = money
+	info["total"] = total
+	info["score"] = score
+	f.ServeJson(map[string]interface{}{
+		"data": info,
+		"per":  price,
+	})
+}
+
+// 保存
+func (f *Front) Save() {
+	defer qu.Catch()
+	t1, _ := f.GetInt("key1")
+	t2, _ := f.GetInt("key2")
+	t3, _ := f.GetInt("key3")
+	t4, _ := f.GetInt("key4")
+	t5, _ := f.GetInt("key5")
+	t6, _ := f.GetInt("key6")
+	t7, _ := f.GetInt("key7")
+	t8, _ := f.GetInt("key8")
+	info := map[string]interface{}{
+		"key1": t1,
+		"key2": t2,
+		"key3": t3,
+		"key4": t4,
+		"key5": t5,
+		"key6": t6,
+		"key7": t7,
+		"key8": t8,
+	}
+	byteValue, _ := json.Marshal(info)
+	ioutil.WriteFile("web/data/info.json", byteValue, 0644)
+	f.ServeJson(map[string]interface{}{
+		"data": "保存成功",
+	})
+}
+
+// 重置
+func (f *Front) Reset() {
+	defer qu.Catch()
+	// 写入新的JSON文件
+	info := map[string]interface{}{
+		"key1": 0,
+		"key2": 0,
+		"key3": 0,
+		"key4": 0,
+		"key5": 0,
+		"key6": 0,
+		"key7": 0,
+		"key8": 0,
+	}
+	byteValue, _ := json.Marshal(info)
+	ioutil.WriteFile("web/data/info.json", byteValue, 0644)
+	f.ServeJson(map[string]interface{}{
+		"data": "重置成功",
+	})
+}

+ 31 - 0
data_mhxy/src/main.go

@@ -0,0 +1,31 @@
+package main
+
+import (
+	"front"
+	"github.com/go-xweb/xweb"
+	"time"
+)
+
+func init() {
+	//xweb框架配置
+	xweb.Config.RecoverPanic = true
+	xweb.Config.Profiler = true
+	xweb.RootApp().AppConfig.TemplateDir = "web/templates"
+	xweb.RootApp().AppConfig.StaticDir = "web/res"
+	xweb.RootApp().AppConfig.StaticFileVersion = false
+	xweb.RootApp().AppConfig.CheckXsrf = false
+	xweb.RootApp().AppConfig.ReloadTemplates = true
+	xweb.RootApp().AppConfig.EnableHttpCache = false
+	xweb.RootApp().AppConfig.Mode = xweb.Product
+	xweb.RootApp().AppConfig.CacheTemplates = false
+	xweb.AddAction(&front.Front{})
+	xweb.RootApp().AppConfig.SessionTimeout = 24 * time.Hour
+}
+
+func main() {
+	xweb.Run(":6969")
+	lock := make(chan bool)
+	<-lock
+}
+
+//https://sub2.smallstrawberry.com/api/v1/client/subscribe?token=c2eba10d71d2229ac86e45c0aef8942c

+ 19 - 0
data_mhxy/src/mhxy/router.go

@@ -0,0 +1,19 @@
+package mhxy
+
+import (
+	"encoding/gob"
+	"github.com/gin-contrib/sessions"
+	"github.com/gin-contrib/sessions/cookie"
+	"github.com/gin-gonic/gin"
+	"time"
+)
+
+var Router = gin.Default()
+
+func init() {
+	store := cookie.NewStore([]byte("data_mhxy"))
+	Router.Use(sessions.Sessions("mysession", store))
+	gob.Register(&map[string]interface{}{})
+	gob.Register(&[]map[string]interface{}{})
+	gob.Register(&time.Time{})
+}

+ 1 - 0
data_mhxy/src/web/data/info.json

@@ -0,0 +1 @@
+{"key1":1,"key2":1,"key3":4,"key4":1,"key5":1,"key6":0,"key7":0,"key8":0}

+ 10 - 0
data_mhxy/src/web/data/price.json

@@ -0,0 +1,10 @@
+{
+  "key1": 20,
+  "key2": 10,
+  "key3": 40,
+  "key4": 2,
+  "key5": 2,
+  "key6": 4,
+  "key7": 3,
+  "key8": 0
+}

+ 1 - 0
data_tool/src/main.go

@@ -18,6 +18,7 @@ func init() {
 func main() {
 	RunExportInfo1()
 	RunExportInfo2()
+
 	//lock := make(chan bool)
 	//<-lock
 }

+ 0 - 1
data_ylqx/src/bidding/purchasing.go

@@ -137,7 +137,6 @@ func createPurchasingBaseInfo(tmp map[string]interface{}) {
 		ul.InsertMysqlSubjectData(ul.YlPurchasingBaseInfo, baseInfo, projectid)
 	}
 }
-
 // 方法
 func FindIdentifyLevelRegionCode(key string, name string, baseInfo *map[string]interface{}) {
 	(*baseInfo)[key] = name

+ 44 - 0
data_ylqx/src/config.json

@@ -0,0 +1,44 @@
+{
+  "mongo_bid": {
+    "addr": "172.31.31.202:27081,172.20.45.128:27080",
+    "dbname" : "qfw",
+    "username": "zhengkun",
+    "password": "zk@123123",
+    "direct" : false
+  },
+  "mongo_qy": {
+    "addr": "172.31.31.202:27081,172.20.45.128:27080",
+    "dbname" : "mixdata",
+    "username": "zhengkun",
+    "password": "zk@123123",
+    "direct" : false
+  },
+  "mongo_ext": {
+    "addr": "172.17.4.85:27080",
+    "dbname" : "qfw",
+    "username": "",
+    "password": "",
+    "direct" : false
+  },
+  "mongo_spi": {
+    "addr": "172.17.4.181:27001",
+    "dbname" : "mixdata",
+    "username": "",
+    "password": "",
+    "direct" : false
+  },
+  "mongo_python": {
+    "addr": "172.17.4.87:27080",
+    "dbname" : "py_theme",
+    "username": "",
+    "password": "",
+    "direct" : false
+  },
+  "mongo_save": {
+    "addr": "172.17.4.87:27080",
+    "dbname" : "zk_sqldata",
+    "username": "",
+    "password": "",
+    "direct" : false
+  }
+}

+ 3 - 13
data_ylqx/src/main.go

@@ -1,7 +1,6 @@
 package main
 
 import (
-	"dimension"
 	"fmt"
 	log "github.com/donnie4w/go-logger/logger"
 	"go.mongodb.org/mongo-driver/bson"
@@ -29,25 +28,16 @@ func main() {
 	//dimension.StartSupplyDealerDimensionProductInfo()
 	//dimension.StartDealWithDealerDimensionTagInfo()
 
-	//标的物与中标信息
+	//处理标的物与中标信息
 	//bidding.StartDealWithPurashingInfo()
-	//关系型数据
+	//处理关系型数据
 	//relation.StartDealWithRelationBuyerWinnerInfo()
 
 	//标的物与中标信息与关系型-增量部署
 	//bidding_add.BiddingRelationAddTask()
 
 	//经销商相关联标签-增量部署
-	dimension.DimensionAddTask()
-
-	//code, info := bidding.ComparisonItemNameInfo("宫腔检查镜")
-	//log.Debug(code, info)
-
-	//导出疑似问题数据-
-	//test2.ExportLabelErrBidInfo()
-	//test2.ExportWarningBidInfo()
-
-	//relation.StartDealWithRelationBuyerWinnerInfo()
+	//dimension.DimensionAddTask()
 
 	//保持活性
 	lock := make(chan bool)

+ 0 - 236
data_ylqx/src/test/other.go

@@ -1,236 +0,0 @@
-package test
-
-import (
-	log "github.com/donnie4w/go-logger/logger"
-	"github.com/tealeg/xlsx"
-	qu "qfw/util"
-	"strings"
-	ul "util"
-)
-
-//导出错误标注数据与看板数据
-func ExportLabelErrBidInfo() {
-	arr1 := []string{
-		"647daf58a1840869018fe768",
-		"647d32eceb01e8efa6318a77",
-		"64802ef6d6ab496933e66b76",
-		"6481b2618aea8786d11851ab",
-		"647fecc9cc93eebb8568132c",
-		"647ffc14cc93eebb856854b0",
-		"647e9704a18408690191ec0c",
-		"647eda978aea8786d1157272",
-		"648207aed6ab496933ecc251",
-		"647fb7e8d6ab496933e48ba4",
-		"647ec1e3eb01e8efa6351245",
-		"647edcb3a18408690193cae5",
-		"6481b714d6ab496933eb6465",
-		"647dac5d8aea8786d113e9ab",
-		"64812c138aea8786d11783dc",
-		"647d9a4aa1840869018f8709",
-		"647eedcfa1840869019416cb",
-		"647d4c60a1840869018e7586",
-		"64804d158aea8786d1170cd1",
-		"647ef96ea184086901946a7e",
-		"647eed8d8aea8786d1159a97",
-		"647e905aa18408690191b2e1",
-		"647ecbfba184086901935d7e",
-		"647d41f2a1840869018e4e51",
-		"647f2a5c8aea8786d1162132",
-		"6480553bd6ab496933e73136",
-		"64804d178aea8786d1170d2c",
-		"64804631cc93eebb85693e4b",
-	}
-	arr2 := []string{
-		"62d059db2f27cc9ca37bd90e",
-		"62d129292f27cc9ca37c6deb",
-		"62d0b3af2f27cc9ca37bf1fd",
-		"62d09b022f27cc9ca37bebef",
-		"62d070cd2f27cc9ca37bdf7d",
-		"62d0729c2f27cc9ca37bdfc3",
-		"62d06adf2f27cc9ca37bddf5",
-		"62d06b942f27cc9ca37bde0a",
-		"62d059db2f27cc9ca37bd90e",
-		"62d035a22f27cc9ca37bcd62",
-		"62d029432f27cc9ca37bc67f",
-		"62cf355a2f27cc9ca37ae761",
-		"62cf37202f27cc9ca37ae7d0",
-		"62e2cd682f27cc9ca3865c41",
-		"62e217682f27cc9ca385c8e4",
-		"62d930622f27cc9ca380cb46",
-		"62d8a8202f27cc9ca3802d61",
-		"62d43ac02f27cc9ca37d4b59",
-		"62d3ed4a2f27cc9ca37d3fa9",
-		"62d3efa42f27cc9ca37d4014",
-		"62d1f0262f27cc9ca37ceef7",
-		"6476c47feb01e8efa62a295c",
-		"62d8a8202f27cc9ca3802d61",
-		"6433b4448aea8786d1e1d1a5",
-		"63087e1036c823627b4e1326",
-		"6438f42b8aea8786d1e7774c",
-		"62e39d2f2f27cc9ca386db75",
-		"630362142f27cc9ca397146f",
-		"62d8dcde2f27cc9ca3806e7b",
-		"6461e3888aea8786d1003c4c",
-		"63086269c994e88c25e765e7",
-		"649142f1bc7765fecd23d81b",
-		"641ad72d779467cff19cc0e2",
-		"62724be7923488e172581fd2",
-		"649b9961bc7765fecd33682e",
-	}
-	arr := append(arr1, arr2...)
-	isok1 := 0
-	for _, v := range arr {
-		data := ul.Bid_Mgo.FindById("bidding", v)
-		if data != nil && len(data) > 2 {
-			ul.Bid_Mgo.Save("zktest_zhongbiao_info", data)
-			isok1++
-		} else {
-			data = ul.Bid_Mgo.FindById("bidding_back", v)
-			if data != nil && len(data) > 2 {
-				ul.Bid_Mgo.Save("zktest_zhongbiao_info", data)
-				isok1++
-			} else {
-				log.Debug(v)
-			}
-		}
-	}
-	log.Debug("is over ... ", len(arr), "~", isok1)
-
-	dataArr, _ := ul.Lab_Mgo.Find("f_sourceinfo_extract_0525_moban", nil, nil, nil)
-	log.Debug("查询数量...", len(dataArr))
-	isok2 := 0
-	for _, v := range dataArr {
-		i_ckdata := qu.IntAll(v["i_ckdata"])
-		if i_ckdata == 2 {
-			tmpid := qu.ObjToString(v["id"])
-			v_taginfo := *qu.ObjToMap(v["v_taginfo"])
-			for k1, v1 := range v_taginfo {
-				if k1 == "s_winner" || k1 == "bidamount" {
-					if qu.IntAll(v1) == 2 {
-						data := ul.Bid_Mgo.FindById("bidding", tmpid)
-						if len(data) > 0 {
-							ul.Bid_Mgo.Save("zktest_zhongbiao_info", data)
-							isok2++
-							break
-						} else {
-							data = ul.Bid_Mgo.FindById("bidding_back", tmpid)
-							if len(data) > 0 {
-								ul.Bid_Mgo.Save("zktest_zhongbiao_info", data)
-								isok2++
-								break
-							} else {
-								log.Debug(tmpid)
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	log.Debug("is over ... ", isok2)
-
-}
-
-//导出疑似异常数据
-func ExportWarningBidInfo() {
-	arr, _ := ul.Bid_Mgo.Find("zktest_zhongbiao_info", nil, nil, nil)
-	log.Debug("此时数据...", len(arr))
-	//7月1号之前的数据
-	q, total := map[string]interface{}{
-		"_id": map[string]interface{}{
-			"$lte": ul.StringTOBsonId("649efc000000000000000000"),
-		},
-	}, 0
-	sess := ul.Bid_Mgo.GetMgoConn()
-	defer ul.Bid_Mgo.DestoryMongoConn(sess)
-	isok, temp := 0, map[string]string{}
-	isok = len(arr)
-	it := sess.DB(ul.Bid_Mgo.DbName).C("bidding").Find(&q).Sort("-_id").Iter()
-	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
-		if total%1000 == 0 {
-			log.Debug("curent index ", total, "~", isok)
-		}
-		subtype := qu.ObjToString(tmp["subtype"])
-		site := qu.ObjToString(tmp["site"])
-		pkg := *qu.ObjToMap(tmp["package"])
-		s_winner := qu.ObjToString(tmp["s_winner"])
-		bidamount := qu.Float64All(tmp["bidamount"])
-		if (subtype == "中标" || subtype == "成交" || subtype == "合同") &&
-			len(pkg) > 0 && (s_winner == "" || bidamount <= float64(0)) {
-			if temp[site] == "" {
-				temp[site] = site
-				isok++
-				ul.Bid_Mgo.Save("zktest_zhongbiao_info", tmp)
-			}
-		}
-		if isok >= 450 {
-			break
-		}
-		tmp = make(map[string]interface{})
-	}
-	log.Debug("is over ", total, "~", isok)
-}
-
-func ExportSSKXlsxData() {
-	ff, _ := xlsx.OpenFile("res/1.xlsx")
-	for _, sheet := range ff.Sheets {
-		for _, row := range sheet.Rows {
-			var str []string
-			for _, cell := range row.Cells {
-				s := cell.String()
-				s = strings.ReplaceAll(s, " ", "")
-				s = strings.ReplaceAll(s, " ", "")
-				str = append(str, s)
-			}
-			name := ""
-			for k, v := range str {
-				if k == 0 {
-					name = v
-					ul.Save_Mgo.Save("1212121", map[string]interface{}{
-						"name":  name,
-						"alias": name,
-					})
-				} else {
-					if v != "" {
-
-					}
-					ul.Save_Mgo.Save("1212121", map[string]interface{}{
-						"name":  name,
-						"alias": v,
-					})
-				}
-			}
-		}
-	}
-	log.Debug("is over ......")
-}
-
-//......
-func ExportWarningDateInfo() {
-	query, total, isok := map[string]interface{}{
-		"_id": map[string]interface{}{
-			"$gte": ul.StringTOBsonId("64776f000000000000000000"),
-			"$lt":  ul.StringTOBsonId("649d561f9f3f6a78fc3c149f"),
-		},
-	}, 0, 0
-	log.Debug("当前获取待更新的query...", query)
-	sess := ul.Bid_Mgo.GetMgoConn()
-	defer ul.Bid_Mgo.DestoryMongoConn(sess)
-	it := sess.DB(ul.Bid_Mgo.DbName).C("bidding").Find(&query).Sort("_id").Iter()
-	for tmp := make(map[string]interface{}); it.Next(&tmp); total++ {
-		if total%10000 == 0 {
-			log.Debug("cur index ", total, "~", isok, "~", tmp["_id"])
-		}
-		toptype := qu.ObjToString(tmp["toptype"])
-		if toptype == "拟建" {
-			project_completedate := qu.ObjToString(tmp["project_completedate"])
-			project_startdate := qu.ObjToString(tmp["project_startdate"])
-			if project_completedate != "" || project_startdate != "" {
-				isok++
-				ul.Bid_Mgo.Save("zktest_repair_0630", tmp)
-			}
-		}
-		tmp = make(map[string]interface{})
-	}
-	log.Debug("is over ... ", total, "~", isok)
-}

+ 7 - 36
data_ylqx/src/util/global.go

@@ -1,13 +1,12 @@
 package util
 
 import (
-	"go.mongodb.org/mongo-driver/bson/primitive"
 	qu "qfw/util"
 	"regexp"
 	"time"
 )
 
-//产品分类使用
+// 产品分类使用
 var (
 	CodeRelation = map[string]string{
 		"06": "医用成像器械",
@@ -93,7 +92,7 @@ var (
 	CleanPN4        = regexp.MustCompile("^([0-9]+)")
 )
 
-//经营能力使用
+// 经营能力使用
 var (
 	JyRangeReg1   = regexp.MustCompile("(6\\d{3})([\\s ]+)?[\u4e00-\u9fa5]+")
 	JyRangeReg2   = regexp.MustCompile("[0-2]\\d{1}([\u4e00-\u9fa5()()、]+)")
@@ -383,7 +382,7 @@ var (
 	BiddingType   = map[string]interface{}{"招标": 0, "邀标": 1, "单一": 2, "竞价": 3, "竞谈": 4, "询价": 5}
 )
 
-//经营能力  一二三
+// 经营能力  一二三
 var (
 	Capacity_Code_Old = map[string][]string{
 		"6801": []string{"01", "02"},
@@ -456,7 +455,7 @@ var (
 	}
 )
 
-//获取最优企业
+// 获取最优企业
 func GetOneBaseCompany(arr []map[string]interface{}) int {
 	index := 0
 	flag := 100
@@ -477,7 +476,7 @@ func GetOneBaseCompany(arr []map[string]interface{}) int {
 	return index
 }
 
-//处理地域代码
+// 处理地域代码
 func DealWithRegionCode(area string, city string, district string) (area_code string, city_code string, district_code string) {
 	area_code, city_code, district_code = "000000", "", ""
 	if district != "" {
@@ -510,7 +509,7 @@ func DealWithRegionCode(area string, city string, district string) (area_code st
 	return
 }
 
-//选取有效数据
+// 选取有效数据
 func Pickfirst(s1 string, s2 string) string {
 	if s1 != "" {
 		return s1
@@ -518,7 +517,7 @@ func Pickfirst(s1 string, s2 string) string {
 	return s2
 }
 
-//删除字段
+// 删除字段
 func DeleteField(data *map[string]interface{}, fieldArr ...string) {
 	//针对时间类进行清理
 	dateFields := []string{"validity_date", "approve_date", "establish_date", "issue_date", "cancel_date", "revoke_date"}
@@ -535,31 +534,3 @@ func DeleteField(data *map[string]interface{}, fieldArr ...string) {
 	//新增一个创建时间
 	(*data)["createtime"] = time.Unix(time.Now().Unix(), 0).Format(TimeLayout)
 }
-
-func IsMarkInterfaceArr(t interface{}) []string {
-	sub_list := []string{}
-	if list_3, ok_3 := t.([]string); ok_3 {
-		sub_list = list_3
-		return sub_list
-	}
-	if list_1, ok_1 := t.(primitive.A); ok_1 {
-		sub_list = qu.ObjArrToStringArr(list_1)
-	} else {
-		if list_2, ok_2 := t.([]interface{}); ok_2 {
-			sub_list = qu.ObjArrToStringArr(list_2)
-		}
-	}
-	return sub_list
-}
-
-func IsMarkInterfaceMap(t interface{}) []map[string]interface{} {
-	p_list := []map[string]interface{}{}
-	if yl_list_1, ok_1 := t.(primitive.A); ok_1 {
-		p_list = qu.ObjArrToMapArr(yl_list_1)
-	} else {
-		if yl_list_2, ok_2 := t.([]interface{}); ok_2 {
-			p_list = qu.ObjArrToMapArr(yl_list_2)
-		}
-	}
-	return p_list
-}

+ 73 - 138
data_ylqx/src/util/initcfg.go

@@ -11,13 +11,13 @@ import (
 )
 
 var (
-	Py_Mgo            *MongodbSim
+	Py_Mgo, Ext_Mgo   *MongodbSim
 	Bid_Mgo, Save_Mgo *MongodbSim
 	Spi_Mgo, Qyxy_Mgo *MongodbSim
-	Ext_Mgo, Lab_Mgo  *MongodbSim
 	MysqlGlobalTool   *Mysql
 	MysqlSubjectTool  *Mysql
 	IsLocal, IsDev    bool
+	SysConfig         map[string]interface{}
 	TimeLayout        = "2006-01-02 15:04:05"
 	TimeTmeplate      = "2006-01-02"
 	S_Reality         = 0.8
@@ -36,6 +36,7 @@ var Pool_Mgo = make(chan bool, 10)
 var Wg_Mgo = &sync.WaitGroup{}
 
 func InitClass() {
+	qu.ReadConfig(&SysConfig) //加载配置文件
 	initMgoInfo()
 	initMysqlInfo()
 	initCodeInfo()
@@ -43,148 +44,82 @@ func InitClass() {
 
 // 初始化mgo
 func initMgoInfo() {
-	//Old_Mgo = &MongodbSim{
-	//	MongodbAddr: "127.0.0.1:12003",
-	//	DbName:      "py_theme",
-	//	Size:        10,
-	//	UserName:    "",
-	//	Password:    "",
-	//}
-	//Old_Mgo.InitPool()
-	//return
-	if IsLocal {
-		Py_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Py_Mgo.InitPool()
-
-		Bid_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Bid_Mgo.InitPool()
-
-		Save_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Save_Mgo.InitPool()
-
-		Spi_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Spi_Mgo.InitPool()
-
-		Ext_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Ext_Mgo.InitPool()
-
-		Qyxy_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Qyxy_Mgo.InitPool()
-
-		Lab_Mgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "zhengkun",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Lab_Mgo.InitPool()
-	} else {
-		Bid_Mgo = &MongodbSim{
-			MongodbAddr: "172.17.189.140:27080,172.17.189.141:27081",
-			DbName:      "qfw",
-			Size:        10,
-			UserName:    "zhengkun",
-			Password:    "zk@123123",
-		}
-		Bid_Mgo.InitPool()
-
-		Py_Mgo = &MongodbSim{
-			MongodbAddr: "172.17.4.87:27080",
-			DbName:      "py_theme",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Py_Mgo.InitPool()
-
-		Save_Mgo = &MongodbSim{
-			MongodbAddr: "172.17.4.87:27080",
-			DbName:      "zk_sqldata",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Save_Mgo.InitPool()
-
-		Spi_Mgo = &MongodbSim{
-			MongodbAddr: "172.17.4.181:27001",
-			DbName:      "mixdata",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Spi_Mgo.InitPool()
-
-		Ext_Mgo = &MongodbSim{
-			MongodbAddr: "172.17.4.85:27080",
-			DbName:      "qfw",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Ext_Mgo.InitPool()
-
-		Qyxy_Mgo = &MongodbSim{
-			MongodbAddr: "172.17.189.140:27080,172.17.189.141:27081",
-			DbName:      "mixdata",
-			Size:        10,
-			UserName:    "zhengkun",
-			Password:    "zk@123123",
-		}
-		Qyxy_Mgo.InitPool()
-
-		Lab_Mgo = &MongodbSim{
-			MongodbAddr: "172.17.4.86:27080",
-			DbName:      "jyqykhfw_test",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		Lab_Mgo.InitPool()
+
+	mongo_bid := *qu.ObjToMap(SysConfig["mongo_bid"])
+	Bid_Mgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_bid["addr"]),
+		DbName:      qu.ObjToString(mongo_bid["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_bid["username"]),
+		Password:    qu.ObjToString(mongo_bid["password"]),
+		IsDirect:    mongo_bid["direct"].(bool),
+	}
+	Bid_Mgo.InitPool()
+
+	mongo_qy := *qu.ObjToMap(SysConfig["mongo_qy"])
+	Qyxy_Mgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_qy["addr"]),
+		DbName:      qu.ObjToString(mongo_qy["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_qy["username"]),
+		Password:    qu.ObjToString(mongo_qy["password"]),
+		IsDirect:    mongo_qy["direct"].(bool),
+	}
+	Qyxy_Mgo.InitPool()
+
+	//172.17.4.85:27080
+	mongo_ext := *qu.ObjToMap(SysConfig["mongo_ext"])
+	Ext_Mgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_ext["addr"]),
+		DbName:      qu.ObjToString(mongo_ext["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_ext["username"]),
+		Password:    qu.ObjToString(mongo_ext["password"]),
+		IsDirect:    mongo_ext["direct"].(bool),
+	}
+	Ext_Mgo.InitPool()
+
+	//172.17.4.181:27001
+	mongo_spi := *qu.ObjToMap(SysConfig["mongo_spi"])
+	Spi_Mgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_spi["addr"]),
+		DbName:      qu.ObjToString(mongo_spi["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_spi["username"]),
+		Password:    qu.ObjToString(mongo_spi["password"]),
+		IsDirect:    mongo_spi["direct"].(bool),
+	}
+	Spi_Mgo.InitPool()
+
+	//172.17.4.87:27080
+	mongo_python := *qu.ObjToMap(SysConfig["mongo_python"])
+	Py_Mgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_python["addr"]),
+		DbName:      qu.ObjToString(mongo_python["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_python["username"]),
+		Password:    qu.ObjToString(mongo_python["password"]),
+		IsDirect:    mongo_python["direct"].(bool),
+	}
+	Py_Mgo.InitPool()
+
+	//172.17.4.87:27080
+	mongo_save := *qu.ObjToMap(SysConfig["mongo_save"])
+	Save_Mgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_save["addr"]),
+		DbName:      qu.ObjToString(mongo_save["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_save["username"]),
+		Password:    qu.ObjToString(mongo_save["password"]),
+		IsDirect:    mongo_save["direct"].(bool),
 	}
+	Save_Mgo.InitPool()
 }
 func initMysqlInfo() {
 	username, password := "zhengkun", "Zk#20220824"
 	address := "127.0.0.1:15001"
 	if !IsLocal {
-		address = "172.17.4.242:4000"
+		address = "172.17.162.25:4000"
 	}
 	if IsDev {
 		username, password = "root", "=PDT49#80Z!RVv52_z"

+ 96 - 26
data_ylqx/src/util/mgo.go

@@ -2,13 +2,13 @@ package util
 
 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"
+	"log"
+	qu "qfw/util"
+	"time"
 )
 
 type MgoSess struct {
@@ -127,6 +127,7 @@ type MongodbSim struct {
 	pool     chan bool
 	UserName string
 	Password string
+	IsDirect bool
 }
 
 func (m *MongodbSim) GetMgoConn() *MgoSess {
@@ -141,18 +142,19 @@ func (m *MongodbSim) DestoryMongoConn(ms *MgoSess) {
 	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))
+	opts.SetDirect(m.IsDirect)
 	m.pool = make(chan bool, m.Size)
 
 	if m.UserName != "" && m.Password != "" {
 		cre := options.Credential{
-			Username: m.UserName,
-			Password: m.Password,
+			Username:   m.UserName,
+			Password:   m.Password,
+			AuthSource: "admin",
 		}
 		opts.SetAuth(cre)
 	}
@@ -176,7 +178,21 @@ func (m *MongodbSim) Close() {
 	<-m.pool
 }
 
-//批量插入
+// 新建表并生成索引
+func (m *MongodbSim) CreateIndex(c string, models []mongo.IndexModel) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	names, err := coll.Indexes().CreateMany(m.Ctx, models)
+	if err == nil && len(names) > 0 {
+		return true
+	} else {
+		log.Println("CreateIndex Error:", err)
+		return false
+	}
+}
+
+// 批量插入
 func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
 	m.Open()
 	defer m.Close()
@@ -203,7 +219,7 @@ func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[
 	return r.UpsertedIDs, true
 }
 
-//批量插入
+// 批量插入
 func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
 	m.Open()
 	defer m.Close()
@@ -222,7 +238,7 @@ func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
 	return true
 }
 
-//保存
+// 保存
 func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
 	m.Open()
 	defer m.Close()
@@ -234,7 +250,7 @@ func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
 	return r.InsertedID
 }
 
-//更新by Id
+// 更新by Id
 func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
 	m.Open()
 	defer m.Close()
@@ -245,6 +261,7 @@ func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
 	}
 	return true
 }
+
 func (m *MongodbSim) UpdateStrId(c, id string, doc map[string]interface{}) bool {
 	m.Open()
 	defer m.Close()
@@ -256,7 +273,18 @@ func (m *MongodbSim) UpdateStrId(c, id string, doc map[string]interface{}) bool
 	return true
 }
 
-//删除by id
+func (m *MongodbSim) UpdateQueryData(c string, query map[string]interface{}, doc map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	_, err := coll.UpdateOne(m.Ctx, query, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+// 删除by id
 func (m *MongodbSim) DeleteById(c, id string) int64 {
 	m.Open()
 	defer m.Close()
@@ -268,7 +296,7 @@ func (m *MongodbSim) DeleteById(c, id string) int64 {
 	return r.DeletedCount
 }
 
-//通过条件删除
+// 通过条件删除
 func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
 	m.Open()
 	defer m.Close()
@@ -280,7 +308,7 @@ func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
 	return r.DeletedCount
 }
 
-//findbyid
+// findbyid
 func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
 	m.Open()
 	defer m.Close()
@@ -291,35 +319,44 @@ func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
 	return v
 }
 
-//findbystrid
-func (m *MongodbSim) FindByStrId(c, id string) map[string]interface{} {
+// 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, map[string]interface{}{"_id": id})
+	r := coll.FindOne(m.Ctx, query)
 	v := map[string]interface{}{}
 	r.Decode(&v)
 	return v
 }
 
-//findone
-func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]interface{} {
+// 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)
-	r := coll.FindOne(m.Ctx, query)
-	v := map[string]interface{}{}
-	r.Decode(&v)
-	return v
+	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
 }
 
-//find
-func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields interface{}) ([]map[string]interface{}, error) {
+// find
+func (m *MongodbSim) FindLimit(c string, query map[string]interface{}, sort, fields interface{}, limit int64) ([]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))
+	r, err := coll.Find(m.Ctx, query, op.SetSort(sort), op.SetProjection(fields), op.SetLimit(limit))
 	if err != nil {
 		log.Fatal(err)
 		return nil, err
@@ -333,7 +370,7 @@ func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields i
 	return results, nil
 }
 
-//创建_id
+// 创建_id
 func NewObjectId() primitive.ObjectID {
 	return primitive.NewObjectID()
 }
@@ -346,3 +383,36 @@ func StringTOBsonId(id string) primitive.ObjectID {
 func BsonTOStringId(id interface{}) string {
 	return id.(primitive.ObjectID).Hex()
 }
+
+func IsMarkInterfaceArr(t interface{}) []string {
+	sub_list := []string{}
+	if list_3, ok_3 := t.([]string); ok_3 {
+		sub_list = list_3
+		return sub_list
+	}
+	if list_1, ok_1 := t.(primitive.A); ok_1 {
+		sub_list = qu.ObjArrToStringArr(list_1)
+	} else {
+		if list_2, ok_2 := t.([]interface{}); ok_2 {
+			sub_list = qu.ObjArrToStringArr(list_2)
+		}
+	}
+	return sub_list
+}
+
+func IsMarkInterfaceMap(t interface{}) []map[string]interface{} {
+	p_list := []map[string]interface{}{}
+	if list_3, ok_3 := t.([]map[string]interface{}); ok_3 {
+		p_list = list_3
+		return p_list
+	}
+
+	if yl_list_1, ok_1 := t.(primitive.A); ok_1 {
+		p_list = qu.ObjArrToMapArr(yl_list_1)
+	} else {
+		if yl_list_2, ok_2 := t.([]interface{}); ok_2 {
+			p_list = qu.ObjArrToMapArr(yl_list_2)
+		}
+	}
+	return p_list
+}

+ 24 - 20
data_ylqx/src/util/mysql.go

@@ -44,12 +44,12 @@ func (m *Mysql) Init() {
 	}
 }
 
-//新增
+// 新增
 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{}{}
@@ -69,12 +69,12 @@ func (m *Mysql) InsertByTx(tx *sql.Tx, tableName string, data map[string]interfa
 	return m.InsertBySqlByTx(tx, q, values...)
 }
 
-//sql语句新增
+// sql语句新增
 func (m *Mysql) InsertBySql(q string, args ...interface{}) int64 {
 	return m.InsertBySqlByTx(nil, q, args...)
 }
 
-//带有事务的sql语句新增
+// 带有事务的sql语句新增
 func (m *Mysql) InsertBySqlByTx(tx *sql.Tx, q string, args ...interface{}) int64 {
 	result, _ := m.ExecBySqlByTx(tx, q, args...)
 	if result == nil {
@@ -88,32 +88,32 @@ func (m *Mysql) InsertBySqlByTx(tx *sql.Tx, q string, args ...interface{}) int64
 	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)
 }
@@ -146,12 +146,12 @@ func (m *Mysql) insertOrReplaceBatchByTx(tx *sql.Tx, tp string, afterInsert, tab
 	return v1, v2
 }
 
-//sql语句执行
+// sql语句执行
 func (m *Mysql) ExecBySql(q string, args ...interface{}) (sql.Result, error) {
 	return m.ExecBySqlByTx(nil, q, args...)
 }
 
-//sql语句执行,带有事务
+// sql语句执行,带有事务
 func (m *Mysql) ExecBySqlByTx(tx *sql.Tx, q string, args ...interface{}) (sql.Result, error) {
 	var stmtIns *sql.Stmt
 	var err error
@@ -203,6 +203,10 @@ func (m *Mysql) Find(tableName string, query map[string]interface{}, fields, ord
 					fs = append(fs, fmt.Sprintf("%s>=?", k))
 					vs = append(vs, rv.MapIndex(rv_k).Interface())
 				}
+				if rv_k.String() == "lte" {
+					fs = append(fs, fmt.Sprintf("%s<=?", k))
+					vs = append(vs, rv.MapIndex(rv_k).Interface())
+				}
 				if rv_k.String() == "in" {
 					if len(rv.MapIndex(rv_k).Interface().([]interface{})) > 0 {
 						_fs := fmt.Sprintf("%s in (?", k)
@@ -256,7 +260,7 @@ func (m *Mysql) Find(tableName string, query map[string]interface{}, fields, ord
 	return m.SelectBySql(q, vs...)
 }
 
-//sql语句查询
+// sql语句查询
 func (m *Mysql) SelectBySql(q string, args ...interface{}) *[]map[string]interface{} {
 	return m.SelectBySqlByTx(nil, q, args...)
 }
@@ -336,12 +340,12 @@ func (m *Mysql) FindOne(tableName string, query map[string]interface{}, fields,
 	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{}
@@ -359,7 +363,7 @@ func (m *Mysql) UpdateByTx(tx *sql.Tx, tableName string, query, update map[strin
 	return m.UpdateOrDeleteBySqlByTx(tx, q, values...) >= 0
 }
 
-//删除
+// 删除
 func (m *Mysql) Delete(tableName string, query map[string]interface{}) bool {
 	return m.DeleteByTx(nil, tableName, query)
 }
@@ -375,12 +379,12 @@ func (m *Mysql) DeleteByTx(tx *sql.Tx, tableName string, query map[string]interf
 	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 {
@@ -395,7 +399,7 @@ func (m *Mysql) UpdateOrDeleteBySqlByTx(tx *sql.Tx, q string, args ...interface{
 	return count
 }
 
-//总数
+// 总数
 func (m *Mysql) Count(tableName string, query map[string]interface{}) int64 {
 	fields := []string{}
 	values := []interface{}{}
@@ -472,7 +476,7 @@ func (m *Mysql) CountBySql(q string, args ...interface{}) int64 {
 	return count
 }
 
-//执行事务
+// 执行事务
 func (m *Mysql) ExecTx(msg string, f func(tx *sql.Tx) bool) bool {
 	tx, err := m.DB.Begin()
 	if err != nil {

+ 146 - 146
get_assign/src/main.go

@@ -11,20 +11,20 @@ import (
 )
 
 var (
-	sysconfig    				map[string]interface{} //配置文件
-	save_mgo        			*MongodbSim            //mongodb操作对象
-	save_c_name					string
+	sysconfig   map[string]interface{} //配置文件
+	save_mgo    *MongodbSim            //mongodb操作对象
+	save_c_name string
 )
 var Url = "https://www.jianyu360.com/article/content/%s.html"
 
-func initMgo()  {
+func initMgo() {
 	saveconf := sysconfig["save_mgodb"].(map[string]interface{})
 	save_c_name = qu.ObjToString(saveconf["coll"])
 	save_mgo = &MongodbSim{
 		MongodbAddr: saveconf["addr"].(string),
 		DbName:      saveconf["db"].(string),
 		Size:        qu.IntAllDef(saveconf["pool"], 5),
-		Password: 	 "zk@123123",
+		Password:    "zk@123123",
 		UserName:    "zhengkun",
 	}
 	save_mgo.InitPool()
@@ -36,92 +36,93 @@ func init() {
 	//加载配置文件
 	qu.ReadConfig(&sysconfig)
 	initMgo()
+	//上海通服数据···
 }
 
-func main()  {
+func main() {
 	//定时任务
 	log.Println("部署...定时任务...")
 	c := cron.New()
 	c.AddFunc("0 30 7 ? * *", func() {
-		exportSpecSiteDataDay() //日邮件-每天
-		exportSpecSiteDataWeek() //周邮件-每周一
+		exportSpecSiteDataDay()   //日邮件-每天
+		exportSpecSiteDataWeek()  //周邮件-每周一
 		exportSpecSiteDataMonth() //月邮件-每月1号
 	})
 	c.Start()
 
-	time.Sleep(99999*time.Hour)
+	time.Sleep(99999 * time.Hour)
 }
 
-//处理数据-周邮件
+// 处理数据-周邮件
 func exportSpecSiteDataDay() {
 	log.Println("每天:准备邮件数据...")
-	now:=time.Now()
-	durdays:=1
-	start:= time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
+	now := time.Now()
+	durdays := 1
+	start := time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
 	end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
 
-	log.Println(start,end)
+	log.Println(start, end)
 	q := map[string]interface{}{
 		"comeintime": map[string]interface{}{
-			"$gte":  start,
-			"$lt": end,
+			"$gte": start,
+			"$lt":  end,
 		},
 	}
 	sess := save_mgo.GetMgoConn()
 	defer save_mgo.DestoryMongoConn(sess)
-	log.Println("bidding 查询条件:",q)
+	log.Println("bidding 查询条件:", q)
 	//省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
 	it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
-		"area":1,
-		"title":1,
-		"toptype":1,
-		"publishtime":1,
-		"href":1,
-		"projectname":1,
-		"site":1,
+		"area":        1,
+		"title":       1,
+		"toptype":     1,
+		"publishtime": 1,
+		"href":        1,
+		"projectname": 1,
+		"site":        1,
 	}).Iter()
 	timeLayout := "2006-01-02"
-	total,isok,dataArr:= 0,0,make([]map[string]string,0)
+	total, isok, dataArr := 0, 0, make([]map[string]string, 0)
 	for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
 		if total%10000 == 0 {
-			log.Println("cur index :", total,isok)
+			log.Println("cur index :", total, isok)
 		}
-		toptype:=qu.ObjToString(tmp["toptype"])
-		if toptype=="拟建"||toptype=="预告"||toptype=="招标"||toptype=="采购意向" {
-			site:=qu.ObjToString(tmp["site"])
-			area:=qu.ObjToString(tmp["area"])
-			projectname:=qu.ObjToString(tmp["projectname"])
-			publishtime:=qu.Int64All(tmp["publishtime"])
-			new_publishtime := ""//转日期
-			if publishtime>0 {
+		toptype := qu.ObjToString(tmp["toptype"])
+		if toptype == "拟建" || toptype == "预告" || toptype == "招标" || toptype == "采购意向" {
+			site := qu.ObjToString(tmp["site"])
+			area := qu.ObjToString(tmp["area"])
+			projectname := qu.ObjToString(tmp["projectname"])
+			publishtime := qu.Int64All(tmp["publishtime"])
+			new_publishtime := "" //转日期
+			if publishtime > 0 {
 				new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
 			}
-			href:=qu.ObjToString(tmp["href"])
-			title:=qu.ObjToString(tmp["title"])
+			href := qu.ObjToString(tmp["href"])
+			title := qu.ObjToString(tmp["title"])
 
-			if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海"  {
+			if (site == "上海政府采购网" || site == "中国政府采购网") && area == "上海" {
 				isok++
 				dataArr = append(dataArr, map[string]string{
-					"area":area,
-					"toptype":toptype,
-					"title":title,
-					"projectname":projectname,
-					"site":site,
-					"publishtime":new_publishtime,
-					"href":href,
-					"jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
+					"area":        area,
+					"toptype":     toptype,
+					"title":       title,
+					"projectname": projectname,
+					"site":        site,
+					"publishtime": new_publishtime,
+					"href":        href,
+					"jyhref":      fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
 				})
 			}
 		}
 		tmp = make(map[string]interface{})
 	}
-	log.Println("is site over :",total,isok)
+	log.Println("is site over :", total, isok)
 
 	end_str := time.Unix(end-1, 0).Format(timeLayout)
-	xlsxName := "上海通服:"+end_str+".xlsx"
-	log.Println("邮件名:",xlsxName)
+	xlsxName := "上海通服:" + end_str + ".xlsx"
+	log.Println("邮件名:", xlsxName)
 	os.Remove(xlsxName)
-	f :=xlsx.NewFile()
+	f := xlsx.NewFile()
 	sheet, _ := f.AddSheet("上海数据")
 	row := sheet.AddRow()
 	//省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
@@ -134,7 +135,7 @@ func exportSpecSiteDataDay() {
 	row.AddCell().Value = "公告地址"
 	row.AddCell().Value = "剑鱼地址"
 
-	for _,tmp:=range dataArr {
+	for _, tmp := range dataArr {
 		row = sheet.AddRow()
 		row.AddCell().SetString(tmp["area"])
 		row.AddCell().SetString(tmp["toptype"])
@@ -149,90 +150,90 @@ func exportSpecSiteDataDay() {
 
 	if err != nil {
 		log.Println("保存xlsx失败:", err)
-		sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
-	}else {
+		sendWarningSmtp("保存xlsx异常", "请检查...上海通服...")
+	} else {
 		log.Println("保存xlsx成功:", err)
-		body_str := fmt.Sprintf("日期:%s\t\t总计:%d条",end_str,isok)
-		sendErrMailSmtp("上海通服数据~天",body_str,xlsxName)
+		body_str := fmt.Sprintf("日期:%s\t\t总计:%d条", end_str, isok)
+		sendErrMailSmtp("上海通服数据~天", body_str, xlsxName)
 	}
 }
 
-//处理数据-周邮件
+// 处理数据-周邮件
 func exportSpecSiteDataWeek() {
 	cur_time := time.Now().Unix()
 	today := GetOneWeekDay(TimeStampToString(cur_time))
-	if today!=1 {
+	if today != 1 {
 		return
 	}
+
 	log.Println("每周一:准备邮件数据...")
-	now:=time.Now()
-	durdays:=7
-	start:= time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
+	now := time.Now()
+	durdays := 7
+	start := time.Date(now.Year(), now.Month(), now.Day()-durdays, 0, 0, 0, 0, time.Local).Unix()
 	end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
+	log.Println(start, end)
 
-	log.Println(start,end)
 	q := map[string]interface{}{
 		"comeintime": map[string]interface{}{
-			"$gte":  start,
-			"$lt": end,
+			"$gte": start,
+			"$lt":  end,
 		},
 	}
 	sess := save_mgo.GetMgoConn()
 	defer save_mgo.DestoryMongoConn(sess)
-	log.Println("bidding 查询条件:",q)
+	log.Println("bidding 查询条件:", q)
 	//省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
 	it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
-		"area":1,
-		"title":1,
-		"subtype":1,
-		"publishtime":1,
-		"href":1,
-		"projectname":1,
-		"site":1,
+		"area":        1,
+		"title":       1,
+		"subtype":     1,
+		"publishtime": 1,
+		"href":        1,
+		"projectname": 1,
+		"site":        1,
 	}).Iter()
 	timeLayout := "2006-01-02"
-	total,isok,dataArr:= 0,0,make([]map[string]string,0)
+	total, isok, dataArr := 0, 0, make([]map[string]string, 0)
 	for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
 		if total%10000 == 0 {
-			log.Println("cur index :", total,isok)
+			log.Println("cur index :", total, isok)
 		}
-		site:=qu.ObjToString(tmp["site"])
-		area:=qu.ObjToString(tmp["area"])
-		subtype:=qu.ObjToString(tmp["subtype"])
-		projectname:=qu.ObjToString(tmp["projectname"])
-		publishtime:=qu.Int64All(tmp["publishtime"])
-		new_publishtime := ""//转日期
-		if publishtime>0 {
+		site := qu.ObjToString(tmp["site"])
+		area := qu.ObjToString(tmp["area"])
+		subtype := qu.ObjToString(tmp["subtype"])
+		projectname := qu.ObjToString(tmp["projectname"])
+		publishtime := qu.Int64All(tmp["publishtime"])
+		new_publishtime := "" //转日期
+		if publishtime > 0 {
 			new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
 		}
-		href:=qu.ObjToString(tmp["href"])
-		title:=qu.ObjToString(tmp["title"])
+		href := qu.ObjToString(tmp["href"])
+		title := qu.ObjToString(tmp["title"])
 
-		if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海" {
+		if (site == "上海政府采购网" || site == "中国政府采购网") && area == "上海" {
 			isok++
 			dataArr = append(dataArr, map[string]string{
-				"area":area,
-				"subtype":subtype,
-				"title":title,
-				"projectname":projectname,
-				"site":site,
-				"publishtime":new_publishtime,
-				"href":href,
-				"jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
+				"area":        area,
+				"subtype":     subtype,
+				"title":       title,
+				"projectname": projectname,
+				"site":        site,
+				"publishtime": new_publishtime,
+				"href":        href,
+				"jyhref":      fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
 			})
 		}
 
 		tmp = make(map[string]interface{})
 	}
-	log.Println("is site over :",total,isok)
-
+	log.Println("is site over :", total, isok)
 
 	start_str := time.Unix(start, 0).Format(timeLayout)
 	end_str := time.Unix(end-1, 0).Format(timeLayout)
-	xlsxName := "上海通服:"+start_str+"~"+end_str+".xlsx"
-	log.Println("邮件名:",xlsxName)
+	xlsxName := "上海通服:" + start_str + "~" + end_str + ".xlsx"
+	log.Println("邮件名:", xlsxName)
 	os.Remove(xlsxName)
-	f :=xlsx.NewFile()
+	f := xlsx.NewFile()
 	sheet, _ := f.AddSheet("上海数据")
 	row := sheet.AddRow()
 	//省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
@@ -245,7 +246,7 @@ func exportSpecSiteDataWeek() {
 	row.AddCell().Value = "公告地址"
 	row.AddCell().Value = "剑鱼地址"
 
-	for _,tmp:=range dataArr {
+	for _, tmp := range dataArr {
 		row = sheet.AddRow()
 		row.AddCell().SetString(tmp["area"])
 		row.AddCell().SetString(tmp["subtype"])
@@ -260,18 +261,18 @@ func exportSpecSiteDataWeek() {
 
 	if err != nil {
 		log.Println("保存xlsx失败:", err)
-		sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
-	}else {
+		sendWarningSmtp("保存xlsx异常", "请检查...上海通服...")
+	} else {
 		log.Println("保存xlsx成功:", err)
-		body_str := fmt.Sprintf("日期:%s~%s\t\t总计:%d条",start_str,end_str,isok)
-		sendErrMailSmtp("上海通服数据~周",body_str,xlsxName)
+		body_str := fmt.Sprintf("日期:%s~%s\t\t总计:%d条", start_str, end_str, isok)
+		sendErrMailSmtp("上海通服数据~周", body_str, xlsxName)
 	}
 }
 
-//处理数据-月邮件
+// 处理数据-月邮件
 func exportSpecSiteDataMonth() {
 	cur_day := time.Now().Day()
-	if cur_day!=1 {
+	if cur_day != 1 {
 		return
 	}
 	//cur_time := time.Now().Unix()
@@ -279,73 +280,72 @@ func exportSpecSiteDataMonth() {
 	//durdays:=int64(7)+today-int64(1)
 
 	log.Println("每月1号:准备邮件数据...")
-	now:=time.Now()
-	start:= time.Date(now.Year(), now.Month()-1, now.Day(), 0, 0, 0, 0, time.Local).Unix()
+	now := time.Now()
+	start := time.Date(now.Year(), now.Month()-1, now.Day(), 0, 0, 0, 0, time.Local).Unix()
 	end := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.Local).Unix()
 
-	log.Println(start,end)
+	log.Println(start, end)
 	q := map[string]interface{}{
 		"comeintime": map[string]interface{}{
-			"$gte":  start,
-			"$lt": end,
+			"$gte": start,
+			"$lt":  end,
 		},
 	}
 	sess := save_mgo.GetMgoConn()
 	defer save_mgo.DestoryMongoConn(sess)
-	log.Println("bidding 查询条件:",q)
+	log.Println("bidding 查询条件:", q)
 	//省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
 	it_site := sess.DB(save_mgo.DbName).C(save_c_name).Find(&q).Sort("comeintime").Select(map[string]interface{}{
-		"area":1,
-		"title":1,
-		"subtype":1,
-		"publishtime":1,
-		"href":1,
-		"projectname":1,
-		"site":1,
+		"area":        1,
+		"title":       1,
+		"subtype":     1,
+		"publishtime": 1,
+		"href":        1,
+		"projectname": 1,
+		"site":        1,
 	}).Iter()
 	timeLayout := "2006-01-02"
-	total,isok,dataArr:= 0,0,make([]map[string]string,0)
+	total, isok, dataArr := 0, 0, make([]map[string]string, 0)
 	for tmp := make(map[string]interface{}); it_site.Next(&tmp); total++ {
 		if total%10000 == 0 {
-			log.Println("cur index :", total,isok)
+			log.Println("cur index :", total, isok)
 		}
-		site:=qu.ObjToString(tmp["site"])
-		area:=qu.ObjToString(tmp["area"])
-		subtype:=qu.ObjToString(tmp["subtype"])
-		projectname:=qu.ObjToString(tmp["projectname"])
-		publishtime:=qu.Int64All(tmp["publishtime"])
-		new_publishtime := ""//转日期
-		if publishtime>0 {
+		site := qu.ObjToString(tmp["site"])
+		area := qu.ObjToString(tmp["area"])
+		subtype := qu.ObjToString(tmp["subtype"])
+		projectname := qu.ObjToString(tmp["projectname"])
+		publishtime := qu.Int64All(tmp["publishtime"])
+		new_publishtime := "" //转日期
+		if publishtime > 0 {
 			new_publishtime = time.Unix(publishtime, 0).Format(timeLayout)
 		}
-		href:=qu.ObjToString(tmp["href"])
-		title:=qu.ObjToString(tmp["title"])
+		href := qu.ObjToString(tmp["href"])
+		title := qu.ObjToString(tmp["title"])
 
-		if (site=="上海政府采购网" || site=="中国政府采购网") && area=="上海" {
+		if (site == "上海政府采购网" || site == "中国政府采购网") && area == "上海" {
 			isok++
 			dataArr = append(dataArr, map[string]string{
-				"area":area,
-				"subtype":subtype,
-				"title":title,
-				"projectname":projectname,
-				"site":site,
-				"publishtime":new_publishtime,
-				"href":href,
-				"jyhref":fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
+				"area":        area,
+				"subtype":     subtype,
+				"title":       title,
+				"projectname": projectname,
+				"site":        site,
+				"publishtime": new_publishtime,
+				"href":        href,
+				"jyhref":      fmt.Sprintf(Url, qu.CommonEncodeArticle("content", BsonTOStringId(tmp["_id"]))),
 			})
 		}
 
 		tmp = make(map[string]interface{})
 	}
-	log.Println("is site over :",total,isok)
-
+	log.Println("is site over :", total, isok)
 
 	start_str := time.Unix(start, 0).Format(timeLayout)
 	end_str := time.Unix(end-1, 0).Format(timeLayout)
-	xlsxName := "上海通服:"+start_str+"~"+end_str+".xlsx"
-	log.Println("邮件名:",xlsxName)
+	xlsxName := "上海通服:" + start_str + "~" + end_str + ".xlsx"
+	log.Println("邮件名:", xlsxName)
 	os.Remove(xlsxName)
-	f :=xlsx.NewFile()
+	f := xlsx.NewFile()
 	sheet, _ := f.AddSheet("上海数据")
 	row := sheet.AddRow()
 	//省份、公告标题、公告类别、发布时间、公告地址、项目名称、来源网站
@@ -358,7 +358,7 @@ func exportSpecSiteDataMonth() {
 	row.AddCell().Value = "公告地址"
 	row.AddCell().Value = "剑鱼地址"
 
-	for _,tmp:=range dataArr {
+	for _, tmp := range dataArr {
 		row = sheet.AddRow()
 		row.AddCell().SetString(tmp["area"])
 		row.AddCell().SetString(tmp["subtype"])
@@ -372,10 +372,10 @@ func exportSpecSiteDataMonth() {
 	err := f.Save(xlsxName)
 	if err != nil {
 		log.Println("保存xlsx失败:", err)
-		sendWarningSmtp("保存xlsx异常","请检查...上海通服...")
-	}else {
+		sendWarningSmtp("保存xlsx异常", "请检查...上海通服...")
+	} else {
 		log.Println("保存xlsx成功:", err)
-		body_str := fmt.Sprintf("日期:%s~%s\t\t总计:%d条",start_str,end_str,isok)
-		sendErrMailSmtp("上海通服数据~月)",body_str,xlsxName)
+		body_str := fmt.Sprintf("日期:%s~%s\t\t总计:%d条", start_str, end_str, isok)
+		sendErrMailSmtp("上海通服数据~月)", body_str, xlsxName)
 	}
-}
+}

+ 30 - 0
get_hainan/src/config.json

@@ -0,0 +1,30 @@
+{
+  "mongo_bid": {
+    "addr": "172.31.31.202:27081,172.20.45.128:27080",
+    "dbname" : "qfw",
+    "username": "zhengkun",
+    "password": "zk@123123",
+    "direct" : false
+  },
+  "mongo_qy": {
+    "addr": "172.31.31.202:27081,172.20.45.128:27080",
+    "dbname" : "mixdata",
+    "username": "zhengkun",
+    "password": "zk@123123",
+    "direct" : false
+  },
+  "mongo_ext": {
+    "addr": "172.17.4.85:27080",
+    "dbname" : "qfw",
+    "username": "",
+    "password": "",
+    "direct" : false
+  },
+  "mongo_spi": {
+    "addr": "172.20.17.61:27080",
+    "dbname" : "jyqyfw",
+    "username": "",
+    "password": "",
+    "direct" : false
+  }
+}

+ 43 - 69
get_hainan/src/initdata.go

@@ -1,78 +1,52 @@
 package main
 
+import qu "qfw/util"
+
 // 初始化mgo
 func initMgo() {
-	if IsLocal {
-		SourceMgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "qfw",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		SourceMgo.InitPool()
-
-		ExtMgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "qfw",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		ExtMgo.InitPool()
-
-		QyxyMgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "qfw",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		QyxyMgo.InitPool()
-
-		SpiMgo = &MongodbSim{
-			MongodbAddr: "127.0.0.1:27017",
-			DbName:      "qfw",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		SpiMgo.InitPool()
-	} else {
-		SourceMgo = &MongodbSim{
-			MongodbAddr: "172.17.189.140:27080,172.17.189.141:27081",
-			DbName:      "qfw",
-			Size:        10,
-			UserName:    "zhengkun",
-			Password:    "zk@123123",
-		}
-		SourceMgo.InitPool()
+	mongo_bid := *qu.ObjToMap(SysConfig["mongo_bid"])
+	BidMgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_bid["addr"]),
+		DbName:      qu.ObjToString(mongo_bid["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_bid["username"]),
+		Password:    qu.ObjToString(mongo_bid["password"]),
+		IsDirect:    mongo_bid["direct"].(bool),
+	}
+	BidMgo.InitPool()
 
-		ExtMgo = &MongodbSim{
-			MongodbAddr: "172.17.4.85:27080",
-			DbName:      "qfw",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		ExtMgo.InitPool()
+	mongo_qy := *qu.ObjToMap(SysConfig["mongo_qy"])
+	QyxyMgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_qy["addr"]),
+		DbName:      qu.ObjToString(mongo_qy["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_qy["username"]),
+		Password:    qu.ObjToString(mongo_qy["password"]),
+		IsDirect:    mongo_qy["direct"].(bool),
+	}
+	QyxyMgo.InitPool()
 
-		QyxyMgo = &MongodbSim{
-			MongodbAddr: "172.17.189.140:27080,172.17.189.141:27081",
-			DbName:      "mixdata",
-			Size:        10,
-			UserName:    "zhengkun",
-			Password:    "zk@123123",
-		}
-		QyxyMgo.InitPool()
+	//172.17.4.85:27080
+	mongo_ext := *qu.ObjToMap(SysConfig["mongo_ext"])
+	ExtMgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_ext["addr"]),
+		DbName:      qu.ObjToString(mongo_ext["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_ext["username"]),
+		Password:    qu.ObjToString(mongo_ext["password"]),
+		IsDirect:    mongo_ext["direct"].(bool),
+	}
+	ExtMgo.InitPool()
 
-		SpiMgo = &MongodbSim{
-			MongodbAddr: "172.17.4.86:27080",
-			DbName:      "jyqyfw",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		SpiMgo.InitPool()
+	//172.17.4.87:27080
+	mongo_spi := *qu.ObjToMap(SysConfig["mongo_spi"])
+	SpiMgo = &MongodbSim{
+		MongodbAddr: qu.ObjToString(mongo_spi["addr"]),
+		DbName:      qu.ObjToString(mongo_spi["dbname"]),
+		Size:        10,
+		UserName:    qu.ObjToString(mongo_spi["username"]),
+		Password:    qu.ObjToString(mongo_spi["password"]),
+		IsDirect:    mongo_spi["direct"].(bool),
 	}
+	SpiMgo.InitPool()
 }

+ 11 - 11
get_hainan/src/main.go

@@ -10,16 +10,16 @@ import (
 )
 
 var (
-	SourceMgo, ExtMgo *MongodbSim
-	QyxyMgo, SpiMgo   *MongodbSim
-	IsLocal           bool
-	TimeLayout        = "2006-01-02 15:04:05"
-	numLock           sync.Mutex
-	Url               = "https://www.jianyu360.com/article/content/%s.html"
+	BidMgo, ExtMgo  *MongodbSim
+	QyxyMgo, SpiMgo *MongodbSim
+	SysConfig       map[string]interface{}
+	TimeLayout      = "2006-01-02 15:04:05"
+	numLock         sync.Mutex
+	Url             = "https://www.jianyu360.com/article/content/%s.html"
 )
 
 func init() {
-	//IsLocal = true
+	qu.ReadConfig(&SysConfig) //加载配置文件
 	initMgo()
 	InitUdpMsg()
 }
@@ -30,11 +30,11 @@ func main() {
 	<-lock
 }
 
-//处理海南数据
+// 处理海南数据
 func dealWithHaiNaiData(gteid string, ltid string) {
 	log.Debug("开始海南数据~", gteid, "~", ltid)
-	sess := SourceMgo.GetMgoConn()
-	defer SourceMgo.DestoryMongoConn(sess)
+	sess := BidMgo.GetMgoConn()
+	defer BidMgo.DestoryMongoConn(sess)
 	q := map[string]interface{}{
 		"_id": map[string]interface{}{
 			"$gte": StringTOBsonId(gteid),
@@ -42,7 +42,7 @@ func dealWithHaiNaiData(gteid string, ltid string) {
 		},
 	}
 	log.Debug("查询语句 ~ ", q)
-	it := sess.DB(SourceMgo.DbName).C("bidding").Find(&q).Sort("_id").Iter()
+	it := sess.DB(BidMgo.DbName).C("bidding").Find(&q).Sort("_id").Iter()
 	pool := make(chan bool, 2)
 	wg := &sync.WaitGroup{}
 	total, isok := 0, 0

+ 95 - 31
get_hainan/src/mgo.go

@@ -2,14 +2,13 @@ package main
 
 import (
 	"context"
-	"log"
-	qu "qfw/util"
-	"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"
+	"log"
+	qu "qfw/util"
+	"time"
 )
 
 type MgoSess struct {
@@ -128,6 +127,7 @@ type MongodbSim struct {
 	pool     chan bool
 	UserName string
 	Password string
+	IsDirect bool
 }
 
 func (m *MongodbSim) GetMgoConn() *MgoSess {
@@ -142,18 +142,19 @@ func (m *MongodbSim) DestoryMongoConn(ms *MgoSess) {
 	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))
+	opts.SetDirect(m.IsDirect)
 	m.pool = make(chan bool, m.Size)
 
 	if m.UserName != "" && m.Password != "" {
 		cre := options.Credential{
-			Username: m.UserName,
-			Password: m.Password,
+			Username:   m.UserName,
+			Password:   m.Password,
+			AuthSource: "admin",
 		}
 		opts.SetAuth(cre)
 	}
@@ -177,7 +178,21 @@ func (m *MongodbSim) Close() {
 	<-m.pool
 }
 
-//批量插入
+// 新建表并生成索引
+func (m *MongodbSim) CreateIndex(c string, models []mongo.IndexModel) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	names, err := coll.Indexes().CreateMany(m.Ctx, models)
+	if err == nil && len(names) > 0 {
+		return true
+	} else {
+		log.Println("CreateIndex Error:", err)
+		return false
+	}
+}
+
+// 批量插入
 func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
 	m.Open()
 	defer m.Close()
@@ -204,7 +219,7 @@ func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[
 	return r.UpsertedIDs, true
 }
 
-//批量插入
+// 批量插入
 func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
 	m.Open()
 	defer m.Close()
@@ -223,7 +238,7 @@ func (m *MongodbSim) SaveBulk(c string, doc ...map[string]interface{}) bool {
 	return true
 }
 
-//保存
+// 保存
 func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
 	m.Open()
 	defer m.Close()
@@ -235,7 +250,7 @@ func (m *MongodbSim) Save(c string, doc map[string]interface{}) interface{} {
 	return r.InsertedID
 }
 
-//更新by Id
+// 更新by Id
 func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
 	m.Open()
 	defer m.Close()
@@ -247,7 +262,29 @@ func (m *MongodbSim) UpdateById(c, id string, doc map[string]interface{}) bool {
 	return true
 }
 
-//删除by id
+func (m *MongodbSim) UpdateStrId(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": id}, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+func (m *MongodbSim) UpdateQueryData(c string, query map[string]interface{}, doc map[string]interface{}) bool {
+	m.Open()
+	defer m.Close()
+	coll := m.C.Database(m.DbName).Collection(c)
+	_, err := coll.UpdateOne(m.Ctx, query, doc)
+	if err != nil {
+		return false
+	}
+	return true
+}
+
+// 删除by id
 func (m *MongodbSim) DeleteById(c, id string) int64 {
 	m.Open()
 	defer m.Close()
@@ -259,7 +296,7 @@ func (m *MongodbSim) DeleteById(c, id string) int64 {
 	return r.DeletedCount
 }
 
-//通过条件删除
+// 通过条件删除
 func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
 	m.Open()
 	defer m.Close()
@@ -271,7 +308,7 @@ func (m *MongodbSim) Delete(c string, query map[string]interface{}) int64 {
 	return r.DeletedCount
 }
 
-//findbyid
+// findbyid
 func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
 	m.Open()
 	defer m.Close()
@@ -282,7 +319,7 @@ func (m *MongodbSim) FindById(c, id string) map[string]interface{} {
 	return v
 }
 
-//findone
+// findone
 func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]interface{} {
 	m.Open()
 	defer m.Close()
@@ -293,7 +330,7 @@ func (m *MongodbSim) FindOne(c string, query map[string]interface{}) map[string]
 	return v
 }
 
-//find
+// find
 func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields interface{}) ([]map[string]interface{}, error) {
 	m.Open()
 	defer m.Close()
@@ -313,7 +350,27 @@ func (m *MongodbSim) Find(c string, query map[string]interface{}, sort, fields i
 	return results, nil
 }
 
-//创建_id
+// find
+func (m *MongodbSim) FindLimit(c string, query map[string]interface{}, sort, fields interface{}, limit int64) ([]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), op.SetLimit(limit))
+	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()
 }
@@ -327,22 +384,12 @@ func BsonTOStringId(id interface{}) string {
 	return id.(primitive.ObjectID).Hex()
 }
 
-//return
-func IsMarkInterfaceMap(t interface{}) []map[string]interface{} {
-	p_list := []map[string]interface{}{}
-	if yl_list_1, ok_1 := t.(primitive.A); ok_1 {
-		p_list = qu.ObjArrToMapArr(yl_list_1)
-	} else {
-		if yl_list_2, ok_2 := t.([]interface{}); ok_2 {
-			p_list = qu.ObjArrToMapArr(yl_list_2)
-		}
-	}
-	return p_list
-}
-
-//return
 func IsMarkInterfaceArr(t interface{}) []string {
 	sub_list := []string{}
+	if list_3, ok_3 := t.([]string); ok_3 {
+		sub_list = list_3
+		return sub_list
+	}
 	if list_1, ok_1 := t.(primitive.A); ok_1 {
 		sub_list = qu.ObjArrToStringArr(list_1)
 	} else {
@@ -352,3 +399,20 @@ func IsMarkInterfaceArr(t interface{}) []string {
 	}
 	return sub_list
 }
+
+func IsMarkInterfaceMap(t interface{}) []map[string]interface{} {
+	p_list := []map[string]interface{}{}
+	if list_3, ok_3 := t.([]map[string]interface{}); ok_3 {
+		p_list = list_3
+		return p_list
+	}
+
+	if yl_list_1, ok_1 := t.(primitive.A); ok_1 {
+		p_list = qu.ObjArrToMapArr(yl_list_1)
+	} else {
+		if yl_list_2, ok_2 := t.([]interface{}); ok_2 {
+			p_list = qu.ObjArrToMapArr(yl_list_2)
+		}
+	}
+	return p_list
+}

+ 113 - 0
listen_data/src/group.go

@@ -0,0 +1,113 @@
+package main
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"time"
+)
+
+const (
+	apiBaseURL    = "https://api.q.qq.com/v2/groups"
+	accessToken   = "fbEBnPmAjDdtWCv7pmNeCb2CkrtNZ75Z" // 替换为实际token
+	groupOpenID   = "971841991"                        // 替换为目标群openid
+	fileUploadURL = apiBaseURL + "/" + groupOpenID + "/files"
+)
+
+// MediaUploadResponse 文件上传响应结构
+type MediaUploadResponse struct {
+	FileInfo string `json:"file_info"`
+	URL      string `json:"url"`
+}
+
+// SendMessageRequest 消息发送请求体
+type SendMessageRequest struct {
+	MsgType    int    `json:"msg_type"` // 7表示富媒体消息
+	Content    string `json:"content,omitempty"`
+	Media      string `json:"media,omitempty"`  // 通过/files接口获取的file_info
+	SrvSendMsg bool   `json:"srv_send_msg"`     // true立即发送,false生成file_info
+	MsgID      string `json:"msg_id,omitempty"` // 用于被动回复
+}
+
+// 上传群文件(图片/视频等)
+func uploadMedia(fileData []byte, mediaType string) (string, error) {
+	req, _ := http.NewRequest("POST", fileUploadURL, bytes.NewBuffer(fileData))
+	req.Header.Set("Authorization", "Bearer "+accessToken)
+	req.Header.Set("Content-Type", "application/octet-stream")
+	req.Header.Set("X-QQ-Media-Type", mediaType)
+
+	client := &http.Client{Timeout: 30 * time.Second}
+	resp, err := client.Do(req)
+	if err != nil {
+		return "", err
+	}
+	defer resp.Body.Close()
+
+	var result MediaUploadResponse
+	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
+		return "", err
+	}
+	return result.FileInfo, nil
+}
+
+// 发送群消息
+func sendGroupMessage(content, mediaInfo string, isActive bool) (string, error) {
+	url := fmt.Sprintf("%s/%s/messages/", apiBaseURL, groupOpenID)
+
+	msgType := 0 // 文本消息
+	if mediaInfo != "" {
+		msgType = 7 // 富媒体消息
+	}
+
+	payload := SendMessageRequest{
+		MsgType:    msgType,
+		Content:    content,
+		Media:      mediaInfo,
+		SrvSendMsg: isActive, // 主动消息受每月4条限制
+	}
+
+	jsonData, _ := json.Marshal(payload)
+	req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
+	req.Header.Set("Authorization", "Bearer "+accessToken)
+	req.Header.Set("Content-Type", "application/json")
+
+	client := &http.Client{Timeout: 10 * time.Second}
+	resp, err := client.Do(req)
+	if err != nil {
+		return "", err
+	}
+	defer resp.Body.Close()
+
+	var result map[string]interface{}
+	if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
+		return "", err
+	}
+	return result["message_id"].(string), nil
+}
+
+// 撤回群消息(需在2分钟内操作)
+func recallMessage(messageID string) error {
+	url := fmt.Sprintf("%s/%s/messages/%s", apiBaseURL, groupOpenID, messageID)
+	req, _ := http.NewRequest("DELETE", url, nil)
+	req.Header.Set("Authorization", "Bearer "+accessToken)
+
+	client := &http.Client{Timeout: 5 * time.Second}
+	_, err := client.Do(req)
+	return err
+}
+
+func main1() {
+	// 示例1:发送文本消息
+	msgID, _ := sendGroupMessage("Hello World", "", true)
+	fmt.Println("Sent message ID:", msgID)
+
+	// 示例2:发送图片消息(需先上传)
+	// fileData := readFile("test.jpg")
+	// fileInfo, _ := uploadMedia(fileData, "image")
+	// sendGroupMessage("", fileInfo, true)
+
+	// 示例3:撤回消息
+	// time.Sleep(30 * time.Second) // 模拟延迟
+	// recallMessage(msgID)
+}

+ 40 - 30
listen_data/src/init.go

@@ -52,17 +52,17 @@ func initTestMgo() {
 		}
 		ext_mgo.InitPool()
 
-		python_mgo = &MongodbSim{
-			MongodbAddr: "172.17.4.87:27080",
-			DbName:      "editor",
-			Size:        10,
-			UserName:    "",
-			Password:    "",
-		}
-		python_mgo.InitPool()
+		//python_mgo = &MongodbSim{
+		//	MongodbAddr: "172.17.4.86:27080",
+		//	DbName:      "jyqyfw",
+		//	Size:        10,
+		//	UserName:    "",
+		//	Password:    "",
+		//}
+		//python_mgo.InitPool()
 
 		qy_mgo = &MongodbSim{
-			MongodbAddr: "172.17.189.140:27080,172.17.189.141:27081",
+			MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
 			DbName:      "mixdata",
 			Size:        10,
 			UserName:    "zhengkun",
@@ -71,7 +71,7 @@ func initTestMgo() {
 		qy_mgo.InitPool()
 
 		save_mgo = &MongodbSim{
-			MongodbAddr: "172.17.189.140:27080,172.17.189.141:27081",
+			MongodbAddr: "172.31.31.202:27081,172.20.45.128:27080",
 			DbName:      "qfw",
 			Size:        10,
 			UserName:    "zhengkun",
@@ -80,30 +80,31 @@ func initTestMgo() {
 		save_mgo.InitPool()
 
 		MysqlGlobalTool = &Mysql{
-			Address:  "172.17.4.242:4000",
+			Address:  "172.17.162.25:4000",
 			UserName: "zhengkun",
 			PassWord: "Zk#20220824",
-			DBName:   "Jianyu_subjectdb",
+			DBName:   "global_common_data",
 		}
 		MysqlGlobalTool.Init()
 
 	} else {
-		//MysqlGlobalTool = &Mysql{
-		//	Address:  "127.0.0.1:15001",
-		//	UserName: "zhengkun",
-		//	PassWord: "Zk#20220824",
-		//	DBName:   "global_common_data",
-		//}
-		//MysqlGlobalTool.Init()
+		MysqlGlobalTool = &Mysql{
+			Address:  "127.0.0.1:15001",
+			UserName: "zhengkun",
+			PassWord: "Zk#20220824",
+			DBName:   "global_common_data",
+		}
+		MysqlGlobalTool.Init()
 
+		//86
 		//python_mgo = &MongodbSim{
-		//	MongodbAddr: "172.17.4.87:27080",
-		//	DbName:      "qfw",
+		//	MongodbAddr: "127.0.0.1:12002",
+		//	DbName:      "jyqyfw",
 		//	Size:        10,
 		//	UserName:    "",
 		//	Password:    "",
 		//}
-		//python_mgo.InitPool()
+		//python_mgo.InitPoolDirect()
 
 		//87机器-12003
 		//python_mgo = &MongodbSim{
@@ -142,13 +143,22 @@ func initTestMgo() {
 		}
 		ext_mgo.InitPoolDirect()
 
-		//save_mgo = &MongodbSim{
-		//	MongodbAddr: "127.0.0.1:27017",
-		//	DbName:      "qfw",
-		//	Size:        10,
-		//	UserName:    "",
-		//	Password:    "",
-		//}
-		//save_mgo.InitPool()
+		local_mgo = &MongodbSim{
+			MongodbAddr: "127.0.0.1:27017",
+			DbName:      "zhengkun",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		local_mgo.InitPool()
+
+		dev_mgo = &MongodbSim{
+			MongodbAddr: "192.168.3.166:27082",
+			DbName:      "zhengkun",
+			Size:        10,
+			UserName:    "",
+			Password:    "",
+		}
+		dev_mgo.InitPool()
 	}
 }

+ 7 - 5
listen_data/src/main.go

@@ -3,7 +3,6 @@ package main
 import (
 	"flag"
 	"github.com/cron"
-	log "github.com/donnie4w/go-logger/logger"
 	"github.com/go-ego/gse"
 	qu "qfw/util"
 	"time"
@@ -12,7 +11,8 @@ import (
 var (
 	sysconfig                               map[string]interface{} //配置文件
 	save_mgo, site_mgo                      *MongodbSim
-	ext_mgo, python_mgo, qy_mgo             *MongodbSim //mongodb操作对象
+	ext_mgo, python_mgo, dev_mgo, qy_mgo    *MongodbSim //mongodb操作对象
+	local_mgo, test_mgo                     *MongodbSim
 	save_c_name, site_c_name, python_c_name string
 	xlsx_name, site_unique_name             string
 	prepareData                             []map[string]interface{}
@@ -23,7 +23,7 @@ var (
 )
 
 func init() {
-	isLocal = true
+	isLocal = false
 	initTestMgo()
 	return
 	qu.ReadConfig(&sysconfig)
@@ -34,8 +34,10 @@ func init() {
 	initMgo()
 }
 func main() {
-	log.Debug(decodeSEUrl("QllDLj0mbwMGB1oSXxQobXA5AghTDBVY"))
-	//export0510()
+	//67ff4ee53309c0998b3d0158 QlgWLG0nPQcDAglNDEBzYHo6AVQBCEFX
+	//key := encodeSEUrl("67ff4ee53309c0998b3d0158")
+	//log.Debug(key)
+	Compare0724()
 
 	return
 

+ 13 - 3
listen_data/src/mgo.go

@@ -31,9 +31,11 @@ func (mt *MgoIter) Next(result interface{}) bool {
 		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
+				//log.Println("mgo cur err", err.Error())
+				//mt.Cursor.Close(nil)
+				//return false
+				result = nil
+				return true
 			}
 			return true
 		} else {
@@ -221,6 +223,14 @@ func (m *MongodbSim) CreateIndex(c string, models []mongo.IndexModel) bool {
 	}
 }
 
+// 查询数量
+func (m *MongodbSim) Count(coll string, query map[string]interface{}) (int64, error) {
+	m.Open()
+	defer m.Close()
+	c, err := m.C.Database(m.DbName).Collection(coll).CountDocuments(m.Ctx, query)
+	return c, err
+}
+
 // 批量插入
 func (m *MongodbSim) UpSertBulk(c string, doc ...[]map[string]interface{}) (map[int64]interface{}, bool) {
 	m.Open()

+ 4 - 0
listen_data/src/mysql.go

@@ -203,6 +203,10 @@ func (m *Mysql) Find(tableName string, query map[string]interface{}, fields, ord
 					fs = append(fs, fmt.Sprintf("%s>=?", k))
 					vs = append(vs, rv.MapIndex(rv_k).Interface())
 				}
+				if rv_k.String() == "lte" {
+					fs = append(fs, fmt.Sprintf("%s<=?", k))
+					vs = append(vs, rv.MapIndex(rv_k).Interface())
+				}
 				if rv_k.String() == "in" {
 					if len(rv.MapIndex(rv_k).Interface().([]interface{})) > 0 {
 						_fs := fmt.Sprintf("%s in (?", k)

+ 273 - 0
listen_data/src/oss.go

@@ -0,0 +1,273 @@
+package main
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"io"
+	"log"
+	"mime/multipart"
+	"net/http"
+	"net/rpc"
+)
+
+/*
+	http请求地址:172.17.162.27:18011
+	rpc请求地址:172.17.162.27:18012
+*/
+
+var Oss_Address = "http://172.17.162.27:18011"
+var Detail_BucketId = "detail"
+var Html_BucketId = "contenthtml"
+
+// RPC相关结构体
+type UploadArgs struct {
+	Stream     []byte // 客户端将文件数据传递过来
+	Gzip       bool   //是否压缩
+	BucketID   string //桶id
+	ObjectName string //对象名称
+}
+
+type Args struct {
+	BucketID   string //桶id
+	ObjectName string //对象名称
+}
+
+// 接口统一返回值
+type Result struct {
+	Error_code int         `json:"error_code"`
+	Error_msg  string      `json:"error_msg"`
+	Data       interface{} `json:"data"`
+}
+
+const (
+	UploadUrl           = "/ossservice/upload"
+	DownloadUrl         = "/ossservice/download"
+	DeleteUrl           = "/ossservice/delete"
+	GetBidDetailUrl     = "/ossservice/biddetail"
+	UploadSuccess       = "上传成功"
+	DownloadSuccess     = "下载成功"
+	DeleteSuccess       = "删除成功"
+	GetBidDetailSuccess = "获取正文成功"
+	UploadFail          = "上传失败:%v"
+	DownloadFail        = "下载失败:%v"
+	DeleteFail          = "删除失败:%v"
+	BidDetailFail       = "获取正文失败:%v"
+)
+
+/* restful方式上传
+* @param domain 域名,例如:https://ossservice.jianyu360.cn
+* @param bucketId 桶id
+* @param objectName 对象名称
+* @param stream 文件流
+* @param gzip 是否压缩
+* @return {"error_code":0,"error_msg":"上传成功"}
+ */
+func UpLoadByRestful(domain, bucketId, objectName string, stream []byte, gzip bool) (reply *Result) {
+	reply = &Result{Error_code: -1}
+
+	// 创建一个缓冲区来存储表单数据
+	body := &bytes.Buffer{}
+	writer := multipart.NewWriter(body)
+	writer.WriteField("bucket_id", bucketId)
+	writer.WriteField("object_name", objectName)
+	//writer.WriteField("gzip", strconv.FormatBool(gzip))
+
+	// 创建表单字段
+	part, err := writer.CreateFormFile("file", objectName)
+	if err != nil {
+		reply.Error_msg = err.Error()
+		return
+	}
+
+	// 模拟文件流
+	fileStream := bytes.NewReader(stream)
+
+	// 将文件流复制到表单字段
+	_, err = io.Copy(part, fileStream)
+	if err != nil {
+		reply.Error_msg = err.Error()
+		return
+	}
+
+	// 创建 HTTP 请求
+	if respBody, err := post(domain+UploadUrl, writer, body); err != nil {
+		reply.Error_msg = err.Error()
+	} else {
+		json.Unmarshal(respBody, &reply)
+	}
+	return
+}
+
+/* restful方式下载
+* @param domain 域名,例如:https://ossservice.jianyu360.cn
+* @param bucketId 桶id
+* @param objectName 对象名称
+* @return {"error_code":0,"error_msg":"下载成功"}
+ */
+func DownloadByRestful(domain, bucketId, objectName string) (reply *Result) {
+	reply = &Result{}
+	// 创建一个缓冲区来存储表单数据
+	body := &bytes.Buffer{}
+	writer := multipart.NewWriter(body)
+	writer.WriteField("bucket_id", bucketId)
+	writer.WriteField("object_name", objectName)
+	if respBody, err := post(domain+DownloadUrl, writer, body); err != nil {
+		reply.Error_msg = err.Error()
+	} else {
+		reply.Error_msg = DownloadSuccess
+		reply.Data = respBody
+	}
+	return
+}
+
+/* restful方式删除
+* @param domain 域名,例如:https://ossservice.jianyu360.cn
+* @param bucketId 桶id
+* @param objectName 对象名称
+* @return {"error_code":0,"error_msg":"上传成功"}
+ */
+func DeleteByRestful(domain, bucketId, objectName string) (reply *Result) {
+	reply = &Result{}
+	// 创建一个缓冲区来存储表单数据
+	body := &bytes.Buffer{}
+	writer := multipart.NewWriter(body)
+	writer.WriteField("bucket_id", bucketId)
+	writer.WriteField("object_name", objectName)
+	if respBody, err := post(domain+DeleteUrl, writer, body); err != nil {
+		reply.Error_msg = err.Error()
+	} else {
+		json.Unmarshal(respBody, &reply)
+	}
+	return
+}
+
+/* restful方式获取标讯正文
+* @param domain 域名,例如:https://ossservice.jianyu360.cn
+* @param bucketId 桶id
+* @param objectName 对象名称
+* @return {"error_code":0,"error_msg":"获取正文成功","data":"正文内容"}
+ */
+func GetBidDetailByRestful(domain, bucketId, objectName string) (reply *Result) {
+	reply = &Result{}
+	// 创建一个缓冲区来存储表单数据
+	body := &bytes.Buffer{}
+	writer := multipart.NewWriter(body)
+	writer.WriteField("bucket_id", bucketId)
+	writer.WriteField("object_name", objectName)
+	if respBody, err := post(domain+GetBidDetailUrl, writer, body); err != nil {
+		reply.Error_msg = err.Error()
+	} else {
+		reply.Error_msg = GetBidDetailSuccess
+		reply.Data = string(respBody)
+	}
+	return
+}
+
+func post(url string, writer *multipart.Writer, body *bytes.Buffer) ([]byte, error) {
+	// 关闭表单写入器
+	if err := writer.Close(); err != nil {
+		return nil, err
+	}
+	// 创建 HTTP 请求
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		log.Println("Error creating request:", err)
+		return nil, err
+	}
+
+	// 设置请求头
+	req.Header.Set("Content-Type", writer.FormDataContentType())
+
+	// 发送请求
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+
+	// 读取响应
+	respBody, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+	if resp.StatusCode != http.StatusOK {
+		return nil, errors.New(string(respBody))
+	}
+	return respBody, nil
+}
+
+/* rpc方式上传
+* @param address 域名,例如:192.168.3.206:8110
+* @param args 参数
+* @param args.BucketID 文件名
+* @param args.objectName 对象名称
+* @param args.Stream 文件流
+* @param args.Gzip 是否压缩
+* @return {"error_code":0,"error_msg":"上传成功"}
+* @return error 错误信息
+ */
+func UpLoadByRpc(address string, args *UploadArgs) (Result, error) {
+	var reply Result
+	err := rpcCall(address, "OSSService.Upload", args, &reply)
+	return reply, err
+}
+
+/*
+*rpc方式下载
+* @param address 域名,例如:192.168.3.206:8110
+* @param args 参数
+* @param args.BucketID 文件名
+* @param args.objectName 对象名称
+* @return {"error_code":0,"error_msg":"下载成功","data":"文件流"}
+* @return error 错误信息
+ */
+func DownloadByRpc(address string, args *Args) (Result, error) {
+	var reply Result
+	err := rpcCall(address, "OSSService.Download", args, &reply)
+	return reply, err
+}
+
+/* rpc方式删除
+* @param address 域名,例如:192.168.3.206:8110
+* @param args 参数
+* @param args.BucketID 文件名
+* @param args.objectName 对象名称
+* @return {"error_code":0,"error_msg":"删除成功"}
+* @return error 错误信息
+ */
+func DeleteByRpc(address string, args *Args) (Result, error) {
+	var reply Result
+	err := rpcCall(address, "OSSService.Delete", args, &reply)
+	return reply, err
+}
+
+/*
+*rpc方式获取标讯正文
+* @param address 域名,例如:192.168.3.206:8110
+* @param args 参数
+* @param args.BucketID 文件名
+* @param args.objectName 对象名称
+* @return {"error_code":0,"error_msg":"下载成功","data":"正文内容"}
+* @return error 错误信息
+ */
+func GetBidDetailByRpc(address string, args *Args) (Result, error) {
+	var reply Result
+	err := rpcCall(address, "OSSService.GetBidDetail", args, &reply)
+	return reply, err
+}
+func rpcCall(address, serviceMethod string, args any, reply any) error {
+	client, err := rpc.DialHTTP("tcp", address)
+	if err != nil {
+		log.Println(err)
+		return err
+	}
+	defer client.Close()
+	err = client.Call(serviceMethod, args, reply)
+	if err != nil {
+		log.Println(err)
+		return err
+	}
+	return nil
+}

+ 640 - 0
listen_data/src/res/1.txt

@@ -0,0 +1,640 @@
+QltAcz0gPlcFB1xEW0QvYHNrBQYDDxYK
+QltCez9zaAsFB1xEW0QvYHNrUwFSXxFe
+QlxCe2tzOwoGBlhCDUAra3puAgUFX0BW
+QlxBejx0alEFBAwQXEQpP3toV1FQCEJa
+Ql0WfmpxOgUAUFxFWkIraiFqAVZXD0xe
+Ql1DezgjbQIEVw4WCxV/bXZsVgNSXxVd
+QltGeD17YAoHBAAXCxZ/OCc+AAcHW0Bd
+Ql0Uejhzb1cEVQkQVhJ4OyFqUwMIXRVY
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0ZZ
+QltBL2l7OVEFB1xEW0QvYHNrC1VXW01b
+QlsVcmsgb1NSBQ0WCUBybndpAlUFWhFZ
+Ql1DeDt3blAEVw4WCxV/bXZsVgRXDk0K
+QltGeWpyagIHBAAXCxZ/OCc+AAgIXRYM
+QltJe28jaVQJVwoSWRF9YSQ7AAUCAEEL
+QlsSLzghblNSBQ0WCUBybndpClJQChdd
+Ql0Re24kagMBUl1GC0gvOnBpBlIHC0Na
+QlsTKW5xbAJSBQ0WCUBybndpUQABWkEK
+QltDf2whOVEABQpBV0l9O3dsAFMEABYJ
+QlwVejonPQEFB1xEW0QvYHNrAFVQDkxa
+QlwWeW8jOlEFB1xEW0QvYHNrBlYHChBc
+Ql0Re253YAYBUl1GC0gvOnBpBlIFXEwJ
+Ql0SLGAhPAZWUApNXkB8OyZtVFMCWhVZ
+Ql0SeG8nbAFWUApNXkB8OyZtVgUCCUQM
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0Ze
+QlxAL28mYQcFBAwQXEQpP3toVwEHXEMK
+QltFKW8gOlNTUA9NXER7PXpoVlYHCEda
+QlxCLztxOQMGBlhCDUAra3puAAFSCRIJ
+QltCeW9xbQAFB1xEW0QvYHNrUwNQWBdZ
+QltDf217PQoABQpBV0l9O3dsAFMADBcJ
+QlwVejonPAsFB1xEW0QvYHNrAFVQDkYK
+Ql1GfWxyPAQBAwkQXRZ/YSFvVFMHXBJX
+Ql1FfG4gagMEVw4WCxV/bXZsVFFSCBEO
+QlsVeTonYFdSBQ0WCUBybndpAgIFCE0J
+Ql0WKW9wYFEDUApMCxIsbXc9VFZVXUVb
+Ql0WfmpxOgUAUFxFWkIraiFqAVZXD0xb
+Ql1HeG96bAcEB10WW0Z+OyQ9UAdXWERc
+Ql0SKT8jbFNWUApNXkB8OyZtVAUDXUxf
+QltDf216OVQABQpBV0l9O3dsAFMACEBZ
+Ql0Ufz93PVQEVQkQVhJ4OyFqU1IEAExf
+Ql1GK2AjblEEB10WW0Z+OyQ9UAEHDkxe
+QlxBKDpybAoGBlhCDUAra3puVFZQXEJZ
+QlxEfD12b1AGAggSCUErOnE8VgAFDRJW
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0VY
+QlsTKG11aANSBQ0WCUBybndpUFEIC0UM
+QlxEeGt7bAEGAggSCUErOnE8UQMHCkxd
+QlxEfW9yYQIGAggSCUErOnE8VgFQARVd
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0UJ
+QlwVLGwkbgsFB1xEW0QvYHNrBgkHAUdX
+Ql1HeGF2bwIEB10WW0Z+OyQ9UAgBDEAK
+QlwVLGwkbgsFB1xEW0QvYHNrBgkHAUcO
+QlsTcmwmawNSBQ0WCUBybndpU1NQX01c
+QlxCczpzPAAGBlhCDUAra3puAwdUDBEJ
+QltFeWtzagRTUA9NXER7PXpoUVFXXBVf
+Ql0UemsmOgMEVQkQVhJ4OyFqUwJQXEAO
+QltCeTh6alAFB1xEW0QvYHNrUwQBWxZe
+QltBc2shaAsFB1xEW0QvYHNrCwgHXEBX
+QltIeWt0bFRUB1gWW0l8YHFrVAFTXEZe
+QlsTKG1yPgNSBQ0WCUBybndpUFEGWkxb
+QlsVeT1xaQtSBQ0WCUBybndpAgIFX01Y
+QltGKzx3YAIHBAAXCxZ/OCc+AQkAXEJW
+QlsTKG13b1BSBQ0WCUBybndpUFEJWxFZ
+QlxDfmx6YAQGAggSCUErOnE8U1VVXE1X
+Ql0WfmlzbQIAUFxFWkIraiFqAVYID0MK
+QlxBKG8gaVMGBlhCDUAra3puVFYEChUK
+QlsTKG11OwdSBQ0WCUBybndpUFEIDEYJ
+QltDLG97OwcDUl9HDBV5OnA8AlEBW0Zb
+QlsVeT1zYQVSBQ0WCUBybndpAgIFW0xb
+Ql0Uejp6aAQEVQkQVhJ4OyFqUwNXCEcN
+Ql0UK2kjaFQEVQkQVhJ4OyFqUAUCABZY
+QltDfTtzOwIABQpBV0l9O3dsAQQFXEBe
+QlxAcjoha1AGVF1FCkF6bydtUQVUX0df
+QltBeTpyaAUFB1xEW0QvYHNrClIBDBcN
+Ql1CcmlyaQtWAgsWDkV7bnFvA1RSXE1Y
+QlxCeG9zPAMGBlhCDUAra3puAgdUARFb
+Ql1FfG4gaQcEVw4WCxV/bXZsVFFSCRZd
+Ql0SeG8nbAZWUApNXkB8OyZtVgUCCUUM
+Ql4SKTt0bwIAU1tBWEZ5aiM6BFECARAM
+QltDf21xbgQABQpBV0l9O3dsAFJXDBVZ
+QltAem0nYFEFB1xEW0QvYHNrBARTXxAK
+QlwWLmxzYFQFB1xEW0QvYHNrB1RUXRVd
+Ql1DKz12b1QEVw4WCxV/bXZsVlQDXBIL
+Ql1CfWlwbVFWAgsWDkV7bnFvA1NUDhAM
+QltGLztzPgUHBAAXCxZ/OCc+BgMDWkRX
+QlwTem13agcFB1xEW0QvYHNrVFRXAERc
+QltDf2wmPgEABQpBV0l9O3dsAFMEXBJW
+Ql0WKGAjaQYDUApMCxIsbXc9VFUIDRFc
+QlsTcmggawFSBQ0WCUBybndpU1IJD0Ba
+QltJe29za1MJVwoSWRF9YSQ7AAUBXBJZ
+QlxEfWskYAIGAggSCUErOnE8VgEFAENW
+QlxDfmwhaQMGAggSCUErOnE8U1VUCRUO
+QlxDfzh0bQAGAggSCUErOnE8UAFTAUBZ
+QltCeWx0bQEFB1xEW0QvYHNrUwNQDRFb
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0Vc
+QltDcjojYAAABQpBV0l9O3dsAQdTAUBY
+QltJe2xwa1cJVwoSWRF9YSQ7AARVDE0J
+QlsTKG0gYQBSBQ0WCUBybndpUFFQDEUO
+QltIfDwjbANUB1gWW0l8YHFrVFEDX0Fa
+QltIeWt0bQFUB1gWW0l8YHFrVAFTXBdb
+QltGfWtyawQHBAAXCxZ/OCc+AQNQChdb
+QlsTcmx3OQFSBQ0WCUBybndpU1MJDUEJ
+Ql0UfDx6awEEVQkQVhJ4OyFqU1UCDE1c
+Ql0WfmlyOwsAUFxFWkIraiFqAVYIDBVf
+Ql0Sf2hzbAZWUApNXkB8OyZtVwAHCRAL
+Ql1CczpyPFFWAgsWDkV7bnFvAAAGX0xd
+Ql0WfmpxaFQAUFxFWkIraiFqAVZUX01b
+Ql0WL20jb1EDUApMCxIsbXc9AgRSWBIN
+QlxCeW4gaFEGBlhCDUAra3puAlIEABFf
+QltEcz1zPAFTUA9NXER7PXpoUQABXxZb
+QltHem4kagEHBAAXCxZ/OCc+BghTCUJX
+QltJe28jawEJVwoSWRF9YSQ7AAUCW0Jf
+Ql1HeG96bAcEB10WW0Z+OyQ9UAdXWERZ
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0YO
+QltIeGgjPlBUB1gWW0l8YHFrV1NUXxcN
+Ql0SLDgga1dWUApNXkB8OyZtVFMEWxVe
+Ql0RLmshbwsBUl1GC0gvOnBpB1YHDBYM
+QlsTKG1wbgFSBQ0WCUBybndpUFEGXxFa
+Ql0UfDx6awEEVQkQVhJ4OyFqU1UCDE0M
+Ql0SKT8jbFNWUApNXkB8OyZtVAUDXUxW
+QlxDezpxOQYGAggSCUErOnE8UwcHWEVZ
+QlxBeT0mYQcFBAwQXEQpP3toVAEBC0ZW
+Ql0SfG97PlBWUApNXkB8OyZtVwQECxJW
+QltGfW4mOQMHBAAXCxZ/OCc+AQRQCURc
+QlwWLjp6a1QFB1xEW0QvYHNrB1YGCkNe
+QltDfGkmYFAABQpBV0l9O3dsAFUDD0df
+QlsVcmsgb1BSBQ0WCUBybndpAlUFXUVc
+QlsVcmsgb1BSBQ0WCUBybndpAlUFWhJd
+QltBKTgjb1cFB1xEW0QvYHNrC1QDARJY
+QlsTKG0mPFNSBQ0WCUBybndpUFFTCRZY
+Ql1CfWshbVRWAgsWDkV7bnFvA1QFAEJd
+Ql1CfDsgPARWAgsWDkV7bnFvA1MEAERY
+QlxBeGx2bgsFBAwQXEQpP3toV1VQDUVe
+QlxCf20gblcGBlhCDUAra3puAlYCCkMN
+QltEcmBwYFZTUA9NXER7PXpoUFQAChcL
+QlwWf24kalYFB1xEW0QvYHNrBwJQDBUK
+Ql0SeG8nbAFWUApNXkB8OyZtVgUCCUVa
+Ql0RLmshbwsBUl1GC0gvOnBpB1YHDBZW
+QlxBfGgnPQEGBlhCDUAra3puVAICCkcN
+QlsTKG0mPFNSBQ0WCUBybndpUFFTCRYM
+QlsTKG0gYQJSBQ0WCUBybndpUFFQDRFe
+Ql0Ue2AjblcEVQkQVhJ4OyFqUwYHCEBf
+QlwVejonPAUFB1xEW0QvYHNrAFVQDxJb
+QltCez9zaAsFB1xEW0QvYHNrUwFSXxEM
+QlwWLm52PAIFB1xEW0QvYHNrB1UHAUAL
+Ql0RKGghbgoBUl1GC0gvOnBpB1JTC0Ba
+QltIK24mOQJUB1gWW0l8YHFrAgUFDBdX
+QltDf2wkagsABQpBV0l9O3dsAFMHCBYL
+QltEK2x6awRTUA9NXER7PXpoUQIAAUJY
+QlwTfWFzbFAFB1xEW0QvYHNrAlVTDxZY
+QlsTKG17PVFSBQ0WCUBybndpUFEIWExf
+QlsTKG1yPgNSBQ0WCUBybndpUFEGWkxd
+QlsTKG13b1BSBQ0WCUBybndpUFEJWxJb
+Ql1CcmpybQRWAgsWDkV7bnFvA1UCABdW
+QlxEfW9yYQIGAggSCUErOnE8VgFQARVf
+Ql1DeT0maVEEVw4WCxV/bXZsVgYEAUQJ
+QlxBeT0mYQcFBAwQXEQpP3toVAEBC0YO
+Ql0SLGAhPAZWUApNXkB8OyZtVFMCWk0O
+QltIKzx2PgZUB1gWW0l8YHFrAgZUWkUO
+QltJe2xwawQJVwoSWRF9YSQ7AARVDEVb
+QlwVejonPQYFB1xEW0QvYHNrAFVQDk1d
+QltEK2gjOwBTUA9NXER7PXpoUQBVWBUJ
+QltAem0nYFEFB1xEW0QvYHNrBARTXxFd
+QlwVLGwmPFYFB1xEW0QvYHNrBgkCD0cL
+QlwVLG9yYFYFB1xEW0QvYHNrBgkICRBW
+QltDf2xzb1cABQpBV0l9O3dsAFMCCkxa
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0Ve
+QlwWKW9ybQQFB1xEW0QvYHNrB1MACUVa
+QlxCezx0OgMGBlhCDUAra3puAgcFAEEN
+QlsTKG1yPgFSBQ0WCUBybndpUFEGWhUO
+QlsTKG1yPgNSBQ0WCUBybndpUFEGWkxf
+QlsUcz0hPgZSBQ0WCUBybndpV1FXAEAN
+Ql0TeWB7bAtWUApNXkB8OyZtAgIFChEO
+QlxBfz92agYGBlhCDUAra3puVAFXAU1Z
+QlxBfW13alMGBlhCDUAra3puVARQWkUN
+QlxEfWskYAIGAggSCUErOnE8VgEFAENa
+QlwVLG9yYFEFB1xEW0QvYHNrBgkICRBe
+QlwWKW4mbwYFB1xEW0QvYHNrB1MICRde
+QltEejwmaFYDUl9HDBV5OnA8AlRSC0Rf
+QltJe29zalEJVwoSWRF9YSQ7AAUBXU0L
+QltIeGgjPgpUB1gWW0l8YHFrV1NUX0JW
+QltDKTh6PgEDUl9HDBV5OnA8AgADCUcL
+QltFK2sgbQFTUA9NXER7PXpoVgkDDk1d
+QltEKDhwaQtTUA9NXER7PXpoUQUCX0Be
+QlsTe2hxbgVSBQ0WCUBybndpCwRUCU1f
+Ql4ULDh7bwAAU1tBWEZ5aiM6ClYJCkVb
+Ql0Uejhzb1cEVQkQVhJ4OyFqUwMIXRZf
+Ql0Wfmp2PQYAUFxFWkIraiFqBgABCxBW
+Ql1If20nawMJBAhCWkUuaXBqClQFDhcL
+QltJe29zalAJVwoSWRF9YSQ7AAUBXUMK
+QlsTc2kgOVBSBQ0WCUBybndpUAFVWkEO
+QlsTKGxyaQBSBQ0WCUBybndpUFFTAUBb
+QlsVfT97OQZSBQ0WCUBybndpAlQHWkBf
+QlsVfWhyawRSBQ0WCUBybndpAlICDBJX
+QlwWKWl0PAIFB1xEW0QvYHNrB1IBC0db
+QltDf25xPQcABQpBV0l9O3dsAFNQDEBb
+Ql0SLGAhPAZWUApNXkB8OyZtVFMCWhVY
+Ql0WKGAmOVMDUApMCxIsbXc9VFUIWEIK
+Ql0TL2kkbgUEVQkQVhJ4OyFqC1NTCUQL
+QlxBe2shalAFBAwQXEQpP3toV1IFCUFY
+Ql0Ucm9xagMEVQkQVhJ4OyFqUAEGDkYO
+QltIK24mYQVUB1gWW0l8YHFrAgUFDEQJ
+QlwWfm57blQFB1xEW0QvYHNrBwEDAUxd
+Ql0SeTp1YFFWUApNXkB8OyZtVlMFDhUO
+QltDf216OVQABQpBV0l9O3dsAFMACEde
+QlxDfGl3bVAGAggSCUErOnE8UAIECEFZ
+Ql0SeTp1YFFWUApNXkB8OyZtVlMFDhZa
+Ql0Uemx1YAQEVQkQVhJ4OyFqUwMAC0FZ
+Ql0TeWB7bApWUApNXkB8OyZtAgIFChBc
+Ql0Re20nOQcBUl1GC0gvOnBpBlFSW0FZ
+QltDc2shPgQABQpBV0l9O3dsAQkCXEZb
+QltJe2xwa1cJVwoSWRF9YSQ7AARVDE1b
+Ql0RfT8nbVYBUl1GC0gvOnBpBwQJDkFW
+Ql0Re2sjPlcBUl1GC0gvOnBpBlEIXRVc
+QlxAfGxyagoGVF1FCkF6bydtUFVXXBZY
+QlxAL2wkawQFBAwQXEQpP3toVwEECEUN
+QlxAcjoha1AGVF1FCkF6bydtUQVUX0cO
+QlxEeGt7bAEGAggSCUErOnE8UQMHCkxb
+Ql1FfG57PFEEVw4WCxV/bXZsVFFTXRUK
+Ql0SKT8jbFNWUApNXkB8OyZtVAUDXUxZ
+QlwWLGgmbVQFB1xEW0QvYHNrBAIFXRIK
+QltBe2EmOwYFB1xEW0QvYHNrCgRXDUUJ
+QlsVcm9yPAtSBQ0WCUBybndpAlYBDRIK
+QltIe2hwagZUB1gWW0l8YHFrVwhVCUdY
+QltFKW8gOgtTUA9NXER7PXpoVlYHCERZ
+QltIc293bQJUB1gWW0l8YHFrAgEECkYL
+QlsTKG0mPFNSBQ0WCUBybndpUFFTCRVd
+QltBfTggYAsFB1xEW0QvYHNrCwMFXE1Z
+QltHfW1waFRRAAFAX0h8YHJpCgNQAUAK
+QltHfW1waFZRAAFAX0h8YHJpCgNQDhAK
+QlxCf20gblcGBlhCDUAra3puAlYCCkML
+Ql0Re24kagIBUl1GC0gvOnBpBlIHC0EL
+Ql0Re24kagIBUl1GC0gvOnBpBlIHC0EN
+QlsTc2kgOVBSBQ0WCUBybndpUAFVWkJe
+QlsTKG1wbgFSBQ0WCUBybndpUFEGXxAN
+QlsTKG0kbQtSBQ0WCUBybndpUFFTDBFW
+QlsTKG0mPApSBQ0WCUBybndpUFFTCUJX
+QltAf212bVQFB1xEW0QvYHNrBFIIAUUO
+QltAfzxxOQcFB1xEW0QvYHNrBFQJWERW
+QltEfzx6awEEVwsXDhV+bSNvBQZTWk1a
+QlxCK2okOVMGBlhCDUAra3puAwhTChBZ
+Ql0WeD90aQIAUFxFWkIraiFqAVIFDk1W
+Ql1DK24jPAMEVw4WCxV/bXZsVlMHCkFf
+Ql1DeDt3blEEVw4WCxV/bXZsVgRXDhVZ
+QlwWfWt7PVEFB1xEW0QvYHNrBwVXDEZX
+QltIK24mOQJUB1gWW0l8YHFrAgUFDBdc
+QlxAcjoha1AGVF1FCkF6bydtUQVUX0dY
+QlxAcjx1PAEGVF1FCkF6bydtUQYADExW
+QltDc2hzalcABQpBV0l9O3dsAQhSCkVX
+QltDc2hzalMABQpBV0l9O3dsAQhSC01X
+QltEfW51PVQEVwsXDhV+bSNvBVEHCxIM
+QltAcmF0OQQFB1xEW0QvYHNrBQJVDhFf
+QlwTem1zYQQFB1xEW0QvYHNrVFRUWEwM
+QlwWKW9ybQQFB1xEW0QvYHNrB1MACUVd
+QlsTfWpxOVNSBQ0WCUBybndpUwYAXxJd
+QlsUfj96bQNSBQ0WCUBybndpVlEADEIO
+QlsTKG0mPAVSBQ0WCUBybndpUFFTCUBW
+QlsTKG1xPgRSBQ0WCUBybndpUFEJDxFb
+QltIfG8nblRUB1gWW0l8YHFrVAdUCBZZ
+QltIKWhxOgZUB1gWW0l8YHFrAglSC0Rb
+QltIe2hwagBUB1gWW0l8YHFrVwhVCUVf
+QltIe2hwaQtUB1gWW0l8YHFrVwhSX01Y
+QlxCeGt7OgAGBlhCDUAra3puAgdQDExX
+QlxBe2shalAFBAwQXEQpP3toV1IFCUEN
+QlxBfGlwblAGBlhCDUAra3puVAIBW0Zf
+Ql0SfG97PlFWUApNXkB8OyZtVwQECkRc
+QltDfGt2bQEABQpBV0l9O3dsAFVQCBUN
+QlsTKG1yawtSBQ0WCUBybndpUFEGWENe
+QlsTKW5xa1RSBQ0WCUBybndpUQABWkdX
+QlsTezwkbQFSBQ0WCUBybndpCwdTAUUL
+QltBeT0mPgUFB1xEW0QvYHNrClIHWk1b
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0ZX
+QlwWKWl6aAQFB1xEW0QvYHNrB1IBDEBf
+QlxCeW4gaFEGBlhCDUAra3puAlIEABAJ
+QlsTfWpxOVZSBQ0WCUBybndpUwYDCUAL
+Ql4TKWlzbQQAU1tBWEZ5aiM6BVMIXUNZ
+QlsTcmx3OQFSBQ0WCUBybndpU1MJDUJc
+QlsVfDt2YAFSBQ0WCUBybndpAglVD0FZ
+QltIeWt0bQJUB1gWW0l8YHFrVAFTXEFe
+QltAKG1walYFB1xEW0QvYHNrBQkAAUYL
+QltBLjxybFMFB1xEW0QvYHNrC1VUDRFZ
+QltBeG57bgsFB1xEW0QvYHNrCgdTCEFW
+QlsTKG1yPgFSBQ0WCUBybndpUFEGWhUM
+QlsTKG12OlRSBQ0WCUBybndpUFEJABFX
+QlsTKG13YFRSBQ0WCUBybndpUFEJXEZf
+QlxCf20gblcGBlhCDUAra3puAlYCCkMM
+QlwWKWl6aAQFB1xEW0QvYHNrB1IBDEcK
+QlxEeGt7bAEGAggSCUErOnE8UQMHCkMJ
+Ql1CcmggO1FWAgsWDkV7bnFvA1UBW0de
+QltFKW53OVdTUA9NXER7PXpoVlYJDREN
+Ql0UKzonaAIEVQkQVhJ4OyFqUAdVCEwN
+QlxBfGhyOVcGBlhCDUAra3puVAIAWkwJ
+QlsTKG11aAFSBQ0WCUBybndpUFEIC0AN
+QlsTKG10bAVSBQ0WCUBybndpUFEJX0Na
+Ql0TLz96blMEVQkQVhJ4OyFqC1YEXUcN
+QltDf2xzYAsABQpBV0l9O3dsAFMCDRFb
+Ql0Re20nOQYBUl1GC0gvOnBpBlFSW0BY
+QlxALDpwbgcFBAwQXEQpP3toVwYDCxBY
+Ql0WfmlyOwUAUFxFWkIraiFqAVYIDE0M
+Ql1GfWxyPAQBAwkQXRZ/YSFvVFMHX0RZ
+Ql1CfDsgPARWAgsWDkV7bnFvA1MEAERX
+Ql0RLmshbwsBUl1GC0gvOnBpB1YHDBZX
+QltFKGlxOgZTUA9NXER7PXpoVlIFCUYO
+QlxDfz0ga1QGAggSCUErOnE8UAIBX0JX
+QlsVfWh1aAFSBQ0WCUBybndpAlIHCRcM
+QlsTKG0hbQtSBQ0WCUBybndpUFFQAUEJ
+QlsTKG1xaVFSBQ0WCUBybndpUFEJC0ZW
+QlxCeGgnPQYGBlhCDUAra3puAgcIDxJe
+QlxBK2lyOgAGBlhCDUAra3puVFNSDRIN
+Ql0SfG97PlBWUApNXkB8OyZtVwQECxJd
+Ql0ReDgnalQBUl1GC0gvOnBpBlQGDUAN
+QltJemkjYAQJVwoSWRF9YSQ7AAIADkIK
+QltIKWhxOgZUB1gWW0l8YHFrAglSCBJZ
+QltEcz1zPAFTUA9NXER7PXpoUQABXxBf
+QltJe2whaFYJVwoSWRF9YSQ7AARXARFZ
+QltJe29zalAJVwoSWRF9YSQ7AAUBXU1f
+QltEfTgnaAEEVwsXDhV+bSNvBVIHC0Jb
+QlxEeGt7bAEGAggSCUErOnE8UQMHCkxf
+QlsTLmonagNSBQ0WCUBybndpUQNQDRYL
+QltBeG57bgsFB1xEW0QvYHNrCgdTCEFc
+QltIKW11bgVUB1gWW0l8YHFrAlEGDRZX
+QlsTKGxyaQFSBQ0WCUBybndpUFFTAUFa
+QlsTKG1yPgNSBQ0WCUBybndpUFEGWkxc
+Ql0SLGAhPAZWUApNXkB8OyZtVFMCWk0N
+Ql0TL2kkbgQEVQkQVhJ4OyFqC1NQXxFX
+QltBKWAhbQYFB1xEW0QvYHNrC1QDCRZf
+QltCez9zaQIFB1xEW0QvYHNrUwFVCUMJ
+QltGfDp0bwUHBAAXCxZ/OCc+AQIJDxAM
+QltDf20galEABQpBV0l9O3dsAFMAWBdd
+QltEeG91OQADUl9HDBV5OnA8AwEEXEZY
+QltIe2hwagNUB1gWW0l8YHFrVwhSXxEJ
+QltFeWh0OlRTUA9NXER7PXpoUVFSDxdW
+QlsTKG0mPFNSBQ0WCUBybndpUFFTCRdc
+QlsTKG13YFRSBQ0WCUBybndpUFEJXEZc
+QlsTKG1xPgRSBQ0WCUBybndpUFEJDxJf
+QlwWKW9ybQQFB1xEW0QvYHNrB1MACUUL
+QlwWLjt7bFMFB1xEW0QvYHNrB1YCCkxW
+QlwWfD0nOQMFB1xEW0QvYHNrBwUFDhAO
+QlwWfWt7PgAFB1xEW0QvYHNrBwVXDBFZ
+QltDf24gaQEABQpBV0l9O3dsAFNTXRJY
+QltBKWAhbFcFB1xEW0QvYHNrC1QAXxEL
+QltAcmtzOgYFB1xEW0QvYHNrBQFTCUNa
+QlsVfWhyawdSBQ0WCUBybndpAlICDBEL
+QlxDfmx6YAQGAggSCUErOnE8U1VVXE1Y
+QlxDfGskbgAGAggSCUErOnE8UAIJDENf
+Ql0WfmlzbFQAUFxFWkIraiFqAVYID0NW
+Ql0Uejhzb1cEVQkQVhJ4OyFqUwMIXU0J
+QlwVLGwmPQIFB1xEW0QvYHNrBgkCD01a
+QltDfG4kbFAABQpBV0l9O3dsAQAICENf
+QltAfzxxOQcFB1xEW0QvYHNrBFQJWEQO
+QlwVLGwkO1QFB1xEW0QvYHNrBgkGDkVb
+QlwWfWpwOQoFB1xEW0QvYHNrBwYAXURa
+QlwWfGlwPVQFB1xEW0QvYHNrBwNUWxcK
+QlwWKWl0O1YFB1xEW0QvYHNrB1IBCBBb
+Ql0WeD90aQIAUFxFWkIraiFqAVIFDk1X
+QlsUfjskaQdSBQ0WCUBybndpVgkHARZe
+QlsTKG0hbgdSBQ0WCUBybndpUFFQWBVd
+QltJe29za1AJVwoSWRF9YSQ7AAUBX0YK
+Ql0Rc2onagIBUl1GC0gvOnBpBwcAXEFa
+Ql1GK2AjblYEB10WW0Z+OyQ9UAEHDk1d
+QlsTLDsmPQFSBQ0WCUBybndpUQgHCxde
+QlsTfWpxOQtSBQ0WCUBybndpUwYAXxBX
+QlxBKDpybAoGBlhCDUAra3puVFZQXEJe
+Ql1Fcml7OVYEVw4WCxV/bXZsVFQHX0Ja
+QlxALD0jPQsFBAwQXEQpP3toVwYJCRFd
+Ql1DezgjbQIEVw4WCxV/bXZsVgNSXxVc
+QlsTKGonaApSBQ0WCUBybndpUFEGCxJc
+QlsTKG13YFRSBQ0WCUBybndpUFEJXEVY
+QltDf2wkalMABQpBV0l9O3dsAFMHC0VW
+QltGfD9xPFEHBAAXCxZ/OCc+AQMDABVf
+QltFKTgga1BTUA9NXER7PXpoVwAEDUcJ
+QlwVLGwkbgsFB1xEW0QvYHNrBgkHAUBf
+QltIK24mOQNUB1gWW0l8YHFrAgUFDBAJ
+QltJe28jaVcJVwoSWRF9YSQ7AAUCAEZc
+QltJe28jawEJVwoSWRF9YSQ7AAUCW0Fb
+QltAKG1walYFB1xEW0QvYHNrBQkAAUZd
+QlsVeT1xaVBSBQ0WCUBybndpAgIFXxcM
+QlxAcjx1PAEGVF1FCkF6bydtUQYADEIJ
+Ql1Cc2wkb1dWAgsWDkV7bnFvA1YIWEMO
+QlsTKG0kbQtSBQ0WCUBybndpUFFTDBEN
+QltGeW4gPQEHBAAXCxZ/OCc+AAlQCUxa
+QltIe2hwagFUB1gWW0l8YHFrVwhVCUUO
+QltIKWhxOgdUB1gWW0l8YHFrAglSC0UO
+QltAcmF0OQUFB1xEW0QvYHNrBQJVAUdc
+QltBLjxybFAFB1xEW0QvYHNrC1VUDEAM
+QlxCeGogYVMGBlhCDUAra3puAgdTXRVa
+QlxCeGt7OgAGBlhCDUAra3puAgdQDE1e
+QlxBeT0mYQcFBAwQXEQpP3toVAEBC0YK
+QlxDKWEgYQcGAggSCUErOnE8UFMBXENf
+QlxDL2p2agsGAggSCUErOnE8UFRVC0Ne
+Ql0Re20nOQcBUl1GC0gvOnBpBlFSW0EO
+Ql0Re20nOQYBUl1GC0gvOnBpBlFSW0Bf
+Ql0SKT8jbFNWUApNXkB8OyZtVAUDXUxe
+Ql0TKW5zaFcEVQkQVhJ4OyFqCwkHDk1c
+Ql1GKD1ybwsEB10WW0Z+OyQ9UAQBWk0K
+Ql0RLmt6PVEBUl1GC0gvOnBpB1YHCEMO
+QlxAfGwmbgEGVF1FCkF6bydtUFYDChIK
+QlxBfW13alMGBlhCDUAra3puVARQWkVW
+Ql0Rc2onaVQBUl1GC0gvOnBpBwcAXEdb
+Ql0SeTp1YFFWUApNXkB8OyZtVlMFDhUL
+QltDL2lwbgIDUl9HDBV5OnA8AgVSABZf
+QltDcjojYFAABQpBV0l9O3dsAQdTAExc
+QltDf2wgbwQABQpBV0l9O3dsAFMEDkVd
+QltFLj9zO1NTUA9NXER7PXpoVwNTDkYM
+QltFfz91a1NTUA9NXER7PXpoVgEGX0EN
+QltIfTpxOgZUB1gWW0l8YHFrVFMDDEAN
+QltAcmF0OQQFB1xEW0QvYHNrBQJVDhJZ
+QlwWcm10OQEFB1xEW0QvYHNrBwdSC0FW
+QlwVLGwkO1cFB1xEW0QvYHNrBgkGDkQK
+QlsTKG16b1FSBQ0WCUBybndpUFEIDxda
+QlsTKG0jOlBSBQ0WCUBybndpUFEIX0Zc
+QltIeGgjPlFUB1gWW0l8YHFrV1NXCURa
+QltGfD9xPFEHBAAXCxZ/OCc+AQMDAE0L
+QltGeWwmbgAHBAAXCxZ/OCc+AAkEXBEO
+QltGLztxYAQHBAAXCxZ/OCc+BgMCD01d
+QlsTKG0gYFZSBQ0WCUBybndpUFFQDUMM
+QlsTKG0kbVBSBQ0WCUBybndpUFFTD0ZY
+QlsTKG0kbQtSBQ0WCUBybndpUFFTDBJf
+QlsTKG0mPApSBQ0WCUBybndpUFFTCUJe
+QltJemkjYAcJVwoSWRF9YSQ7AAIADkFW
+QltDf2xwOwMABQpBV0l9O3dsAFMCAUwJ
+Ql0WeD90aQIAUFxFWkIraiFqAVIFDk0O
+Ql0WKWwnPQUDUApMCxIsbXc9VFZVCURX
+Ql0Uejhzb1YEVQkQVhJ4OyFqUwMIXUNc
+QlxBfz92agcGBlhCDUAra3puVAFXARVZ
+QltCeWpzO1EFB1xEW0QvYHNrUwMIABJc
+QltDc2shPgUABQpBV0l9O3dsAQkCXEBX
+QltDf2onagIABQpBV0l9O3dsAFJTWkdf
+QltBfTghOgcFB1xEW0QvYHNrCwMECUAL
+Ql0Re24kagIBUl1GC0gvOnBpBlIHC0JZ
+Ql1DeDt3blEEVw4WCxV/bXZsVgRXDhVb
+QlsUfj96bQNSBQ0WCUBybndpVlEADEIJ
+QltGfDojOVQHBAAXCxZ/OCc+AQIIXRFc
+QltGeW4gPQEHBAAXCxZ/OCc+AAlQCUxc
+QltFK2pybVZTUA9NXER7PXpoVgkCAUdW
+QltGeGp0aQYHBAAXCxZ/OCc+AAYHCk0N
+Ql0RemF2aQUBUl1GC0gvOnBpBglUXBVc
+QlwWfWpwOQUFB1xEW0QvYHNrBwYAWhFd
+Ql0SeG8nbAFWUApNXkB8OyZtVgUCCURY
+Ql0WKW9wYFEDUApMCxIsbXc9VFZVXUVc
+Ql0UezwkbVQEVQkQVhJ4OyFqUwZQCEBW
+Ql0Wfmp2OQoAUFxFWkIraiFqBgABCRFe
+Ql1DemtyPlMEVw4WCxV/bXZsVgEIDkIK
+QlxEfWskYAIGAggSCUErOnE8VgEFAENX
+QlxALDpwbgcFBAwQXEQpP3toVwYDCxBW
+QlxCe2tzOwoGBlhCDUAra3puAgUFX0AO
+QlsTKGxyaQBSBQ0WCUBybndpUFFTAUBW
+QlsTKG0jOgtSBQ0WCUBybndpUFEIXBEL
+QlsTKG11aABSBQ0WCUBybndpUFEIC0ZZ
+QltDLmtzYQIDUl9HDBV5OnA8AgNTDhdc
+QltBfT13bgYFB1xEW0QvYHNrCwNSXBJW
+QlwVLG92PAUFB1xEW0QvYHNrBlEDDEdb
+QltFK2t1YApTUA9NXER7PXpoVgkAARFY
+QltAcmF0OQoFB1xEW0QvYHNrBQJVAUAN
+QltCeW4nb1cFB1xEW0QvYHNrUwNTDxBd
+QltDf2xzYAQABQpBV0l9O3dsAFMCDUFe
+QlxALDpwbgcFBAwQXEQpP3toVwYDCxBZ
+QlxDfzh0bQAGAggSCUErOnE8UAFTAUBW
+Ql0SfG97PlFWUApNXkB8OyZtVwQECkRW
+Ql1FfG4hbQQEVw4WCxV/bXZsVFFSDUEO
+Ql0Se2tyOwBWUApNXkB8OyZtVgFUDEFb
+QlxALG8jOwIFBAwQXEQpP3toVwRTC0Zb
+QlxCeGt7OgMGBlhCDUAra3puAgdQDExb
+QlsTKG11aABSBQ0WCUBybndpUFEIC0Zd
+Ql0Ucm4kOlEEVQkQVhJ4OyFqUAEIAEJf
+Ql1Deml2alAEVw4WCxV/bXZsVgEEAE0L
+Ql1Gfz8kaQcBAwkQXRZ/YSFvVAkJCEFa
+QlsTeGB7blFSBQ0WCUBybndpC1EEARBX
+QltEcz1zPAFTUA9NXER7PXpoUQABXxda
+Ql0RLmt6PVEBUl1GC0gvOnBpB1YHCEMN
+Ql1Dem0gaAsEVw4WCxV/bXZsVgFXCUQO
+QlsUfz0hOwtSBQ0WCUBybndpVlYGARFd
+QlsTKG0mPAVSBQ0WCUBybndpUFFTCUAM
+QlsTKG11aAJSBQ0WCUBybndpUFEICBJa
+QltFL20nPAJTUA9NXER7PXpoVwRSWkZd
+QltEK2gjOwNTUA9NXER7PXpoUQBVWEEN
+QltEfzx6awEEVwsXDhV+bSNvBQZTWk1d
+QltBKTgjb1YFB1xEW0QvYHNrC1QDARde
+QltBLj1waQUFB1xEW0QvYHNrC1VVABcL
+QltBKW16bQcFB1xEW0QvYHNrC1NVW0RW
+QltAe20gPQYFB1xEW0QvYHNrBAYGWkMO
+QltJe2skalAJVwoSWRF9YSQ7AAQEXERe
+QltIe2h7bFNUB1gWW0l8YHFrVwhVXUdX
+QltIe2h7bFNUB1gWW0l8YHFrVwhVXUdd
+QltGfzx6YFAHBAAXCxZ/OCc+AQABXRZb
+QltDfj0jOwUABQpBV0l9O3dsAFEFD0dX
+QltBc2shaAsFB1xEW0QvYHNrCwgHXEBd
+QlwWLzwkblEFB1xEW0QvYHNrBAFTCEZa
+QlxALmp6alcFBAwQXEQpP3toVlRSX0FZ
+QlxBfGgnPQEGBlhCDUAra3puVAICCkYK
+QlsUfjskaQdSBQ0WCUBybndpVgkHARUL
+QlwTemskYFAFB1xEW0QvYHNrVFQJDkJd
+QltEK2xyOVBTUA9NXER7PXpoUQFXDhBe
+QltDf217PQQABQpBV0l9O3dsAFMADBVf
+QltDfj0jOwUABQpBV0l9O3dsAFEFD0dd
+QltAf212bQcFB1xEW0QvYHNrBFIIDxEL
+QlwWKWl0PAsFB1xEW0QvYHNrB1IBCxJb
+QltCeW9xbQAFB1xEW0QvYHNrUwNQWBdY
+QltDf2wgb1QABQpBV0l9O3dsAFMEAUEO
+QltGeGp0aQYHBAAXCxZ/OCc+AAYHCk1d
+QltIczggOQVUB1gWW0l8YHFrAgJXWkFZ
+QltGeWwmbgAHBAAXCxZ/OCc+AAkEXBFa
+Ql1GfGp0bwQBAwkQXRZ/YSFvVFEBCEZZ
+QlxCczpzPAEGBlhCDUAra3puAwdUDBJd
+Ql0Se2tyOwdWUApNXkB8OyZtVgFUDEMJ
+Ql0UfWogOwsEVQkQVhJ4OyFqU1VTWkJf
+QlxBeGgkOwsFBAwQXEQpP3toV1UAWEcM
+QlxDezpxOQYGAggSCUErOnE8UwcHWEVW
+QltJe29za1MJVwoSWRF9YSQ7AAUBXBIN
+QlsTKG0kbQtSBQ0WCUBybndpUFFTDBEK
+QlsTKG0mPAVSBQ0WCUBybndpUFFTCUBZ
+QlsTKG0jPARSBQ0WCUBybndpUFFQCBJW
+QlsTfWpxOVFSBQ0WCUBybndpUwYDCUZX
+Ql1DezgjbQIEVw4WCxV/bXZsVgNSXxVa
+QltDf25xPQcABQpBV0l9O3dsAFNQDEBY
+Ql1DeDt3blEEVw4WCxV/bXZsVgRXDhVd
+QlxEeG8kbFcGAggSCUErOnE8UQQBDhBZ
+QlsTc2kgOVBSBQ0WCUBybndpUAFVWkFc
+QlsTKG11aABSBQ0WCUBybndpUFEIC0da
+QlsTKG0jOlBSBQ0WCUBybndpUFEIX0dY
+Ql0WfmlzbFcAUFxFWkIraiFqAVYID0NZ
+Ql0ULz8gaFFWVApAXEN4bCY+AVQEARVX
+QlwVLG9yYAAFB1xEW0QvYHNrBgkJX0wK
+QltCez9zaFQFB1xEW0QvYHNrUwFVCUEN
+Ql0Re2h3OgABUl1GC0gvOnBpBlEICkBb
+Ql0WfmpxaAEAUFxFWkIraiFqAVZUXBFf
+QltBKTgjb1cFB1xEW0QvYHNrC1QDAERb
+QlwTem13agcFB1xEW0QvYHNrVFRXAERe
+QlsTKGonOwJSBQ0WCUBybndpUFEGDREK
+Ql1CfD16YFRWAgsWDkV7bnFvA1NQCURb
+QlsTKG11OldSBQ0WCUBybndpUFEIDRVZ
+QlxCfj8jaVAGBlhCDUAra3puAlVSCkJc
+Ql1Ccm4mPABWAgsWDkV7bnFvA1VVDBEO
+Ql0WLmkjOgoDUApMCxIsbXc9AgFTXU1Y
+Ql1DeT0maVEEVw4WCxV/bXZsVgYEAUVb
+QlxDfmF3PVQGAggSCUErOnE8U1YDARdY
+QlxBcjghYVEGBlhCDUAra3puVAhXDUFf
+Ql0Ucz0jbwQEVQkQVhJ4OyFqUARSD0YN
+Ql1GfWxyPAQBAwkQXRZ/YSFvVFMHX0RY
+QltBe2EhbQQFB1xEW0QvYHNrCgRUWhYL
+Ql1HeG0gPlQEB10WW0Z+OyQ9UAdUWBZW
+Ql1CKz0jOgVWAgsWDkV7bnFvAAFSD0ZZ
+QltEcjxxbgBTUA9NXER7PXpoUFUDCxIK
+Ql1Hez0gbVEEB10WW0Z+OyQ9UAdTABdc
+QltIKWh0agNUB1gWW0l8YHFrAglSW0AJ
+QlsTKG0kbQtSBQ0WCUBybndpUFFTDBIM
+QlsTKG10bAtSBQ0WCUBybndpUFEJX00L
+QltFfGhxbwNTUA9NXER7PXpoVgFXAUdY
+Ql1Gfz8kaQcBAwkQXRZ/YSFvVAkJCEEO
+QltCeWx3agUFB1xEW0QvYHNrUwNQDRZZ
+QltHfWxwPAJRAAFAX0h8YHJpCgNTWhJa
+QltDc2shPgUABQpBV0l9O3dsAQkCXEIL
+QltDf24nOVEABQpBV0l9O3dsAFNSDkcK
+QltIKW11bgRUB1gWW0l8YHFrAlEGDRVW
+QltAK2h3OlAFB1xEW0QvYHNrBQYGDkFd
+Ql0WfmpxaAEAUFxFWkIraiFqAVZUXBFc
+Ql0WfmpxaAAAUFxFWkIraiFqAVZUXBBb
+Ql1If20nawMJBAhCWkUuaXBqClQFDhdX
+Ql1HeGskPAcEB10WW0Z+OyQ9UAdVWhYN
+Ql0Ufz93PgMEVQkQVhJ4OyFqU1IEABcK
+QlxAfGxyagoGVF1FCkF6bydtUFVXXBZZ
+Ql0Wfmp2PQEAUFxFWkIraiFqBgABCxBY
+Ql0WKGAjaQYDUApMCxIsbXc9VFUIDRFf
+QltDf24gaQEABQpBV0l9O3dsAFNTXRJd
+QlsTKG11OldSBQ0WCUBybndpUFEIDRVd
+QlxCLztxOQIGBlhCDUAra3puAAFSCRJa
+QlxDfGl3bVAGAggSCUErOnE8UAIECEFY
+QltAcmtzOgYFB1xEW0QvYHNrBQFTCUIK
+QlxCeGogYVAGBlhCDUAra3puAgdTXRVZ
+Ql0RfT8nbVYBUl1GC0gvOnBpBwQJDkFZ
+QltDf24nOVEABQpBV0l9O3dsAFNSDkBf
+QlxAKTp1OwAFBAwQXEQpP3toVlQBWEUO
+QlxEeG8kbFcGAggSCUErOnE8UQQBDhBW
+QlsTezwkbQZSBQ0WCUBybndpCwdTAUde
+QltIe2h7bFBUB1gWW0l8YHFrVwhVXUBc
+QltJe28jaVcJVwoSWRF9YSQ7AAUCAEcL
+QltFKW8gOlBTUA9NXER7PXpoVlYHCEBW
+QltDcjsmaQoABQpBV0l9O3dsAQcJDUFe
+QltBe2EhbQQFB1xEW0QvYHNrCgRUWhdd
+QltDf2onagMABQpBV0l9O3dsAFJTWkBZ
+QlwVLj13O1MFB1xEW0QvYHNrBgMEXxVb
+QltJe2xwawUJVwoSWRF9YSQ7AARVDEFX
+QlsTKG0gYQNSBQ0WCUBybndpUFFQDERe
+QlxDfmwhaQMGAggSCUErOnE8U1VUCRVY
+QlwWcmkmYQoFB1xEW0QvYHNrBwcDX0xc
+QlsTKG0kbQpSBQ0WCUBybndpUFFTDBBY
+QltEfGpwbQEEVwsXDhV+bSNvBQcIAEcO
+QlxCL2B1aFQGBlhCDUAra3puAAEJC0MO
+Ql0TeWB7bFNWUApNXkB8OyZtAgIFDUVb
+Ql1Gfz8kaQcBAwkQXRZ/YSFvVAkJCEEL
+QlwWLz1yaFQFB1xEW0QvYHNrBAEGCRJc
+QltDf217PQQABQpBV0l9O3dsAFMADE1Y
+QltDfj0jOwoABQpBV0l9O3dsAFEFD0BX
+QlxBK2xwbFcGBlhCDUAra3puVFQDAERW
+QlwVejokaQQFB1xEW0QvYHNrAFVQWBBX
+QlsTKG0gYQNSBQ0WCUBybndpUFFQDEVd
+QltGeW4gPQMHBAAXCxZ/OCc+AAlQCUdX
+Ql1CcmlyaQtWAgsWDkV7bnFvA1RSXEwL
+QlsTKG0mPApSBQ0WCUBybndpUFFTCUEN
+QlxBejx0alEFBAwQXEQpP3toV1FQCEJY
+Ql1GfGp0bwQBAwkQXRZ/YSFvVFEBCEZe
+QltAcmtzOgUFB1xEW0QvYHNrBQFTCRVX
+QlsVfDt2YABSBQ0WCUBybndpAglVD0BX
+QlsTfWpxOVBSBQ0WCUBybndpUwYDCURW
+QlsTKG11OwZSBQ0WCUBybndpUFEIDEYN
+QltDf2wgbwQABQpBV0l9O3dsAFMEDkVW
+Ql0Re21xPAoBUl1GC0gvOnBpBlFQXxYJ
+Ql0WLmkjOgoDUApMCxIsbXc9AgFTXU1W
+QltGKzp6aVcHBAAXCxZ/OCc+AQgJD0ZY
+QltDc2lwbwYABQpBV0l9O3dsAQgGDRVe
+Ql0Rc2onaVQBUl1GC0gvOnBpBwcAXEcK
+Ql1GK29zPQcEB10WW0Z+OyQ9UABSABcJ
+QltFfmF3OQNTUA9NXER7PXpoUVRUXUFZ
+QlwWLzgmbwYFB1xEW0QvYHNrBAEBD0QJ
+QltAf212bgIFB1xEW0QvYHNrBFIIAUAM
+QltGezgmbQEGBVwQDUB7bHY5UwUCCUde
+Ql0Rezp7PAABUl1GC0gvOnBpBlMCDhFY
+Ql1De216bgUEVw4WCxV/bXZsVgJXDRUN
+Ql1If20nawMJBAhCWkUuaXBqClQFDhcO
+Ql1Gej9wYVQEVw4WCxV/bXZsAghVAEJa
+Ql0TKTx0aFYEVQkQVhJ4OyFqC1EDCRJf
+QltBeG57bgsFB1xEW0QvYHNrCgdTCEIO
+Ql0TLzx7PgoEVQkQVhJ4OyFqC1YCX0dY
+QltBeG57blAFB1xEW0QvYHNrCgdTCBAL
+Ql1GK29zPQcEB10WW0Z+OyQ9UABSABBe
+Ql0Wfm96aQMAUFxFWkIraiFqBgBVABFW
+Ql0WKWwnPVADUApMCxIsbXc9VFZVCUBf
+QltGeGt3bgAHBAAXCxZ/OCc+AAYFXEFZ
+QltBeG57blMFB1xEW0QvYHNrCgdTCEMJ
+Ql0Rezp7PAcBUl1GC0gvOnBpBlMCDhIK
+Ql1CfDsgPAdWAgsWDkV7bnFvA1MEAERe
+QlwWLm52OwcFB1xEW0QvYHNrB1UHDkJY
+QltDKTh6PgEDUl9HDBV5OnA8AgADCUYL
+QltGezgmbQEGBVwQDUB7bHY5UwUCCUdZ
+QltDfj13PVcABQpBV0l9O3dsAFECDUQL
+Ql0Rezp7PAABUl1GC0gvOnBpBlMCDhFZ
+QltGeGt3bgAHBAAXCxZ/OCc+AAYFXEAJ
+QlsTKG11aABSBQ0WCUBybndpUFEIC0Zf
+QltHemF1PFYHBAAXCxZ/OCc+BghVW0Za
+QltIeWt0bQFUB1gWW0l8YHFrVAFTXBdX
+Ql1If20nawMJBAhCWkUuaXBqClQFDhcK
+QltAcmF0OQoFB1xEW0QvYHNrBQJVAUBW

BIN
listen_data/src/res/poc.xlsx


Разлика између датотеке није приказан због своје велике величине
+ 1938 - 62
listen_data/src/zkmethod.go


Неке датотеке нису приказане због велике количине промена