Răsfoiți Sursa

wip:合作商rpc 初始化

wangshan 1 an în urmă
părinte
comite
7a1f6124c8
43 a modificat fișierele cu 2172 adăugiri și 95 ștergeri
  1. 20 8
      go.mod
  2. 64 63
      go.sum
  3. 5 0
      rpc/partnerlib/README.md
  4. 19 0
      rpc/partnerlib/crontab/crontab.go
  5. 57 0
      rpc/partnerlib/crontab/handle/ticker.go
  6. 31 0
      rpc/partnerlib/crontab/handle/timer.go
  7. 109 0
      rpc/partnerlib/crontab/service/docinInfo.go
  8. 38 0
      rpc/partnerlib/crontab/service/docinUpdate.go
  9. 132 0
      rpc/partnerlib/crontab/service/service.go
  10. 61 0
      rpc/partnerlib/crontab/service/viewsdownloadtimes.go
  11. 12 0
      rpc/partnerlib/entity/entity.go
  12. 20 0
      rpc/partnerlib/etc/crontab.yaml
  13. 23 0
      rpc/partnerlib/etc/interface.yaml
  14. 41 0
      rpc/partnerlib/etc/partner.yaml
  15. 32 0
      rpc/partnerlib/init/init.go
  16. 17 0
      rpc/partnerlib/internal/config/config.go
  17. 20 0
      rpc/partnerlib/internal/config/crontab.go
  18. 19 0
      rpc/partnerlib/internal/config/interface.go
  19. 29 0
      rpc/partnerlib/internal/logic/docdownloadlogic.go
  20. 29 0
      rpc/partnerlib/internal/logic/userbuylogic.go
  21. 33 0
      rpc/partnerlib/internal/server/partnerserver.go
  22. 13 0
      rpc/partnerlib/internal/svc/servicecontext.go
  23. 31 0
      rpc/partnerlib/model/partner.go
  24. 44 0
      rpc/partnerlib/partner/partner.go
  25. 40 0
      rpc/partnerlib/partnerlib.go
  26. 41 0
      rpc/partnerlib/partnerlib.proto
  27. 40 0
      rpc/partnerlib/service/docDownload.go
  28. 149 0
      rpc/partnerlib/service/service.go
  29. 45 0
      rpc/partnerlib/service/userBuy.go
  30. 466 0
      rpc/partnerlib/type/partnerlib/partnerlib.pb.go
  31. 141 0
      rpc/partnerlib/type/partnerlib/partnerlib_grpc.pb.go
  32. 1 0
      rpc/partnerlib/util/util.go
  33. 3 0
      rpc/partnerlib/warn/warn.go
  34. 46 0
      services/model/partner.go
  35. 29 24
      services/model/stdlib.go
  36. 9 0
      services/partner/docCheck.go
  37. 111 0
      services/partner/docClass.go
  38. 16 0
      services/partner/docsInsert.go
  39. 15 0
      services/partner/docsStatistics.go
  40. 17 0
      services/partner/docsUpdate.go
  41. 13 0
      services/partner/mgo.go
  42. 28 0
      services/partner/redis.go
  43. 63 0
      services/util/baseInit.go

+ 20 - 8
go.mod

@@ -3,8 +3,9 @@ module app.yhyue.com/moapp/jy_docs
 go 1.20
 
 require (
-	app.yhyue.com/moapp/jybase v0.0.0-20210322021809-141cc2c37946
+	app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20
 	app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4
+	github.com/gogf/gf/v2 v2.7.1
 	github.com/golang/protobuf v1.5.3
 	github.com/zeromicro/go-zero v1.5.6
 	google.golang.org/grpc v1.59.0
@@ -19,10 +20,10 @@ require (
 	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/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/emicklei/go-restful/v3 v3.9.0 // indirect
-	github.com/fatih/color v1.15.0 // indirect
+	github.com/fatih/color v1.16.0 // indirect
+	github.com/garyburd/redigo v1.6.2 // indirect
 	github.com/go-logr/logr v1.2.3 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-openapi/jsonpointer v0.19.6 // indirect
@@ -32,6 +33,8 @@ require (
 	github.com/go-sql-driver/mysql v1.7.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/golang/mock v1.6.0 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
+	github.com/gomodule/redigo v1.8.9 // indirect
 	github.com/google/gnostic v0.5.7-v3refs // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
@@ -40,12 +43,14 @@ require (
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/klauspost/compress v1.15.15 // 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.17 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.4 // 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.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 	github.com/olivere/elastic/v7 v7.0.22 // indirect
 	github.com/openzipkin/zipkin-go v0.4.1 // indirect
@@ -56,9 +61,14 @@ require (
 	github.com/prometheus/common v0.42.0 // indirect
 	github.com/prometheus/procfs v0.10.1 // 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-20181117223130-1be2e3e5546d // indirect
 	go.etcd.io/etcd/api/v3 v3.5.9 // indirect
 	go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
 	go.etcd.io/etcd/client/v3 v3.5.9 // indirect
+	go.mongodb.org/mongo-driver v1.12.1 // indirect
 	go.opentelemetry.io/otel v1.14.0 // indirect
 	go.opentelemetry.io/otel/exporters/jaeger v1.14.0 // indirect
 	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.14.0 // indirect
@@ -74,11 +84,13 @@ require (
 	go.uber.org/automaxprocs v1.5.3 // indirect
 	go.uber.org/multierr v1.9.0 // indirect
 	go.uber.org/zap v1.24.0 // indirect
-	golang.org/x/net v0.15.0 // indirect
+	golang.org/x/crypto v0.22.0 // indirect
+	golang.org/x/net v0.24.0 // indirect
 	golang.org/x/oauth2 v0.11.0 // indirect
-	golang.org/x/sys v0.12.0 // indirect
-	golang.org/x/term v0.12.0 // indirect
-	golang.org/x/text v0.13.0 // indirect
+	golang.org/x/sync v0.3.0 // indirect
+	golang.org/x/sys v0.19.0 // indirect
+	golang.org/x/term v0.19.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect

+ 64 - 63
go.sum

@@ -1,5 +1,6 @@
-app.yhyue.com/moapp/jybase v0.0.0-20210322021809-141cc2c37946 h1:w4voEoJ5RqjlUyGhNC15sk3RdwCCi2U5uX33Btw9BMc=
-app.yhyue.com/moapp/jybase v0.0.0-20210322021809-141cc2c37946/go.mod h1:29ShuI8y7qEyg2KviHSx1iamiCioBKdTMm2ndVzWAhk=
+app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
+app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20 h1:F1ZHkzo7yHp5eNrZDqQxaXMIKFQU72bsI1dMq3ztJLA=
+app.yhyue.com/moapp/jybase v0.0.0-20240523083821-42a82b37ae20/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
 app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4 h1:5oCyV5lZ65iYTx0jts6qsrM8xTc2dbEnVd7qqnUzfy0=
 app.yhyue.com/moapp/jyfs v0.0.0-20231024061508-480c270480d4/go.mod h1:61hzZ3dZHXL28BNl8BOgZsvM2S5UVY5YFzOkEUPrSu4=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
@@ -762,6 +763,7 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum
 git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
@@ -769,6 +771,7 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/RoaringBitmap/roaring v1.5.0/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
 github.com/Shopify/sarama v1.37.2/go.mod h1:Nxye/E+YPru//Bpaorfhc3JsSGYwCaDDj+R4bK52U5o=
 github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0=
 github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
@@ -795,7 +798,6 @@ github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/P
 github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
-github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
 github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
 github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
@@ -804,6 +806,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
 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/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
 github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
 github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE=
@@ -820,6 +823,7 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
 github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
 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-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -849,11 +853,10 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 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 v0.0.0-20200903113550-03f5f0333e1f h1:q/DpyjJjZs94bziQ7YkBmIlpqbVP7yw179rnzoNVX1M=
-github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f/go.mod h1:QGrK8vMWWHQYQ3QU9bw9Y9OPNfxccGzfb41qjvVeXtY=
 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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+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/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
 github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho=
@@ -884,16 +887,18 @@ github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6Ni
 github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs=
 github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
 github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
 github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
+github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
+github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
 github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
 github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
 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.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 github.com/fullstorydev/grpcurl v1.8.8/go.mod h1:TRM21TqPbPzHkA9DqSh94oI2g1pD2AFRhLhmGrSht+Q=
+github.com/garyburd/redigo v1.6.2 h1:yE/pwKCrbLpLpQICzYTeZ7JsTA/C53wFTJHaEtRqniM=
 github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
@@ -940,39 +945,19 @@ github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhO
 github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
 github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
-github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
-github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
-github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
-github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
-github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs=
-github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
-github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
-github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
-github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
-github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo=
-github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk=
-github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw=
-github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360=
-github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg=
-github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE=
-github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8=
-github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
-github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc=
-github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
-github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4=
-github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ=
-github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
-github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
 github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogf/gf/v2 v2.7.1 h1:Ukp7vzwh6VKnivEEx/xiMc61dL1HVZqCCHl//3GBRxc=
+github.com/gogf/gf/v2 v2.7.1/go.mod h1:3oyGjyLHtSSo8kQ57Nj1TPdUNc0e2HS0A2J+KkXoW+I=
 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-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -1015,8 +1000,11 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg
 github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.3/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.4/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
+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/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
@@ -1097,7 +1085,9 @@ github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB7
 github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
 github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
 github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
+github.com/grokify/html-strip-tags-go v0.1.0 h1:03UrQLjAny8xci+R+qjCce/MYnpNXCtgzltlQbOBae4=
 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.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
@@ -1119,7 +1109,6 @@ github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
 github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
 github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
@@ -1141,7 +1130,6 @@ github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E=
 github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
-github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
@@ -1156,20 +1144,17 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
 github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
-github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
-github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
 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/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
-github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
 github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM=
+github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
 github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 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.2/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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
@@ -1187,22 +1172,23 @@ github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuz
 github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
 github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o=
 github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
 github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 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/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
-github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
 github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
 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.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
 github.com/mattn/go-isatty v0.0.17/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/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
 github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
 github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
@@ -1220,7 +1206,9 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 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 h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
 github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
 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=
@@ -1232,7 +1220,9 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
 github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+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 v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -1266,7 +1256,6 @@ github.com/onsi/gomega v1.26.0/go.mod h1:r+zV744Re+DiYCIPRlYOTxn0YkOLcAnW8k1xXdM
 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A=
 github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM=
-github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
 github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
 github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
@@ -1322,10 +1311,9 @@ github.com/rabbitmq/amqp091-go v1.5.0/go.mod h1:JsV0ofX5f1nwOGafb8L5rBItt9GyhfQf
 github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
-github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
@@ -1337,8 +1325,6 @@ github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfF
 github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
@@ -1351,8 +1337,6 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd
 github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
-github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 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/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
@@ -1376,15 +1360,20 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/urfave/cli/v2 v2.11.0/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
 github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
 github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
+github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
 github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
-github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
-github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
 github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4=
 github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
+github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1399,13 +1388,17 @@ github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN
 github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
 github.com/zeromicro/go-zero v1.5.6 h1:vBzrLaj+xQySBAeMBA6vhPxNgasz0T3WE60s98H0Bb4=
 github.com/zeromicro/go-zero v1.5.6/go.mod h1:FX2a2MQd5EvAYO7neJBm2GAmPU5XfFnj3JMM/qj+kpY=
+go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
 go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs=
 go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k=
+go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
 go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE=
 go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4=
+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.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E=
 go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA=
-go.mongodb.org/mongo-driver v1.5.0/go.mod h1:boiGPFqyBs5R0R5qf2ErokGRekMfwn+MqKaUyHs7wy0=
+go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
+go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE=
 go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
@@ -1440,6 +1433,7 @@ go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI
 go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
 go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
 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.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
@@ -1449,21 +1443,23 @@ go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ
 go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
 go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
 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-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
 golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+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.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
@@ -1477,6 +1473,8 @@ golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45
 golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
 golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
+golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
+golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -1589,6 +1587,7 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su
 golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
@@ -1612,8 +1611,9 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
 golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
 golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
-golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
 golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
+golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
+golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
 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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1652,7 +1652,6 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
 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=
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1667,6 +1666,7 @@ golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
 golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
 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=
@@ -1675,19 +1675,17 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1774,8 +1772,10 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
+golang.org/x/sys v0.19.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.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -1790,8 +1790,9 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
 golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
 golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
-golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU=
 golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
+golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
+golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1811,8 +1812,9 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
 golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1829,9 +1831,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
@@ -2063,6 +2062,7 @@ google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP
 google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
 google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
@@ -2236,6 +2236,7 @@ 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/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

+ 5 - 0
rpc/partnerlib/README.md

@@ -0,0 +1,5 @@
+#### 合作商文档 下载,购买,更新等操作
+
+#### 1:豆丁
+
+#### goctl rpc protoc partnerlib.proto --go_out=./type --go-grpc_out=./type --zrpc_out=.

+ 19 - 0
rpc/partnerlib/crontab/crontab.go

@@ -0,0 +1,19 @@
+package crontab
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/crontab/service"
+	IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
+	"github.com/gogf/gf/v2/os/gctx"
+)
+
+func StartTask() {
+	if IC.Cron.IsRun {
+		ctx := gctx.New()
+		//浏览量 下载量更新到检索库
+		//go service.VDTimesUpdate()
+		//获取豆丁docs基本信息
+		go service.GetDocinInfoTask(ctx)
+		//更新豆丁docs基本信息
+		go service.UpdateDocinInfoTask(ctx)
+	}
+}

+ 57 - 0
rpc/partnerlib/crontab/handle/ticker.go

@@ -0,0 +1,57 @@
+package cron
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/entity"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/config"
+	"app.yhyue.com/moapp/jy_docs/services/partner"
+	"app.yhyue.com/moapp/jybase/date"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gcron"
+	"time"
+)
+
+func CrontabByTicker(ctx context.Context, cron config.Cron, f func(cron config.Cron)) {
+	var paramReset = func() {
+		if cron.StartIdKey != "" {
+			if startId := partner.GetDocsStartId(entity.RedisCode, cron.StartIdKey); startId != 0 {
+				cron.StartId = startId
+			}
+		}
+		if cron.StartDateKey != "" {
+			if startDate := partner.GetUpdateTaskInfo(entity.RedisCode, cron.StartDateKey); startDate != "" {
+				cron.StartDate = startDate
+			}
+		}
+		entity.SyncExpectTotal = 0
+		entity.SyncActualTotal = 0
+		entity.UpdateExpectTotal = 0
+		entity.UpdateActualTotal = 0
+	}
+	_, err := gcron.Add(ctx, cron.Time, func(ctx context.Context) {
+		//离线 市场分析报告 处理
+		g.Log().Info(ctx, "----------------------start-------------当前时间:", time.Now().Format(date.Date_Full_Layout))
+		//数据重置处理
+		paramReset()
+		//暂停定时任务  待一轮任务处理完后 再开启
+		go gcron.Stop(cron.Name)
+		f(cron)
+		//开启下一轮定时任务
+		gcron.Start(cron.Name)
+		g.Log().Info(ctx, "----------------------end-------------当前时间:", time.Now().Format(date.Date_Full_Layout))
+	}, cron.Name)
+	if err != nil {
+		g.Log().Info(ctx, fmt.Sprintf("%s定时任务异常", "----"))
+	}
+	//首次运行
+	if cron.First {
+		//数据重置处理
+		paramReset()
+		//暂停定时任务  待一轮任务处理完后 再开启
+		go gcron.Stop(cron.Name)
+		f(cron)
+		//开启下一轮定时任务
+		gcron.Start(cron.Name)
+	}
+}

+ 31 - 0
rpc/partnerlib/crontab/handle/timer.go

@@ -0,0 +1,31 @@
+package cron
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"log"
+	"strings"
+	"time"
+)
+
+func CrontabByTimer(flag bool, c string, f func()) {
+	array := strings.Split(c, ":")
+	if len(array) != 2 {
+		log.Fatalln("定时任务参数错误!", c)
+	}
+	if flag {
+		go f()
+	}
+	now := time.Now()
+	t := time.Date(now.Year(), now.Month(), now.Day(), common.IntAll(array[0]), common.IntAll(array[1]), 0, 0, time.Local)
+	if t.Before(now) {
+		t = t.AddDate(0, 0, 1)
+	}
+	timer := time.NewTimer(t.Sub(now))
+	for {
+		select {
+		case <-timer.C:
+			go f()
+			timer.Reset(24 * time.Hour)
+		}
+	}
+}

+ 109 - 0
rpc/partnerlib/crontab/service/docinInfo.go

@@ -0,0 +1,109 @@
+package service
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/entity"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/model"
+	sm "app.yhyue.com/moapp/jy_docs/services/model"
+	"app.yhyue.com/moapp/jy_docs/services/partner"
+	"crypto/md5"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"strings"
+	"time"
+)
+
+func InsertDocinInfos(b []byte) (err error, lastId int64, expectTotal, actualTotal int) {
+	var docinInfos model.DocinInfoRes
+	err = json.Unmarshal(b, &docinInfos)
+	if err == nil {
+		if expectTotal = len(docinInfos.Data); expectTotal > 0 {
+			//剑鱼doc 一份 || 豆丁备份表一份
+			var (
+				docs           []sm.Doc
+				docsStatistics []sm.DocStatistics
+			)
+			for _, v := range docinInfos.Data {
+				var (
+					id                = fmt.Sprintf("docin-%d", v.ProductId)
+					md5Id             = GetMD5(id, v.ProductName, v.Desc, v.FilePostfix) //判断数据是否已存在 md5
+					price             = v.Price                                          //价格转换
+					docTags, docClass = partner.SwitchDocClass(v.PcatName, v.CatName, 1) //标签和分类
+				)
+				if partner.CheckDocs(id, md5Id) {
+					continue
+				}
+				lastId = v.ProductId
+				docsStatistics = append(docsStatistics, sm.DocStatistics{
+					AppId:      entity.AppId,
+					DocId:      id,
+					UpdateDate: time.Now(),
+					DownTimes:  v.DownloadCount,
+					ViewTimes:  v.VisitCount,
+				})
+				docs = append(docs, sm.Doc{
+					Id:              id,
+					UserId:          "docin",
+					AppId:           entity.AppId,
+					DocName:         v.ProductName,
+					DocFileType:     GetDocFileType(v.FilePostfix),
+					DocFileSuffix:   v.FilePostfix,
+					DocFileSize:     int(v.FileSize),
+					DocPageSize:     v.PageCount,
+					DocTags:         strings.Join(docTags, ","),
+					DocClass:        docClass,
+					UploadDate:      time.Now(),
+					IsDelete:        0,
+					OssDocId:        "",
+					OssDocUrl:       "",
+					Md5:             md5Id, //
+					OssPdfId:        "",
+					OssPdfUrl:       "",
+					OssTxtId:        "",
+					OssTxtUrl:       "",
+					Price:           price,
+					DownOrUp:        0,
+					DocSummary:      v.Desc,
+					PreviewImgId:    "",
+					PreviewImgUrl:   "",
+					EncryptionLevel: 0,
+					Source:          1,
+					ProductType:     v.Ifcharge,
+					UpdateDate:      time.Now(),
+				})
+			}
+			if len(docs) > 0 {
+				actualTotal = len(docs)
+				//doc 文库文档数据信息
+				partner.DocsInsert(docs, entity.InBatchesCount)
+				//docsStatistics 文库文档浏览量及下载量信息
+				partner.DocsStatistics(docsStatistics, entity.InBatchesCount)
+			}
+		}
+	}
+	return
+}
+
+func GetMD5(id, productName, desc, FilePostfix string) string {
+	hash := md5.Sum([]byte(fmt.Sprintf("%s#%s#%#s#%s", id, productName, desc, FilePostfix)))
+	return hex.EncodeToString(hash[:])
+}
+
+func GetDocFileType(fileSuffix string) (i int) {
+	//1 doc 2 pdf 3 xls 4 ppt 5 txt 6 其他
+	switch strings.ToLower(fileSuffix) {
+	case "doc":
+		i = 1
+	case "pdf":
+		i = 2
+	case "xls", "xlsx":
+		i = 3
+	case "ppt":
+		i = 4
+	case "txt":
+		i = 5
+	default:
+		i = 6
+	}
+	return
+}

+ 38 - 0
rpc/partnerlib/crontab/service/docinUpdate.go

@@ -0,0 +1,38 @@
+package service
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/model"
+	sm "app.yhyue.com/moapp/jy_docs/services/model"
+	"app.yhyue.com/moapp/jy_docs/services/partner"
+	"app.yhyue.com/moapp/jybase/date"
+	"encoding/json"
+	"fmt"
+	"time"
+)
+
+func UpdateDocinInfos(b []byte) (err error, lastId int64, expectTotal, actualTotal int) {
+	var docinInfos model.DocinInfoRes
+	err = json.Unmarshal(b, &docinInfos)
+	if err == nil {
+		if expectTotal = len(docinInfos.Data); expectTotal > 0 {
+			//更新doc
+			for _, v := range docinInfos.Data {
+				var (
+					id  = fmt.Sprintf("docin-%d", v.ProductId)
+					doc = sm.Doc{}
+				)
+				lastId = v.ProductId
+				doc.Id = id
+				doc.UpdateDate, _ = time.ParseInLocation(date.Date_Full_Layout, v.ModifyDate, time.Local)
+				doc.Price = v.Price
+				doc.PriceVip = v.PriceVip
+				doc.ProductType = v.Ifcharge + 1
+				doc.DownOrUp = v.State
+				if err := partner.DocsUpdate(doc); err == nil {
+					actualTotal++
+				}
+			}
+		}
+	}
+	return
+}

+ 132 - 0
rpc/partnerlib/crontab/service/service.go

@@ -0,0 +1,132 @@
+package service
+
+import (
+	cron "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/crontab/handle"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/entity"
+	. "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/config"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/service"
+	"app.yhyue.com/moapp/jy_docs/services/partner"
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
+	"log"
+	"time"
+)
+
+// 获取豆丁docs基本信息
+func GetDocinInfoTask(ctx context.Context) {
+	defer common.Catch()
+	cron.CrontabByTicker(ctx, Cron.NewDocsList, SyncDocinInfo)
+}
+
+func SyncDocinInfo(cron config.Cron) {
+	log.Println("sync Docin info task start :", date.NowFormat(date.Date_Full_Layout))
+	var (
+		startId = cron.StartId
+		h       = service.NewHH(I.Docin.Name, I.Docin.Host, I.Docin.DocList.Name, I.Docin.DocList.Pathname, I.Docin.DocList.Method, map[string]interface{}{
+			"startId": startId,
+			"count":   Cron.NewDocsList.Count,
+		})
+		b, err = h.HttpFunc()
+		lastId = startId
+	)
+	go h.SaveRequestLogger(b, err)
+	if err == nil {
+		if len(b) > 0 {
+			var et, at int
+			//豆丁同步数据到mongo
+			go h.SaveResponseData(b, err)
+			err, lastId, et, at = InsertDocinInfos(b)
+			entity.SyncExpectTotal = entity.SyncExpectTotal + et
+			entity.SyncActualTotal = entity.SyncActualTotal + at
+			if err != nil {
+				log.Println("保存docin 文档失败:", err.Error()) //todo 发送异常信号
+			} else if lastId > 0 {
+				//周期内数据未同步完成
+				cron.StartId = lastId
+				if cron.Count == et {
+					if st := Cron.NewDocsList.SleepTime; st > 0 {
+						time.Sleep(time.Duration(st) * time.Millisecond)
+					}
+					SyncDocinInfo(cron)
+				}
+			}
+		}
+	} else {
+		log.Println("获取doc文库列表失败:", err.Error()) //todo 发送异常信号
+	}
+	//缓存 保存最后一次更新id
+	if b := partner.SetDocsStartId(entity.RedisCode, cron.StartIdKey, cron.StartId, -1); !b {
+		log.Println("同步 Docin 数据 更新最新id缓存异常: ", cron.StartId)
+	} else {
+		log.Println("同步 Docin 数据 更新最新id缓存成功: ", cron.StartId)
+	}
+	log.Println(fmt.Sprintf("sync Docin info task end :%s-当前任务更新 预计数据量:%d 实际数据量:%d", date.NowFormat(date.Date_Full_Layout), entity.SyncExpectTotal, entity.SyncActualTotal))
+}
+
+// 更新豆丁docs基本信息
+func UpdateDocinInfoTask(ctx context.Context) {
+	defer common.Catch()
+	cron.CrontabByTicker(ctx, Cron.UpdateDocsList, UpdateDocinInfo)
+}
+
+func UpdateDocinInfo(cron config.Cron) {
+	var (
+		startId   = cron.StartId
+		count     = cron.Count
+		startDate = cron.StartDate
+		endDate   = cron.EndDate
+	)
+	log.Println("update Docin info task start :", date.NowFormat(date.Date_Full_Layout))
+	if endDate == "" {
+		endDate = date.NowFormat(date.Date_yyyyMMdd)
+	}
+	if startDate == "" || endDate == "" || count == 0 || gconv.Int64(startDate) >= gconv.Int64(endDate) {
+		log.Println("timetask 保存 docin 文档失败--参数异常:startId:", startId, "--startDate:", startDate, "--endDate:", endDate, "--count:", count) //todo 发送异常信号
+		return
+	}
+	h := service.NewHH(I.Docin.Name, I.Docin.Host, I.Docin.UpdateList.Name, I.Docin.UpdateList.Pathname, I.Docin.UpdateList.Method, map[string]interface{}{
+		"startId":   startId,
+		"count":     count,
+		"startDate": startDate,
+		"endDate":   endDate,
+	})
+	b, err := h.HttpFunc()
+	lastId := startId
+	go h.SaveRequestLogger(b, err)
+	if err == nil {
+		if len(b) > 0 {
+			var et, at int
+			//豆丁更新数据到mongo
+			go h.SaveResponseData(b, err)
+			err, lastId, et, at = UpdateDocinInfos(b)
+			entity.UpdateExpectTotal = entity.UpdateExpectTotal + et
+			entity.UpdateActualTotal = entity.UpdateActualTotal + at
+			if err != nil {
+				log.Println("更新 docin 文档失败:", err.Error()) //todo 发送异常信号
+			} else if lastId > 0 {
+				cron.StartId = lastId
+				//周期内数据未同步完成
+				if count == et {
+					if st := Cron.UpdateDocsList.SleepTime; st > 0 {
+						time.Sleep(time.Duration(st) * time.Millisecond)
+					}
+					UpdateDocinInfo(cron)
+				}
+			}
+		}
+	} else {
+		log.Println("更新 doc文库列表失败:", err.Error()) //todo 发送异常信号
+	}
+	//缓存数据处理
+	partner.SetUpdateTaskInfo(entity.RedisCode, cron.StartDateKey, endDate, -1)
+	partner.DelDocsStartId(entity.RedisCode, cron.StartIdKey)
+	//休眠
+	if st := Cron.UpdateDocsList.SleepTime; st > 0 {
+		time.Sleep(time.Duration(st) * time.Millisecond)
+	}
+	log.Println(fmt.Sprintf("update Docin info task end :%s-当前任务更新 预计数据量:%d 实际数据量:%d", date.NowFormat(date.Date_Full_Layout), entity.UpdateExpectTotal, entity.UpdateActualTotal))
+}

+ 61 - 0
rpc/partnerlib/crontab/service/viewsdownloadtimes.go

@@ -0,0 +1,61 @@
+package service
+
+//
+//import (
+//	"app.yhyue.com/moapp/jy_docs/timetask/config"
+//	"app.yhyue.com/moapp/jy_docs/timetask/cron"
+//	"app.yhyue.com/moapp/jy_docs/timetask/entity"
+//	"app.yhyue.com/moapp/jybase/common"
+//	"app.yhyue.com/moapp/jybase/date"
+//	elastic "app.yhyue.com/moapp/jybase/esv7"
+//	"app.yhyue.com/moapp/jybase/go-logger/logger"
+//	"fmt"
+//	"log"
+//)
+//
+////浏览量和下载量定时更新
+//
+//func VDTimesUpdate() {
+//	defer common.Catch()
+//	cron.CrontabByTicker(config.TimeTask.UpdateViewsDownload.First, config.TimeTask.UpdateDocsDate.Time, func() {
+//		now := date.NowFormat(date.Date_Full_Layout)
+//		log.Println("start update docs views and download times to es:", now)
+//		rows, err := config.Mysql.Raw(`select docId,downTimes,viewTimes from doc_statistics where updateDate>=? and updateDate<?`, config.TimeTask.UpdateViewsDownload.StartTime, now).Rows()
+//		if err != nil {
+//			logger.Error(err)
+//			return
+//		}
+//		if rows != nil {
+//			defer rows.Close()
+//		}
+//		array := [][]string{}
+//		index := 0
+//		for rows.Next() {
+//			var docId string
+//			var downTimes int
+//			var viewTimes int
+//			err = rows.Scan(&docId, &downTimes, &viewTimes)
+//			if err != nil {
+//				logger.Error(err)
+//				continue
+//			}
+//			log.Println("need update to es", "docId", docId, "downTimes", downTimes, "viewTimes", viewTimes)
+//			index++
+//			array = append(array, []string{docId, fmt.Sprintf("ctx._source.downTimes=%d;ctx._source.viewTimes=%d", downTimes, viewTimes)})
+//			if len(array) == config.Config.BlukSize {
+//				logger.Info("update es index", index, elastic.NewBulkUpdate(entity.Es_Jydoc, array...))
+//				array = [][]string{}
+//			}
+//		}
+//		if len(array) > 0 {
+//			logger.Info("update es index", index, elastic.NewBulkUpdate(entity.Es_Jydoc, array...))
+//			array = [][]string{}
+//		}
+//		config.TimeTask.UpdateViewsDownload.StartTime = now
+//		common.WriteSysConfig("./timetask.json", &config.TimeTask)
+//		logger.Info("update to es over", index)
+//	})
+//	//config.TimeTask.Time = now
+//	//logger.Info("update to es over", index)
+//	//time.AfterFunc(time.Duration(config.Config.DurationMinute)*time.Minute, VDTimesUpdate)
+//}

+ 12 - 0
rpc/partnerlib/entity/entity.go

@@ -0,0 +1,12 @@
+package entity
+
+const (
+	DateFormat     = "20060102"
+	RedisCode      = "newother"
+	AppId          = "10000"
+	InBatchesCount = 20
+)
+
+var (
+	SyncExpectTotal, SyncActualTotal, UpdateExpectTotal, UpdateActualTotal int //批次预计处理数据和实际处理数据
+)

+ 20 - 0
rpc/partnerlib/etc/crontab.yaml

@@ -0,0 +1,20 @@
+IsRun: true
+NewDocsList:
+  Name: syncDocs
+  First: true
+  Time: "0 0 0/4 * * ?"
+  StartId: 0
+  StartIdKey: docin_sync_start_id
+  Count: 50
+  SleepTime: 10
+UpdateDocsList:
+  Name: updateDocs
+  First: true
+  Time: "0 0 0/4 * * ?"
+  StartId: 0 # 首次任务执行:0;以后配置成1
+  StartIdKey: docin_update_start_id
+  Count: 50
+  StartDate: "20240411" # 首次任务执行:20240411
+  StartDateKey: docin_update_start_date
+  EndDate: "" # 默认空
+  SleepTime: 10

+ 23 - 0
rpc/partnerlib/etc/interface.yaml

@@ -0,0 +1,23 @@
+Docin:
+  Name: 豆丁
+  Host: https://t.docin.com
+  AppId: 1000
+  AppSecret: jianyu
+  DocList:
+    Name: 文档列表接口
+    Pathname: /api/jianyu/getProducts.do
+    Method: GET
+  UpdateList:
+    Name: 文档更新接口
+    Pathname: /api/jianyu/getModifiedProducts.do
+    Method: GET
+  DocDownload:
+    Name: 文档下载接口
+    Pathname: /api/jianyu/getFile.do
+    Method: GET
+  BuyRecord:
+    Name: 购买会员记录接口
+    Pathname: /api/jianyu/addSaleTransaction.do
+    Method: POST
+
+

+ 41 - 0
rpc/partnerlib/etc/partner.yaml

@@ -0,0 +1,41 @@
+Name: jydocs.partnerlib.rpc
+ListenOn: 127.0.0.1:8082
+WebRpcPort: 8185
+Etcd:
+  Hosts:
+    - 192.168.3.207:2379
+    - 192.168.3.165:2379
+    - 192.168.3.204:2379
+  Key: jydocs.partnerlib.rpc
+JyDocsMysqlDB:
+  DriverName: "mysql"
+  DataSourceName: "root:Topnet123@tcp(192.168.3.11:3366)/jydocs?charset=utf8mb4&parseTime=true&loc=Local"
+  MaxOpenConn: 20
+  MaxIdleConn: 10
+  MaxConnLifeTime: 100
+EsConfig:
+  Addr: "http://192.168.3.241:9200,http://192.168.3.242:9200"
+  Pool: 15
+  UserName: elastic
+  Password: elastic
+Redis:
+  Addr:
+    - other=192.168.3.149:1712
+    - newother=192.168.3.149:1712
+Mongo:
+  Main:
+    Address: 192.168.3.206:27080
+    Size: 5
+    DbName: qfw
+    UserName: ""
+    Password: ""
+  Logger:
+    Address: 192.168.3.206:27001
+    Size: 5
+    DbName: qfw_data
+    UserName: admin
+    Password: "123456"
+FileSystemConf:
+  Hosts:
+    - 192.168.3.240:2379
+  Key: moapp.filesystem.rpc

+ 32 - 0
rpc/partnerlib/init/init.go

@@ -0,0 +1,32 @@
+package init
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/config"
+	"app.yhyue.com/moapp/jy_docs/services/partner"
+	jyDocsRpcUtil "app.yhyue.com/moapp/jy_docs/services/util"
+	"flag"
+	"github.com/zeromicro/go-zero/core/conf"
+)
+
+var (
+	configFile    = flag.String("c", "etc/partner.yaml", "the partner file")
+	interfaceFile = flag.String("i", "etc/interface.yaml", "the interface file")
+	crontabFile   = flag.String("cron", "etc/crontab.yaml", "the crontab file")
+	C             config.Config
+	I             config.InterfaceInfo
+	Cron          config.CrontabInfo
+)
+
+func init() {
+	conf.MustLoad(*configFile, &C)
+	conf.MustLoad(*interfaceFile, &I)
+	conf.MustLoad(*crontabFile, &Cron)
+	if C.JyDocsMysqlDB.DataSourceName != "" && C.EsConfig.Addr != "" {
+		jyDocsRpcUtil.InitDB(C.JyDocsMysqlDB.DataSourceName, C.JyDocsMysqlDB.DriverName, C.JyDocsMysqlDB.MaxOpenConn, C.JyDocsMysqlDB.MaxIdleConn)
+		jyDocsRpcUtil.InitEs(C.EsConfig.Addr, C.EsConfig.Pool, C.EsConfig.UserName, C.EsConfig.Password)
+		jyDocsRpcUtil.InitRedis(C.Redis)
+		jyDocsRpcUtil.InitMongo(C.Mongo)
+	}
+	//初始化 分类对应关系
+	go partner.InitDocClass()
+}

+ 17 - 0
rpc/partnerlib/internal/config/config.go

@@ -0,0 +1,17 @@
+package config
+
+import (
+	jyDocRpcUtil "app.yhyue.com/moapp/jy_docs/services/util"
+	"github.com/zeromicro/go-zero/core/discov"
+	"github.com/zeromicro/go-zero/zrpc"
+)
+
+type Config struct {
+	zrpc.RpcServerConf
+	WebRpcPort     int64
+	JyDocsMysqlDB  jyDocRpcUtil.MysqlDBConfig
+	EsConfig       jyDocRpcUtil.EsConfig
+	Redis          jyDocRpcUtil.RedisConfig
+	Mongo          jyDocRpcUtil.MongoConfig
+	FileSystemConf discov.EtcdConf
+}

+ 20 - 0
rpc/partnerlib/internal/config/crontab.go

@@ -0,0 +1,20 @@
+package config
+
+type CrontabInfo struct {
+	IsRun          bool
+	NewDocsList    Cron
+	UpdateDocsList Cron
+}
+
+type Cron struct {
+	Name         string
+	First        bool
+	Time         string
+	StartId      int64
+	StartIdKey   string
+	Count        int
+	StartDate    string
+	StartDateKey string
+	EndDate      string
+	SleepTime    int
+}

+ 19 - 0
rpc/partnerlib/internal/config/interface.go

@@ -0,0 +1,19 @@
+package config
+
+type InterfaceInfo struct {
+	Docin struct {
+		Name        string
+		Host        string
+		AppId       string
+		AppSecret   string
+		DocList     BaseInfo
+		UpdateList  BaseInfo
+		DocDownload BaseInfo
+		BuyRecord   BaseInfo
+	}
+}
+type BaseInfo struct {
+	Name     string
+	Pathname string
+	Method   string
+}

+ 29 - 0
rpc/partnerlib/internal/logic/docdownloadlogic.go

@@ -0,0 +1,29 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/service"
+	"context"
+
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/svc"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type DocDownloadLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewDocDownloadLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DocDownloadLogic {
+	return &DocDownloadLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *DocDownloadLogic) DocDownload(in *partnerlib.UserDownloadRequest) (*partnerlib.CommonResponse, error) {
+	return service.DocDownload(in)
+}

+ 29 - 0
rpc/partnerlib/internal/logic/userbuylogic.go

@@ -0,0 +1,29 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/service"
+	"context"
+
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/svc"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type UserBuyLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewUserBuyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserBuyLogic {
+	return &UserBuyLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *UserBuyLogic) UserBuy(in *partnerlib.UserBuyVipRequest) (*partnerlib.CommonResponse, error) {
+	return service.UBHandle(in)
+}

+ 33 - 0
rpc/partnerlib/internal/server/partnerserver.go

@@ -0,0 +1,33 @@
+// Code generated by goctl. DO NOT EDIT!
+// Source: partnerlib.proto
+
+package server
+
+import (
+	"context"
+
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/logic"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/svc"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
+)
+
+type PartnerServer struct {
+	svcCtx *svc.ServiceContext
+	partnerlib.UnimplementedPartnerServer
+}
+
+func NewPartnerServer(svcCtx *svc.ServiceContext) *PartnerServer {
+	return &PartnerServer{
+		svcCtx: svcCtx,
+	}
+}
+
+func (s *PartnerServer) DocDownload(ctx context.Context, in *partnerlib.UserDownloadRequest) (*partnerlib.CommonResponse, error) {
+	l := logic.NewDocDownloadLogic(ctx, s.svcCtx)
+	return l.DocDownload(in)
+}
+
+func (s *PartnerServer) UserBuy(ctx context.Context, in *partnerlib.UserBuyVipRequest) (*partnerlib.CommonResponse, error) {
+	l := logic.NewUserBuyLogic(ctx, s.svcCtx)
+	return l.UserBuy(in)
+}

+ 13 - 0
rpc/partnerlib/internal/svc/servicecontext.go

@@ -0,0 +1,13 @@
+package svc
+
+import "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/config"
+
+type ServiceContext struct {
+	Config config.Config
+}
+
+func NewServiceContext(c config.Config) *ServiceContext {
+	return &ServiceContext{
+		Config: c,
+	}
+}

+ 31 - 0
rpc/partnerlib/model/partner.go

@@ -0,0 +1,31 @@
+package model
+
+type DocinInfoRes struct {
+	Code      int    //状态码
+	Msg       string //状态信息
+	StartId   int64  //起始文档ID
+	Count     int    //请求文档量
+	ListCount int    //列表大小
+	Data      []Docs //列表内容
+	StartDate string //起始修改日期
+	EndDate   string //结束修改日期
+}
+
+type Docs struct {
+	PageCount     int    //文档页数
+	FilePostfix   string //文档格式
+	ProductId     int64  //文档ID
+	ModifyDate    string //修改时间
+	PcatName      string //一级分类
+	Price         int    //文档价格
+	PriceVip      int    //文档券数
+	ProductName   string //文档标题
+	VisitCount    int    //浏览量
+	CreatedDate   string //创建时间
+	FileSize      int64  //文档大小
+	CatName       string //二级分类
+	DownloadCount int    //下载量
+	Ifcharge      int    //是否付费,0:免费,1:收费
+	Desc          string //文档详情
+	State         int    //文档状态,0:上架,1:下架
+}

+ 44 - 0
rpc/partnerlib/partner/partner.go

@@ -0,0 +1,44 @@
+// Code generated by goctl. DO NOT EDIT!
+// Source: partnerlib.proto
+
+package partner
+
+import (
+	"context"
+
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
+
+	"github.com/zeromicro/go-zero/zrpc"
+	"google.golang.org/grpc"
+)
+
+type (
+	CommonResponse      = partnerlib.CommonResponse
+	UserBuyVipRequest   = partnerlib.UserBuyVipRequest
+	UserDownloadRequest = partnerlib.UserDownloadRequest
+
+	Partner interface {
+		DocDownload(ctx context.Context, in *UserDownloadRequest, opts ...grpc.CallOption) (*CommonResponse, error)
+		UserBuy(ctx context.Context, in *UserBuyVipRequest, opts ...grpc.CallOption) (*CommonResponse, error)
+	}
+
+	defaultPartner struct {
+		cli zrpc.Client
+	}
+)
+
+func NewPartner(cli zrpc.Client) Partner {
+	return &defaultPartner{
+		cli: cli,
+	}
+}
+
+func (m *defaultPartner) DocDownload(ctx context.Context, in *UserDownloadRequest, opts ...grpc.CallOption) (*CommonResponse, error) {
+	client := partnerlib.NewPartnerClient(m.cli.Conn())
+	return client.DocDownload(ctx, in, opts...)
+}
+
+func (m *defaultPartner) UserBuy(ctx context.Context, in *UserBuyVipRequest, opts ...grpc.CallOption) (*CommonResponse, error) {
+	client := partnerlib.NewPartnerClient(m.cli.Conn())
+	return client.UserBuy(ctx, in, opts...)
+}

+ 40 - 0
rpc/partnerlib/partnerlib.go

@@ -0,0 +1,40 @@
+package main
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/crontab"
+	IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/server"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/internal/svc"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
+	MC "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/endless"
+	"fmt"
+	"github.com/zeromicro/go-zero/core/service"
+	"github.com/zeromicro/go-zero/zrpc"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/reflection"
+	"log"
+)
+
+func main() {
+	go func() {
+		err := endless.ListenAndServe(":"+MC.InterfaceToStr(IC.C.WebRpcPort), nil, func() {})
+		if err != nil {
+			log.Println("ListenAndServe: ", err)
+		}
+	}()
+	ctx := svc.NewServiceContext(IC.C)
+	svr := server.NewPartnerServer(ctx)
+
+	s := zrpc.MustNewServer(IC.C.RpcServerConf, func(grpcServer *grpc.Server) {
+		partnerlib.RegisterPartnerServer(grpcServer, svr)
+
+		if IC.C.Mode == service.DevMode || IC.C.Mode == service.TestMode {
+			reflection.Register(grpcServer)
+		}
+	})
+	defer s.Stop()
+	crontab.StartTask()
+	fmt.Printf("Starting rpc server at %s...\n", IC.C.ListenOn)
+	s.Start()
+}

+ 41 - 0
rpc/partnerlib/partnerlib.proto

@@ -0,0 +1,41 @@
+syntax = "proto3";
+package partnerlib;
+option go_package = "./partnerlib";
+
+//豆丁文档下载
+message UserDownloadRequest {
+  string mgoUserId=1; //用户mongo id
+  string phone=2; //手机号
+  int64 positionId=3;//职位id
+  string appId=4;//剑鱼标识
+  int64 cost=5;//费用
+  string docId = 6;//文档id
+  int64  state = 7;//1:豆丁
+}
+//豆丁会员购买
+message UserBuyVipRequest{
+  string mgoUserId=1; //用户mongo id
+  string phone=2; //手机号
+  int64 positionId=3;//职位id
+  string appId=4;//剑鱼标识
+  string orderCode=5;//订单号
+  int64 productId=6;//文档id
+  int64 price=7;//价格金额,不可与券同时为空
+  int64 priceVip=8;//券,不可与金额同时为空
+  int64 type=9;//购买类型:1 币买文档,2 券买文档,3 月大会员,4 季大会员,5 年大会员
+  string orderTime = 10;//合作方订单时间,格式为yyyyMMddHHmmss
+  int64 state = 11;//1:豆丁
+  int64 mold = 12;//0:保存文库会员购买记录订单信息;1:更新合作商购买订单信息
+}
+
+//公共返回
+message CommonResponse{
+  int64 code = 1;
+  string msg = 2;
+  string  data = 3;
+}
+
+service  Partner {
+  rpc DocDownload(UserDownloadRequest) returns (CommonResponse);//文档下载
+  rpc UserBuy(UserBuyVipRequest) returns(CommonResponse); //会员购买
+}

+ 40 - 0
rpc/partnerlib/service/docDownload.go

@@ -0,0 +1,40 @@
+package service
+
+import (
+	IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
+	"encoding/json"
+	"log"
+)
+
+type DRes struct {
+	Msg  string
+	Code int64
+}
+
+func DocDownload(in *partnerlib.UserDownloadRequest) (res *partnerlib.CommonResponse, err error) {
+	res = new(partnerlib.CommonResponse)
+	var (
+		b []byte
+	)
+	h := NewHH(IC.I.Docin.Name, IC.I.Docin.Host, IC.I.Docin.DocDownload.Name, IC.I.Docin.DocDownload.Pathname, IC.I.Docin.DocDownload.Method, map[string]interface{}{
+		"productId": in.DocId,
+		"userId":    in.PositionId,
+	})
+	b, err = h.HttpFunc()
+	go h.SaveRequestLogger(b, err)
+	if err == nil {
+		log.Println(string(b))
+		dRes := &DRes{}
+		if err = json.Unmarshal(b, &dRes); err != nil {
+			res.Data = string(b)
+		} else {
+			res.Msg = dRes.Msg
+			res.Code = dRes.Code
+		}
+	} else {
+		res.Msg = err.Error()
+		res.Code = -1
+	}
+	return
+}

+ 149 - 0
rpc/partnerlib/service/service.go

@@ -0,0 +1,149 @@
+package service
+
+import (
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/entity"
+	IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
+	"app.yhyue.com/moapp/jy_docs/services/partner"
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"github.com/gogf/gf/v2/crypto/gmd5"
+	"github.com/gogf/gf/v2/crypto/gsha1"
+	"io"
+	"log"
+	"net/http"
+	"net/url"
+	"strings"
+)
+
+type HH struct {
+	Host     string
+	Pathname string
+	Method   string
+	Params   map[string]interface{}
+	Name     string
+	ApiName  string
+}
+
+// new
+func NewHH(name, host, apiName, pathname, method string, params map[string]interface{}) *HH {
+	return &HH{
+		Name:     name,
+		Host:     host,
+		ApiName:  apiName,
+		Pathname: pathname,
+		Method:   method,
+		Params:   params,
+	}
+}
+
+// 豆丁api 请求
+func (h *HH) HttpFunc() (body []byte, err error) {
+	if h.Params == nil || len(h.Params) == 0 {
+		err = fmt.Errorf("参数异常")
+		return
+	}
+	var (
+		href string
+		bb   *bytes.Buffer
+	)
+	switch h.Method {
+	case "POST":
+		href = fmt.Sprintf("%s%s", h.Host, h.Pathname)
+		b, _err := json.Marshal(h.Params)
+		if _err == nil {
+			bb = bytes.NewBuffer(b)
+		}
+	case "GET":
+		params := url.Values{}
+		for k, v := range h.Params {
+			params.Add(k, common.InterfaceToStr(v))
+		}
+		href = fmt.Sprintf("%s%s?%s", h.Host, h.Pathname, params.Encode())
+	}
+	// 创建 请求并添加查询参数
+	req, _err := http.NewRequest(h.Method, href, bb)
+	if _err != nil {
+		fmt.Println("Error creating GET request:", _err)
+		err = _err
+		return
+	}
+	// 添加请求头
+	req.Header.Add("Content-Type", "application/json")
+	//时间
+	req.Header.Add("Date", h.GetDate())
+	//Content-Md5
+	req.Header.Add("Content-Md5", h.GetContentMd5())
+	//Authorization
+	req.Header.Add("Authorization", h.GetAuthorization())
+	client := &http.Client{}
+	// 使用 Do 方法处理请求
+	resp, _err := client.Do(req)
+	if _err != nil {
+		log.Println("Failed to create client", http.StatusInternalServerError)
+		err = _err
+		return
+	}
+	defer resp.Body.Close()
+	body, err = io.ReadAll(resp.Body)
+	if err != nil {
+		log.Println("Failed to read response body", http.StatusInternalServerError)
+		return
+	}
+	return
+}
+
+// 时间
+func (h *HH) GetDate() string {
+	return date.NowFormat(entity.DateFormat)
+
+}
+
+// Content-Md5
+func (h *HH) GetContentMd5() string {
+	//hash := md5.Sum([]byte(h.Pathname))
+	//return strings.ToLower(hex.EncodeToString(hash[:]))
+	m5, _ := gmd5.EncryptString(h.Pathname)
+	return strings.ToLower(m5)
+}
+
+// Authorization
+func (h *HH) GetAuthorization() string {
+	// 计算 SHA1 值
+	//hm := hmac.New(sha1.New, []byte(IC.I.Docin.AppSecret))
+	//hm.Write([]byte(IC.I.Docin.AppSecret + h.GetContentMd5() + h.GetDate()))
+	//return fmt.Sprintf("WPS-2:%s:%s", IC.I.Docin.AppId, strings.ToLower(fmt.Sprintf("%x", hm.Sum(nil))))
+	return fmt.Sprintf("WPS-2:%s:%s", IC.I.Docin.AppId, strings.ToLower(gsha1.Encrypt(fmt.Sprintf("%s%s%s", IC.I.Docin.AppSecret, h.GetContentMd5(), h.GetDate()))))
+}
+
+// 豆丁api请求日志 存mongo
+func (h *HH) SaveRequestLogger(b []byte, err error) {
+	partner.SaveDocinRequestLogger(map[string]interface{}{
+		"name":       h.Name,
+		"host":       h.Host,
+		"apiName":    h.ApiName,
+		"params":     h.Params,
+		"method":     h.Method,
+		"pathname":   h.Pathname,
+		"createDate": date.NowFormat(date.Date_Full_Layout),
+		"content":    string(b),
+		"err":        err,
+	})
+}
+
+// 豆丁api请求日志 存mongo
+func (h *HH) SaveResponseData(b []byte, err error) {
+	partner.SaveDocinList(map[string]interface{}{
+		"name":       h.Name,
+		"host":       h.Host,
+		"apiName":    h.ApiName,
+		"params":     h.Params,
+		"method":     h.Method,
+		"pathname":   h.Pathname,
+		"createDate": date.NowFormat(date.Date_Full_Layout),
+		"content":    string(b),
+		"err":        err,
+	})
+}

+ 45 - 0
rpc/partnerlib/service/userBuy.go

@@ -0,0 +1,45 @@
+package service
+
+import (
+	IC "app.yhyue.com/moapp/jy_docs/rpc/partnerlib/init"
+	"app.yhyue.com/moapp/jy_docs/rpc/partnerlib/type/partnerlib"
+	"encoding/json"
+	"log"
+)
+
+type BRes struct {
+	Msg     string
+	Code    int64
+	OrderNo string
+}
+
+func UBHandle(in *partnerlib.UserBuyVipRequest) (res *partnerlib.CommonResponse, err error) {
+	res = new(partnerlib.CommonResponse)
+	var (
+		b []byte
+	)
+	h := NewHH(IC.I.Docin.Name, IC.I.Docin.Host, IC.I.Docin.BuyRecord.Name, IC.I.Docin.BuyRecord.Pathname, IC.I.Docin.BuyRecord.Method, map[string]interface{}{
+		"orderNo":   in.OrderCode,
+		"productId": in.ProductId,
+		"userId":    in.PositionId,
+		"price":     in.Price,
+		"priceVip":  in.PriceVip,
+		"type":      in.Type,
+		"orderTime": in.OrderTime,
+	})
+	b, err = h.HttpFunc()
+	go h.SaveRequestLogger(b, err)
+	if err == nil {
+		log.Println(string(b))
+		bRes := &BRes{}
+		if err = json.Unmarshal(b, &bRes); err == nil {
+			res.Data = bRes.OrderNo
+			res.Msg = bRes.Msg
+			res.Code = bRes.Code
+			return
+		}
+	}
+	res.Msg = err.Error()
+	res.Code = -1
+	return
+}

+ 466 - 0
rpc/partnerlib/type/partnerlib/partnerlib.pb.go

@@ -0,0 +1,466 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.28.0
+// 	protoc        v3.15.5
+// source: partnerlib.proto
+
+package partnerlib
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+//豆丁文档下载
+type UserDownloadRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	MgoUserId  string `protobuf:"bytes,1,opt,name=mgoUserId,proto3" json:"mgoUserId,omitempty"`    //用户mongo id
+	Phone      string `protobuf:"bytes,2,opt,name=phone,proto3" json:"phone,omitempty"`            //手机号
+	PositionId int64  `protobuf:"varint,3,opt,name=positionId,proto3" json:"positionId,omitempty"` //职位id
+	AppId      string `protobuf:"bytes,4,opt,name=appId,proto3" json:"appId,omitempty"`            //剑鱼标识
+	Cost       int64  `protobuf:"varint,5,opt,name=cost,proto3" json:"cost,omitempty"`             //费用
+	DocId      string `protobuf:"bytes,6,opt,name=docId,proto3" json:"docId,omitempty"`            //文档id
+	State      int64  `protobuf:"varint,7,opt,name=state,proto3" json:"state,omitempty"`           //1:豆丁
+}
+
+func (x *UserDownloadRequest) Reset() {
+	*x = UserDownloadRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_partnerlib_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UserDownloadRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UserDownloadRequest) ProtoMessage() {}
+
+func (x *UserDownloadRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_partnerlib_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UserDownloadRequest.ProtoReflect.Descriptor instead.
+func (*UserDownloadRequest) Descriptor() ([]byte, []int) {
+	return file_partnerlib_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *UserDownloadRequest) GetMgoUserId() string {
+	if x != nil {
+		return x.MgoUserId
+	}
+	return ""
+}
+
+func (x *UserDownloadRequest) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+func (x *UserDownloadRequest) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *UserDownloadRequest) GetAppId() string {
+	if x != nil {
+		return x.AppId
+	}
+	return ""
+}
+
+func (x *UserDownloadRequest) GetCost() int64 {
+	if x != nil {
+		return x.Cost
+	}
+	return 0
+}
+
+func (x *UserDownloadRequest) GetDocId() string {
+	if x != nil {
+		return x.DocId
+	}
+	return ""
+}
+
+func (x *UserDownloadRequest) GetState() int64 {
+	if x != nil {
+		return x.State
+	}
+	return 0
+}
+
+//豆丁会员购买
+type UserBuyVipRequest struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	MgoUserId  string `protobuf:"bytes,1,opt,name=mgoUserId,proto3" json:"mgoUserId,omitempty"`    //用户mongo id
+	Phone      string `protobuf:"bytes,2,opt,name=phone,proto3" json:"phone,omitempty"`            //手机号
+	PositionId int64  `protobuf:"varint,3,opt,name=positionId,proto3" json:"positionId,omitempty"` //职位id
+	AppId      string `protobuf:"bytes,4,opt,name=appId,proto3" json:"appId,omitempty"`            //剑鱼标识
+	OrderCode  string `protobuf:"bytes,5,opt,name=orderCode,proto3" json:"orderCode,omitempty"`    //订单号
+	ProductId  int64  `protobuf:"varint,6,opt,name=productId,proto3" json:"productId,omitempty"`   //文档id
+	Price      int64  `protobuf:"varint,7,opt,name=price,proto3" json:"price,omitempty"`           //价格金额,不可与券同时为空
+	PriceVip   int64  `protobuf:"varint,8,opt,name=priceVip,proto3" json:"priceVip,omitempty"`     //券,不可与金额同时为空
+	Type       int64  `protobuf:"varint,9,opt,name=type,proto3" json:"type,omitempty"`             //购买类型:1 币买文档,2 券买文档,3 月大会员,4 季大会员,5 年大会员
+	OrderTime  string `protobuf:"bytes,10,opt,name=orderTime,proto3" json:"orderTime,omitempty"`   //合作方订单时间,格式为yyyyMMddHHmmss
+	State      int64  `protobuf:"varint,11,opt,name=state,proto3" json:"state,omitempty"`          //1:豆丁
+	Mold       int64  `protobuf:"varint,12,opt,name=mold,proto3" json:"mold,omitempty"`            //0:保存文库会员购买记录订单信息;1:更新合作商购买订单信息
+}
+
+func (x *UserBuyVipRequest) Reset() {
+	*x = UserBuyVipRequest{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_partnerlib_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *UserBuyVipRequest) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*UserBuyVipRequest) ProtoMessage() {}
+
+func (x *UserBuyVipRequest) ProtoReflect() protoreflect.Message {
+	mi := &file_partnerlib_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use UserBuyVipRequest.ProtoReflect.Descriptor instead.
+func (*UserBuyVipRequest) Descriptor() ([]byte, []int) {
+	return file_partnerlib_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *UserBuyVipRequest) GetMgoUserId() string {
+	if x != nil {
+		return x.MgoUserId
+	}
+	return ""
+}
+
+func (x *UserBuyVipRequest) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+func (x *UserBuyVipRequest) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *UserBuyVipRequest) GetAppId() string {
+	if x != nil {
+		return x.AppId
+	}
+	return ""
+}
+
+func (x *UserBuyVipRequest) GetOrderCode() string {
+	if x != nil {
+		return x.OrderCode
+	}
+	return ""
+}
+
+func (x *UserBuyVipRequest) GetProductId() int64 {
+	if x != nil {
+		return x.ProductId
+	}
+	return 0
+}
+
+func (x *UserBuyVipRequest) GetPrice() int64 {
+	if x != nil {
+		return x.Price
+	}
+	return 0
+}
+
+func (x *UserBuyVipRequest) GetPriceVip() int64 {
+	if x != nil {
+		return x.PriceVip
+	}
+	return 0
+}
+
+func (x *UserBuyVipRequest) GetType() int64 {
+	if x != nil {
+		return x.Type
+	}
+	return 0
+}
+
+func (x *UserBuyVipRequest) GetOrderTime() string {
+	if x != nil {
+		return x.OrderTime
+	}
+	return ""
+}
+
+func (x *UserBuyVipRequest) GetState() int64 {
+	if x != nil {
+		return x.State
+	}
+	return 0
+}
+
+func (x *UserBuyVipRequest) GetMold() int64 {
+	if x != nil {
+		return x.Mold
+	}
+	return 0
+}
+
+//公共返回
+type CommonResponse struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Code int64  `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
+	Msg  string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"`
+	Data string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *CommonResponse) Reset() {
+	*x = CommonResponse{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_partnerlib_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CommonResponse) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CommonResponse) ProtoMessage() {}
+
+func (x *CommonResponse) ProtoReflect() protoreflect.Message {
+	mi := &file_partnerlib_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CommonResponse.ProtoReflect.Descriptor instead.
+func (*CommonResponse) Descriptor() ([]byte, []int) {
+	return file_partnerlib_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *CommonResponse) GetCode() int64 {
+	if x != nil {
+		return x.Code
+	}
+	return 0
+}
+
+func (x *CommonResponse) GetMsg() string {
+	if x != nil {
+		return x.Msg
+	}
+	return ""
+}
+
+func (x *CommonResponse) GetData() string {
+	if x != nil {
+		return x.Data
+	}
+	return ""
+}
+
+var File_partnerlib_proto protoreflect.FileDescriptor
+
+var file_partnerlib_proto_rawDesc = []byte{
+	0x0a, 0x10, 0x70, 0x61, 0x72, 0x74, 0x6e, 0x65, 0x72, 0x6c, 0x69, 0x62, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x12, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x6e, 0x65, 0x72, 0x6c, 0x69, 0x62, 0x22, 0xbf,
+	0x01, 0x0a, 0x13, 0x55, 0x73, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x67, 0x6f, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x67, 0x6f, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f,
+	0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
+	0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70,
+	0x70, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64,
+	0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04,
+	0x63, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x6f, 0x63, 0x49, 0x64, 0x18, 0x06, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x6f, 0x63, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x22, 0xc7, 0x02, 0x0a, 0x11, 0x55, 0x73, 0x65, 0x72, 0x42, 0x75, 0x79, 0x56, 0x69, 0x70, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x67, 0x6f, 0x55, 0x73, 0x65,
+	0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x67, 0x6f, 0x55, 0x73,
+	0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f,
+	0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
+	0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x70,
+	0x70, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x70, 0x70, 0x49, 0x64,
+	0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1c,
+	0x0a, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05,
+	0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x70, 0x72, 0x69,
+	0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x63, 0x65, 0x56, 0x69, 0x70, 0x18, 0x08,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x69, 0x63, 0x65, 0x56, 0x69, 0x70, 0x12, 0x12,
+	0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79,
+	0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x18,
+	0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65,
+	0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x6c, 0x64, 0x18, 0x0c,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6d, 0x6f, 0x6c, 0x64, 0x22, 0x4a, 0x0a, 0x0e, 0x43, 0x6f,
+	0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04,
+	0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65,
+	0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d,
+	0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x9b, 0x01, 0x0a, 0x07, 0x50, 0x61, 0x72, 0x74, 0x6e,
+	0x65, 0x72, 0x12, 0x4a, 0x0a, 0x0b, 0x44, 0x6f, 0x63, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61,
+	0x64, 0x12, 0x1f, 0x2e, 0x70, 0x61, 0x72, 0x74, 0x6e, 0x65, 0x72, 0x6c, 0x69, 0x62, 0x2e, 0x55,
+	0x73, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x61, 0x72, 0x74, 0x6e, 0x65, 0x72, 0x6c, 0x69, 0x62, 0x2e,
+	0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44,
+	0x0a, 0x07, 0x55, 0x73, 0x65, 0x72, 0x42, 0x75, 0x79, 0x12, 0x1d, 0x2e, 0x70, 0x61, 0x72, 0x74,
+	0x6e, 0x65, 0x72, 0x6c, 0x69, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x75, 0x79, 0x56, 0x69,
+	0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x70, 0x61, 0x72, 0x74, 0x6e,
+	0x65, 0x72, 0x6c, 0x69, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x6e, 0x65,
+	0x72, 0x6c, 0x69, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_partnerlib_proto_rawDescOnce sync.Once
+	file_partnerlib_proto_rawDescData = file_partnerlib_proto_rawDesc
+)
+
+func file_partnerlib_proto_rawDescGZIP() []byte {
+	file_partnerlib_proto_rawDescOnce.Do(func() {
+		file_partnerlib_proto_rawDescData = protoimpl.X.CompressGZIP(file_partnerlib_proto_rawDescData)
+	})
+	return file_partnerlib_proto_rawDescData
+}
+
+var file_partnerlib_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
+var file_partnerlib_proto_goTypes = []interface{}{
+	(*UserDownloadRequest)(nil), // 0: partnerlib.UserDownloadRequest
+	(*UserBuyVipRequest)(nil),   // 1: partnerlib.UserBuyVipRequest
+	(*CommonResponse)(nil),      // 2: partnerlib.CommonResponse
+}
+var file_partnerlib_proto_depIdxs = []int32{
+	0, // 0: partnerlib.Partner.DocDownload:input_type -> partnerlib.UserDownloadRequest
+	1, // 1: partnerlib.Partner.UserBuy:input_type -> partnerlib.UserBuyVipRequest
+	2, // 2: partnerlib.Partner.DocDownload:output_type -> partnerlib.CommonResponse
+	2, // 3: partnerlib.Partner.UserBuy:output_type -> partnerlib.CommonResponse
+	2, // [2:4] is the sub-list for method output_type
+	0, // [0:2] is the sub-list for method input_type
+	0, // [0:0] is the sub-list for extension type_name
+	0, // [0:0] is the sub-list for extension extendee
+	0, // [0:0] is the sub-list for field type_name
+}
+
+func init() { file_partnerlib_proto_init() }
+func file_partnerlib_proto_init() {
+	if File_partnerlib_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_partnerlib_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UserDownloadRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_partnerlib_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*UserBuyVipRequest); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_partnerlib_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CommonResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_partnerlib_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   3,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_partnerlib_proto_goTypes,
+		DependencyIndexes: file_partnerlib_proto_depIdxs,
+		MessageInfos:      file_partnerlib_proto_msgTypes,
+	}.Build()
+	File_partnerlib_proto = out.File
+	file_partnerlib_proto_rawDesc = nil
+	file_partnerlib_proto_goTypes = nil
+	file_partnerlib_proto_depIdxs = nil
+}

+ 141 - 0
rpc/partnerlib/type/partnerlib/partnerlib_grpc.pb.go

@@ -0,0 +1,141 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.2.0
+// - protoc             v3.15.5
+// source: partnerlib.proto
+
+package partnerlib
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+// PartnerClient is the client API for Partner service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type PartnerClient interface {
+	DocDownload(ctx context.Context, in *UserDownloadRequest, opts ...grpc.CallOption) (*CommonResponse, error)
+	UserBuy(ctx context.Context, in *UserBuyVipRequest, opts ...grpc.CallOption) (*CommonResponse, error)
+}
+
+type partnerClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewPartnerClient(cc grpc.ClientConnInterface) PartnerClient {
+	return &partnerClient{cc}
+}
+
+func (c *partnerClient) DocDownload(ctx context.Context, in *UserDownloadRequest, opts ...grpc.CallOption) (*CommonResponse, error) {
+	out := new(CommonResponse)
+	err := c.cc.Invoke(ctx, "/partnerlib.Partner/DocDownload", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *partnerClient) UserBuy(ctx context.Context, in *UserBuyVipRequest, opts ...grpc.CallOption) (*CommonResponse, error) {
+	out := new(CommonResponse)
+	err := c.cc.Invoke(ctx, "/partnerlib.Partner/UserBuy", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// PartnerServer is the server API for Partner service.
+// All implementations must embed UnimplementedPartnerServer
+// for forward compatibility
+type PartnerServer interface {
+	DocDownload(context.Context, *UserDownloadRequest) (*CommonResponse, error)
+	UserBuy(context.Context, *UserBuyVipRequest) (*CommonResponse, error)
+	mustEmbedUnimplementedPartnerServer()
+}
+
+// UnimplementedPartnerServer must be embedded to have forward compatible implementations.
+type UnimplementedPartnerServer struct {
+}
+
+func (UnimplementedPartnerServer) DocDownload(context.Context, *UserDownloadRequest) (*CommonResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DocDownload not implemented")
+}
+func (UnimplementedPartnerServer) UserBuy(context.Context, *UserBuyVipRequest) (*CommonResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method UserBuy not implemented")
+}
+func (UnimplementedPartnerServer) mustEmbedUnimplementedPartnerServer() {}
+
+// UnsafePartnerServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to PartnerServer will
+// result in compilation errors.
+type UnsafePartnerServer interface {
+	mustEmbedUnimplementedPartnerServer()
+}
+
+func RegisterPartnerServer(s grpc.ServiceRegistrar, srv PartnerServer) {
+	s.RegisterService(&Partner_ServiceDesc, srv)
+}
+
+func _Partner_DocDownload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UserDownloadRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PartnerServer).DocDownload(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/partnerlib.Partner/DocDownload",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PartnerServer).DocDownload(ctx, req.(*UserDownloadRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _Partner_UserBuy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(UserBuyVipRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(PartnerServer).UserBuy(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/partnerlib.Partner/UserBuy",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(PartnerServer).UserBuy(ctx, req.(*UserBuyVipRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// Partner_ServiceDesc is the grpc.ServiceDesc for Partner service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var Partner_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "partnerlib.Partner",
+	HandlerType: (*PartnerServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "DocDownload",
+			Handler:    _Partner_DocDownload_Handler,
+		},
+		{
+			MethodName: "UserBuy",
+			Handler:    _Partner_UserBuy_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "partnerlib.proto",
+}

+ 1 - 0
rpc/partnerlib/util/util.go

@@ -0,0 +1 @@
+package util

+ 3 - 0
rpc/partnerlib/warn/warn.go

@@ -0,0 +1,3 @@
+package warn
+
+//TODO docin 更新保存异常告警

+ 46 - 0
services/model/partner.go

@@ -0,0 +1,46 @@
+package model
+
+type Docin struct {
+	ProductId     int64  `json:"product_id" gorm:"column:product_id"`
+	ProductName   string `json:"product_name" gorm:"column:product_name"`
+	FilePostfix   string `json:"file_postfix" gorm:"column:file_postfix"`
+	FileSize      int64  `json:"file_size" gorm:"column:file_size"`
+	VisitCount    int64  `json:"visit_count" gorm:"column:visit_count"`
+	DownloadCount int64  `json:"download_count" gorm:"column:download_count"`
+	IfCharge      int64  `json:"if_charge" gorm:"column:if_charge"`
+	Price         int64  `json:"price" gorm:"column:price"`
+	PriceVip      int64  `json:"price_vip" gorm:"column:price_vip"`
+	PCatName      string `json:"p_cat_name" gorm:"column:p_cat_name"`
+	CatName       string `json:"cat_name" gorm:"column:cat_name"`
+	Desc          string `json:"desc" gorm:"column:desc"`
+	CreateDate    string `json:"create_date" gorm:"column:create_date"`
+	ModifyDate    string `json:"modify_date" gorm:"column:modify_date"`
+}
+
+func (ud *Docin) TableName() string {
+	return "doc"
+}
+
+//type DocinStatistics struct {
+//	DocId      string `json:"docId" gorm:"column:docId"`
+//	AppId      string `json:"appId" gorm:"column:appId"`
+//	UpdateDate string `json:"updateDate" gorm:"column:updateDate"`
+//	Score      string `json:"score" gorm:"column:score"`
+//	DownTimes  string `json:"downTimes" gorm:"column:downTimes"`
+//	ViewTimes  string `json:"viewTimes" gorm:"column:viewTimes"`
+//}
+//
+//func (ud *DocinStatistics) TableName() string {
+//	return "doc_statistics"
+//}
+
+type DocClass struct {
+	Name  string
+	Code  string
+	Level int
+	State int
+}
+
+func (dc *DocClass) TableName() string {
+	return "doc_class"
+}

+ 29 - 24
services/model/stdlib.go

@@ -5,30 +5,35 @@ import (
 )
 
 type Doc struct {
-	Id            string    `json:"id" gorm:"id"`
-	UserId        string    `json:"userId" gorm:"column:userId"`
-	AppId         string    `json:"appId" gorm:"column:appId"`
-	DocName       string    `json:"docName" gorm:"column:docName"`
-	DocFileType   int       `json:"docFileType" gorm:"column:docFileType"`
-	DocFileSuffix string    `json:"docFileSuffix" gorm:"column:docFileSuffix"`
-	DocFileSize   int       `json:"docFileSize" gorm:"column:docFileSize"`
-	DocPageSize   int       `json:"docPageSize" gorm:"column:docPageSize"`
-	DocTags       string    `json:"docTags" gorm:"column:docTags"`
-	DocClass      string    `json:"docClass" gorm:"column:docClass"`
-	UploadDate    time.Time `json:"uploadDate" gorm:"column:uploadDate"`
-	IsDelete      int       `json:"isDelete" gorm:"column:isDelete"`
-	OssDocId      string    `json:"ossDocId" gorm:"column:ossDocId"`
-	OssDocUrl     string    `json:"ossDocUrl" gorm:"column:ossDocUrl"`
-	Md5           string    `json:"md5" gorm:"column:md5"`
-	OssPdfId      string    `json:"ossPdfId" gorm:"column:ossPdfId"`
-	OssPdfUrl     string    `json:"ossPdfUrl" gorm:"column:ossPdfUrl"`
-	OssTxtId      string    `json:"ossTxtId" gorm:"column:ossTxtId"`
-	OssTxtUrl     string    `json:"ossTxtUrl" gorm:"column:ossTxtUrl"`
-	Price         int       `json:"price" gorm:"column:price"`
-	DownOrUp      int       `json:"downOrUp" gorm:"column:downOrUp"`
-	DocSummary    string    `json:"docSummary" gorm:"column:docSummary"`
-	PreviewImgId  string    `json:"preview_img_id" gorm:"column:previewImgId"`
-	PreviewImgUrl string    `json:"preview_img_url" gorm:"column:previewImgUrl"`
+	Id              string    `json:"id" gorm:"id"`
+	UserId          string    `json:"userId" gorm:"column:userId"`
+	AppId           string    `json:"appId" gorm:"column:appId"`
+	DocName         string    `json:"docName" gorm:"column:docName"`
+	DocFileType     int       `json:"docFileType" gorm:"column:docFileType"`
+	DocFileSuffix   string    `json:"docFileSuffix" gorm:"column:docFileSuffix"`
+	DocFileSize     int       `json:"docFileSize" gorm:"column:docFileSize"`
+	DocPageSize     int       `json:"docPageSize" gorm:"column:docPageSize"`
+	DocTags         string    `json:"docTags" gorm:"column:docTags"`
+	DocClass        string    `json:"docClass" gorm:"column:docClass"`
+	UploadDate      time.Time `json:"uploadDate" gorm:"column:uploadDate"`
+	IsDelete        int       `json:"isDelete" gorm:"column:isDelete"`
+	OssDocId        string    `json:"ossDocId" gorm:"column:ossDocId"`
+	OssDocUrl       string    `json:"ossDocUrl" gorm:"column:ossDocUrl"`
+	Md5             string    `json:"md5" gorm:"column:md5"`
+	OssPdfId        string    `json:"ossPdfId" gorm:"column:ossPdfId"`
+	OssPdfUrl       string    `json:"ossPdfUrl" gorm:"column:ossPdfUrl"`
+	OssTxtId        string    `json:"ossTxtId" gorm:"column:ossTxtId"`
+	OssTxtUrl       string    `json:"ossTxtUrl" gorm:"column:ossTxtUrl"`
+	Price           int       `json:"price" gorm:"column:price"`
+	PriceVip        int       `json:"priceVip" gorm:"column:priceVip"`
+	DownOrUp        int       `json:"downOrUp" gorm:"column:downOrUp"`
+	DocSummary      string    `json:"docSummary" gorm:"column:docSummary"`
+	PreviewImgId    string    `json:"preview_img_id" gorm:"column:previewImgId"`
+	PreviewImgUrl   string    `json:"preview_img_url" gorm:"column:previewImgUrl"`
+	EncryptionLevel int       `json:"encryption_level" gorm:"encryption_level"` //
+	Source          int       `json:"source" gorm:"source"`
+	ProductType     int       `json:"product_type" gorm:"encryption_level"`
+	UpdateDate      time.Time `json:"updateDate" gorm:"updateDate"`
 }
 
 func (ud *Doc) TableName() string {

+ 9 - 0
services/partner/docCheck.go

@@ -0,0 +1,9 @@
+package partner
+
+import docRpcUtil "app.yhyue.com/moapp/jy_docs/services/util"
+
+func CheckDocs(docId, md5Id string) bool {
+	var count int64
+	docRpcUtil.GetJyDocsDB().Exec("SELECT COUNT(id) FROM `doc` WHERE id = ? OR md5 = ?", docId, md5Id).Count(&count)
+	return count > 0
+}

+ 111 - 0
services/partner/docClass.go

@@ -0,0 +1,111 @@
+package partner
+
+import (
+	"app.yhyue.com/moapp/jy_docs/services/model"
+	docRpcUtil "app.yhyue.com/moapp/jy_docs/services/util"
+	"fmt"
+	"log"
+)
+
+var (
+	DocClassMap = map[string]string{}
+)
+
+// 初始化 文档分类关系
+func InitDocClass() {
+	var dcs = []*model.DocClass{}
+	if err := docRpcUtil.GetJyDocsDB().Table("doc_class").Find(&dcs).Error; err == nil && len(dcs) > 0 {
+		var (
+			jyMap  = map[string]string{}
+			tagMap = map[string]string{}
+		)
+		for _, dc := range dcs {
+			switch dc.State {
+			case 0:
+				jyMap[dc.Code] = dc.Name
+			default:
+				switch dc.Level {
+				case 1:
+					var (
+						dcpKey = fmt.Sprintf("p_%s_%d_class", dc.Name, dc.State) //一级class
+						dtpKey = fmt.Sprintf("p_%s_%d_tag", dc.Name, dc.State)   //一级tag
+					)
+					DocClassMap[dcpKey] = dc.Code
+					tagMap[dtpKey] = dc.Code
+				case 2:
+					var (
+						dcKey = fmt.Sprintf("c_%s_%d_class", dc.Name, dc.State) //二级class
+						dtKey = fmt.Sprintf("c_%s_%d_tag", dc.Name, dc.State)   //二级tag
+					)
+					DocClassMap[dcKey] = dc.Code
+					tagMap[dtKey] = dc.Code
+				}
+			}
+		}
+		if tagMap != nil && len(tagMap) > 0 {
+			for k, v := range tagMap {
+				if jyMap[v] != "" {
+					DocClassMap[k] = jyMap[v]
+				}
+			}
+		}
+	}
+}
+
+// 先查内存 再查表数据
+func SwitchDocClass(pName, name string, state int) (docTag []string, docClass string) {
+	var (
+		dcpKey = fmt.Sprintf("p_%s_%d_class", pName, state) //一级class
+		dtpKey = fmt.Sprintf("p_%s_%d_tag", pName, state)   //一级tag
+		dcKey  = fmt.Sprintf("c_%s_%d_class", name, state)  //二级class
+		dtKey  = fmt.Sprintf("c_%s_%d_tag", name, state)    //二级tag
+	)
+	if DocClassMap[dcpKey] != "" && DocClassMap[dtpKey] != "" {
+		docClass = DocClassMap[dcpKey]
+		if DocClassMap[dcKey] != "" {
+			docClass = DocClassMap[dcKey]
+		}
+		docTag = append(docTag, DocClassMap[dtpKey])
+		if DocClassMap[dtKey] != "" {
+			docTag = append(docTag, DocClassMap[dtKey])
+		}
+		return
+	}
+	orm := docRpcUtil.GetJyDocsDB()
+	mdc := model.DocClass{}
+	//合作商文库一级分类
+	err := orm.Where("`name`= ? AND  `level` = 1 AND state = ?", pName, state).First(&mdc).Error
+	if err != nil {
+		log.Println("一级分类转换失败:", err.Error())
+		return
+	}
+	//剑鱼文库一级分类
+	err = orm.Where("`code`= ? AND  `level` = 1 AND state = 0", mdc.Code).First(&mdc).Error
+	if err != nil {
+		log.Println("一级分类转换失败:", err.Error())
+		return
+	}
+	DocClassMap[dcpKey] = mdc.Code
+	DocClassMap[dtpKey] = mdc.Name
+	docTag = append(docTag, mdc.Name)
+	//二级分类
+	if name != "" {
+		//合作商文库二级分类
+		err = orm.Where("`name`= ? AND  `level` = 2 AND state = ?", name, state).First(&mdc).Error
+		if err != nil {
+			log.Println("二级分类转换失败:", err.Error())
+			return
+		}
+		//剑鱼文库二级分类
+		err = orm.Where("`code`= ? AND  `level` = 2 AND state = 0", mdc.Code).First(&mdc).Error
+		if err != nil {
+			log.Println("二级分类转换失败:", err.Error())
+			return
+		}
+		DocClassMap[dcKey] = mdc.Code
+		DocClassMap[dtKey] = mdc.Name
+		docTag = append(docTag, mdc.Name)
+	}
+	docClass = mdc.Code
+	return
+}

+ 16 - 0
services/partner/docsInsert.go

@@ -0,0 +1,16 @@
+package partner
+
+import (
+	"app.yhyue.com/moapp/jy_docs/services/model"
+	docRpcUtil "app.yhyue.com/moapp/jy_docs/services/util"
+	"log"
+)
+
+func DocsInsert(docinInfos []model.Doc, count int) {
+	res := docRpcUtil.GetJyDocsDB().CreateInBatches(&docinInfos, count)
+	if res.Error != nil {
+		log.Println("error:", res.Error)
+		return
+	}
+	return
+}

+ 15 - 0
services/partner/docsStatistics.go

@@ -0,0 +1,15 @@
+package partner
+
+import (
+	"app.yhyue.com/moapp/jy_docs/services/model"
+	docRpcUtil "app.yhyue.com/moapp/jy_docs/services/util"
+	"log"
+)
+
+func DocsStatistics(docinStatistics []model.DocStatistics, count int) {
+	res := docRpcUtil.GetJyDocsDB().CreateInBatches(&docinStatistics, count)
+	if res.Error != nil {
+		log.Println("error:", res.Error)
+		return
+	}
+}

+ 17 - 0
services/partner/docsUpdate.go

@@ -0,0 +1,17 @@
+package partner
+
+import (
+	"app.yhyue.com/moapp/jy_docs/services/model"
+	docRpcUtil "app.yhyue.com/moapp/jy_docs/services/util"
+	"app.yhyue.com/moapp/jybase/date"
+	"log"
+)
+
+func DocsUpdate(doc model.Doc) (err error) {
+	err = docRpcUtil.GetJyDocsDB().Exec(`UPDATE doc SET updateDate = ?,price = ?,priceVip = ?,product_type = ?,downOrUp = ? WHERE id = ?`, doc.UpdateDate.Format(date.Date_Full_Layout), doc.Price, doc.PriceVip, doc.ProductType, doc.DownOrUp, doc.Id).Error
+	if err.Error != nil {
+		log.Println("error:", err.Error)
+		return
+	}
+	return
+}

+ 13 - 0
services/partner/mgo.go

@@ -0,0 +1,13 @@
+package partner
+
+import docRpcUtil "app.yhyue.com/moapp/jy_docs/services/util"
+
+// 接口请求日志
+func SaveDocinRequestLogger(logMap map[string]interface{}) {
+	docRpcUtil.GetJyMgoLoggerDB().Save("doc_log", logMap)
+}
+
+// 豆丁文档列表mgo 记录
+func SaveDocinList(docs map[string]interface{}) {
+	docRpcUtil.GetJyMgoMainDB().Save("doc_info", docs)
+}

+ 28 - 0
services/partner/redis.go

@@ -0,0 +1,28 @@
+package partner
+
+import "app.yhyue.com/moapp/jybase/redis"
+
+// 存储文档doc 起始-id
+func SetDocsStartId(code, key string, startId int64, expireTime int) bool {
+	return redis.Put(code, key, startId, expireTime)
+}
+
+// 获取文档doc 起始-id
+func GetDocsStartId(code, key string) int64 {
+	return int64(redis.GetInt(code, key))
+}
+
+// 删除文档doc 起始-id
+func DelDocsStartId(code, key string) bool {
+	return redis.Del(code, key)
+}
+
+// 更新文档信息起始时间
+func SetUpdateTaskInfo(code, key, startDate string, expireTime int) bool {
+	return redis.Put(code, key, startDate, expireTime)
+}
+
+// 获取文档信息起始时间
+func GetUpdateTaskInfo(code, key string) string {
+	return redis.GetStr(code, key)
+}

+ 63 - 0
services/util/baseInit.go

@@ -2,12 +2,15 @@ package util
 
 import (
 	elastic "app.yhyue.com/moapp/jybase/esv7"
+	"app.yhyue.com/moapp/jybase/mongodb"
 	"app.yhyue.com/moapp/jybase/mysql"
+	"app.yhyue.com/moapp/jybase/redis"
 	"app.yhyue.com/moapp/jyfs/rpc/filesystemclient"
 	"github.com/zeromicro/go-zero/core/discov"
 	"github.com/zeromicro/go-zero/zrpc"
 	"gorm.io/gorm"
 	"log"
+	"strings"
 )
 
 type MysqlDBConfig struct {
@@ -25,9 +28,28 @@ type EsConfig struct {
 	Password string
 }
 
+type RedisConfig struct {
+	Addr []string
+}
+
+type MongoConfig struct {
+	Main   Mongo
+	Logger Mongo
+}
+
+type Mongo struct {
+	Address  string `json:"address"`
+	Size     int    `json:"size"`
+	DbName   string `json:"dbName"`
+	UserName string `json:"userName,optional"`
+	Password string `json:"password,optional"`
+}
+
 var (
 	jyDocsDB   *gorm.DB
 	FileSystem filesystemclient.FileSystem
+	mgoLog     *mongodb.MongodbSim
+	mgoMain    *mongodb.MongodbSim
 )
 
 func InitDB(url, driverName string, maxOpenConn, maxIdle int) {
@@ -52,6 +74,47 @@ func InitOss(etcd discov.EtcdConf) {
 	FileSystem = filesystemclient.NewFileSystem(client)
 }
 
+func InitRedis(rc RedisConfig) {
+	//初始化 redis
+	if len(rc.Addr) > 0 {
+		log.Println("--初始化 redis--")
+		redis.InitRedisBySize(strings.Join(rc.Addr, ","), 100, 30, 300)
+	}
+}
+
+func InitMongo(mgo MongoConfig) {
+	if mgo.Main.Address != "" {
+		log.Println("--初始化 mongodb main --")
+		mgoMain = &mongodb.MongodbSim{
+			MongodbAddr: mgo.Main.Address,
+			Size:        mgo.Main.Size,
+			DbName:      mgo.Main.DbName,
+			UserName:    mgo.Main.UserName,
+			Password:    mgo.Main.Password,
+		}
+		mgoMain.InitPool()
+	}
+	if mgo.Logger.Address != "" {
+		log.Println("--初始化 mongodb log--")
+		mgoLog = &mongodb.MongodbSim{
+			MongodbAddr: mgo.Logger.Address,
+			Size:        mgo.Logger.Size,
+			DbName:      mgo.Logger.DbName,
+			UserName:    mgo.Logger.UserName,
+			Password:    mgo.Logger.Password,
+		}
+		mgoLog.InitPool()
+	}
+}
+
+func GetJyMgoLoggerDB() *mongodb.MongodbSim {
+	return mgoLog
+}
+
+func GetJyMgoMainDB() *mongodb.MongodbSim {
+	return mgoMain
+}
+
 func GetJyDocsDB() *gorm.DB {
 	return jyDocsDB
 }