Przeglądaj źródła

Merge remote-tracking branch 'origin/master'

jianghan 5 miesięcy temu
rodzic
commit
755dd3f788

+ 3 - 4
CMPlatform/history/task.go

@@ -396,13 +396,12 @@ func processedData_A(c *Customer, data *tempData) {
 			fieldText[cwm] = text
 		}
 	}
-
 	/*
 		因为要记录所有匹配上的关键词,所有优先匹配附加词,在匹配关键词
 	*/
-	// 1.附加词匹配
+	//1.附加词匹配
 	IsMatch := false
-	//common.Debug("sr.AW---", len(sr.AW))
+	// common.Debug("sr.AW---", len(sr.AW))
 	for i, aw := range sr.AW {
 		// common.Debug("-------------------------开始附加词匹配--------------------------")
 		IsMatchAddKey := RegMatch(fieldText, aw.MatchType, aw.KeyReg, nil, nil, false, true)
@@ -492,7 +491,7 @@ func processedData_A(c *Customer, data *tempData) {
 		}
 		c.saveTempLock.Unlock()
 	} else {
-		// common.Debug("------------", id, IsMatch)
+		//common.Debug("------------", id, IsMatch)
 	}
 }
 

+ 9 - 5
JySEPlatform/client/client.go

@@ -4,6 +4,7 @@ import (
 	. "JySEPlatform/util"
 	"encoding/json"
 	"fmt"
+	"log"
 	"regexp"
 	"strconv"
 	"strings"
@@ -159,12 +160,15 @@ func (c *Client) CuserRuleCreate() {
 		i_createtime := time.Now().Unix()
 		data["i_updatetime"] = i_createtime
 		data["s_updateuser"] = sessVal["entUserName"]
-		query := bson.M{
-			"phone":    sessVal["phone"],
-			"username": sessVal["name"],
-		}
-		entMgoInfo, _ := MgoCus.FindOne("user", query)
+		entMgoInfo, _ := MgoCus.FindOne("user", bson.M{"entid": sessVal["entId"]})
 		appid := qu.ObjToString((*entMgoInfo)["appid"])
+		if appid == "" {
+			log.Println("appid 异常, ", sessVal["entUserId"])
+			c.ServeJson(map[string]interface{}{
+				"rep": false,
+			})
+			return
+		}
 		var rep = false
 		if id == "" { //新建
 			if entUserId == 0 {

+ 58 - 24
JySEPlatform/client/customerRule.go

@@ -23,11 +23,12 @@ import (
 
 type CustomerRule struct {
 	*xweb.Action
-	cuserRuleCreate xweb.Mapper `xweb:"/customerRule/cuser/rule/create"`  //新建规则
-	ruleImport      xweb.Mapper `xweb:"/customerRule/rule/import"`        //导入关键词  导入文件excel
-	productData     xweb.Mapper `xweb:"/customerRule/cuser/produce"`      //生成预览数据
-	demoData        xweb.Mapper `xweb:"/customerRule/rule/preview"`       //预览数据
-	dataTest        xweb.Mapper `xweb:"/customerRule/rule/dataTest/(.*)"` //规则测试
+	cuserRuleCreate xweb.Mapper `xweb:"/customerRule/cuser/rule/create"`    //新建规则
+	ruleImport      xweb.Mapper `xweb:"/customerRule/rule/import"`          //导入关键词  导入文件excel
+	productData     xweb.Mapper `xweb:"/customerRule/cuser/produce"`        //生成预览数据
+	productResult   xweb.Mapper `xweb:"/customerRule/cuser/product/result"` //生成预览数据 结果
+	demoData        xweb.Mapper `xweb:"/customerRule/rule/preview"`         //预览数据
+	dataTest        xweb.Mapper `xweb:"/customerRule/rule/dataTest/(.*)"`   //规则测试
 }
 
 func (c *CustomerRule) CuserRuleCreate() {
@@ -187,7 +188,6 @@ func (c *CustomerRule) ProductData() {
 	defer qu.Catch()
 	if c.Method() == "POST" {
 		log.Println("正在生成预览数据。。。")
-		rep := false
 		id := c.GetString("id")
 		tag, ok := Mgo.FindById("entniche_rule", id, `{}`)
 		if !ok {
@@ -254,8 +254,6 @@ func (c *CustomerRule) ProductData() {
 		// 其他的分隔
 		// 1000<=总个数<4000,将时间(publishtime)按照每3个月进行分割,然后查询到的数据量进行求和。
 		// 4000<=总个数<8000,将时间(publishtime)按照每1个月进行分割,然后查询到的数据量进行求和
-		var err error
-		var count int64
 		// var n int
 		// 小于1000的直接查
 		// if totalCount < 1000 {
@@ -279,7 +277,10 @@ func (c *CustomerRule) ProductData() {
 		// 	listLens := int(redis.LLEN("datag", "jyqyfw_es_query"))
 		// 	if listLens < 2 {
 		// 		redis.RPUSH("datag", "jyqyfw_es_query", 1)
-		err, count = UtilEsFind1(*tag)
+
+		go func(m map[string]interface{}) {
+			UtilEsFind1(m)
+		}(*tag)
 		// 		redis.LPOP("datag", "jyqyfw_es_query")
 		// 		break
 		// 	} else if times2 > 10 {
@@ -292,21 +293,54 @@ func (c *CustomerRule) ProductData() {
 		// 	time.Sleep(2 * time.Second)
 		// }
 
-		if err == nil {
-			rep = true
-			// msg = "数据生成成功"
-			c.ServeJson(map[string]interface{}{
-				"rep":   rep,
-				"count": count,
-			})
-		} else {
-			rep = false
-			msg := "数据生成失败,请稍后再试"
-			c.ServeJson(map[string]interface{}{
-				"rep":   rep,
-				"count": count,
-				"msg":   msg,
-			})
+		c.ServeJson(map[string]interface{}{
+			"rep": true,
+		})
+
+		//if err == nil {
+		//	rep = true
+		//	// msg = "数据生成成功"
+		//	c.ServeJson(map[string]interface{}{
+		//		"rep":   rep,
+		//		"count": count,
+		//	})
+		//} else {
+		//	rep = false
+		//	msg := "数据生成失败,请稍后再试"
+		//	c.ServeJson(map[string]interface{}{
+		//		"rep":   rep,
+		//		"count": count,
+		//		"msg":   msg,
+		//	})
+		//}
+	}
+}
+
+func (c *CustomerRule) ProductResult() {
+	defer qu.Catch()
+	if c.Method() == "POST" {
+		id := c.GetString("id")
+		info, _ := Mgo.FindById("entniche_rule", id, bson.M{"data_result": 1, "i_estotal": 1})
+		if info != nil && len(*info) > 0 {
+			if qu.IntAll((*info)["data_result"]) == 1 {
+				c.ServeJson(map[string]interface{}{
+					"rep":    true,
+					"status": "success",
+					"count":  qu.IntAll((*info)["i_estotal"]),
+				})
+			} else if qu.IntAll((*info)["data_result"]) == -1 {
+				c.ServeJson(map[string]interface{}{
+					"rep":    true,
+					"status": "error",
+					"msg":    "数据生成失败",
+				})
+			} else {
+				c.ServeJson(map[string]interface{}{
+					"rep":    true,
+					"status": "processing",
+					"msg":    "",
+				})
+			}
 		}
 	}
 }

+ 20 - 15
JySEPlatform/config.json

@@ -1,21 +1,21 @@
 {
   "port": "7001",
   "udpport": ":11117",
-  "mgodb": "192.168.3.71:29099",
+  "mgodb": "172.20.45.129:27002",
   "dbsize": 5,
   "dbname": "datatag_ent",
-  "mgodben": "192.168.3.71:29099",
+  "mgodben": "172.20.45.129:27002",
   "dbnameen": "enterprise",
   "mongoenc": "winner_enterprise",
   "subday": 15,
   "customer": {
     "api": "http://web-jytest.jianyu360.cn/api1/user/jy_newuser",
-    "mgodb": "192.168.3.206:27080",
+    "mgodb": "172.20.45.129:27002",
     "dbname": "jyqyfw",
     "dbsize": 5
   },
-  "preview_href": "http://192.168.3.204:8081/preview/data-preview.html",
-  "elasticsearch": "http://192.168.3.241:9205",
+  "preview_href": "https://jybx-webtest.jydev.jianyu360.com/seplatform/preview/data-preview.html",
+  "elasticsearch": "http://172.20.45.129:9206",
   "elasticsearch_index": "bidding",
   "elasticsearch_type": "bidding",
   "elasticsearch_interim_index": "bidding",
@@ -32,7 +32,7 @@
     "memo": "生索引"
   },
   "buyerinfo": {
-    "addr": "192.168.3.71:29099",
+    "addr": "172.20.45.129:27002",
     "size": 15,
     "db": "mixdata",
     "hospcoll": "buyer_rank",
@@ -41,7 +41,7 @@
     "password": ""
   },
   "enterprise": {
-    "addr": "192.168.3.71:29099",
+    "addr": "172.20.45.129:27002",
     "size": 15,
     "db": "mixdata",
     "coll": "qyxy_std",
@@ -49,7 +49,7 @@
     "password": ""
   },
   "save": {
-    "addr": "192.168.3.71:29099",
+    "addr": "172.20.45.129:27002",
     "size": 15,
     "db": "datatag_ent",
     "coll": "usermail_history",
@@ -58,13 +58,13 @@
     "coll_project": "usermail_history_projectid"
   },
   "extract": {
-    "addr": "192.168.3.206:27080",
+    "addr": "172.20.45.129:27002",
     "coll": "result_20200917",
     "db": "qfw",
     "size": 15
   },
   "es": {
-    "addr": "http://192.168.3.241:9205",
+    "addr": "http://172.20.45.129:9206",
     "index": "bidding",
     "itype": "bidding",
     "pool": 15,
@@ -219,21 +219,21 @@
     "jyMDBXQQIDCQBeSUdBITNf",
     "jyFApXQQIEAw5TTUZOMBpD"
   ],
-  "redis_addrs": "datag=192.168.3.149:1712,export=192.168.3.149:1712,session=192.168.3.149:1713",
+  "redis_addrs": "datag=172.20.45.129:1712,export=172.20.45.129:1712,session=172.20.45.129:1713",
   "jyMysql": {
     "username": "root",
     "password": "=PDT49#80Z!RVv52_z",
-    "address": "192.168.3.14:4000",
+    "address": "172.20.45.129:4000",
     "dbName": "jianyu"
   },
   "bidding_mgo": {
-    "addr": "192.168.3.71:29099",
+    "addr": "172.20.45.129:27002",
     "coll": "bidding",
     "db": "qfw_data",
     "size": 15,
     "username": "",
     "password": "",
-    "replSet": "bidding"
+    "replSet": ""
   },
   "file_downloadurl": "http://jy-datafile.oss-cn-beijing.aliyuncs.com/",
   "filter_filehref_appid": [
@@ -244,5 +244,10 @@
   ],
   "isNewSql": 1,
   "cookiedomain":".jydev.jianyu360.com",
-  "export_file_path": "/nas/shareFile/customizedexport/"
+  "export_file_path": "/Users/jhw/Project/GoPro/datatag/JySEPlatform/customizedexport/",
+  "repeat_rpc": "172.31.31.203:226",
+  "jyResourceRpc": {
+    "key": "resourcescenter.rpc",
+    "hosts": "127.0.0.1:2379"
+  }
 }

+ 1 - 5
JySEPlatform/front/front.go

@@ -480,11 +480,7 @@ func LoginCheck(f *Front, entId int, loginUser map[string]interface{}, userPhone
 		return
 	}
 	// 4. mongo库查询与之关联的企业appid
-	query := bson.M{
-		"phone":    (*entInfo)[0]["phone"],
-		"username": (*entInfo)[0]["name"],
-	}
-	entMgoInfo, ok := MgoCus.FindOne("user", query)
+	entMgoInfo, ok := MgoCus.FindOne("user", bson.M{"entid": entId})
 	if !ok || entMgoInfo == nil || len(*entMgoInfo) == 0 {
 		//	企业信息查询失败
 		f.ServeJson(map[string]interface{}{

+ 84 - 8
JySEPlatform/go.mod

@@ -3,6 +3,7 @@ module JySEPlatform
 go 1.23
 
 require (
+	app.yhyue.com/moapp/jyResourcesCenter v0.0.0-20250214055745-d8494f27f5d5
 	app.yhyue.com/moapp/jybase v0.0.0-20241028060726-9b8837ab6e42
 	github.com/Chain-Zhang/pinyin v0.1.3
 	github.com/PuerkitoBio/goquery v1.10.0
@@ -13,35 +14,110 @@ require (
 	github.com/robfig/cron v1.2.0
 	github.com/shopspring/decimal v1.4.0
 	github.com/tealeg/xlsx v1.0.5
-	go.mongodb.org/mongo-driver v1.17.1
-	golang.org/x/text v0.20.0
+	github.com/zeromicro/go-zero v1.8.0
+	go.mongodb.org/mongo-driver v1.17.2
+	golang.org/x/text v0.21.0
 )
 
 require (
 	app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d // indirect
+	filippo.io/edwards25519 v1.1.0 // indirect
 	github.com/andybalholm/cascadia v1.3.2 // indirect
+	github.com/beorn7/perks v1.0.1 // indirect
+	github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+	github.com/cespare/xxhash/v2 v2.3.0 // indirect
+	github.com/coreos/go-semver v0.3.1 // indirect
+	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+	github.com/fatih/color v1.18.0 // indirect
 	github.com/garyburd/redigo v1.6.2 // indirect
-	github.com/go-sql-driver/mysql v1.6.0 // indirect
+	github.com/go-logr/logr v1.4.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-openapi/jsonpointer v0.19.6 // indirect
+	github.com/go-openapi/jsonreference v0.20.2 // indirect
+	github.com/go-openapi/swag v0.22.4 // indirect
+	github.com/go-sql-driver/mysql v1.8.1 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/golang/mock v1.6.0 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/gomodule/redigo v1.8.9 // indirect
+	github.com/google/gnostic-models v0.6.8 // indirect
+	github.com/google/go-cmp v0.6.0 // indirect
+	github.com/google/gofuzz v1.2.0 // indirect
+	github.com/google/uuid v1.6.0 // indirect
 	github.com/gorilla/securecookie v1.1.2 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect
 	github.com/howeyc/fsnotify v0.9.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
-	github.com/klauspost/compress v1.13.6 // indirect
-	github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.17.9 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/mattn/go-colorable v0.1.13 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/montanaflynn/stats v0.7.1 // indirect
+	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/olivere/elastic v6.2.37+incompatible // indirect
+	github.com/openzipkin/zipkin-go v0.4.3 // indirect
+	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
+	github.com/prometheus/client_golang v1.20.5 // indirect
+	github.com/prometheus/client_model v0.6.1 // indirect
+	github.com/prometheus/common v0.55.0 // indirect
+	github.com/prometheus/procfs v0.15.1 // indirect
+	github.com/redis/go-redis/v9 v9.7.0 // indirect
+	github.com/spaolacci/murmur3 v1.1.0 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.2 // indirect
 	github.com/xdg-go/stringprep v1.0.4 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
-	golang.org/x/crypto v0.27.0 // indirect
-	golang.org/x/net v0.29.0 // indirect
-	golang.org/x/sync v0.9.0 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.15 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.15 // indirect
+	go.opentelemetry.io/otel v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 // indirect
+	go.opentelemetry.io/otel/exporters/zipkin v1.24.0 // indirect
+	go.opentelemetry.io/otel/metric v1.24.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.24.0 // indirect
+	go.opentelemetry.io/otel/trace v1.24.0 // indirect
+	go.opentelemetry.io/proto/otlp v1.3.1 // indirect
+	go.uber.org/atomic v1.10.0 // indirect
+	go.uber.org/automaxprocs v1.6.0 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	go.uber.org/zap v1.24.0 // indirect
+	golang.org/x/crypto v0.32.0 // indirect
+	golang.org/x/net v0.34.0 // indirect
+	golang.org/x/oauth2 v0.21.0 // indirect
+	golang.org/x/sync v0.10.0 // indirect
+	golang.org/x/sys v0.29.0 // indirect
+	golang.org/x/term v0.28.0 // indirect
+	golang.org/x/time v0.9.0 // indirect
+	google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect
+	google.golang.org/grpc v1.65.0 // indirect
+	google.golang.org/protobuf v1.36.4 // indirect
+	gopkg.in/inf.v0 v0.9.1 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
+	k8s.io/api v0.29.3 // indirect
+	k8s.io/apimachinery v0.29.4 // indirect
+	k8s.io/client-go v0.29.3 // indirect
+	k8s.io/klog/v2 v2.110.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
+	k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
+	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+	sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
+	sigs.k8s.io/yaml v1.3.0 // indirect
 )

+ 209 - 26
JySEPlatform/go.sum

@@ -1,9 +1,13 @@
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
 app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
+app.yhyue.com/moapp/jyResourcesCenter v0.0.0-20250214055745-d8494f27f5d5 h1:p1XMs8MoxdwSEoVhVng5GL/eMNXVuH86oqPgj9IyZ3Q=
+app.yhyue.com/moapp/jyResourcesCenter v0.0.0-20250214055745-d8494f27f5d5/go.mod h1:sT/02sF4CuTIGVzYjVix3lHK4EEJRZssS7mydYyr5m4=
 app.yhyue.com/moapp/jybase v0.0.0-20241028060726-9b8837ab6e42 h1:W4vYVQtoPsSCor6mO1iTjQlucodrxXeN38fKiWkPhE4=
 app.yhyue.com/moapp/jybase v0.0.0-20241028060726-9b8837ab6e42/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/Chain-Zhang/pinyin v0.1.3 h1:RzErNyNwVa8z2sOLCuXSOtVdY/AsARb8mBzI2p2qtnE=
 github.com/Chain-Zhang/pinyin v0.1.3/go.mod h1:5iHpt9p4znrnaP59/hfPMnAojajkDxQaP9io+tRMPho=
@@ -15,17 +19,31 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE=
+github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
+github.com/alicebob/miniredis/v2 v2.34.0 h1:mBFWMaJSNL9RwdGRyEDoAAv8OQc5UlEhLDQggTglU/0=
+github.com/alicebob/miniredis/v2 v2.34.0/go.mod h1:kWShP4b58T1CW0Y5dViCd5ztzrDqRWqM3nksiyXk5s8=
 github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
 github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
+github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
+github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
+github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
+github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
+github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
+github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -34,7 +52,11 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH
 github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
+github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
 github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250/go.mod h1:zX8vynptAghuV/KG8BOZlDeo4DsTKWfBQ154RWlkay0=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -42,8 +64,12 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o=
 github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
 github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4/go.mod h1:L7S4x0R7vv3xoOhGuyAJyCO2MYzWOpccM4Isn8jIUgY=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
+github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -51,6 +77,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
 github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
@@ -63,25 +91,36 @@ github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vb
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
+github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU=
+github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
-github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
+github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-xweb/httpsession v0.0.0-20141220075701-356d3b4d38d6 h1:DUiWdm3rS8cC96Y0XeVkDeizzEK6X+qiNgXytLVtbkM=
-github.com/go-xweb/httpsession v0.0.0-20141220075701-356d3b4d38d6/go.mod h1:lwPk13GS+i/NK4FkMm68IcJrAwiu+HtjYa1Y4kW59aY=
-github.com/go-xweb/log v0.0.0-20140701090824-270d183ad77e h1:xmffs7hgrWpAOcquZrdlWpAEaAdlI9myaYcUUmhIP7k=
-github.com/go-xweb/log v0.0.0-20140701090824-270d183ad77e/go.mod h1:ASmYUSBf32lWkkNVX/pnOU4MLuUQpFH4qYHvWHt/l0w=
-github.com/go-xweb/uuid v0.0.0-20140604020037-d7dce341f851 h1:D46USD6oGNWzoJ/h5CWaFq3ELLoLoJzllJ03Xh78VYg=
-github.com/go-xweb/uuid v0.0.0-20140604020037-d7dce341f851/go.mod h1:OmDEC58ZYO1Esk+Uy32SB6LWof9lyROl7q76dBFOCWw=
-github.com/go-xweb/xweb v0.2.1 h1:u5t/ttuSfxiIMDTXj/Pouw9C2ASNABWT16JWHyrtdvY=
-github.com/go-xweb/xweb v0.2.1/go.mod h1:vPjYJgfidYAgBKIwiAyKFC1hfczlqsw9rRT8LtwrGew=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -96,11 +135,15 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=
 github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
+github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -112,18 +155,27 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gorilla/securecookie v1.1.2 h1:YCIWL56dvtr73r6715mJs5ZvhtnY73hBvEF8kXD8ePA=
 github.com/gorilla/securecookie v1.1.2/go.mod h1:NfCASbcHqRSY+3a8tlWJwsQap2VX5pwzwo4h3eOamfo=
 github.com/gorilla/sessions v1.4.0 h1:kpIYOp/oi6MG/p5PgxApU8srsSw9tuFbt46Lt7auzqQ=
 github.com/gorilla/sessions v1.4.0/go.mod h1:FLWm50oby91+hl7p/wRxDth9bWSuk0qVL2emc7lT5ik=
 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
+github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
 github.com/howeyc/fsnotify v0.9.0 h1:0gtV5JmOKH4A8SsFxG2BczSeXWWPvcMT0euZt5gDAxY=
 github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
@@ -138,71 +190,105 @@ github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
+github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 github.com/lauyoume/gopinyin v0.0.0-20150113020433-f8d942704e7f h1:yBnCmV9OOvxS+uXfDy/Uq/H4O7GbMbiHy7m5MCpCulE=
 github.com/lauyoume/gopinyin v0.0.0-20150113020433-f8d942704e7f/go.mod h1:JxpPpDSex9zv9VOpo5h/izRHRfD/jCYTFSBmgIIzR1M=
-github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd h1:DXxmBCahjva4Ox4AWOv6pR1Csv33zSj97SaLOElfIsw=
-github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd/go.mod h1:3w9PScemEkJoLw3OYvLWMoD8XRCmXgGwsSpT6pFpJ0g=
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
-github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE=
 github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
 github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
+github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/olivere/elastic v6.2.37+incompatible h1:UfSGJem5czY+x/LqxgeCBgjDn6St+z8OnsCuxwD3L0U=
 github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
 github.com/olivere/elastic/v7 v7.0.22 h1:esBA6JJwvYgfms0EVlH7Z+9J4oQ/WUADF2y/nCNDw7s=
 github.com/olivere/elastic/v7 v7.0.22/go.mod h1:VDexNy9NjmtAkrjNoI7tImv7FR4tf5zUA3ickqu5Pc8=
+github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
+github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
+github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg=
+github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg=
+github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c=
+github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
 github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
+github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
+github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
+github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
+github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
+github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
+github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
 github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
 github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
 github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@@ -211,9 +297,16 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf
 github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
 github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -221,8 +314,12 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
 github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
@@ -242,22 +339,64 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
+github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
+github.com/zeromicro/go-zero v1.8.0 h1:4g/8VW+fOyM51HZYPeI3mXIZdEX+Fl6SsdYX2H5PYw4=
+github.com/zeromicro/go-zero v1.8.0/go.mod h1:xDBF+/iDzj30zPvu6HNUIbpz1J6+/g3Sx9D/DytJfss=
 go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk=
+go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM=
 go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA=
+go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU=
 go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
+go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4=
+go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU=
 go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
-go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM=
-go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4=
+go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793SqyhzM=
+go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 h1:Mw5xcxMwlqoJd97vwPxA8isEaIoxsta9/Q51+TTJLGE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0/go.mod h1:CQNu9bj7o7mC6U7+CA/schKEYakYXWr79ucDHTMGhCM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0 h1:s0PHtIkN+3xrbDOpt2M8OTG92cWqUESvzh2MxiR5xY8=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.24.0/go.mod h1:hZlFbDbRt++MMPCCfSJfmhkGIWnX1h3XjkfxZUjLrIA=
+go.opentelemetry.io/otel/exporters/zipkin v1.24.0 h1:3evrL5poBuh1KF51D9gO/S+N/1msnm4DaBqs/rpXUqY=
+go.opentelemetry.io/otel/exporters/zipkin v1.24.0/go.mod h1:0EHgD8R0+8yRhUYJOGR8Hfg2dpiJQxDOszd5smVO9wM=
+go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
+go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
+go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw=
+go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
+go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
+go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
+go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
+go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
+go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
 go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
 go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
 go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
+go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
+go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -265,8 +404,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
-golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -299,11 +438,13 @@ golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
-golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
-golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
+golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
+golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
+golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -315,8 +456,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
-golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -341,13 +482,19 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -356,8 +503,10 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
-golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
+golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -368,10 +517,13 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
 golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -385,6 +537,10 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
 google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
 google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
+google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d h1:kHjw/5UfflP/L5EbledDrcG4C2597RtymmGRZvHiCuY=
+google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 h1:BwIjyKYGsK9dMCBOorzRri8MQwmi7mT9rGHsCEinZkA=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
@@ -395,6 +551,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG
 google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
 google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
+google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -408,6 +566,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
+google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -416,6 +576,10 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
+gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
+gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
+gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
+gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -424,6 +588,7 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -435,4 +600,22 @@ gorm.io/gorm v1.21.3 h1:qDFi55ZOsjZTwk5eN+uhAmHi8GysJ/qCTichM/yO7ME=
 gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+k8s.io/api v0.29.3 h1:2ORfZ7+bGC3YJqGpV0KSDDEVf8hdGQ6A03/50vj8pmw=
+k8s.io/api v0.29.3/go.mod h1:y2yg2NTyHUUkIoTC+phinTnEa3KFM6RZ3szxt014a80=
+k8s.io/apimachinery v0.29.4 h1:RaFdJiDmuKs/8cm1M6Dh1Kvyh59YQFDcFuFTSmXes6Q=
+k8s.io/apimachinery v0.29.4/go.mod h1:i3FJVwhvSp/6n8Fl4K97PJEP8C+MM+aoDq4+ZJBf70Y=
+k8s.io/client-go v0.29.3 h1:R/zaZbEAxqComZ9FHeQwOh3Y1ZUs7FaHKZdQtIc2WZg=
+k8s.io/client-go v0.29.3/go.mod h1:tkDisCvgPfiRpxGnOORfkljmS+UrW+WtXAy2fTvXJB0=
+k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0=
+k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo=
+k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
+k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
+k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
+sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
+sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
 sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
+sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=

+ 15 - 15
JySEPlatform/service/customer_service.go

@@ -704,7 +704,7 @@ func (c *Customer) CuserRuleSetup() {
 func (c *Customer) ProductData() {
 	defer qu.Catch()
 	if c.Method() == "POST" {
-		rep := false
+		//rep := false
 		id := c.GetString("id")
 		tag, ok := Mgo.FindById("cuserdepartrule", id, `{}`)
 		if !ok {
@@ -768,20 +768,20 @@ func (c *Customer) ProductData() {
 			}
 
 		}
-		err, count := UtilEsFind1(*tag)
-		var msg string
-		if err == nil {
-			rep = true
-			msg = "数据生成成功"
-		} else {
-			rep = false
-			msg = "数据生成失败"
-		}
-		c.ServeJson(map[string]interface{}{
-			"rep":   rep,
-			"count": count,
-			"msg":   msg,
-		})
+		//err, count := UtilEsFind1(*tag)
+		//var msg string
+		//if err == nil {
+		//	rep = true
+		//	msg = "数据生成成功"
+		//} else {
+		//	rep = false
+		//	msg = "数据生成失败"
+		//}
+		//c.ServeJson(map[string]interface{}{
+		//	"rep":   rep,
+		//	"count": count,
+		//	"msg":   msg,
+		//})
 	}
 }
 

+ 209 - 104
JySEPlatform/service/private_service.go

@@ -2,6 +2,8 @@ package service
 
 import (
 	. "JySEPlatform/util"
+	"app.yhyue.com/moapp/jyResourcesCenter/rpc/resourcesCenter"
+	"app.yhyue.com/moapp/jybase/mongodb"
 	"encoding/json"
 	"fmt"
 	"io/ioutil"
@@ -16,7 +18,6 @@ import (
 	qu "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/encrypt"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
-	"app.yhyue.com/moapp/jybase/redis"
 	"github.com/tealeg/xlsx"
 	"go.mongodb.org/mongo-driver/bson"
 )
@@ -31,8 +32,9 @@ var (
 
 type Private struct {
 	*xweb.Action
-	keydatademo   xweb.Mapper `xweb:"/private/keydatademo/(.*)"`   //加密串
-	keydataoption xweb.Mapper `xweb:"/private/keydataoption/(.*)"` //加密串
+	keydatademo    xweb.Mapper `xweb:"/private/keydatademo/(.*)"`    //加密串
+	keydataoption  xweb.Mapper `xweb:"/private/keydataoption/(.*)"`  //加密串
+	keydataaccount xweb.Mapper `xweb:"/private/keydataaccount/(.*)"` //确认账户扣费情况
 }
 
 func (f *Private) Keydatademo(world string) {
@@ -48,11 +50,8 @@ func (f *Private) Keydatademo(world string) {
 			(*tagfield)["s_customer"] = (*customer)["name"]
 		}
 		entId := qu.IntAll((*tagfield)["entId"])
-		entUserId := qu.IntAll((*tagfield)["entUserId"])
+		appid := qu.ObjToString((*tagfield)["appid"])
 		dataConfig, _ := Mgo.FindOne("datatag_export_config", map[string]interface{}{"ent_id": entId})
-		current := GetCurrentCount2(entId, entUserId)
-		log.Println("数据余额", current)
-		tmp["current"] = current
 		if (*tagfield) != nil && len(*tagfield) > 0 {
 			if qu.IntAll((*dataConfig)["dataType"]) == Standard {
 				tmp["fieldtype"] = Standardstr
@@ -67,6 +66,7 @@ func (f *Private) Keydatademo(world string) {
 			tmp["fields"] = (*dataConfig)["fields"]
 			tmp["total"] = qu.Int64All((*tagfield)["i_estotal"])
 			tmp["customername"] = qu.ObjToString((*tagfield)["s_customer"])
+			var infoids []string
 			datas, _ := Mgo.Find("tagsdata", bson.M{"s_dataid": world}, `{"publishtime":-1}`, nil, false, -1, -1)
 			if (*datas) != nil && len(*datas) > 0 {
 				matchskey := make(map[string]bool)
@@ -79,12 +79,13 @@ func (f *Private) Keydatademo(world string) {
 					delete(v, "s_dataid")
 					delete(v, "i_createtime")
 					delete(v, "filetext")
-					uinfo, b := MgoSave.FindOneByField(SaveUserMail, bson.M{"id": v["id"], "appid": v["appid"]}, bson.M{"id": 1})
-					if b && len(*uinfo) > 0 {
-						v["usermail_exist"] = true
-					} else {
-						v["usermail_exist"] = false
-					}
+					infoids = append(infoids, qu.ObjToString(v["id"]))
+					//uinfo, b := MgoSave.FindOneByField(SaveUserMail, bson.M{"id": v["id"], "appid": v["appid"]}, bson.M{"id": 1})
+					//if b && len(*uinfo) > 0 {
+					//	v["usermail_exist"] = true
+					//} else {
+					//	v["usermail_exist"] = false
+					//}
 					if v["bidamount"] != nil {
 						v["bidamount"] = qu.Float64All(fmt.Sprintf("%f", qu.Float64All(v["bidamount"])))
 					}
@@ -158,112 +159,227 @@ func (f *Private) Keydatademo(world string) {
 					}
 					tmp["keylist"] = append(tmp["keylist"].([]string), k)
 				}
+				repeatReq := map[string]interface{}{
+					"appid": appid,
+					"ids":   infoids,
+				}
+				repeatResp, err := RepeatRpc(repeatReq)
+				if err != nil {
+					log.Println("数据去重rpc接口调用失败: ", err.Error())
+				} else {
+					for _, v := range rdata {
+						if repeatResp[qu.ObjToString(v["id"])] {
+							v["usermail_exist"] = false
+						} else {
+							v["usermail_exist"] = true
+						}
+					}
+				}
 				tmp["data"] = rdata
 			}
+
 		}
+
 	}
 	f.ServeJson(tmp)
 }
 
 func (f *Private) Keydataoption(world string) {
 	// destr := qu.SE.DecodeString(world)
+	sessVal := f.Session().GetMultiple()
 	tmp := make(map[string]interface{})
-	idMap := make(map[string]bool)
 	infoArr := []map[string]interface{}{}
 	bytes := f.Body()
 	err := json.Unmarshal(bytes, &tmp)
-	newCount := 0
+	entId := qu.IntAll(sessVal["entId"])
+	entUserId := qu.IntAll(sessVal["entUserId"])
+	userId := qu.ObjToString(sessVal["userId"])
+	phone := qu.ObjToString(sessVal["phone"])
 	datas, _ := Mgo.FindOne("entniche_rule", bson.M{"s_dataid": world})
-	entId := qu.IntAll((*datas)["entId"])
-	entUserId := qu.IntAll((*datas)["entUserId"])
+	appid := qu.ObjToString((*datas)["appid"])
 	dataConfig, _ := Mgo.FindOne("datatag_export_config", map[string]interface{}{"ent_id": entId})
-	current := GetCurrentCount2(entId, entUserId)
-	userData := JyMysql.FindOne("entniche_user", map[string]interface{}{"id": entUserId}, "phone", "")
-	phone := ""
-	if userData != nil && len(*userData) > 0 {
-		phone = qu.ObjToString((*userData)["phone"])
+	var newIdArr []string
+	exportIds := qu.ObjArrToStringArr(tmp["urls"].([]interface{}))
+	repeatReq := map[string]interface{}{
+		"appid": appid,
+		"ids":   exportIds,
 	}
-	log.Println("数据余额", current)
-	filterStr := ""
-	isFirst := tmp["isFirst"].(bool)
-	newIdArr := []string{}
-	if err == nil {
-		if idArr, ok := tmp["urls"].([]interface{}); ok {
-			// idsArr := []string{}
-			for _, v := range idArr {
-				// idsArr = append(idsArr, v.(string))
-				idMap[v.(string)] = true
-			}
-			// filterStr = strings.Join(idsArr, ",")
-		}
-		res, ok := Mgo.Find("tagsdata", bson.M{"s_dataid": world}, `{"publishtime":-1}`, nil, false, -1, -1)
-		if ok && res != nil && *res != nil && len(*res) > 0 {
-			for _, v := range *res {
-				infoid := qu.ObjToString(v["info_id"])
-				if idMap[infoid] {
-					isExist, err := redis.Exists("export", "entexportdata_"+infoid+"_"+fmt.Sprintln(entId))
-					if err != nil {
-						log.Println("企业订阅数据导出redis判重失败")
-					} else if isExist {
-						log.Println("数据重复,id ", infoid, "entid ", entId, "userid ", entUserId)
-					} else {
-						newCount++
-					}
-					if !isFirst {
-						v["id"] = infoid
-						v["jybxhref"] = v["s_jyhref"]
-						v["createtime"] = time.Now().Unix()
-						v["phone"] = phone
-						delete(v, "_id")
-						newIdArr = append(newIdArr, infoid)
-					}
-					v["datasource"] = "自助导出"
-					v["chargtime"] = time.Now().Unix()
-					infoArr = append(infoArr, v)
-				}
+	var repeatResp = make(map[string]bool)
+	repeatResp, err = RepeatRpc(repeatReq)
+	if err != nil {
+		log.Println("数据去重rpc接口调用失败")
+	}
+	for id := range repeatResp {
+		newIdArr = append(newIdArr, id)
+	}
+	var resp *resourcesCenter.ChargeResp
+	resp, err = ChargeRpc(&resourcesCenter.ChargeReq{
+		EntId:      int64(entId),
+		UserId:     qu.ObjToString(sessVal["userId"]),
+		EntUserId:  qu.Int64All(sessVal["entUserId"]),
+		ExportNum:  int64(len(exportIds)),
+		DeductNum:  int64(len(newIdArr)),
+		ChargeType: int32(qu.IntAll(tmp["chargeType"])),
+		Source:     1,
+	})
+	if err != nil {
+		log.Fatal("扣费rpc接口调用失败")
+	}
+	if resp.Code == 0 {
+		f.ServeJson(map[string]interface{}{"err": resp.Message})
+	}
+	if resp.Data.ChargeResult == 0 {
+		// 扣费失败
+		f.ServeJson(map[string]interface{}{
+			"isExport":   false,
+			"count":      len(exportIds),
+			"newCount":   len(newIdArr),
+			"chargeType": resp.Data.ChargeType,
+			"current":    resp.Data.Num1,
+			"num2":       qu.If(resp.Data.Num2 == 0, nil, resp.Data.Num2), // 每日导出限额
+			"num4":       qu.If(resp.Data.Num4 == 0, nil, resp.Data.Num4), // 导出总限额
+			"num3":       resp.Data.Num3,                                  //当日可导出余额
+			"num5":       resp.Data.Num5,
+		})
+	}
+	infos, ok := Mgo.Find("tagsdata", bson.M{"s_dataid": world}, `{"publishtime":-1}`, nil, false, -1, -1)
+	if ok && infos != nil && *infos != nil && len(*infos) > 0 {
+		for _, v := range *infos {
+			bid := qu.ObjToString(v["info_id"])
+			if strings.Contains(strings.Join(exportIds, ","), bid) {
+				v["id"] = bid
+				v["jybxhref"] = v["s_jyhref"]
+				v["createtime"] = time.Now().Unix()
+				v["phone"] = phone
+				delete(v, "_id")
+				v["datasource"] = "自助导出"
+				v["chargtime"] = time.Now().Unix()
+				infoArr = append(infoArr, v)
 			}
 		}
 	}
-	log.Println("数据量", len(infoArr))
-	log.Println("新导出", newCount)
-	isExport := true
-	if newCount > current {
-		isExport = false
-	} else {
+	log.Println("Keydataoption 数据量", len(newIdArr))
+	log.Println("Keydataoption 新导出", len(infoArr))
+	if len(infoArr) > 0 {
+		fields := []map[string]interface{}{}
+		dataType := qu.IntAll((*dataConfig)["dataType"])
+		if (*dataConfig)["fields"] != nil {
+			fieldsArr := qu.ObjArrToMapArr((*dataConfig)["fields"].([]interface{}))
+			fields = fieldsArr
+		}
+		s_name := qu.ObjToString((*datas)["s_name"])
+		xlsxUrl := GetXlsxfile(infoArr, dataType, s_name, fields)
+		log.Println("生成完成", xlsxUrl)
+		filter := make(map[string]interface{})
+		if qu.ObjToString((*datas)["s_area"]) != "" {
+			filter["Area"] = qu.ObjToString((*datas)["s_area"])
+		}
+		if qu.ObjToString((*datas)["s_city"]) != "" {
+			filter["Area"] = qu.ObjToString((*datas)["s_city"])
+		}
+		if qu.Int64All((*datas)["i_starttime"]) > 0 && qu.Int64All((*datas)["i_endtime"]) > 0 {
+			filter["Time"] = fmt.Sprintf("%d_%d", qu.Int64All((*datas)["i_starttime"]), qu.Int64All((*datas)["i_endtime"]))
+		} else if qu.Int64All((*datas)["i_starttime"]) > 0 {
+			filter["Time"] = fmt.Sprintf("%d_", qu.Int64All((*datas)["i_starttime"]))
+		} else if qu.Int64All((*datas)["i_endtime"]) > 0 {
+			filter["Time"] = fmt.Sprintf("_%d", qu.Int64All((*datas)["i_endtime"]))
+		}
+		filter["Id"] = encrypt.SE.EncodeString(mongodb.BsonIdToSId((*datas)["_id"]))
+		filter["Comeinfrom"] = "customizedPage"
+		SaveExportLog2(entId, entUserId, len(infoArr), len(newIdArr), qu.IntAll(tmp["chargeType"]), userId, xlsxUrl, qu.MapToJson(filter), exportIds)
 		go func() {
-			for _, v := range newIdArr {
-				redis.Put("export", "entexportdata_"+v+"_"+fmt.Sprintln(entId), 1, -1)
+			for k, _ := range infoArr {
+				MgoSave.Save(SaveUserMail, infoArr[k])
 			}
 		}()
+		f.ServeJson(map[string]interface{}{"xlsxUrl": xlsxUrl, "isExport": true})
 	}
-	res := map[string]interface{}{
-		"count":    len(infoArr),
-		"newCount": newCount,
-		"current":  current,
-		"isExport": isExport,
+	f.ServeJson(map[string]interface{}{"err": "未选择数据"})
+}
+
+func (f *Private) Keydataaccount(world string) {
+	sessVal := f.Session().GetMultiple()
+	tmp := make(map[string]interface{})
+	bytes := f.Body()
+	err := json.Unmarshal(bytes, &tmp)
+	datas, _ := Mgo.FindOne("entniche_rule", bson.M{"s_dataid": world})
+	entId := qu.Int64All((*datas)["entId"])
+	entUserId := qu.Int64All((*datas)["entUserId"])
+	appid := qu.ObjToString((*datas)["appid"])
+	req := &resourcesCenter.ChargeAccountReq{
+		EntId:     entId,
+		UserId:    qu.ObjToString(sessVal["userId"]),
+		EntUserId: entUserId,
+	}
+	var resp *resourcesCenter.ChargeResp
+	resp, err = AccountRpc(req)
+	if err != nil {
+		log.Fatal("扣费方式rpc接口调用失败")
+	}
+	if resp.Code == 0 {
+		f.ServeJson(map[string]interface{}{"err": resp.Message})
+	}
+	log.Println("resp: ", resp)
+	log.Println("Keydataaccount 数据余额", resp.Data.Num1)
+	var newIdArr []string
+	exportIds := qu.ObjArrToStringArr(tmp["urls"].([]interface{}))
+	repeatReq := map[string]interface{}{
+		"appid": appid,
+		"ids":   exportIds,
+	}
+	var repeatResp = make(map[string]bool)
+	repeatResp, err = RepeatRpc(repeatReq)
+	if err != nil {
+		log.Println("数据去重rpc接口调用失败")
 	}
-	if !isFirst {
-		if len(infoArr) > 0 {
-			fields := []map[string]interface{}{}
-			dataType := qu.IntAll((*dataConfig)["dataType"])
-			if (*dataConfig)["fields"] != nil {
-				fieldsArr := qu.ObjArrToMapArr((*dataConfig)["fields"].([]interface{}))
-				fields = fieldsArr
+	for id := range repeatResp {
+		newIdArr = append(newIdArr, id)
+	}
+	log.Println("Keydataaccount 数据量", len(newIdArr))
+	log.Println("Keydataaccount 新导出", len(exportIds))
+	if resp.Data.ChargeType == 0 {
+		isExport := true
+		reason := make([]string, 0)
+		if resp.Data.Num2 == 0 && resp.Data.Num4 == 0 {
+			isExport = true
+		} else {
+			if int64(len(newIdArr)) > resp.Data.Num1 {
+				isExport = false
+				reason = append(reason, "企业数据流量包余额不足")
 			}
-			s_name := qu.ObjToString((*datas)["s_name"])
-			xlsxUrl := GetXlsxfile(infoArr, dataType, s_name, fields)
-			log.Println("生成完成", xlsxUrl)
-			exportId := SaveExportLog2(entId, entUserId, len(infoArr), newCount, xlsxUrl, "1", filterStr)
-			DeductNum2(entId, newCount, entUserId, exportId)
-			go func() {
-				for k, _ := range infoArr {
-					MgoSave.Save(SaveUserMail, infoArr[k])
-				}
-			}()
-			res["xlsxUrl"] = xlsxUrl
+			if resp.Data.Num2 > 0 && int64(len(newIdArr)) > resp.Data.Num3 {
+				isExport = false
+				reason = append(reason, "超出您的每日导出限额")
+			}
+			if resp.Data.Num4 > 0 && int64(len(newIdArr)) > resp.Data.Num5 {
+				isExport = false
+				reason = append(reason, "超出您的数据导出总量限额")
+			}
+		}
+		res := map[string]interface{}{
+			"count":      len(exportIds),
+			"newCount":   len(newIdArr),
+			"chargeType": resp.Data.ChargeType,
+			"current":    resp.Data.Num1,
+			"num2":       qu.If(resp.Data.Num2 == 0, nil, resp.Data.Num2), // 每日导出限额
+			"num4":       qu.If(resp.Data.Num4 == 0, nil, resp.Data.Num4), // 导出总限额
+			"num3":       resp.Data.Num3,                                  //当日可导出余额
+			"num5":       resp.Data.Num5,
+			"isExport":   isExport,
+			"reason":     strings.Join(reason, "、"),
+		}
+		f.ServeJson(res)
+	} else {
+		res := map[string]interface{}{
+			"count":      len(exportIds),
+			"newCount":   len(newIdArr),
+			"chargeType": resp.Data.ChargeType,
+			"current":    resp.Data.Num1,
+			"isExport":   qu.If(int64(len(newIdArr)) <= resp.Data.Num1, true, false),
 		}
+		f.ServeJson(res)
 	}
-	f.ServeJson(res)
+
 }
 
 func GetXlsxfile(mMap []map[string]interface{}, dataType int, fn string, fields []map[string]interface{}) string {
@@ -441,7 +557,7 @@ func GetXlsxfile(mMap []map[string]interface{}, dataType int, fn string, fields
 	fname := fmt.Sprintf("%s_%s_%s.xlsx", fn, t, qu.GetRandom(4))
 	log.Println("fname", fname)
 	err = xf.Save(dir + fname)
-	xlsxUrls := "/xlsx/" + t + "/" + fname
+	xlsxUrls := fmt.Sprintf("/customizedexport/%s/%s", t, fname)
 	return xlsxUrls
 }
 
@@ -456,17 +572,6 @@ func PathExists(path string) (bool, error) {
 	return false, err
 }
 
-type keynum struct {
-	Key string
-	Num int
-}
-
-func urlToId(url string) string {
-	url = pre.ReplaceAllString(url, "")
-	url = suf.ReplaceAllString(url, "")
-	return encrypt.CommonDecodeArticle("content", url)[0]
-}
-
 func deletefields(fieldnum int, data *map[string]interface{}) map[string]interface{} {
 	rdata := make(map[string]interface{})
 	one, _ := Mgo.FindOne("code_fields", bson.M{})

+ 64 - 0
JySEPlatform/service/resourceRpc.go

@@ -0,0 +1,64 @@
+package service
+
+import (
+	"JySEPlatform/util"
+	"app.yhyue.com/moapp/jyResourcesCenter/rpc/resourcesCenter"
+	"app.yhyue.com/moapp/jyResourcesCenter/rpc/resourcesCenterclient"
+	qu "app.yhyue.com/moapp/jybase/common"
+	"context"
+	"errors"
+	"log"
+	"net/rpc"
+)
+
+type RechargeResp struct {
+	Code    int64                  `json:"code"`
+	Message string                 `json:"message"`
+	Data    map[string]interface{} `json:"data"`
+}
+
+// AccountRpc
+// @Author jianghan
+// @Description 账号扣费选择
+// @Date 2025/2/8
+func AccountRpc(req *resourcesCenter.ChargeAccountReq) (resp *resourcesCenter.ChargeResp, err error) {
+	client := util.JyResources.NewClient()
+	if client == nil {
+		return nil, errors.New("jy资源中台连接创建失败")
+	}
+	resp, err = resourcesCenterclient.NewResourcesCenter(client).JyExportChargeAmount(context.Background(), req)
+	return resp, err
+}
+
+// ChargeRpc
+// @Author jianghan
+// @Description 扣费
+// @Date 2025/2/10
+func ChargeRpc(req *resourcesCenter.ChargeReq) (resp *resourcesCenter.ChargeResp, err error) {
+	client := util.JyResources.NewClient()
+	if client == nil {
+		return nil, errors.New("jy资源中台连接创建失败")
+	}
+	log.Println("ChargeRpc req: ", req)
+	resp, err = resourcesCenterclient.NewResourcesCenter(client).JyExportCharge(context.Background(), req)
+	return resp, err
+}
+
+// RepeatRpc
+// @Author jianghan
+// @Description 数据去重rpc
+// @Date 2025/2/10
+func RepeatRpc(req map[string]interface{}) (map[string]bool, error) {
+	client, err := rpc.DialHTTP("tcp", qu.ObjToString(util.Sysconfig["repeat_rpc"]))
+	defer client.Close()
+	if err != nil {
+		return nil, err
+	}
+	log.Println("RepeatRpc: ", req)
+	var resp = make(map[string]bool)
+	if err = client.Call("RemoveRepeat.NoRepeat", req, &resp); err != nil {
+		log.Println("RemoveRepeat.NoRepeat", "err", err.Error())
+		return nil, err
+	}
+	return resp, nil
+}

+ 6 - 0
JySEPlatform/util/config.go

@@ -12,6 +12,7 @@ import (
 	"golang.org/x/text/transform"
 	"io/ioutil"
 	"sort"
+	"strings"
 )
 
 var (
@@ -53,6 +54,8 @@ var (
 	ExtractColl     string
 	JyMysql         *mysql.Mysql
 	IsNewSql        int
+
+	JyResources *jyResourceCenter
 )
 
 var (
@@ -119,6 +122,9 @@ func InitOther() {
 	// initBuryClassType()
 	// initProvince()
 	IsNewSql = qu.IntAll(Sysconfig["isNewSql"])
+
+	rpcSources := qu.ObjToMap(Sysconfig["jyResourceRpc"])
+	JyResources = newJyResourceCenter(strings.Split(qu.ObjToString((*rpcSources)["hosts"]), ","), qu.ObjToString((*rpcSources)["key"]))
 }
 
 func initCitys() {

+ 21 - 21
JySEPlatform/util/cost_util.go

@@ -2,9 +2,10 @@ package util
 
 import (
 	qu "app.yhyue.com/moapp/jybase/common"
-	"app.yhyue.com/moapp/jybase/date"
 	"database/sql"
+	"fmt"
 	"log"
+	"strings"
 	"time"
 )
 
@@ -63,35 +64,34 @@ func DeductNum2(entId int, newCount int, userId int, exportId int64) bool {
 }
 
 // 存导出日志
-func SaveExportLog2(entId, entUserId, count, newCount int, xlsxUrl, types, filterStr string) (exportId int64) {
+func SaveExportLog2(entId, entUserId, count, newCount, chargeType int, userId, xlsxUrl, filter string, ids []string) {
 	query := map[string]interface{}{
 		"id":     entUserId,
 		"ent_id": entId,
 	}
-	// set := map[string]interface{}{
-	// 	"remain_nums": remain_nums - newCount,
-	// 	"export_nums": export_nums + newCount,
-	// }
-	// ok := JyMysql.Update("entniche_export_limit", map[string]interface{}{"ent_id": entId, "user_id": entUserId}, set)
-	// if !ok {
-	// 	log.Println("修改导出条数失败", query, remain_nums, newCount)
-	// }
 	userData := JyMysql.FindOne("entniche_user", query, "name,phone", "")
 	if userData != nil {
 		name := qu.ObjToString((*userData)["name"])
 		phone := qu.ObjToString((*userData)["phone"])
 		now := time.Now()
-		exportId = JyMysql.Insert("entniche_export_log", map[string]interface{}{
-			"user_name":    name,
-			"export_time":  date.FormatDate(&now, date.Date_Full_Layout),
-			"data_source":  "3",
-			"export_num":   count,
-			"deduct_num":   newCount,
-			"download_url": xlsxUrl,
-			"ent_id":       entId,
-			"phone":        phone,
-			"user_id":      entUserId,
-			"filter":       filterStr,
+		JyMysql.Insert("datapacket_record", map[string]interface{}{
+			"infoids":     strings.Join(ids, ","),
+			"type":        qu.If(chargeType == 0, 3, 2),
+			"master_id":   userId,
+			"useid":       userId,
+			"query_id":    "",
+			"date":        now.Unix(),
+			"export_num":  count,
+			"deduct_num":  newCount,
+			"path":        xlsxUrl,
+			"phone":       phone,
+			"mail":        "",
+			"isSenior":    2,
+			"ent_id":      entId,
+			"ent_user_id": entUserId,
+			"operator":    fmt.Sprintf("%s(%s)", name, phone),
+			"source":      1,
+			"filter":      filter,
 		})
 	}
 	return

+ 40 - 0
JySEPlatform/util/jyResourceCenter.go

@@ -0,0 +1,40 @@
+package util
+
+import (
+	"github.com/zeromicro/go-zero/core/discov"
+	"github.com/zeromicro/go-zero/zrpc"
+	"log"
+)
+
+type jyResourceCenter struct {
+	hosts  []string
+	key    string
+	client zrpc.Client
+}
+
+func newJyResourceCenter(hosts []string, key string) *jyResourceCenter {
+	r := &jyResourceCenter{
+		hosts: hosts,
+		key:   key,
+	}
+	r.client = r.NewClient()
+	return r
+}
+
+func (p *jyResourceCenter) NewClient() zrpc.Client {
+	if p.client != nil && p.client.Conn() != nil {
+		return p.client
+	}
+	client, err := zrpc.NewClient(zrpc.RpcClientConf{
+		Etcd: discov.EtcdConf{
+			Hosts: p.hosts,
+			Key:   p.key,
+		},
+	})
+	if err != nil {
+		log.Println(err)
+		return nil
+	}
+	p.client = client
+	return client
+}

+ 28 - 15
JySEPlatform/util/utiltag.go

@@ -3,6 +3,7 @@ package util
 import (
 	"JySEPlatform/models"
 	sql "JySEPlatform/sqlmodel"
+	"app.yhyue.com/moapp/jybase/mongodb"
 	"context"
 	"encoding/json"
 	"errors"
@@ -15,7 +16,6 @@ import (
 	qu "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/encrypt"
 	elastic "app.yhyue.com/moapp/jybase/es"
-	"app.yhyue.com/moapp/jybase/mongodb"
 	es "github.com/olivere/elastic/v7"
 	"go.mongodb.org/mongo-driver/bson"
 )
@@ -56,6 +56,7 @@ const (
 
 func UtilEsSaveData(sdataid string, datas *[]map[string]interface{}) error {
 	defer qu.Catch()
+	log.Println("保存数据---", sdataid)
 	if !Mgo.Del("tagsdata", bson.M{"s_dataid": sdataid}) {
 		return errors.New("mongo del err")
 	}
@@ -80,9 +81,11 @@ func (m *MySource) Source() (interface{}, error) {
 	return mp["query"], nil
 }
 
+// data_result, 0: 数据生成中,1: 成功,-1: 失败
 // 客户规则
-func UtilEsFind1(tags map[string]interface{}) (error, int64) {
+func UtilEsFind1(tags map[string]interface{}) {
 	defer qu.Catch()
+	Mgo.UpdateById("entniche_rule", tags["_id"], bson.M{"$set": bson.M{"data_result": 0}})
 	ch := make(chan bool, 20)
 	wg := &sync.WaitGroup{}
 	arrsync := &sync.RWMutex{}
@@ -94,7 +97,9 @@ func UtilEsFind1(tags map[string]interface{}) (error, int64) {
 	clearKey := qu.ObjToString(tags["s_globalclearkey"])
 	clearKeyMatch := qu.ObjToString(tags["s_globalclearkeymatch"])
 	if len(esquery) < 1 || len(sdataid) < 1 {
-		return errors.New("s_esquery or s_dataid no found"), 0
+		log.Println("s_esquery or s_dataid no found")
+		Mgo.UpdateById("entniche_rule", tags["_id"], bson.M{"$set": bson.M{"data_result": -1}})
+		return
 	}
 	i_maxnum := qu.Int64All(tags["i_maxnum"])
 	if i_maxnum <= 0 {
@@ -118,7 +123,9 @@ func UtilEsFind1(tags map[string]interface{}) (error, int64) {
 			})
 		}
 	} else {
-		return errors.New("o_rules no found"), 0
+		log.Println("o_rules no found")
+		Mgo.UpdateById("entniche_rule", tags["_id"], bson.M{"$set": bson.M{"data_result": -1}})
+		return
 	}
 	ctx, _ := context.WithTimeout(context.Background(), 1*time.Hour)
 	esCon := elastic.VarEs.(*elastic.EsV7)
@@ -139,10 +146,8 @@ func UtilEsFind1(tags map[string]interface{}) (error, int64) {
 			go func(tmpHit *es.SearchHit) {
 				defer func() {
 					<-ch
-					arrsync.Unlock()
 					wg.Done()
 				}()
-				arrsync.Lock()
 				item := make(map[string]interface{})
 				if json.Unmarshal(tmpHit.Source, &item) == nil {
 					item["appid"] = tags["appid"]
@@ -150,8 +155,6 @@ func UtilEsFind1(tags map[string]interface{}) (error, int64) {
 					info_id := qu.ObjToString(item["id"])
 					item["info_id"] = info_id
 					item["s_dataid"] = sdataid
-					// item["s_jyhref"] = fmt.Sprintf(Url, util.CommonEncodeArticle("content", info_id))
-					//
 					subType := qu.ObjToString(item["subtype"])
 					subTypeStr := "拟建,采购意向,预告,预审,预审结果,论证意见,需求公示"
 					if strings.Contains(subTypeStr, subType) {
@@ -223,10 +226,10 @@ func UtilEsFind1(tags map[string]interface{}) (error, int64) {
 							}
 						}
 					}
-					//匹配公告附件
-					info, _ := MgoBidding.FindOne("bidding", bson.M{"_id": mongodb.StringTOBsonId(info_id)})
+					//匹配公告附件和链接
+					info, _ := MgoBidding.FindOneByField("bidding", bson.M{"_id": mongodb.StringTOBsonId(info_id)}, bson.M{"projectinfo": 1, "competehref": 1})
 					if info != nil {
-						log.Println("id", item["info_id"])
+						log.Println("匹配附件, id-", item["info_id"])
 						if (*info)["projectinfo"] != nil {
 							projectInfo := qu.ObjToMap((*info)["projectinfo"])
 							if projectInfo != nil && len(*projectInfo) > 0 {
@@ -261,6 +264,13 @@ func UtilEsFind1(tags map[string]interface{}) (error, int64) {
 								}
 							}
 						}
+						if (*info)["competehref"] != nil {
+							if href := qu.ObjToString(item["href"]); strings.Contains(href, "https://www.jianyu360.cn") {
+								if qu.ObjToString(item["competehref"]) != "" && qu.ObjToString(item["competehref"]) != "#" {
+									item["href"] = qu.ObjToString(item["competehref"])
+								}
+							}
+						}
 					} else {
 						log.Println("id", item["info_id"], "bidding为空")
 					}
@@ -269,25 +279,27 @@ func UtilEsFind1(tags map[string]interface{}) (error, int64) {
 					//if projectId != "" {
 					//	item["projectId"] = SE2.EncodeString(projectId)
 					//}
+
+					arrsync.Lock()
 					datas = append(datas, item)
+					arrsync.Unlock()
 				} else {
 					log.Println("id", item["_id"], "信息为空")
 				}
 			}(v)
 		}
 		wg.Wait()
-
 		GetProjectId(&datas)
-
 		count := Es.Count(EsIndex, EsType, esquery)
 		Mgo.Update("entniche_rule", bson.M{"_id": tags["_id"]}, bson.M{
 			"$set": bson.M{
 				"i_estotal": count,
 			}}, false, false)
-		return UtilEsSaveData(sdataid, &datas), count
+		UtilEsSaveData(sdataid, &datas)
+		Mgo.UpdateById("entniche_rule", tags["_id"], bson.M{"$set": bson.M{"data_result": 1}})
 	} else {
 		log.Println(err)
-		return err, 0
+		Mgo.UpdateById("entniche_rule", tags["_id"], bson.M{"$set": bson.M{"data_result": -1}})
 	}
 }
 
@@ -986,6 +998,7 @@ func chunkArray(arr []string, size int) [][]string {
 
 func GetProjectId(datas *[]map[string]interface{}) (pidMap map[string]interface{}) {
 	var ids []string
+	pidMap = make(map[string]interface{})
 	for _, d1 := range *datas {
 		id := qu.ObjToString(d1["info_id"])
 		ids = append(ids, id)

+ 14 - 9
JySEPlatform/web/templates/client/adminIndex.html

@@ -1,6 +1,14 @@
 {{include "com/inc.html"}}
 <!-- Main Header -->
 {{include "com/header.html"}}
+
+<style>
+    .suffix-label-tip {
+        margin-left: 20px;
+        color: red;
+        font-size: 18px;
+    }
+</style>
 <div class="content-wrapper" style="margin-left: 0" >
 
     <!-- Main content -->
@@ -22,11 +30,6 @@
                                     </div> -->
                                     <table id="departTable" class="table table-bordered">
                                         <thead>
-                                        <!-- <div style="margin: 10px 10px 0px;">
-                                            <a class="btn btn-default" onclick="showDepart()">新增</a>
-                                            <a class="btn btn-default" onclick="modify_Depart()">修改</a>
-                                            <a class="btn btn-default" onclick="del_Depart()">删除</a>
-                                        </div> -->
                                         <tr>
                                             <!-- <th></th> -->
                                             <th>编号</th>
@@ -78,7 +81,7 @@
     var entUserArr = {{.T.entUserArr}}
 
     $(document).ready(function () {
-        $('#departTable').DataTable({
+        var table = $('#departTable').DataTable({
             "paging": true,
             "lengthChange": true,
             "searching": true,
@@ -128,15 +131,17 @@
                 {
                     "data": "_id", width: "20%", render: function (val, a, row, pos) {
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" href="/seplatform/personnel/index?id='+ row.id +'">规则列表</a>&nbsp&nbsp'+
-                            '<a class="btn btn-sm btn-primary" href="/seplatform/client/exportLog?id='+ row.id +'">导出日志</a>&nbsp&nbsp'+
+                            '<a class="btn btn-sm btn-primary" style="background-color: #2ABED1;border-color: #2ABED1" href="/seplatform/personnel/index?id='+ row.id +'">规则列表</a>&nbsp&nbsp'+
+                            // '<a class="btn btn-sm btn-primary" href="/seplatform/client/exportLog?id='+ row.id +'">导出日志</a>&nbsp&nbsp'+
                             '</div>';
                         return tmp
                     }
                 }
             ],
         });
-
+        // setTimeout(function () {
+        //     $('#departTable_length').append("<span class='suffix-label-tip'>注:仅展示设置了数据定制导出规则的人员</span>")
+        // }, 200)
     })
 
     function singleSelect1(obj) {

+ 48 - 30
JySEPlatform/web/templates/client/cuser_rule_edit.html

@@ -48,8 +48,8 @@
                 <form style="display:none" id='uploadform' method='post'>
                     <input type='file' name='xlsx' id='file'/>
                 </form>
-                <a class="btn btn-sm btn-instagram previewDatass" onclick="previewData1()"><i class="fa fa-fw fa-database fa-lg"></i>快速预览</a>
-                <button class="btn btn-warning btn-sm previewDatass" onclick="previewData()"><i class="fa fa-fw fa-eye fa-lg"></i>数据导出</button>
+                <a class="btn btn-sm btn-instagram" onclick="previewData1()"><i class="fa fa-fw fa-database fa-lg"></i>快速预览</a>
+                <button class="btn btn-warning btn-sm" onclick="previewData()"><i class="fa fa-fw fa-eye fa-lg"></i>数据导出</button>
                 <button class="btn btn-warning btn-sm" onclick="exportPreview()"><i class="fa fa-fw fa-eye fa-lg"></i>导出预览</button>
             </small>
             <a class="btn btn-primary btn-sm" id="back" style="float: right"> 返回</a>
@@ -1697,43 +1697,61 @@
         })
     }
 
+    let pollingInterval = null
     //生成数据
     function produceData() {
         com.maskShow("正在生成数据...");
-        var isOk = true
-        setTimeout(function(){
-            $.ajax({
-                url: "/seplatform/customerRule/cuser/produce",
-                type: "post",
-                data: {"id": dataMap.id},
-                async: false,
-                success: function (r) {
-                    if (r.msg){
-                        com.maskHide();
-                        isOk = false
-                        showTip(r.msg, 30000);
-                    }
-                },
-                error: function (r) {
-                    com.maskHide();
+        $.ajax({
+            url: "/seplatform/customerRule/cuser/produce",
+            type: "post",
+            data: {"id": dataMap.id},
+            async: false,
+            success: function (r) {
+                if (r.rep){
+                    // 轮询请求
+                    pollingInterval = setInterval(pollServer, 5000);
+                }else {
+                    showTip(r.msg, 30000);
                 }
-            })
-            if (isOk) {
-                com.maskShow("倒计时3s");
-                setTimeout(function(){
-                    com.maskShow("倒计时2s");
+            },
+            error: function (r) {
+                com.maskHide();
+            }
+        })
+    }
+
+    function pollServer() {
+        $.ajax({
+            url: '/seplatform/customerRule/cuser/product/result',  // 后端接口地址
+            type: 'post',
+            data: {"id": dataMap.id},
+            success: function(r) {
+                if (r.status === 'success') {
+                    com.maskHide();
+                    isOk = true;
+                    clearInterval(pollingInterval);  // 任务完成,停止轮询
+
+                    com.maskShow("倒计时3s");
                     setTimeout(function(){
-                        com.maskShow("倒计时1s");
+                        com.maskShow("倒计时2s");
                         setTimeout(function(){
-                            com.maskShow("倒计时0s");
-                            var href = previewHref+"?type=private" + "&key=" + dataMap.s_dataid;
-                            window.open(href);
-                            com.maskHide();
+                            com.maskShow("倒计时1s");
+                            setTimeout(function(){
+                                com.maskShow("倒计时0s");
+                                exportPreview();
+                                com.maskHide();
+                            },1000)
                         },1000)
                     },1000)
-                },1000)
+
+                } else if (r.status === 'error') {
+                    showTip(r.msg, 30000);
+                }
+            },
+            error: function(r) {
+                com.maskHide();
             }
-        },1000)
+        });
     }
     
     function exportPreview(){

+ 6 - 6
JySEPlatform/web/templates/client/personnelIndex.html

@@ -5,10 +5,10 @@
 <div class="content-wrapper" id="showbtn" style="margin-left: 0">
     <section class="content-header">
         <h1>
-            <small><a id="addTag" class="btn btn-primary opr">新增规则</a></small>
-            <small style="color: #0a001f">数据量余额:</small><small><h4 id="left" style="color: red;"></h4></small>
-            <small style="color: #0a001f">条</small>
-            <a class="btn btn-primary opr" id="back" style="float: right" href="javascript:history.go(-1)"> 返回</a>
+            <small><a id="addTag" class="btn btn-primary opr" style="background-color: #2ABED1;border-color: #2ABED1">新增规则</a></small>
+<!--            <small style="color: #0a001f">数据量余额:</small><small><h4 id="left" style="color: red;"></h4></small>-->
+<!--            <small style="color: #0a001f">条</small>-->
+            <a class="btn btn-primary opr" id="back" style="float: right;background-color: #2ABED1;border-color: #2ABED1" href="javascript:history.go(-1)"> 返回</a>
         </h1>
     </section>
     <!-- Main content -->
@@ -117,8 +117,8 @@
                 {
                     "data": "_id", width: "10%", render: function (val, a, row, pos) {
                         tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" href="/seplatform/client/rule/edit?id='+ row._id +'">编辑</a>&nbsp;&nbsp;' +
-                            '<a class="btn btn-sm btn-danger" onclick="del(\'' + val + '\',\'' + row.i_isuse + '\')">删除</a>' +
+                            '<a class="btn btn-sm btn-primary" style="background-color: #2ABED1;border-color: #2ABED1" href="/seplatform/client/rule/edit?id='+ row._id +'">编辑</a>&nbsp;&nbsp;' +
+                            '<a class="btn btn-sm btn-danger" style="background-color: #FF3A20;border-color: #FF3A20" onclick="del(\'' + val + '\',\'' + row.i_isuse + '\')">删除</a>' +
                             '</div>';
                         return tmp
                     }

+ 68 - 0
JySEPlatform/web/templates/com/header.html

@@ -0,0 +1,68 @@
+
+<!-- common modal -->
+<div id="com-alert" class="modal" style="z-index:9999;display: none;" >
+    <div class="modal-dialog modal-sm" >
+        <div  class="modal-content" >
+            <div class="modal-header" >
+                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button>
+                <h5 class="modal-title"><i class="fa fa-exclamation-circle"></i> [Title]</h5>
+            </div>
+            <div class="modal-body small " >
+                <p style="font-size: 14px">[Message]</p>
+            </div>
+            <div class="modal-footer" >
+                <button type="button" class="btn btn-default cancel" data-dismiss="modal">[BtnCancel]</button>
+                <button type="button" class="btn btn-primary ok" data-dismiss="modal">[BtnOk]</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div id="modal-topuserinfo" class="modal fade">
+    <div class="modal-dialog">
+        <form id="topuserform" class="form-horizontal" role="form">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                        <span aria-hidden="true">&times;</span></button>
+                    <h4 class="modal-title">用户信息</h4>
+                </div>
+                <div class="modal-body">
+
+
+                    <div class="form-group">
+                        <label for="site" class="col-sm-2 control-label">姓名:</label>
+                        <div class="col-sm-8">
+                            <input id="t_name" type="text" value={{(session "user").name}} class="form-control" disabled>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="modify" class="col-sm-2 control-label">角色:</label>
+                        <div class="col-sm-8">
+                            <select id="t_role" class="form-control" disabled>
+                                <option value={{(session "user").role}}>
+                                <script>
+                                    role={{(session "user").role}};
+                                    if(role=="1"){
+                                        document.write("管理员")
+                                    }else if (role=="3"){
+                                        document.write("用户")
+                                    }
+                                </script>
+                                </option>
+                            </select>
+                        </div>
+                    </div>
+                    <div class="modal-footer">
+                        <!--			        <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>-->
+                        <!--			        <button type="button" class="btn btn-primary" onclick="t_save()">保存</button>-->
+                    </div>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+
+<!-- /.modal -->

+ 3 - 3
SEPlatform/config.json

@@ -219,11 +219,11 @@
     "jyMDBXQQIDCQBeSUdBITNf",
     "jyFApXQQIEAw5TTUZOMBpD"
   ],
-  "redis_addrs": "datag=192.168.3.11:1712,export=192.168.3.11:1712",
+  "redis_addrs": "datag=192.168.3.149:1712,export=192.168.3.149:1712",
   "jyMysql": {
     "username": "root",
-    "password": "Topnet123",
-    "address": "192.168.3.149:3306",
+    "password": "=PDT49#80Z!RVv52_z",
+    "address": "192.168.3.14:4000",
     "dbName": "jianyu"
   },
   "bidding_mgo": {