Преглед на файлове

Merge branch 'master' of https://jygit.jydev.jianyu360.cn/data_processing/data_field_dispose into master

zhangxinlei1996 преди 8 месеца
родител
ревизия
df3f1b8353
променени са 40 файла, в които са добавени 14166 реда и са изтрити 162 реда
  1. 0 1
      data_project/load_data.go
  2. 0 1
      data_project/main.go
  3. 1 0
      data_project/task.go
  4. 1 1
      data_project_wy/go.mod
  5. 204 0
      data_project_wy/go.sum
  6. 2 0
      data_project_wy_all/README.md
  7. 45 0
      data_project_wy_all/clickhouse.go
  8. 33 0
      data_project_wy_all/config.json
  9. BIN
      data_project_wy_all/data_project_wy_all
  10. 46 0
      data_project_wy_all/go.mod
  11. 241 0
      data_project_wy_all/go.sum
  12. 390 0
      data_project_wy_all/history.go
  13. 105 0
      data_project_wy_all/init.go
  14. 290 0
      data_project_wy_all/main.go
  15. 702 0
      data_project_wy_all/task.go
  16. 64 0
      data_project_wy_all/util.go
  17. 2 2
      data_tidb/project.go
  18. 9 9
      field_sync/file.go
  19. 7 0
      field_sync/go.mod
  20. 22 13
      field_sync/go.sum
  21. 16 19
      field_sync/init.go
  22. 5 4
      field_sync/jykeyword.go
  23. 73 0
      field_sync/jylog.go
  24. 24 23
      field_sync/main.go
  25. 176 88
      field_sync/task.go
  26. BIN
      field_sync_1/.DS_Store
  27. 9103 0
      field_sync_1/CommonDict.txt
  28. 108 0
      field_sync_1/common.toml
  29. 117 0
      field_sync_1/config/conf.go
  30. 82 0
      field_sync_1/config/conf_test.go
  31. 199 0
      field_sync_1/file.go
  32. 21 0
      field_sync_1/go.mod
  33. 433 0
      field_sync_1/go.sum
  34. 79 0
      field_sync_1/init.go
  35. 121 0
      field_sync_1/jykeyword.go
  36. 73 0
      field_sync_1/jylog.go
  37. 324 0
      field_sync_1/main.go
  38. 65 0
      field_sync_1/oss/ossclient.go
  39. 982 0
      field_sync_1/task.go
  40. 1 1
      monitor/main.go

+ 0 - 1
data_project/load_data.go

@@ -16,7 +16,6 @@ import (
 // 初始加载数据,默认加载最近6个月的数据
 func (p *ProjectTask) loadData(starttime int64) {
 	log.Info("load project start..", zap.Int64("starttime", starttime))
-
 	//清除进程时 会卡住注释掉
 	// p.findLock.Lock()
 	// defer p.findLock.Unlock()

+ 0 - 1
data_project/main.go

@@ -88,7 +88,6 @@ func main() {
 	}
 	go checkMapJob()
 	go P_QL.nsqMethod()
-
 	for {
 		mapinfo, ok := <-UdpChan
 		if !ok {

+ 1 - 0
data_project/task.go

@@ -182,6 +182,7 @@ func (p *ProjectTask) clearMem() {
 			//defer p.findLock.Unlock()
 			//合并进行的任务都完成
 			p.wg.Wait()
+			log.Info("3")
 			//遍历id
 			//所有内存中的项目信息
 			p.AllIdsMapLock.Lock()

+ 1 - 1
data_project_wy/go.mod

@@ -1,6 +1,6 @@
 module data_project_wy
 
-go 1.21.5
+go 1.23
 
 require (
 	github.com/ClickHouse/clickhouse-go/v2 v2.23.0

+ 204 - 0
data_project_wy/go.sum

@@ -0,0 +1,204 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg=
+github.com/ClickHouse/clickhouse-go/v2 v2.23.0/go.mod h1:tBhdF3f3RdP7sS59+oBAtTyhWpy0024ZxDMhgxra0QE=
+github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
+github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+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/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw=
+github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/gogf/gf/v2 v2.7.0/go.mod h1:Qu8nimKt9aupJQcdUL85tWF4Mfxocz97zUt8UC4abVI=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+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/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU=
+github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
+github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
+github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
+go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3/go.mod h1:1Rp0ioZBhikjXHYYXmnzL6RNfvTDM/2XvRB+vuPLurI=

+ 2 - 0
data_project_wy_all/README.md

@@ -0,0 +1,2 @@
+一、基于项目数据(project),生成物业项目信息
+二、基于增量招标信息(bidding),生成物业项目信息

+ 45 - 0
data_project_wy_all/clickhouse.go

@@ -0,0 +1,45 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"github.com/ClickHouse/clickhouse-go/v2"
+	"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
+	"time"
+)
+
+// 创建clickhouse连接
+func InitClickHouse(addr []string, size int, database, username, password string) (driver.Conn, error) {
+	var (
+		ctx       = context.Background()
+		conn, err = clickhouse.Open(&clickhouse.Options{
+			//Addr: []string{"cc-2ze9tv451wov14w9e.clickhouse.ads.aliyuncs.com:9000"}, //内网
+			//Addr: []string{"cc-2ze9tv451wov14w9e.public.clickhouse.ads.aliyuncs.com:9000"}, //外网
+			Addr:         addr,
+			DialTimeout:  10 * time.Second,
+			MaxIdleConns: 3,
+			MaxOpenConns: size,
+			Auth: clickhouse.Auth{
+				//Database: "information",
+				//Username: "biservice",
+				//Password: "Bi_top95215#",
+				Database: database,
+				Username: username,
+				Password: password,
+			},
+			Debugf: func(format string, v ...interface{}) {
+				fmt.Printf(format, v)
+			},
+		})
+	)
+	if err != nil {
+		return nil, err
+	}
+	if err := conn.Ping(ctx); err != nil {
+		if exception, ok := err.(*clickhouse.Exception); ok {
+			fmt.Printf("Exception [%d] %s \n%s\n", exception.Code, exception.Message, exception.StackTrace)
+		}
+		return nil, err
+	}
+	return conn, nil
+}

+ 33 - 0
data_project_wy_all/config.json

@@ -0,0 +1,33 @@
+{
+  "mgob": {
+    "addr": "192.168.3.166:27082",
+    "dbname": "qfw",
+    "size": 5,
+    "username": "",
+    "password": ""
+  },
+  "mgopro": {
+    "addr": "192.168.3.166:27082",
+    "dbname": "qfw",
+    "size": 5,
+    "username": "",
+    "password": ""
+  },
+  "clickhouse": {
+    "addr": ["192.168.3.207:19000"],
+    "database": "information",
+    "size": 20,
+    "username": "jytop",
+    "password": "pwdTopJy123"
+  },
+  "es": {
+    "addr": "http://192.168.3.149:9201",
+    "size": 10,
+    "index": "transaction_info",
+    "username": "",
+    "password": ""
+  },
+  "bidstarttime": 1713196800,
+  "prostarttime": 1713196800,
+  "startcron": "0 0 9 ? * *"
+}

BIN
data_project/projectset → data_project_wy_all/data_project_wy_all


+ 46 - 0
data_project_wy_all/go.mod

@@ -0,0 +1,46 @@
+module data_project_wy_all
+
+go 1.21.5
+
+require (
+	github.com/ClickHouse/clickhouse-go/v2 v2.23.0
+	github.com/gogf/gf/v2 v2.7.0
+	github.com/olivere/elastic/v7 v7.0.32
+	github.com/robfig/cron v1.2.0
+	go.mongodb.org/mongo-driver v1.11.4
+	jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3
+)
+
+require (
+	github.com/ClickHouse/ch-go v0.61.5 // indirect
+	github.com/PuerkitoBio/goquery v1.8.0 // indirect
+	github.com/andybalholm/brotli v1.1.0 // indirect
+	github.com/andybalholm/cascadia v1.3.1 // indirect
+	github.com/dchest/captcha v1.0.0 // indirect
+	github.com/go-faster/city v1.0.1 // indirect
+	github.com/go-faster/errors v0.7.1 // indirect
+	github.com/golang/snappy v0.0.1 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
+	github.com/klauspost/compress v1.17.7 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/paulmach/orb v0.11.1 // indirect
+	github.com/pierrec/lz4/v4 v4.1.21 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/segmentio/asm v1.2.0 // indirect
+	github.com/shopspring/decimal v1.3.1 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.1.1 // indirect
+	github.com/xdg-go/stringprep v1.0.3 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
+	go.opentelemetry.io/otel v1.24.0 // indirect
+	go.opentelemetry.io/otel/trace v1.24.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.22.0 // indirect
+	golang.org/x/sync v0.6.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)

+ 241 - 0
data_project_wy_all/go.sum

@@ -0,0 +1,241 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4=
+github.com/ClickHouse/ch-go v0.61.5/go.mod h1:s1LJW/F/LcFs5HJnuogFMta50kKDO0lf9zzfrbl0RQg=
+github.com/ClickHouse/clickhouse-go/v2 v2.23.0 h1:srmRrkS0BR8gEut87u8jpcZ7geOob6nGj9ifrb+aKmg=
+github.com/ClickHouse/clickhouse-go/v2 v2.23.0/go.mod h1:tBhdF3f3RdP7sS59+oBAtTyhWpy0024ZxDMhgxra0QE=
+github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
+github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
+github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
+github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
+github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+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/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o=
+github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw=
+github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw=
+github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg=
+github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/gogf/gf/v2 v2.7.0 h1:CjxhbMiE7oqf6K8ZtGuKt3dQEwK4vL6LhiI+dI7tJGU=
+github.com/gogf/gf/v2 v2.7.0/go.mod h1:Qu8nimKt9aupJQcdUL85tWF4Mfxocz97zUt8UC4abVI=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/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/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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
+github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+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/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=
+github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU=
+github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU=
+github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
+github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
+github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
+github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
+github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
+github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
+github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
+github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+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.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
+github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
+github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+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.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
+go.mongodb.org/mongo-driver v1.11.4 h1:4ayjakA013OdpGyL2K3ZqylTac/rMjrJOMZ1EHizXas=
+go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk=
+go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
+go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
+go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
+go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
+go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
+golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3 h1:mTokQIoOu/oZ2oCSAPayIFfnglIHP0qbOw1Ez6biKDo=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3/go.mod h1:1Rp0ioZBhikjXHYYXmnzL6RNfvTDM/2XvRB+vuPLurI=

+ 390 - 0
data_project_wy_all/history.go

@@ -0,0 +1,390 @@
+package main
+
+import (
+	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"strings"
+	"sync"
+)
+
+// HisTransactionDataFromBid 历史bidding(指定截止comeintime,采购意向)
+func HisTransactionDataFromBid() {
+	sess := MgoB.GetMgoConn()
+	defer MgoB.DestoryMongoConn(sess)
+	ch := make(chan bool, 10)
+	wg := &sync.WaitGroup{}
+	lock := &sync.Mutex{}
+	query := map[string]interface{}{
+		"toptype": "采购意向",
+	}
+	fields := map[string]interface{}{
+		"projectname":   1,
+		"budget":        1,
+		"bidamount":     1,
+		"buyer":         1,
+		"s_winner":      1,
+		"agency":        1,
+		"property_form": 1,
+		"multipackage":  1,
+		"area":          1,
+		"city":          1,
+		"district":      1,
+		//
+		"publishtime":           1,
+		"comeintime":            1,
+		"extracttype":           1,
+		"tag_subinformation":    1,
+		"tag_subinformation_ai": 1,
+		"tag_topinformation":    1,
+		"tag_topinformation_ai": 1,
+	}
+	arr := []map[string]interface{}{}
+	it := sess.DB(MgoB.DbName).C("bidding").Find(&query).Select(&fields).Iter()
+	n := 0
+	for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			if gconv.Int64(tmp["comeintime"]) >= 1713196800 { //截止时间1713196800
+				return
+			}
+			if gconv.Int(tmp["extracttype"]) == -1 { //重复数据过滤
+				return
+			}
+			if tmp["tag_topinformation"] == nil && tmp["tag_topinformation_ai"] == nil { //无效数据过滤
+				return
+			}
+			result := DealTransactionForBid(tmp, "采购意向", 3)
+			lock.Lock()
+			if len(result) > 0 {
+				arr = append(arr, result)
+			}
+			if len(arr) > 50 {
+				MgoPro.SaveBulk("projectset_wy", arr...)
+				arr = []map[string]interface{}{}
+			}
+			lock.Unlock()
+		}(tmp)
+		if n%10000 == 0 {
+			fmt.Println("current:", n)
+		}
+		tmp = map[string]interface{}{}
+	}
+	wg.Wait()
+	if len(arr) > 0 {
+		MgoPro.SaveBulk("projectset_wy", arr...)
+		arr = []map[string]interface{}{}
+	}
+	fmt.Println("结束")
+}
+
+// HisTransactionDataFromBid2 历史bidding(指定截止comeintime,新增物业项目)
+func HisTransactionDataFromBid2() {
+	sess := MgoB.GetMgoConn()
+	defer MgoB.DestoryMongoConn(sess)
+	ch := make(chan bool, 20)
+	wg := &sync.WaitGroup{}
+	lock := &sync.Mutex{}
+	query := map[string]interface{}{
+		"comeintime": map[string]interface{}{
+			"$gte": 1713715200,
+			"$lt":  1713801600,
+		},
+		"toptype": "拟建",
+	}
+	fields := map[string]interface{}{
+		"projectname":   1,
+		"budget":        1,
+		"bidamount":     1,
+		"buyer":         1,
+		"s_winner":      1,
+		"agency":        1,
+		"property_form": 1,
+		"multipackage":  1,
+		"area":          1,
+		"city":          1,
+		"district":      1,
+		//
+		"owner":                 1,
+		"s_topscopeclass":       1,
+		"publishtime":           1,
+		"toptype":               1,
+		"comeintime":            1,
+		"extracttype":           1,
+		"tag_subinformation":    1,
+		"tag_subinformation_ai": 1,
+		"tag_topinformation":    1,
+		"tag_topinformation_ai": 1,
+	}
+	arr := []map[string]interface{}{}
+	it := sess.DB(MgoB.DbName).C("bidding").Find(&query).Select(&fields).Iter()
+	n := 0
+	for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			//comeintime := gconv.Int64(tmp["comeintime"])
+			//if comeintime < 1609430400 || comeintime >= 1713715200 {
+			//	return
+			//}
+			if gconv.Int(tmp["extracttype"]) == -1 { //重复数据过滤
+				return
+			}
+			if s_topscopeclass := gconv.String(tmp["s_topscopeclass"]); !strings.Contains(s_topscopeclass, "建筑工程") { //排除非建筑工程
+				return
+			}
+			if tag_topinformation := gconv.String(tmp["tag_topinformation"]); strings.Contains(tag_topinformation, "物业") { //排除物业
+				return
+			} else if tag_topinformation_ai := gconv.String(tmp["tag_topinformation_ai"]); strings.Contains(tag_topinformation_ai, "物业") {
+				return
+			}
+			//if tmp["tag_topinformation"] != nil || tmp["tag_topinformation_ai"] != nil { //不包含物业
+			//	return
+			//}
+			project_bidstatus := 4 //拟建
+			business_type := "新增物业项目"
+			result := DealTransactionForBid(tmp, business_type, project_bidstatus)
+			lock.Lock()
+			if len(result) > 0 {
+				arr = append(arr, result)
+			}
+			if len(arr) > 50 {
+				MgoPro.SaveBulk("projectset_wy_nj", arr...)
+				arr = []map[string]interface{}{}
+			}
+			lock.Unlock()
+		}(tmp)
+		if n%10000 == 0 {
+			fmt.Println("current:", n)
+		}
+		tmp = map[string]interface{}{}
+	}
+	wg.Wait()
+	if len(arr) > 0 {
+		MgoPro.SaveBulk("projectset_wy_nj", arr...)
+		arr = []map[string]interface{}{}
+	}
+	fmt.Println("结束")
+}
+
+// HisTransactionDataFromProject 历史project(指定截止pici:1713196800)
+func HisTransactionDataFromProject() {
+	sess := MgoPro.GetMgoConn()
+	defer MgoPro.DestoryMongoConn(sess)
+	ch := make(chan bool, 20)
+	wg := &sync.WaitGroup{}
+	lock := &sync.Mutex{}
+	query := map[string]interface{}{
+		"pici": map[string]interface{}{
+			"$lt": 1713196800,
+			//"$gt": 1711900800,
+		},
+	}
+	fields := map[string]interface{}{
+		"projectname":   1,
+		"budget":        1,
+		"bidamount":     1,
+		"buyer":         1,
+		"s_winner":      1,
+		"agency":        1,
+		"property_form": 1,
+		"multipackage":  1,
+		"area":          1,
+		"city":          1,
+		"district":      1,
+		"zbtime":        1,
+		"jgtime":        1,
+		"bidstatus":     1,
+		//
+		"firsttime":             1,
+		"ids":                   1,
+		"pici":                  1,
+		"sourceinfoid":          1,
+		"tag_subinformation":    1,
+		"tag_subinformation_ai": 1,
+		"tag_topinformation":    1,
+		"tag_topinformation_ai": 1,
+	}
+	arr := []map[string]interface{}{}
+	it := sess.DB(MgoPro.DbName).C("projectset_20230904").Find(&query).Select(&fields).Iter()
+	n := 0
+	for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			if tmp["tag_topinformation"] == nil && tmp["tag_topinformation_ai"] == nil { //无效数据过滤
+				return
+			}
+			result := DealTransactionForPro(tmp)
+			lock.Lock()
+			if len(result) > 0 {
+				arr = append(arr, result)
+			}
+			if len(arr) > 50 {
+				MgoPro.SaveBulk("projectset_wy_newback", arr...)
+				arr = []map[string]interface{}{}
+			}
+			lock.Unlock()
+		}(tmp)
+		if n%10000 == 0 {
+			fmt.Println("current:", n)
+		}
+		tmp = map[string]interface{}{}
+	}
+	wg.Wait()
+	if len(arr) > 0 {
+		MgoPro.SaveBulk("projectset_wy_newback", arr...)
+		arr = []map[string]interface{}{}
+	}
+	fmt.Println("结束")
+}
+
+// HisTransactionDataAddInformation 补充字段信息
+func HisTransactionDataAddInformation() {
+	sess := MgoPro.GetMgoConn()
+	defer MgoPro.DestoryMongoConn(sess)
+	ch := make(chan bool, 1)
+	wg := &sync.WaitGroup{}
+	lock := &sync.Mutex{}
+	query := map[string]interface{}{
+		//"_id": mongodb.StringTOBsonId("662f01d8397fa006e2e75e6c"),
+		//项目
+		//"_id": map[string]interface{}{
+		//	"$gte": mongodb.StringTOBsonId("66308fa06f6c86a3960ae83f"),
+		//	"$lte": mongodb.StringTOBsonId("66308feb6f6c86a3960b0f4e"),
+		//},
+		//拟建
+		//"project_bidstatus": 4,
+		//"_id": map[string]interface{}{
+		//	"$lte": mongodb.StringTOBsonId("6627227819c5408c474c3802"),
+		//},
+		//采购意向
+		//"project_bidstatus": 3,
+		//"_id": map[string]interface{}{
+		//	"$lte": mongodb.StringTOBsonId("661f798b5a4e6cc01349dad0"),
+		//},
+
+		//历史projectset_wy
+		//"project_id": map[string]interface{}{
+		//	//"$gt":  "662143800000000000000000",
+		//	"$gt": "667c3b5166cf0db42ae965e6",
+		//},
+
+		"project_id": "6637ae0866cf0db42aeeb5d4",
+		//历史projectset_wy_back
+		//"update_time": map[string]interface{}{
+		//	"$gte": 1714959573,
+		//	"$lte": 1719795791,
+		//},
+	}
+	count := MgoPro.Count("projectset_wy_back", query)
+	fmt.Println("count:", count)
+	it := sess.DB(MgoPro.DbName).C("projectset_wy_back").Find(&query).Iter()
+	n := 0
+	arr := [][]map[string]interface{}{}
+	for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			id := mongodb.BsonIdToSId(tmp["_id"])
+			update := []map[string]interface{}{
+				{"_id": mongodb.StringTOBsonId(id)},
+			}
+			set := map[string]interface{}{}
+			//法人信息
+			buyer_id, agency_id, winner_ids := FindEntInfoData(id, gconv.String(tmp["buyer"]), gconv.String(tmp["agency"]), gconv.Strings(tmp["winner"]))
+			//更新
+			set["buyer_id"] = buyer_id
+			set["agency_id"] = agency_id
+			set["winner_id"] = winner_ids
+			//保存
+			tmp["buyer_id"] = buyer_id
+			tmp["agency_id"] = agency_id
+			tmp["winner_id"] = winner_ids
+
+			if from := gconv.String(tmp["from"]); from == "project" {
+				//项目信息补充业态
+				//project_id := gconv.String(tmp["project_id"])
+				//pro, _ := MgoPro.FindById("projectset_20230904", project_id, map[string]interface{}{"property_form": 1})
+				//if len(*pro) > 0 && (*pro)["property_form"] != nil {
+				//	//更新
+				//	set["property_form"] = (*pro)["property_form"]
+				//	//保存
+				//	tmp["property_form"] = (*pro)["property_form"]
+				//}
+
+				//查询情报信息
+				ids := gconv.Strings(tmp["info_ids"])
+				info := FindInfomationData(ids...) //情报信息查询
+				//更新
+				set["information_id"] = info.Id
+				set["starttime"] = info.Starttime
+				set["endtime"] = info.Endtime
+				//保存
+				tmp["information_id"] = info.Id
+				tmp["starttime"] = info.Starttime
+				tmp["endtime"] = info.Endtime
+			} else {
+				if project_bidstatus := gconv.Int(tmp["project_bidstatus"]); project_bidstatus == 4 { //拟建新增物业项目,补充情报信息
+					//查询情报信息
+					id := gconv.String(tmp["info_id"])
+					info := FindInfomationData(id) //情报信息查询
+					//更新
+					set["information_id"] = info.Id
+					set["starttime"] = info.Starttime
+					set["endtime"] = info.Endtime
+					//保存
+					tmp["information_id"] = info.Id
+					tmp["starttime"] = info.Starttime
+					tmp["endtime"] = info.Endtime
+				}
+			}
+			delete(tmp, "from")     //无用字段删除
+			delete(tmp, "_id")      //无用字段删除
+			if !SaveDataToEs(tmp) { //保存、更新es
+				fmt.Println("数据保存es失败,数据类型  项目project_id", tmp["project_id"])
+			}
+			var err error
+			err = UpdateOrSaveDataToClickHouse(tmp) //保存、更新clickhouse
+			if err != nil {
+				fmt.Println("数据迁移失败,数据类型 项目project_id", tmp["project_id"], err)
+			}
+			//更新
+			update = append(update, map[string]interface{}{"$set": set})
+			lock.Lock()
+			arr = append(arr, update)
+			if len(arr) > 100 {
+				MgoPro.UpdateBulk("projectset_wy_back", arr...)
+				arr = [][]map[string]interface{}{}
+			}
+			lock.Unlock()
+		}(tmp)
+		if n%100 == 0 {
+			fmt.Println("current:", n)
+		}
+		tmp = map[string]interface{}{}
+	}
+	wg.Wait()
+	if len(arr) > 0 {
+		MgoPro.UpdateBulk("projectset_wy_back", arr...)
+		arr = [][]map[string]interface{}{}
+	}
+	fmt.Println("迁移结束...")
+}

+ 105 - 0
data_project_wy_all/init.go

@@ -0,0 +1,105 @@
+package main
+
+import (
+	"github.com/ClickHouse/clickhouse-go/v2/lib/driver"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/elastic"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+)
+
+type conf struct {
+	MgoB   db `json:"mgob"`
+	MgoPro db `json:"mgopro"`
+	//MysqlDb    db  `json:"mysqldb"`
+	ClickHouse   ckh    `json:"clickhouse"`
+	Es           db     `json:"es"`
+	BidStartTime int64  `json:"bidstarttime"` //bidding增量起始id
+	ProStartTime int64  `json:"prostarttime"` //project增量起始id
+	StartCron    string `json:"startcron"`
+}
+type db struct {
+	Addr     string `json:"addr"`
+	DbName   string `json:"dbname"`
+	Size     int    `json:"size"`
+	Username string `json:"username"`
+	Password string `json:"password"`
+	Index    string `json:"index"`
+}
+type ckh struct {
+	Addr     []string `json:"addr"`
+	DataBase string   `json:"database"`
+	Size     int      `json:"size"`
+	Username string   `json:"username"`
+	Password string   `json:"password"`
+}
+
+var (
+	Config  conf
+	MgoB    *mongodb.MongodbSim //bidding
+	MgoPro  *mongodb.MongodbSim //project
+	CkhTool driver.Conn         //
+	Es      *elastic.Elastic
+	//MysqlTool *mysqldb.Mysql
+	BidStartTime int64
+	ProStartTime int64
+)
+
+//var (
+//	TransactionSaveCache = make(chan map[string]interface{}, 1000) //
+//	Transaction_Ch       = make(chan bool, 5)
+//)
+
+func InitMgo() {
+	//bidding
+	MgoB = &mongodb.MongodbSim{
+		MongodbAddr: Config.MgoB.Addr,
+		DbName:      Config.MgoB.DbName,
+		Size:        Config.MgoB.Size,
+		UserName:    Config.MgoB.Username,
+		Password:    Config.MgoB.Password,
+	}
+	MgoB.InitPool()
+	//project
+	MgoPro = &mongodb.MongodbSim{
+		MongodbAddr: Config.MgoPro.Addr,
+		DbName:      Config.MgoPro.DbName,
+		Size:        Config.MgoPro.Size,
+		UserName:    Config.MgoPro.Username,
+		Password:    Config.MgoPro.Password,
+	}
+	MgoPro.InitPool()
+}
+
+//func InitMysql() {
+//	MysqlTool = &mysqldb.Mysql{
+//		Address:  Config.MysqlDb.Addr,
+//		DBName:   Config.MysqlDb.DbName,
+//		UserName: Config.MysqlDb.Username,
+//		PassWord: Config.MysqlDb.Password,
+//	}
+//	MysqlTool.Init()
+//}
+
+func InitCkh() {
+	CkhTool, _ = InitClickHouse(
+		Config.ClickHouse.Addr,
+		Config.ClickHouse.Size,
+		Config.ClickHouse.DataBase,
+		Config.ClickHouse.Username,
+		Config.ClickHouse.Password,
+	)
+}
+
+func InitEs() {
+	Es = &elastic.Elastic{
+		S_esurl:  Config.Es.Addr,
+		I_size:   Config.Es.Size,
+		Username: Config.Es.Username,
+		Password: Config.Es.Password,
+	}
+	Es.InitElasticSize()
+}
+
+func InitOther() {
+	BidStartTime = Config.BidStartTime
+	ProStartTime = Config.ProStartTime
+}

+ 290 - 0
data_project_wy_all/main.go

@@ -0,0 +1,290 @@
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"fmt"
+	"io"
+	"log"
+	"sync"
+
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/olivere/elastic/v7"
+	"github.com/robfig/cron"
+)
+
+func init() {
+	ReadConfig(&Config) //初始化
+	InitMgo()           //mgo
+	InitCkh()           //clickhouse
+	InitEs()            //es
+	InitOther()
+}
+
+func main() {
+	c := cron.New()
+	c.AddFunc("0 0 4 ? * *", IncTransactionDataFromBid) //增量bidding和项目数据
+	c.Start()
+	d := cron.New()
+	d.AddFunc("0 0 5 ? * *", IncTransactionDataFromPro) //增量bidding和项目数据
+	d.Start()
+	//历史
+	//HisTransactionDataFromBid() //历史招标(bidding)数据,截止时间1713196800采购意向 TODO 待补充法人信息
+	//HisTransactionDataFromBid2() //历史招标(bidding)数据,截止时间1713628800新增项目 TODO 待补充情报信息、法人信息
+	//HisTransactionDataFromProject() //历史项目数据(projectset_20230904)TODO 待补充业态、情报信息、法人信息
+	//临时处理(信息补充)
+	//HisTransactionDataAddInformation() //历史信息补充法人库信息,项目信息补充业态property_form
+	//IncTransactionDataMgoToCkhAndEs()  //数据迁移
+	ch := make(chan bool)
+	<-ch
+}
+
+func tmp() {
+	sess := MgoPro.GetMgoConn()
+	defer MgoPro.DestoryMongoConn(sess)
+	ch := make(chan bool, 5)
+	wg := &sync.WaitGroup{}
+	lock := &sync.Mutex{}
+	query := map[string]interface{}{
+		//"project_bidstatus": 4,
+		//"_id": map[string]interface{}{
+		//	"$gte": mongodb.StringTOBsonId("66213b290f6ba3eb160617ad"),
+		//},
+		//"update_time": map[string]interface{}{
+		//	"$lt": 1714959573,
+		//},
+		//"_id": mongodb.StringTOBsonId("6630eae76f6c86a3962f3a07"),
+		//"repeat": true,
+		"update_time": map[string]interface{}{
+			"$gte": 1714959573,
+			"$lte": 1719795791,
+		},
+	}
+	repeat := map[string]bool{}
+	count := MgoPro.Count("projectset_wy_back", query)
+	fmt.Println("count:", count)
+	it := sess.DB(MgoPro.DbName).C("projectset_wy_back").Find(&query).Iter()
+	n := 0
+	arr := [][]map[string]interface{}{}
+	for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			update := []map[string]interface{}{}
+			project_id := gconv.String(tmp["project_id"])
+			//lock.Lock()
+			//if !repeat[project_id] {
+			//Es.DelById(Config.Es.Index, project_id)
+			//CkhTool.Exec(context.Background(), "ALTER TABLE information.transaction_info_copy DELETE WHERE project_id = ?", project_id)
+			//repeat[project_id] = true
+			//}
+			//lock.Unlock()
+			//err, result := Es.GetById(Config.Es.Index, project_id)
+			//Es.DelById()
+			//if err != nil || len(result) == 0 {
+			//	fmt.Println(project_id)
+			//	update = append(update, map[string]interface{}{"_id": tmp["_id"]})
+			//	update = append(update, map[string]interface{}{"$set": map[string]interface{}{"es": false}})
+			//} else {
+			//	if gconv.Int(result["project_bidstatus"]) != 0 {
+			//		fmt.Println("11", project_id)
+			//	}
+			//}
+
+			tt := map[string]bool{}
+			err, result := Es.GetById(Config.Es.Index, gconv.String(tmp["_id"]))
+			if err != nil || len(result) == 0 {
+				tt["es"] = true
+			}
+			if FindClickHouseByProjectId(project_id) == 0 {
+				tt["click"] = true
+			}
+			if len(tt) > 0 {
+				update = append(update, map[string]interface{}{"_id": tmp["_id"]})
+				update = append(update, map[string]interface{}{"$set": map[string]interface{}{"repeat": tt}})
+			}
+			//if MgoPro.Count("projectset_wy_back", map[string]interface{}{"project_id": tmp["project_id"]}) > 1 {
+			//	fmt.Println("project_id")
+			//	update = append(update, map[string]interface{}{"_id": tmp["_id"]})
+			//	update = append(update, map[string]interface{}{"$set": map[string]interface{}{"repeat": "project"}})
+			//} else if MgoB.Count("projectset_wy", map[string]interface{}{"project_id": tmp["project_id"]}) > 0 {
+			//	update = append(update, map[string]interface{}{"_id": tmp["_id"]})
+			//	update = append(update, map[string]interface{}{"$set": map[string]interface{}{"repeat": "bidding"}})
+			//}
+			if len(update) > 0 {
+				lock.Lock()
+				arr = append(arr, update)
+				if len(arr) > 500 {
+					MgoPro.UpdateBulk("projectset_wy_back", arr...)
+					arr = [][]map[string]interface{}{}
+				}
+				lock.Unlock()
+			}
+		}(tmp)
+		if n%1000 == 0 {
+			fmt.Println("current:", n)
+		}
+		tmp = map[string]interface{}{}
+	}
+	wg.Wait()
+	if len(arr) > 0 {
+		MgoPro.UpdateBulk("projectset_wy_back", arr...)
+		arr = [][]map[string]interface{}{}
+	}
+	fmt.Println("迁移结束...", len(repeat))
+}
+
+func getBiddingData() {
+	url := "http://172.17.4.184:19908"
+	//url := "http://127.0.0.1:19908"
+	//url := "http://192.168.3.149:9200"
+	username := "jybid"
+	password := "Top2023_JEB01i@31"
+	index := "transaction_info" //索引名称
+	// 创建 Elasticsearch 客户端
+	client, err := elastic.NewClient(
+		elastic.SetURL(url),
+		elastic.SetBasicAuth(username, password),
+		elastic.SetSniff(false),
+	)
+	if err != nil {
+		log.Fatalf("创建 Elasticsearch 客户端失败:%s", err)
+	}
+
+	//rangeQuery := elastic.NewRangeQuery("project_bidstatus").Lt(3)
+	query := elastic.NewBoolQuery().
+		Must(elastic.NewTermQuery("id", "64d7146cb44bf08751e3c133")) //
+	//Must(rangeQuery)
+	//Must(elastic.NewTermQuery("subtype", "招标"))
+
+	//query := elastic.NewBoolQuery().
+	//        //北京,天津,河北,上海,江苏,浙江,安徽
+	//        //Must(elastic.NewTermQuery("area", "北京市")).
+	//        Must(elastic.NewTermsQuery("subtype", "中标", "单一", "成交", "合同")).
+	//        Must(elastic.NewTermsQuery("area", "北京", "上海", "江苏", "浙江", "广东")).
+	//        Must(rangeQuery)
+
+	ctx := context.Background()
+	//开始滚动搜索
+	scrollID := ""
+	scroll := "10m"
+	searchSource := elastic.NewSearchSource().
+		Query(query).
+		Size(500)
+	//Sort("_doc", true) //升序排序
+	//Sort("_doc", false) //降序排序
+
+	searchService := client.Scroll(index).
+		Size(500).
+		Scroll(scroll).
+		SearchSource(searchSource)
+
+	res, err := searchService.Do(ctx)
+
+	if err != nil {
+		if err == io.EOF {
+			fmt.Println("没有数据")
+		} else {
+			panic(err)
+		}
+
+	}
+	//defer client.ClearScroll().ScrollId(scrollID).Do(ctx) // 在退出时清理资源
+	fmt.Println("总数是:", res.TotalHits())
+
+	total := 0
+	for len(res.Hits.Hits) > 0 {
+		for _, hit := range res.Hits.Hits {
+			var doc map[string]interface{}
+			err := json.Unmarshal(hit.Source, &doc)
+			if err != nil {
+				log.Printf("解析文档失败:%s", err)
+				continue
+			}
+			set := map[string]interface{}{}
+			id := gconv.String(doc["id"])
+			//情报
+			information_id := gconv.String(doc["information_id"])
+			info_ids := gconv.Strings(doc["info_ids"])
+			info := FindInfomationData(info_ids...)
+			if information_id != info.Id {
+				doc["information_id"] = info.Id
+				doc["starttime"] = info.Starttime
+				doc["endtime"] = info.Endtime
+				set["information_id"] = info.Id
+				set["starttime"] = info.Starttime
+				set["endtime"] = info.Endtime
+			}
+
+			//法人
+			buyer, agency := "", ""
+			winners := []string{}
+			if gconv.String(doc["buyer_id"]) == "" {
+				buyer = gconv.String(doc["buyer"])
+			}
+			if gconv.String(doc["agency_id"]) == "" {
+				agency = gconv.String(doc["agency"])
+			}
+			if len(gconv.Strings(doc["winner_id"])) == 0 {
+				if winnersTmp := gconv.Strings(doc["winner"]); len(winnersTmp) > 0 {
+					winners = winnersTmp
+				}
+			}
+			buyer_id, agency_id, winner_ids := FindEntInfoData(id, buyer, agency, winners)
+			if buyer_id != "" {
+				doc["buyer_id"] = buyer_id
+				set["buyer_id"] = buyer_id
+			}
+			if agency_id != "" {
+				doc["agency_id"] = agency_id
+				set["agency_id"] = agency_id
+			}
+			if len(winner_ids) > 0 {
+				doc["winner_id"] = winner_ids
+				set["winner_id"] = winner_ids
+			}
+			//
+			coll := "projectset_wy_back"
+			business_type := gconv.String(doc["business_type"])
+			if business_type == "新增项目" {
+				coll = "projectset_wy"
+				doc["business_type"] = "新增物业项目"
+				set["business_type"] = "新增物业项目"
+			} else if business_type == "采购意向" {
+				coll = "projectset_wy"
+			}
+			fmt.Println(set)
+			if len(set) > 0 {
+				//更新es
+				client.Update().Index(index).Id(id).Doc(doc).Do(context.Background())
+				//更新clickhouse
+				err := UpdateDataToClickHouse(set, map[string]interface{}{"project_id": id})
+				fmt.Println("11", err)
+				//更新mgo
+				MgoPro.Update(coll, map[string]interface{}{"project_id": id}, map[string]interface{}{"$set": set}, false, false)
+			}
+		}
+		total = total + len(res.Hits.Hits)
+		scrollID = res.ScrollId
+		res, err = client.Scroll().ScrollId(scrollID).Scroll(scroll).Do(ctx)
+		log.Println("current count:", total)
+		if err != nil {
+			if err == io.EOF {
+				// 滚动到最后一批数据,退出循环
+				break
+			}
+			log.Println("滚动搜索失败:", err, res)
+			break // 处理错误时退出循环
+		}
+	}
+	// 在循环外调用 ClearScroll
+	_, err = client.ClearScroll().ScrollId(scrollID).Do(ctx)
+	if err != nil {
+		log.Printf("清理滚动搜索失败:%s", err)
+	}
+	fmt.Println("结束~~~~~~~~~~~~~~~")
+}

+ 702 - 0
data_project_wy_all/task.go

@@ -0,0 +1,702 @@
+package main
+
+import (
+	"context"
+	"fmt"
+	"regexp"
+	"strings"
+	"sync"
+	"time"
+
+	"github.com/gogf/gf/v2/util/gconv"
+	"go.mongodb.org/mongo-driver/bson"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+)
+
+type Transaction struct {
+	Project_Id        string   `bson:"project_id"`
+	Project_Name      string   `bson:"project_name"`
+	Project_Budget    float64  `bson:"project_budget"`
+	Project_Bidamount float64  `bson:"project_bidamount"`
+	Project_Money     float64  `bson:"project_money"`
+	Business_Type     string   `bson:"business_type"`
+	Project_Bidstatus int      `bson:"project_bidstatus"`
+	Info_Id           string   `bson:"info_id"`
+	Info_Ids          []string `bson:"info_ids"`
+	Information_Id    string   `bson:"information_id"`
+	BuyerClass        string   `bson:"buyerclass"`
+	Buyer             string   `bson:"buyer"`
+	Buyer_Id          string   `bson:"buyer_id"`
+	Winner            []string `bson:"winner"`
+	Winner_Id         []string `bson:"winner_id"`
+	Agency            string   `bson:"agency"`
+	Agency_Id         string   `bson:"agency_id"`
+	Property_Form     []string `bson:"property_form"`
+	SubClass          []string `bson:"subclass"`
+	MultiPackage      int      `bson:"multipackage"`
+	Topscopeclass     []string `bson:"topscopeclass"`
+	Area              string   `bson:"area"`
+	City              string   `bson:"city"`
+	District          string   `bson:"district"`
+	ZbTime            int64    `bson:"zbtime"`
+	JgTime            int64    `bson:"jgtime"`
+	StartTime         int64    `bson:"starttime"`
+	EndTime           int64    `bson:"endtime"`
+	Create_Time       int64    `bson:"create_time"`
+	Update_Time       int64    `bson:"update_time"`
+	//
+	// From string `bson:"from"`
+}
+
+var regLetter = regexp.MustCompile("[a-z]*")
+
+func IncTransactionDataFromBidAndPro() {
+	// IncTransactionDataFromBid() //bidding
+	IncTransactionDataFromPro() //project
+	// IncTransactionDataMgoToCkhAndEs() //mongodb迁移至clickhouse
+}
+
+// IncTransactionDataFromBid 增量bidding
+func IncTransactionDataFromBid() {
+	stime := time.Now().AddDate(0, 0, -1)
+	BidStartTime := time.Date(stime.Year(), stime.Month(), stime.Day(), 0, 0, 0, 0, stime.Location()).Unix()
+	fmt.Println("开始执行增量采购意向、拟建信息")
+	query := map[string]interface{}{
+		"pici": map[string]interface{}{
+			"$gte": BidStartTime,
+			"$lt":  BidStartTime + 86400,
+		},
+	}
+	fmt.Println("增量bidding采购意向query:", query)
+	sess := MgoB.GetMgoConn()
+	defer MgoB.DestoryMongoConn(sess)
+	ch := make(chan bool, 1)
+	wg := &sync.WaitGroup{}
+	// lock := &sync.Mutex{}
+	fields := map[string]interface{}{
+		"projectname":   1,
+		"budget":        1,
+		"bidamount":     1,
+		"buyer":         1,
+		"s_winner":      1,
+		"agency":        1,
+		"property_form": 1,
+		"multipackage":  1,
+		"area":          1,
+		"city":          1,
+		"district":      1,
+		"buyerclass":    1,
+		//
+		"owner":                 1,
+		"s_topscopeclass":       1,
+		"publishtime":           1,
+		"toptype":               1,
+		"extracttype":           1,
+		"tag_subinformation":    1,
+		"tag_subinformation_ai": 1,
+		"tag_topinformation":    1,
+		"tag_topinformation_ai": 1,
+	}
+	// arr := []map[string]interface{}{}
+	it := sess.DB(MgoB.DbName).C("bidding").Find(&query).Select(&fields).Sort("-_id").Iter()
+	n := 0
+	// count := 0
+	for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			if gconv.Int(tmp["extracttype"]) == -1 { //重复数据过滤
+				return
+			}
+			toptype := gconv.String(tmp["toptype"])
+			// tag_topinformation := gconv.String(tmp["tag_topinformation"])
+			// tag_topinformation_ai := gconv.String(tmp["tag_topinformation_ai"])
+			var business_type string
+			var project_bidstatus int
+			if toptype == "采购意向" { //采购意向数据
+				// if !strings.Contains(tag_topinformation, "物业") && !strings.Contains(tag_topinformation_ai, "物业") {
+				// 	return
+				// }
+				business_type = "采购意向"
+				project_bidstatus = 3
+			} else if toptype == "拟建" {
+				s_topscopeclass := gconv.String(tmp["s_topscopeclass"])
+				// if !strings.Contains(s_topscopeclass, "建筑工程") || strings.Contains(tag_topinformation, "物业") || strings.Contains(tag_topinformation_ai, "物业") {
+				if !strings.Contains(s_topscopeclass, "建筑工程") {
+					return
+				}
+				business_type = "新增物业项目"
+				project_bidstatus = 4
+			} else {
+				return
+			}
+			result := DealTransactionForBid(tmp, business_type, project_bidstatus)
+			if !SaveDataToEs(result) { //保存、更新es
+				fmt.Println("数据保存es失败,项目project_id", result["project_id"])
+			}
+			SaveDataToClickHouse(result)
+		}(tmp)
+		if n%1000 == 0 {
+			fmt.Println("current:", n)
+		}
+		tmp = map[string]interface{}{}
+	}
+	wg.Wait()
+	fmt.Println("增量采购意向、拟建信息结束")
+}
+
+// DealTransactionForBid bidding采购意向、拟建数据处理
+func DealTransactionForBid(tmp map[string]interface{}, business_type string, project_bidstatus int) map[string]interface{} {
+	//基本信息封装
+	id := mongodb.BsonIdToSId(tmp["_id"])
+	buyerclass := gconv.String(tmp["buyerclass"])
+	buyer := gconv.String(tmp["buyer"])
+	if buyer == "" {
+		buyer = gconv.String(tmp["owner"])
+	}
+	winner := gconv.String(tmp["s_winner"])
+	agency := gconv.String(tmp["agency"])
+	property_form := []string{}
+	if tmp["property_form"] != nil {
+		property_form = gconv.Strings(tmp["property_form"])
+	}
+	bidamount := gconv.Float64(tmp["bidamount"])
+	budget := gconv.Float64(tmp["budget"])
+	money := bidamount
+	if money <= 0 {
+		money = budget
+	}
+
+	//物业分类
+	subclass := []string{}
+	if tag_subinformation := tmp["tag_subinformation"]; tag_subinformation != nil {
+		subclass = gconv.Strings(tag_subinformation)
+	} else if tag_subinformation_ai := tmp["tag_subinformation_ai"]; tag_subinformation_ai != nil {
+		subclass = gconv.Strings(tag_subinformation_ai)
+	}
+
+	//情报信息查询
+	// info := FindInfomationData(id)
+	topscopeclass := []string{}
+	s_topscopeclass := gconv.String(tmp["s_topscopeclass"])
+	if s_topscopeclass != "" {
+		topscopeclass = strings.Split(s_topscopeclass, ",")
+	}
+	//法人信息
+	winners := []string{}
+	if winner != "" {
+		winners = strings.Split(winner, ",")
+	}
+	buyer_id, agency_id, winner_ids := FindEntInfoData(id, buyer, agency, winners)
+	//物业信息
+	t := &Transaction{
+		Project_Id:        id,
+		Project_Name:      gconv.String(tmp["projectname"]),
+		Project_Budget:    budget,
+		Project_Bidamount: bidamount,
+		Project_Money:     money,
+		Business_Type:     business_type,
+		Project_Bidstatus: project_bidstatus,
+		Info_Id:           id,
+		Info_Ids:          []string{id},
+		// Information_Id:    info.Id,
+		BuyerClass:    buyerclass,
+		Buyer:         buyer,
+		Topscopeclass: topscopeclass,
+		Winner:        winners,
+		Agency:        agency,
+		Buyer_Id:      buyer_id,
+		Winner_Id:     winner_ids,
+		Agency_Id:     agency_id,
+		Property_Form: property_form,
+		SubClass:      subclass,
+		MultiPackage:  gconv.Int(tmp["multipackage"]),
+		Area:          gconv.String(tmp["area"]),
+		City:          gconv.String(tmp["city"]),
+		District:      gconv.String(tmp["district"]),
+		ZbTime:        gconv.Int64(tmp["publishtime"]),
+		JgTime:        int64(0),
+		// StartTime:         info.Starttime,
+		// EndTime:           info.Endtime,
+		Create_Time: time.Now().Unix(),
+		Update_Time: time.Now().Unix(),
+		//
+		// From: "bidding",
+	}
+	result := map[string]interface{}{}
+	infomation, _ := bson.Marshal(t)
+	bson.Unmarshal(infomation, &result)
+	return result
+}
+
+// IncTransactionDataFromProject 增量project
+func IncTransactionDataFromPro() {
+	stime := time.Now().AddDate(0, 0, -1)
+	BidStartTime := time.Date(stime.Year(), stime.Month(), stime.Day(), 0, 0, 0, 0, stime.Location()).Unix()
+	fmt.Println("开始执行增量项目信息")
+	query := map[string]interface{}{
+		"pici": map[string]interface{}{
+			"$gte": BidStartTime,
+			"$lt":  BidStartTime + 86400,
+		},
+	}
+	fmt.Println("增量项目查询query:", query)
+	sess := MgoPro.GetMgoConn()
+	defer MgoPro.DestoryMongoConn(sess)
+	ch := make(chan bool, 1)
+	wg := &sync.WaitGroup{}
+	// lock := &sync.Mutex{}
+	fields := map[string]interface{}{
+		"projectname":   1,
+		"budget":        1,
+		"bidamount":     1,
+		"buyer":         1,
+		"s_winner":      1,
+		"agency":        1,
+		"property_form": 1,
+		"multipackage":  1,
+		"area":          1,
+		"city":          1,
+		"district":      1,
+		"zbtime":        1,
+		"jgtime":        1,
+		"bidstatus":     1,
+		"buyerclass":    1,
+		"topscopeclass": 1,
+		//
+		"firsttime":             1,
+		"pici":                  1,
+		"ids":                   1,
+		"sourceinfoid":          1,
+		"tag_subinformation":    1,
+		"tag_subinformation_ai": 1,
+		"tag_topinformation":    1,
+		"tag_topinformation_ai": 1,
+	}
+	it := sess.DB(MgoPro.DbName).C("projectset_20230904").Find(&query).Select(&fields).Iter()
+	n := 0
+	for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			bidstatus := gconv.String(tmp["bidstatus"])
+			if bidstatus == "中标" || bidstatus == "成交" || bidstatus == "合同" || bidstatus == "招标" {
+				result := DealTransactionForPro(tmp)
+				project_id := gconv.String(result["project_id"])
+				if !SaveDataToEs(result) { //保存、更新es
+					fmt.Println("数据保存es失败,项目project_id", result["project_id"])
+				}
+				count := FindClickHouseByProjectId(project_id) //查询
+				if count > 0 {                                 //更新
+					delete(result, "create_time") //不更新创建时间
+					delete(result, "project_id")  //不更新项目id(主键)
+					err := UpdateDataToClickHouse(result, map[string]interface{}{"project_id": project_id})
+					if err != nil {
+						fmt.Println("clickhouse更新失败", project_id, result)
+					}
+				} else { //插入
+					err := SaveDataToClickHouse(result)
+					if err != nil {
+						fmt.Println("clickhouse保存失败", project_id, result)
+					}
+				}
+			}
+		}(tmp)
+		if n%1000 == 0 {
+			fmt.Println("current:", n)
+		}
+		tmp = map[string]interface{}{}
+	}
+	wg.Wait()
+	fmt.Println("增量项目信息结束")
+}
+
+// DealTransactionForPro project数据处理
+func DealTransactionForPro(data map[string]interface{}) map[string]interface{} {
+	//基本信息封装
+	id := mongodb.BsonIdToSId(data["_id"])
+	buyerclass := gconv.String(data["buyerclass"])
+	buyer := gconv.String(data["buyer"])
+	winner := gconv.String(data["s_winner"])
+	agency := gconv.String(data["agency"])
+	zbtime := gconv.Int64(data["zbtime"])
+	if zbtime == 0 {
+		zbtime = gconv.Int64(data["firsttime"])
+	}
+	property_form := []string{}
+	if data["property_form"] != nil {
+		property_form = gconv.Strings(data["property_form"])
+	}
+	bidamount := gconv.Float64(data["bidamount"])
+	budget := gconv.Float64(data["budget"])
+	money := bidamount
+	if money <= 0 {
+		money = budget
+	}
+
+	//物业分类
+	subclass := []string{}
+	if tag_subinformation := data["tag_subinformation"]; tag_subinformation != nil {
+		subclass = gconv.Strings(tag_subinformation)
+	} else if tag_subinformation_ai := data["tag_subinformation_ai"]; tag_subinformation_ai != nil {
+		subclass = gconv.Strings(tag_subinformation_ai)
+	}
+
+	//项目状态、商机类型
+	business_type := ""
+	project_bidstatus := 2
+	bidstatus := gconv.String(data["bidstatus"])
+	if bidstatus == "中标" || bidstatus == "成交" || bidstatus == "合同" {
+		project_bidstatus = 1
+		business_type = "合约到期项目"
+	} else if bidstatus == "废标" || bidstatus == "流标" {
+		project_bidstatus = 0
+	} else if bidstatus == "拟建" {
+		project_bidstatus = 4
+	} else if bidstatus == "招标" {
+		business_type = "招标项目"
+	}
+	//查询情报信息
+	ids := gconv.Strings(data["ids"])
+	// info := FindInfomationData(ids...) //情报信息查询
+	topscopeclass := []string{}
+	// s_topscopeclass := gconv.String(data["s_topscopeclass"])
+	// if s_topscopeclass != "" {
+	// 	topscopeclass = strings.Split(s_topscopeclass, ",")
+	// }
+	if data["topscopeclass"] != nil {
+		if topscopeclasss, ok := data["topscopeclass"].([]interface{}); ok {
+			for _, v := range topscopeclasss {
+				tclass := regLetter.ReplaceAllString(gconv.String(v), "") // 去除字母
+				topscopeclass = append(topscopeclass, tclass)
+			}
+		}
+	}
+	//查询法人信息
+	winners := []string{}
+	if winner != "" {
+		winners = strings.Split(winner, ",")
+	}
+	buyer_id, agency_id, winner_ids := FindEntInfoData(id, buyer, agency, winners)
+	//物业信息
+	t := &Transaction{
+		Project_Id:        id,
+		Project_Name:      gconv.String(data["projectname"]),
+		Project_Budget:    budget,
+		Project_Bidamount: bidamount,
+		Project_Money:     money,
+		Business_Type:     business_type,
+		Project_Bidstatus: project_bidstatus,
+		Info_Id:           gconv.String(data["sourceinfoid"]),
+		Info_Ids:          ids,
+		// Information_Id:    info.Id,
+		BuyerClass:    buyerclass,
+		Buyer:         buyer,
+		Topscopeclass: topscopeclass,
+		Winner:        winners,
+		Agency:        agency,
+		Buyer_Id:      buyer_id,
+		Winner_Id:     winner_ids,
+		Agency_Id:     agency_id,
+		Property_Form: property_form,
+		SubClass:      subclass,
+		MultiPackage:  gconv.Int(data["multipackage"]),
+		Area:          gconv.String(data["area"]),
+		City:          gconv.String(data["city"]),
+		District:      gconv.String(data["district"]),
+		ZbTime:        zbtime,
+		JgTime:        gconv.Int64(data["jgtime"]),
+		// StartTime:         info.Starttime,
+		// EndTime:           info.Endtime,
+		Create_Time: time.Now().Unix(),
+		Update_Time: time.Now().Unix(),
+		//
+		// From: "project",
+	}
+	result := map[string]interface{}{}
+	infomation, _ := bson.Marshal(t)
+	bson.Unmarshal(infomation, &result)
+	return result
+}
+
+// IncTransactionDataMgoToCkhAndEs 数据迁移
+func IncTransactionDataMgoToCkhAndEs() {
+	/*
+		数据根据update_time查询
+		1、采购意向数据(from=bidding)只插入
+		2、项目信息先查,有则更新,无则插入
+	*/
+	fmt.Println("开始执行迁移...")
+	sess := MgoPro.GetMgoConn()
+	defer MgoPro.DestoryMongoConn(sess)
+	ch := make(chan bool, 1)
+	wg := &sync.WaitGroup{}
+	query := map[string]interface{}{
+		"update_time": map[string]interface{}{
+			"$gte": GetTime(0),
+		},
+	}
+	it := sess.DB(MgoPro.DbName).C("projectset_wy").Find(&query).Iter()
+	n := 0
+	for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			from := gconv.String(tmp["from"])
+			delete(tmp, "from")     //无用字段删除
+			delete(tmp, "_id")      //无用字段删除
+			if !SaveDataToEs(tmp) { //保存、更新es
+				fmt.Println("数据保存es失败,项目project_id", tmp["project_id"])
+			}
+			if from == "bidding" { //采购意向、拟建,插入
+				SaveDataToClickHouse(tmp)
+			} else { //项目信息,更新,插入
+				UpdateOrSaveDataToClickHouse(tmp)
+			}
+		}(tmp)
+		if n%100 == 0 {
+			fmt.Println("current:", n)
+		}
+		tmp = map[string]interface{}{}
+	}
+	wg.Wait()
+	fmt.Println("迁移结束...")
+}
+
+type Infomation struct {
+	Id        string
+	Starttime int64
+	Endtime   int64
+}
+
+// FindInfomationData 情报信息查询
+func FindInfomationData(ids ...string) (info Infomation) {
+	for _, id := range ids {
+		query := fmt.Sprintf(`SELECT id,starttime,endtime FROM %s WHERE datajson_id = ?`, Config.ClickHouse.DataBase+".information")
+		rows, err := CkhTool.Query(context.Background(), query, id)
+		if err != nil {
+			continue
+		}
+		for rows.Next() {
+			info = Infomation{}
+			if err := rows.Scan(&info.Id, &info.Starttime, &info.Endtime); err != nil {
+				fmt.Println("查询情报信息异常:", id, err)
+			}
+			if info.Id != "" {
+				return
+			}
+			//break //目前只有一条结果
+		}
+	}
+	return
+}
+
+// FindEntInfoData 法人信息查询
+func FindEntInfoData(bid, buyer, agency string, winners []string) (buyer_id, agency_id string, winner_ids []string) {
+	winner_ids = []string{}
+	winnerMap := map[string]bool{} //记录所有中标单位
+	values := []interface{}{}
+	placeholders := []string{}
+	if buyer != "" {
+		placeholders = append(placeholders, "?")
+		values = append(values, buyer)
+	}
+	if len(winners) > 0 {
+		for _, w := range winners {
+			winnerMap[w] = true
+			placeholders = append(placeholders, "?")
+			values = append(values, w)
+		}
+	}
+	if agency != "" {
+		placeholders = append(placeholders, "?")
+		values = append(values, agency)
+	}
+	if len(values) == 0 {
+		return
+	}
+	query := fmt.Sprintf(`SELECT id,company_name FROM %s WHERE company_name IN (%s)`, Config.ClickHouse.DataBase+".ent_info", strings.Join(placeholders, ","))
+	rows, err := CkhTool.Query(context.Background(), query, values...)
+	if err != nil {
+		return
+	}
+	for rows.Next() {
+		var id, company_name string
+		if err := rows.Scan(&id, &company_name); err == nil {
+			if company_name == buyer {
+				buyer_id = id
+			} else if company_name == agency {
+				agency_id = id
+			} else if winnerMap[company_name] {
+				winner_ids = append(winner_ids, id)
+			}
+		} else {
+			fmt.Println("查询法人信息异常:", err, bid)
+		}
+	}
+	return
+}
+
+// UpdateOrSaveDataToClickHouse 判断clickhouse更新or保存
+func UpdateOrSaveDataToClickHouse(data map[string]interface{}) (err error) {
+	project_id := gconv.String(data["project_id"])
+	count := FindClickHouseByProjectId(project_id) //查询
+	if count > 0 {                                 //更新
+		delete(data, "create_time") //不更新创建时间
+		delete(data, "project_id")  //不更新项目id(主键)
+		err = UpdateDataToClickHouse(data, map[string]interface{}{"project_id": project_id})
+		if err != nil {
+			fmt.Println("clickhouse更新失败", project_id, data)
+		}
+	} else { //插入
+		err = SaveDataToClickHouse(data)
+		if err != nil {
+			fmt.Println("clickhouse保存失败", project_id, data)
+		}
+	}
+	return
+}
+
+// SaveDataToClickHouse 数据保存clickhouse
+func SaveDataToClickHouse(data map[string]interface{}) error {
+	fields, placeholders := []string{}, []string{}
+	values := []interface{}{}
+	for k, v := range data {
+		fields = append(fields, k)
+		values = append(values, v)
+		placeholders = append(placeholders, "?")
+	}
+	query := fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s)", Config.ClickHouse.DataBase+".transaction_info_all", strings.Join(fields, ","), strings.Join(placeholders, ","))
+	return CkhTool.Exec(context.Background(), query, values...)
+}
+
+// FindClickHouseByProjectId 根据条件count clickhouse
+func FindClickHouseByProjectId(project_id string) int {
+	query := fmt.Sprintf(`SELECT COUNT(1) FROM %s WHERE project_id = ?`, Config.ClickHouse.DataBase+".transaction_info_all")
+	row := CkhTool.QueryRow(context.Background(), query, project_id)
+	var count uint64
+	row.Scan(&count)
+	return gconv.Int(count)
+}
+
+// UpdateDataToClickHouse 数据更新clickhouse
+func UpdateDataToClickHouse(data, querys map[string]interface{}) error {
+	sets := []string{}
+	values := []interface{}{}
+	for k, v := range data {
+		sets = append(sets, fmt.Sprintf("%s=?", k))
+		values = append(values, v)
+	}
+	qs := []string{}
+	for k, v := range querys {
+		qs = append(qs, fmt.Sprintf("%s=?", k))
+		values = append(values, v)
+	}
+	query := fmt.Sprintf("ALTER TABLE %s UPDATE %s WHERE %s", Config.ClickHouse.DataBase+".transaction_info_all", strings.Join(sets, ","), strings.Join(qs, ","))
+	//query := `ALTER TABLE information.transaction_info UPDATE update_time = ? WHERE project_id = '5c9ee78ca5cb26b9b7fd0b57'`
+	return CkhTool.Exec(context.Background(), query, values...)
+}
+
+// SaveDataToEs es存储
+func SaveDataToEs(data map[string]interface{}) bool {
+	tmp := map[string]interface{}{}
+	for k, v := range data {
+		if k == "project_id" {
+			k = "_id"
+		} else if k == "winner" || k == "winner_id" { //winner和winner_id无值不进es
+			if len(gconv.Strings(v)) == 0 {
+				continue
+			}
+		}
+		tmp[k] = v
+	}
+	err, result := Es.GetById(Config.Es.Index, gconv.String(tmp["_id"]))
+	if err == nil && len(result) > 0 { //存在,更新
+		tmp["create_time"] = result["create_time"] //不更新create_time
+	}
+	return Es.Save(Config.Es.Index, tmp)
+}
+
+func FindEntInfoData2(bid, buyer, agency string, winners []string) (buyer_id, agency_id string, winner_ids []string) {
+	query := fmt.Sprintf(`SELECT id FROM %s WHERE company_name = ?`, Config.ClickHouse.DataBase+".ent_info")
+	if buyer != "" {
+		buyer_id = GetClickHouseData(bid, query, buyer)
+	}
+	if agency != "" {
+		agency_id = GetClickHouseData(bid, query, agency)
+	}
+	if len(winners) > 0 {
+		for _, w := range winners {
+			winner_id := GetClickHouseData(bid, query, w)
+			if winner_id != "" {
+				winner_ids = append(winner_ids, winner_id)
+			}
+		}
+	}
+	return
+}
+
+func GetClickHouseData(bid, query, value string) string {
+	rows, err := CkhTool.Query(context.Background(), query, value)
+	if err != nil {
+		return ""
+	}
+	for rows.Next() {
+		var id string
+		if err := rows.Scan(&id); err == nil {
+			return id
+		} else {
+			fmt.Println("查询情报信息异常:", err, bid)
+		}
+	}
+	return ""
+}
+
+/*// SaveTransactionData 保存增量物业信息
+func SaveTransactionData() {
+	fmt.Println("save projectset_wy...")
+	savearr := make([]map[string]interface{}, 100)
+	indexdb := 0
+	for {
+		select {
+		case v := <-TransactionSaveCache:
+			savearr[indexdb] = v
+			indexdb++
+			if indexdb == 100 {
+				Transaction_Ch <- true
+				go func(tmp []map[string]interface{}) {
+					defer func() {
+						<-Transaction_Ch
+					}()
+					MgoPro.SaveBulk("projectset_wy", tmp...)
+				}(savearr)
+				savearr = make([]map[string]interface{}, 100)
+				indexdb = 0
+			}
+		case <-time.After(30 * time.Second):
+			if indexdb > 0 {
+				Transaction_Ch <- true
+				go func(tmp []map[string]interface{}) {
+					defer func() {
+						<-Transaction_Ch
+					}()
+					MgoPro.SaveBulk("projectset_wy", tmp...)
+				}(savearr[:indexdb])
+				savearr = make([]map[string]interface{}, 100)
+				indexdb = 0
+			}
+		}
+	}
+}*/

+ 64 - 0
data_project_wy_all/util.go

@@ -0,0 +1,64 @@
+package main
+
+import (
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"os"
+	"time"
+)
+
+const (
+	Date_Full_Layout    = "2006-01-02 15:04:05"
+	Date_Short_Layout   = "2006-01-02"
+	Date_Small_Layout   = "01-02"
+	Date_Time_Layout    = "15:04"
+	Date_yyyyMMdd       = "20060102"
+	Date_yyyyMMdd_Point = "2006.01.02"
+)
+
+func ReadConfig(config ...interface{}) {
+	var r *os.File
+	if len(config) > 1 {
+		filepath, _ := config[0].(string)
+		r, _ = os.Open(filepath)
+		defer r.Close()
+		bs, _ := ioutil.ReadAll(r)
+		json.Unmarshal(bs, config[1])
+	} else {
+		r, _ = os.Open("./config.json")
+		defer r.Close()
+		bs, _ := ioutil.ReadAll(r)
+		json.Unmarshal(bs, config[0])
+	}
+}
+
+func GetTime(day int) int64 {
+	nowTime := time.Now().AddDate(0, 0, day)
+	timeStr := FormatDate(&nowTime, Date_Short_Layout)
+	t, _ := time.ParseInLocation(Date_Short_Layout, timeStr, time.Local)
+	return t.Unix()
+}
+func FormatDateByInt64(src *int64, layout string) string {
+	var tmp int64
+	if *src > 0 {
+		if len(fmt.Sprint(*src)) >= 12 {
+			tmp = (*src) / 1000
+		} else {
+			tmp = (*src)
+		}
+	} else {
+		if len(fmt.Sprint(*src)) >= 13 {
+			tmp = (*src) / 1000
+		} else {
+			tmp = (*src)
+		}
+	}
+	date := time.Unix(tmp, 0)
+	return FormatDate(&date, layout)
+}
+
+// 日期格式化
+func FormatDate(src *time.Time, layout string) string {
+	return (*src).Local().Format(layout)
+}

+ 2 - 2
data_tidb/project.go

@@ -31,12 +31,12 @@ func taskR() {
 		"agencyperson", "s_winner", "winnertel", "winnerperson", "id", "pici")
 	util.Debug(Es.Count("bidding", query))
 	countDocs := 0
-	res, err := client.Scroll().Index("bidding").Query(query).FetchSourceContext(fsc).Scroll("5m").Size(2000).Do(context.Background()) //查询一条获取游标
+	res, err := client.Scroll().Index("bidding").Query(query).Sort("comeintime", true).FetchSourceContext(fsc).Scroll("5m").Size(2000).Do(context.Background()) //查询一条获取游标
 	if err == nil {
 		taskInfoA(res, wg, &countDocs)
 		scrollId := res.ScrollId
 		for {
-			searchResult, err := client.Scroll("1m").Index("bidding").ScrollId(scrollId).Size(2000).Do(context.TODO()) //查询
+			searchResult, err := client.Scroll("1m").Index("bidding").Sort("comeintime", true).ScrollId(scrollId).Size(2000).Do(context.TODO()) //查询
 			if err != nil {
 				util.Debug("Es Search Data Error:", err.Error())
 				break

+ 9 - 9
field_sync/file.go

@@ -3,14 +3,14 @@ package main
 import (
 	"bufio"
 	"fmt"
-	"go.uber.org/zap"
 	"io"
-	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
-	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
+	"log"
 	"os"
 	"regexp"
 	"strconv"
 	"strings"
+
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
 )
 
 var (
@@ -32,7 +32,7 @@ func InitFileInfo() {
 	LoadDict("CommonDict.txt") //初始化常用字典
 }
 
-//DFA
+// DFA
 type DFA struct {
 	Link map[string]interface{}
 }
@@ -86,11 +86,11 @@ func (d *DFA) CheckSensitiveWord(src string) []string {
 	return res
 }
 
-//加载统计的常用词
+// 加载统计的常用词
 func LoadDict(path string) {
 	dictFile, err := os.Open(path)
 	if err != nil {
-		log.Error("Load Common.txt Error")
+		log.Println("Load Common.txt Error")
 		os.Exit(-1)
 	}
 	defer dictFile.Close()
@@ -115,12 +115,12 @@ func LoadDict(path string) {
 				NotCommonDFA.AddWord(text)
 			}
 		} else {
-			log.Error("Read Line Error:", zap.Int("line", line))
+			log.Println("Read Line Error: line ", line)
 		}
 	}
 }
 
-//解析附件
+// 解析附件
 func AnalysisFile(filetext string) bool {
 	defer util.Catch()
 	//过滤空格
@@ -161,7 +161,7 @@ func AnalysisFile(filetext string) bool {
 	return false
 }
 
-//测试方法
+// 测试方法
 func AnalysisFileTest(detail string) (bool, string, int, float64, float64) {
 	//qu.Debug(detail)
 	defer util.Catch()

+ 7 - 0
field_sync/go.mod

@@ -6,6 +6,13 @@ require (
 	app.yhyue.com/moapp/jybase v0.0.0-20240205092729-2959d78b7619
 	github.com/BurntSushi/toml v1.2.0
 	github.com/aliyun/aliyun-oss-go-sdk v2.2.5+incompatible
+	github.com/go-xweb/httpsession v0.0.0-20141220075701-356d3b4d38d6 // indirect
+	github.com/go-xweb/log v0.0.0-20140701090824-270d183ad77e // indirect
+	github.com/go-xweb/uuid v0.0.0-20140604020037-d7dce341f851 // indirect
+	github.com/go-xweb/xweb v0.2.1
+	github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd // indirect
+	github.com/mattn/go-sqlite3 v1.14.22 // indirect
+	github.com/robfig/cron v1.2.0
 	go.mongodb.org/mongo-driver v1.11.0
 	go.uber.org/zap v1.22.0
 	golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect

+ 22 - 13
field_sync/go.sum

@@ -55,6 +55,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
 github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
@@ -70,6 +71,14 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre
 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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-xweb/httpsession v0.0.0-20141220075701-356d3b4d38d6 h1:DUiWdm3rS8cC96Y0XeVkDeizzEK6X+qiNgXytLVtbkM=
+github.com/go-xweb/httpsession v0.0.0-20141220075701-356d3b4d38d6/go.mod h1:lwPk13GS+i/NK4FkMm68IcJrAwiu+HtjYa1Y4kW59aY=
+github.com/go-xweb/log v0.0.0-20140701090824-270d183ad77e h1:xmffs7hgrWpAOcquZrdlWpAEaAdlI9myaYcUUmhIP7k=
+github.com/go-xweb/log v0.0.0-20140701090824-270d183ad77e/go.mod h1:ASmYUSBf32lWkkNVX/pnOU4MLuUQpFH4qYHvWHt/l0w=
+github.com/go-xweb/uuid v0.0.0-20140604020037-d7dce341f851 h1:D46USD6oGNWzoJ/h5CWaFq3ELLoLoJzllJ03Xh78VYg=
+github.com/go-xweb/uuid v0.0.0-20140604020037-d7dce341f851/go.mod h1:OmDEC58ZYO1Esk+Uy32SB6LWof9lyROl7q76dBFOCWw=
+github.com/go-xweb/xweb v0.2.1 h1:u5t/ttuSfxiIMDTXj/Pouw9C2ASNABWT16JWHyrtdvY=
+github.com/go-xweb/xweb v0.2.1/go.mod h1:vPjYJgfidYAgBKIwiAyKFC1hfczlqsw9rRT8LtwrGew=
 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
@@ -93,7 +102,6 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
 github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -109,13 +117,14 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 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/howeyc/fsnotify v0.9.0 h1:0gtV5JmOKH4A8SsFxG2BczSeXWWPvcMT0euZt5gDAxY=
 github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
 github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
@@ -136,16 +145,20 @@ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47e
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd h1:DXxmBCahjva4Ox4AWOv6pR1Csv33zSj97SaLOElfIsw=
+github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd/go.mod h1:3w9PScemEkJoLw3OYvLWMoD8XRCmXgGwsSpT6pFpJ0g=
 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
 github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -185,6 +198,8 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
+github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
 github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
@@ -200,9 +215,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
@@ -232,14 +247,12 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk=
 go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
 go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
 go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
 go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
-go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
 go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
@@ -284,7 +297,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220531201128-c960675eff93 h1:MYimHLfoXEpOhqd/zgoA/uoXzHB86AEky4LAx5ij9xA=
 golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
@@ -353,7 +365,6 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -391,16 +402,14 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
-gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
 gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

+ 16 - 19
field_sync/init.go

@@ -2,33 +2,30 @@ package main
 
 import (
 	"field_sync/config"
-	"fmt"
-	"os"
 
 	elastic "app.yhyue.com/moapp/jybase/es"
-	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
 )
 
 // InitLog @Description
 // @Author J 2022/7/26 15:30
-func InitLog() {
-	logcfg := config.Conf.Log
+// func InitLog() {
+// 	logcfg := config.Conf.Log
 
-	err := log.InitLog(
-		log.Path(logcfg.LogPath),
-		log.Level(logcfg.LogLevel),
-		log.Compress(logcfg.Compress),
-		log.MaxSize(logcfg.MaxSize),
-		log.MaxBackups(logcfg.MaxBackups),
-		log.MaxAge(logcfg.MaxAge),
-		log.Format(logcfg.Format),
-	)
-	if err != nil {
-		fmt.Printf("InitLog failed: %v\n", err)
-		os.Exit(1)
-	}
-}
+// 	err := log.InitLog(
+// 		log.Path(logcfg.LogPath),
+// 		log.Level(logcfg.LogLevel),
+// 		log.Compress(logcfg.Compress),
+// 		log.MaxSize(logcfg.MaxSize),
+// 		log.MaxBackups(logcfg.MaxBackups),
+// 		log.MaxAge(logcfg.MaxAge),
+// 		log.Format(logcfg.Format),
+// 	)
+// 	if err != nil {
+// 		fmt.Printf("InitLog failed: %v\n", err)
+// 		os.Exit(1)
+// 	}
+// }
 
 func InitMgo() {
 	MgoB = &mongodb.MongodbSim{

+ 5 - 4
field_sync/jykeyword.go

@@ -3,12 +3,13 @@ package main
 import (
 	"encoding/json"
 	"field_sync/config"
-	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
-	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
-	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mfw"
+	"log"
 	"regexp"
 	"strings"
 	"time"
+
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mfw"
 )
 
 var (
@@ -29,7 +30,7 @@ func inits() {
 		MsgServerAddr:   config.Conf.Serve.MsgAddr,
 		CanHandleEvents: []int{},
 		OnConnectSuccess: func() {
-			log.Info("剑鱼关键词 client")
+			log.Println("剑鱼关键词 client")
 		},
 		ReadBufferSize:  10,
 		WriteBufferSize: 10,

+ 73 - 0
field_sync/jylog.go

@@ -0,0 +1,73 @@
+package main
+
+/**
+日志文件自动切换,默认保留15天内日志
+**/
+
+import (
+	"log"
+	"os"
+	"path/filepath"
+	"regexp"
+	"time"
+
+	"github.com/go-xweb/xweb"
+	"github.com/robfig/cron"
+)
+
+// 日志格式
+var fileReg = regexp.MustCompile("^(\\d{4}_[0-9_]{14})\\.log$")
+
+// 当前日志文件句柄
+var LogFile *os.File
+
+// 时间格式
+var FMT = "2006_01_02_15_04_05"
+
+// 日志目录
+var LogPath = "./jylog"
+
+func init() {
+	os.Mkdir(LogPath, os.ModePerm)
+	//默认保留15天内的日志,-1为永久保留
+	initLog(15)
+}
+
+func initLog(saveDay int) {
+	go logfile()
+	task := cron.New()
+	task.Start()
+	task.AddFunc("0 0 0 * * ?", func() {
+		go logfile()
+		time.Sleep(50 * time.Second)
+		if saveDay > 0 {
+			filepath.Walk(LogPath, func(path string, info os.FileInfo, err error) error {
+				str := fileReg.FindStringSubmatch(info.Name())
+				if len(str) == 2 {
+					t, er := time.ParseInLocation(FMT, str[1], time.Local)
+					if er == nil {
+						if (time.Now().Unix()-t.Unix())/86400 > int64(saveDay) {
+							log.Println("delete log file:", path, os.Remove(path))
+						}
+					}
+				}
+				return nil
+			})
+		}
+	})
+}
+
+// 创建并切换输出文件
+func logfile() {
+	now := time.Now().Format(FMT)
+	file, _ := os.Create(LogPath + "/" + now + ".log")
+	log.SetOutput(file)
+	xweb.RootApp().Logger.SetOutput(file)
+	go func(file *os.File) {
+		time.Sleep(5 * time.Second)
+		if LogFile != nil {
+			LogFile.Close()
+		}
+		LogFile = file
+	}(file)
+}

+ 24 - 23
field_sync/main.go

@@ -12,11 +12,12 @@ import (
 	"sync"
 	"time"
 
+	"log"
+
 	elastic "app.yhyue.com/moapp/jybase/es"
 	"go.uber.org/zap"
 	"gopkg.in/mgo.v2/bson"
 	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
-	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
 	gonsq "jygit.jydev.jianyu360.cn/data_processing/common_utils/nsq"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/redis"
@@ -46,13 +47,13 @@ func init() {
 	config.Init("./common.toml")
 	oss.InitOss()
 	InitFileInfo()
-	InitLog()
+	// InitLog()
 	InitMgo()
 	InitEs()
 	inits()
 	redis.InitRedis1(config.Conf.DB.Redis.Addr, config.Conf.DB.Redis.DbIndex)
 
-	log.Info("init success")
+	log.Println("init success")
 }
 
 func main() {
@@ -64,19 +65,19 @@ func main() {
 
 	UdpClient = udp.UdpClient{Local: config.Conf.Udp.LocPort, BufSize: 1024}
 	UdpClient.Listen(processUdpMsg)
-	log.Info("Udp服务监听", zap.String("port:", config.Conf.Udp.LocPort))
+	log.Println("Udp服务监听 port:", config.Conf.Udp.LocPort)
 
 	info, _ := MgoB.Find("bidding_processing_ids", `{"dataprocess": 6}`, bson.M{"_id": 1}, nil, false, -1, -1)
-	util.Debug(len(*info))
-	log.Info("", zap.Int("size", len(*info)))
+	log.Println(len(*info))
+	log.Println("size", len(*info))
 	if len(*info) > 0 {
-		for i, m := range *info {
+		for _, m := range *info {
 			mapInfo := make(map[string]interface{})
 			mapInfo["gtid"] = util.ObjToString(m["gtid"])
 			mapInfo["lteid"] = util.ObjToString(m["lteid"])
 			mapInfo["stype"] = "bidding"
 			mapInfo["key"] = fmt.Sprintf("%s-%s-bidding", util.ObjToString(m["gtid"]), util.ObjToString(m["lteid"]))
-			log.Info(fmt.Sprint(i), zap.Any("--", mapInfo))
+			log.Println("--", mapInfo)
 			biddingTask(nil, mapInfo)
 		}
 	}
@@ -93,7 +94,7 @@ func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
 	case udp.OP_TYPE_DATA: //上个节点的数据
 		var mapInfo map[string]interface{}
 		err := json.Unmarshal(data, &mapInfo)
-		log.Info("processUdpMsg", zap.Any("mapInfo:", mapInfo))
+		log.Println("processUdpMsg mapInfo:", mapInfo)
 		if err != nil {
 			UdpClient.WriteUdp([]byte("err:"+err.Error()), udp.OP_NOOP, ra)
 		} else if mapInfo != nil {
@@ -136,14 +137,14 @@ func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
 					defer func() {
 						<-pool
 					}()
-					log.Error("err", zap.Any("mapinfo", mapInfo))
+					log.Println("err mapinfo ", mapInfo)
 				}()
 			}
 		}
 	case udp.OP_NOOP:
 		ok := string(data)
 		if ok != "" {
-			log.Info("udp re", zap.String("data:", ok))
+			log.Println("udp re data:", ok)
 			UdpTaskMap.Delete(ok)
 		}
 	}
@@ -164,7 +165,7 @@ func NextNode(mapInfo map[string]interface{}, stype string) {
 	mapInfo["stype"] = stype
 	key := fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), stype)
 	mapInfo["key"] = key
-	log.Info("udp es node", zap.Any("mapinfo:", mapInfo))
+	log.Println("udp es node mapinfo:", mapInfo)
 	datas, _ := json.Marshal(mapInfo)
 	node := &UdpNode{datas, next, time.Now().Unix(), 0}
 	UdpTaskMap.Store(key, node)
@@ -183,7 +184,7 @@ func NextNodePro(mapInfo map[string]interface{}, stype string) {
 	}
 	key := fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
 	mapInfo["key"] = key
-	log.Info("udp project node", zap.Any("mapinfo:", mapInfo))
+	log.Println("udp project node mapinfo:", mapInfo)
 	datas, _ := json.Marshal(mapInfo)
 	node := &UdpNode{datas, next, time.Now().Unix(), 0}
 	UdpTaskMap.Store(key, node)
@@ -197,7 +198,7 @@ func NextNodeBidData(mapInfo map[string]interface{}) {
 	}
 	mapInfo["stype"] = "biddingdata"
 	mapInfo["key"] = fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
-	log.Info("udp es node", zap.Any("mapinfo:", mapInfo))
+	log.Println("udp es node mapinfo:", mapInfo)
 	datas, _ := json.Marshal(mapInfo)
 	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
 }
@@ -209,7 +210,7 @@ func NextNodeTidbQyxy(mapInfo map[string]interface{}) {
 	}
 	mapInfo["stype"] = config.Conf.Udp.Tidb.Stype
 	mapInfo["key"] = fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
-	log.Info("udp tidb-qyxy node", zap.Any("mapinfo:", mapInfo))
+	log.Println("udp tidb-qyxy node mapinfo:", mapInfo)
 	datas, _ := json.Marshal(mapInfo)
 	node := &UdpNode{datas, next, time.Now().Unix(), 0}
 	UdpTaskMap.Store(mapInfo["key"], node)
@@ -223,7 +224,7 @@ func NextNodeTidb(mapInfo map[string]interface{}, stype string) {
 	}
 	mapInfo["stype"] = stype
 	mapInfo["key"] = fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
-	log.Info("udp tidb-bidding node", zap.Any("mapinfo:", mapInfo))
+	log.Println("udp tidb-bidding node mapinfo:", mapInfo)
 	datas, _ := json.Marshal(mapInfo)
 	node := &UdpNode{datas, next, time.Now().Unix(), 0}
 	UdpTaskMap.Store(mapInfo["key"], node)
@@ -239,7 +240,7 @@ func NextNodeHn(mapInfo map[string]interface{}) {
 	}
 	mapInfo["stype"] = "hainan"
 	mapInfo["key"] = fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
-	log.Info("NextNodeTidb", zap.Any("mapinfo:", mapInfo))
+	log.Println("NextNodeTidb mapinfo:", mapInfo)
 	datas, _ := json.Marshal(mapInfo)
 	node := &UdpNode{datas, next, time.Now().Unix(), 0}
 	UdpTaskMap.Store(mapInfo["key"], node)
@@ -318,7 +319,7 @@ func UpdateExtract() {
 
 func checkMapJob() {
 	if config.Conf.Mail.Send {
-		log.Info("checkMapJob", zap.String("to:", config.Conf.Mail.To))
+		log.Println("checkMapJob to:", config.Conf.Mail.To)
 		for {
 			UdpTaskMap.Range(func(k, v interface{}) bool {
 				now := time.Now().Unix()
@@ -331,14 +332,14 @@ func checkMapJob() {
 						if err == nil {
 							defer res.Body.Close()
 							read, err := ioutil.ReadAll(res.Body)
-							log.Info("send mail ...", zap.String("r:", string(read)), zap.Any("err:", err))
+							log.Println("send mail ... r:", string(read), "err:", err)
 						}
 					} else {
-						log.Info("udp重发", zap.Any("k:", k))
+						log.Println("udp重发", zap.Any("k:", k))
 						//UdpClient.WriteUdp(node.data, udp.OP_TYPE_DATA, node.addr)
 					}
 				} else if now-node.timestamp > 10 {
-					log.Info("udp任务超时中..", zap.Any("k:", k))
+					log.Println("udp任务超时中.. k:", k)
 				}
 				return true
 			})
@@ -360,7 +361,7 @@ func nsqMethod() {
 		Concurrent:   config.Conf.Nsq.Concurrent, //并发数
 	})
 	if err != nil {
-		log.Error("nsqMethod err", zap.Error(err))
+		log.Println("nsqMethod err", err)
 	}
 	for {
 		select {
@@ -369,7 +370,7 @@ func nsqMethod() {
 			if bson.IsObjectIdHex(id[1]) {
 				taskinfo(id[1])
 			} else {
-				log.Info("jy nsq id err", zap.String("id", id[1]))
+				log.Println("jy nsq id err id", id[1])
 			}
 		}
 	}

+ 176 - 88
field_sync/task.go

@@ -13,10 +13,10 @@ import (
 	"strings"
 	"time"
 
+	"log"
+
 	"go.mongodb.org/mongo-driver/bson"
-	"go.uber.org/zap"
 	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
-	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/redis"
 	"jygit.jydev.jianyu360.cn/data_processing/common_utils/udp"
@@ -31,14 +31,6 @@ func biddingTask(data []byte, mapInfo map[string]interface{}) {
 	defer util.Catch()
 
 	stype := util.ObjToString(mapInfo["stype"])
-	if stype == "bidding" {
-		uq := bson.M{"gtid": util.ObjToString(mapInfo["gtid"]), "lteid": util.ObjToString(mapInfo["lteid"])}
-		MgoB.Update("bidding_processing_ids", uq, bson.M{"$set": bson.M{"dataprocess": 7, "updatetime": time.Now().Unix()}}, false, true)
-	}
-	//领域标签处理的数据 id段
-	if stype == "bidding_history" {
-		MgoB.Save("field_data_record", map[string]interface{}{"gtid": mapInfo["gtid"], "lteid": mapInfo["lteid"], "status": 0})
-	}
 
 	q, _ := mapInfo["query"].(map[string]interface{})
 	bkey, _ := mapInfo["bkey"].(string)
@@ -51,54 +43,69 @@ func biddingTask(data []byte, mapInfo map[string]interface{}) {
 		}
 	}
 	//extract库
-	extractConn := MgoE.GetMgoConn()
-	defer MgoE.DestoryMongoConn(extractConn)
-	extractResult := extractConn.DB(MgoE.DbName).C(config.Conf.DB.MongoE.Coll).Find(q).Select(map[string]interface{}{
-		"field_source": 0,
-		"kvtext":       0,
-	}).Sort("_id").Iter()
-	eMap := map[string]map[string]interface{}{}
-	extCount, repeatCount := 0, 0
-	for tmp := make(map[string]interface{}); extractResult.Next(tmp); extCount++ {
-		if util.IntAll(tmp["repeat"]) == 1 {
-			repeatCount++
-		}
-		tid := mongodb.BsonIdToSId(tmp["_id"])
-		eMap[tid] = tmp
-		tmp = make(map[string]interface{})
-	}
-	log.Info("抽取表", zap.Int("数据量", extCount), zap.Int("重复数据量", repeatCount))
+	// extractConn := MgoE.GetMgoConn()
+	// defer MgoE.DestoryMongoConn(extractConn)
+	// extractResult := extractConn.DB(MgoE.DbName).C(config.Conf.DB.MongoE.Coll).Find(q).Select(map[string]interface{}{
+	// 	"field_source": 0,
+	// 	"kvtext":       0,
+	// }).Sort("_id").Iter()
+	// eMap := map[string]map[string]interface{}{}
+	// extCount, repeatCount := 0, 0
+	// for tmp := make(map[string]interface{}); extractResult.Next(tmp); extCount++ {
+	// 	if util.IntAll(tmp["repeat"]) == 1 {
+	// 		repeatCount++
+	// 	}
+	// 	tid := mongodb.BsonIdToSId(tmp["_id"])
+	// 	eMap[tid] = tmp
+	// 	tmp = make(map[string]interface{})
+	// }
+	// log.Println("抽取表 数据量", extCount, "重复数据量", repeatCount)
 
 	//bidding库
 	biddingConn := MgoB.GetMgoConn()
 	count, _ := biddingConn.DB(MgoB.DbName).C(config.Conf.DB.MongoB.Coll).Find(&q).Count()
-	log.Info("bidding表", zap.Int64("同步总数:", count))
+	log.Println("bidding表 同步总数:", count)
 	c := 0
-	if count < 500000 {
-		var res []map[string]interface{}
-		result := biddingConn.DB(MgoB.DbName).C(config.Conf.DB.MongoB.Coll).Find(q).Select(map[string]interface{}{
-			"contenthtml": 0,
-		}).Iter()
-		for tmp := make(map[string]interface{}); result.Next(tmp); {
-			res = append(res, tmp)
-			tmp = make(map[string]interface{})
-		}
-		MgoB.DestoryMongoConn(biddingConn)
-		log.Info("查询结果", zap.Int64("bidding", count), zap.Int("抽取:", extCount))
-		c = doIndex(res, eMap, bkey, stype)
-	} else {
-		log.Info("查询结果", zap.Int64("数据量太大,放弃", count))
-		MgoB.DestoryMongoConn(biddingConn)
+	// if count < 500000 {
+	var res []map[string]interface{}
+	result := biddingConn.DB(MgoB.DbName).C(config.Conf.DB.MongoB.Coll).Find(q).Select(map[string]interface{}{
+		"contenthtml": 0,
+	}).Iter()
+	for tmp := make(map[string]interface{}); result.Next(tmp); {
+		res = append(res, tmp)
+		tmp = make(map[string]interface{})
 	}
-	log.Info("bidding sync...over", zap.Int64("all", count), zap.Int("extract sync", c))
+	MgoB.DestoryMongoConn(biddingConn)
+	// log.Println("查询结果 bidding", count, "抽取:", extCount)
+	c = doIndex(res, bkey, stype)
+	// } else {
+	// 	log.Println("查询结果 数据量太大,放弃", count)
+	// 	MgoB.DestoryMongoConn(biddingConn)
+	// }
+	log.Println("bidding sync...over all", count, "extract sync ", c)
 	NextNode(mapInfo, stype)
-	NextNodePro(mapInfo, stype)
+	// NextNodePro(mapInfo, stype)
 	NextNodeTidb(mapInfo, stype)
 	if stype == "bidding_history" {
 		NextNodeBidData(mapInfo)  // bidding-data数据
 		NextNodeTidbQyxy(mapInfo) // tidb-企业数据
 		NextNodeHn(mapInfo)
 	}
+	if stype == "bidding" {
+		uq := map[string]interface{}{
+			"gtid": map[string]interface{}{
+				"$gte": util.ObjToString(mapInfo["gtid"]),
+			},
+			"lteid": map[string]interface{}{
+				"$lte": util.ObjToString(mapInfo["lteid"]),
+			},
+		}
+		MgoB.Update("bidding_processing_ids", uq, bson.M{"$set": bson.M{"dataprocess": 7, "updatetime": time.Now().Unix()}}, false, true)
+	}
+	//领域标签处理的数据 id段
+	if stype == "bidding_history" {
+		MgoB.Save("field_data_record", map[string]interface{}{"gtid": mapInfo["gtid"], "lteid": mapInfo["lteid"], "status": 0})
+	}
 }
 
 func biddingAllTask(data []byte, mapInfo map[string]interface{}) {
@@ -172,7 +179,9 @@ func biddingAllTask(data []byte, mapInfo map[string]interface{}) {
 					if util.IntAll(compare["repeat"]) == 1 {
 						update["extracttype"] = -1
 						update["dataprocess"] = 7
-						update["repeat_id"] = compare["repeat_id"]
+						if compare["repeat_id"] != nil {
+							update["repeat_id"] = compare["repeat_id"]
+						}
 					} else {
 						update["extracttype"] = 1
 						update["dataprocess"] = 8
@@ -238,29 +247,35 @@ func biddingAllTask(data []byte, mapInfo map[string]interface{}) {
 			}
 		}
 		if count%50000 == 0 {
-			log.Info("biddingTask", zap.Int("current", count))
+			log.Println("biddingTask current", count)
 		}
 		tmp = make(map[string]interface{})
 	}
 
-	log.Info("biddingAll sync...over", zap.Int("all", count))
+	log.Println("biddingAll sync...over all", count)
 }
 
-func doIndex(infos []map[string]interface{}, eMap map[string]map[string]interface{}, bkey, stype string) int {
+func doIndex(infos []map[string]interface{}, bkey, stype string) int {
 	syncNo := 0 //抽取表数据同步数量
 	//对比两张表数据,减少查询次数
 	var compare map[string]interface{}
 	var bidUpdate [][]map[string]interface{}
 	var extUpdate [][]map[string]interface{}
 	//SaveEsLock := &sync.Mutex{}
-	log.Info("start ...")
+	ygsiteArr := []map[string]interface{}{}
+	sitedata, _ := MgoE.Find("bidding_yg_site", map[string]interface{}{}, nil, nil, false, -1, -1)
+	if sitedata != nil && len(*sitedata) > 0 {
+		ygsiteArr = *sitedata
+	}
+	log.Println("start ...")
 	for n, tmp := range infos {
 		tid := mongodb.BsonIdToSId(tmp["_id"])
 		update := map[string]interface{}{} //要更新的mongo数据
 		del := map[string]interface{}{}
+		edata, _ := MgoE.FindById(config.Conf.DB.MongoE.Coll, tid, nil)
 		//对比方法----------------
-		if eMap[tid] != nil {
-			compare = eMap[tid]
+		if edata != nil && len(*edata) > 0 {
+			compare = *edata
 			if stype == "bidding" {
 				// 增量id段 正常数据
 				if dg := util.IntAll(compare["dataging"]); dg == 1 { //extract中dataging=1跳过
@@ -268,7 +283,7 @@ func doIndex(infos []map[string]interface{}, eMap map[string]map[string]interfac
 					compare = nil
 					continue
 				}
-				delete(eMap, tid)
+				// delete(eMap, tid)
 			}
 			if stype == "bidding_history" {
 				//增量id段 历史数据
@@ -277,18 +292,26 @@ func doIndex(infos []map[string]interface{}, eMap map[string]map[string]interfac
 					compare = nil
 					continue
 				}
-				delete(eMap, tid)
+				// delete(eMap, tid)
 			}
 			syncNo++
-			log.Info("抽取区域", zap.Any("省", compare["area"]), zap.Any("市", compare["city"]), zap.Any("区", compare["district"]), zap.Any("id", tid))
+			log.Println("抽取区域 省", compare["area"], " 市 ", compare["city"], " 区 ", compare["district"], " id ", tid)
+			modifyinfo := make(map[string]bool)
+			if tmp["modifyinfo"] != nil {
+				if tmpmodifyinfo, ok := tmp["modifyinfo"].(map[string]interface{}); ok {
+					for k := range tmpmodifyinfo {
+						modifyinfo[k] = true
+					}
+				}
+			}
 			for _, k := range config.Conf.Serve.FieldS {
 				v1 := compare[k] //extract
 				v2 := tmp[k]     //bidding
 				if v2 == nil && v1 != nil {
 					update[k] = v1
-				} else if v2 != nil && v1 != nil {
+				} else if v2 != nil && v1 != nil && !modifyinfo[k] {
 					update[k] = v1
-				} else if v2 != nil && v1 == nil {
+				} else if v2 != nil && v1 == nil && !modifyinfo[k] {
 					if k == "s_subscopeclass" && del["subscopeclass"] == nil {
 						continue
 					} else if k == "s_topscopeclass" && del["topscopeclass"] == nil {
@@ -304,7 +327,9 @@ func doIndex(infos []map[string]interface{}, eMap map[string]map[string]interfac
 			if util.IntAll(compare["repeat"]) == 1 {
 				update["extracttype"] = -1
 				update["dataprocess"] = 7
-				update["repeat_id"] = compare["repeat_id"]
+				if compare["repeat_id"] != nil {
+					update["repeat_id"] = compare["repeat_id"]
+				}
 			} else {
 				update["extracttype"] = 1
 				update["dataprocess"] = 8
@@ -344,7 +369,30 @@ func doIndex(infos []map[string]interface{}, eMap map[string]map[string]interfac
 				extractMap["entidlist"] = cid
 			}
 		}
-
+		//阳光采购
+		spidercode := util.ObjToString(tmp["spidercode"])
+		site := util.ObjToString(tmp["site"])
+		infoAttribute := util.ObjToString(tmp["infoattribute"])
+		if infoAttribute != "" {
+			update["public_type"] = "用户发布"
+			update["extracttype"] = -1
+			MgoE.Save("bidding_yg", map[string]interface{}{"id": tid, "source": "user"})
+		} else {
+			for _, v := range ygsiteArr {
+				spidercodes := util.ObjToString(v["spidercode"])
+				sites := util.ObjToString(v["site"])
+				datatype := util.ObjToString(v["datatype"])
+				if datatype == "1" && spidercodes == spidercode {
+					update["infoattribute"] = "zc_cgxx"
+					update["public_type"] = "平台发布"
+					MgoE.Save("bidding_yg", map[string]interface{}{"id": tid, "source": "spidercode"})
+				} else if datatype == "2" && site == sites {
+					update["infoattribute"] = "zc_cgxx"
+					update["public_type"] = "平台发布"
+					MgoE.Save("bidding_yg", map[string]interface{}{"id": tid, "source": "site"})
+				}
+			}
+		}
 		// 6.10 剑鱼发布信息分类处理, 写在这里是为了修改抽取表
 		typeFunc(tmp, update, extractMap)
 		if len(extractMap) > 0 {
@@ -376,11 +424,18 @@ func doIndex(infos []map[string]interface{}, eMap map[string]map[string]interfac
 			}
 		}
 		// 2024-02-21 徐志恒 情报标签字段
-		if tmp["tag_topinformation"] != nil && util.ObjToString(tmp["subtype"]) == "合同" {
+		toptype := util.ObjToString(tmp["toptype"])
+		subtype := util.ObjToString(tmp["subtype"])
+		buyerclass := util.ObjToString(update["buyerclass"])
+		if buyerclass != "" {
+			update["buyer_type"] = getStr(buyerclass)
+		}
+		s_topscopeclass := util.ObjToString(update["s_topscopeclass"])
+		if (tmp["tag_topinformation"] != nil && (subtype == "合同" || subtype == "中标" || subtype == "成交" || subtype == "采购意向" || toptype == "招标")) || (tmp["tag_topinformation"] == nil && toptype == "拟建" && strings.Contains(s_topscopeclass, "建筑工程")) {
 			update["tag_set"] = getTagSet(tmp, compare)
 		}
 		if len(update) > 0 {
-			log.Info("保存bidding区域", zap.Any("省", update["area"]), zap.Any("市", update["city"]), zap.Any("区", update["district"]), zap.Any("id", tid))
+			log.Println("保存bidding区域 省", update["area"], " 市 ", update["city"], " 区 ", update["district"], " buyerclass ", update["buyerclass"], update["buyer_type"], " id ", tid)
 			if len(del) > 0 {
 				bidUpdate = append(bidUpdate, []map[string]interface{}{{
 					"_id": tmp["_id"],
@@ -401,7 +456,7 @@ func doIndex(infos []map[string]interface{}, eMap map[string]map[string]interfac
 			}
 		}
 		if n%500 == 0 {
-			log.Info("biddingTask", zap.Int("current", n))
+			log.Println("biddingTask current ", n)
 		}
 		tmp = make(map[string]interface{})
 	}
@@ -649,14 +704,14 @@ func validFile(tmp map[string]interface{}) int {
 func taskinfo(id string) {
 	tmp, _ := MgoB.FindById("bidding", id, nil)
 	if tmp == nil || len(*tmp) == 0 {
-		log.Info(fmt.Sprintf("taskinfo bidding id=%s 未查询到数据", id))
+		log.Println(fmt.Sprintf("taskinfo bidding id=%s 未查询到数据", id))
 		return
 	}
 	extractM, _ := MgoE.FindById(config.Conf.DB.MongoE.Coll, id, nil)
 	if extractM == nil || len(*extractM) == 0 {
 		extractM, _ = MgoE.FindById(config.Conf.DB.MongoE.Coll1, id, nil)
 		if extractM == nil || len(*extractM) == 0 {
-			log.Info(fmt.Sprintf("taskinfo extract id=%s 未查询到数据", id))
+			log.Println(fmt.Sprintf("taskinfo extract id=%s 未查询到数据", id))
 			return
 		}
 	}
@@ -678,7 +733,9 @@ func taskinfo(id string) {
 	if util.IntAll((*extractM)["repeat"]) == 1 {
 		update["extracttype"] = -1
 		update["dataprocess"] = 7
-		update["repeat_id"] = (*extractM)["repeat_id"]
+		if (*extractM)["repeat_id"] != nil {
+			update["repeat_id"] = (*extractM)["repeat_id"]
+		}
 	} else {
 		update["extracttype"] = 1
 		update["dataprocess"] = 8
@@ -717,7 +774,7 @@ func taskinfo(id string) {
 		IP:   net.ParseIP(config.Conf.Udp.Next.Addr),
 		Port: util.IntAll(config.Conf.Udp.Next.Port),
 	}
-	log.Info("nsq data over", zap.Any("es", next), zap.String("mapinfo", string(datas)))
+	log.Println("nsq data over es ", next, " mapinfo ", string(datas))
 	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
 }
 
@@ -761,9 +818,12 @@ func getTagSet(tmp, compare map[string]interface{}) map[string]map[string]interf
 	buyer := util.ObjToString(compare["buyer"])
 	publishtime := util.Int64All(tmp["publishtime"])
 	bidamount := util.Float64All(compare["bidamount"])
-	wuye["isfirsthand"] = 62
-	if buyer != "" {
-		sql := `{
+	toptype := util.ObjToString(tmp["toptype"])
+	subtype := util.ObjToString(tmp["subtype"])
+	if subtype == "合同" {
+		wuye["isfirsthand"] = 62
+		if buyer != "" {
+			sql := `{
 			"query": {
 			 "bool": {
 			   "must": [
@@ -800,27 +860,31 @@ func getTagSet(tmp, compare map[string]interface{}) map[string]map[string]interf
 			  ],
 			  "size":  10000
 		}`
-		data := Es.Get("bidding", "bidding", sql)
-		if data != nil && len(*data) > 0 {
-			count := 0
-			first := util.ObjToString((*data)[0]["s_winner"])
-			for k, v := range *data {
-				winner := util.ObjToString(v["s_winner"])
-				if k > 0 && first != winner {
-					first = winner
-					count++
+			data := Es.Get("bidding", "bidding", sql)
+			if data != nil && len(*data) > 0 {
+				count := 0
+				first := util.ObjToString((*data)[0]["s_winner"])
+				for k, v := range *data {
+					winner := util.ObjToString(v["s_winner"])
+					if k > 0 && first != winner {
+						first = winner
+						count++
+					}
+				}
+				changehand := fmt.Sprintf("%.2f", float64(count)/float64(len(*data)))
+				changehands, _ := strconv.ParseFloat(changehand, 64)
+				wuye["changehand"] = changehands
+				if changehands > 0.3 {
+					wuye["changehandindex"] = 61
+				}
+				if len(*data) > 1 {
+					wuye["isfirsthand"] = 0
 				}
-			}
-			changehand := fmt.Sprintf("%.2f", float64(count)/float64(len(*data)))
-			changehands, _ := strconv.ParseFloat(changehand, 64)
-			wuye["changehand"] = changehands
-			if changehands > 0.3 {
-				wuye["changehandindex"] = 61
-			}
-			if len(*data) > 1 {
-				wuye["isfirsthand"] = 0
 			}
 		}
+		wuye["period"] = getperiod(compare)
+	} else if toptype == "招标" || toptype == "采购意向" {
+		bidamount = util.Float64All(compare["budget"])
 	}
 	if tmp["projectinfo"] != nil {
 		projectInfo := util.ObjToMap(tmp["projectinfo"])
@@ -830,7 +894,6 @@ func getTagSet(tmp, compare map[string]interface{}) map[string]map[string]interf
 			}
 		}
 	}
-	wuye["period"] = getperiod(compare)
 	wuye["scale"] = getBidamountRange(bidamount)
 	if tmp["property_form"] != nil {
 		property_form := util.ObjArrToStringArr(tmp["property_form"].([]interface{}))
@@ -929,3 +992,28 @@ func calculateYearDifference(startTime int64, endTime int64) float64 {
 	years := duration.Hours() / 24 / 365
 	return years
 }
+
+func getStr(b string) string {
+	if b == "" {
+		return "其它"
+	}
+	a1 := "(交通|运输物流|工信|农业|住建|城管|市政|出版广电|检察院|科技|民政|生态环境|市场监管|水利|应急管理|自然资源|财政|档案|党委办|组织|发改|宣传|政府办|政务中心|人大|政协|法院|公安|国资委|海关|机关事务|纪委|军队|人社|商务|审计税务|司法|体育|统计|统战|文旅|民宗|银保监|证监|气象|社会团体|公共资源交易)"
+	a2 := "(卫健委|医疗)"
+	a3 := "(教育|学校)"
+	a4 := "(人行|金融业)"
+	a5 := "(信息技术|电信行业|农林牧渔|建筑业|传媒|制造业|住宿餐饮|采矿业|能源化工|批发零售)"
+	if strings.Contains(a1, b) {
+		return "政府机构"
+	} else if strings.Contains(a2, b) {
+		return "医疗单位"
+	} else if strings.Contains(a3, b) {
+		return "教育单位"
+	} else if strings.Contains(a4, b) {
+		return "金融企业"
+	} else if strings.Contains(a5, b) {
+		return "商业公司"
+	} else {
+		return "其它"
+	}
+	return "其它"
+}

BIN
field_sync_1/.DS_Store


+ 9103 - 0
field_sync_1/CommonDict.txt

@@ -0,0 +1,9103 @@
+标	58819516
+人	39327632
+采	37936120
+的	37706721
+购	37481886
+公	36236358
+项	35631355
+目	33967273
+件	26066781
+中	24248928
+有	23875013
+工	23036670
+投	22866151
+名	21407564
+号	20671264
+市	19269013
+交	19033811
+应	18848999
+系	18504891
+文	18482498
+合	18472714
+时	18067230
+日	17950354
+招	17888352
+限	17325715
+联	17053179
+供	16297165
+方	16220463
+理	16165812
+司	16150407
+商	16003508
+价	15723465
+单	15684031
+称	15405229
+资	15092717
+电	14801139
+行	14290956
+信	14155867
+要	13825731
+程	13582836
+间	13557620
+本	13486562
+地	13426348
+务	13103530
+式	12939750
+金	12911438
+政	12791451
+建	12618565
+业	12450689
+同	12355117
+一	12177349
+设	12025515
+年	12008036
+格	11898630
+区	11850149
+元	11787621
+求	11629922
+成	11521187
+期	11447562
+证	11446141
+在	11348311
+及	10533500
+法	10372269
+报	10283071
+服	9784153
+不	9714957
+国	9649759
+提	9540450
+位	9525848
+告	9451662
+发	9378666
+机	9371225
+代	9351397
+为	9316699
+开	9309262
+规	9292674
+用	9284145
+定	9257293
+内	9196330
+月	9090142
+上	9008766
+网	8787776
+和	8738743
+量	8637377
+或	8430681
+息	8395952
+收	8243861
+备	7938980
+关	7895512
+编	7764352
+额	7686138
+府	7664619
+其	7632937
+保	7491743
+二	7468216
+分	7430224
+以	7359694
+下	7312858
+质	7298552
+址	7204975
+品	7153116
+管	7143789
+路	7054318
+大	6817743
+通	6781003
+三	6640535
+具	6519282
+计	6476683
+产	6321054
+点	6310657
+省	6308498
+数	6253031
+南	6085380
+询	6077527
+明	6067214
+包	6017638
+安	5958643
+作	5909347
+书	5831227
+构	5700053
+民	5652617
+验	5629225
+需	5612571
+体	5571681
+台	5571331
+于	5571030
+请	5524015
+自	5419321
+技	5398602
+北	5362314
+子	5338761
+准	5321892
+县	5312416
+参	5251467
+心	5230099
+源	5217124
+平	5202515
+进	5135833
+话	5108527
+注	5095567
+家	5077132
+取	5062035
+事	4986453
+后	4964046
+州	4954410
+医	4947546
+他	4925427
+第	4914147
+个	4908503
+无	4892453
+能	4855887
+责	4827705
+共	4823283
+易	4746731
+经	4729181
+等	4682049
+审	4644034
+加	4621486
+费	4620905
+可	4596597
+施	4580836
+止	4566158
+生	4562760
+对	4560231
+物	4534178
+评	4523552
+结	4501496
+四	4470421
+部	4437842
+料	4436663
+次	4409259
+东	4407033
+主	4376419
+江	4282625
+型	4275385
+出	4254273
+至	4244973
+新	4242474
+术	4239479
+现	4236283
+选	4232888
+西	4231203
+须	4200297
+院	4175189
+天	4174511
+相	4139154
+按	4135925
+布	4113542
+容	4061766
+与	4060170
+接	4048018
+所	4027172
+统	4011386
+办	4010128
+水	3993851
+山	3968762
+会	3960513
+动	3959106
+货	3957738
+过	3924695
+截	3798874
+监	3792703
+见	3746579
+全	3734245
+原	3692204
+并	3689534
+实	3684910
+企	3679242
+员	3655475
+制	3652198
+条	3620903
+录	3618905
+学	3613588
+查	3552078
+详	3544265
+果	3532413
+前	3514368
+五	3501341
+示	3498546
+如	3491606
+高	3446041
+华	3376518
+算	3374267
+附	3373930
+表	3368417
+小	3352573
+京	3351770
+预	3349917
+道	3343760
+城	3321651
+范	3314534
+情	3304161
+局	3290648
+记	3276988
+面	3268452
+楼	3256312
+门	3253149
+重	3226097
+印	3224345
+受	3215067
+场	3210992
+级	3193092
+总	3183047
+册	3174882
+议	3151135
+性	3138405
+委	3130202
+得	3127922
+器	3113768
+况	3097288
+任	3093234
+承	3085080
+海	3070804
+力	3046506
+划	3043746
+负	3041284
+专	3040204
+万	3036017
+类	3008622
+未	2992826
+递	2977149
+码	2974054
+化	2968585
+广	2937610
+集	2911090
+获	2907817
+执	2854796
+段	2854308
+效	2848833
+复	2835076
+将	2828753
+装	2824141
+六	2807725
+到	2794867
+营	2786367
+室	2761559
+财	2732123
+阳	2731002
+照	2719034
+否	2717402
+造	2706437
+响	2702722
+起	2686014
+被	2669621
+镇	2669036
+序	2668425
+份	2666035
+竞	2659169
+之	2658254
+是	2642337
+科	2618360
+传	2601158
+福	2601147
+入	2590900
+组	2564730
+材	2558388
+登	2556419
+支	2555946
+签	2550655
+问	2547868
+权	2545841
+湖	2526457
+七	2524657
+河	2463953
+线	2397851
+基	2389455
+处	2342891
+户	2316553
+载	2304768
+章	2295472
+知	2286348
+疗	2278376
+度	2265837
+据	2262838
+团	2252328
+清	2245080
+咨	2233629
+活	2219336
+修	2214296
+符	2185225
+站	2183927
+履	2175340
+满	2175306
+款	2167447
+完	2163147
+者	2152709
+向	2148274
+由	2139074
+补	2113953
+意	2085657
+改	2079798
+税	2072666
+售	2053677
+正	2050850
+外	2050049
+订	2016076
+运	2012633
+街	2008563
+必	2002018
+测	2000473
+充	1998204
+案	1986382
+邮	1983327
+最	1977975
+口	1970028
+宜	1967344
+筑	1965412
+达	1962867
+银	1962409
+约	1952071
+检	1947493
+十	1923604
+社	1917230
+足	1904144
+已	1902157
+违	1886809
+利	1860096
+控	1846022
+失	1816579
+密	1799438
+牌	1780836
+维	1743889
+整	1728112
+付	1724149
+展	1723353
+长	1714646
+村	1707377
+环	1698287
+纳	1682969
+围	1682073
+异	1676047
+云	1675338
+历	1671881
+八	1650409
+防	1649703
+光	1644023
+超	1642035
+列	1640257
+核	1639047
+当	1638361
+认	1636001
+盖	1635575
+确	1624651
+申	1620648
+套	1620502
+宁	1609579
+含	1608284
+股	1602058
+币	1600503
+械	1599592
+园	1586133
+因	1582770
+账	1577571
+配	1572687
+疑	1572451
+授	1570086
+林	1569986
+师	1559571
+立	1557217
+指	1552264
+特	1540052
+托	1536315
+治	1516899
+车	1498069
+批	1489197
+缴	1483000
+磋	1482588
+送	1482456
+页	1480137
+更	1477474
+则	1469191
+节	1463848
+图	1462932
+许	1456337
+形	1436368
+房	1428089
+龙	1427671
+来	1401990
+纸	1397182
+字	1391895
+候	1372832
+织	1368523
+各	1362012
+督	1361394
+介	1347730
+判	1342959
+解	1335683
+功	1331088
+属	1329554
+担	1322561
+视	1318483
+手	1314356
+除	1312429
+持	1311455
+存	1302933
+使	1300048
+库	1298811
+午	1296306
+细	1295534
+述	1288728
+身	1288311
+真	1286909
+根	1282324
+买	1276428
+依	1265894
+厂	1257546
+概	1246760
+张	1246529
+诉	1241188
+谈	1240393
+直	1238271
+箱	1232270
+答	1227754
+调	1220945
+农	1218421
+置	1216536
+九	1204848
+石	1198228
+简	1197159
+际	1194497
+比	1194391
+济	1185709
+甲	1180284
+说	1178859
+川	1178662
+描	1165155
+综	1161174
+境	1158081
+护	1152230
+苏	1142862
+操	1135255
+良	1128030
+争	1119630
+庆	1115380
+先	1108248
+策	1101585
+排	1091831
+层	1091273
+流	1083425
+试	1083088
+乙	1082814
+仪	1075257
+钢	1067532
+写	1066151
+兴	1053950
+转	1052534
+函	1049527
+乡	1047734
+色	1038789
+厦	1033927
+每	1031299
+米	1027902
+且	1011499
+好	1001482
+若	1001364
+职	1000882
+德	994605
+模	989962
+律	986850
+铁	977547
+予	972159
+该	971655
+拟	967470
+头	952926
+常	951499
+青	944357
+绩	941121
+低	936126
+均	924547
+双	924053
+凡	920874
+潜	918937
+严	901540
+汇	896222
+独	894595
+多	893667
+消	892593
+落	892344
+变	891450
+卫	887497
+闽	887130
+武	882437
+打	865467
+输	863569
+健	849511
+王	845662
+康	838924
+假	838390
+板	830632
+题	824597
+都	819962
+诺	819783
+率	812115
+校	810883
+免	799996
+票	796946
+教	796243
+障	792729
+我	792345
+险	790976
+带	790377
+李	790357
+声	789469
+桥	787112
+气	787074
+束	784727
+尔	783021
+致	776873
+协	774789
+风	772603
+土	771839
+领	764287
+别	764109
+优	763618
+黄	758961
+版	755180
+始	750320
+黑	749884
+导	743570
+此	742403
+终	732958
+座	729964
+退	728591
+临	721257
+厅	717619
+态	717526
+填	716332
+昌	715791
+媒	713721
+智	711668
+压	705360
+扫	702607
+红	701325
+热	698947
+括	685298
+育	682628
+看	679201
+它	672626
+普	672052
+浙	671796
+徽	671000
+没	665237
+微	663354
+租	663328
+少	662218
+放	661492
+永	659283
+油	656468
+泰	654782
+研	653029
+空	653016
+吉	652196
+近	651187
+白	645898
+深	645705
+族	645342
+连	642519
+察	640540
+周	636695
+诚	636461
+访	634730
+温	629821
+木	628892
+沙	627434
+何	627305
+非	626273
+考	625994
+卖	624840
+汉	624740
+暂	623664
+老	621887
+增	620848
+田	620595
+封	619285
+速	614710
+回	612668
+陈	611766
+续	609367
+从	608428
+状	605306
+卡	603216
+升	602959
+销	601662
+种	599399
+强	597368
+片	596808
+惠	593772
+软	590538
+途	589875
+启	588734
+贸	584442
+疾	583420
+络	578317
+创	576733
+即	575383
+刷	571485
+凭	571175
+顺	567131
+首	564841
+远	562521
+显	561006
+贵	558861
+两	557293
+花	555432
+刘	554439
+值	554414
+勘	553159
+然	550417
+港	549652
+古	548037
+估	547561
+步	545343
+决	544923
+块	543163
+养	540807
+域	538414
+只	537028
+绿	536529
+盘	534696
+适	534231
+推	525541
+积	522808
+丰	522470
+害	522180
+美	520428
+逾	518868
+频	514587
+克	513650
+波	513060
+病	510298
+彩	509235
+再	502802
+志	499488
+陆	499361
+誉	498431
+究	497083
+拒	495951
+架	495749
+档	495416
+津	494678
+延	493707
+益	493165
+春	490742
+马	488359
+澄	488264
+击	484520
+庄	483584
+停	483555
+栋	480547
+蒙	475415
+滨	475251
+影	470374
+了	470366
+例	468021
+博	463843
+星	462271
+圳	461268
+融	461076
+岛	456059
+盒	455555
+邀	455123
+就	454012
+液	452874
+残	451707
+客	450172
+队	450087
+士	449679
+药	449048
+择	446665
+景	444950
+湘	444038
+杨	441363
+换	440345
+宝	439426
+航	436031
+训	434164
+派	432880
+给	432546
+义	429575
+副	428467
+移	427259
+住	427172
+辆	427101
+疆	425981
+姓	423716
+损	423332
+兰	420834
+疫	419548
+泉	416974
+废	416783
+峰	416160
+齐	414265
+杭	411186
+胶	409107
+佰	408538
+拾	407902
+离	407322
+固	406132
+里	405771
+还	405579
+绝	404978
+宣	404414
+店	403264
+盛	402774
+溪	402289
+恒	401451
+助	398303
+晨	397791
+肥	395526
+促	394839
+端	394830
+郑	391935
+瑞	390973
+故	389524
+鑫	389423
+太	385905
+镜	385750
+儿	383975
+仟	380866
+扣	380252
+唐	379886
+便	379224
+女	378710
+幼	378459
+狱	377796
+拍	376537
+干	375794
+角	371351
+随	370540
+笔	370470
+允	367437
+乐	364749
+析	363915
+屋	363683
+携	363514
+辽	363429
+煤	363365
+玉	362396
+洲	362294
+反	362041
+急	359243
+血	358968
+屏	355456
+警	354122
+鲁	353796
+丽	353596
+但	353586
+脑	352475
+夏	352467
+侧	352380
+陵	350955
+柜	350837
+剂	347529
+衡	347243
+润	347039
+矿	345748
+甘	345383
+军	344710
+食	344272
+乌	343950
+切	343853
+池	343624
+观	342031
+竣	341366
+初	338222
+做	338083
+罚	337408
+陕	337243
+样	336863
+余	336281
+馆	334194
+污	333536
+音	333206
+宏	331776
+底	327448
+像	326855
+哈	325920
+壹	324938
+贰	323995
+威	323265
+精	322741
+吴	322740
+球	321429
+础	320076
+富	320058
+塘	318694
+漳	318585
+硬	317850
+培	317583
+徐	315872
+烟	313773
+岳	312843
+针	310659
+岗	309567
+洁	309091
+纪	306780
+佛	305187
+昆	304555
+嘉	303542
+拉	299470
+冷	297788
+叁	297036
+储	296875
+毒	295427
+抽	295271
+汽	293705
+革	292202
+栏	292014
+肃	291995
+佳	291589
+灯	290829
+断	290533
+阅	289715
+较	286451
+荐	286092
+似	285281
+诊	284445
+宇	283239
+渠	282893
+寸	281989
+绍	281806
+罗	281503
+寄	281110
+鼓	280308
+浦	280199
+旗	279901
+游	279710
+宽	278890
+火	277913
+荣	277707
+幢	277502
+伟	276430
+梁	275411
+英	274739
+览	274317
+沈	272754
+百	271595
+粉	270584
+禁	270268
+湾	269859
+快	268656
+另	267900
+床	267759
+零	267239
+慧	267000
+洪	265949
+珠	265518
+伍	263125
+锦	261538
+赁	261482
+涉	261101
+迎	260661
+锁	260381
+虚	260338
+互	259548
+潭	259206
+素	258795
+松	258060
+凤	255820
+链	255485
+耗	254175
+亚	252672
+洗	252370
+蓝	251176
+边	251174
+令	250416
+泵	249481
+季	249045
+留	248883
+世	248349
+呼	247725
+塔	247567
+颁	247545
+铜	247536
+界	247291
+袋	244777
+仅	244275
+轮	243430
+厚	242942
+浩	242699
+象	242590
+救	240884
+吨	240433
+巴	240203
+识	239326
+引	237841
+雨	235922
+隆	233912
+妇	233314
+届	232987
+振	232949
+飞	232669
+桂	232604
+弃	232079
+墙	232074
+晓	232059
+香	232031
+键	232005
+泽	231824
+夹	231485
+祥	231242
+而	231121
+论	230655
+阿	229886
+梅	229834
+赵	229576
+阀	228931
+螺	228855
+秀	226884
+署	226875
+辉	226188
+居	224886
+泥	224771
+桌	224541
+感	223961
+饰	223939
+贿	223293
+众	223027
+邵	222469
+径	220523
+钟	219549
+勒	218685
+旅	216138
+激	215429
+沟	214415
+胜	213757
+插	213111
+射	213089
+圾	212373
+鼎	212324
+玖	212118
+锈	211983
+垃	211956
+岭	211951
+官	210550
+党	210200
+挂	209284
+让	209074
+吸	208692
+皮	208390
+播	208291
+劳	207428
+误	206165
+斯	205871
+井	204974
+梯	204436
+抗	204374
+牛	204255
+洋	204000
+坊	203957
+艺	203665
+扩	203587
+把	203287
+混	203145
+才	201868
+塑	200340
+罪	199516
+尺	198578
+欢	198389
+草	198386
+酸	197182
+静	196475
+阶	195490
+犯	195319
+读	194884
+凯	194464
+极	193701
+叶	193576
+浮	193051
+冠	192907
+缆	191595
+淮	191494
+扶	191317
+株	191021
+善	190395
+苑	189944
+椅	189935
+聚	189808
+郭	189740
+索	189647
+神	188988
+捌	187419
+鸿	184524
+筹	183922
+酒	182089
+岩	181801
+吊	180177
+休	179503
+拆	179153
+灾	179135
+坪	178153
+杰	177776
+怀	176058
+肆	175935
+谷	175755
+征	175193
+胡	174584
+遵	173949
+丹	173835
+千	173487
+赣	173388
+群	173307
+毕	172966
+右	172565
+冻	172411
+卷	172383
+茂	172293
+树	171078
+顶	170996
+辅	170487
+菜	170385
+殊	169923
+杆	169776
+凝	169653
+措	169205
+破	169194
+芯	169096
+茶	168544
+堂	168315
+腾	166938
+差	166312
+守	165700
+柳	165444
+森	165414
+铺	164585
+轴	163913
+框	163747
+想	163678
+尚	163313
+己	163276
+朝	163016
+扬	162517
+偏	162114
+亮	161923
+洛	161788
+莞	161782
+鹏	161723
+仓	161293
+孙	161099
+迁	161010
+敏	160888
+思	160153
+谢	160060
+绘	159322
+瓶	159112
+氧	159035
+锡	158162
+宿	157642
+净	157197
+曲	156730
+朱	156174
+减	155980
+雅	155103
+避	154856
+宾	154706
+左	154417
+缺	154382
+染	153999
+越	153882
+苗	153819
+叉	153163
+燕	152938
+般	152606
+娄	152057
+友	151677
+摄	151340
+尾	151259
+仁	151065
+墨	150671
+滤	150421
+举	149480
+寿	149439
+享	149110
+亿	148510
+碳	148411
+裁	148340
+帐	148333
+透	148263
+浏	148228
+今	148074
+孔	148072
+踏	147564
+燃	146629
+冶	146553
+丝	146188
+也	146029
+筒	145719
+奖	145628
+隔	144845
+坝	143956
+晶	143511
+偿	142705
+触	142564
+柒	142547
+旧	142410
+桶	142247
+待	142001
+爱	141858
+半	141666
+班	141550
+距	140838
+菌	140760
+沂	140759
+骨	140674
+撤	139261
+垫	139098
+磁	138647
+吾	137985
+圆	137867
+靖	137807
+耐	137148
+喷	136761
+翔	136193
+刀	135479
+雷	135340
+赛	135140
+鄂	135135
+郴	135074
+坡	134846
+够	134787
+冲	134205
+晋	133711
+桃	133379
+盐	133265
+宋	132551
+窗	132251
+贫	131439
+毛	131414
+秒	130996
+磨	130773
+勤	129967
+岸	129828
+横	129400
+探	128766
+驻	128669
+腔	128086
+雪	127748
+败	127542
+往	127053
+央	127008
+藏	126959
+莱	126776
+餐	126495
+折	126438
+幅	126228
+缮	125581
+秦	125468
+炉	124986
+暖	124673
+练	124626
+童	124550
+雄	124453
+霞	123350
+弄	122135
+轨	121102
+植	120074
+捷	119952
+芜	119867
+汕	119757
+饮	118840
+仙	118785
+灵	118161
+潍	117968
+聊	117915
+降	117745
+援	117731
+鲜	117621
+散	117489
+拖	116874
+帮	116748
+晟	116725
+唯	116526
+错	116331
+望	116222
+欣	115814
+硒	115573
+粤	115122
+讯	114626
+渝	114047
+冀	113978
+罩	113764
+稳	113576
+芳	113400
+贷	113285
+纯	113283
+母	112877
+阜	112744
+贴	112718
+灭	112554
+麻	112403
+课	112320
+遗	112175
+铝	111887
+占	111816
+君	111784
+兵	111296
+滩	110628
+潮	110393
+紧	109256
+玛	108943
+史	108691
+戴	108558
+语	108472
+寻	108170
+艳	107904
+俊	107349
+奥	107307
+漏	106859
+焦	106433
+釆	106427
+牵	106314
+缩	106046
+壁	105952
+焊	105420
+颜	105375
+卓	105361
+膜	105327
+彭	105052
+漆	104206
+亦	104161
+杯	103568
+蔡	103541
+鹤	103473
+旭	103264
+紫	102862
+戒	102594
+什	102423
+阴	102323
+淀	102305
+沿	101600
+恶	101490
+勇	101473
+闭	101217
+柱	101189
+巷	101086
+竹	100898
+洞	100501
+晰	100405
+旺	100280
+辖	99990
+尽	99666
+拓	99630
+继	99243
+赤	98701
+曾	98521
+欧	98291
+曹	98258
+灌	98089
+累	97992
+豫	97580
+玲	97470
+肺	97441
+拨	97404
+邦	97373
+你	97096
+某	97029
+灰	96807
+旋	96378
+辰	95807
+纤	95676
+杂	95497
+伊	95412
+舍	94990
+黔	94778
+短	94717
+涛	94537
+馈	94396
+弹	94382
+柯	94306
+忠	93836
+玻	93608
+萍	93455
+棉	93256
+遇	92981
+屯	92897
+壮	92750
+危	92653
+湛	92430
+榆	92275
+亩	92035
+背	92034
+莲	91985
+丁	91774
+衣	91733
+崇	91712
+鞍	91696
+循	91627
+铭	91622
+赔	91300
+尼	91099
+辨	91071
+楚	90967
+迪	90950
+眼	90945
+庭	90789
+挥	90192
+栓	90022
+恩	89974
+圈	89927
+槽	89657
+棚	89582
+裕	89328
+沧	89320
+陷	89301
+禹	89187
+涂	89071
+悦	88930
+坤	88857
+滑	88857
+卸	88757
+伦	88728
+斌	88670
+韩	88401
+追	87762
+峡	87214
+阻	87071
+船	86963
+粮	86683
+靠	86576
+鉴	86240
+埠	86054
+兆	85893
+碎	85784
+廊	85764
+姚	85757
+缝	85691
+宗	85674
+骗	85549
+炎	85187
+幕	84929
+亭	84858
+脉	84856
+睿	84793
+襄	84240
+丘	84058
+患	83896
+虑	83895
+兼	83841
+锋	83816
+虹	83581
+伏	83544
+姐	83234
+债	83138
+肖	83093
+露	83078
+鸡	83043
+橡	82949
+纹	82726
+贤	82687
+侯	82346
+驱	82324
+绵	82290
+荆	82210
+豪	82133
+皇	81481
+刻	81450
+镀	81446
+澳	81267
+希	80839
+涵	80791
+钻	80737
+脱	80555
+湿	79898
+弘	79875
+贝	79699
+璃	79383
+奇	79376
+锌	78930
+瑶	78864
+麦	78751
+娟	78689
+顾	78607
+秋	78511
+邓	78485
+杜	78048
+渡	78046
+串	77955
+画	77376
+砂	77256
+命	77110
+钮	77090
+醒	77087
+震	76781
+钉	76474
+撑	76153
+蓉	76045
+习	75511
+韶	75289
+迟	75063
+聘	74398
+唱	74369
+仔	74349
+刚	74010
+讼	73937
+骤	73331
+斗	73295
+谱	73013
+愿	72737
+冬	72643
+荷	72636
+吕	72610
+寨	72588
+凉	72572
+困	72534
+宅	72425
+饶	72194
+锐	72137
+稿	72074
+难	72009
+闸	71562
+桩	71475
+牧	71385
+仲	71293
+畅	71158
+庐	71035
+冰	71028
+喀	70953
+听	70862
+仑	70798
+翠	70750
+脚	70730
+熟	70649
+雁	70518
+孚	70497
+弯	70484
+凌	70259
+寓	70251
+席	70129
+厨	69934
+剩	69768
+冯	69740
+昭	69730
+久	69643
+牙	69630
+释	69558
+董	69527
+盟	69408
+尘	69349
+贺	69252
+邢	69191
+泸	69057
+乳	68994
+典	68436
+抚	68432
+圣	68284
+鱼	68070
+冈	68017
+鼠	67149
+禾	66691
+硕	66455
+魏	66187
+萨	65996
+坑	65864
+锅	65777
+瓦	65498
+潘	65442
+恢	65400
+柏	65374
+邯	65064
+旁	65055
+桐	64903
+婷	64869
+晖	64765
+伤	64625
+舒	64596
+尝	64512
+轻	64377
+厕	64329
+慈	64305
+淄	64209
+丙	64174
+巡	63999
+芦	63875
+斤	63829
+陶	63635
+黎	63112
+揭	62949
+势	62949
+敬	62912
+肇	62780
+耀	62612
+羊	62605
+旦	62568
+枣	62562
+粒	62340
+映	62142
+替	61903
+爆	61757
+铸	61708
+言	61699
+穿	61393
+胞	61249
+袁	61208
+归	61074
+宫	61025
+肉	61023
+隐	60926
+刺	60755
+磊	60694
+琴	60628
+仍	60506
+搬	60021
+蒸	59723
+跨	59405
+去	59230
+堰	59196
+甸	59100
+姜	58721
+沥	58641
+钥	58625
+惩	58623
+缘	58574
+卢	58516
+虎	58212
+烧	58155
+壶	58102
+昊	58057
+腐	57755
+粘	57678
+沃	57656
+演	57578
+浆	57171
+凰	57125
+邹	57101
+迈	57022
+礼	57013
+廉	57012
+蒋	56973
+硅	56831
+砖	56823
+隧	56658
+郸	56630
+奉	56606
+蚌	56510
+咸	56423
+碧	56423
+汪	56356
+荧	56297
+剪	56288
+耳	56051
+战	56031
+馨	56007
+覆	55646
+巾	55368
+蓄	55196
+筋	55186
+盈	55171
+拥	55035
+堤	54948
+怡	54829
+找	54742
+泡	54527
+鸣	54527
+返	54264
+剑	54188
+彦	54133
+莉	53865
+祁	53845
+尿	53668
+舟	53631
+渣	53576
+皖	53418
+庙	53227
+钱	53194
+巨	53161
+挡	52918
+霍	52781
+疏	52723
+跃	52714
+沅	52629
+扎	52571
+孟	52391
+艾	52244
+割	52076
+逐	51870
+纬	51794
+耕	51622
+挖	51228
+辑	51149
+鹿	51060
+凳	50516
+筛	50474
+朗	50398
+炼	50356
+堡	50323
+肠	50315
+纠	50183
+遂	49916
+早	49911
+钦	49854
+腹	49692
+兑	49685
+喜	49664
+瓷	49551
+汤	49524
+翻	49435
+轧	49242
+沁	49210
+轩	49107
+谊	48897
+彝	48815
+珍	48814
+噪	48754
+绥	48733
+邑	48699
+彬	48634
+胎	48632
+枝	48603
+醉	48595
+顿	48478
+孝	48351
+野	48105
+柴	48042
+坚	47991
+绳	47745
+碱	47722
+芙	47698
+佩	47596
+匹	47591
+邱	47535
+纷	47435
+恕	47171
+梦	47169
+驰	47018
+脂	47001
+绑	46942
+蛋	46851
+枪	46342
+芝	46295
+蜀	46058
+谭	45998
+罐	45775
+瘤	45561
+您	45168
+坏	45144
+走	45049
+刑	45020
+励	45005
+贡	45005
+钳	44914
+韵	44821
+暨	44553
+突	44548
+肿	44533
+寺	44529
+删	44352
+琼	44347
+熊	44296
+莆	44283
+埔	44281
+臂	44134
+舜	44086
+仿	44019
+伸	43952
+衬	43888
+添	43866
+枫	43663
+娜	43413
+墩	43387
+炭	43383
+虫	43364
+狮	43213
+蔬	42993
+跟	42933
+琪	42582
+堵	42556
+抵	42443
+琳	42270
+欠	42234
+荔	42208
+毅	42151
+翼	42100
+陇	42085
+滚	41937
+伪	41839
+廖	41747
+乾	41604
+缓	41584
+埋	41551
+梧	41529
+柔	41339
+氏	41324
+堆	41317
+鹰	41304
+募	41250
+押	41241
+默	41186
+亲	41152
+奔	41131
+鼻	41123
+帆	40901
+烯	40722
+番	40693
+胃	40621
+症	40583
+汾	40547
+阵	40526
+纺	40409
+塞	40364
+扇	40276
+觉	40203
+斜	39973
+贾	39833
+盆	39821
+坛	39768
+崔	39668
+硫	39645
+畜	39622
+倒	39577
+嘴	39574
+讲	39568
+弱	39529
+窥	39460
+铅	39319
+摇	39316
+滁	39316
+赫	39198
+遥	39196
+殖	38944
+乔	38943
+葛	38911
+雾	38830
+御	38796
+衢	38728
+纽	38612
+薛	38496
+齿	38485
+榕	38029
+牡	37929
+扰	37917
+闻	37906
+渔	37869
+霄	37867
+孜	37687
+摸	37603
+盾	37454
+尖	37435
+肌	37404
+圩	37222
+侗	37141
+攻	37063
+秘	36979
+槐	36898
+帽	36777
+柄	36741
+壳	36731
+骏	36726
+辛	36724
+倍	36676
+味	36547
+毁	36534
+篮	36466
+曙	36431
+颖	36293
+浪	36291
+纵	36215
+坐	36049
+曼	36040
+略	36011
+垦	35841
+鞋	35728
+夫	35656
+男	35645
+喉	35573
+跳	35531
+借	35254
+闪	35253
+搜	35207
+几	35145
+侨	35142
+踪	35133
+泄	35060
+薄	34824
+逸	34795
+译	34739
+召	34697
+缸	34562
+尹	34460
+氯	34454
+匙	34357
+刊	34318
+抢	34246
+胸	34181
+攀	34144
+澧	34141
+遭	34086
+这	34059
+伙	34007
+籍	33974
+氢	33866
+禅	33863
+桑	33857
+擦	33737
+钩	33647
+芬	33642
+着	33425
+氨	33359
+私	33155
+沪	33101
+郊	32997
+鄞	32820
+醇	32783
+莹	32686
+醴	32664
+幸	32545
+枢	32482
+念	32408
+悉	32390
+叠	32299
+垂	32231
+麟	32202
+禺	32134
+弟	32131
+酌	32107
+驿	32037
+洱	32025
+泾	31925
+那	31913
+侵	31830
+披	31779
+溶	31712
+杀	31689
+渭	31584
+巩	31552
+棒	31489
+裂	31253
+丧	31216
+耒	31017
+辐	30920
+氟	30700
+帘	30686
+颗	30637
+碑	30629
+砌	30515
+淘	30312
+匀	30266
+脏	30262
+遴	30202
+伯	30167
+莫	29966
+麓	29931
+颤	29823
+菏	29765
+拌	29752
+搭	29750
+窑	29731
+蒲	29721
+兄	29639
+肤	29634
+趣	29632
+仕	29590
+泓	29589
+杏	29588
+宸	29564
+羽	29548
+沉	29478
+乘	29344
+菲	29332
+浓	29280
+岚	29247
+渗	29201
+役	29183
+绕	29105
+们	29093
+糖	28989
+砼	28777
+壤	28768
+歌	28743
+夷	28733
+舞	28644
+驶	28620
+韦	28604
+慎	28505
+秩	28496
+淑	28463
+萧	28416
+茅	28416
+驾	28340
+芷	28289
+末	28262
+菊	28151
+悬	28150
+澜	28024
+却	27991
+脸	27942
+摩	27846
+遣	27822
+蓬	27791
+阁	27758
+酯	27699
+诸	27602
+峪	27553
+迹	27535
+泗	27444
+涟	27394
+麒	27350
+楠	27293
+辊	27278
+稀	27077
+椒	27037
+芗	26948
+龚	26925
+巧	26864
+荫	26858
+朔	26837
+罕	26817
+虞	26763
+苍	26639
+猪	26623
+奎	26611
+酶	26587
+倩	26533
+烤	26488
+汝	26485
+泊	26456
+涌	26436
+抄	26412
+聪	26377
+掘	26376
+券	26281
+亳	26258
+豆	26094
+隅	26019
+淳	25994
+勿	25987
+磷	25944
+厢	25794
+梓	25712
+瑕	25701
+溯	25682
+巢	25582
+疵	25525
+熔	25518
+抑	25472
+舶	25465
+囊	25457
+敷	25423
+忻	25394
+呈	25311
+舱	25226
+珊	25180
+乱	25136
+姑	25132
+赖	25041
+倾	24952
+饭	24868
+绣	24858
+蚀	24840
+濮	24825
+溉	24802
+贯	24799
+肢	24791
+尧	24577
+矩	24499
+龄	24482
+揽	24460
+诏	24351
+拼	24313
+浑	24266
+磅	24196
+滇	24137
+伴	24079
+繁	24051
+瀚	24005
+郝	23937
+劣	23906
+蔽	23903
+掌	23891
+邻	23870
+眉	23794
+谋	23782
+碍	23771
+雕	23755
+闫	23754
+媛	23746
+琦	23676
+毫	23565
+亨	23543
+哲	23542
+拔	23516
+浴	23480
+岁	23441
+涪	23409
+弥	23362
+洽	23324
+谨	23301
+慢	23252
+卧	23217
+氮	23203
+粗	23194
+婴	23154
+淖	23125
+暗	23044
+傅	23025
+闵	22905
+淤	22888
+烈	22846
+迅	22772
+帅	22747
+樊	22697
+祝	22689
+楞	22679
+煌	22656
+昇	22653
+捏	22624
+献	22509
+昱	22391
+倪	22322
+祖	22320
+滦	22284
+妙	22269
+熙	22260
+敦	22189
+抓	22037
+煜	21974
+闲	21951
+菱	21942
+樟	21907
+炜	21851
+晚	21847
+握	21785
+霖	21701
+禄	21690
+蝶	21633
+翁	21628
+坎	21623
+抹	21553
+厘	21541
+腺	21540
+瑜	21521
+酷	21403
+著	21375
+滕	21373
+灶	21272
+粪	21225
+簧	21216
+浔	21201
+盗	21190
+垣	21186
+枚	21117
+蜜	21090
+涤	21085
+鸟	20978
+穗	20978
+棠	20948
+葫	20797
+摆	20718
+炬	20711
+钠	20653
+锥	20650
+又	20633
+锚	20633
+昕	20566
+骑	20535
+诗	20532
+皓	20492
+陀	20446
+陂	20414
+牟	20408
+犁	20389
+岔	20359
+冒	20305
+漯	20275
+胆	20174
+刮	20130
+墅	20114
+搏	20102
+攸	20071
+尤	20053
+吐	19986
+苯	19937
+践	19855
+孵	19794
+雯	19737
+诈	19710
+奶	19703
+肝	19648
+拱	19629
+既	19550
+璐	19485
+泌	19472
+醛	19351
+彻	19349
+扳	19324
+殡	19310
+磐	19275
+淞	19205
+莎	19176
+泛	19128
+潼	19103
+嵌	19038
+纱	19029
+酵	19003
+嵩	18946
+妥	18894
+蕾	18882
+鸭	18834
+稻	18834
+帝	18736
+泳	18727
+臭	18709
+玮	18691
+裙	18683
+浇	18631
+颅	18615
+奕	18580
+颍	18539
+死	18494
+伞	18476
+颈	18463
+滋	18441
+璧	18438
+衔	18438
+旱	18348
+祺	18319
+皂	18289
+夜	18234
+锂	18173
+渤	18126
+钰	18053
+些	17907
+庞	17862
+搅	17794
+臻	17697
+铲	17635
+聂	17607
+猜	17594
+吹	17535
+丛	17534
+俞	17467
+殷	17461
+涡	17455
+蔚	17436
+膏	17412
+燥	17392
+胺	17386
+翰	17360
+铃	17356
+瓜	17186
+皋	17154
+腰	17137
+汶	17090
+卉	16967
+涝	16962
+坦	16951
+拦	16945
+覃	16912
+薇	16894
+遮	16894
+佑	16816
+灿	16812
+蕉	16808
+叫	16764
+栅	16749
+晏	16740
+杉	16689
+滴	16688
+汛	16660
+溧	16583
+汀	16547
+剧	16468
+郡	16465
+佐	16445
+梨	16435
+莒	16432
+谐	16355
+岐	16340
+濉	16324
+沭	16276
+潞	16182
+碗	16123
+貌	16111
+掉	16105
+郎	16104
+歧	16096
+颐	16086
+巫	16057
+寰	16056
+箭	16055
+淋	16052
+恺	16033
+袖	16017
+朋	15948
+尊	15932
+斑	15903
+擅	15820
+耿	15799
+桦	15789
+膨	15750
+涧	15718
+跑	15713
+谅	15651
+沫	15590
+娇	15582
+赢	15539
+屈	15537
+寒	15527
+芒	15513
+拜	15510
+浅	15428
+烷	15344
+胀	15333
+沣	15332
+逻	15330
+曝	15315
+荒	15287
+岱	15237
+潇	15193
+溢	15191
+轿	15100
+鹅	15097
+肩	15069
+箕	14994
+腿	14987
+兽	14903
+玩	14902
+炳	14870
+屿	14868
+栽	14858
+眠	14853
+沐	14848
+戏	14823
+蚊	14777
+纲	14770
+栗	14730
+栖	14730
+莘	14691
+摘	14687
+屹	14680
+钛	14668
+骆	14637
+酬	14629
+炮	14595
+牢	14592
+郁	14474
+浚	14424
+猫	14356
+勐	14342
+渍	14331
+丢	14190
+匠	14078
+窝	14075
+侦	14069
+刹	14060
+尉	14056
+枕	14054
+劲	14024
+绒	14002
+昂	13992
+挤	13932
+巍	13931
+缠	13911
+沽	13884
+帧	13826
+椎	13784
+赋	13783
+穆	13779
+洼	13753
+赉	13745
+旌	13744
+荡	13734
+勾	13733
+皆	13723
+妃	13711
+沛	13690
+晴	13671
+瓯	13653
+洒	13649
+兹	13647
+栾	13619
+嘎	13601
+绞	13488
+浸	13477
+咽	13473
+潢	13437
+浠	13422
+扁	13399
+弧	13374
+撞	13248
+崂	13198
+崖	13193
+蜡	13178
+篇	13178
+谦	13118
+讨	13101
+萌	13071
+荟	13070
+冉	13059
+穴	13046
+曦	13039
+锻	13028
+郫	13013
+烨	13010
+笼	12992
+岑	12987
+催	12867
+邺	12854
+峨	12837
+缀	12832
+傣	12792
+禽	12790
+矫	12748
+玺	12716
+赠	12713
+墓	12703
+卜	12697
+垒	12663
+淼	12639
+藤	12635
+棋	12622
+勋	12619
+睡	12511
+坞	12499
+鲍	12465
+棕	12424
+峻	12424
+漫	12400
+痕	12376
+玄	12366
+霸	12354
+喇	12305
+肾	12262
+凸	12240
+乒	12219
+喻	12159
+蜂	12122
+滘	12079
+阮	12077
+芹	12067
+锯	12057
+矛	12056
+乓	12052
+鳌	11997
+坂	11939
+羌	11922
+碚	11888
+脊	11886
+伽	11862
+贞	11858
+泷	11829
+捆	11799
+渌	11794
+珞	11784
+毯	11770
+辩	11744
+彪	11709
+翟	11706
+诱	11682
+畴	11680
+嵊	11674
+兖	11656
+烘	11636
+剖	11599
+雀	11445
+茌	11433
+沱	11392
+妹	11387
+榄	11360
+儒	11337
+丈	11336
+帚	11327
+茹	11323
+削	11309
+妮	11238
+璟	11232
+硝	11184
+隙	11153
+猛	11151
+乃	11128
+爽	11126
+郧	11091
+廷	11061
+锤	11044
+痛	11040
+逆	10999
+叙	10995
+苹	10931
+孕	10896
+抛	10885
+屉	10884
+裤	10875
+詹	10812
+赂	10803
+舰	10686
+弓	10678
+睢	10635
+箍	10630
+彤	10584
+腊	10529
+竖	10519
+敖	10495
+鲤	10471
+亡	10469
+痰	10449
+忽	10439
+汰	10438
+铬	10424
+隶	10415
+瞒	10387
+庵	10384
+耽	10372
+铂	10349
+赞	10337
+迷	10332
+簸	10317
+寅	10309
+帕	10260
+暴	10218
+沾	10192
+卿	10176
+綦	10171
+恰	10166
+洮	10132
+茗	10124
+词	10101
+妍	10070
+碰	10043
+焕	10042
+媳	10029
+笑	9935
+拷	9841
+俗	9829
+靶	9772
+芸	9766
+顷	9743
+哨	9708
+籽	9698
+怒	9672
+溆	9591
+忆	9582
+钙	9579
+邗	9568
+擎	9540
+柘	9538
+戈	9529
+蚁	9527
+婧	9525
+盲	9525
+肯	9523
+娥	9516
+檀	9514
+茄	9502
+茜	9499
+糊	9498
+臣	9475
+掖	9473
+秤	9416
+衷	9335
+霉	9331
+弋	9323
+篷	9291
+塌	9282
+饱	9255
+樱	9220
+窄	9199
+桔	9179
+汗	9157
+琛	9153
+甬	9149
+挺	9136
+畔	9129
+淇	9127
+饲	9096
+氛	9068
+旬	9030
+铣	9024
+萝	8994
+甄	8955
+刨	8946
+涿	8935
+舆	8928
+寮	8925
+胁	8877
+岷	8877
+纶	8871
+翡	8861
+耦	8849
+咳	8827
+焚	8817
+乏	8812
+笛	8760
+圃	8730
+鹭	8720
+菁	8711
+垛	8709
+禧	8680
+柠	8647
+扭	8642
+砚	8619
+忘	8608
+婺	8607
+烽	8604
+硚	8587
+很	8574
+绪	8554
+桓	8545
+裴	8534
+梳	8510
+橙	8508
+汨	8481
+艇	8480
+棵	8477
+钧	8470
+窦	8469
+趋	8442
+剥	8435
+拐	8413
+秸	8370
+湄	8369
+贮	8351
+伐	8341
+阔	8340
+讫	8289
+漂	8274
+甜	8270
+哑	8265
+茵	8253
+蛟	8231
+奋	8228
+淡	8212
+宪	8210
+煲	8209
+咀	8204
+姆	8197
+秆	8191
+杠	8186
+捕	8165
+涞	8149
+盼	8139
+璜	8104
+湟	8101
+萃	8093
+甫	8077
+嫌	8070
+亏	8048
+辣	8028
+匾	8012
+驼	7958
+陪	7956
+樾	7950
+镍	7949
+雍	7915
+盏	7906
+葬	7904
+焱	7901
+吧	7897
+抱	7896
+氩	7860
+叭	7836
+蕴	7823
+熏	7810
+灸	7791
+骅	7788
+喆	7773
+蟠	7750
+宛	7734
+钾	7732
+衍	7725
+阎	7719
+棱	7715
+靴	7714
+烁	7709
+钨	7695
+冗	7686
+斥	7646
+珑	7641
+坳	7632
+楷	7572
+傲	7570
+葡	7565
+勃	7551
+篡	7538
+遍	7478
+厝	7474
+韬	7473
+刁	7457
+阐	7449
+浈	7448
+渚	7441
+珲	7417
+蛇	7411
+岙	7378
+哪	7377
+凹	7321
+偶	7302
+邸	7289
+埃	7283
+韧	7279
+漕	7246
+渊	7238
+驳	7233
+瑾	7188
+烫	7155
+胱	7115
+昶	7086
+瞿	7082
+蔺	7079
+胰	7075
+珂	7066
+慰	7054
+逊	7053
+庚	7049
+癌	7044
+迫	7039
+勺	6996
+咏	6991
+锗	6989
+鄢	6979
+枯	6964
+么	6963
+糕	6932
+氰	6927
+谯	6902
+忧	6825
+酮	6790
+榜	6782
+摊	6764
+奈	6754
+饼	6751
+仰	6742
+琅	6709
+邛	6706
+赶	6677
+酉	6676
+廓	6676
+篦	6659
+陡	6656
+筐	6649
+檬	6639
+萄	6636
+瀛	6636
+膀	6614
+殿	6606
+玫	6593
+啤	6582
+汞	6577
+秭	6574
+荥	6566
+毓	6557
+焰	6555
+彰	6548
+撒	6544
+垢	6543
+钊	6533
+坻	6533
+娱	6526
+蓟	6517
+匿	6497
+秉	6493
+姣	6450
+吞	6438
+劝	6416
+悔	6412
+焉	6400
+爬	6383
+炫	6373
+佘	6371
+蕊	6369
+榨	6357
+渑	6345
+颂	6342
+卞	6333
+姿	6332
+句	6329
+濠	6328
+裸	6309
+沚	6276
+皿	6247
+涨	6246
+鄱	6244
+嫩	6242
+靳	6237
+峒	6219
+鲲	6214
+裹	6212
+芽	6204
+褚	6192
+涯	6185
+耆	6181
+碘	6163
+欺	6153
+茨	6148
+拣	6144
+杞	6142
+锰	6134
+祠	6116
+滞	6107
+骄	6077
+腻	6060
+瑛	6059
+婚	6048
+镁	5989
+霜	5976
+薪	5955
+浜	5951
+芮	5945
+塬	5943
+畲	5937
+钼	5924
+盱	5887
+贻	5881
+罘	5876
+戚	5874
+晒	5858
+弗	5851
+玥	5777
+蕲	5772
+缪	5756
+匡	5751
+葵	5747
+颌	5714
+菇	5694
+酰	5680
+淅	5671
+慕	5655
+眙	5635
+璇	5620
+栈	5619
+拿	5605
+娅	5604
+撕	5594
+铵	5588
+儋	5570
+懿	5557
+抬	5495
+缔	5474
+棣	5464
+衰	5463
+朴	5459
+虽	5457
+畈	5455
+镊	5427
+剔	5427
+酱	5417
+婉	5417
+酚	5406
+崃	5398
+努	5381
+晔	5367
+刃	5357
+凿	5348
+斐	5337
+膝	5316
+烃	5313
+藁	5309
+碟	5299
+狗	5297
+抖	5295
+腈	5289
+骁	5272
+漠	5269
+矮	5267
+瞳	5266
+魁	5258
+铰	5254
+腕	5223
+镶	5223
+檐	5212
+炔	5208
+姬	5205
+垌	5198
+髓	5193
+笺	5182
+鞘	5157
+卤	5141
+晗	5132
+偃	5132
+哥	5125
+歙	5118
+帜	5117
+炸	5100
+樵	5095
+挑	5094
+瓣	5091
+篓	5090
+簿	5088
+曳	5087
+郯	5084
+邳	5079
+爵	5076
+琨	5075
+晃	5068
+槎	5063
+垄	5056
+霁	5054
+垭	5040
+臧	5006
+缙	4982
+匝	4981
+灞	4980
+卵	4974
+鸠	4961
+灏	4947
+撰	4932
+昀	4921
+朵	4913
+珺	4912
+厉	4901
+枞	4899
+瑚	4895
+碾	4890
+撮	4886
+娃	4882
+邕	4881
+榭	4873
+筷	4863
+肪	4862
+炒	4853
+咖	4841
+屑	4834
+钜	4831
+俱	4828
+铠	4821
+崩	4819
+荻	4812
+矸	4800
+樘	4798
+嵘	4797
+屠	4792
+矶	4786
+稽	4777
+漾	4770
+垚	4767
+蓓	4752
+兔	4744
+魔	4729
+埭	4719
+橱	4710
+姗	4709
+拘	4708
+钬	4686
+弦	4656
+汁	4656
+竟	4647
+蒜	4640
+醚	4608
+轶	4595
+瑰	4582
+婕	4568
+煎	4564
+葱	4548
+崆	4543
+铆	4531
+侠	4520
+迭	4516
+朐	4510
+钞	4509
+豹	4508
+浊	4487
+衫	4484
+濂	4482
+汴	4472
+雇	4458
+扑	4447
+跌	4431
+戳	4422
+坯	4404
+伺	4400
+歇	4394
+熠	4394
+胥	4390
+肋	4357
+舌	4356
+疃	4351
+箔	4351
+狼	4350
+蠡	4348
+碣	4328
+蒂	4320
+仆	4306
+薯	4299
+寇	4288
+谌	4286
+鹃	4282
+邬	4279
+啡	4270
+眩	4269
+酿	4266
+恐	4262
+盂	4260
+猴	4255
+掇	4254
+悟	4250
+锹	4248
+裱	4233
+虾	4230
+隽	4228
+丸	4219
+醋	4216
+峄	4206
+泺	4204
+犬	4203
+飘	4202
+爪	4202
+嗽	4200
+畸	4190
+宙	4172
+萱	4168
+邡	4159
+啸	4158
+钓	4127
+俐	4115
+歪	4092
+昔	4091
+棍	4085
+膳	4082
+惯	4068
+碶	4049
+疼	4047
+瓮	4036
+逢	4021
+祜	4001
+溜	4000
+拭	3990
+椿	3988
+幻	3971
+褥	3969
+堃	3961
+郏	3960
+毡	3948
+峥	3945
+孤	3938
+黏	3922
+贩	3918
+镐	3915
+捞	3915
+肛	3871
+钒	3868
+尕	3858
+妆	3846
+瞬	3846
+钣	3845
+狂	3842
+倡	3827
+吻	3813
+罡	3808
+笋	3795
+盔	3779
+笤	3772
+撬	3768
+勉	3743
+榴	3716
+氦	3699
+仇	3679
+鸽	3659
+娣	3659
+佟	3656
+咪	3626
+筠	3623
+棘	3607
+铄	3598
+蝇	3597
+坨	3590
+塍	3587
+戎	3584
+绛	3579
+咬	3562
+煮	3560
+垅	3535
+埕	3530
+桨	3526
+佬	3524
+杖	3523
+椰	3510
+瘦	3510
+溅	3509
+隋	3508
+磴	3498
+霆	3485
+稍	3484
+俭	3481
+姻	3478
+铖	3469
+梵	3465
+砾	3456
+曜	3440
+燊	3434
+佤	3432
+柑	3429
+阙	3428
+赐	3425
+俄	3417
+陉	3408
+馏	3407
+宴	3404
+婵	3403
+睦	3400
+徕	3398
+僳	3397
+娴	3394
+欲	3392
+傈	3390
+疸	3386
+砀	3383
+闯	3382
+毂	3379
+祎	3376
+偷	3360
+蚕	3359
+娘	3348
+苇	3342
+赟	3341
+汐	3338
+椭	3335
+铎	3316
+佣	3313
+铀	3301
+夯	3289
+璞	3279
+兜	3273
+宰	3269
+淦	3268
+琰	3266
+皱	3263
+蹈	3260
+绸	3258
+晾	3258
+猗	3246
+翊	3240
+浒	3229
+镉	3226
+龟	3226
+阈	3218
+疲	3216
+靓	3212
+祯	3209
+嘱	3201
+鲸	3184
+蹄	3182
+苟	3175
+磺	3173
+髋	3156
+胤	3143
+溴	3133
+粟	3132
+徒	3130
+姝	3120
+藻	3113
+烦	3113
+吃	3109
+梭	3109
+筱	3094
+飚	3091
+挠	3087
+耶	3080
+橘	3076
+箐	3073
+恋	3072
+柿	3070
+於	3069
+吗	3064
+崎	3063
+骥	3061
+硼	3054
+奚	3052
+胚	3050
+珏	3036
+钴	3029
+铮	3028
+凑	3026
+蜗	3018
+斡	3017
+矢	3005
+郓	2998
+埂	2994
+盎	2973
+戊	2972
+搁	2961
+蔓	2955
+鞠	2955
+霏	2949
+坭	2948
+拳	2947
+坠	2925
+踞	2920
+藕	2917
+珀	2915
+桁	2912
+滔	2911
+鸦	2906
+疮	2893
+碁	2887
+掺	2884
+曌	2878
+蹲	2870
+扒	2858
+蝴	2849
+趟	2848
+篱	2846
+苦	2844
+锉	2836
+墟	2825
+烹	2824
+茉	2819
+澎	2818
+窖	2814
+宕	2813
+卯	2813
+赴	2800
+蒗	2797
+旨	2793
+翘	2790
+辙	2790
+稷	2785
+沸	2782
+娩	2780
+竭	2773
+岘	2771
+锣	2766
+埇	2759
+踢	2755
+缤	2745
+喊	2738
+褪	2722
+垸	2716
+甚	2710
+踝	2708
+锟	2701
+岫	2697
+粱	2690
+旷	2679
+渐	2675
+囗	2674
+谁	2672
+唇	2671
+汊	2662
+琊	2661
+灼	2659
+壕	2652
+忱	2652
+耘	2651
+陌	2646
+迳	2638
+楔	2636
+蟑	2633
+柚	2625
+旻	2624
+鳄	2618
+泮	2614
+翌	2614
+钤	2612
+契	2601
+恭	2598
+冕	2587
+烂	2582
+翎	2578
+犹	2577
+琥	2568
+坟	2567
+絮	2563
+捐	2538
+坍	2532
+驹	2522
+狄	2516
+伶	2511
+丞	2508
+捣	2498
+愈	2494
+骼	2489
+砷	2488
+鄠	2487
+骞	2486
+珙	2484
+蔗	2478
+噶	2476
+帖	2476
+狭	2471
+锴	2471
+橄	2463
+竿	2461
+羡	2451
+竺	2449
+吋	2445
+郢	2445
+瞻	2433
+砸	2432
+燎	2431
+赏	2429
+侃	2424
+蓥	2419
+槟	2418
+耙	2418
+啄	2414
+翀	2413
+仫	2409
+父	2404
+瓴	2400
+厌	2396
+媚	2375
+亘	2373
+莓	2371
+妈	2367
+粥	2361
+暑	2359
+莺	2357
+艘	2354
+淆	2352
+桢	2350
+砍	2344
+幽	2343
+骋	2341
+斋	2338
+釜	2328
+俯	2325
+漱	2323
+熄	2323
+锑	2309
+枋	2307
+濞	2307
+犍	2305
+熹	2304
+峁	2302
+甩	2302
+浯	2296
+犀	2288
+踊	2285
+薰	2285
+鲅	2283
+颇	2279
+搪	2268
+锷	2262
+氙	2260
+婆	2259
+卒	2259
+缅	2258
+唤	2255
+逃	2254
+焙	2250
+敕	2248
+鸥	2245
+栩	2245
+瘟	2240
+澡	2239
+砟	2222
+翅	2218
+惟	2214
+啦	2214
+瘫	2212
+摔	2189
+袜	2184
+梗	2183
+唑	2182
+峙	2179
+讷	2170
+铨	2167
+阆	2165
+炊	2163
+沤	2161
+碌	2159
+钎	2157
+燚	2152
+糯	2146
+锭	2143
+钝	2138
+驷	2134
+邝	2134
+拧	2130
+陟	2127
+铧	2122
+脆	2121
+稠	2119
+恤	2118
+炯	2118
+肘	2102
+妻	2102
+濛	2090
+镭	2089
+倚	2084
+惕	2080
+淝	2079
+捉	2076
+辕	2068
+诬	2060
+贪	2057
+狐	2053
+寝	2050
+浉	2046
+蛛	2043
+崧	2042
+囱	2037
+螂	2037
+庸	2035
+煊	2035
+肽	2033
+祉	2031
+迦	2027
+懋	2026
+晕	2026
+洺	2025
+赈	2021
+垟	2015
+骐	2011
+箬	2010
+饪	2007
+蓼	2005
+挛	2001
+夕	1993
+孩	1990
+珩	1980
+裘	1980
+衙	1978
+悠	1966
+闹	1965
+袍	1960
+滢	1955
+礁	1953
+渎	1949
+镂	1947
+琉	1945
+鸾	1941
+脐	1940
+鄯	1933
+痉	1929
+弈	1929
+澍	1928
+鸯	1927
+秣	1926
+黟	1926
+潺	1919
+兢	1918
+忙	1915
+喂	1914
+弊	1912
+韭	1901
+沼	1891
+绷	1887
+劵	1883
+浣	1878
+巽	1877
+蠕	1874
+骎	1871
+淠	1870
+掏	1869
+掩	1867
+锆	1865
+猇	1864
+芋	1858
+俏	1848
+吡	1844
+牦	1838
+垱	1836
+萤	1836
+侬	1831
+虔	1827
+煦	1823
+滏	1822
+郜	1821
+阡	1813
+孢	1811
+敲	1803
+逄	1801
+銮	1796
+芃	1796
+聋	1795
+岢	1791
+烜	1789
+魅	1789
+淹	1784
+梢	1776
+祈	1772
+逗	1772
+臆	1769
+拽	1765
+吟	1759
+猎	1758
+遏	1756
+漓	1755
+鄄	1755
+挪	1750
+琶	1744
+鳞	1739
+胭	1737
+驭	1736
+丫	1734
+茫	1733
+砧	1731
+扈	1731
+鹊	1728
+搓	1728
+辜	1728
+浐	1727
+蚂	1720
+榔	1719
+圪	1707
+芭	1703
+犇	1702
+歆	1694
+蝉	1689
+窨	1687
+奏	1684
+泪	1676
+稔	1676
+谟	1675
+愉	1673
+舵	1670
+硐	1667
+蒿	1666
+郦	1666
+糙	1662
+踩	1646
+嶷	1636
+逼	1631
+羿	1628
+蜘	1626
+胖	1623
+胪	1614
+崴	1611
+壬	1603
+彼	1603
+牲	1600
+肚	1596
+珈	1596
+叔	1596
+珉	1588
+癿	1586
+郾	1585
+茎	1583
+枧	1580
+琚	1580
+疤	1572
+洹	1569
+绮	1562
+弛	1559
+纫	1557
+懒	1536
+圭	1533
+呆	1525
+苴	1520
+埗	1518
+骜	1515
+秧	1507
+敞	1506
+隘	1506
+匣	1505
+羟	1497
+漩	1496
+榫	1496
+绶	1492
+柬	1492
+纂	1488
+乎	1488
+疹	1487
+仝	1484
+侣	1481
+宠	1476
+辞	1474
+吓	1473
+恬	1468
+忌	1466
+旸	1464
+尸	1462
+膛	1458
+芊	1458
+毽	1451
+柞	1447
+冼	1444
+蟹	1444
+槛	1440
+喧	1434
+渲	1427
+翱	1421
+泖	1414
+斧	1412
+赭	1411
+妨	1407
+胫	1407
+苔	1407
+塅	1406
+璋	1398
+谤	1394
+诽	1394
+釉	1392
+睛	1387
+耸	1378
+漪	1376
+钡	1375
+榈	1374
+穹	1367
+羚	1360
+哗	1359
+瞩	1354
+骊	1354
+寥	1349
+邾	1349
+沔	1347
+逍	1346
+祚	1342
+龈	1342
+笃	1338
+佃	1336
+垠	1336
+昵	1332
+豚	1327
+盯	1324
+査	1315
+敌	1315
+瑙	1313
+鬃	1312
+窒	1311
+沌	1303
+桉	1302
+埚	1298
+垡	1295
+町	1294
+桷	1292
+颢	1290
+臀	1288
+崮	1285
+佗	1285
+毗	1284
+泼	1278
+篆	1278
+舫	1278
+蕙	1274
+绅	1271
+宵	1270
+馥	1267
+懂	1263
+惜	1259
+搞	1259
+坩	1251
+阚	1246
+洣	1243
+妊	1241
+璨	1241
+谛	1239
+钲	1236
+畚	1235
+锄	1235
+丕	1234
+腋	1232
+葭	1232
+昙	1230
+晁	1228
+苷	1227
+鹄	1224
+妤	1221
+黛	1217
+瀍	1216
+砻	1214
+饵	1214
+捡	1211
+堑	1206
+笙	1205
+躺	1205
+缎	1203
+扉	1203
+蚝	1201
+轲	1199
+茸	1199
+窟	1198
+笠	1198
+趸	1196
+浍	1189
+烙	1186
+蹬	1185
+氡	1182
+钵	1181
+丨	1177
+峤	1177
+敢	1176
+焜	1175
+鬼	1174
+砦	1171
+嵛	1169
+涓	1166
+垓	1164
+洵	1163
+洸	1162
+湫	1159
+闰	1158
+酃	1157
+篁	1157
+臼	1156
+瀑	1152
+帛	1151
+埝	1150
+嗜	1148
+挚	1144
+呢	1143
+芍	1143
+滂	1142
+戬	1139
+膈	1133
+苓	1130
+鸳	1127
+哇	1126
+荃	1125
+雒	1123
+拯	1120
+霓	1119
+隰	1118
+缨	1109
+蘑	1108
+汲	1101
+葆	1101
+夺	1098
+奢	1098
+芥	1098
+亓	1096
+愚	1090
+蛀	1089
+缉	1088
+褐	1088
+亢	1087
+脲	1084
+菩	1083
+俬	1083
+榉	1083
+褂	1082
+蛾	1081
+斛	1080
+啶	1079
+筏	1077
+嗣	1075
+瘘	1070
+筜	1066
+隍	1065
+筼	1061
+暮	1057
+曰	1050
+飒	1048
+瞭	1048
+淬	1043
+茭	1042
+豉	1042
+怎	1041
+涅	1039
+摹	1039
+掸	1037
+冢	1036
+湃	1034
+苫	1032
+镧	1030
+劼	1030
+嵇	1029
+栎	1028
+叩	1027
+俤	1025
+躯	1023
+疝	1020
+崛	1020
+枸	1017
+羲	1017
+蛙	1011
+囚	1009
+菠	1009
+拇	1007
+琵	1006
+舸	1004
+聿	1004
+镔	1003
+擂	1003
+橇	1000
+塱	999
+觅	997
+孪	996
+泻	995
+惰	993
+诋	993
+宦	992
+枹	992
+艮	990
+粑	989
+檩	989
+靛	988
+闷	988
+猕	985
+脓	980
+颉	980
+稼	980
+荀	973
+腱	972
+庾	971
+戛	970
+鋆	969
+丶	968
+苞	967
+茆	963
+珅	961
+颛	959
+闾	957
+帷	957
+瓢	956
+娠	953
+阑	950
+嗨	947
+莴	943
+亥	942
+楹	938
+嫦	937
+螨	936
+牯	934
+苕	932
+筇	931
+铿	930
+蛮	930
+弼	929
+镗	929
+樽	928
+啉	928
+涣	928
+脖	924
+歉	924
+酐	917
+呷	916
+钗	916
+缇	915
+廿	913
+砝	912
+爷	910
+诵	908
+窃	908
+钽	906
+桡	904
+泐	904
+玑	903
+濑	902
+驮	899
+脾	898
+雉	898
+堪	897
+瞰	894
+莽	893
+莼	893
+熨	890
+涔	888
+斓	887
+慷	885
+嫣	884
+喝	883
+鹗	880
+仡	880
+跆	880
+琢	879
+炀	876
+氐	876
+垴	875
+菡	873
+瑟	873
+剁	871
+炽	871
+沨	866
+雲	862
+赘	861
+琐	860
+荤	860
+肱	859
+葳	859
+奠	858
+凇	848
+沩	848
+虢	848
+烛	846
+濒	846
+祭	845
+逯	844
+淌	843
+馒	842
+傍	842
+卦	836
+佶	835
+蔷	833
+澈	833
+鲨	833
+洑	832
+暄	829
+叮	827
+祛	825
+槿	825
+铱	825
+桠	820
+籼	819
+朕	819
+趵	816
+咱	814
+俪	813
+呋	813
+鲢	812
+跷	811
+骖	810
+迤	808
+樑	808
+唾	807
+姥	806
+藩	803
+滹	802
+邰	801
+笆	801
+漷	800
+偲	800
+砺	800
+聯	799
+泞	796
+矾	794
+筝	793
+溃	793
+濯	790
+咕	790
+鞭	789
+阱	789
+內	789
+畋	786
+巅	784
+啟	784
+乍	783
+憩	783
+鮀	783
+巿	783
+僵	779
+畏	778
+湍	777
+唛	777
+泠	777
+饺	775
+潦	774
+惊	772
+徂	771
+癀	769
+磬	766
+劈	766
+铍	762
+呵	762
+朦	762
+褶	759
+瑄	759
+瞄	757
+奂	757
+噻	756
+绰	756
+愁	755
+畹	751
+胨	750
+淏	749
+睑	747
+贇	747
+捧	745
+鲇	741
+嶂	741
+陬	738
+笪	738
+挽	736
+矗	734
+嫔	732
+腥	731
+孰	727
+抠	726
+霾	722
+挟	722
+羧	720
+枇	718
+崤	714
+侍	714
+蟾	713
+潆	711
+膦	709
+酪	708
+谣	707
+庶	705
+骚	705
+俸	702
+扯	701
+扼	700
+荪	700
+簇	699
+呐	693
+啊	692
+嗪	692
+恪	691
+剡	691
+倘	687
+稚	686
+溺	685
+杷	683
+铛	683
+骇	682
+澹	680
+琏	679
+镰	678
+喃	672
+昝	671
+聆	670
+雌	669
+嫁	668
+滆	667
+揉	667
+痪	666
+琤	665
+誓	663
+锝	662
+垮	661
+墒	661
+扔	660
+糜	659
+菖	659
+宬	657
+洙	655
+跤	653
+鸬	652
+雹	652
+锨	651
+绚	649
+憬	648
+骉	645
+斩	639
+薮	635
+僧	635
+湧	633
+枭	632
+棺	629
+粹	629
+颚	628
+衅	626
+箅	625
+吲	624
+俩	623
+佼	622
+堌	621
+谏	619
+谎	619
+炕	619
+峃	618
+號	617
+苛	617
+髁	617
+圻	617
+怠	614
+萘	614
+墘	611
+潋	610
+痫	608
+崀	606
+茈	605
+骶	604
+沦	604
+淯	601
+皎	600
+澥	600
+鹦	599
+徳	598
+哚	598
+刍	597
+琮	597
+稞	595
+孺	595
+沮	595
+狸	593
+凼	593
+焓	592
+隗	589
+穷	587
+兮	587
+髂	585
+馕	583
+钺	582
+阊	582
+溇	581
+亟	581
+溱	578
+澴	577
+癣	577
+茁	576
+痒	575
+谓	575
+嵬	574
+拂	574
+裔	572
+嘛	571
+栢	570
+譬	570
+夼	567
+腌	566
+菉	564
+舷	564
+荞	564
+喹	563
+炖	563
+敛	562
+溥	561
+頔	560
+甪	560
+菅	556
+爸	555
+鳙	554
+苜	553
+铼	553
+酥	553
+碛	551
+痘	551
+擀	551
+砜	551
+邪	550
+夔	549
+眷	549
+楣	547
+芨	547
+箫	546
+憨	545
+岜	545
+咯	544
+嗅	542
+诿	542
+癫	541
+桅	539
+渫	538
+眸	537
+嬴	537
+沄	536
+彧	536
+蹉	535
+诞	535
+钿	534
+恳	532
+疱	532
+忍	531
+旖	527
+捻	526
+拴	526
+璠	525
+嵋	525
+壆	524
+厍	523
+涠	523
+凫	523
+锶	522
+镱	522
+趾	521
+镒	520
+螳	519
+镖	519
+勰	518
+颀	516
+笏	515
+碴	515
+滠	513
+乞	513
+鸢	512
+芩	512
+腩	511
+馀	511
+绎	511
+徘	510
+钕	509
+钏	506
+怕	506
+朽	504
+娉	504
+拢	503
+奴	500
+奓	500
+蓿	499
+镓	499
+藉	498
+徊	498
+崟	497
+酩	497
+蘭	497
+闳	497
+垵	494
+晞	493
+札	493
+檫	492
+哄	492
+茬	491
+盥	491
+漉	491
+贲	491
+豸	490
+硖	489
+雏	489
+糠	489
+窜	488
+峦	488
+熵	487
+哺	487
+嗓	487
+瑀	487
+苒	487
+鼾	486
+帼	485
+堽	484
+萎	484
+焘	484
+襟	482
+磕	482
+羔	481
+豁	481
+呕	481
+窠	480
+虬	479
+纾	478
+顽	478
+薏	478
+榛	478
+袭	476
+氖	476
+苄	475
+疙	474
+鹉	474
+邴	473
+怖	473
+贠	472
+旎	471
+戌	471
+翥	470
+鳅	468
+拎	468
+蚬	468
+囤	468
+陋	467
+镕	466
+粵	466
+葑	464
+藜	463
+羁	463
+蹇	462
+箩	461
+鳝	460
+劭	460
+挝	459
+崭	458
+掷	457
+喘	456
+瘩	454
+拙	453
+煅	453
+肼	452
+昼	451
+辋	451
+颊	450
+砲	449
+粕	449
+颞	448
+驴	446
+睾	446
+璀	446
+髙	446
+滥	445
+迩	445
+倬	445
+堎	444
+涑	443
+镛	440
+褒	440
+笨	439
+邨	438
+砬	438
+诣	435
+铯	433
+訾	431
+滟	431
+岀	429
+暾	429
+鲈	429
+蛳	429
+撇	429
+珮	425
+蔻	425
+笕	425
+礐	424
+幺	424
+铟	422
+鹚	422
+砥	422
+蜻	421
+菘	421
+昉	419
+橼	418
+荚	418
+蓖	417
+堇	415
+粽	415
+郗	415
+蛤	412
+棪	411
+庹	410
+丑	410
+铉	410
+茧	410
+麋	409
+硇	408
+毋	408
+颠	407
+赌	407
+雩	406
+晧	405
+鹍	405
+蟆	404
+菀	404
+殴	403
+汭	402
+剃	401
+驯	401
+峯	401
+铌	401
+嫱	399
+哔	398
+绊	398
+逵	397
+铐	397
+搐	397
+罍	396
+盅	395
+熬	395
+炘	395
+袂	393
+蹦	393
+莪	393
+仵	392
+龛	392
+楂	391
+扮	390
+蟒	390
+氘	390
+鎏	389
+稜	388
+韫	387
+槌	386
+篢	386
+郇	386
+瑢	382
+啮	382
+瀼	382
+辟	381
+噁	381
+徇	380
+孛	380
+掀	379
+瑭	379
+糟	378
+濡	377
+舂	377
+棟	377
+镫	376
+痔	375
+叽	373
+怿	373
+矣	373
+漖	373
+惺	372
+痤	372
+绽	371
+裝	371
+氿	370
+坌	370
+甽	370
+悍	369
+摒	369
+豌	368
+绢	368
+聃	367
+學	367
+鄣	366
+猷	366
+粳	365
+砣	363
+夸	363
+藿	361
+祐	361
+嫂	360
+戍	360
+蜱	360
+侏	360
+碓	359
+卑	358
+犊	358
+岽	356
+茚	356
+癸	355
+硷	354
+镟	353
+埌	353
+栀	352
+電	351
+嫚	350
+庠	350
+烺	350
+飙	349
+珣	349
+悲	348
+傢	348
+蒽	347
+樨	347
+陲	346
+嘧	346
+疽	346
+桧	344
+郅	342
+吿	341
+魂	340
+钇	340
+渱	340
+憾	339
+鳍	339
+黍	338
+仗	338
+肴	337
+镲	336
+忞	335
+诰	334
+锲	333
+涩	333
+喱	333
+袄	332
+邈	329
+椹	328
+眺	328
+橦	328
+怪	327
+磙	326
+泃	325
+銶	324
+洧	323
+蕨	322
+價	321
+郄	321
+鲫	321
+厥	320
+遐	320
+跋	320
+舀	320
+嬉	319
+挨	318
+轸	318
+酞	317
+琯	317
+宥	317
+昏	315
+浄	315
+洄	314
+汫	314
+堠	314
+腮	313
+艰	312
+窊	312
+诘	312
+钫	311
+涢	309
+禀	309
+戟	309
+挎	309
+捍	307
+疡	307
+淙	307
+蚣	307
+哮	307
+铥	307
+苋	306
+麗	305
+遒	305
+蓁	304
+紊	303
+呱	302
+焯	299
+鹞	299
+钯	299
+囡	298
+骡	298
+铋	297
+卅	297
+埒	296
+徵	296
+嵝	295
+嘟	295
+睫	295
+爻	294
+捺	294
+骝	294
+骈	293
+螯	292
+赓	292
+锃	292
+恼	292
+瘢	291
+嫘	291
+裳	291
+岣	291
+缚	291
+轰	290
+嫒	289
+蜓	289
+磜	289
+籁	288
+哌	288
+芘	288
+蕰	288
+寐	287
+葩	287
+扦	285
+財	285
+鲘	283
+蝗	283
+玎	283
+钶	282
+蔼	282
+坷	282
+洎	281
+啫	281
+茯	280
+粼	280
+贱	279
+楮	277
+煨	277
+僚	277
+渼	277
+荄	276
+窿	276
+馅	274
+東	273
+栟	273
+飓	273
+痧	273
+虒	271
+渥	271
+遨	271
+抒	270
+劢	269
+椤	269
+炅	269
+汈	268
+畛	266
+隼	266
+娆	266
+羹	265
+涕	265
+姊	265
+蒌	265
+槭	264
+璘	264
+機	264
+腓	264
+脯	264
+驩	263
+匮	263
+妞	263
+岈	262
+榻	262
+灈	261
+栌	260
+惑	260
+虓	259
+妖	258
+螟	258
+浛	258
+簕	258
+牤	257
+鹫	257
+鱿	257
+砭	257
+凋	256
+珐	255
+锘	255
+诒	255
+洈	254
+牺	254
+谍	254
+飏	254
+楸	254
+龋	253
+浬	252
+疣	251
+磻	251
+祟	251
+柅	251
+偌	250
+堯	249
+桀	249
+夭	248
+玠	248
+噢	247
+柽	246
+馗	246
+宓	245
+嵖	245
+浃	245
+請	244
+規	244
+钹	243
+幔	243
+増	242
+驸	242
+郚	241
+莅	241
+谆	241
+萬	241
+謇	241
+蔄	240
+茴	240
+翮	239
+渴	238
+崾	238
+铑	237
+剜	237
+阖	236
+焗	236
+罔	235
+塄	235
+疟	235
+叹	234
+铤	234
+報	233
+億	232
+蚤	232
+竑	231
+琎	231
+揿	230
+孱	230
+龍	230
+轭	230
+瑗	230
+琬	230
+廠	230
+谕	229
+酊	228
+佚	227
+梆	227
+逛	227
+暧	227
+塝	226
+耻	226
+湔	226
+昫	226
+镝	225
+顼	225
+劫	225
+鹂	224
+獐	224
+嫄	224
+陨	223
+蒯	223
+绗	223
+揣	223
+甦	223
+蕃	222
+蘸	222
+挫	222
+俎	221
+蹊	220
+螭	220
+牍	220
+葺	219
+虏	219
+廻	219
+榧	219
+廍	218
+瓒	218
+荏	218
+翕	217
+醪	217
+硌	217
+骢	217
+霈	217
+骧	217
+弶	216
+坔	216
+俶	216
+場	216
+哒	215
+扪	214
+鲷	213
+墁	213
+碉	213
+炙	213
+桕	213
+黉	213
+堀	212
+沺	212
+珥	211
+簪	211
+爨	211
+噜	211
+巳	211
+芪	211
+湉	210
+萼	210
+蜊	210
+塆	210
+獭	209
+澔	207
+锵	207
+榀	207
+梽	207
+弢	206
+圬	206
+痱	206
+迄	205
+厄	205
+坵	205
+髻	204
+蚜	204
+绀	203
+叄	202
+峭	202
+錾	202
+椑	202
+妩	201
+萁	201
+腭	200
+椽	200
+咚	200
+啬	200
+瑁	199
+垲	199
+胍	199
+胛	199
+袢	198
+璎	197
+孳	197
+蜈	197
+泔	196
+筎	196
+坼	196
+痼	195
+譞	195
+寡	194
+佲	194
+悖	194
+撷	193
+滍	193
+肟	193
+髌	191
+剅	191
+诠	191
+痣	191
+惹	191
+瞎	190
+湓	189
+岕	189
+聖	189
+杵	189
+珪	189
+輋	188
+崞	188
+苌	188
+祀	188
+芫	188
+泱	188
+義	188
+枡	187
+瘴	187
+迴	187
+铕	187
+乖	186
+湴	186
+捶	186
+篙	186
+忪	185
+骂	185
+躲	185
+倞	185
+屺	185
+垤	184
+惧	184
+邙	184
+冥	184
+俚	184
+氚	183
+鄚	183
+赊	183
+杓	183
+瓿	183
+囯	182
+麂	182
+躁	181
+镨	181
+搂	180
+躬	180
+仉	180
+質	180
+铊	179
+埫	178
+祸	177
+芾	177
+玢	177
+娑	177
+泯	176
+辫	176
+秃	176
+汌	175
+辔	175
+痹	175
+镦	175
+崯	175
+昨	175
+氾	174
+晩	174
+悼	174
+玟	174
+琍	174
+鲟	174
+旴	173
+吖	173
+烝	173
+箴	172
+烔	172
+岿	172
+笊	172
+掠	171
+垈	171
+竤	171
+炑	171
+讴	171
+蛔	170
+酋	170
+備	170
+佺	170
+恂	169
+呜	169
+琙	169
+邃	169
+僻	168
+漋	168
+殳	168
+虱	168
+禤	167
+項	167
+庇	167
+蓤	167
+棹	167
+測	167
+泫	167
+彗	166
+曈	166
+鄌	166
+珹	165
+舲	165
+昪	165
+鹑	165
+蜚	165
+裆	164
+矽	164
+咔	163
+屲	163
+嚼	163
+眭	163
+標	162
+瑷	162
+嵯	162
+焌	162
+箦	162
+佧	162
+鹧	162
+秽	161
+鳊	161
+潴	161
+汩	161
+粲	160
+灜	160
+龑	160
+桲	160
+铒	159
+碲	159
+歺	158
+墉	158
+呗	157
+現	157
+哩	157
+懈	157
+埜	157
+澉	156
+鹌	156
+眶	156
+臺	156
+铳	155
+垧	155
+尓	155
+廛	155
+鼐	155
+筻	155
+呙	154
+溦	154
+罢	154
+浭	154
+阪	154
+單	153
+倭	153
+貂	153
+疯	152
+辘	152
+祊	152
+她	151
+枳	151
+舾	151
+蜥	151
+竜	151
+時	150
+鸪	150
+玳	150
+筲	149
+歹	149
+碇	149
+撼	149
+嘡	149
+胧	148
+莳	148
+雳	148
+蒹	148
+恽	148
+峣	148
+珽	147
+凛	147
+杲	147
+壑	147
+吩	147
+凃	146
+動	146
+萸	146
+鲊	146
+娓	146
+绯	146
+傻	146
+汜	146
+萩	146
+麝	145
+镪	145
+憧	145
+迂	145
+塭	145
+岂	145
+戢	145
+趁	144
+莊	144
+浧	144
+缷	143
+壓	143
+赑	143
+進	143
+噬	143
+勍	143
+吼	142
+鳃	142
+蜍	142
+哦	142
+椴	142
+為	142
+鹮	141
+璴	141
+燮	141
+鳗	141
+呤	140
+苡	140
+徙	140
+荭	140
+缑	140
+涮	139
+發	138
+谧	138
+僰	138
+毳	138
+郪	138
+憎	138
+潓	137
+塾	137
+玹	137
+屛	137
+锬	137
+铡	136
+舣	136
+镣	136
+吁	136
+辈	136
+崚	136
+缗	136
+羞	136
+荘	136
+瘾	135
+堍	135
+囿	135
+脒	135
+呀	135
+嬿	135
+漈	135
+焖	135
+褔	134
+甾	134
+嶝	134
+苎	134
+楝	134
+皤	134
+哭	133
+隈	133
+娈	133
+镏	133
+貳	133
+俣	133
+麸	133
+琇	133
+崄	132
+仃	132
+粦	132
+湲	132
+吵	132
+垾	132
+馍	131
+吝	131
+藓	131
+冚	131
+杈	131
+雎	131
+镙	131
+镌	131
+喵	131
+幂	130
+頻	130
+爹	130
+娶	130
+镯	130
+蛉	130
+趴	130
+鲶	130
+倮	129
+蚯	129
+蝎	129
+颡	129
+榷	129
+缦	129
+撂	129
+痴	128
+斫	128
+谜	128
+诃	127
+酗	127
+捅	127
+贬	127
+統	127
+錱	126
+缥	126
+诫	126
+蚓	126
+啰	126
+楦	126
+強	125
+沓	125
+鲵	125
+辗	125
+铈	125
+潔	125
+岖	125
+铷	125
+稂	125
+鳖	124
+惢	124
+哆	124
+蒺	123
+吏	123
+澛	123
+鮓	123
+腘	123
+瞪	122
+辱	122
+傩	122
+擒	122
+绫	122
+倴	122
+硃	122
+轱	122
+嘶	121
+蛎	121
+赳	121
+孖	121
+毎	121
+椐	121
+鹁	121
+兀	120
+擘	120
+扛	120
+數	120
+維	120
+橫	119
+桄	119
+鋼	119
+姮	119
+復	119
+鑑	119
+櫈	118
+琟	118
+翩	118
+鲆	118
+豇	118
+凎	117
+膊	117
+髯	117
+軸	117
+悯	117
+歩	116
+仨	116
+煋	116
+甯	116
+溁	116
+哉	116
+坮	116
+嘈	115
+鲖	115
+稱	115
+坣	115
+沘	115
+甑	114
+痂	113
+艉	113
+娲	113
+赜	113
+頭	113
+癜	113
+偕	112
+弁	112
+胳	111
+谞	111
+翚	111
+恵	111
+鲹	111
+冮	111
+圐	110
+資	110
+嵴	110
+谄	110
+屡	110
+帏	109
+赪	109
+垩	109
+桫	109
+弩	109
+奘	109
+倜	108
+猝	108
+巉	108
+谬	108
+圙	108
+彐	108
+鸰	107
+眨	107
+墚	107
+俨	107
+褀	107
+跪	107
+袤	107
+楒	107
+蜒	107
+浞	106
+匯	106
+睐	106
+酂	106
+噗	106
+茱	106
+嶺	106
+蚶	106
+繆	106
+郐	106
+腑	106
+剌	105
+骦	105
+帶	105
+浤	105
+屎	105
+钭	105
+黃	105
+坜	105
+幄	104
+弸	104
+匈	104
+僮	104
+環	103
+逹	103
+垯	103
+鈺	103
+拈	102
+虛	102
+蜿	102
+膘	101
+漹	101
+饿	101
+痢	101
+蜇	101
+晙	101
+乜	101
+郞	101
+鹳	101
+浡	101
+幛	101
+螃	100
+屾	100
+涎	100
+匆	100
+無	99
+峧	99
+咛	99
+別	99
+蛹	99
+荼	99
+蚨	99
+洇	99
+湜	99
+務	99
+礤	98
+瑆	98
+挞	98
+線	98
+瑅	98
+劦	98
+贶	97
+爿	97
+淸	97
+渺	97
+晅	97
+紙	97
+囵	97
+國	97
+饯	97
+芎	96
+翃	96
+姁	96
+囫	96
+畦	96
+溫	96
+婳	96
+猩	96
+阗	95
+崽	95
+誌	95
+礴	95
+蚴	94
+氣	94
+燏	94
+弇	94
+砵	93
+蕤	93
+崑	93
+斟	93
+犋	93
+镑	92
+芡	92
+闩	92
+區	92
+溟	92
+杧	92
+檑	91
+贛	91
+唁	91
+悄	91
+墕	91
+赃	91
+嶙	91
+迢	90
+蛸	90
+胙	90
+篪	90
+潏	90
+桤	89
+霰	89
+艏	89
+坋	89
+巯	89
+燈	89
+慨	88
+黒	88
+瑝	88
+筵	88
+阄	88
+稅	88
+際	88
+姨	88
+採	88
+葶	88
+嘌	88
+胄	88
+涒	88
+夙	88
+啭	87
+觐	87
+堕	87
+倢	87
+傑	87
+砰	87
+寂	87
+蘋	87
+幵	87
+窘	86
+儲	86
+穰	86
+蘅	86
+經	86
+俘	86
+給	86
+翦	86
+塚	86
+晤	85
+聍	85
+矯	85
+膠	85
+皕	85
+罾	85
+藴	85
+運	85
+耵	84
+鲛	84
+翾	84
+氪	84
+跻	84
+醌	84
+赎	84
+磡	84
+钚	84
+狩	84
+珵	84
+稗	84
+鸶	83
+妺	83
+熺	83
+铪	83
+蝠	83
+個	83
+奡	83
+皙	82
+迓	82
+妲	82
+蠊	82
+頌	82
+車	82
+載	82
+氹	82
+啥	82
+蹭	82
+跸	82
+畬	81
+輸	81
+跖	81
+佀	81
+蓢	80
+枥	80
+皞	80
+馄	80
+滃	80
+瑧	80
+烊	80
+桴	80
+篾	80
+晌	80
+鱻	80
+彥	80
+伲	80
+灡	80
+墊	79
+耍	79
+舢	79
+帯	79
+饨	79
+榃	79
+贽	79
+颏	79
+锜	79
+蟥	78
+瘀	78
+朳	78
+蛭	78
+祗	78
+華	78
+蝙	78
+辂	78
+搽	78
+浥	78
+觀	77
+辇	77
+罹	77
+镬	77
+亊	77
+魄	76
+镠	76
+炤	76
+羰	76
+贼	76
+噸	76
+琻	76
+涴	76
+诤	76
+嗄	76
+铚	75
+诩	75
+缕	75
+橛	75
+閥	75
+巜	75
+韻	75
+妫	74
+檗	74
+鳜	74
+奀	74
+玙	74
+屁	74
+畎	74
+淫	74
+弭	73
+昮	73
+嚣	73
+滧	73
+雙	73
+荇	73
+書	73
+轵	73
+順	73
+蓋	72
+鞲	72
+彷	72
+腧	72
+浰	72
+恙	72
+豊	72
+鞅	72
+嘿	72
+鞴	71
+糍	71
+涸	71
+挣	71
+掰	71
+焮	71
+鎰	71
+吒	71
+妪	71
+長	71
+瘪	71
+橹	71
+钍	71
+揆	71
+袆	70
+莜	70
+岞	70
+勖	70
+園	70
+滓	70
+詠	70
+脿	69
+璁	69
+扆	69
+熳	69
+咋	69
+仞	69
+侮	68
+蕗	68
+奧	68
+璩	68
+昳	68
+佽	68
+須	68
+霭	68
+湑	68
+缜	67
+暇	67
+鋐	67
+潽	67
+飨	67
+侥	67
+栲	67
+肓	67
+啃	66
+俠	66
+鞣	66
+烆	66
+菟	66
+設	66
+翙	66
+淓	66
+蘖	66
+惇	66
+袱	66
+剿	66
+埼	65
+窈	65
+赚	65
+欹	65
+恣	65
+呦	65
+绦	65
+暘	65
+戥	65
+杼	64
+間	64
+咇	64
+圹	64
+缫	64
+閤	64
+眀	64
+哙	64
+捎	64
+蛆	64
+殓	63
+蜃	63
+關	63
+柁	63
+锢	63
+饥	63
+廒	63
+枰	63
+迥	63
+怜	63
+碼	63
+搋	63
+锞	62
+逮	62
+滈	62
+鸵	62
+岧	62
+茼	62
+茏	62
+湕	62
+換	62
+級	62
+霅	61
+衠	61
+厩	61
+條	61
+筆	61
+嗮	61
+轼	61
+證	61
+墈	61
+缄	61
+诀	61
+撩	61
+囟	61
+俵	61
+舔	61
+圏	61
+岌	60
+凶	60
+瀂	60
+椟	60
+堉	60
+対	60
+佴	60
+挹	60
+體	60
+睟	60
+哃	59
+岵	59
+臬	59
+盤	59
+熀	59
+掐	59
+購	59
+佾	59
+業	59
+廪	59
+製	58
+錧	58
+祾	58
+刈	58
+葚	58
+酝	58
+钋	58
+廨	58
+犸	58
+胴	58
+肜	57
+抟	57
+蔫	57
+悌	57
+膑	57
+儀	57
+記	57
+緑	57
+骸	57
+旃	56
+堼	56
+棆	56
+玏	56
+缶	56
+溋	56
+俑	56
+蚪	56
+茔	56
+栝	56
+鳕	56
+熱	56
+蓆	56
+銘	55
+淩	55
+闱	55
+衩	55
+苘	55
+溏	55
+煕	55
+畿	55
+檢	55
+朸	55
+氓	55
+愣	54
+亐	54
+兩	54
+镡	54
+硊	54
+匪	54
+荊	54
+漭	54
+後	54
+簰	54
+蔸	54
+掛	54
+暐	54
+喋	54
+鸷	54
+苖	54
+舁	54
+睁	54
+枨	53
+傳	53
+猬	53
+柸	53
+眯	53
+埤	53
+蛏	53
+鮋	53
+燿	53
+錶	53
+倉	53
+阇	52
+缵	52
+險	52
+喽	52
+侑	52
+翬	52
+窍	52
+颋	52
+罂	52
+纻	52
+酣	52
+礅	52
+攒	52
+苣	52
+烶	51
+猿	51
+繫	51
+冋	51
+圌	51
+炟	51
+鎮	51
+钆	51
+墻	51
+嘻	51
+蒡	51
+陞	51
+锺	50
+葸	50
+遁	50
+寀	50
+鸫	50
+剐	50
+滿	50
+荍	50
+衿	50
+狙	50
+鲩	50
+啼	50
+飛	49
+蝌	49
+槲	49
+開	49
+監	49
+鲂	49
+珰	49
+暹	49
+荑	49
+磑	49
+汆	49
+風	49
+煞	49
+烩	49
+韡	49
+梱	49
+缬	49
+岠	49
+纰	48
+坬	48
+檔	48
+峘	48
+帙	48
+缌	48
+胗	48
+睹	48
+掣	48
+摞	48
+衖	48
+俾	48
+瑯	48
+鲳	48
+乂	48
+噴	47
+組	47
+镎	47
+锔	47
+郵	47
+饴	47
+試	47
+旮	47
+耩	47
+罄	46
+襻	46
+嘹	46
+蓑	46
+淜	46
+莛	46
+戗	46
+逑	46
+鄃	46
+逞	46
+锎	46
+鉻	46
+蜕	46
+鳟	46
+洨	46
+樂	46
+酢	46
+姹	46
+垇	45
+蔴	45
+實	45
+繇	45
+鹛	45
+瑨	45
+笈	45
+寳	45
+谴	45
+曩	45
+敝	45
+锏	45
+怨	45
+編	45
+摁	44
+叡	44
+秫	44
+肄	44
+狠	44
+壅	44
+牂	44
+濾	44
+郤	44
+伉	44
+骰	44
+闺	44
+惬	44
+霹	44
+萦	44
+蜞	44
+鲴	44
+牁	44
+婀	44
+鲌	44
+靜	44
+圓	44
+則	43
+殪	43
+澂	43
+莠	43
+薹	43
+愫	43
+甡	43
+锕	43
+萋	43
+荦	43
+筘	43
+鼋	43
+計	43
+侕	43
+潩	43
+忐	43
+哎	43
+俅	43
+珎	43
+堨	43
+蚧	43
+铦	42
+虅	42
+蛰	42
+桎	42
+敔	42
+檵	42
+細	42
+喾	42
+臵	42
+樯	42
+膺	42
+將	42
+門	42
+哓	42
+槠	42
+洢	42
+惨	42
+渉	42
+貿	42
+珖	42
+糞	41
+枷	41
+荠	41
+嗒	41
+庥	41
+铙	41
+芶	41
+孽	41
+腙	41
+莨	41
+肈	41
+啜	41
+劑	41
+鲽	41
+朏	41
+鲃	41
+棧	41
+镥	41
+菽	41
+陝	40
+蠹	40
+鋁	40
+铔	40
+變	40
+慌	40
+録	40
+僖	40
+逝	40
+踵	40
+寬	40
+粜	40
+媲	40
+揪	40
+唢	40
+逅	40
+澞	39
+醍	39
+愛	39
+側	39
+冽	39
+槚	39
+葉	39
+伾	39
+慜	39
+袅	39
+忤	39
+悫	39
+嶍	39
+抺	39
+傧	39
+祤	39
+澌	39
+圴	39
+昴	39
+灋	39
+楻	39
+袪	39
+岡	39
+苊	39
+慑	39
+纛	39
+儆	39
+瓘	39
+喙	39
+梪	39
+瑱	39
+亁	38
+圖	38
+導	38
+昡	38
+淂	38
+侉	38
+拮	38
+蓠	38
+韮	38
+潲	38
+許	38
+晷	38
+護	38
+坽	38
+荨	38
+単	38
+甏	38
+苾	38
+丅	38
+俢	38
+悅	38
+赅	38
+貨	38
+匏	38
+蹼	38
+曁	37
+飬	37
+赡	37
+筌	37
+鏽	37
+剽	37
+钪	37
+秾	37
+迸	37
+嘀	37
+樓	37
+仄	37
+敉	37
+恻	37
+镢	37
+叱	37
+婓	37
+玗	37
+砒	37
+辍	37
+昄	36
+恨	36
+谙	36
+嘣	36
+煽	36
+犏	36
+榬	36
+嘏	36
+薤	36
+竦	36
+獾	36
+徑	36
+疌	36
+嗡	36
+話	36
+跺	36
+杳	36
+陛	35
+艭	35
+稣	35
+鴻	35
+胂	35
+岺	35
+皈	35
+對	35
+饸	35
+栊	35
+垆	35
+芴	35
+埙	35
+枉	35
+菪	35
+戽	35
+剀	35
+叟	35
+塊	35
+凱	35
+煖	35
+瞧	35
+鲀	34
+熤	34
+納	34
+過	34
+畝	34
+簖	34
+锠	34
+沆	34
+穂	34
+竽	34
+塨	34
+俫	34
+磏	34
+癞	34
+麾	34
+棤	34
+嗦	34
+诂	34
+荛	34
+應	34
+赧	34
+猁	34
+猞	34
+秝	34
+姺	34
+垞	33
+诶	33
+騰	33
+骛	33
+匍	33
+傥	33
+禇	33
+芈	33
+窎	33
+迮	33
+愷	33
+仂	33
+紅	33
+猄	33
+愽	33
+丼	33
+頫	33
+蕖	32
+霡	32
+鳯	32
+鐵	32
+鬲	32
+劬	32
+貮	32
+確	32
+诧	32
+點	32
+瞌	32
+屬	32
+昦	32
+羑	32
+滙	32
+厷	32
+冑	32
+卮	32
+尙	32
+辦	31
+爰	31
+呛	31
+嶕	31
+庫	31
+竝	31
+钌	31
+潥	31
+鋒	31
+逦	31
+軌	31
+離	31
+虻	31
+艿	31
+遄	31
+視	31
+處	31
+興	31
+轳	31
+調	31
+蚺	31
+俍	31
+貝	30
+堔	30
+鵾	30
+詳	30
+笥	30
+囍	30
+靡	30
+泣	30
+鸹	30
+谵	30
+鬓	30
+顔	30
+瘙	30
+張	30
+僅	30
+湙	30
+嗯	30
+昧	30
+埯	30
+簌	30
+惫	30
+苝	30
+菔	29
+髭	29
+曽	29
+灃	29
+馋	29
+弾	29
+類	29
+愤	29
+嚏	29
+銲	29
+売	29
+鞑	29
+窕	29
+楗	29
+倦	29
+峋	29
+暻	29
+谚	29
+燧	29
+榮	29
+轾	29
+骟	29
+捭	29
+遊	29
+蕻	29
+鯵	29
+奤	29
+耷	29
+媞	29
+農	29
+攝	29
+萂	29
+議	29
+骺	29
+甁	29
+绺	28
+軟	28
+喏	28
+搀	28
+咐	28
+腴	28
+栳	28
+嬛	28
+虐	28
+凊	28
+釡	28
+偻	28
+桖	28
+拗	28
+茑	28
+矜	28
+枊	28
+費	28
+吮	28
+苁	28
+呻	28
+畖	28
+唧	28
+總	28
+哀	28
+逖	27
+噤	27
+祼	27
+吱	27
+佈	27
+幹	27
+菓	27
+扥	27
+爾	27
+庒	27
+阝	27
+芰	27
+摧	27
+玕	27
+誊	27
+嚎	27
+掬	27
+禛	27
+玘	27
+拄	27
+槊	27
+連	27
+侓	27
+淨	27
+锖	27
+汘	27
+闼	27
+禚	27
+煺	27
+參	27
+苲	27
+蟛	27
+釘	27
+邽	26
+鲑	26
+負	26
+徼	26
+羯	26
+咫	26
+碡	26
+驗	26
+抡	26
+優	26
+伢	26
+搻	26
+耱	26
+彈	26
+撖	26
+蝰	26
+尭	26
+鲒	26
+洚	26
+翯	26
+憶	26
+術	26
+壇	26
+痨	26
+罟	26
+鲎	26
+濎	26
+哼	26
+菴	26
+塥	26
+滗	26
+祢	26
+笫	25
+繪	25
+藐	25
+絲	25
+蓦	25
+幌	25
+磹	25
+椋	25
+瓠	25
+詢	25
+嫡	25
+擢	25
+佞	25
+缰	25
+玷	25
+酇	25
+猊	25
+跛	25
+蚩	25
+卟	25
+奸	25
+耈	25
+笸	25
+懃	25
+孑	25
+镈	25
+厮	24
+庑	24
+藍	24
+丠	24
+艽	24
+幡	24
+廣	24
+菻	24
+椪	24
+柵	24
+媖	24
+鲮	24
+綠	24
+棂	24
+愧	24
+縮	24
+伋	24
+槃	24
+埉	24
+牒	24
+荽	24
+邠	24
+纭	24
+骠	24
+桿	24
+晢	24
+忏	24
+湮	24
+約	24
+遆	24
+甍	24
+柰	24
+碈	24
+奄	23
+終	23
+庖	23
+憋	23
+遼	23
+悸	23
+谒	23
+邊	23
+稹	23
+氵	23
+鏖	23
+糸	23
+笮	23
+畯	23
+觃	23
+洌	23
+襞	23
+宮	23
+赝	23
+潖	23
+炆	23
+額	23
+崐	23
+裢	23
+栆	23
+結	23
+圧	23
+沬	23
+玚	23
+泇	23
+嗥	22
+荸	22
+狒	22
+奭	22
+團	22
+跬	22
+鹣	22
+匐	22
+貉	22
+紹	22
+昃	22
+皝	22
+濫	22
+棻	22
+鍍	22
+楫	22
+诜	22
+專	22
+見	22
+茘	22
+诡	22
+樹	22
+哂	22
+裡	22
+蝮	22
+殇	22
+硗	22
+爃	22
+垻	22
+噉	22
+妄	22
+陣	22
+蔑	22
+叛	22
+齡	22
+嗖	22
+啵	22
+尬	22
+驫	22
+鲡	21
+讳	21
+柃	21
+鮠	21
+卲	21
+紋	21
+薜	21
+薷	21
+荖	21
+臾	21
+飲	21
+颙	21
+瓤	21
+銅	21
+圍	21
+崙	21
+镅	21
+員	21
+衎	21
+昰	21
+掲	21
+繞	21
+邂	21
+溎	21
+洳	21
+毙	21
+匕	21
+廈	21
+尴	21
+準	21
+収	21
+荩	21
+锪	21
+構	21
+賨	21
+纏	20
+鏡	20
+鲉	20
+乪	20
+裥	20
+顯	20
+達	20
+痿	20
+颓	20
+娼	20
+滾	20
+镳	20
+吳	20
+娙	20
+钐	20
+摺	20
+変	20
+僡	20
+咩	20
+塗	20
+菰	20
+藳	20
+舥	20
+嶲	20
+琲	20
+騄	20
+瓏	20
+酽	20
+俺	20
+枘	20
+戤	20
+茺	20
+銹	20
+氺	20
+滮	20
+嗞	20
+蚱	20
+褡	20
+竔	20
+祇	20
+唆	20
+偱	20
+艚	20
+俆	20
+棬	20
+叻	20
+屴	20
+芐	19
+蝽	19
+鳎	19
+膻	19
+颧	19
+佢	19
+艹	19
+咘	19
+鹓	19
+琀	19
+奿	19
+锽	19
+遺	19
+廢	19
+婼	19
+哟	19
+気	19
+埮	19
+銜	19
+倧	19
+頠	19
+帱	19
+琠	19
+鴒	19
+轫	19
+蟀	19
+與	19
+辄	19
+蛄	19
+歼	19
+儇	19
+烎	19
+磉	19
+愍	19
+陽	19
+蟋	19
+壸	18
+斷	18
+鍪	18
+幷	18
+跗	18
+嗑	18
+蹑	18
+埸	18
+谗	18
+樗	18
+種	18
+徨	18
+釰	18
+鯤	18
+盺	18
+杮	18
+廋	18
+崁	18
+拋	18
+錂	18
+铽	18
+兒	18
+瘸	18
+鼔	18
+棽	18
+姒	18
+決	18
+箸	18
+迀	18
+渰	18
+婶	18
+鏠	18
+岦	18
+丿	18
+訇	18
+迺	18
+蛊	18
+疚	18
+溝	18
+撸	18
+侈	18
+诲	18
+垕	18
+籣	18
+棰	18
+笳	18
+啓	18
+靬	18
+陔	17
+洴	17
+頂	17
+枼	17
+绾	17
+塢	17
+鹢	17
+蛐	17
+茳	17
+旄	17
+钘	17
+揺	17
+貟	17
+趄	17
+畓	17
+鎖	17
+沒	17
+矬	17
+瑸	17
+卾	17
+趙	17
+澫	17
+饹	17
+讶	17
+澐	17
+蛑	17
+锱	17
+怛	17
+伈	17
+糅	17
+鉄	17
+衕	17
+勝	17
+責	17
+夽	17
+蓸	17
+満	17
+耔	17
+蠖	17
+皛	17
+產	17
+溞	17
+祙	16
+暫	16
+諾	16
+苠	16
+鍵	16
+倔	16
+喔	16
+晥	16
+糁	16
+踌	16
+呇	16
+疁	16
+巣	16
+聩	16
+铢	16
+洰	16
+臃	16
+鎓	16
+歐	16
+瞾	16
+遛	16
+鉓	16
+酡	16
+橈	16
+钖	16
+呂	16
+悙	16
+骕	16
+樣	16
+鈜	16
+溵	16
+棁	16
+繕	16
+玓	16
+搔	16
+姌	16
+絡	16
+丐	16
+绉	16
+皑	16
+鉏	16
+獒	16
+說	16
+玭	16
+卣	15
+燔	15
+衮	15
+砩	15
+繘	15
+璛	15
+逶	15
+哝	15
+痊	15
+鄩	15
+噌	15
+靑	15
+鈉	15
+圜	15
+輪	15
+秕	15
+鉤	15
+婍	15
+疖	15
+鈦	15
+窩	15
+飖	15
+範	15
+堿	15
+泅	15
+饷	15
+冄	15
+問	15
+墡	15
+刂	15
+塵	15
+啷	15
+绨	15
+抉	15
+錦	15
+墺	15
+硍	15
+祧	15
+嗲	15
+豳	15
+溚	15
+朊	15
+寛	15
+玧	15
+蘇	15
+柢	15
+鮑	15
+傎	15
+蒨	15
+牮	15
+碹	15
+況	15
+欄	15
+锛	15
+刖	15
+偉	15
+谠	15
+揚	15
+荗	15
+攜	14
+轉	14
+镘	14
+澪	14
+蝈	14
+鄀	14
+緡	14
+稆	14
+氽	14
+牋	14
+篏	14
+詩	14
+硂	14
+铗	14
+枱	14
+叨	14
+嘤	14
+侖	14
+礽	14
+舖	14
+罴	14
+閉	14
+埊	14
+喈	14
+烬	14
+舅	14
+梃	14
+寶	14
+廬	14
+胯	14
+讬	14
+箜	14
+筸	14
+麿	14
+節	14
+蓊	14
+蕈	14
+浵	14
+蹴	14
+骔	14
+嵥	14
+講	14
+搧	14
+呃	14
+畫	14
+烑	14
+勀	14
+養	14
+餘	14
+審	14
+乸	14
+婿	14
+犟	14
+抿	13
+滉	13
+襁	13
+課	13
+佝	13
+篼	13
+帀	13
+貊	13
+狨	13
+枓	13
+啾	13
+罝	13
+栐	13
+妟	13
+曉	13
+渃	13
+禮	13
+淵	13
+鏈	13
+倌	13
+蕞	13
+恍	13
+袒	13
+咤	13
+圉	13
+軍	13
+砕	13
+狡	13
+跞	13
+砗	13
+堙	13
+萏	13
+钅	13
+夾	13
+裾	13
+硿	13
+瀹	13
+暠	13
+隩	13
+閣	13
+蟲	13
+埴	13
+缐	13
+嵄	13
+潾	13
+雜	13
+埏	13
+汹	13
+甙	13
+曵	13
+坉	13
+掮	13
+痈	13
+沵	13
+璿	13
+寔	13
+槜	13
+捩	13
+鲚	13
+嶶	13
+妘	13
+徴	13
+巻	13
+鉵	13
+铩	13
+薸	12
+夠	12
+弨	12
+瑔	12
+臊	12
+呖	12
+剎	12
+縫	12
+锒	12
+紐	12
+朩	12
+泜	12
+漴	12
+毐	12
+謝	12
+沋	12
+咭	12
+嚗	12
+枵	12
+籲	12
+枒	12
+叼	12
+栯	12
+躜	12
+櫻	12
+坧	12
+肫	12
+鶴	12
+玆	12
+澶	12
+仠	12
+蹻	12
+筢	12
+柝	12
+嘜	12
+簡	12
+碜	12
+硏	12
+剋	12
+俛	12
+酔	12
+飔	12
+乢	12
+渟	12
+伣	12
+頁	12
+讪	12
+惶	12
+偞	12
+稥	12
+坶	12
+歅	12
+芛	12
+係	12
+針	12
+沖	12
+厡	12
+嵕	12
+鉗	12
+倏	12
+霑	12
+瀞	12
+熖	12
+嗝	12
+鋅	12
+缯	12
+恃	12
+襦	12
+忒	12
+狍	12
+怦	12
+註	12
+腳	11
+妾	11
+銀	11
+顆	11
+淺	11
+佂	11
+菥	11
+唏	11
+簋	11
+壵	11
+澺	11
+楪	11
+臨	11
+圯	11
+讀	11
+緊	11
+滐	11
+骱	11
+炷	11
+偰	11
+扡	11
+寫	11
+陸	11
+澤	11
+觸	11
+燫	11
+廯	11
+郉	11
+碥	11
+轺	11
+鹼	11
+綜	11
+涳	11
+橢	11
+粿	11
+筀	11
+殉	11
+狀	11
+嚞	11
+減	11
+氶	11
+埲	11
+掊	11
+襯	11
+黠	11
+啁	11
+絢	11
+藠	11
+耨	11
+極	11
+筫	11
+嚓	11
+躇	11
+葙	11
+葏	11
+殘	11
+麇	11
+嶪	11
+嗵	11
+銷	11
+馚	11
+瀮	11
+蛲	11
+篝	11
+湭	11
+捂	10
+橧	10
+鄙	10
+栜	10
+蔣	10
+渂	10
+來	10
+顏	10
+葜	10
+汣	10
+箥	10
+嘢	10
+峛	10
+漤	10
+槺	10
+蓣	10
+題	10
+纮	10
+扞	10
+胼	10
+玶	10
+叵	10
+讽	10
+耄	10
+褓	10
+猖	10
+瀔	10
+氤	10
+暒	10
+崦	10
+捋	10
+诛	10
+菾	10
+譜	10
+盍	10
+铇	10
+菝	10
+吭	10
+瓌	10
+觞	10
+跶	10
+郃	10
+缒	10
+螈	10
+鲻	10
+屮	10
+佯	10
+泂	10
+怯	10
+鈡	10
+啪	10
+選	10
+耧	10
+鳘	10
+榑	10
+闇	10
+圫	10
+侒	10
+岄	10
+腆	10
+篌	10
+椆	10
+旒	10
+螅	10
+勗	10
+勻	10
+緣	10
+檺	10
+绱	10
+莀	10
+咡	10
+叒	10
+怵	10
+炻	10
+鸺	10
+杻	10
+镤	10
+鹜	10
+贋	10
+汚	10
+硋	9
+玿	9
+骓	9
+娌	9
+漢	9
+協	9
+峽	9
+彡	9
+蕺	9
+觜	9
+簏	9
+梣	9
+煸	9
+旯	9
+觎	9
+獎	9
+厎	9
+孓	9
+捲	9
+岬	9
+廸	9
+締	9
+掁	9
+玒	9
+菹	9
+訚	9
+芼	9
+膄	9
+鳢	9
+脘	9
+哞	9
+頜	9
+揖	9
+岎	9
+冇	9
+栒	9
+旼	9
+伵	9
+咎	9
+迨	9
+錡	9
+蘆	9
+辏	9
+轄	9
+寞	9
+杺	9
+鐡	9
+亍	9
+璆	9
+仸	9
+焬	9
+袷	9
+旳	9
+權	9
+叆	9
+抻	9
+珆	9
+窼	9
+饬	9
+鈎	9
+盉	9
+輌	9
+彎	9
+嘚	9
+晛	9
+哧	9
+孀	9
+酫	9
+尢	9
+昺	9
+夥	9
+氫	9
+網	9
+粬	9
+咆	9
+袓	9
+癔	9
+鋈	9
+鞥	9
+賀	9
+悃	9
+慊	9
+惚	9
+羮	9
+閱	9
+舭	9
+燄	9
+獗	9
+髦	9
+瘠	9
+貅	9
+燠	9
+箒	8
+瀨	8
+磦	8
+稊	8
+珝	8
+絕	8
+疥	8
+佥	8
+逬	8
+疔	8
+認	8
+侔	8
+頸	8
+翳	8
+虸	8
+囧	8
+恁	8
+晣	8
+夿	8
+琸	8
+迆	8
+頲	8
+鎔	8
+坫	8
+鍏	8
+鐘	8
+牽	8
+鲧	8
+齑	8
+膩	8
+蛴	8
+攪	8
+嫆	8
+沗	8
+潛	8
+層	8
+牳	8
+弍	8
+縠	8
+續	8
+薔	8
+谩	8
+爖	8
+肮	8
+灝	8
+撵	8
+懵	8
+斳	8
+枟	8
+闿	8
+冤	8
+鳛	8
+揩	8
+較	8
+苧	8
+裉	8
+薅	8
+貼	8
+酆	8
+殆	8
+椁	8
+咙	8
+伥	8
+鑚	8
+呰	8
+螬	8
+鼹	8
+荜	8
+忖	8
+礵	8
+盹	8
+喳	8
+鮰	8
+砉	8
+紗	8
+箧	8
+輛	8
+撅	8
+闐	8
+撝	8
+迖	8
+纨	8
+镆	8
+赦	8
+锫	8
+姫	8
+顣	8
+馫	8
+蝕	8
+錐	8
+悭	8
+寖	8
+飾	8
+饕	8
+窋	8
+蒞	8
+蚄	8
+沏	8
+閃	8
+苪	8
+臌	7
+語	7
+杄	7
+谼	7
+骍	7
+骙	7
+冐	7
+殃	7
+鱀	7
+蒴	7
+懸	7
+靯	7
+餮	7
+檞	7
+旵	7
+舻	7
+糨	7
+纡	7
+亞	7
+怔	7
+宖	7
+隨	7
+馬	7
+墰	7
+祷	7
+鄉	7
+暋	7
+婢	7
+淉	7
+隹	7
+绐	7
+擴	7
+乚	7
+繡	7
+呲	7
+豺	7
+冿	7
+咢	7
+礓	7
+侪	7
+妒	7
+肭	7
+埽	7
+堞	7
+柌	7
+鹇	7
+绡	7
+築	7
+滲	7
+纜	7
+鬣	7
+慆	7
+錫	7
+幾	7
+畑	7
+預	7
+帎	7
+邘	7
+馓	7
+嗉	7
+瘗	7
+創	7
+櫶	7
+燨	7
+饋	7
+戆	7
+仹	7
+晈	7
+撘	7
+禕	7
+愔	7
+純	7
+樁	7
+泙	7
+曐	7
+潟	7
+萜	7
+韾	7
+鵬	7
+熇	7
+瑩	7
+蔟	7
+阽	7
+遙	7
+醣	7
+踹	7
+厔	7
+囹	7
+滪	7
+螵	7
+鬟	7
+眞	7
+楿	7
+龆	7
+哽	7
+泚	7
+靈	7
+忑	7
+蘊	7
+愐	7
+豐	7
+嘲	6
+礳	6
+泩	6
+鞡	6
+眾	6
+硙	6
+駿	6
+碃	6
+瀜	6
+浕	6
+乗	6
+鏊	6
+醡	6
+玦	6
+睬	6
+邁	6
+髈	6
+鄜	6
+睺	6
+綁	6
+蔘	6
+昜	6
+卻	6
+箖	6
+沲	6
+菫	6
+矞	6
+耇	6
+湦	6
+堧	6
+戶	6
+嘘	6
+矴	6
+濩	6
+艨	6
+煩	6
+袈	6
+鈕	6
+尻	6
+櫞	6
+敍	6
+萆	6
+蝥	6
+蔹	6
+蕟	6
+唰	6
+濟	6
+斎	6
+岃	6
+釥	6
+唉	6
+骘	6
+夲	6
+奍	6
+鈤	6
+皴	6
+訊	6
+鹔	6
+奵	6
+魚	6
+槡	6
+輥	6
+鎯	6
+欐	6
+敀	6
+穑	6
+靰	6
+鉀	6
+睆	6
+據	6
+鋪	6
+嫜	6
+夆	6
+棨	6
+賠	6
+鍊	6
+攥	6
+籐	6
+傷	6
+奣	6
+茀	6
+黴	6
+虉	6
+鵝	6
+冊	6
+遠	6
+醫	6
+識	6
+椄	6
+嚢	6
+怅	6
+唔	6
+罅	6
+滶	6
+蹋	6
+笄	6
+匚	6
+耖	6
+顎	6
+蝾	6
+呸	6
+砘	6
+泘	6
+焟	6
+適	6
+鏵	6
+垉	6
+犮	6
+唻	6
+晫	6
+蕌	6
+畇	6
+澱	6
+呔	6
+尅	6
+抨	6
+厠	6
+嵉	6
+氷	6
+箇	6
+皊	6
+漰	6
+晻	6
+並	6
+丟	6
+糄	6
+矷	6
+荙	6
+胬	6
+旆	6
+菂	6
+竸	6
+佸	6
+霪	6
+萣	6
+棲	5
+歀	5
+鹡	5
+逡	5
+釋	5
+潤	5
+靥	5
+羴	5
+纖	5
+茝	5
+衛	5
+礌	5
+糥	5
+蓂	5
+褛	5
+洐	5
+氲	5
+訂	5
+獴	5
+鄅	5
+蘧	5
+侹	5
+媺	5
+琭	5
+缃	5
+帥	5
+帑	5
+伫	5
+缭	5
+咄	5
+鐩	5
+餈	5
+黾	5
+熘	5
+齒	5
+杩	5
+箢	5
+応	5
+蔵	5
+偖	5
+嫉	5
+侄	5
+箘	5
+裣	5
+蛘	5
+咧	5
+戾	5
+搠	5
+勞	5
+涘	5
+殼	5
+噹	5
+揹	5
+噐	5
+挍	5
+秄	5
+玊	5
+勠	5
+黯	5
+荺	5
+卬	5
+嚷	5
+苈	5
+鱔	5
+偈	5
+鲞	5
+讥	5
+瀅	5
+槔	5
+阼	5
+畄	5
+徃	5
+盞	5
+鬐	5
+炝	5
+蹰	5
+嘯	5
+谔	5
+蝲	5
+爐	5
+鹽	5
+徧	5
+鹩	5
+琞	5
+箋	5
+蒉	5
+黇	5
+憭	5
+殒	5
+嗌	5
+朿	5
+觊	5
+盡	5
+損	5
+飯	5
+鮮	5
+蒾	5
+懦	5
+瘳	5
+甭	5
+檾	5
+昤	5
+詺	5
+棑	5
+鉷	5
+爔	5
+扢	5
+庁	5
+襕	5
+叕	5
+壘	5
+甓	5
+態	5
+柷	5
+蝼	5
+翆	5
+榠	5
+湶	5
+榘	5
+訫	5
+殚	5
+戸	5
+揠	5
+婋	5
+觖	5
+髹	5
+跡	5
+珧	5
+侴	5
+濺	5
+苳	5
+軎	5
+徭	5
+昋	5
+鈣	5
+藟	5
+莙	5
+瀋	5
+芑	5
+敇	5
+楯	5
+骷	5
+戮	5
+咦	5
+吣	5
+薬	5
+杕	5
+韌	5
+虺	5
+蠧	5
+蒇	5
+婞	5
+雱	5
+摖	5
+垏	5
+畾	5
+蒎	5
+蓮	5
+阋	5
+瑊	5
+弎	5
+缢	5
+筯	5
+绔	5
+榞	5
+冭	5
+籃	5
+蟮	5
+姸	5
+効	5
+蟇	5
+鳈	5
+汔	5
+咼	5
+錩	5
+萫	5
+羅	5
+顕	5
+埖	5
+粻	5
+峱	5
+胝	5
+鸮	5
+葠	5
+燀	5
+倶	5
+鍛	5
+澋	5
+莰	4
+桜	4
+贏	4
+鮃	4
+鄰	4
+漍	4
+踱	4
+舯	4
+筞	4
+皲	4
+幁	4
+夢	4
+薢	4
+囝	4
+缋	4
+懑	4
+沝	4
+莯	4
+甠	4
+淢	4
+艁	4
+鰡	4
+燐	4
+旡	4
+岒	4
+頣	4
+牝	4
+雋	4
+箝	4
+锍	4
+綷	4
+盜	4
+汙	4
+苼	4
+烏	4
+吔	4
+蚰	4
+鱲	4
+寷	4
+蜴	4
+侀	4
+黙	4
+謦	4
+摭	4
+壺	4
+毖	4
+诹	4
+賽	4
+銩	4
+罱	4
+戡	4
+肸	4
+從	4
+娬	4
+糌	4
+葎	4
+铫	4
+籴	4
+蛞	4
+衝	4
+轟	4
+剤	4
+領	4
+驽	4
+頒	4
+舊	4
+刣	4
+疬	4
+阉	4
+阂	4
+谝	4
+鈊	4
+笩	4
+鞕	4
+楁	4
+厲	4
+簱	4
+詰	4
+鹘	4
+黝	4
+苽	4
+埦	4
+禔	4
+墎	4
+顫	4
+県	4
+搴	4
+積	4
+炐	4
+杪	4
+秞	4
+佔	4
+撐	4
+淲	4
+姉	4
+蟽	4
+陰	4
+挲	4
+仚	4
+茤	4
+喼	4
+苻	4
+銫	4
+滌	4
+廘	4
+鉑	4
+墐	4
+柲	4
+徍	4
+韋	4
+谖	4
+簣	4
+溡	4
+廚	4
+錠	4
+睎	4
+髅	4
+儂	4
+蛱	4
+簽	4
+晦	4
+洘	4
+澽	4
+橞	4
+鰤	4
+奮	4
+磘	4
+執	4
+鹋	4
+骀	4
+汋	4
+蝓	4
+秴	4
+瑪	4
+簾	4
+陎	4
+訁	4
+荮	4
+馐	4
+萊	4
+砱	4
+墣	4
+災	4
+芺	4
+楊	4
+噱	4
+愎	4
+倂	4
+擤	4
+衾	4
+诙	4
+玨	4
+侎	4
+燒	4
+纣	4
+吙	4
+渶	4
+竫	4
+袴	4
+錳	4
+旪	4
+鲭	4
+昑	4
+屷	4
+嫫	4
+瀟	4
+獠	4
+撈	4
+觇	4
+挻	4
+掃	4
+甶	4
+朮	4
+綿	4
+隊	4
+鈃	4
+舐	4
+唬	4
+锾	4
+鷹	4
+璊	4
+焛	4
+鑄	4
+諧	4
+踔	4
+栛	4
+鷽	4
+竼	4
+俜	4
+悝	4
+秠	4
+騵	4
+赬	4
+鱸	4
+衽	4
+噎	4
+缂	4
+裇	4
+粞	4
+帪	4
+硎	4
+撳	4
+萹	4
+暎	4
+硧	4
+響	4
+戙	4
+埪	4
+鉦	4
+獅	4
+闶	4
+嗾	4
+蕥	4
+蜢	4
+疍	4
+摈	4
+顢	4
+珒	4
+飕	4
+醼	4
+霎	4
+屐	4
+璕	4
+瘰	4
+曷	4
+婊	4
+瀢	4
+桝	4
+欯	4
+咗	4
+蕫	4
+衞	4
+蟳	4
+栱	4
+嗳	4
+斅	4
+顸	4
+攫	4
+绌	4
+療	3
+玍	3
+彀	3
+嵫	3
+牆	3
+妏	3
+嗔	3
+慠	3
+怍	3
+盬	3
+鎂	3
+谰	3
+淶	3
+柤	3
+螓	3
+爎	3
+輔	3
+楽	3
+屸	3
+墥	3
+湯	3
+嗷	3
+鋵	3
+貔	3
+禊	3
+寧	3
+銾	3
+啧	3
+夈	3
+凨	3
+韪	3
+脫	3
+穬	3
+堘	3
+莶	3
+湐	3
+併	3
+穩	3
+驛	3
+咝	3
+礠	3
+棿	3
+鲋	3
+柺	3
+鷃	3
+營	3
+齨	3
+虷	3
+瘐	3
+伬	3
+蠓	3
+肷	3
+泤	3
+補	3
+暌	3
+覩	3
+揷	3
+鍙	3
+袼	3
+塰	3
+昽	3
+茖	3
+箓	3
+谿	3
+甴	3
+孬	3
+絜	3
+娭	3
+踫	3
+杙	3
+沢	3
+尠	3
+颔	3
+咂	3
+拃	3
+奁	3
+簒	3
+缈	3
+顥	3
+珘	3
+噔	3
+飼	3
+咒	3
+匉	3
+杋	3
+缡	3
+倫	3
+藥	3
+筃	3
+圤	3
+扠	3
+鎧	3
+鉥	3
+掂	3
+铞	3
+尜	3
+桟	3
+檁	3
+琁	3
+饽	3
+哿	3
+擞	3
+锇	3
+湻	3
+髄	3
+坄	3
+螽	3
+酎	3
+苤	3
+剰	3
+茛	3
+郕	3
+劍	3
+伎	3
+厶	3
+刬	3
+橝	3
+杸	3
+輗	3
+垿	3
+蚍	3
+毬	3
+玡	3
+夌	3
+誤	3
+叅	3
+砫	3
+鴜	3
+崋	3
+軏	3
+湽	3
+勣	3
+圼	3
+樰	3
+値	3
+師	3
+宼	3
+仼	3
+貸	3
+姩	3
+瓅	3
+惦	3
+藝	3
+爲	3
+棷	3
+梀	3
+踇	3
+忭	3
+絔	3
+嗟	3
+耑	3
+欸	3
+僜	3
+帨	3
+亻	3
+篜	3
+閘	3
+曺	3
+谂	3
+鉚	3
+栃	3
+钔	3
+堅	3
+傘	3
+衲	3
+栺	3
+俟	3
+筈	3
+詀	3
+釦	3
+湊	3
+豨	3
+塹	3
+誾	3
+暝	3
+戩	3
+粧	3
+尛	3
+繤	3
+扱	3
+聽	3
+囮	3
+會	3
+诮	3
+悚	3
+咿	3
+黨	3
+荬	3
+貴	3
+讵	3
+鈥	3
+銆	3
+旿	3
+魃	3
+捃	3
+锊	3
+兗	3
+緖	3
+鋭	3
+徜	3
+幀	3
+藨	3
+墪	3
+搌	3
+碕	3
+坰	3
+灣	3
+姵	3
+圊	3
+夐	3
+墀	3
+鳠	3
+橐	3
+涇	3
+鸴	3
+毑	3
+暕	3
+掾	3
+夂	3
+妗	3
+冃	3
+徛	3
+鼯	3
+籀	3
+哏	3
+檠	3
+楢	3
+譽	3
+跚	3
+逴	3
+擬	3
+渖	3
+陳	3
+楡	3
+軋	3
+绁	3
+嘞	3
+蹺	3
+昖	3
+腚	3
+惭	3
+钸	3
+頦	3
+挌	3
+煚	3
+拚	3
+妚	3
+鮡	3
+彽	3
+袚	3
+蠢	3
+臤	3
+嫖	3
+旑	3
+鲯	3
+腦	3
+吆	3
+鈾	3
+曚	3
+镹	3
+嶽	3
+榅	3
+脹	3
+咻	3
+洩	3
+楲	3
+锿	3
+坲	3
+莸	3
+戓	3
+爣	3
+勲	3
+愠	3
+挈	3
+籓	3
+棓	3
+艼	3
+嵹	3
+鋸	3
+緾	3
+礡	3
+蝻	3
+伩	3
+鹬	3
+尨	3
+潪	3
+隠	3
+縱	3
+澣	3
+裬	3
+姳	3
+夅	3
+垍	3
+佷	2
+嶚	2
+鋌	2
+蘩	2
+蓍	2
+脈	2
+嵀	2
+鹴	2
+倷	2
+轷	2
+缊	2
+螠	2
+栁	2
+柖	2
+棡	2
+佫	2
+寤	2
+潄	2
+糗	2
+魰	2
+矅	2
+焺	2
+唷	2
+岍	2
+璪	2
+簊	2
+丌	2
+耠	2
+僬	2
+泒	2
+嗗	2
+詟	2
+禓	2
+禳	2
+寑	2
+趺	2
+嶐	2
+擊	2
+邶	2
+毨	2
+楛	2
+瞵	2
+鳡	2
+磵	2
+驺	2
+岝	2
+潰	2
+榶	2
+葐	2
+禥	2
+峖	2
+秱	2
+赍	2
+绋	2
+楾	2
+砢	2
+麽	2
+挢	2
+繳	2
+耜	2
+陴	2
+缱	2
+搳	2
+腠	2
+鑲	2
+禿	2
+蜺	2
+蘗	2
+躅	2
+癱	2
+憡	2
+獏	2
+蝟	2
+轚	2
+観	2
+鵰	2
+鉬	2
+衆	2
+咹	2
+蚋	2
+忝	2
+媄	2
+曞	2
+欽	2
+嶅	2
+蟎	2
+鏍	2
+兿	2
+亷	2
+醐	2
+漻	2
+簮	2
+磾	2
+霐	2
+掤	2
+庴	2
+躍	2
+砳	2
+莦	2
+漵	2
+栂	2
+濣	2
+鼬	2
+栨	2
+摻	2
+縛	2
+鍔	2
+堺	2
+綌	2
+焴	2
+麐	2
+鍥	2
+鳴	2
+甌	2
+館	2
+咅	2
+湎	2
+鎷	2
+釐	2
+踺	2
+鰼	2
+霦	2
+篑	2
+皁	2
+唎	2
+怄	2
+杦	2
+髀	2
+姖	2
+祘	2
+洟	2
+嚴	2
+翛	2
+渮	2
+睳	2
+髫	2
+怏	2
+罰	2
+漟	2
+綅	2
+礞	2
+犒	2
+煟	2
+蟬	2
+異	2
+剝	2
+鏪	2
+宄	2
+癭	2
+荳	2
+煇	2
+郷	2
+鈭	2
+凈	2
+伃	2
+恿	2
+擺	2
+旽	2
+杴	2
+斒	2
+賦	2
+當	2
+惮	2
+禸	2
+犄	2
+暁	2
+豢	2
+蓱	2
+窺	2
+練	2
+闆	2
+饣	2
+圮	2
+迕	2
+関	2
+瘿	2
+濱	2
+椀	2
+囦	2
+粣	2
+篐	2
+鉆	2
+篩	2
+眈	2
+媕	2
+悻	2
+聲	2
+傛	2
+杅	2
+酲	2
+诟	2
+矦	2
+櫆	2
+宒	2
+嫽	2
+饫	2
+発	2
+誠	2
+夬	2
+踯	2
+埈	2
+繭	2
+讹	2
+槕	2
+徉	2
+飊	2
+鍀	2
+徝	2
+翺	2
+揵	2
+櫡	2
+蹠	2
+鶄	2
+攉	2
+梌	2
+惆	2
+鬻	2
+訓	2
+帄	2
+硾	2
+勢	2
+斻	2
+燹	2
+脷	2
+鈖	2
+簟	2
+坈	2
+衄	2
+缲	2
+笞	2
+鸻	2
+醬	2
+晱	2
+襲	2
+栉	2
+腎	2
+鋇	2
+彳	2
+侘	2
+汦	2
+呠	2
+牚	2
+珋	2
+痍	2
+窸	2
+斶	2
+薶	2
+芣	2
+朾	2
+柩	2
+抷	2
+鳳	2
+峵	2
+朓	2
+馳	2
+冝	2
+鋹	2
+摂	2
+悕	2
+屣	2
+枬	2
+隻	2
+龃	2
+豋	2
+澆	2
+趯	2
+豕	2
+梍	2
+蹒	2
+筚	2
+鉛	2
+煉	2
+丄	2
+鹵	2
+鄫	2
+蹁	2
+冂	2
+唍	2
+訕	2
+靿	2
+妧	2
+覅	2
+抅	2
+袏	2
+棄	2
+蜷	2
+徤	2
+衹	2
+焀	2
+埑	2
+噩	2
+鼢	2
+絼	2
+忼	2
+阌	2
+虼	2
+実	2
+鰍	2
+屻	2
+涥	2
+涙	2
+耢	2
+牖	2
+拊	2
+馔	2
+冡	2
+噫	2
+曇	2
+鮊	2
+罣	2
+壌	2
+麩	2
+牣	2
+驵	2
+峇	2
+踉	2
+掳	2
+簃	2
+苿	2
+芄	2
+貎	2
+勬	2
+鶋	2
+滅	2
+棝	2
+硪	2
+賡	2
+渞	2
+膂	2
+哊	2
+瞐	2
+銳	2
+鋰	2
+脽	2
+嵱	2
+鐤	2
+鐳	2
+衦	2
+様	2
+竂	2
+襖	2
+挿	2
+醮	2
+蘘	2
+嗙	2
+紪	2
+捯	2
+瑋	2
+壽	2
+淿	2
+島	2
+鈞	2
+猢	2
+隺	2
+涼	2
+湨	2
+叏	2
+濆	2
+蕹	2
+羣	2
+燻	2
+鐗	2
+褃	2
+啛	2
+鐼	2
+麃	2
+郛	2
+砠	2
+玞	2
+癖	2
+齋	2
+鑛	2
+铻	2
+顱	2
+挄	2
+祔	2
+籿	2
+跕	2
+跏	2
+繼	2
+窅	2
+楺	2
+嫲	2
+盪	2
+煵	2
+挰	2
+莤	2
+刿	2
+魇	2
+犷	2
+還	2
+梼	2
+靚	2
+樞	2
+胊	2
+鸩	2
+棫	2
+媵	2
+彊	2
+牑	2
+韯	2
+垊	2
+掼	2
+遞	2
+觥	2
+赀	2
+競	2
+暅	2
+諨	2
+踅	2
+漶	2
+濊	2
+谥	2
+鮜	2
+嚇	2
+緩	2
+縋	1
+複	1
+涫	1
+喚	1
+愯	1
+栘	1
+兌	1
+绲	1
+陜	1
+幞	1
+貹	1
+仦	1
+蔲	1
+啇	1
+牞	1
+盝	1
+忺	1
+嬡	1
+葯	1
+洭	1
+顳	1
+紀	1
+澒	1
+騤	1
+逫	1
+楉	1
+櫒	1
+耋	1
+櫃	1
+忿	1
+汖	1
+偎	1
+塂	1
+駕	1
+幫	1
+醑	1
+塣	1
+錣	1
+侅	1
+溓	1
+垶	1
+孮	1
+馺	1
+嬾	1
+烋	1
+歴	1
+疎	1
+鼑	1
+萞	1
+祌	1
+荌	1
+訄	1
+梾	1
+柕	1
+祓	1
+槅	1
+兟	1
+隒	1
+洔	1
+莩	1
+笓	1
+甿	1
+禎	1
+鲥	1
+忂	1
+堟	1
+曬	1
+妳	1
+潙	1
+璥	1
+梴	1
+瘁	1
+眦	1
+猾	1
+脰	1
+錚	1
+湆	1
+臯	1
+稲	1
+梩	1
+釹	1
+绠	1
+敠	1
+袿	1
+偑	1
+墼	1
+謀	1
+匤	1
+揎	1
+霂	1
+遫	1
+惪	1
+敗	1
+瀲	1
+軽	1
+呮	1
+伧	1
+蔈	1
+鋠	1
+瘛	1
+扙	1
+呓	1
+緢	1
+隱	1
+鳂	1
+姼	1
+渁	1
+銦	1
+碏	1
+迚	1
+揸	1
+堈	1
+翉	1
+傾	1
+凵	1
+幪	1
+恔	1
+俳	1
+胩	1
+頑	1
+漁	1
+彍	1
+抦	1
+虮	1
+睚	1
+瘔	1
+缁	1
+樸	1
+尪	1
+顒	1
+軒	1
+伻	1
+睇	1
+濨	1
+屝	1
+墝	1
+矂	1
+検	1
+銃	1
+璍	1
+拸	1
+鮨	1
+嬰	1
+鉺	1
+艅	1
+伓	1
+阕	1
+卩	1
+鯷	1
+窬	1
+墹	1
+梛	1
+舉	1
+峢	1
+跣	1
+龠	1
+娢	1
+杌	1
+鴛	1
+輻	1
+眏	1
+鑁	1
+厫	1
+鐀	1
+醱	1
+猃	1
+枃	1
+鍫	1
+鑰	1
+扟	1
+憜	1
+庺	1
+倅	1
+亙	1
+晲	1
+敩	1
+崍	1
+詈	1
+喑	1
+貵	1
+汏	1
+闄	1
+竢	1
+瀴	1
+塺	1
+稃	1
+頋	1
+氭	1
+揮	1
+靆	1
+慬	1
+讠	1
+榿	1
+睞	1
+騠	1
+棌	1
+孫	1
+龅	1
+鍋	1
+釨	1
+階	1
+磚	1
+鄗	1
+薀	1
+飺	1
+抆	1
+粨	1
+漿	1
+欵	1
+砑	1
+刎	1
+庝	1
+崌	1
+寗	1
+觑	1
+蔃	1
+痞	1
+齻	1
+羭	1
+墄	1
+濓	1
+笵	1
+垀	1
+峸	1
+诓	1
+駉	1
+駸	1
+觳	1
+陖	1
+鱄	1
+汿	1
+飑	1
+踣	1
+楖	1
+窧	1
+傒	1
+剛	1
+汸	1
+魍	1
+鈷	1
+敫	1
+勆	1
+榖	1
+彔	1
+礪	1
+凄	1
+釭	1
+談	1
+荵	1
+擾	1
+珬	1
+暯	1
+礒	1
+榇	1
+潶	1
+礬	1
+湰	1
+豎	1
+穈	1
+鱇	1
+褙	1
+縯	1
+贔	1
+褆	1
+酄	1
+覺	1
+鍂	1
+滛	1
+痐	1
+迏	1
+腼	1
+灬	1
+熂	1
+綸	1
+縻	1
+羸	1
+鼰	1
+踴	1
+燓	1
+揑	1
+觚	1
+揍	1
+該	1
+週	1
+晸	1
+圁	1
+戯	1
+賄	1
+鏑	1
+掕	1
+錄	1
+梏	1
+紑	1
+揳	1
+違	1
+睶	1
+椥	1
+纥	1
+訟	1
+筶	1
+桾	1
+瓨	1
+歃	1
+枙	1
+暤	1
+獨	1
+駝	1
+吶	1
+鹪	1
+箤	1
+託	1
+訸	1
+嵠	1
+柆	1
+梲	1
+铓	1
+癃	1
+籨	1
+腫	1
+宻	1
+鐨	1
+澷	1
+凖	1
+琓	1
+穏	1
+筅	1
+爝	1
+裏	1
+浟	1
+畊	1
+籵	1
+凘	1
+锳	1
+裟	1
+閒	1
+焧	1
+毘	1
+穎	1
+煳	1
+劇	1
+裨	1
+汎	1
+鄪	1
+貢	1
+帰	1
+蠋	1
+鎵	1
+魯	1
+怙	1
+炲	1
+涽	1
+拡	1
+瑒	1
+漮	1
+曱	1
+粔	1
+塁	1
+謬	1
+菶	1
+媌	1
+輞	1
+畨	1
+眝	1
+拝	1
+鵷	1
+戋	1
+铴	1
+撚	1
+帳	1
+鐓	1
+岾	1
+刋	1
+蔀	1
+伅	1
+貯	1
+亜	1
+笯	1
+哳	1
+祫	1
+槸	1
+搙	1
+坿	1
+谪	1
+螣	1
+薿	1
+蛃	1
+鲱	1
+媂	1
+嫰	1
+橎	1
+鎣	1
+圄	1
+簺	1
+覌	1
+咣	1
+瓔	1
+枔	1
+枺	1
+縩	1
+唠	1
+掟	1
+吽	1
+埧	1
+蚽	1
+嫕	1
+眕	1
+懊	1
+俒	1
+兘	1
+廝	1
+揬	1
+稈	1
+痷	1
+斾	1
+艦	1
+屽	1
+鶼	1
+崡	1
+瞠	1
+敎	1
+擔	1
+踽	1
+崊	1
+晳	1
+攵	1
+鍖	1
+瑫	1
+朌	1
+坺	1
+惘	1
+聞	1
+凍	1
+饔	1
+鍦	1
+疳	1
+膽	1
+纄	1
+淰	1
+椇	1
+攬	1
+倆	1
+茷	1
+悊	1
+硁	1
+硤	1
+埆	1
+鮟	1
+舤	1
+雰	1
+茇	1
+遹	1
+湠	1
+啳	1
+堾	1
+厐	1
+虿	1
+懔	1
+烳	1
+秊	1
+織	1
+鎻	1
+攃	1
+豬	1
+垨	1
+踮	1
+畞	1
+阠	1
+琣	1
+熆	1
+筍	1
+蔥	1
+鴿	1
+彫	1
+憙	1
+珗	1
+疊	1
+槁	1
+駆	1
+嘠	1
+瞑	1
+袺	1
+簀	1
+哜	1
+鳐	1
+暈	1
+埾	1
+冦	1
+蹚	1
+矼	1
+冏	1
+鍺	1
+鄭	1
+鮪	1
+臥	1
+齊	1
+玔	1
+柊	1
+蹿	1
+媸	1
+鎗	1
+峈	1
+畤	1
+喣	1
+瑈	1
+囷	1
+籠	1
+瀬	1
+嬲	1
+杬	1
+頰	1
+涀	1
+鳥	1
+殑	1
+錘	1
+鱗	1
+愰	1
+嬫	1
+鍘	1
+灥	1
+圽	1
+醅	1
+嘨	1
+澦	1
+冨	1
+栭	1
+柈	1
+経	1
+癍	1
+嶆	1
+壩	1
+剷	1
+綂	1
+隑	1
+焐	1
+秂	1
+璈	1
+灴	1
+刄	1
+忓	1
+櫵	1
+枆	1
+幜	1
+枴	1
+恝	1
+匜	1
+溲	1
+窛	1
+呒	1
+檍	1
+慶	1
+迿	1
+飩	1
+乇	1
+嶸	1
+勁	1
+忚	1
+捜	1
+隃	1
+瘡	1
+廼	1
+泑	1
+韛	1
+窣	1
+穜	1
+缧	1
+銨	1
+詁	1
+靣	1
+侭	1
+洓	1
+揄	1
+祿	1
+嗬	1
+韓	1
+吠	1
+瓞	1
+婈	1
+鄮	1
+賃	1
+矚	1
+櫧	1
+檄	1
+摬	1
+檇	1
+缣	1
+鞒	1
+湇	1
+忉	1
+鏉	1
+慫	1
+滳	1
+亣	1
+狈	1
+醝	1
+薙	1
+湁	1
+昘	1
+幗	1
+仺	1
+煬	1
+暙	1
+誼	1
+醭	1
+昻	1
+崶	1
+勮	1
+習	1
+譯	1
+鍒	1
+巸	1
+蝪	1
+掎	1
+祅	1
+镚	1
+恆	1
+鈴	1
+騛	1
+碫	1
+唨	1
+鏐	1
+牻	1
+蹸	1
+睒	1
+巟	1
+蠔	1
+秌	1
+夎	1
+晹	1
+鐭	1
+謩	1
+拫	1
+遲	1
+悾	1
+垷	1
+綫	1
+鍨	1
+癯	1
+讣	1
+錋	1
+巺	1
+寵	1
+昞	1
+恊	1
+曧	1
+愭	1
+龉	1
+慣	1
+媱	1
+拰	1
+廇	1
+厈	1
+谘	1
+搢	1
+朣	1
+彘	1
+鏻	1
+垺	1
+眛	1

+ 108 - 0
field_sync_1/common.toml

@@ -0,0 +1,108 @@
+[serve]
+msgaddr = "10.171.112.160:7070"
+#抽取同步字段、需要处理的字段
+fields = ["buyerzipcode", "winnertel", "winnerperson", "contractcode", "winneraddr", "agencyaddr", "buyeraddr", "signaturedate",
+    "projectperiod", "projectaddr", "agencytel", "agencyperson", "buyerperson", "agency", "projectscope", "projectcode", "bidopentime",
+    "supervisorrate", "buyertel", "bidamount", "winner", "buyer", "budget", "projectname", "buyerclass", "topscopeclass", "s_topscopeclass",
+    "area", "city", "district", "s_winner", "toptype", "subtype", "subscopeclass", "s_subscopeclass", "dataging", "winnerorder", "project_scale",
+    "project_duration", "project_timeunit", "project_startdate", "project_completedate", "payway", "contract_guarantee", "bid_guarantee", "qualifies",
+    "funds", "review_experts", "bidmethod", "bidendtime", "bidopenaddress", "docamount", "bidway", "agencyrate", "agencyfee", "getdocmethod", "purchasing_tag",
+    "package", "history_updatetime", "total_investment", "owner", "projecttype", "project_person", "project_phone", "approvedept", "construction_area",
+    "floor_area", "bidstarttime", "docendtime", "docstarttime", "signendtime", "signstarttime", "issue_quota", "bidopen_shape", "quote_mode", "is_acquire_tender",
+    "is_payment_deposit", "is_joint_bidding", "est_purchase_time", "est_purchase_amount", "s_project_startdate", "s_project_completedate", "enterprise_qualification",
+    "personnel_qualification", "performance_qualification", "enterprise_credit", "is_exist_pakage", "expiredate", "contractperiod"
+]
+
+[udp]
+locport = ":1787"
+[udp.next]
+addr = "127.0.0.1"
+port = 1783
+stype = "bidding"
+[udp.project]
+addr = "127.0.0.1"
+port = 1782
+stype = ""
+[udp.tidb]
+addr = "127.0.0.1"
+port = 1680
+stype = "subject"
+[udp.tidb1]
+addr = "127.0.0.1"
+port = 1681
+stype = ""
+[udp.tidb2]
+addr = "127.0.0.1"
+port = 1970
+stype = ""
+
+
+[nsq]
+addr = "192.168.3.166:4150"
+topic = "bidding_id"
+channel = "esindex"
+concurrent = 1
+
+[db]
+
+[db.mongoB]
+addr = "192.168.3.206:27002"
+dbname = "qfw_data"
+coll = "bidding"
+size = 5
+user = "jyDevGroup"
+password = "jy@DevGroup"
+[db.mongoE]
+addr = "192.168.3.71:29099"
+dbname = "wjh"
+size = 5
+coll = "extract"
+coll1 = ""
+user = ""
+password = ""
+[db.mongoQ]
+addr = "192.168.3.71:29099"
+dbname = "mixdata"
+size = 5
+coll = "qyxy_std"
+user = ""
+password = ""
+[db.mongoP]
+addr = "192.168.3.71:29099"
+dbname = "mixdata"
+size = 5
+coll = "company_history_name"
+user = ""
+password = ""
+
+[db.redis]
+#company_id
+addr = "qyxy_id=192.168.3.207:1679"
+dbindex = 4
+
+[db.es]
+addr = "http://192.168.3.241:9205,http://192.168.3.149:9200"
+user = ""
+password = ""
+
+[mail]
+send = false
+to = "wangjianghan@topnet.net.cn"
+api = "http://172.17.145.179:19281/_send/_mail"
+
+# 日志
+[log]
+# 日志路径,为空将输出控制台
+logpath = ""
+# log size (M)
+maxsize = 10
+# compress log
+compress = true
+# log save  time (day)
+maxage =  7
+# save total log file total
+maxbackups = 10
+# log level
+loglevel  = "debug"
+# text or json output
+format = "text"

+ 117 - 0
field_sync_1/config/conf.go

@@ -0,0 +1,117 @@
+package config
+
+import (
+	"fmt"
+	"os"
+	"time"
+
+	"github.com/BurntSushi/toml"
+)
+
+var (
+	// Conf crocodile conf
+	Conf *conf
+)
+
+// Init Config
+func Init(conf string) {
+	_, err := toml.DecodeFile(conf, &Conf)
+	if err != nil {
+		fmt.Printf("Err %v", err)
+		os.Exit(1)
+	}
+}
+
+type conf struct {
+	Serve serve
+	DB    db
+	Udp   udp
+	Nsq   nsq
+	Mail  mail
+	Log   log
+}
+
+type serve struct {
+	MsgAddr string
+	FieldS  []string
+}
+
+type udp struct {
+	LocPort string
+	Next    udpNext
+	Project udpNext
+	Tidb    udpNext
+	Tidb1   udpNext
+	Tidb2   udpNext
+}
+
+type nsq struct {
+	Addr       string
+	Topic      string
+	Channel    string
+	Concurrent int
+}
+
+type udpNext struct {
+	Addr  string
+	Port  int
+	Stype string
+}
+
+type mail struct {
+	Send bool
+	To   string
+	Api  string
+}
+
+// Log Config
+type log struct {
+	LogPath    string
+	MaxSize    int
+	Compress   bool
+	MaxAge     int
+	MaxBackups int
+	LogLevel   string
+	Format     string
+}
+
+type db struct {
+	MongoB mgo
+	MongoE mgo
+	MongoQ mgo
+	MongoP mgo
+	Redis  redis
+	Es     es
+}
+
+type mgo struct {
+	Addr     string
+	Dbname   string
+	Coll     string
+	Coll1    string
+	Size     int
+	User     string
+	Password string
+}
+
+type redis struct {
+	Addr    string
+	DbIndex int
+}
+
+type es struct {
+	Addr     string
+	User     string
+	Password string
+}
+
+type duration struct {
+	time.Duration
+}
+
+// UnmarshalText parse 10s to time.Time
+func (d *duration) UnmarshalText(text []byte) error {
+	var err error
+	d.Duration, err = time.ParseDuration(string(text))
+	return err
+}

+ 82 - 0
field_sync_1/config/conf_test.go

@@ -0,0 +1,82 @@
+package config
+
+import (
+	"io/ioutil"
+	"os"
+	"testing"
+)
+
+var confs = `# log
+[log]
+logpath = ""
+maxsize = 10
+compress = true
+maxage =  7
+maxbackups = 10
+loglevel  = "info"
+format = "text"
+
+[serve]
+grpcAddr = "192.168.3.12:10021"
+udpPort = "1782"
+
+[db]
+[db.mongo]
+addr = "192.168.3.207:27092"
+dbname = "qfw"
+size = 10
+user = ""
+password = ""
+[db.mongo1]
+addr = "192.168.3.207:27092"
+dbname = "wjh"
+size = 5
+user = ""
+password = ""
+
+[db.es]
+addr = "http://192.168.3.206:9800"
+size = 5
+indexm = "medical_institution_v1"
+typem = "medical_institution"
+indexs = "supplier_product_v1"
+types = "supplier_product"
+
+
+[udp]
+locport = ":1787"
+[[udp.next]]
+addr = "127.0.0.1"
+port = 1783
+stype = "bidding"
+remark = "索引"
+[[udp.next]]
+addr = "127.0.0.1"
+port = 1782
+stype = ""
+remark = ""
+[[udp.next]]
+addr = "127.0.0.1"
+port = 1680
+stype = "subject"
+remark = "医疗数据"
+[[udp.next]]
+addr = "127.0.0.1"
+port = 1681
+stype = ""
+remark = ""
+[[udp.next]]
+addr = "127.0.0.1"
+port = 1970
+stype = ""
+remark = ""
+
+`
+
+func TestInit(t *testing.T) {
+	testfile := "/tmp/crocodile.toml"
+	ioutil.WriteFile(testfile, []byte(confs), 0644)
+	Init(testfile)
+	t.Logf("%+v", Conf.Udp.Next)
+	os.Remove(testfile)
+}

+ 199 - 0
field_sync_1/file.go

@@ -0,0 +1,199 @@
+package main
+
+import (
+	"bufio"
+	"fmt"
+	"io"
+	"log"
+	"os"
+	"regexp"
+	"strconv"
+	"strings"
+
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+)
+
+var (
+	CmmonDFA        *DFA                                             //常用字
+	NotCommonDFA    *DFA                                             //不常用字
+	TimesLimit      int                                              //常用字界限
+	CmmLmt, NcmmLmt float64                                          //更新界限
+	HanReg          = regexp.MustCompile("[\u4e00-\u9fa5]+")         //中文正则
+	SpaceReg        = regexp.MustCompile("[\\s\u3000\u2003\u00a0]+") //空格正则
+	SpecialReg      = regexp.MustCompile("图片(\\d)+")                 //
+)
+
+func InitFileInfo() {
+	TimesLimit = 500
+	CmmLmt = 0.5
+	NcmmLmt = 0.1
+	CmmonDFA = &DFA{}
+	NotCommonDFA = &DFA{}
+	LoadDict("CommonDict.txt") //初始化常用字典
+}
+
+// DFA
+type DFA struct {
+	Link map[string]interface{}
+}
+
+func (d *DFA) AddWord(keys ...string) {
+	d.AddWordAll(true, keys...)
+}
+func (d *DFA) AddWordAll(haskey bool, keys ...string) {
+	if d.Link == nil {
+		d.Link = make(map[string]interface{})
+	}
+	for _, key := range keys {
+		nowMap := &d.Link
+		for i := 0; i < len(key); i++ {
+			kc := key[i : i+1]
+			if v, ok := (*nowMap)[kc]; ok {
+				nowMap, _ = v.(*map[string]interface{})
+			} else {
+				newMap := map[string]interface{}{}
+				newMap["YN"] = "0"
+				(*nowMap)[kc] = &newMap
+				nowMap = &newMap
+			}
+			if i == len(key)-1 {
+				(*nowMap)["YN"] = "1"
+				if haskey {
+					(*nowMap)["K"] = key
+				}
+			}
+		}
+	}
+}
+
+func (d *DFA) CheckSensitiveWord(src string) []string {
+	res := make([]string, 0)
+	for j := 0; j < len(src); j++ {
+		nowMap := &d.Link
+		for i := j; i < len(src); i++ {
+			word := src[i : i+1]
+			nowMap, _ = (*nowMap)[word].(*map[string]interface{})
+			if nowMap != nil { // 存在,则判断是否为最后一个
+				if "1" == util.ObjToString((*nowMap)["YN"]) {
+					s := util.ObjToString((*nowMap)["K"])
+					res = append(res, s)
+				}
+			} else {
+				break
+			}
+		}
+	}
+	return res
+}
+
+// 加载统计的常用词
+func LoadDict(path string) {
+	dictFile, err := os.Open(path)
+	if err != nil {
+		log.Println("Load Common.txt Error")
+		os.Exit(-1)
+	}
+	defer dictFile.Close()
+	reader := bufio.NewReader(dictFile)
+	var (
+		text      string
+		frequency int
+	)
+
+	// 逐行读入分词
+	line := 0
+	for {
+		line++
+		size, fsErr := fmt.Fscanln(reader, &text, &frequency) //读每行赋值
+		if fsErr == io.EOF {                                  //读取到结尾
+			break
+		}
+		if size == 2 { //正确数据
+			if frequency >= TimesLimit { //常用字
+				CmmonDFA.AddWord(text)
+			} else { //非常用字
+				NotCommonDFA.AddWord(text)
+			}
+		} else {
+			log.Println("Read Line Error: line ", line)
+		}
+	}
+}
+
+// 解析附件
+func AnalysisFile(filetext string) bool {
+	defer util.Catch()
+	//过滤空格
+	filetextTmp := SpaceReg.ReplaceAllString(filetext, "")
+	if filetextTmp == "" { //附件为空
+		return false
+	}
+	//特殊情况:图片0 图片1
+	filetextTmp = SpecialReg.ReplaceAllString(filetextTmp, "")
+	if filetextTmp == "" { //附件为空
+		return false
+	}
+	//中文匹配
+	HanArr := HanReg.FindAllString(filetextTmp, -1)
+	hanText := strings.Join(HanArr, "")
+	hanTextLen := len([]rune(hanText))
+	//长度过滤
+	if hanTextLen <= 100 {
+		return false
+	}
+	//qu.Debug(hanTextLen, hanText)
+	commonArr := CmmonDFA.CheckSensitiveWord(hanText)
+	commonLen := len(commonArr)
+	//qu.Debug(commonLen, commonArr)
+	//commonText := strings.Join(commonArr, "")
+	notCommonArr := NotCommonDFA.CheckSensitiveWord(hanText)
+	notCommonLen := len(notCommonArr)
+	//qu.Debug(notCommonLen, notCommonArr)
+	//解析常用字和非常用字占比(由于常用字或非常用字集不全,会导致比例相加不为100%)
+	commonRatio := float64(commonLen) / float64(hanTextLen)
+	commonRatio, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", commonRatio), 64)
+	//qu.Debug(commonRatio)
+	notCommonRatio := float64(notCommonLen) / float64(hanTextLen)
+	notCommonRatio, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", notCommonRatio), 64)
+	if commonRatio >= CmmLmt && notCommonRatio < NcmmLmt {
+		return true
+	}
+	return false
+}
+
+// 测试方法
+func AnalysisFileTest(detail string) (bool, string, int, float64, float64) {
+	//qu.Debug(detail)
+	defer util.Catch()
+	//过滤空格
+	filetextTmp := SpaceReg.ReplaceAllString(detail, "")
+	if filetextTmp == "" { //附件为空
+		return false, "", 0, 0, 0
+	}
+	//特殊情况:图片0 图片1
+	filetextTmp = SpecialReg.ReplaceAllString(filetextTmp, "")
+	if filetextTmp == "" { //附件为空
+		return false, "", 1, 0, 0
+	}
+	//中文匹配
+	HanArr := HanReg.FindAllString(filetextTmp, -1)
+	hanText := strings.Join(HanArr, "")
+	hanTextLen := len([]rune(hanText))
+	//长度过滤
+	if hanTextLen <= 100 {
+		return false, "", 2, 0, 0
+	}
+	//qu.Debug(textLen, text)
+	commonArr := CmmonDFA.CheckSensitiveWord(hanText)
+	commonLen := len(commonArr)
+	//commonText := strings.Join(commonArr, "")
+	notCommonArr := NotCommonDFA.CheckSensitiveWord(hanText)
+	notCommonLen := len(notCommonArr)
+	//notCommonText := strings.Join(notCommonArr, "")
+	//解析常用字和非常用字占比(由于常用字或非常用字集不全,会导致比例相加不为100%)
+	commonRatio := float64(commonLen) / float64(hanTextLen)
+	commonRatio, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", commonRatio), 64)
+	notCommonRatio := float64(notCommonLen) / float64(hanTextLen)
+	notCommonRatio, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", notCommonRatio), 64)
+	return true, filetextTmp, 10, commonRatio, notCommonRatio
+}

+ 21 - 0
field_sync_1/go.mod

@@ -0,0 +1,21 @@
+module field_sync
+
+go 1.16
+
+require (
+	app.yhyue.com/moapp/jybase v0.0.0-20240205092729-2959d78b7619
+	github.com/BurntSushi/toml v1.2.0
+	github.com/aliyun/aliyun-oss-go-sdk v2.2.5+incompatible
+	github.com/go-xweb/httpsession v0.0.0-20141220075701-356d3b4d38d6 // indirect
+	github.com/go-xweb/log v0.0.0-20140701090824-270d183ad77e // indirect
+	github.com/go-xweb/uuid v0.0.0-20140604020037-d7dce341f851 // indirect
+	github.com/go-xweb/xweb v0.2.1
+	github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd // indirect
+	github.com/mattn/go-sqlite3 v1.14.22 // indirect
+	github.com/robfig/cron v1.2.0
+	go.mongodb.org/mongo-driver v1.11.0
+	go.uber.org/zap v1.22.0
+	golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 // indirect
+	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
+	jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20230621011928-cdaea81cabe1
+)

+ 433 - 0
field_sync_1/go.sum

@@ -0,0 +1,433 @@
+app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d h1:WPsYuuptAd3UEgN+jPzpnsDe/OvcshDUUtOTZPYGSJ8=
+app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
+app.yhyue.com/moapp/jybase v0.0.0-20240205092729-2959d78b7619 h1:rzjJ4pK1P+DcoOYA4+hCOJUoLdSInQa3EHsYY2DKWqA=
+app.yhyue.com/moapp/jybase v0.0.0-20240205092729-2959d78b7619/go.mod h1:fjaD11Z3FIk9EyfOpdKAMQNs7nPZCpT/qKIw1oVsb9w=
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
+github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
+github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
+github.com/RoaringBitmap/roaring v1.5.0/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/aliyun/aliyun-oss-go-sdk v2.2.5+incompatible h1:QoRMR0TCctLDqBCMyOu1eXdZyMw3F7uGA9qPn2J4+R8=
+github.com/aliyun/aliyun-oss-go-sdk v2.2.5+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
+github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
+github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250/go.mod h1:zX8vynptAghuV/KG8BOZlDeo4DsTKWfBQ154RWlkay0=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o=
+github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
+github.com/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/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+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-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-xweb/httpsession v0.0.0-20141220075701-356d3b4d38d6 h1:DUiWdm3rS8cC96Y0XeVkDeizzEK6X+qiNgXytLVtbkM=
+github.com/go-xweb/httpsession v0.0.0-20141220075701-356d3b4d38d6/go.mod h1:lwPk13GS+i/NK4FkMm68IcJrAwiu+HtjYa1Y4kW59aY=
+github.com/go-xweb/log v0.0.0-20140701090824-270d183ad77e h1:xmffs7hgrWpAOcquZrdlWpAEaAdlI9myaYcUUmhIP7k=
+github.com/go-xweb/log v0.0.0-20140701090824-270d183ad77e/go.mod h1:ASmYUSBf32lWkkNVX/pnOU4MLuUQpFH4qYHvWHt/l0w=
+github.com/go-xweb/uuid v0.0.0-20140604020037-d7dce341f851 h1:D46USD6oGNWzoJ/h5CWaFq3ELLoLoJzllJ03Xh78VYg=
+github.com/go-xweb/uuid v0.0.0-20140604020037-d7dce341f851/go.mod h1:OmDEC58ZYO1Esk+Uy32SB6LWof9lyROl7q76dBFOCWw=
+github.com/go-xweb/xweb v0.2.1 h1:u5t/ttuSfxiIMDTXj/Pouw9C2ASNABWT16JWHyrtdvY=
+github.com/go-xweb/xweb v0.2.1/go.mod h1:vPjYJgfidYAgBKIwiAyKFC1hfczlqsw9rRT8LtwrGew=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws=
+github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+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/howeyc/fsnotify v0.9.0 h1:0gtV5JmOKH4A8SsFxG2BczSeXWWPvcMT0euZt5gDAxY=
+github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+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/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=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd h1:DXxmBCahjva4Ox4AWOv6pR1Csv33zSj97SaLOElfIsw=
+github.com/lunny/csession v0.0.0-20130910075847-fe53c5de3dfd/go.mod h1:3w9PScemEkJoLw3OYvLWMoD8XRCmXgGwsSpT6pFpJ0g=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/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/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE=
+github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/olivere/elastic v6.2.37+incompatible h1:UfSGJem5czY+x/LqxgeCBgjDn6St+z8OnsCuxwD3L0U=
+github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
+github.com/olivere/elastic/v7 v7.0.22/go.mod h1:VDexNy9NjmtAkrjNoI7tImv7FR4tf5zUA3ickqu5Pc8=
+github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=
+github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
+github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+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=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+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 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
+github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
+github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
+github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+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.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
+go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
+go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
+go.mongodb.org/mongo-driver v1.11.0 h1:FZKhBSTydeuffHj9CBjXlR8vQLee1cQyTWYPA6/tqiE=
+go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk=
+go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
+go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
+go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
+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.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0=
+go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+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-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93 h1:MYimHLfoXEpOhqd/zgoA/uoXzHB86AEky4LAx5ij9xA=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/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-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-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+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/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9 h1:ftMN5LMiBFjbzleLqtoBZk7KdJwhuybIU+FckUHgoyQ=
+golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.0.5/go.mod h1:N1OIhHAIhx5SunkMGqWbGFVeh4yTNWKmMo1GOAsohLI=
+gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20230621011928-cdaea81cabe1 h1:MbtiS3BwDnB7uRjHFMCBe7/oW+aLaGMeQNiQa3qvd4c=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20230621011928-cdaea81cabe1/go.mod h1:1Rp0ioZBhikjXHYYXmnzL6RNfvTDM/2XvRB+vuPLurI=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=

+ 79 - 0
field_sync_1/init.go

@@ -0,0 +1,79 @@
+package main
+
+import (
+	"field_sync/config"
+
+	elastic "app.yhyue.com/moapp/jybase/es"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+)
+
+// InitLog @Description
+// @Author J 2022/7/26 15:30
+// func InitLog() {
+// 	logcfg := config.Conf.Log
+
+// 	err := log.InitLog(
+// 		log.Path(logcfg.LogPath),
+// 		log.Level(logcfg.LogLevel),
+// 		log.Compress(logcfg.Compress),
+// 		log.MaxSize(logcfg.MaxSize),
+// 		log.MaxBackups(logcfg.MaxBackups),
+// 		log.MaxAge(logcfg.MaxAge),
+// 		log.Format(logcfg.Format),
+// 	)
+// 	if err != nil {
+// 		fmt.Printf("InitLog failed: %v\n", err)
+// 		os.Exit(1)
+// 	}
+// }
+
+func InitMgo() {
+	MgoB = &mongodb.MongodbSim{
+		MongodbAddr: config.Conf.DB.MongoB.Addr,
+		DbName:      config.Conf.DB.MongoB.Dbname,
+		Size:        config.Conf.DB.MongoB.Size,
+		UserName:    config.Conf.DB.MongoB.User,
+		Password:    config.Conf.DB.MongoB.Password,
+	}
+	MgoB.InitPool()
+
+	MgoBP = &mongodb.MongodbSim{
+		MongodbAddr: config.Conf.DB.MongoB.Addr,
+		DbName:      "qfw",
+		Size:        config.Conf.DB.MongoB.Size,
+		UserName:    config.Conf.DB.MongoB.User,
+		Password:    config.Conf.DB.MongoB.Password,
+	}
+	MgoBP.InitPool()
+
+	MgoE = &mongodb.MongodbSim{
+		MongodbAddr: config.Conf.DB.MongoE.Addr,
+		DbName:      config.Conf.DB.MongoE.Dbname,
+		Size:        config.Conf.DB.MongoE.Size,
+		UserName:    config.Conf.DB.MongoE.User,
+		Password:    config.Conf.DB.MongoE.Password,
+	}
+	MgoE.InitPool()
+
+	MgoQ = &mongodb.MongodbSim{
+		MongodbAddr: config.Conf.DB.MongoQ.Addr,
+		DbName:      config.Conf.DB.MongoQ.Dbname,
+		Size:        config.Conf.DB.MongoQ.Size,
+		UserName:    config.Conf.DB.MongoQ.User,
+		Password:    config.Conf.DB.MongoQ.Password,
+	}
+	MgoQ.InitPool()
+
+	MgoP = &mongodb.MongodbSim{
+		MongodbAddr: config.Conf.DB.MongoP.Addr,
+		DbName:      config.Conf.DB.MongoP.Dbname,
+		Size:        config.Conf.DB.MongoP.Size,
+		UserName:    config.Conf.DB.MongoP.User,
+		Password:    config.Conf.DB.MongoP.Password,
+	}
+	MgoP.InitPool()
+}
+
+func InitEs() {
+	Es = elastic.NewEs("v7", config.Conf.DB.Es.Addr, 20, config.Conf.DB.Es.User, config.Conf.DB.Es.Password)
+}

+ 121 - 0
field_sync_1/jykeyword.go

@@ -0,0 +1,121 @@
+package main
+
+import (
+	"encoding/json"
+	"field_sync/config"
+	"log"
+	"regexp"
+	"strings"
+	"time"
+
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mfw"
+)
+
+var (
+	client   *mfw.Client
+	reg      = regexp.MustCompile("^[0-9a-zA-Z-.]+$")
+	regNo    = regexp.MustCompile("^[0-9]*$")
+	regSpace = regexp.MustCompile("(?ism)(<style.*?>.*?</style>)|([.#]?\\w{1,20}\\{.*?\\})|(<.*?>)|(\\\\t)+|\\t|( +)|( +)|(" + string(rune(160)) + "+)")
+	regRow   = regexp.MustCompile("(?i)<(tr|div|p)[^>]*?>|(\\n)+")
+	regDh    = regexp.MustCompile("[,]+")
+	regNewDb = regexp.MustCompile("([:,、:,。.;])[,]")
+	DesLen   = 120
+)
+
+func inits() {
+	cf := &mfw.ClientConfig{
+		ClientName:      "剑鱼抽关键词",
+		EventHandler:    func(p *mfw.Packet) {},
+		MsgServerAddr:   config.Conf.Serve.MsgAddr,
+		CanHandleEvents: []int{},
+		OnConnectSuccess: func() {
+			log.Println("剑鱼关键词 client")
+		},
+		ReadBufferSize:  10,
+		WriteBufferSize: 10,
+	}
+	client, _ = mfw.NewClient(cf)
+}
+
+var keypool = make(chan bool, 1)
+
+func DealInfo(obj, update *map[string]interface{}) {
+	defer util.Catch()
+	if (*obj)["keywords"] != nil && (*obj)["description"] != nil {
+		return
+	} else {
+		(*update)["keywords"] = ""
+		(*update)["description"] = ""
+	}
+	title := util.ObjToString((*obj)["title"])
+	var m [][]string
+	select {
+	case <-func() <-chan bool {
+		ch := make(chan bool, 1)
+		go func(chan bool) {
+			select {
+			case keypool <- true:
+				defer func() {
+					<-keypool
+				}()
+				ret, _ := client.Call("", mfw.UUID(8), 4010, mfw.SENDTO_TYPE_RAND_RECIVER, title, 1)
+				json.Unmarshal(ret, &m)
+			case <-time.After(10 * time.Millisecond):
+			}
+			ch <- true
+		}(ch)
+		return ch
+	}():
+	case <-time.After(40 * time.Millisecond):
+	}
+	arr := []string{}
+	keyword := []string{}
+	keywordnew := []string{}
+	for _, tmp := range m {
+		if reg.MatchString(tmp[0]) {
+			arr = append(arr, tmp[0])
+		} else {
+			if len(arr) > 0 {
+				str := strings.Join(arr, "")
+				keyword = append(keyword, str)
+				arr = []string{}
+			}
+			if len(tmp[0]) > 3 && (strings.HasPrefix(tmp[1], "n") || tmp[1] == "v" || tmp[1] == "vn" || strings.HasPrefix(tmp[1], "g")) {
+				keyword = append(keyword, tmp[0])
+			}
+		}
+	}
+	for _, v := range keyword {
+		v = regNo.ReplaceAllString(v, "")
+		if len(v) > 0 {
+			keywordnew = append(keywordnew, v)
+		}
+	}
+	keywords := strings.Join(keywordnew, ",")
+	(*update)["keywords"] = keywords
+	content := ""
+	if (*obj)["detail_bak"] != nil {
+		content = util.ObjToString((*obj)["detail_bak"])
+	} else {
+		content = util.ObjToString((*obj)["detail"])
+	}
+	//内容替换
+	content = strings.Replace(content, " ", "", -1)
+	content = regSpace.ReplaceAllString(content, "")
+	content = regRow.ReplaceAllString(content, ",")
+	content = regDh.ReplaceAllString(content, ",")
+	content = regNewDb.ReplaceAllString(content, "$1")
+	if strings.HasPrefix(content, ",") {
+		content = content[1:]
+	}
+	tc := []rune(content)
+	ltc := len(tc)
+	description := content
+	if ltc > DesLen {
+		description = string(tc[:DesLen])
+	}
+	(*update)["description"] = description
+	//保存到数据库
+	return
+}

+ 73 - 0
field_sync_1/jylog.go

@@ -0,0 +1,73 @@
+package main
+
+/**
+日志文件自动切换,默认保留15天内日志
+**/
+
+import (
+	"log"
+	"os"
+	"path/filepath"
+	"regexp"
+	"time"
+
+	"github.com/go-xweb/xweb"
+	"github.com/robfig/cron"
+)
+
+// 日志格式
+var fileReg = regexp.MustCompile("^(\\d{4}_[0-9_]{14})\\.log$")
+
+// 当前日志文件句柄
+var LogFile *os.File
+
+// 时间格式
+var FMT = "2006_01_02_15_04_05"
+
+// 日志目录
+var LogPath = "./jylog"
+
+func init() {
+	os.Mkdir(LogPath, os.ModePerm)
+	//默认保留15天内的日志,-1为永久保留
+	initLog(15)
+}
+
+func initLog(saveDay int) {
+	go logfile()
+	task := cron.New()
+	task.Start()
+	task.AddFunc("0 0 0 * * ?", func() {
+		go logfile()
+		time.Sleep(50 * time.Second)
+		if saveDay > 0 {
+			filepath.Walk(LogPath, func(path string, info os.FileInfo, err error) error {
+				str := fileReg.FindStringSubmatch(info.Name())
+				if len(str) == 2 {
+					t, er := time.ParseInLocation(FMT, str[1], time.Local)
+					if er == nil {
+						if (time.Now().Unix()-t.Unix())/86400 > int64(saveDay) {
+							log.Println("delete log file:", path, os.Remove(path))
+						}
+					}
+				}
+				return nil
+			})
+		}
+	})
+}
+
+// 创建并切换输出文件
+func logfile() {
+	now := time.Now().Format(FMT)
+	file, _ := os.Create(LogPath + "/" + now + ".log")
+	log.SetOutput(file)
+	xweb.RootApp().Logger.SetOutput(file)
+	go func(file *os.File) {
+		time.Sleep(5 * time.Second)
+		if LogFile != nil {
+			LogFile.Close()
+		}
+		LogFile = file
+	}(file)
+}

+ 324 - 0
field_sync_1/main.go

@@ -0,0 +1,324 @@
+package main
+
+import (
+	"encoding/json"
+	"field_sync/config"
+
+	"field_sync/oss"
+	"fmt"
+	"io/ioutil"
+	"net"
+	"net/http"
+	"strings"
+	"sync"
+	"time"
+
+	"log"
+
+	elastic "app.yhyue.com/moapp/jybase/es"
+	"go.uber.org/zap"
+	"gopkg.in/mgo.v2/bson"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	gonsq "jygit.jydev.jianyu360.cn/data_processing/common_utils/nsq"
+
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/redis"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/udp"
+)
+
+var (
+	MgoB, MgoBP *mongodb.MongodbSim
+	MgoE        *mongodb.MongodbSim
+	MgoQ        *mongodb.MongodbSim // 企业
+	MgoP        *mongodb.MongodbSim // 凭安企业
+	Es          elastic.Es
+
+	UdpClient  udp.UdpClient
+	UdpTaskMap = &sync.Map{}
+
+	Mcmer *gonsq.Consumer
+
+	MgoBulkSize   = 200 // mgo批量保存大小
+	updateBidPool = make(chan []map[string]interface{}, 5000)
+	updateBidSp   = make(chan bool, 5)
+	updateExtPool = make(chan []map[string]interface{}, 5000)
+	updateExtSp   = make(chan bool, 5)
+)
+
+func init() {
+	config.Init("./common.toml")
+	oss.InitOss()
+	InitFileInfo()
+	// InitLog()
+	InitMgo()
+	// InitEs()
+	inits()
+	redis.InitRedis1(config.Conf.DB.Redis.Addr, config.Conf.DB.Redis.DbIndex)
+
+	log.Println("init success")
+}
+
+func main() {
+	// go checkMapJob()
+	// go nsqMethod()
+
+	// go UpdateBidding()
+	// go UpdateExtract()
+
+	// UdpClient = udp.UdpClient{Local: ":11876", BufSize: 1024}
+	// UdpClient.Listen(processUdpMsg)
+	// log.Println("Udp服务监听 port:", ":11876")
+
+	// info, _ := MgoBP.Find("bidding_processing_ids", `{"dataprocess_ai": 5}`, bson.M{"_id": 1}, nil, false, -1, -1)
+	// log.Println(len(*info))
+	// log.Println("size", len(*info))
+	// if len(*info) > 0 {
+	// 	for _, m := range *info {
+	// 		mapInfo := make(map[string]interface{})
+	// 		mapInfo["gtid"] = util.ObjToString(m["gtid"])
+	// 		mapInfo["lteid"] = util.ObjToString(m["lteid"])
+	// 		mapInfo["stype"] = "bidding"
+	// 		mapInfo["key"] = fmt.Sprintf("%s-%s-bidding", util.ObjToString(m["gtid"]), util.ObjToString(m["lteid"]))
+	// 		log.Println("--", mapInfo)
+	biddingAllTask()
+	// }
+	// }
+
+	// ch := make(chan bool, 1)
+	// <-ch
+}
+
+var pool = make(chan bool, 20)
+
+type UdpNode struct {
+	data      []byte
+	addr      *net.UDPAddr
+	timestamp int64
+	retry     int
+}
+
+func NextNode(mapInfo map[string]interface{}, stype string) {
+	var next = &net.UDPAddr{
+		IP:   net.ParseIP(config.Conf.Udp.Next.Addr),
+		Port: util.IntAll(config.Conf.Udp.Next.Port),
+	}
+	mapInfo["stype"] = stype
+	key := fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), stype)
+	mapInfo["key"] = key
+	log.Println("udp es node mapinfo:", mapInfo)
+	datas, _ := json.Marshal(mapInfo)
+	node := &UdpNode{datas, next, time.Now().Unix(), 0}
+	UdpTaskMap.Store(key, node)
+	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
+}
+
+func NextNodePro(mapInfo map[string]interface{}, stype string) {
+	var next = &net.UDPAddr{
+		IP:   net.ParseIP(config.Conf.Udp.Project.Addr),
+		Port: util.IntAll(config.Conf.Udp.Project.Port),
+	}
+	if stype == "bidding_history" {
+		mapInfo["stype"] = "project_history"
+	} else {
+		mapInfo["stype"] = "project"
+	}
+	key := fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
+	mapInfo["key"] = key
+	log.Println("udp project node mapinfo:", mapInfo)
+	datas, _ := json.Marshal(mapInfo)
+	node := &UdpNode{datas, next, time.Now().Unix(), 0}
+	UdpTaskMap.Store(key, node)
+	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
+}
+
+func NextNodeBidData(mapInfo map[string]interface{}) {
+	next := &net.UDPAddr{
+		IP:   net.ParseIP(config.Conf.Udp.Next.Addr),
+		Port: util.IntAll(config.Conf.Udp.Next.Port),
+	}
+	mapInfo["stype"] = "biddingdata"
+	mapInfo["key"] = fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
+	log.Println("udp es node mapinfo:", mapInfo)
+	datas, _ := json.Marshal(mapInfo)
+	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
+}
+
+func NextNodeTidbQyxy(mapInfo map[string]interface{}) {
+	next := &net.UDPAddr{
+		IP:   net.ParseIP(config.Conf.Udp.Tidb.Addr),
+		Port: util.IntAll(config.Conf.Udp.Tidb.Port),
+	}
+	mapInfo["stype"] = config.Conf.Udp.Tidb.Stype
+	mapInfo["key"] = fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
+	log.Println("udp tidb-qyxy node mapinfo:", mapInfo)
+	datas, _ := json.Marshal(mapInfo)
+	node := &UdpNode{datas, next, time.Now().Unix(), 0}
+	UdpTaskMap.Store(mapInfo["key"], node)
+	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
+}
+
+func NextNodeTidb(mapInfo map[string]interface{}, stype string) {
+	next := &net.UDPAddr{
+		IP:   net.ParseIP(config.Conf.Udp.Tidb1.Addr),
+		Port: util.IntAll(config.Conf.Udp.Tidb1.Port),
+	}
+	mapInfo["stype"] = stype
+	mapInfo["key"] = fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
+	log.Println("udp tidb-bidding node mapinfo:", mapInfo)
+	datas, _ := json.Marshal(mapInfo)
+	node := &UdpNode{datas, next, time.Now().Unix(), 0}
+	UdpTaskMap.Store(mapInfo["key"], node)
+	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
+}
+
+// NextNodeHn @Description 郑坤 海南数据处理
+// @Author J 2022/10/28 09:26
+func NextNodeHn(mapInfo map[string]interface{}) {
+	next := &net.UDPAddr{
+		IP:   net.ParseIP(config.Conf.Udp.Tidb2.Addr),
+		Port: util.IntAll(config.Conf.Udp.Tidb2.Port),
+	}
+	mapInfo["stype"] = "hainan"
+	mapInfo["key"] = fmt.Sprintf("%s-%s-%s", util.ObjToString(mapInfo["gtid"]), util.ObjToString(mapInfo["lteid"]), util.ObjToString(mapInfo["stype"]))
+	log.Println("NextNodeTidb mapinfo:", mapInfo)
+	datas, _ := json.Marshal(mapInfo)
+	node := &UdpNode{datas, next, time.Now().Unix(), 0}
+	UdpTaskMap.Store(mapInfo["key"], node)
+	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
+}
+
+func UpdateBidding() {
+	arru := make([][]map[string]interface{}, MgoBulkSize)
+	indexu := 0
+	for {
+		select {
+		case v := <-updateBidPool:
+			arru[indexu] = v
+			indexu++
+			if indexu == MgoBulkSize {
+				// updateBidSp <- true
+				// go func(arru [][]map[string]interface{}) {
+				// defer func() {
+
+				// }()
+				MgoB.UpdateBulk(config.Conf.DB.MongoB.Coll, arru...)
+				// <-updateBidSp
+				// }(arru)
+				arru = make([][]map[string]interface{}, MgoBulkSize)
+				indexu = 0
+			}
+		case <-time.After(1000 * time.Millisecond):
+			if indexu > 0 {
+				// updateBidSp <- true
+				// go func(arru [][]map[string]interface{}) {
+				// 	defer func() {
+				// 		<-updateBidSp
+				// 	}()
+				MgoB.UpdateBulk(config.Conf.DB.MongoB.Coll, arru[:indexu]...)
+				// }(arru[:indexu])
+				arru = make([][]map[string]interface{}, MgoBulkSize)
+				indexu = 0
+			}
+		}
+	}
+}
+
+func UpdateExtract() {
+	arru := make([][]map[string]interface{}, MgoBulkSize)
+	indexu := 0
+	for {
+		select {
+		case v := <-updateExtPool:
+			arru[indexu] = v
+			indexu++
+			if indexu == MgoBulkSize {
+				updateExtSp <- true
+				go func(arru [][]map[string]interface{}) {
+					defer func() {
+						<-updateExtSp
+					}()
+					MgoE.UpdateBulk(config.Conf.DB.MongoE.Coll, arru...)
+				}(arru)
+				arru = make([][]map[string]interface{}, MgoBulkSize)
+				indexu = 0
+			}
+		case <-time.After(1000 * time.Millisecond):
+			if indexu > 0 {
+				updateExtSp <- true
+				go func(arru [][]map[string]interface{}) {
+					defer func() {
+						<-updateExtSp
+					}()
+					MgoE.UpdateBulk(config.Conf.DB.MongoE.Coll, arru...)
+				}(arru[:indexu])
+				arru = make([][]map[string]interface{}, MgoBulkSize)
+				indexu = 0
+			}
+		}
+	}
+}
+
+func checkMapJob() {
+	if config.Conf.Mail.Send {
+		log.Println("checkMapJob to:", config.Conf.Mail.To)
+		for {
+			UdpTaskMap.Range(func(k, v interface{}) bool {
+				now := time.Now().Unix()
+				node, _ := v.(*UdpNode)
+				if now-node.timestamp > 120 {
+					node.retry++
+					if node.retry > 5 {
+						UdpTaskMap.Delete(k)
+						res, err := http.Get(fmt.Sprintf("%s?to=%s&title=%s&body=%s", config.Conf.Mail.Api, config.Conf.Mail.To, "field-sync-send-fail", k.(string)))
+						if err == nil {
+							defer res.Body.Close()
+							read, err := ioutil.ReadAll(res.Body)
+							log.Println("send mail ... r:", string(read), "err:", err)
+						}
+					} else {
+						log.Println("udp重发", zap.Any("k:", k))
+						//UdpClient.WriteUdp(node.data, udp.OP_TYPE_DATA, node.addr)
+					}
+				} else if now-node.timestamp > 10 {
+					log.Println("udp任务超时中.. k:", k)
+				}
+				return true
+			})
+			time.Sleep(60 * time.Second)
+		}
+	}
+}
+
+// @Description nsq处理id不变,内容替换的竞品数据
+// @Author J 2022/8/10 11:40
+func nsqMethod() {
+	var err error
+	Mcmer, err = gonsq.NewConsumer(&gonsq.Cconfig{
+		IsJsonEncode: true, //与生产者配置对应,设为true会取第1个字节进行类型判断
+		Addr:         config.Conf.Nsq.Addr,
+		ConnectType:  0, //默认连接nsqd
+		Topic:        config.Conf.Nsq.Topic,
+		Channel:      config.Conf.Nsq.Channel,
+		Concurrent:   config.Conf.Nsq.Concurrent, //并发数
+	})
+	if err != nil {
+		log.Println("nsqMethod err", err)
+	}
+	for {
+		select {
+		case obj := <-Mcmer.Ch: //从通道读取即可
+			objstr := util.ObjToString(obj)
+			log.Println("obj ", obj, objstr)
+			id := strings.Split(objstr, "=")
+			if len(id) > 1 {
+				if bson.IsObjectIdHex(id[1]) {
+					taskinfo(id[1])
+				} else {
+					log.Println("jy nsq id err id", objstr)
+				}
+			} else {
+				log.Println("jy nsq id err id", objstr)
+			}
+		}
+	}
+}

+ 65 - 0
field_sync_1/oss/ossclient.go

@@ -0,0 +1,65 @@
+package oss
+
+import (
+	"fmt"
+	"github.com/aliyun/aliyun-oss-go-sdk/oss"
+	"io/ioutil"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"os"
+)
+
+var (
+	ossEndpoint        = "oss-cn-beijing-internal.aliyuncs.com" //正式环境用:oss-cn-beijing-internal.aliyuncs.com 测试:oss-cn-beijing.aliyuncs.com
+	ossAccessKeyId     = "LTAI4G5x9aoZx8dDamQ7vfZi"
+	ossAccessKeySecret = "Bk98FsbPYXcJe72n1bG3Ssf73acuNh"
+	ossBucketName      = "topjy"
+	ossclient          *oss.Client
+)
+
+func InitOss() {
+	client, err := oss.New(ossEndpoint, ossAccessKeyId, ossAccessKeySecret)
+	if err != nil {
+		fmt.Println("Error:", err)
+		os.Exit(-1)
+	}
+	ossclient = client
+}
+
+func OssGetObject(objectName string) string {
+	util.Catch()
+	// 获取存储空间。
+	bucket, err := ossclient.Bucket(ossBucketName)
+	if err != nil {
+		fmt.Println("Error:", err)
+		return ""
+	}
+
+	// 下载文件到流。
+	body, err := bucket.GetObject(objectName)
+	if err != nil {
+		fmt.Println("Error:", err)
+		return ""
+	}
+	defer body.Close()
+	data, err := ioutil.ReadAll(body)
+	if err != nil {
+		fmt.Println("Error:", err)
+		return ""
+	}
+	return string(data)
+}
+
+func OssObjExists(bname, fid string) bool {
+	util.Catch()
+	// 获取存储空间。
+	bucket, err := ossclient.Bucket(bname)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	// 判断文件是否存在。
+	isExist, err := bucket.IsObjectExist(fid)
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+	return isExist
+}

+ 982 - 0
field_sync_1/task.go

@@ -0,0 +1,982 @@
+package main
+
+import (
+	"encoding/json"
+	"field_sync/config"
+	"field_sync/oss"
+	"fmt"
+	"net"
+	"reflect"
+	"regexp"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+
+	"log"
+
+	// "go.mongodb.org/mongo-driver/bson"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/redis"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/udp"
+)
+
+var (
+	regLetter  = regexp.MustCompile("[a-z]*")
+	cityEndReg = regexp.MustCompile("(区|县|市)$")
+)
+
+func biddingTask(data []byte, mapInfo map[string]interface{}) {
+	defer util.Catch()
+
+	stype := util.ObjToString(mapInfo["stype"])
+
+	q, _ := mapInfo["query"].(map[string]interface{})
+	bkey, _ := mapInfo["bkey"].(string)
+	if q == nil {
+		q = map[string]interface{}{
+			"_id": map[string]interface{}{
+				"$gt":  mongodb.StringTOBsonId(mapInfo["gtid"].(string)),
+				"$lte": mongodb.StringTOBsonId(mapInfo["lteid"].(string)),
+			},
+		}
+	}
+	//extract库
+	extractConn := MgoE.GetMgoConn()
+	defer MgoE.DestoryMongoConn(extractConn)
+	extractResult := extractConn.DB(MgoE.DbName).C(config.Conf.DB.MongoE.Coll).Find(q).Select(map[string]interface{}{
+		"field_source": 0,
+		"kvtext":       0,
+	}).Sort("_id").Iter()
+	eMap := map[string]map[string]interface{}{}
+	extCount, repeatCount := 0, 0
+	for tmp := make(map[string]interface{}); extractResult.Next(tmp); extCount++ {
+		if util.IntAll(tmp["repeat"]) == 1 {
+			repeatCount++
+		}
+		tid := mongodb.BsonIdToSId(tmp["_id"])
+		eMap[tid] = tmp
+		tmp = make(map[string]interface{})
+	}
+	log.Println("抽取表 数据量", extCount, "重复数据量", repeatCount)
+
+	//bidding库
+	biddingConn := MgoB.GetMgoConn()
+	count, _ := biddingConn.DB(MgoB.DbName).C(config.Conf.DB.MongoB.Coll).Find(&q).Count()
+	log.Println("bidding表 同步总数:", count)
+	c := 0
+	if count < 500000 {
+		var res []map[string]interface{}
+		result := biddingConn.DB(MgoB.DbName).C(config.Conf.DB.MongoB.Coll).Find(q).Select(map[string]interface{}{
+			"contenthtml": 0,
+		}).Iter()
+		for tmp := make(map[string]interface{}); result.Next(tmp); {
+			res = append(res, tmp)
+			tmp = make(map[string]interface{})
+		}
+		MgoB.DestoryMongoConn(biddingConn)
+		log.Println("查询结果 bidding", count, "抽取:", extCount)
+		c = doIndex(res, eMap, bkey, stype)
+	} else {
+		log.Println("查询结果 数据量太大,放弃", count)
+		MgoB.DestoryMongoConn(biddingConn)
+	}
+	log.Println("bidding sync...over all", count, "extract sync ", c)
+	// NextNode(mapInfo, stype)
+	// NextNodePro(mapInfo, stype)
+	// NextNodeTidb(mapInfo, stype)
+	// if stype == "bidding_history" {
+	// NextNodeBidData(mapInfo) // bidding-data数据
+	// NextNodeTidbQyxy(mapInfo) // tidb-企业数据
+	// NextNodeHn(mapInfo)
+	// }
+	// if stype == "bidding" {
+	// 	uq := bson.M{"gtid": util.ObjToString(mapInfo["gtid"]), "lteid": util.ObjToString(mapInfo["lteid"])}
+	// 	MgoBP.Update("bidding_processing_ids", uq, bson.M{"$set": bson.M{"dataprocess_ai": 6, "updatetime": time.Now().Unix()}}, false, true)
+	// }
+	//领域标签处理的数据 id段
+	// if stype == "bidding_history" {
+	// 	MgoB.Save("field_data_record", map[string]interface{}{"gtid": mapInfo["gtid"], "lteid": mapInfo["lteid"], "status": 0})
+	// }
+}
+
+func biddingAllTask() {
+	defer util.Catch()
+	// q, _ := mapInfo["query"].(map[string]interface{})
+	// if q == nil {
+	q := map[string]interface{}{
+		"site": "千里马", "comeintime": map[string]interface{}{"$gte": 1729483200},
+	}
+	// }
+	//extract库
+	// extractConn := MgoE.GetMgoConn()
+	// defer MgoE.DestoryMongoConn(extractConn)
+	// extractResult := extractConn.DB(MgoE.DbName).C(config.Conf.DB.MongoE.Coll1).Find(q).Select(map[string]interface{}{
+	// 	"field_source": 0,
+	// 	"kvtext":       0,
+	// }).Sort("-_id").Iter()
+
+	//bidding库
+	biddingConn := MgoB.GetMgoConn()
+	defer MgoB.DestoryMongoConn(biddingConn)
+	count := 0
+
+	// var compare map[string]interface{}
+	result := biddingConn.DB(MgoB.DbName).C(config.Conf.DB.MongoB.Coll).Find(q).Select(map[string]interface{}{
+		"contenthtml":  0,
+		"field_source": 0,
+	}).Sort("-_id").Iter()
+	for tmp := make(map[string]interface{}); result.Next(tmp); count++ {
+		update := map[string]interface{}{}
+		del := map[string]interface{}{} //记录extract没有值而bidding中有值的字段
+
+		//对比方法----------------
+		// for {
+		// if compare == nil {
+		// 	compare = make(map[string]interface{})
+		// 	if !extractResult.Next(compare) {
+		// 		break
+		// 	}
+		// }
+		tid := mongodb.BsonIdToSId(tmp["_id"])
+		log.Println("tid ", tid)
+		compares, _ := MgoE.FindById(config.Conf.DB.MongoE.Coll, tid, nil)
+
+		if compares != nil && len(*compares) > 0 {
+			compare := *compares
+			// cid := mongodb.BsonIdToSId(compare["_id"])
+			// if cid == tid {
+			// if compare["history_updatetime"] == nil { //extract中history_updatetime不存在跳过
+			// 	continue
+			// }
+			//更新bidding表;bidding表modifyinfo中的字段不更新
+			modifyinfo := make(map[string]bool)
+			if tmpmodifyinfo, ok := tmp["modifyinfo"].(map[string]interface{}); ok && tmpmodifyinfo != nil {
+				for k := range tmpmodifyinfo {
+					modifyinfo[k] = true
+				}
+			}
+			for _, k := range config.Conf.Serve.FieldS {
+				v1 := compare[k] //extract
+				v2 := tmp[k]     //bidding
+				if v2 == nil && v1 != nil {
+					update[k] = v1
+				} else if v2 != nil && v1 != nil && !modifyinfo[k] {
+					update[k] = v1
+				} else if v2 != nil && v1 == nil && !modifyinfo[k] {
+					if k == "s_subscopeclass" && del["subscopeclass"] == nil {
+						continue
+					} else if k == "s_topscopeclass" && del["topscopeclass"] == nil {
+						continue
+					}
+					del[k] = 1
+					//util.Debug("抽取结果没有值,bidding有值:field--", k, del)
+				}
+			}
+			if util.IntAll(compare["repeat"]) == 1 {
+				update["extracttype"] = -1
+				update["dataprocess"] = 7
+				if compare["repeat_id"] != nil {
+					update["repeat_id"] = compare["repeat_id"]
+				}
+			} else {
+				update["extracttype"] = 1
+				update["dataprocess"] = 8
+			}
+			// break
+			// } else {
+			// 	if cid < tid {
+			// 		compare = nil
+			// 		continue
+			// 	} else {
+			// 		break
+			// 	}
+			// }
+			//------------------对比结束
+			//处理分类
+			// if compare != nil { //extract
+			fieldFun(compare, update)
+			// compare = nil
+			// }
+
+			// entidlist
+			// extractMap := make(map[string]interface{})
+			if update["s_winner"] != "" {
+				cid := companyFun(update)
+				if len(cid) > 0 {
+					update["entidlist"] = cid
+					// extractMap["entidlist"] = cid
+				}
+			}
+
+			// if len(extractMap) > 0 {
+			// 	updateExtPool <- []map[string]interface{}{
+			// 		{"_id": tmp["_id"]},
+			// 		{"$set": extractMap},
+			// 	}
+			// }
+			// 附件有效字段
+			if i := validFile(tmp); i != 0 {
+				if i == -1 {
+					update["isValidFile"] = false
+				} else {
+					update["isValidFile"] = true
+				}
+			}
+			if len(update) > 0 {
+				if len(del) > 0 { //删除的字段
+					// updateBidPool <- []map[string]interface{}{{
+					// 	"_id": tmp["_id"],
+					// },
+					// 	{"$set": update, "$unset": del},
+					// }
+					MgoB.UpdateById(config.Conf.DB.MongoB.Coll, tmp["_id"], map[string]interface{}{"$set": update, "$unset": del})
+				} else {
+					// updateBidPool <- []map[string]interface{}{{
+					// 	"_id": tmp["_id"],
+					// },
+					// 	{"$set": update},
+					// }
+					MgoB.UpdateById(config.Conf.DB.MongoB.Coll, tmp["_id"], map[string]interface{}{"$set": update})
+				}
+			}
+		} else {
+			continue
+		}
+		// }
+
+		if count%1000 == 0 {
+			log.Println("biddingTask current", count)
+		}
+		tmp = make(map[string]interface{})
+	}
+
+	log.Println("biddingAll sync...over all", count)
+}
+
+func doIndex(infos []map[string]interface{}, eMap map[string]map[string]interface{}, bkey, stype string) int {
+	syncNo := 0 //抽取表数据同步数量
+	//对比两张表数据,减少查询次数
+	var compare map[string]interface{}
+	var bidUpdate [][]map[string]interface{}
+	var extUpdate [][]map[string]interface{}
+	//SaveEsLock := &sync.Mutex{}
+	log.Println("start ...")
+	for n, tmp := range infos {
+		tid := mongodb.BsonIdToSId(tmp["_id"])
+		update := map[string]interface{}{} //要更新的mongo数据
+		del := map[string]interface{}{}
+		//对比方法----------------
+		if eMap[tid] != nil {
+			compare = eMap[tid]
+			// if stype == "bidding" {
+			// 	// 增量id段 正常数据
+			// 	if dg := util.IntAll(compare["dataging"]); dg == 1 { //extract中dataging=1跳过
+			// 		tmp = make(map[string]interface{})
+			// 		compare = nil
+			// 		continue
+			// 	}
+			// 	delete(eMap, tid)
+			// }
+			// if stype == "bidding_history" {
+			// 	//增量id段 历史数据
+			if compare["history_updatetime"] == nil { //extract中history_updatetime不存在跳过
+				tmp = make(map[string]interface{})
+				compare = nil
+				continue
+			}
+			delete(eMap, tid)
+			// }
+			syncNo++
+			log.Println("抽取区域 省", compare["area"], " 市 ", compare["city"], " 区 ", compare["district"], " id ", tid)
+			for _, k := range config.Conf.Serve.FieldS {
+				v1 := compare[k] //extract
+				v2 := tmp[k]     //bidding
+				if v2 == nil && v1 != nil {
+					update[k] = v1
+				} else if v2 != nil && v1 != nil {
+					update[k] = v1
+				} else if v2 != nil && v1 == nil {
+					if k == "s_subscopeclass" && del["subscopeclass"] == nil {
+						continue
+					} else if k == "s_topscopeclass" && del["topscopeclass"] == nil {
+						continue
+					} else if k == "city" || k == "district" {
+						update[k] = ""
+					} else {
+						del[k] = 1
+					}
+				}
+			}
+			// 附件重采,数据同步时不更新判重标识
+			if util.IntAll(compare["repeat"]) == 1 {
+				update["extracttype"] = -1
+				update["dataprocess"] = 7
+				if compare["repeat_id"] != nil {
+					update["repeat_id"] = compare["repeat_id"]
+				}
+			} else {
+				update["extracttype"] = 1
+				update["dataprocess"] = 8
+			}
+		} else {
+			compare = nil
+			if util.IntAll(tmp["dataging"]) == 1 { //修改未抽取的bidding数据的dataging
+				update["dataging"] = 0
+			}
+			update["dataprocess"] = 8
+		}
+		//下面可以多线程跑的--->
+		//处理分类
+		if compare != nil { //extract
+			fieldFun(compare, update)
+			// publishtime 20230523
+			if util.IntAll(tmp["publishtime"]) == -1 {
+				if pb := methodPb(compare); pb > 0 {
+					update["publishtime"] = pb
+				}
+			}
+			compare = nil
+		}
+		//------------------对比结束
+
+		//处理key descript
+		if bkey == "" {
+			DealInfo(&tmp, &update)
+		}
+		// entidlist
+		extractMap := make(map[string]interface{})
+		if update["s_winner"] != "" {
+			cid := companyFun(update)
+			if len(cid) > 0 {
+				tmp["entidlist"] = cid
+				update["entidlist"] = cid
+				extractMap["entidlist"] = cid
+			}
+		}
+
+		// 6.10 剑鱼发布信息分类处理, 写在这里是为了修改抽取表
+		typeFunc(tmp, update, extractMap)
+		if len(extractMap) > 0 {
+			if extractMap["toptype"] != nil && extractMap["subtype"] == nil {
+				extUpdate = append(extUpdate, []map[string]interface{}{
+					{"_id": tmp["_id"]},
+					{"$set": extractMap, "$unset": map[string]interface{}{"subtype": ""}},
+				})
+			} else {
+				extUpdate = append(extUpdate, []map[string]interface{}{
+					{"_id": tmp["_id"]},
+					{"$set": extractMap},
+				})
+			}
+			if len(extUpdate) >= MgoBulkSize {
+				tmps := extUpdate
+				MgoE.UpdateBulk(config.Conf.DB.MongoE.Coll, tmps...)
+				extUpdate = [][]map[string]interface{}{}
+			}
+		}
+		// 附件有效字段
+		if i := validFile(tmp); i != 0 {
+			if i == -1 {
+				tmp["isValidFile"] = false
+				update["isValidFile"] = false
+			} else {
+				tmp["isValidFile"] = true
+				update["isValidFile"] = true
+			}
+		}
+		// 2024-02-21 徐志恒 情报标签字段
+		toptype := util.ObjToString(tmp["toptype"])
+		subtype := util.ObjToString(tmp["subtype"])
+		buyerclass := util.ObjToString(tmp["buyerclass"])
+		if buyerclass != "" {
+			update["buyer_type"] = getStr(buyerclass)
+		}
+		s_topscopeclass := util.ObjToString(update["s_topscopeclass"])
+		if (tmp["tag_topinformation"] != nil && (subtype == "合同" || subtype == "中标" || subtype == "成交" || subtype == "采购意向" || toptype == "招标")) || (tmp["tag_topinformation"] == nil && toptype == "拟建" && strings.Contains(s_topscopeclass, "建筑工程")) {
+			update["tag_set"] = getTagSet(tmp, compare)
+		}
+		if len(update) > 0 {
+			log.Println("保存bidding区域 省", update["area"], " 市 ", update["city"], " 区 ", update["district"], " id ", tid)
+			if len(del) > 0 {
+				bidUpdate = append(bidUpdate, []map[string]interface{}{{
+					"_id": tmp["_id"],
+				},
+					{"$set": update, "$unset": del},
+				})
+			} else {
+				bidUpdate = append(bidUpdate, []map[string]interface{}{{
+					"_id": tmp["_id"],
+				},
+					{"$set": update},
+				})
+			}
+			if len(bidUpdate) >= MgoBulkSize {
+				tmps := bidUpdate
+				MgoB.UpdateBulk(config.Conf.DB.MongoB.Coll, tmps...)
+				bidUpdate = [][]map[string]interface{}{}
+			}
+		}
+		if n%500 == 0 {
+			log.Println("biddingTask current ", n)
+		}
+		tmp = make(map[string]interface{})
+	}
+	//SaveEsLock.Lock()
+	if len(bidUpdate) > 0 {
+		tmps := bidUpdate
+		MgoB.UpdateBulk(config.Conf.DB.MongoB.Coll, tmps...)
+		bidUpdate = [][]map[string]interface{}{}
+	}
+	if len(extUpdate) > 0 {
+		tmps := extUpdate
+		MgoE.UpdateBulk(config.Conf.DB.MongoE.Coll, tmps...)
+		extUpdate = [][]map[string]interface{}{}
+	}
+	//SaveEsLock.Unlock()
+	return syncNo
+}
+
+// @Description subscopeclass、topscopeclass、package
+// 20230523 多包处理 subpackage = 1
+// @Author J 2022/6/7 5:54 PM
+func fieldFun(compare, update map[string]interface{}) {
+	subscopeclass, _ := compare["subscopeclass"].([]interface{}) //subscopeclass
+	if subscopeclass != nil {
+		m1 := map[string]bool{}
+		newclass := []string{}
+		for _, sc := range subscopeclass {
+			sclass, _ := sc.(string)
+			if !m1[sclass] {
+				m1[sclass] = true
+				newclass = append(newclass, sclass)
+			}
+		}
+		update["s_subscopeclass"] = strings.Join(newclass, ",")
+		update["subscopeclass"] = newclass
+	}
+	topscopeclass, _ := compare["topscopeclass"].([]interface{}) //topscopeclass
+	if topscopeclass != nil {
+		m2 := map[string]bool{}
+		newclass := []string{}
+		for _, tc := range topscopeclass {
+			tclass, _ := tc.(string)
+			tclass = regLetter.ReplaceAllString(tclass, "") // 去除字母
+			if !m2[tclass] {
+				m2[tclass] = true
+				newclass = append(newclass, tclass)
+			}
+		}
+		update["topscopeclass"] = topscopeclass
+		update["s_topscopeclass"] = strings.Join(newclass, ",")
+	}
+	if package1 := compare["package"]; package1 != nil {
+		packageM, _ := package1.(map[string]interface{})
+		update["package"] = packageM
+		for _, p := range packageM {
+			pm, _ := p.(map[string]interface{})
+			if util.ObjToString(pm["winner"]) != "" || util.Float64All(pm["budget"]) > 0 ||
+				util.Float64All(pm["bidamount"]) > 0 {
+				update["multipackage"] = 1
+				break
+			}
+		}
+	} else {
+		update["multipackage"] = 0
+	}
+
+	// subpackage
+	if compare["package"] != nil && compare["s_winner"] != nil && compare["bidamount"] != nil {
+		pg := compare["package"].(map[string]interface{})
+		if len(pg) > 1 {
+			var bmt []float64
+			var swn []string
+			for _, p := range pg {
+				p1 := p.(map[string]interface{})
+				if p1["bidamount"] != nil {
+					bmt = append(bmt, util.Float64All(p1["bidamount"]))
+				}
+				if w := util.ObjToString(p1["winner"]); w != "" {
+					swn = append(swn)
+				}
+			}
+
+			if len(bmt) > 1 && len(swn) > 1 {
+				sn := strings.Split(util.ObjToString(compare["s_winner"]), ",")
+				sort.Strings(sn)
+				sort.Strings(swn)
+				swn1 := util.ObjArrToStringArr(Duplicate(swn)) // 去重
+				if strings.Join(swn1, ",") == strings.Join(sn, ",") {
+					bidamount := 0.0
+					for _, f := range bmt {
+						bidamount += f
+					}
+					if bidamount == util.Float64All(compare["bidamount"]) {
+						update["subpackage"] = 1
+					}
+				}
+			}
+
+		}
+	}
+}
+
+// @Description entidlist
+// @Author J 2022/6/7 2:36 PM
+func companyFun(tmp map[string]interface{}) (cid []string) {
+	sWinnerarr := strings.Split(util.ObjToString(tmp["s_winner"]), ",")
+	for _, w := range sWinnerarr {
+		if w != "" {
+			id := redis.GetStr("qyxy_id", w)
+			if id == "" {
+				ents, _ := MgoQ.Find(config.Conf.DB.MongoQ.Coll, map[string]interface{}{"company_name": w}, map[string]interface{}{"updatetime": -1}, map[string]interface{}{"company_name": 1}, false, -1, -1)
+				if len(*ents) > 0 {
+					id = util.ObjToString((*ents)[0]["_id"])
+					redis.PutCKV("qyxy_id", w, id)
+				} else {
+					ent, _ := MgoP.FindOne(config.Conf.DB.MongoP.Coll, map[string]interface{}{"history_name": w})
+					if len(*ent) > 0 {
+						id = util.ObjToString((*ent)["company_id"])
+						redis.PutCKV("qyxy_id", w, id)
+					}
+				}
+			}
+			if id == "" {
+				id = "-"
+			}
+			cid = append(cid, id)
+		}
+	}
+	return cid
+}
+
+// @Description update 修改bidding表,extractM修改抽取表
+// @Author J 2022/6/10 10:29 AM
+func typeFunc(tmp, update, extractM map[string]interface{}) {
+	if jyData, ok := tmp["jyfb_data"].(map[string]interface{}); ok {
+		if t := util.ObjToString(jyData["type"]); t != "" {
+			switch t {
+			//case "采购信息":
+			case "招标公告":
+				if util.ObjToString(tmp["toptype"]) != "招标" {
+					update["toptype"] = "招标"
+					extractM["toptype"] = "招标"
+					delete(update, "subtype")
+				}
+			case "采购意向":
+				if util.ObjToString(tmp["toptype"]) != "采购意向" {
+					update["toptype"] = "采购意向"
+					update["subtype"] = "采购意向"
+					extractM["toptype"] = "采购意向"
+					extractM["subtype"] = "采购意向"
+				}
+			case "招标预告":
+				if util.ObjToString(tmp["toptype"]) != "预告" {
+					update["toptype"] = "预告"
+					extractM["toptype"] = "预告"
+					delete(update, "subtype")
+				}
+			case "招标结果":
+				if util.ObjToString(tmp["toptype"]) != "结果" {
+					update["toptype"] = "结果"
+					extractM["toptype"] = "结果"
+					delete(update, "subtype")
+				}
+			}
+		}
+	}
+}
+
+// @Description 附件有效字段(isValidFile)
+// @Author J 2022/7/8 14:41
+func validFile(tmp map[string]interface{}) int {
+	isContinue := false
+	if pinfo, o := tmp["projectinfo"].(map[string]interface{}); o {
+		if atts, o1 := pinfo["attachments"].(map[string]interface{}); o1 {
+			for _, att := range atts {
+				if att == nil {
+					continue
+				}
+				if reflect.TypeOf(att).String() == "string" {
+					continue
+				}
+				att1 := att.(map[string]interface{})
+				if fid := util.ObjToString(att1["fid"]); fid != "" {
+					isContinue = true
+					break
+				}
+			}
+			if isContinue {
+				if attachTxt, o := tmp["attach_text"].(map[string]interface{}); o {
+					if len(attachTxt) > 0 {
+						for _, at := range attachTxt {
+							at1 := at.(map[string]interface{})
+							if len(at1) > 0 {
+								for k, _ := range at1 {
+									if reflect.TypeOf(at1[k]).String() == "string" {
+										continue
+									}
+									at2 := at1[k].(map[string]interface{})
+									s := strings.ToLower(util.ObjToString(at2["file_name"]))
+									if !strings.Contains(s, "jpg") || !strings.Contains(s, "jpeg") != strings.Contains(s, "png") ||
+										strings.Contains(s, "pdf") {
+										if strings.Contains(s, "swf") || strings.Contains(s, "html") {
+											return -1
+										} else if AnalysisFile(oss.OssGetObject(util.ObjToString(at2["attach_url"]))) {
+											return 1
+										}
+									}
+								}
+								break
+							} else {
+								break
+							}
+						}
+					}
+				}
+				flag := false
+				for _, att := range atts {
+					if att == nil {
+						continue
+					}
+					if reflect.TypeOf(att).String() == "string" {
+						continue
+					}
+					att1 := att.(map[string]interface{})
+					if fid := util.ObjToString(att1["fid"]); fid != "" {
+						ftype := strings.ToLower(util.ObjToString(tmp["ftype"]))
+						if ftype != "swf" && ftype != "html" && oss.OssObjExists("jy-datafile", fid) {
+							return 1
+						} else {
+							flag = true
+						}
+					}
+				}
+				if flag {
+					return -1
+				}
+			}
+		}
+	}
+	return 0
+}
+
+// @Description id不变,内容变化 重新索引数据
+// @Author J 2022/8/10 13:29
+func taskinfo(id string) {
+	tmp, _ := MgoB.FindById("bidding", id, nil)
+	if tmp == nil || len(*tmp) == 0 {
+		log.Println(fmt.Sprintf("taskinfo bidding id=%s 未查询到数据", id))
+		return
+	}
+	extractM, _ := MgoE.FindById(config.Conf.DB.MongoE.Coll, id, nil)
+	if extractM == nil || len(*extractM) == 0 {
+		extractM, _ = MgoE.FindById(config.Conf.DB.MongoE.Coll1, id, nil)
+		if extractM == nil || len(*extractM) == 0 {
+			log.Println(fmt.Sprintf("taskinfo extract id=%s 未查询到数据", id))
+			return
+		}
+	}
+	update := map[string]interface{}{} //要更新的mongo数据
+	//更新bidding表字段
+	for _, k := range config.Conf.Serve.FieldS {
+		v1 := (*extractM)[k] //extract
+		v2 := (*tmp)[k]      //bidding
+		if v2 == nil && v1 != nil {
+			update[k] = v1
+		} else if v2 != nil && v1 != nil {
+			update[k] = v1
+		} else if v2 != nil && v1 == nil {
+			if k == "city" || k == "district" {
+				update[k] = ""
+			}
+		}
+	}
+	if util.IntAll((*extractM)["repeat"]) == 1 {
+		update["extracttype"] = -1
+		update["dataprocess"] = 7
+		if (*extractM)["repeat_id"] != nil {
+			update["repeat_id"] = (*extractM)["repeat_id"]
+		}
+	} else {
+		update["extracttype"] = 1
+		update["dataprocess"] = 8
+	}
+	//处理分类
+	fieldFun(*extractM, update)
+
+	extractMap := make(map[string]interface{})
+	if util.ObjToString((*tmp)["s_winner"]) != "" {
+		cid := companyFun(*tmp)
+		if len(cid) > 0 {
+			update["entidlist"] = cid
+			extractMap["entidlist"] = cid
+		}
+		MgoE.UpdateById(config.Conf.DB.MongoE.Coll, id, map[string]interface{}{"$set": extractMap})
+	}
+
+	// 附件有效字段
+	if i := validFile(*tmp); i != 0 {
+		if i == -1 {
+			update["isValidFile"] = false
+		} else {
+			update["isValidFile"] = true
+		}
+	}
+	if len(update) > 0 {
+		MgoB.UpdateById(config.Conf.DB.MongoB.Coll, id, map[string]interface{}{"$set": update})
+	}
+
+	mapinfo := map[string]interface{}{
+		"infoid": id,
+		"stype":  "index-by-id",
+	}
+	datas, _ := json.Marshal(mapinfo)
+	var next = &net.UDPAddr{
+		IP:   net.ParseIP(config.Conf.Udp.Next.Addr),
+		Port: util.IntAll(config.Conf.Udp.Next.Port),
+	}
+	log.Println("nsq data over es ", next, " mapinfo ", string(datas))
+	_ = UdpClient.WriteUdp(datas, udp.OP_TYPE_DATA, next)
+}
+
+var DateTimeSelect = []string{"bidopentime", "bidendtime", "signaturedate", "comeintime"}
+
+// @Description 发布时间处理
+// @Author J 2023/5/23 14:32
+func methodPb(tmp map[string]interface{}) int64 {
+	if tmp["ext_publishtime"] != nil {
+		if newPb := util.Int64All(tmp["ext_publishtime"]); newPb < time.Now().Unix() && newPb > 1420041600 {
+			return newPb
+		}
+	}
+	for _, d := range DateTimeSelect {
+		if tmp[d] != nil && util.Int64All(tmp[d]) < time.Now().Unix() {
+			return util.Int64All(tmp[d])
+		}
+	}
+	return 0
+}
+
+// Duplicate
+// @Description 去重
+// @Author J 2023/5/24 09:53
+func Duplicate(a interface{}) (ret []interface{}) {
+	va := reflect.ValueOf(a)
+	for i := 0; i < va.Len(); i++ {
+		if i > 0 && reflect.DeepEqual(va.Index(i-1).Interface(), va.Index(i).Interface()) {
+			continue
+		}
+		ret = append(ret, va.Index(i).Interface())
+	}
+	return ret
+}
+
+// @Description 获取情报标签
+// @Author 徐志恒 2024/2/21 09:53
+func getTagSet(tmp, compare map[string]interface{}) map[string]map[string]interface{} {
+	tagSet := map[string]map[string]interface{}{}
+	wuye := map[string]interface{}{}
+	buyer := util.ObjToString(compare["buyer"])
+	publishtime := util.Int64All(tmp["publishtime"])
+	bidamount := util.Float64All(compare["bidamount"])
+	toptype := util.ObjToString(tmp["toptype"])
+	subtype := util.ObjToString(tmp["subtype"])
+	if subtype == "合同" {
+		wuye["isfirsthand"] = 62
+		if buyer != "" {
+			sql := `{
+			"query": {
+			 "bool": {
+			   "must": [
+			     {
+			       "term": {
+			         "buyer": "` + buyer + `"
+			       }
+			     },
+			     {
+			       "term": {
+			         "tag_topinformation": "情报_物业"
+			       }
+			     },
+				 {
+			       "term": {
+			         "subtype": "合同"
+			       }
+			     },
+			     {
+			       "range": {
+			         "publishtime": {
+			           "lte": ` + fmt.Sprint(publishtime) + `
+			         }
+			       }
+			     }
+			   ]
+			 }
+			},
+			  "sort": {
+			    "publishtime": "asc"
+			  },
+			  "_source": [
+			    "s_winner"
+			  ],
+			  "size":  10000
+		}`
+			data := Es.Get("bidding", "bidding", sql)
+			if data != nil && len(*data) > 0 {
+				count := 0
+				first := util.ObjToString((*data)[0]["s_winner"])
+				for k, v := range *data {
+					winner := util.ObjToString(v["s_winner"])
+					if k > 0 && first != winner {
+						first = winner
+						count++
+					}
+				}
+				changehand := fmt.Sprintf("%.2f", float64(count)/float64(len(*data)))
+				changehands, _ := strconv.ParseFloat(changehand, 64)
+				wuye["changehand"] = changehands
+				if changehands > 0.3 {
+					wuye["changehandindex"] = 61
+				}
+				if len(*data) > 1 {
+					wuye["isfirsthand"] = 0
+				}
+			}
+		}
+		wuye["period"] = getperiod(compare)
+	} else if toptype == "招标" || toptype == "采购意向" {
+		bidamount = util.Float64All(compare["budget"])
+	}
+	if tmp["projectinfo"] != nil {
+		projectInfo := util.ObjToMap(tmp["projectinfo"])
+		if projectInfo != nil && len(*projectInfo) > 0 {
+			if (*projectInfo)["attachments"] != nil {
+				wuye["isfile"] = 63
+			}
+		}
+	}
+	wuye["scale"] = getBidamountRange(bidamount)
+	if tmp["property_form"] != nil {
+		property_form := util.ObjArrToStringArr(tmp["property_form"].([]interface{}))
+		wuye["property_form"] = getpropertyform(property_form)
+	}
+	tagSet["wuye"] = wuye
+	return tagSet
+}
+
+func getBidamountRange(value float64) int {
+	switch {
+	case value < 500000:
+		return 1
+	case value >= 500000 && value < 1000000:
+		return 2
+	case value >= 1000000 && value < 2000000:
+		return 3
+	case value >= 2000000 && value < 5000000:
+		return 4
+	default:
+		return 5
+	}
+}
+
+func getpropertyform(value []string) string {
+	arr := []string{}
+	categories := map[string]string{
+		"住宅":    "21",
+		"政府办公楼": "22",
+		"学校":    "23",
+		"医院":    "24",
+		"产业园区":  "25",
+		"旅游景区":  "26",
+		"交通运输":  "27",
+		"商务办公楼": "28",
+		"酒店":    "29",
+	}
+	for _, v := range value {
+		if categories[v] != "" {
+			arr = append(arr, categories[v])
+		}
+	}
+	return strings.Join(arr, ",")
+}
+
+func getperiod(data map[string]interface{}) int {
+	res := 16
+	signaturedate := util.Int64All(data["signaturedate"]) //合同签订日期
+	expiredate := util.Int64All(data["expiredate"])       //合同截止日期
+	// contractperiod := util.ObjToString(data["contractperiod"])     //合同期限
+	project_duration := util.IntAll(data["project_duration"])      //工期时长
+	project_timeunit := util.ObjToString(data["project_timeunit"]) //工期单位
+	result := float64(0)
+	if expiredate > 0 && signaturedate > 0 {
+		result = calculateYearDifference(signaturedate, expiredate)
+	} else if project_duration > 0 && project_timeunit != "" {
+		if strings.Contains(project_timeunit, "年") {
+			if project_duration == 1 {
+				res = 12
+			} else if project_duration == 2 {
+				res = 13
+			} else if project_duration == 3 {
+				res = 14
+			} else if project_duration == 5 {
+				res = 15
+			}
+			return res
+		} else if strings.Contains(project_timeunit, "月") {
+			result = float64(project_duration) / 12
+		} else if strings.Contains(project_timeunit, "周") {
+			result = float64(project_duration) * 7 / 365
+		} else if strings.Contains(project_timeunit, "日") || strings.Contains(project_timeunit, "天") {
+			result = float64(project_duration) / 365
+		}
+	}
+	if result == 0 {
+		res = 16
+	} else if result < 1 {
+		res = 11
+	} else if result >= 1 && result < 2 {
+		res = 12
+	} else if result >= 2 && result < 3 {
+		res = 13
+	} else if result >= 3 && result < 4 {
+		res = 14
+	} else if result >= 5 {
+		res = 15
+	}
+	return res
+}
+
+func calculateYearDifference(startTime int64, endTime int64) float64 {
+	start := time.Unix(startTime, 0)
+	end := time.Unix(endTime, 0)
+	duration := end.Sub(start)
+	years := duration.Hours() / 24 / 365
+	return years
+}
+
+func getStr(b string) string {
+	if b == "" {
+		return "其它"
+	}
+	a1 := "(交通|运输物流|工信|农业|住建|城管|市政|出版广电|检察院|科技|民政|生态环境|市场监管|水利|应急管理|自然资源|财政|档案|党委办|组织|发改|宣传|政府办|政务中心|人大|政协|法院|公安|国资委|海关|机关事务|纪委|军队|人社|商务|审计税务|司法|体育|统计|统战|文旅|民宗|银保监|证监|气象|社会团体|公共资源交易)"
+	a2 := "(卫健委|医疗)"
+	a3 := "(教育|学校)"
+	a4 := "(人行|金融业)"
+	a5 := "(信息技术|电信行业|农林牧渔|建筑业|传媒|制造业|住宿餐饮|采矿业|能源化工|批发零售)"
+	if strings.Contains(a1, b) {
+		return "政府机构"
+	} else if strings.Contains(a2, b) {
+		return "医疗单位"
+	} else if strings.Contains(a3, b) {
+		return "教育单位"
+	} else if strings.Contains(a4, b) {
+		return "金融企业"
+	} else if strings.Contains(a5, b) {
+		return "商业公司"
+	} else {
+		return "其它"
+	}
+	return "其它"
+}

+ 1 - 1
monitor/main.go

@@ -95,7 +95,7 @@ func taskProject() {
 func SendMsg(content string) {
 	client := &http.Client{}
 	data := map[string]interface{}{"msgtype": "text", "text": map[string]interface{}{
-		"content": content, "mentioned_mobile_list": []string{"13373929153", "15090279371", "15639297172"},
+		"content": content, "mentioned_mobile_list": []string{"13373929153", "17639376639", "18530014520"},
 	}}
 	bytesData, _ := json.Marshal(data)
 	req, _ := http.NewRequest("POST", WebUrl, bytes.NewReader(bytesData))