소스 검색

Merge branch 'master' into hotfix/v4.8.53.1

lianbingjie 1 년 전
부모
커밋
330b3b5d98
92개의 변경된 파일6874개의 추가작업 그리고 733개의 파일을 삭제
  1. 6 2
      src/config.json
  2. 15 2
      src/db.json
  3. 3 1
      src/go.mod
  4. 6 2
      src/go.sum
  5. 15 0
      src/jfw/config/config.go
  6. 26 5
      src/jfw/filter/anonymousUser.go
  7. 2 1
      src/jfw/filter/filter.go
  8. 2 2
      src/jfw/front/classificationTag.go
  9. 64 10
      src/jfw/front/dataExport.go
  10. 18 0
      src/jfw/front/login.go
  11. 26 8
      src/jfw/front/searchOptimize.go
  12. 3 3
      src/jfw/front/ws_dataExport.go
  13. 19 0
      src/jfw/front/wx_dataExport.go
  14. 29 0
      src/jfw/jyutil/jyutil.go
  15. 72 17
      src/jfw/modules/app/src/app/front/dataExport.go
  16. 3 3
      src/jfw/modules/app/src/app/front/ws_dataExport.go
  17. 4 1
      src/jfw/modules/app/src/config.json
  18. 1 1
      src/jfw/modules/app/src/go.mod
  19. 2 2
      src/jfw/modules/app/src/go.sum
  20. 20 2
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js
  21. 9 1
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js
  22. 3 3
      src/jfw/modules/app/src/web/staticres/jyapp/dataExport/css/dataExport.css
  23. 7 1
      src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait.html
  24. 3 0
      src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html
  25. 345 41
      src/jfw/modules/app/src/web/templates/dataExport/dataExport.html
  26. 8 4
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_buyerEdit.html
  27. 8 3
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_buyerInput.html
  28. 8 1
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_winnerEdit.html
  29. 8 1
      src/jfw/modules/app/src/web/templates/dataExport/dataExport_winnerInput.html
  30. 3 0
      src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html
  31. 5 7
      src/jfw/modules/bigmember/src/entity/portrait_screen.go
  32. 13 1
      src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go
  33. 5 1
      src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go
  34. 14 9
      src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go
  35. 3 15
      src/jfw/modules/publicapply/src/enterpriseSearch/service/search.go
  36. 40 43
      src/jfw/modules/publicapply/src/go.mod
  37. 95 96
      src/jfw/modules/publicapply/src/go.sum
  38. 48 46
      src/jfw/modules/subscribepay/src/dataexport.json
  39. 1 1
      src/jfw/modules/subscribepay/src/entity/dataExportPackStruct.go
  40. 5 2
      src/jfw/modules/subscribepay/src/entity/dataexport.go
  41. 32 27
      src/jfw/modules/subscribepay/src/entity/order.go
  42. 25 27
      src/jfw/modules/subscribepay/src/entity/subscribeVip.go
  43. 2 2
      src/jfw/modules/subscribepay/src/go.mod
  44. 2 2
      src/jfw/modules/subscribepay/src/go.sum
  45. 121 0
      src/jfw/modules/subscribepay/src/pay/derivedCondition.go
  46. 160 7
      src/jfw/modules/subscribepay/src/pay/util.go
  47. 1 1
      src/jfw/modules/subscribepay/src/service/dataExportPay.go
  48. 105 2
      src/jfw/modules/subscribepay/src/service/dataexportPack.go
  49. 124 44
      src/jfw/modules/subscribepay/src/util/dataExportExcel.go
  50. 9 1
      src/web/staticres/big-member/js/unit_portrayal.js
  51. 19 1
      src/web/staticres/common-module/collection/js/ent_portrait.js
  52. 13 3
      src/web/staticres/common-module/collection/js/index-wx.js
  53. 13 3
      src/web/staticres/common-module/collection/js/index.js
  54. 162 0
      src/web/staticres/common-module/dataExport/components/popup-data-export.js
  55. 81 0
      src/web/staticres/common-module/dataExport/css/association.css
  56. 150 0
      src/web/staticres/common-module/dataExport/css/dataExportAppend.css
  57. 105 0
      src/web/staticres/common-module/dataExport/css/popup-data-export.css
  58. BIN
      src/web/staticres/common-module/dataExport/image/help.png
  59. BIN
      src/web/staticres/common-module/dataExport/image/right_corner.png
  60. 86 0
      src/web/staticres/common-module/dataExport/js/association.js
  61. 2429 0
      src/web/staticres/common-module/js/mapJSON.js
  62. 7 7
      src/web/staticres/css/dev2/biddingSearch.css
  63. 70 3
      src/web/staticres/css/dev2/newBidSearch.css
  64. 292 2
      src/web/staticres/dataExport/css/conditions.css
  65. 92 0
      src/web/staticres/dataExport/css/previewData.css
  66. 13 9
      src/web/staticres/dataExport/js/conditions_order.js
  67. 3 1
      src/web/staticres/dataExport/js/delbox.js
  68. 125 2
      src/web/staticres/frontRouter/pc/collection/css/index-pc.css
  69. 94 29
      src/web/staticres/frontRouter/pc/collection/js/index-pc.js
  70. BIN
      src/web/staticres/images/dataExport/choose_right.png
  71. BIN
      src/web/staticres/images/dataExport/close.png
  72. BIN
      src/web/staticres/images/dataExport/qr.png
  73. BIN
      src/web/staticres/images/right_corner.png
  74. 42 1
      src/web/staticres/js/biddingSearch.js
  75. 9 1
      src/web/staticres/js/ent-search-index-pc.js
  76. 1 0
      src/web/staticres/js/login.js
  77. 8 8
      src/web/staticres/js/superSearch.js
  78. 0 1
      src/web/staticres/public-pc/js/article-content.js
  79. 3 3
      src/web/staticres/wx_dataExport/css/dataExport.css
  80. 3 0
      src/web/templates/big-member/wx/page_unit_portrayal.html
  81. 24 1
      src/web/templates/frontRouter/pc/collection/sess/index.html
  82. 7 1
      src/web/templates/frontRouter/wx/collection/sess/ent_portrait.html
  83. 3 0
      src/web/templates/frontRouter/wx/collection/sess/index.html
  84. 748 21
      src/web/templates/pc/dataExport_sieve.html
  85. 1 1
      src/web/templates/pc/entsearchindex.html
  86. 326 156
      src/web/templates/pc/previewData.html
  87. 40 0
      src/web/templates/pc/supsearch.html
  88. 323 22
      src/web/templates/weixin/dataExport/dataExport.html
  89. 8 1
      src/web/templates/weixin/dataExport/dataExport_buyerEdit.html
  90. 8 1
      src/web/templates/weixin/dataExport/dataExport_buyerInput.html
  91. 9 2
      src/web/templates/weixin/dataExport/dataExport_winnerEdit.html
  92. 9 2
      src/web/templates/weixin/dataExport/dataExport_winnerInput.html

+ 6 - 2
src/config.json

@@ -447,5 +447,9 @@
   "wxBrowserContent": ["content","bdcontent","advancedProject"],
   "hotSubjectMatter": "A4纸,安全标志,安全挡板,安全隔离网,安全网,办公耗材,办公家具,办公设备,办公椅,办公用房,办公用品,办公桌,保护装置,保密柜,笔记本,笔记本电脑,变压器,仓库,插线板,充电桩,触控一体机,传感器,打印机,打印机耗材,打印设备,档案袋,档案盒,道路工程,地铁,电池,电缆,电流互感器,电梯,电线,订书机,订书针,对讲机,多功能一体机,多媒体设备,发电机,防冻液,防护栏杆,防护门,防护棚,防雷设施,防水工程,服务器,服装,复印机,复印纸,钢板,钢结构,钢筋,工作服,工作站,公路,公用工程,固体胶,光伏,光盘,航标灯,回形针,机房空调,机柜,机油,鸡蛋,计算机,记号笔,记事本,继电器,家具,监测仪,监视器,检测报告,检测仪器,剪刀,建筑工程,交换机,交通设施,胶带,胶水,脚手架,井架,警示灯,救护车,救生设施,刻录机,空调,空气调节器,垃圾袋,垃圾桶,冷却塔,冷水机组,楼层呼唤器,路灯,绿化工程,毛巾,美工刀,门禁,密集架,灭火器,抹布,墨盒,逆变器,牛皮纸,配电箱,喷壶,起重机,汽油,桥梁,热泵机组,热水器,弱电系统,扫描仪,摄像头,生活用房,食堂,市政工程,双面胶,水电站,水桶,宿舍,碎纸机,台式机,太阳能,碳粉,天然气,投影仪,图书,土石方,拖把,挖掘机,网线,文件袋,文件柜,无人机,无线电,硒鼓,洗洁精,洗手液,洗衣粉,显示屏,橡皮,消防立管,消防器材,消防水泵,消防箱,新能源,蓄电池,液晶显示器,医疗器械,医疗设备,移动工作站,移动硬盘,预埋钢板,园林工程,纸杯,中性笔,桩基,装修工程",
   "biddingRelatesLevel": 0,
-  "ipInitAuthentication": "qwertyuiopzxcvbnm1234567890asdfghjkl"
-  }
+  "ipInitAuthentication": "qwertyuiopzxcvbnm1234567890asdfghjkl",
+  "node": 1,
+  "keywordRestrict": 100,
+  "buyerRestrict": 100,
+  "winnerRestrict": 100
+}

+ 15 - 2
src/db.json

@@ -36,14 +36,27 @@
       "size": 30,
       "version": "v7",
       "userName": "",
-      "password": ""
+      "password": "",
+      "esIndex": "bidding",
+      "esType": "bidding"
     },
     "other": {
       "address": "http://192.168.3.241:9205,http://192.168.3.149:9200",
       "size": 30,
       "version": "v7",
       "userName": "",
-      "password": ""
+      "password": "",
+      "esIndex": "bidding_year",
+      "esType": "bidding_year"
+    },
+    "free": {
+      "address": "http://192.168.3.241:9205,http://192.168.3.149:9200",
+      "size": 30,
+      "version": "v7",
+      "userName": "",
+      "password": "",
+      "esIndex": "bidding",
+      "esType": "bidding"
     }
   },
   "redis": {

+ 3 - 1
src/go.mod

@@ -6,8 +6,9 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230308011651-df591d32df88
 	app.yhyue.com/moapp/jybase v0.0.0-20231026082242-8eb41c7bdda6
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7
+	app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.15-0.20230925060020-8e4db0f1e13e
+	github.com/ClickHouse/clickhouse-go v1.5.4
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/bwmarrin/snowflake v0.3.0
 	github.com/fsnotify/fsnotify v1.6.0
@@ -31,6 +32,7 @@ require (
 	github.com/cenkalti/backoff/v4 v4.2.1 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/clbanning/mxj/v2 v2.5.5 // indirect
+	github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect
 	github.com/coreos/go-semver v0.3.1 // indirect
 	github.com/coreos/go-systemd/v22 v22.5.0 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect

+ 6 - 2
src/go.sum

@@ -9,8 +9,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20231026082242-8eb41c7bdda6 h1:uyaBp5Iuc/Il4+O
 app.yhyue.com/moapp/jybase v0.0.0-20231026082242-8eb41c7bdda6/go.mod h1:Hv9U/7oHRucqH315Tr1+d03NCvS9mOKPfk8pwwlOIwQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
-app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7 h1:i7sFy+e/zjqhTQci+0x4E1qEXZOEYCIe6EDug+8LyFk=
-app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7/go.mod h1:LuxdVd+j3uwm7N5j2hivmpPU0LJytEV7iwAIljdoc4Q=
+app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3 h1:6Jv5DcoGYCsHVMwUjvlZubuTgY/vu4fWP5+rcXIKNj0=
+app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3/go.mod h1:LuxdVd+j3uwm7N5j2hivmpPU0LJytEV7iwAIljdoc4Q=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=
@@ -74,6 +74,7 @@ github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I
 github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
+github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0=
 github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
 github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx8fmJxi7vIgqpvYTF1+o=
 github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
@@ -119,6 +120,7 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
 github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA=
 github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
+github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk=
 github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
 github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw=
 github.com/bos-hieu/mongostore v0.0.2/go.mod h1:8AbbVmDEb0yqJsBrWxZIAZOxIfv/tsP8CDtdHduZHGg=
@@ -140,6 +142,7 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn
 github.com/clbanning/mxj/v2 v2.5.5 h1:oT81vUeEiQQ/DcHbzSytRngP6Ky9O+L+0Bw0zSJag9E=
 github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
 github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
@@ -669,6 +672,7 @@ github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNc
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pierrec/lz4 v2.5.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM=
 github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
 github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=

+ 15 - 0
src/jfw/config/config.go

@@ -6,7 +6,9 @@ import (
 	"app.yhyue.com/moapp/jybase/mail"
 	"app.yhyue.com/moapp/jypkg/middleground"
 	"app.yhyue.com/moapp/jypkg/public"
+	"database/sql"
 	"fmt"
+	_ "github.com/ClickHouse/clickhouse-go"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/os/gcfg"
 	"github.com/gogf/gf/v2/os/gctx"
@@ -30,6 +32,7 @@ var (
 	HotBuyerConfig       HotConfig
 	IpList               *ipmatch.WhiteIp
 	IpInitLock           sync.RWMutex //锁
+	ClickhouseDb         *sql.DB
 )
 
 type HotConfig struct {
@@ -47,6 +50,7 @@ func init() {
 	g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("config.yaml")
 	util.ReadConfig(&Sysconfig)
 	IpInit()
+	//ClickhouseInit()
 	//log.Println("sysconfig:", Sysconfig)
 	WeixinConfig, _ = Sysconfig["wxJianyu"].(map[string]interface{})
 	Wxoauth = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=` + util.ObjToString(WeixinConfig["appid"]) + `&redirect_uri=%s&response_type=code&scope=snsapi_base&state=%s#wechat_redirect`
@@ -198,3 +202,14 @@ func convertToPinyin(word string) string {
 	}
 	return pinyinStr
 }
+
+func ClickhouseInit() *sql.DB {
+
+	// 创建ClickHouse连接
+	connect, err := sql.Open("clickhouse", util.InterfaceToStr(Seoconfig["clickhouseUrl"]))
+	if err != nil {
+		fmt.Println("连接失败:", err)
+		return nil
+	}
+	return connect
+}

+ 26 - 5
src/jfw/filter/anonymousUser.go

@@ -15,6 +15,7 @@ import (
 	"fmt"
 	"github.com/bwmarrin/snowflake"
 	"io/ioutil"
+	"jy/src/jfw/config"
 	"log"
 	"net/http"
 	"strings"
@@ -30,7 +31,7 @@ type AnonymousAuth struct {
 }
 
 var (
-	node, _ = snowflake.NewNode(1)
+	Node *snowflake.Node
 )
 
 func initPrivatePublicKey() {
@@ -105,12 +106,14 @@ func (sk *AnonymousAuth) Do() {
 			if sk.R.Method != "GET" || !strings.Contains(accept, "text/html") { //避免多请求
 				return
 			}
-			guestUID := node.Generate()
+			guestUID := Node.Generate()
 			cookie := &http.Cookie{
 				Name:     "JYGuestUID",
 				Value:    util.InterfaceToStr(guestUID),
 				Path:     "/",
 				HttpOnly: true,
+				Domain:   util.ObjToString(config.Sysconfig["cookiedomain"]),
+				Expires:  time.Now().AddDate(10, 0, 0),
 			}
 			http.SetCookie(sk.W, cookie)
 			//未登录用户增加匿名身份信息
@@ -130,6 +133,15 @@ func (sk *AnonymousAuth) Do() {
 				"creation_time": time.Now().Unix(),
 			}
 			public.BaseMysql.Insert("anonymous_identity", data)
+			//stmt, err := config.ClickhouseDb.Prepare("INSERT INTO anonymous_identity (ip, client, os, browse, url, guestUID, mdescribe, refer, method, creation_time) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
+			//if err != nil {
+			//	return
+			//}
+			//defer stmt.Close()
+			//_, err = stmt.Exec(util.GetIp(sk.R), agent, util.GetOS(agent), util.GetBrowse(agent), sk.R.RequestURI, util.InterfaceToStr(guestUID), str, sk.R.Referer(), sk.R.Method, time.Now().Unix())
+			//if err != nil {
+			//	return
+			//}
 			return
 		}
 
@@ -140,17 +152,14 @@ func (sk *AnonymousAuth) Do() {
 		}
 		eid, err := sk.R.Cookie("eid")
 		if err != nil {
-			//log.Println("匿名用户获取eid失败", err.Error())
 			return
 		}
 		if fid.Value != "" && eid.Value != "" {
 			eData, err1 := Decryption(eid.Value)
 			if err1 != nil {
-				//log.Printf("匿名用户eid:%s,fid:%s 解密失败err:%s", eid.Value, fid.Value, err1.Error())
 				return
 			}
 			if fid.Value != eData {
-				//log.Printf("匿名用户身份验证不通过,eid:%s,fid:%s,eData:%s", eid.Value, fid.Value, eData)
 				return
 			}
 			trustedId := encrypt.SE.EncodeString(fid.Value + "***" + jyGuestUID.Value)
@@ -159,10 +168,22 @@ func (sk *AnonymousAuth) Do() {
 				Value:    trustedId,
 				Path:     "/",
 				HttpOnly: true,
+				Domain:   util.ObjToString(config.Sysconfig["cookiedomain"]),
+				Expires:  time.Now().AddDate(10, 0, 0),
 			}
 			http.SetCookie(sk.W, cookie)
 			public.BaseMysql.Update("anonymous_identity", map[string]interface{}{"guestUID": jyGuestUID.Value},
 				map[string]interface{}{"fid": fid.Value, "trustedId": trustedId})
+			//stmt, err := config.ClickhouseDb.Prepare("UPDATE anonymous_identity SET fid = ? and trustedId = ? WHERE guestUID = ?")
+			//if err != nil {
+			//	fmt.Println("Failed to prepare statement:", err)
+			//	return
+			//}
+			//defer stmt.Close()
+			//_, err = stmt.Exec(fid.Value, trustedId, jyGuestUID.Value)
+			//if err != nil {
+			//	return
+			//}
 		} else {
 			log.Println("无身份验证信息")
 		}

+ 2 - 1
src/jfw/filter/filter.go

@@ -2,6 +2,7 @@ package filter
 
 import (
 	"crypto/rsa"
+	"github.com/bwmarrin/snowflake"
 	. "jy/src/jfw/config"
 	"jy/src/jfw/jyutil"
 	"net/http"
@@ -27,7 +28,7 @@ var (
 func init() {
 	xweb.AddFilter(&Filter{})
 	go initPrivatePublicKey()
-
+	Node, _ = snowflake.NewNode(util.Int64All(Seoconfig["node"]))
 	//日志过滤 路由集合
 	go fs.FSNotifyFUNC("sword->%s", "./route.json", true, func() {
 		util.ReadConfig("./route.json", &RouteConf)

+ 2 - 2
src/jfw/front/classificationTag.go

@@ -121,9 +121,9 @@ func GetHotWinnerBuyer(identityType, limit int) []map[string]interface{} {
 	queryTotal := gconv.Int(gconv.Float64(limit) * 1.5)
 	var querySql string
 	if isWinner {
-		querySql = fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}],"must_not":[{"term":{"entidlist":"-"}}]}},"_source":["buyer","s_winner","entidlist"],"size": %d}`, queryTotal)
+		querySql = fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}],"must_not":[{"term":{"entidlist":"-"}}]}},"_source":["buyer","s_winner","entidlist"],"sort":[{"lasttime": "desc"}],"size": %d}`, queryTotal)
 	} else {
-		querySql = fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "buyer"}}]}},"_source":["buyer","s_winner","entidlist"],"size": %d}`, queryTotal)
+		querySql = fmt.Sprintf(`{"query": {"bool": {"must": [{"exists": {"field": "buyer"}}]}},"_source":["buyer","s_winner","entidlist"],"sort":[{"lasttime": "desc"}],"size": %d}`, queryTotal)
 	}
 	getData := elastic.GetNoLimit("projectset", "projectset", querySql)
 	var finalList []map[string]interface{}

+ 64 - 10
src/jfw/front/dataExport.go

@@ -32,14 +32,16 @@ type DataExport struct {
 	toOrderDetail xweb.Mapper `xweb:"/front/dataExport/toOrderDetail/(.*)"`  //订单详情
 	getOrderCode  xweb.Mapper `xweb:"/front/dataExport/getOrderCode/(\\w+)"` //申请发票获取订单编号
 
-	superSearchExport xweb.Mapper `xweb:"/front/dataExport/superSearchExport"`      //数据导出-超级搜索
-	toCreateOrderPage xweb.Mapper `xweb:"/front/dataExport/toCreateOrderPage/(.*)"` //数据导出-订单页面
-	previewData       xweb.Mapper `xweb:"/front/(.*)/previewData/(.*)"`             //数据导出-数据预览
-	sendMailVerify    xweb.Mapper `xweb:"/front/dataExport/sendMailVerify"`         //发送邮箱验证码
-	checkMailVerify   xweb.Mapper `xweb:"/front/dataExport/checkMailVerify"`        //验证邮箱验证码
-	paysuccess        xweb.Mapper `xweb:"/front/dataExport/paysuccess"`             //支付成功页面
-	checkPhoneVerify  xweb.Mapper `xweb:"/front/dataExport/checkPhoneVerify"`       //验证手机号
-	fontSet           xweb.Mapper `xweb:"/front/dataExport/fontSet/(.*)"`
+	superSearchExport  xweb.Mapper `xweb:"/front/dataExport/superSearchExport"`      //数据导出-超级搜索
+	toCreateOrderPage  xweb.Mapper `xweb:"/front/dataExport/toCreateOrderPage/(.*)"` //数据导出-订单页面
+	previewData        xweb.Mapper `xweb:"/front/(.*)/previewData/(.*)"`             //数据导出-数据预览
+	sendMailVerify     xweb.Mapper `xweb:"/front/dataExport/sendMailVerify"`         //发送邮箱验证码
+	checkMailVerify    xweb.Mapper `xweb:"/front/dataExport/checkMailVerify"`        //验证邮箱验证码
+	paysuccess         xweb.Mapper `xweb:"/front/dataExport/paysuccess"`             //支付成功页面
+	checkPhoneVerify   xweb.Mapper `xweb:"/front/dataExport/checkPhoneVerify"`       //验证手机号
+	fontSet            xweb.Mapper `xweb:"/front/dataExport/fontSet/(.*)"`
+	setDontPromptAgain xweb.Mapper `xweb:"/front/dataExport/setDontPromptAgain"` //数据导出-超出2w条,不再提示
+	getDontPromptAgain xweb.Mapper `xweb:"/front/dataExport/getDontPromptAgain"` //数据导出-超出2w条,不再提示
 
 	cancelOrder          xweb.Mapper `xweb:"/front/dataExport/cancelOrder"`              //取消订单
 	vipOrderDetail       xweb.Mapper `xweb:"/front/vipOrder/vipOrderDetail"`             //vip订单详情
@@ -165,7 +167,16 @@ func (d *DataExport) SieveData() {
 		winnerArr = strings.Split(winner, ",")
 		log.Println("winnerArr", winnerArr)
 	}
+	var isTitle int
+
 	if selectType != "" {
+		if strings.Count(selectType, "title") > 1 {
+			isTitle = 3 //包含标题及正文
+		} else if strings.Contains(selectType, "detail") {
+			isTitle = 2 //只包含正文
+		} else if strings.Contains(selectType, "title") {
+			isTitle = 1 //只包含标题
+		}
 		//去重 如果选取了标题及正文 引起的有2个title问题
 		if strings.Count(selectType, "title") > 1 {
 			var detail []string
@@ -179,6 +190,15 @@ func (d *DataExport) SieveData() {
 			selectType = strings.Replace(strings.Join(detail, ","), "detail", "title,detail", -1)
 		}
 	}
+	if len(keywordList) > util.IntAllDef(config.Sysconfig["keywordRestrict"], 100) {
+		keywordList = keywordList[:util.IntAllDef(config.Sysconfig["keywordRestrict"], 100)]
+	}
+	if len(buyerArr) > util.IntAllDef(config.Sysconfig["buyerRestrict"], 100) {
+		buyerArr = buyerArr[:util.IntAllDef(config.Sysconfig["buyerRestrict"], 100)]
+	}
+	if len(winnerArr) > util.IntAllDef(config.Sysconfig["winnerRestrict"], 100) {
+		winnerArr = winnerArr[:util.IntAllDef(config.Sysconfig["winnerRestrict"], 100)]
+	}
 	sieveCondition := map[string]interface{}{
 		"publishtime": publishtime,
 		"area":        areaArr,
@@ -192,6 +212,7 @@ func (d *DataExport) SieveData() {
 		"subtype":     subType,
 		"buyer":       buyerArr,
 		"buyerclass":  buyerclassArr,
+		"isTitle":     isTitle,
 		"winner":      winnerArr,
 		"comeintime":  time.Now().Unix(),
 		"comeinfrom":  "exportPage",
@@ -230,9 +251,9 @@ func (d *DataExport) SieveData() {
 			}
 		}
 		list := dataexport.FormatExportData(public.Mgo_Ent, &res_screen, config.Sysconfig["webdomain"].(string), dataType, true)
-		if msgCount > 20000 {
+		/*if msgCount > 20000 {
 			msgCount = 20000
-		}
+		}*/
 		_res["data"] = map[string]interface{}{
 			"list":  subUrl(list, dataType),
 			"_id":   encrypt.SE.Encode2Hex(_id),
@@ -833,6 +854,39 @@ func (d *DataExport) ValuationList(order_code string) error {
 	return d.Render("/_error.html")
 }
 
+func (d *DataExport) SetDontPromptAgain() {
+	status := d.GetString("status") //0 提示  1 不再提示
+	userId := d.GetSession("mgoUserId").(string)
+	boo := public.MQFW.UpdateById("user", userId, map[string]interface{}{
+		"$set": map[string]interface{}{
+			"i_export_promptAgain": status,
+		},
+	})
+	d.ServeJson(map[string]interface{}{
+		"error_code": 0,
+		"error_msg":  "",
+		"success":    boo,
+	})
+	return
+}
+
+func (d *DataExport) GetDontPromptAgain() {
+	isPrompt := true
+	userId := d.GetSession("mgoUserId").(string)
+	user, ok := public.MQFW.FindById("user", userId, `{"i_export_promptAgain":1}`)
+	if ok && user != nil && len(*user) > 0 {
+		if util.IntAll((*user)["i_export_promptAgain"]) == 1 {
+			isPrompt = false
+		}
+	}
+	d.ServeJson(map[string]interface{}{
+		"error_code": 0,
+		"error_msg":  "",
+		"isPrompt":   isPrompt,
+	})
+	return
+}
+
 //
 //func (d *DataExport) EntDataExport(_id string) error {
 //	id := util.se.Decode4Hex(_id)

+ 18 - 0
src/jfw/front/login.go

@@ -435,6 +435,24 @@ func anonymousLogin(session *httpsession.Session, trustedId string) {
 
 	//匿名用户登录后创建关联信息
 	public.BaseMysql.Insert("anonymous_association", queryData)
+
+	//var count int
+	//err := config.ClickhouseDb.QueryRow(fmt.Sprintf(`SELECT count(*) FROM anonymous_association where positionId = %v and mgoUserId = "%v" and trustedId = "%v"`, positionId, mgoUserId, trustedId)).Scan(&count)
+	//if err != nil {
+	//	return
+	//}
+	////queryData := map[string]interface{}{"positionId": positionId, "mgoUserId": mgoUserId, "trustedId": trustedId, "creation_time": time.Now().Unix()}
+	//if count > 0 {
+	//	stmt, err := config.ClickhouseDb.Prepare("INSERT INTO anonymous_identity (positionId, mgoUserId, trustedId, creation_time) VALUES (?, ?, ?, ?)")
+	//	if err != nil {
+	//		return
+	//	}
+	//	defer stmt.Close()
+	//	_, err = stmt.Exec(positionId, mgoUserId, trustedId, time.Now().Unix())
+	//	if err != nil {
+	//		return
+	//	}
+	//}
 }
 
 func afterLogin(phone string, session *httpsession.Session, fool bool) (bool, *map[string]interface{}, map[string]interface{}) {

+ 26 - 8
src/jfw/front/searchOptimize.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
 	"log"
 	"net/http"
 	"strconv"
@@ -297,7 +298,16 @@ func (so *SearchOptimize) GetBidSearchList(isCache bool) (count, total int64, li
 			Limit:      util.If(isCache, util.If(so.IsPay, bidsearch.SearchMaxPageCount_PAYED, bidsearch.SearchMaxPageCount_PC).(int), so.PageSize).(int), //缓存数据: 付费或未登录用户一次性5000条,100页数据;免费用户一次性500条,10页数据;实时数据:每页50条数据请求
 			Count:      util.If(strings.Contains(so.SelectType, "detail"), 115, 0).(int),                                                                  //高亮正文数量
 			HighLight:  util.If(strings.Contains(so.SelectType, "detail"), true, false).(bool),                                                            //是否高亮正文
-			IsLogin:    so.UserId != "",
+			State: func(userId string, isPay bool) (state int) {
+				state = 1
+				if userId != "" {
+					state = 2
+					if isPay {
+						state = 3
+					}
+				}
+				return
+			}(so.UserId, so.IsPay),
 		}
 		var repl *[]map[string]interface{}
 		total, repl = biddingSearch.GetAllByNgramWithCount()
@@ -764,11 +774,18 @@ type SearchByES struct {
 	Limit      int
 	Count      int
 	HighLight  bool
-	IsLogin    bool
+	State      int //1:noLogin;2:free;3:pay
 }
 
 // GetAllByNgramWithCount  获取es查询结果及总数量
 func (e *SearchByES) GetAllByNgramWithCount() (int64, *[]map[string]interface{}) {
+	var (
+		jyES = jyutil.GetES(e.State)
+	)
+	if jyES.EsIndex != "" {
+		e.Index = jyES.EsIndex
+		e.IType = jyES.EsType
+	}
 	if e.Query != "" {
 		queryStr := e.Query
 		if e.HighLight {
@@ -787,12 +804,13 @@ func (e *SearchByES) GetAllByNgramWithCount() (int64, *[]map[string]interface{})
 		if e.Start > -1 {
 			queryStr = queryStr[:len(queryStr)-1] + `,"from":` + strconv.Itoa(e.Start) + `,"size":` + strconv.Itoa(e.Limit) + "}"
 		}
-		log.Println("queryStr:", queryStr)
-		if e.IsLogin {
-			return elastic.GetWithCount(e.Index, e.IType, e.Query, queryStr)
-		} else {
-			return pc.Other.GetWithCount(e.Index, e.IType, e.Query, queryStr)
-		}
+		log.Println(e.Index, e.IType, "--queryStr:", queryStr)
+		//if e.IsLogin {
+		//	return elastic.GetWithCount(e.Index, e.IType, e.Query, queryStr)
+		//} else {
+		//	return pc.Other.GetWithCount(e.Index, e.IType, e.Query, queryStr)
+		//}
+		return jyES.Es.GetWithCount(e.Index, e.IType, e.Query, queryStr)
 	} else {
 		return 0, nil
 	}

+ 3 - 3
src/jfw/front/ws_dataExport.go

@@ -208,9 +208,9 @@ func (w *WsDataExport) GetPreview() error {
 	//格式化字段
 	res_screen := dataexport.ScreenData(res, dataType, 20, kws)
 	list := dataexport.FormatExportData(public.Mgo_Ent, &res_screen, config.Sysconfig["webdomain"].(string), dataType, true)
-	if msgCount > 20000 {
-		msgCount = 20000
-	}
+	//if msgCount > 20000 {
+	//	msgCount = 20000
+	//}
 	_res["data"] = subUrl(list, dataType)
 	_res["dataType"] = dataType
 	_res["total"] = msgCount

+ 19 - 0
src/jfw/front/wx_dataExport.go

@@ -3,6 +3,7 @@ package front
 import (
 	"encoding/json"
 	"errors"
+	"jy/src/jfw/config"
 	"jy/src/jfw/wx"
 	"log"
 	"strings"
@@ -184,7 +185,15 @@ func (w *WxDataExport) SaveData() error {
 			log.Println("keyWord param 反序列化异常,查看前后台字段是否对应")
 		}
 	}
+	var isTitle int
 	if selectType != "" {
+		if strings.Count(selectType, "title") > 1 {
+			isTitle = 3 //包含标题及正文
+		} else if strings.Contains(selectType, "detail") {
+			isTitle = 2 //只包含正文
+		} else if strings.Contains(selectType, "title") {
+			isTitle = 1 //只包含标题
+		}
 		//去重 如果选取了标题及正文 引起的有2个title问题
 		if strings.Count(selectType, "title") > 1 {
 			var detail []string
@@ -198,6 +207,15 @@ func (w *WxDataExport) SaveData() error {
 			selectType = strings.Replace(strings.Join(detail, ","), "detail", "title,detail", -1)
 		}
 	}
+	if len(keyWordArr) > util.IntAllDef(config.Sysconfig["keywordRestrict"], 100) {
+		keyWordArr = keyWordArr[:util.IntAllDef(config.Sysconfig["keywordRestrict"], 100)]
+	}
+	if len(buyerArr) > util.IntAllDef(config.Sysconfig["buyerRestrict"], 100) {
+		buyerArr = buyerArr[:util.IntAllDef(config.Sysconfig["buyerRestrict"], 100)]
+	}
+	if len(winnerArr) > util.IntAllDef(config.Sysconfig["winnerRestrict"], 100) {
+		winnerArr = winnerArr[:util.IntAllDef(config.Sysconfig["winnerRestrict"], 100)]
+	}
 	saveData := map[string]interface{}{
 		"publishtime": publishtime,
 		"area":        areaArr,
@@ -207,6 +225,7 @@ func (w *WxDataExport) SaveData() error {
 		"keywords":    keyWordArr,
 		"minprice":    min,
 		"maxprice":    max,
+		"isTitle":     isTitle,
 		"subtype":     subType,
 		"buyer":       buyerArr,
 		"buyerclass":  buyerclassArr,

+ 29 - 0
src/jfw/jyutil/jyutil.go

@@ -1,6 +1,7 @@
 package jyutil
 
 import (
+	elastic "app.yhyue.com/moapp/jybase/es"
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
 	"app.yhyue.com/moapp/jypkg/compatible"
 	"encoding/json"
@@ -329,3 +330,31 @@ func AdditionalFilterGeneric(keyWords string) (additionalWords string) {
 	}
 	return additionalWords
 }
+
+type JyES struct {
+	Es      elastic.Es
+	EsIndex string
+	EsType  string
+}
+
+// GetES es 分类 1:noLogin;2:free;3:pay
+func GetES(state int) *JyES {
+	var ESInfo = &JyES{
+		Es: elastic.VarEs,
+	}
+	switch state {
+	case 1:
+		ESInfo = &JyES{
+			Es:      public.Other,
+			EsIndex: public.DbConf.Elasticsearch.Other.EsIndex,
+			EsType:  public.DbConf.Elasticsearch.Other.EsType,
+		}
+	case 2:
+		ESInfo = &JyES{
+			Es:      public.Free,
+			EsIndex: public.DbConf.Elasticsearch.Free.EsIndex,
+			EsType:  public.DbConf.Elasticsearch.Free.EsType,
+		}
+	}
+	return ESInfo
+}

+ 72 - 17
src/jfw/modules/app/src/app/front/dataExport.go

@@ -3,6 +3,7 @@ package front
 import (
 	"encoding/json"
 	"errors"
+	"jy/src/jfw/modules/app/src/jfw/config"
 	"log"
 	"strings"
 	"time"
@@ -18,23 +19,26 @@ import (
 
 type WxDataExport struct {
 	*xweb.Action
-	toSieve       xweb.Mapper `xweb:"/jyapp/front/dataExport/toSieve"`       //微信数据导出
-	saveData      xweb.Mapper `xweb:"/jyapp/front/dataExport/saveData"`      //保存筛选数据
-	area          xweb.Mapper `xweb:"/jyapp/front/dataExport/area"`          //区域
-	industry      xweb.Mapper `xweb:"/jyapp/front/dataExport/industry"`      //行业
-	buyerclass    xweb.Mapper `xweb:"/jyapp/front/dataExport/buyerclass"`    //采购单位类型
-	keyWord       xweb.Mapper `xweb:"/jyapp/front/dataExport/keyWord"`       //关键词
-	keyWordInput  xweb.Mapper `xweb:"/jyapp/front/dataExport/keyWordInput"`  //关键词输入
-	appended      xweb.Mapper `xweb:"/jyapp/front/dataExport/appended"`      //附加词
-	appendedInput xweb.Mapper `xweb:"/jyapp/front/dataExport/appendedInput"` //附加词输入
-	exclude       xweb.Mapper `xweb:"/jyapp/front/dataExport/exclude"`       //排除词
-	excludeInput  xweb.Mapper `xweb:"/jyapp/front/dataExport/excludeInput"`  //排除词输入
-	price         xweb.Mapper `xweb:"/jyapp/front/dataExport/price"`         //金额
-	subType       xweb.Mapper `xweb:"/jyapp/front/dataExport/subType"`       //信息类型
-	buyerEdit     xweb.Mapper `xweb:"/jyapp/front/dataExport/buyerEdit"`     //采购单位编辑
-	buyerInput    xweb.Mapper `xweb:"/jyapp/front/dataExport/buyerInput"`    //采购单位输入
-	winnerEdit    xweb.Mapper `xweb:"/jyapp/front/dataExport/winnerEdit"`    //中标单位编辑
-	winnerInput   xweb.Mapper `xweb:"/jyapp/front/dataExport/winnerInput"`   //中标单位输入
+	toSieve            xweb.Mapper `xweb:"/jyapp/front/dataExport/toSieve"`            //微信数据导出
+	saveData           xweb.Mapper `xweb:"/jyapp/front/dataExport/saveData"`           //保存筛选数据
+	area               xweb.Mapper `xweb:"/jyapp/front/dataExport/area"`               //区域
+	industry           xweb.Mapper `xweb:"/jyapp/front/dataExport/industry"`           //行业
+	buyerclass         xweb.Mapper `xweb:"/jyapp/front/dataExport/buyerclass"`         //采购单位类型
+	keyWord            xweb.Mapper `xweb:"/jyapp/front/dataExport/keyWord"`            //关键词
+	keyWordInput       xweb.Mapper `xweb:"/jyapp/front/dataExport/keyWordInput"`       //关键词输入
+	appended           xweb.Mapper `xweb:"/jyapp/front/dataExport/appended"`           //附加词
+	appendedInput      xweb.Mapper `xweb:"/jyapp/front/dataExport/appendedInput"`      //附加词输入
+	exclude            xweb.Mapper `xweb:"/jyapp/front/dataExport/exclude"`            //排除词
+	excludeInput       xweb.Mapper `xweb:"/jyapp/front/dataExport/excludeInput"`       //排除词输入
+	price              xweb.Mapper `xweb:"/jyapp/front/dataExport/price"`              //金额
+	subType            xweb.Mapper `xweb:"/jyapp/front/dataExport/subType"`            //信息类型
+	buyerEdit          xweb.Mapper `xweb:"/jyapp/front/dataExport/buyerEdit"`          //采购单位编辑
+	buyerInput         xweb.Mapper `xweb:"/jyapp/front/dataExport/buyerInput"`         //采购单位输入
+	winnerEdit         xweb.Mapper `xweb:"/jyapp/front/dataExport/winnerEdit"`         //中标单位编辑
+	winnerInput        xweb.Mapper `xweb:"/jyapp/front/dataExport/winnerInput"`        //中标单位输入
+	setDontPromptAgain xweb.Mapper `xweb:"/jyapp/front/dataExport/setDontPromptAgain"` //数据导出-超出2w条,不再提示
+	getDontPromptAgain xweb.Mapper `xweb:"/jyapp/front/dataExport/getDontPromptAgain"` //数据导出-超出2w条,不再提示
+
 }
 
 func init() {
@@ -186,7 +190,15 @@ func (w *WxDataExport) SaveData() error {
 			}
 		}
 	}
+	var isTitle int
 	if selectType != "" {
+		if strings.Count(selectType, "title") > 1 {
+			isTitle = 3 //包含标题及正文
+		} else if strings.Contains(selectType, "detail") {
+			isTitle = 2 //只包含正文
+		} else if strings.Contains(selectType, "title") {
+			isTitle = 1 //只包含标题
+		}
 		//去重 如果选取了标题及正文 引起的有2个title问题
 		if strings.Count(selectType, "title") > 1 {
 			var detail []string
@@ -200,6 +212,15 @@ func (w *WxDataExport) SaveData() error {
 			selectType = strings.Replace(strings.Join(detail, ","), "detail", "title,detail", -1)
 		}
 	}
+	if len(keyWordArr) > util.IntAllDef(config.Seoconfig["keywordRestrict"], 100) {
+		keyWordArr = keyWordArr[:util.IntAllDef(config.Sysconfig["keywordRestrict"], 100)]
+	}
+	if len(buyerArr) > util.IntAllDef(config.Sysconfig["buyerRestrict"], 100) {
+		buyerArr = buyerArr[:util.IntAllDef(config.Sysconfig["buyerRestrict"], 100)]
+	}
+	if len(winnerArr) > util.IntAllDef(config.Sysconfig["winnerRestrict"], 100) {
+		winnerArr = winnerArr[:util.IntAllDef(config.Sysconfig["winnerRestrict"], 100)]
+	}
 	saveData := map[string]interface{}{
 		"publishtime": publishtime,
 		"area":        areaArr,
@@ -207,6 +228,7 @@ func (w *WxDataExport) SaveData() error {
 		"region":      regionArr,
 		"industry":    industryArr,
 		"keywords":    keyWordArr,
+		"isTitle":     isTitle,
 		"minprice":    min,
 		"maxprice":    max,
 		"subtype":     subType,
@@ -234,6 +256,39 @@ func (w *WxDataExport) SaveData() error {
 	return nil
 }
 
+func (w *WxDataExport) SetDontPromptAgain() {
+	status := w.GetString("status") //0 提示  1 不再提示
+	userId := w.GetSession("mgoUserId").(string)
+	boo := public.MQFW.UpdateById("user", userId, map[string]interface{}{
+		"$set": map[string]interface{}{
+			"i_export_promptAgain": status,
+		},
+	})
+	w.ServeJson(map[string]interface{}{
+		"error_code": 0,
+		"error_msg":  "",
+		"success":    boo,
+	})
+	return
+}
+
+func (w *WxDataExport) GetDontPromptAgain() {
+	isPrompt := true
+	userId := w.GetSession("mgoUserId").(string)
+	user, ok := public.MQFW.FindById("user", userId, `{"i_export_promptAgain":1}`)
+	if ok && user != nil && len(*user) > 0 {
+		if util.IntAll((*user)["i_export_promptAgain"]) == 1 {
+			isPrompt = false
+		}
+	}
+	w.ServeJson(map[string]interface{}{
+		"error_code": 0,
+		"error_msg":  "",
+		"isPrompt":   isPrompt,
+	})
+	return
+}
+
 // Area 区域
 func (w *WxDataExport) Area() error {
 	w.Render("/dataExport/dataExport_area.html")

+ 3 - 3
src/jfw/modules/app/src/app/front/ws_dataExport.go

@@ -83,9 +83,9 @@ func (w *WsDataExport) GetPreview() error {
 		}
 	}
 	list := dataexport.FormatExportData(public.Mgo_Ent, &res_screen, config.Sysconfig["webdomain"].(string), dataType, true)
-	if msgCount > 20000 {
-		msgCount = 20000
-	}
+	//if msgCount > 20000 {
+	//	msgCount = 20000
+	//}
 	_res["data"] = subUrl(list, dataType)
 	_res["dataType"] = dataType
 	_res["total"] = msgCount

+ 4 - 1
src/jfw/modules/app/src/config.json

@@ -252,5 +252,8 @@
     "projecttype": true,
     "approvecity": true
   },
-  "ipInitAuthentication": "qwertyuiopzxcvbnm1234567890asdfghjkl"
+  "ipInitAuthentication": "qwertyuiopzxcvbnm1234567890asdfghjkl",
+  "keywordRestrict": 100,
+  "buyerRestrict": 100,
+  "winnerRestrict": 100
 }

+ 1 - 1
src/jfw/modules/app/src/go.mod

@@ -5,7 +5,7 @@ go 1.18
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7
+	app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.15-0.20230925060020-8e4db0f1e13e
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/gogf/gf/v2 v2.3.1

+ 2 - 2
src/jfw/modules/app/src/go.sum

@@ -9,8 +9,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40 h1:/FcBvpf/KW8g6GB
 app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40/go.mod h1:Hv9U/7oHRucqH315Tr1+d03NCvS9mOKPfk8pwwlOIwQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
-app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7 h1:i7sFy+e/zjqhTQci+0x4E1qEXZOEYCIe6EDug+8LyFk=
-app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7/go.mod h1:LuxdVd+j3uwm7N5j2hivmpPU0LJytEV7iwAIljdoc4Q=
+app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3 h1:6Jv5DcoGYCsHVMwUjvlZubuTgY/vu4fWP5+rcXIKNj0=
+app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3/go.mod h1:LuxdVd+j3uwm7N5j2hivmpPU0LJytEV7iwAIljdoc4Q=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

+ 20 - 2
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/ent_portrait.js

@@ -4,7 +4,8 @@ var vNode = {
   components: {
     vipComponent: vipComponent,
     hisproComponent: hisproComponent,
-    forwardshare: vmForward
+    forwardshare: vmForward,
+
   },
   data () {
     // 修改柱状条颜色为渐变色
@@ -326,6 +327,11 @@ var vNode = {
       var entniche = info.vipStatus <= 0 && info.memberStatus <= 0 && info.entniche
       return memberCustom || isNewVip || entniche
     },
+    phoneUnlockTip () {
+      var info = this.powerInfo
+      var phone = this.entBaseInfo.phone
+      return info.isFree && phone && phone.indexOf('*') !== -1
+    },
     noShowTip: function () {
       return (!this.isFree && !this.updateVipStatus && !this.customerServiceStatus) || (this.isFree && this.canFreeTrial)
     }
@@ -558,8 +564,16 @@ var vNode = {
         }
       });
     },
+    next_export (obj){
+      console.log(obj)
+      this.onExport('popupClick')
+    },
     //数据导出
-    onExport () {
+    onExport (type) {
+      if(this.topProject.count > 20000 && type !== 'popupClick' && this.$refs.popup_dataExport.isPrompt){
+        this.$refs.popup_dataExport.show = true
+        return
+      }
       var _this = this
       var storageSet = this.getHighSet()
       var data = {
@@ -1555,6 +1569,10 @@ var vNode = {
       //   }).then(function () {})
       // }
     },
+    goToUnlock: function () {
+      // this.savePageState()
+      location.href = '/jyapp/frontPage/bigmember/free/perfect_info?source=ent_portrait_contacts'
+    },
     //免费赠送企业全景分析体验 去解锁
     goGiveAnalysis: function () {
       location.href = '/jyapp/frontPage/bigmember/free/perfect_info?source=ent_portrait_freeuser';

+ 9 - 1
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/unit_portrayal.js

@@ -606,12 +606,20 @@ var vNode = {
         location.href = './free_buyer_project_news?entName=' + decodeURIComponent(utils.getParam('entName'))
       }
     },
+    next_export (obj){
+      console.log(obj)
+      this.onExport('popupClick')
+    },
     //数据导出
-    onExport () {
+    onExport (type) {
       if(!this.isLogin) {
         window.location.href = "/jyapp/free/login?to=back";
         return
       }
+      if(this.dt.pageCount > 20000 && type !== 'popupClick' && this.$refs.popup_dataExport.isPrompt){
+        this.$refs.popup_dataExport.show = true
+        return
+      }
       var storageSet = this.getHighSet()
       // var isMember = this.bigStatus > 0 && this.power.indexOf(5) > -1
       var data = {

+ 3 - 3
src/jfw/modules/app/src/web/staticres/jyapp/dataExport/css/dataExport.css

@@ -169,12 +169,12 @@ html .page .elseChoose .elseChooseList {
 
 html .page .elseChoose .elseChooseList ul li {
   padding: 0 .4rem;
-  height: .88rem;
-  line-height: .88rem;
+  /* height: .88rem;
+  line-height: .88rem; */
   background: #fff;
   font-size: 0.3rem;
   color: #1d1d1d;
-  margin-bottom: .24rem;
+  /* margin-bottom: .24rem; */
 }
 
 html .page .elseChoose .elseChooseList ul li a {

+ 7 - 1
src/jfw/modules/app/src/web/templates/big-member/page_ent_portrait.html

@@ -20,6 +20,7 @@
         href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/ent_portrait.css?v={{Msg "seo" "version"}}'/>
   <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/mainSearch/css/j-icons.css?v={{Msg "seo" "version"}}' />
   <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/forward-share/css/forward.css?v={{Msg "seo" "version"}}'/>
+  <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/css/popup-data-export.css?v={{Msg "seo" "version"}}'/>
   <!--E-当前页面的css资源-->
 </head>
 <style>
@@ -163,7 +164,10 @@
                 </div>
                 <div class="card-column organization-code">
                   <div class="ent-info-label">联系方式</div>
-                  <div class="ent-info-text">${entBaseInfo.phone ? entBaseInfo.phone : '-'}</div>
+                  <div class="ent-info-text">
+                    <p>${entBaseInfo.phone ? entBaseInfo.phone : '-'}</p>
+                    <p class="highlight-text" v-show="phoneUnlockTip" @click="goToUnlock">解锁查看</p>
+                  </div>
                 </div>
               </div>
               <div class="card-row">
@@ -652,6 +656,7 @@
         </div>
       </div>
     </div>
+    <popup-data-export ref="popup_dataExport" @next="next_export"></popup-data-export>
   </div>
   <div id="jyKeepComponent">
     <keep-component ref="vKeepComponent" @on-change-keep="changeKeepStatus" :bid="nowOpenBid" :first="false"></keep-component>
@@ -683,6 +688,7 @@
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-tags-template.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/components/popup-data-export.js?v={{Msg "seo" "version"}}'></script>
 <script>
   // 收藏组件
   var vKeepComponent = new Vue({

+ 3 - 0
src/jfw/modules/app/src/web/templates/big-member/page_unit_portrayal.html

@@ -27,6 +27,7 @@
   <link rel="stylesheet"
     href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/big-member/css/unit_portrayal.css?v={{Msg "seo" "version"}}' />
   <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/forward-share/css/forward.css?v={{Msg "seo" "version"}}'/>
+  <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/css/popup-data-export.css?v={{Msg "seo" "version"}}'/>
   <style>
     .skeleton {
       height: 100%;
@@ -701,6 +702,7 @@
           </van-tab>
         </van-tabs>
       </div>
+      <popup-data-export ref="popup_dataExport" @next="next_export"></popup-data-export>
     </div>
     <div id="jyKeepComponent">
       <keep-component ref="vKeepComponent" @on-change-keep="changeKeepStatus" :bid="nowOpenBid" :first="false">
@@ -752,6 +754,7 @@
   <script
     src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'>
   </script>
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/components/popup-data-export.js?v={{Msg "seo" "version"}}'></script>
   <script>
     // 收藏组件
     var vKeepComponent = new Vue({

+ 345 - 41
src/jfw/modules/app/src/web/templates/dataExport/dataExport.html

@@ -4,6 +4,8 @@
 <head>
     {{include "/common/meta.html"}}
     <title>数据导出</title>
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" type="text/css"
           href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/css/base.css?v={{Msg "seo" "version"}}">
     <link rel="stylesheet" type="text/css"
@@ -20,10 +22,13 @@
           href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/appbutton.css?v={{Msg "seo" "version"}}"/>
     <link href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/p13.css?v={{Msg "seo" "version"}}" rel="stylesheet">
   <link rel="stylesheet" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/swiper.min.css">
+  <link rel="stylesheet"href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/css/dataExportAppend.css?v={{Msg "seo" "version"}}'/>
   <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/swiper.min.js"></script>
     <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
     <script src="//cdn-common.jianyu360.com/cdn/lib/vue/2.6.14/vue.min.js"></script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
     <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/weui.min.js"></script>
+    <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/js/mapJSON.js?v={{Msg "seo" "version"}}"></script>
     {{include "/common/js.html"}}
 </head>
 <style>
@@ -66,8 +71,8 @@
     html .page .chooseTime .dateMake input {
         display: inline-block;
         width: 3.05rem;
-        /*height: .72rem;
-        line-height: .72rem;*/
+        /* height: .72rem; */
+        line-height: 0.4rem;
         font-size: .28rem;
         border: 1px solid #CECECE;
         margin: .16rem .13rem;
@@ -217,6 +222,9 @@
     .swiper-container-horizontal>.swiper-pagination-bullets, .swiper-pagination-custom, .swiper-pagination-fraction{
       top: 80%;
     }
+    [v-cloak] {
+    display: none!important;
+   }
 
 </style>
 <body class="p13">
@@ -226,30 +234,38 @@
     <span></span>
 </div>
 <div class="app-layout-content-b">
-    <div class="page">
-        <div class='main' style="">
-            <div class="progress" style="margin-top: -4px">
-                <div class="p-item">
-                    <p class="p-item-icon" style="background: #2cb7ca;">
-                        <i class="icon iconfont">&#xe606;</i>
-                    </p>
-                    <span class="active">条件筛选</span>
-                    <div class="line"></div>
+    <div class="page" style="background-color:#F5F6F7;">
+        <div class='main'>
+            <div class="screeningCondition">
+                <div  class="sc-btnContent">
+                    <span class="sc-icon"></span>
+                    <div class="sc-btn"><span class="sc-text">已存筛选&nbsp;</span><span class="sc-num">0</span></div>
                 </div>
-
-                <div class="p-item">
-                    <p class="p-item-icon">
-                        <i class="icon iconfont">&#xe617;</i>
-                    </p>
-                    <span>支付订单</span>
-                    <div class="line"></div>
-                </div>
-
-                <div class="p-item">
-                    <p class="p-item-icon icon-gray">
-                        <i class="icon iconfont">&#xe616;</i>
-                    </p>
-                    <span>数据导出</span>
+            </div>
+            <div class="progressBox">
+                <div class="progress" style="margin-top: -4px">
+                    <div class="p-item">
+                        <p class="p-item-icon" style="background: #2cb7ca;">
+                            <!-- <i class="icon iconfont">&#xe606;</i> -->
+                        </p>
+                        <span class="active">条件筛选</span>
+                        <div class="line"></div>
+                    </div>
+    
+                    <div class="p-item">
+                        <p class="p-item-icon">
+                            <!-- <i class="icon iconfont">&#xe617;</i> -->
+                        </p>
+                        <span>支付订单</span>
+                        <div class="line"></div>
+                    </div>
+    
+                    <div class="p-item">
+                        <p class="p-item-icon icon-gray">
+                            <!-- <i class="icon iconfont">&#xe616;</i> -->
+                        </p>
+                        <span>数据导出</span>
+                    </div>
                 </div>
             </div>
             <!-- dateChooseStart -->
@@ -261,13 +277,13 @@
                     <li><span data-value="2016_toNow"></span></li>
                 </ul>
                 <div class="dateMake">
-                    <i class="iconfont icon-rili" id="first"></i>
+                    <!-- <i class="iconfont icon-rili" id="first"></i> -->
                     <input id="starttime" type="text" placeholder="开始日期" readonly="readonly" unselectable="on"
                            onfocus="this.blur()"/>
                     <div class="heng">—</div>
                     <input id="endtime" type="text" placeholder="截止日期" readonly="readonly" unselectable="on"
                            onfocus="this.blur()"/>
-                    <i class="iconfont icon-rili" id="second"></i>
+                    <!-- <i class="iconfont icon-rili" id="second"></i> -->
                 </div>
             </div>
             <!-- dateChooseEnd -->
@@ -277,22 +293,22 @@
                 <p>*以下为非必选项</p>
                 <div class="elseChooseList">
                     <ul>
-                        <li><a href="/jyapp/front/dataExport/area">
+                        <li><a href="JavaScript:;" onclick="goChoosedetail('/jyapp/front/dataExport/area')">
                                 <strong>区域</strong>
                                 <span id="area"></span>
                                 <i class="iconfont icon-arrow"></i>
                             </a></li>
-                        <li><a href="/jyapp/front/dataExport/industry">
+                        <li><a href="JavaScript:;" onclick="goChoosedetail('/jyapp/front/dataExport/industry')">
                                 <strong>行业</strong>
                                 <span id="industry"></span>
                                 <i class="iconfont icon-arrow"></i>
                             </a></li>
-                        <li><a href="/jyapp/front/dataExport/buyerclass">
+                        <li><a href="JavaScript:;" onclick="goChoosedetail('/jyapp/front/dataExport/buyerclass')">
                                 <strong style="width: 2.2rem;">采购单位类型</strong>
                                 <span id="buyClass"></span>
                                 <i class="iconfont icon-arrow"></i>
                             </a></li>
-                        <li><a href="/jyapp/front/dataExport/keyWord">
+                        <li><a href="JavaScript:;" onclick="goChoosedetail('/jyapp/front/dataExport/keyWord')">
                                 <strong>关键词</strong>
                                 <span id="keyWord"></span>
                                 <i class="iconfont icon-arrow"></i>
@@ -302,24 +318,24 @@
                                 <span style="width: 4rem;" class="match">标题</span>
                                 <i class="iconfont icon-arrow"></i>
                             </a></li>
-                        <li><a href="/jyapp/front/dataExport/price">
+                        <li><a href="JavaScript:;" onclick="goChoosedetail('/jyapp/front/dataExport/price')">
                                 <strong>金额</strong>
                                 <span id="price"></span>
                                 <i class="iconfont icon-arrow"></i>
                             </a></li>
 
-                        <li><a href="/jyapp/front/dataExport/subType">
+                        <li><a href="JavaScript:;" onclick="goChoosedetail('/jyapp/front/dataExport/subType')">
                                 <strong>信息类型</strong>
                                 <span id="subType"></span>
                                 <i class="iconfont icon-arrow"></i>
                             </a></li>
 
-                        <li><a href="/jyapp/front/dataExport/buyerEdit">
+                        <li><a href="JavaScript:;" onclick="goChoosedetail('/jyapp/front/dataExport/buyerEdit')">
                                 <strong>采购单位</strong>
                                 <span id="buyer"></span>
                                 <i class="iconfont icon-arrow"></i>
                             </a></li>
-                        <li><a href="/jyapp/front/dataExport/winnerEdit">
+                        <li><a href="JavaScript:;" onclick="goChoosedetail('/jyapp/front/dataExport/winnerEdit')">
                                 <strong>中标单位</strong>
                                 <span id="winner"></span>
                                 <i class="iconfont icon-arrow"></i>
@@ -453,7 +469,7 @@
             </div>
         </div>
         <!-- 多选弹框 -->
-        <div id="checkbox_dialog">
+        <div id="checkbox_dialog" v-cloak>
             <div class="mask" v-show="dialog_show">
                 <div class="box">
                     <div class="head"><p>关键词匹配方式</p><img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/images/icon_delete_gray@2x.png?v={{Msg "seo" "version"}}" alt="" @click.stop="dialog_show=false"></div>
@@ -507,6 +523,155 @@
                 window.location.reload();
             }
         });
+        
+            //接口回显逻辑
+            try{
+            $.ajax({
+        type: 'get',
+        url: '/subscribepay/dataExportPack/screenList',
+        async:sessionStorage.getItem('goScreen') != '1'?false:true,
+        success: function (res) { 
+          if(res.data && res.data.length > 0){
+            $('.sc-num').text(res.data.length)
+            if(sessionStorage.getItem('goScreen') != '1'){ // 非设置筛选条件相关的页面回来使用接口数据回显
+                localStorage.removeItem('date') 
+            localStorage.removeItem('areaHtml') 
+            localStorage.removeItem('city') 
+            localStorage.removeItem('province') 
+            localStorage.removeItem('area') 
+            localStorage.removeItem('industry')  
+            localStorage.removeItem('buyclass') 
+            localStorage.removeItem('keyWord') 
+            localStorage.removeItem('export_selectType')  
+            localStorage.removeItem('price')  
+            localStorage.removeItem('subType') 
+            localStorage.removeItem('subTypes')   
+            localStorage.removeItem('buyer') 
+            localStorage.removeItem('winner')
+            localStorage.setItem('index','-1') 
+            let val =res.data[0]
+            if(val.publishtime){
+        localStorage.setItem('date',val.publishtime) 
+        }
+        if (val.city || val.area) {
+        let str = ''
+        if (val.area) {
+          str += val.area.replace(/,/g, "、")
+        }
+        if (val.city) {
+          let arr = val.city.split(',')
+          str = str+'、'+ getArea_city(arr)
+        }
+        localStorage.setItem('areaHtml',str)  
+      }
+        if(val.city){
+          localStorage.setItem('city',val.city) 
+          let area = val.city.replace(/,/g, " ")
+          localStorage.setItem('area',area) 
+        }
+        if(val.area){
+          let allcity = ""
+          let str = ""
+          let arr = val.area.split(",")
+          let cityarr =[]
+          if(val.city){
+            str = val.city
+          }
+          arr.forEach(e=>{ // 选整个省下的所有城市
+            cityarr = cityarr.concat(getCitiesFromJSONMap(e))     
+          })
+          allcity = cityarr.toString()
+          localStorage.setItem('province', val.area)
+        if (str) {
+          localStorage.setItem('city', allcity + ',' + str)
+        } else {
+          localStorage.setItem('city', allcity)
+        }
+        let area;
+        if (allcity) {
+          area = allcity + ',' + val.region
+        } else {
+          area = val.region
+        }
+        let areaList = area.split(',') || []
+        areaList.forEach((e, index) => {
+          if(e === '上海' || e === '北京' || e === '天津' || e === '重庆'){
+            areaList[index] = e + '市'
+          }
+          if( e === '台湾'){
+            areaList[index]  = e + '省'
+          }
+        })
+        let areaStr = areaList.join(',')
+        if(areaStr){
+          localStorage.setItem('area', areaStr.replace(/,/g, " "))
+        }
+        }
+        if(!val.area && !val.city){
+          localStorage.setItem('area','全国') 
+          localStorage.setItem('areaHtml','全国') 
+        }
+         console.log(val.industry)
+        if(val.industry){
+          let str = val.industry.replace(/,/g, " ")
+          localStorage.setItem('industry',str)    
+        }else{
+          localStorage.setItem('industry','全部')   
+        }
+        if(val.buyerclass){
+          localStorage.setItem('buyclass',JSON.stringify(val.buyerclass.split(',')))    
+        }else{
+          localStorage.setItem('buyclass','[]')   
+        }
+        if (val.keywords && val.keywords.length > 0) {
+        let keyjson
+        try{
+          keyjson = JSON.parse(val.keywords)
+        }catch(e){
+          keyjson = val.keywords
+        }
+       // keyWord储存本地处理为驼峰式 自助导出页面使用本地回显存取的为驼峰式
+        keyjson.forEach((item) =>{
+          item.keyWord = item.keyword 
+          })
+        localStorage.setItem('keyWord', JSON.stringify(keyjson))
+       } else {
+        localStorage.setItem('keyWord', '[]')
+       }
+        if(val.selectType){
+          localStorage.setItem('export_selectType',selectType_dispose(val.selectType))  
+        }
+        if(val.minprice || val.maxprice){
+          let str = ""
+          str += (val.minprice || '' )+'万元'+'-'+(val.maxprice || '')+'万元'
+          localStorage.setItem('price',str)  
+        }else{
+          localStorage.setItem('price','全部')  
+        }
+        if(val.subtype){
+          let str = val.subtype.replace(/,/g, " ")
+          localStorage.setItem('subTypes',str)  
+          localStorage.setItem('subType',str)  
+        }else{
+          localStorage.setItem('subType','全部') 
+        }
+        if(val.buyer){
+          localStorage.setItem('buyer',val.buyer)
+        }
+        if(val.winner){
+          localStorage.setItem('winner',val.winner)
+        }      
+        }
+      }
+          sessionStorage.setItem('goScreen','2');
+         },
+         error: function (error) {
+         }
+         })
+        }catch(e){
+            
+        }
+   
         //
         var scrollTop = 0;
         //
@@ -556,6 +721,7 @@
             $("#starttime").removeClass("timeSelect");
             $("#endtime").removeClass("timeSelect");
             $(".dateMake").css({"color": "#888"});
+            $(".dateMake").removeClass('chooseTimebox')
             localStorage.removeItem("export_starttime");
             localStorage.removeItem("export_endtime");
         });
@@ -889,11 +1055,13 @@
                     $("#starttime").addClass("timeSelect");
                     $("#endtime").addClass("timeSelect");
                     $(".dateMake").css({"color": "#24C0D7"});
+                    $(".dateMake").addClass('chooseTimebox')
                     $(".chooseTime ul li").removeClass('active');
 
                     $(".confirm").hide();
                     $(".resetOne").show();
-                    localStorage.removeItem("date");
+                    localStorage.removeItem("date"); 
+                    // localStorage.removeItem("date"); // 重新选择日期不在移除date 重新访问页面以提交的时间为准回显
                     localStorage.removeItem("index");
                 }
             });
@@ -913,6 +1081,7 @@
                     $("#endtime").removeClass("timeSelect");
                     $("#starttime").removeClass("timeSelect");
                     $(".dateMake").css({"color": "#000"});
+                    $(".dateMake").removeClass('chooseTimebox')
                     $(".chooseTime > i").css("color", "#888");
                     $(".chooseTime ul li").removeClass('active');
                     $(".chooseTime ul li:eq(0)").addClass('active');
@@ -955,11 +1124,13 @@
                     $("#starttime").addClass("timeSelect");
                     $("#endtime").addClass("timeSelect");
                     $(".dateMake").css({"color": "#24C0D7"});
+                    $(".dateMake").addClass('chooseTimebox')
                     $(".chooseTime ul li").removeClass('active');
 
                     $(".confirm").hide();
                     $(".resetOne").show();
-                    localStorage.removeItem("date");
+                    localStorage.removeItem("date"); 
+                    // localStorage.removeItem("date");  // 重新选择日期不在移除date 重新访问页面以提交的时间为准回显
                     localStorage.removeItem("index");
                 }
             });
@@ -979,6 +1150,7 @@
                     $("#endtime").removeClass("timeSelect");
                     $("#starttime").removeClass("timeSelect");
                     $(".dateMake").css({"color": "#000"});
+                    $(".dateMake").removeClass('chooseTimebox')
                     $(".chooseTime > i").css("color", "#888");
                     $(".chooseTime ul li").removeClass('active');
                     $(".chooseTime ul li:eq(0)").addClass('active');
@@ -1000,6 +1172,7 @@
             $("#starttime").addClass("timeSelect");
             $("#endtime").addClass("timeSelect");
             $(".dateMake").css({"color": "#24C0D7"});
+            $(".dateMake").addClass('chooseTimebox')
             $(".chooseTime ul li").removeClass('active');
             $(".confirm").hide();
             $(".resetOne").css('display', 'flex');
@@ -1017,6 +1190,7 @@
             $("#starttime").addClass("timeSelect");
             $("#endtime").addClass("timeSelect");
             $(".dateMake").css({"color": "#24C0D7"});
+            $(".dateMake").addClass('chooseTimebox')
             $(".chooseTime ul li").removeClass('active');
             $(".confirm").hide();
             $(".resetOne").css('display', 'flex');
@@ -1028,6 +1202,7 @@
         }
         //
         if (localStorage.date !== undefined && localStorage.date !== "") {
+            // localStorage.setItem('index','-1') // 存在提交的date直接回显时间至具体时间组件
             if (localStorage.index !== "-1") {
                 $(".chooseTime ul li.active").removeClass("active");
                 $(".chooseTime ul li").eq(localStorage.index).addClass("active");
@@ -1064,6 +1239,7 @@
                     $("#starttime").addClass("timeSelect");
                     $("#endtime").addClass("timeSelect");
                     $(".dateMake").css({"color": "#24C0D7"});
+                    $(".dateMake").addClass('chooseTimebox')
                     $(".chooseTime ul li").removeClass('active');
                 }
             }
@@ -1080,6 +1256,17 @@
 //      	alert(scrollTop)
 //      	$(document).scrollTop(scrollTop);
 //      }
+       $(".screeningCondition .sc-btn").on('click', function () { // 跳转至保存筛选列表页
+        if($('.sc-num').text()=='0'){
+            return
+        }
+        sessionStorage.setItem('goScreen','1');
+         window.location.href = "/jy_mobile/search/filter-history/bidding?from=dataExport";
+       })
+       $(".screeningCondition .sc-icon").on('click', function () { // 调起说明弹框
+        checkboxVm.showDialog({title:'已存筛选说明', message:'数据导出后,会将历史筛选条件保存在已存筛选中。您可从已存筛选中直接选择并使用。'})
+         
+       })
         //筛选条件发送
         $(".saveData").on('click', function () {
             var date = "";
@@ -1097,6 +1284,8 @@
             var selectType = "";
             var comeinfrom = "";
             var buyclass = "";
+            var prvinceArr = [];
+            var areaArr = [];
             date = getDate();
             localStorage.date = date;
 //          alert(scrollTop)
@@ -1110,6 +1299,16 @@
             if (localStorage.province !== undefined && localStorage.province !== "") {
                 province = localStorage.province;
             }
+             prvinceArr = province.split(",");
+             areaArr =area.split(" ");
+              
+             let result_city = areaArr.filter(function(item) { // 筛选出未全选的省中的市
+              return !prvinceArr.includes(item);
+             });
+             result_city = result_city.join(",");
+             if(result_city == '全国'){
+                result_city=''
+             }
             if (localStorage.city !== undefined && localStorage.city !== "") {
                 city = localStorage.city;
             }
@@ -1211,7 +1410,7 @@
                     "date": date,
                     "area": area,
                     "province": province,
-                    "city": city,
+                    "city": result_city,
                     "industry": industry,
                     "buyerclass": buyclass,
                     "keyWord": keyWord,
@@ -1232,6 +1431,7 @@
                     } else {
                       if (data._id !== "") {
                         // window.location.href = "/jyapp/front/dataExport/toCreateOrderPage?id=" + data._id + "&source=d&payway=" + pay_way + "&dataspec=" + data_spec;
+                        sessionStorage.setItem('goScreen','1'); // 储存参数 返回页面不使用接口回显使用已存本地存储
                         window.location.href = "/jy_mobile/dataexport/limitpreview/" + data._id + '?type=senior';
                       }
                     }
@@ -1279,6 +1479,7 @@
             $("#starttime").removeClass("timeSelect");
             $("#endtime").removeClass("timeSelect");
             $(".dateMake").css({"color": "#888"});
+            $(".dateMake").removeClass('chooseTimebox')
             $("#starttime").val("");
             $("#endtime").val("");
             //
@@ -1297,7 +1498,7 @@
             r = null;
             return context == null || context == "" || context == "undefined" ? "" : context;
         }
-
+ 
         //
         function getDate() {
             var start;
@@ -1361,7 +1562,6 @@
             n = n.toString();
             return n[1] ? n : '0' + n
         }
-
         var checkboxVm=new Vue({
         el: '#checkbox_dialog',
         delimiters: ['{', '}'],
@@ -1382,6 +1582,16 @@
         mounted() {
         },
         methods: {
+            showDialog ({title,message}){
+                this.$dialog({
+                    className:'msgDialog',
+                    title: title,
+                    message: message,
+                    messageAlign:'left',
+                    confirmButtonText: '我知道了',
+                    confirmButtonColor: '#2ABED1'
+                })
+            },
             open_(str){
                 this.list=[
                     {name:'标题',val:false},
@@ -1458,6 +1668,100 @@
         }
       })
     })
+    function selectType_dispose(selectType) {
+            let select = [];
+            if (selectType) {
+                let titleNum = 0
+            selectType.split(',').forEach((v) => {
+        if (v === 'title') {
+          titleNum++
+        }
+      })
+      if(selectType.indexOf("detail") !== -1){
+        if (titleNum > 1) {
+           select.push('标题') 
+         }
+      }else{
+        if (titleNum > 0) {
+           select.push('标题') 
+         }
+      }
+    if (selectType.indexOf("title") !== -1 && selectType.indexOf("detail") !== -1) {
+       select.push('正文')
+    }
+    if (selectType.indexOf("filetext") !== -1) {
+      select.push('附件')
+    }
+    if (selectType.indexOf('purchasing') !== -1 && selectType.indexOf('projectname.pname')) {
+      select.push('项目名称/标的物')
+    }
+    return select.toString()
+    }else{
+      return ''
+    }
+    }
+    function getCitiesFromJSONMap(provinceName) { // 通过省份获取地市
+      var temp = null
+      let arr =[]
+      for (var i = 0; i < chinaMapJSON.length; i++) {
+        var findThis = chinaMapJSON[i].name.indexOf(provinceName) !== -1
+        // 如果找到了,就不再循环后面的了
+        if (findThis) {
+          temp = chinaMapJSON[i]
+          break
+        }
+      }
+      temp.city.forEach(function (c) {
+        if(c.name.indexOf('北京') == -1&&c.name.indexOf('上海') == -1&&c.name.indexOf('重庆') == -1&&c.name.indexOf('天津') == -1&&c.name.indexOf('澳门') == -1&&c.name.indexOf('香港') == -1){
+          arr.push(c.name)   
+        }
+               
+       })
+       return arr
+    }
+    function getArea_city(arr) { // 根据地市获取省份并拼串
+      let obj = {}
+      let haveVal = {}
+      chinaMapJSON.forEach(p => {
+        obj[p.name] = []
+        p.city.forEach(c => {
+          arr.forEach(ele => {
+            if (c.name == ele) {
+              obj[p.name].push(c.name)
+            }
+          })
+        })
+      })
+       console.log(obj)
+       for(let key in obj){
+        if(obj[key].length>0){
+          haveVal[key] = obj[key]
+        }
+       }
+      let str = ""
+      for(let key in haveVal){
+        str += key + '('
+        for(let i=0;i<haveVal[key].length;i++){
+          str += haveVal[key][i]
+          if(i==haveVal[key].length-1){
+            str += ')、'
+          }else{
+            str += '、'
+          }
+        }
+      }
+      str =  str.replace(/省/g, "")
+      str =  str.replace(/维吾尔自治区/g, "")
+      str =  str.replace(/壮族自治区/g, "")
+      str =  str.replace(/自治区/g, "")
+      str =  str.replace(/回族自治区/g, "")
+      return str
+    }
+    function goChoosedetail(url){
+      sessionStorage.setItem('goScreen','1');
+      window.location.href=url;
+            
+    }
 </script>
 
 <!--百度统计-->

+ 8 - 4
src/jfw/modules/app/src/web/templates/dataExport/dataExport_buyerEdit.html

@@ -10,7 +10,9 @@
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/css/keyWord.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" />
+	<link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/css/association.css?v={{Msg "seo" "version"}}'/>
 	<script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
+	<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}"></script>
 	{{include "/common/js.html"}}
 </head>
 <style>
@@ -50,12 +52,11 @@
 				<section class="content">
 				<div class="enter addkeyWord">
 					<input type="text" class="enterOne" placeholder="采购单位名称" />
-					<div class="btn">
+					<div class="btn fixed-bottom">
 						<button disabled class="save-btn">确认</button>
 						<button class="close">取消</button>
 					</div>
 				</div>
-
 				<!-- 添加附加词显示列表 -->
 				<div class="showKeyWord">
 					<ul>
@@ -63,16 +64,18 @@
 
 					</ul>
 
+				</div>
+				<div class="association-list-box" style="display: none;">
+					<ul class="association-list">
+					</ul>
 				</div>
 					</section>
 			</div>
-
 		</div>
 	</div>
 	<div class="addKeyWord">
 		<i class="iconfont icon-tianjia"></i>
 	</div>
-  <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js"></script>
 <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/weui.min.js"></script>
 <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/js/additionWord.js?v={{Msg "seo" "version"}}"></script>
 <script>
@@ -108,6 +111,7 @@
 		$('.showKeyWord > ul').prepend(html);
 	}
 </script>
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/js/association.js?v={{Msg "seo" "version"}}"></script>
 
 <!--百度统计end-->
 {{include "/common/baiducc.html"}}

+ 8 - 3
src/jfw/modules/app/src/web/templates/dataExport/dataExport_buyerInput.html

@@ -10,7 +10,9 @@
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/css/keyWord.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/css/association.css?v={{Msg "seo" "version"}}'/>
     <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
+    <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}"></script>
 	{{include "/common/js.html"}}
     </head>
     <style>
@@ -45,7 +47,7 @@
         <section class="content">
         <div class="enter addkeyWord">
         <input type="text" class="enterOne" placeholder="采购单位名称" />
-        <div class="btn">
+        <div class="btn fixed-bottom">
         <button disabled class="save-btn">确认</button>
         <button class="close">取消</button>
         </div>
@@ -59,7 +61,10 @@
         </ul>
 
         </div>
-
+        <div class="association-list-box" style="display: none;">
+            <ul class="association-list">
+            </ul>
+        </div>
         </section>
         </div>
        		</div>
@@ -130,7 +135,7 @@
             history.back();
         });
     </script>
-
+<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/js/association.js?v={{Msg "seo" "version"}}"></script>
 <!--百度统计end-->
 {{include "/common/baiducc.html"}}
 </body>

+ 8 - 1
src/jfw/modules/app/src/web/templates/dataExport/dataExport_winnerEdit.html

@@ -10,7 +10,9 @@
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/css/keyWord.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" />
+	<link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/css/association.css?v={{Msg "seo" "version"}}'/>
 	<script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
+	<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}"></script>
 	{{include "/common/js.html"}}
 	</head>
 	<style>
@@ -47,7 +49,7 @@
 				<div class="keyWord">
 						<div class="enter addkeyWord">
 						<input type="text" class="enterOne" placeholder="中标单位名称" />
-						<div class="btn">
+						<div class="btn fixed-bottom">
 						<button class="save-btn" disabled>确认</button>
 						<button class="close">取消</button>
 				</div>
@@ -60,6 +62,10 @@
 						</ul>
 
 						</div>
+						<div class="association-list-box" style="display: none;">
+							<ul class="association-list">
+							</ul>
+						</div>
 
 						</div>
 
@@ -282,6 +288,7 @@
 		})
 
 	</script>
+	<script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/js/association.js?v={{Msg "seo" "version"}}"></script>
 <!--百度统计end-->
 {{include "/common/baiducc.html"}}
 	</body>

+ 8 - 1
src/jfw/modules/app/src/web/templates/dataExport/dataExport_winnerInput.html

@@ -10,7 +10,9 @@
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/dataExport/css/keyWord.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/local/layout.css" />
     <link rel="stylesheet" type="text/css" href="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/css/font.css?v={{Msg "seo" "version"}}" />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/css/association.css?v={{Msg "seo" "version"}}'/>
     <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
+    <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}"></script>
 	{{include "/common/js.html"}}
     </head>
     <style>
@@ -44,7 +46,7 @@
         <section class="content">
         <div class="enter addkeyWord">
         <input type="text" class="enterOne" placeholder="中标单位名称" />
-        <div class="btn">
+        <div class="btn fixed-bottom">
         <button class="save-btn" disabled>确认</button>
         <button class="close">取消</button>
     </div>
@@ -57,6 +59,10 @@
         </ul>
 
 
+        </div>
+        <div class="association-list-box" style="display: none;">
+            <ul class="association-list">
+            </ul>
         </div>
             </section>
         </div>
@@ -132,6 +138,7 @@
     })
 
     </script>
+    <script src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/js/association.js?v={{Msg "seo" "version"}}"></script>
 <!--百度统计end-->
 {{include "/common/baiducc.html"}}
 </body>

+ 3 - 0
src/jfw/modules/app/src/web/templates/frontRouter/collection/sess/index.html

@@ -12,6 +12,7 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
     <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/css/bid-status-update.css?v={{Msg "seo" "version"}}'></link>
+    <link rel="stylesheet" type="text/css" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/css/popup-data-export.css?v={{Msg "seo" "version"}}'/>
 </head>
 <style>
   .list-mian{
@@ -157,6 +158,7 @@
       <van-popup class="j-container" :style="popupHeight" v-model="showBidStatus" round position="bottom">
         <bid-status-node @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
       </van-popup>
+      <popup-data-export ref="popup_dataExport" @next="next_export"></popup-data-export>
     </div>
   </div>
   <!--S-当前页面的资源-->
@@ -173,6 +175,7 @@
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/bidstatus-update/js/bid-status-update.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/index.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/dataExport/components/popup-data-export.js?v={{Msg "seo" "version"}}'></script>
   {{include "/common/baiducc.html"}}
 </body>
 

+ 5 - 7
src/jfw/modules/bigmember/src/entity/portrait_screen.go

@@ -442,13 +442,11 @@ func (pwp *PortraitProjectScreen) FreePortraitNews(mustQueryArr []string, isWinn
 			}
 		}
 		if isTrue {
-			go func() {
-				redis.Put("other", redisKey, map[string]interface{}{
-					"list":       dataArr,
-					"total":      total,
-					"updateTime": updateTime,
-				}, 24*3600*config.Config.PortraitDynamicTime)
-			}()
+			redis.Put("other", redisKey, map[string]interface{}{
+				"list":       dataArr,
+				"total":      total,
+				"updateTime": updateTime,
+			}, 24*3600*config.Config.PortraitDynamicTime)
 		}
 	}
 	data = &dataArr

+ 13 - 1
src/jfw/modules/bigmember/src/service/portrait/memberPortraitAction.go

@@ -1,16 +1,18 @@
 package portrait
 
 import (
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
 	"fmt"
+	"jy/src/jfw/modules/bigmember/src/config"
 	"jy/src/jfw/modules/bigmember/src/entity"
 	"jy/src/jfw/modules/bigmember/src/util"
 	"log"
+	"regexp"
 	"strings"
 
 	. "app.yhyue.com/moapp/jybase/api"
 	qutil "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/encrypt"
-
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 )
 
@@ -50,6 +52,10 @@ func (this *EntPortrait) EntDetail() {
 		if err != nil {
 			return nil, err
 		}
+		vipData := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+		if vipData.VipStatus <= 0 && vipData.Status <= 0 && vipData.EntnicheStatus <= 0 && entInfo["phone"] != "" {
+			entInfo["phone"] = maskCompanyPhone(qutil.InterfaceToStr(entInfo["phone"]))
+		}
 		return entInfo, nil
 	}()
 	if errMsg != nil {
@@ -58,6 +64,12 @@ func (this *EntPortrait) EntDetail() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
+func maskCompanyPhone(phone string) string {
+	regex := regexp.MustCompile(`(\d{4})$`) // 匹配最后四位数字
+	maskedPhone := regex.ReplaceAllString(phone, "****")
+	return maskedPhone
+}
+
 // WinnerContacts 中标企业历史联系人
 func (this *EntPortrait) WinnerContacts() {
 	userId := qutil.ObjToString(this.GetSession("userId"))

+ 5 - 1
src/jfw/modules/bigmember/src/service/portrait/subvipPortraitAction.go

@@ -49,7 +49,7 @@ func (this *SubVipPortrait) SubVipEntDetail() {
 		if entId == "" {
 			return nil, fmt.Errorf("参数异常")
 		}
-		cepm, _, err, _ := entity.CreateSubVipPortraitManager(userId, "entDetail", entId, true, this.Session())
+		cepm, equity, err, _ := entity.CreateSubVipPortraitManager(userId, "entDetail", entId, true, this.Session())
 		if err != nil {
 			return nil, err
 		}
@@ -57,6 +57,10 @@ func (this *SubVipPortrait) SubVipEntDetail() {
 		if err != nil {
 			return nil, err
 		}
+		vipData := jy.GetBigVipUserBaseMsg(this.Session(), *config.Middleground)
+		if vipData.VipStatus <= 0 && vipData.Status <= 0 && vipData.EntnicheStatus <= 0 && equity != 3 && entInfo["phone"] != "" {
+			entInfo["phone"] = maskCompanyPhone(qutil.InterfaceToStr(entInfo["phone"]))
+		}
 		return entInfo, nil
 	}()
 	if errMsg != nil {

+ 14 - 9
src/jfw/modules/publicapply/src/enterpriseSearch/entity/entQuery.go

@@ -30,13 +30,14 @@ type EnterpriseSearch struct {
 	PageSize int  //每页数量
 	PageNum  int  //页码
 	IsVip    bool //是否是会员
+	IsFree   bool //是否免费用户
 }
 
 const (
 	searchMaxLimit    = 100 //最大查询数量限制
 	freeSearchNum     = 4   //免费查询数量限制
 	entSearchCacheDB  = "other"
-	entSearchCacheKey = "entSearchIndexCache"
+	entSearchCacheKey = "entSearchIndexCache_%v"
 
 	index, itype  = "qyxy", "qyxy"
 	entQuery      = `{"query":{"bool":{"must":[%s],"must_not":[%s]}},"_source":["_id","company_name","company_status","legal_person","capital","company_address","company_shortname","company_phone","establish_date"],"sort":[{"capital":{"order":"desc"}}]}`
@@ -254,7 +255,7 @@ func (es *EnterpriseSearch) GetQuerySql() (string, string) {
 // DoQuery 根据EnterpriseSearch参数进行企业相关查询
 func (es *EnterpriseSearch) DoQuery() (list *[]map[string]interface{}, total int64, err error) {
 	if es.isEmptySearch() { //是否是空查询,返回默认企业
-		list = GetEntIndexShow()
+		list = GetEntIndexShow(es.IsFree)
 		if list != nil {
 			total = int64(len(*list))
 			start := es.PageNum * es.PageSize
@@ -287,7 +288,7 @@ func (es *EnterpriseSearch) DoQuery() (list *[]map[string]interface{}, total int
 	sql = sql[:len(sql)-1] + fmt.Sprintf(`,"from":%d,"size":%d}`, start, limit)
 	list = elastic.Get(index, itype, sql)
 
-	list = formatData(list)
+	list = formatData(list, es.IsFree)
 	if total > config.Config.EntSearchLimit {
 		total = config.Config.EntSearchLimit
 	}
@@ -295,9 +296,13 @@ func (es *EnterpriseSearch) DoQuery() (list *[]map[string]interface{}, total int
 }
 
 // //格式化字段,加密id
-func formatData(list *[]map[string]interface{}) *[]map[string]interface{} {
+func formatData(list *[]map[string]interface{}, isFree bool) *[]map[string]interface{} {
 	if list != nil {
-		for index, _ := range *list {
+		delStr := []string{"_id", "establish_date"}
+		if isFree {
+			delStr = append(delStr, "company_phone")
+		}
+		for index := range *list {
 			(*list)[index]["id"] = encrypt.EncodeArticleId2ByCheck(qutil.ObjToString((*list)[index]["_id"]))
 			if shortname, ok := ((*list)[index]["company_shortname"]).(string); !ok || shortname == "" {
 				(*list)[index]["company_shortname"] = getCompanyShortName(qutil.ObjToString((*list)[index]["company_name"]))
@@ -308,7 +313,7 @@ func formatData(list *[]map[string]interface{}) *[]map[string]interface{} {
 			}
 
 			//清除多余字段
-			for _, key := range []string{"_id", "establish_date"} {
+			for _, key := range delStr {
 				delete((*list)[index], key)
 			}
 		}
@@ -335,8 +340,8 @@ type entIds struct {
 	} `json:"entids"`
 }
 
-func GetEntIndexShow() (list *[]map[string]interface{}) {
-	bytes, err := redis.GetBytes(entSearchCacheDB, entSearchCacheKey)
+func GetEntIndexShow(isFree bool) (list *[]map[string]interface{}) {
+	bytes, err := redis.GetBytes(entSearchCacheDB, fmt.Sprintf(entSearchCacheKey, isFree))
 	if err == nil {
 		if err = json.Unmarshal(*bytes, &list); err == nil && list != nil && len(*list) > 0 {
 			return
@@ -366,7 +371,7 @@ func GetEntIndexShow() (list *[]map[string]interface{}) {
 	sql = sql[:len(sql)-1] + fmt.Sprintf(`,"from":%d,"size":%d}`, 0, 100)
 	listTmp := elastic.Get(index, itype, sql)
 	if listTmp != nil && len(*listTmp) > 0 {
-		list = formatData(listTmp)
+		list = formatData(listTmp, isFree)
 		redis.Put(entSearchCacheDB, entSearchCacheKey, list, 60*60*10)
 	}
 	return

+ 3 - 15
src/jfw/modules/publicapply/src/enterpriseSearch/service/search.go

@@ -39,7 +39,9 @@ func (esa *EnterpriseSearchAction) DoEntSearch() {
 			return nil, err
 		}
 		//查询是否是会员
-		if vipData := jy.GetBigVipUserBaseMsg(esa.Session(), *config.Middleground); vipData.Status > 0 || vipData.VipStatus > 0 {
+		vipData := jy.GetBigVipUserBaseMsg(esa.Session(), *config.Middleground)
+		entSearch.IsFree = vipData.VipStatus <= 0 && vipData.Status <= 0 && vipData.EntnicheStatus <= 0
+		if vipData.Status > 0 || vipData.VipStatus > 0 {
 			entSearch.IsVip = true
 		}
 		//查询
@@ -60,17 +62,3 @@ func (esa *EnterpriseSearchAction) DoEntSearch() {
 	}
 	esa.ServeJson(NewResult(rData, errMsg))
 }
-
-// DefaultEntIndex 首页默认展示企业
-func (esa *EnterpriseSearchAction) DefaultEntIndex() {
-	userId, _ := esa.GetSession("userId").(string)
-	rData, errMsg := func() (interface{}, error) {
-		return map[string]interface{}{
-			"list": entity.GetEntIndexShow(),
-		}, nil
-	}()
-	if errMsg != nil {
-		log.Printf("%s EnterpriseSearchAction DefaultEntIndex:%s\n", userId, errMsg.Error())
-	}
-	esa.ServeJson(NewResult(rData, errMsg))
-}

+ 40 - 43
src/jfw/modules/publicapply/src/go.mod

@@ -13,7 +13,7 @@ require (
 	github.com/alibabacloud-go/tea v1.2.1
 	github.com/alibabacloud-go/tea-utils/v2 v2.0.4
 	github.com/gogf/gf/v2 v2.5.6
-	github.com/zeromicro/go-zero v1.6.0
+	github.com/zeromicro/go-zero v1.5.3
 	go.mongodb.org/mongo-driver v1.13.0
 )
 
@@ -47,8 +47,8 @@ require (
 	github.com/go-logr/logr v1.2.4 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-openapi/jsonpointer v0.19.6 // indirect
-	github.com/go-openapi/jsonreference v0.20.2 // indirect
-	github.com/go-openapi/swag v0.22.4 // indirect
+	github.com/go-openapi/jsonreference v0.20.1 // indirect
+	github.com/go-openapi/swag v0.22.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.5 // indirect
 	github.com/go-sql-driver/mysql v1.7.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
@@ -57,24 +57,23 @@ require (
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/gomodule/redigo v2.0.0+incompatible // indirect
-	github.com/google/gnostic-models v0.6.8 // indirect
+	github.com/google/gnostic v0.5.7-v3refs // indirect
 	github.com/google/go-cmp v0.5.9 // indirect
 	github.com/google/gofuzz v1.2.0 // indirect
-	github.com/google/uuid v1.4.0 // indirect
 	github.com/gorilla/websocket v1.5.0 // indirect
 	github.com/grokify/html-strip-tags-go v0.0.1 // indirect
-	github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect
+	github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/howeyc/fsnotify v0.9.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/now v1.1.1 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/klauspost/compress v1.16.7 // indirect
+	github.com/klauspost/compress v1.15.15 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/mattn/go-colorable v0.1.13 // indirect
-	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/mattn/go-isatty v0.0.19 // indirect
 	github.com/mattn/go-runewidth v0.0.15 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
@@ -86,13 +85,13 @@ require (
 	github.com/olekukonko/tablewriter v0.0.5 // indirect
 	github.com/olivere/elastic v6.2.37+incompatible // indirect
 	github.com/olivere/elastic/v7 v7.0.22 // indirect
-	github.com/openzipkin/zipkin-go v0.4.2 // indirect
-	github.com/pelletier/go-toml/v2 v2.1.0 // indirect
+	github.com/openzipkin/zipkin-go v0.4.1 // indirect
+	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/prometheus/client_golang v1.17.0 // indirect
-	github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect
-	github.com/prometheus/common v0.44.0 // indirect
-	github.com/prometheus/procfs v0.11.1 // indirect
+	github.com/prometheus/client_golang v1.15.1 // indirect
+	github.com/prometheus/client_model v0.3.0 // indirect
+	github.com/prometheus/common v0.42.0 // indirect
+	github.com/prometheus/procfs v0.9.0 // indirect
 	github.com/rivo/uniseg v0.4.4 // indirect
 	github.com/sirupsen/logrus v1.8.3 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
@@ -108,39 +107,37 @@ require (
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.2 // indirect
 	github.com/xdg-go/stringprep v1.0.4 // indirect
-	github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb // indirect
-	go.etcd.io/etcd/api/v3 v3.5.10 // indirect
-	go.etcd.io/etcd/client/pkg/v3 v3.5.10 // indirect
-	go.etcd.io/etcd/client/v3 v3.5.10 // indirect
-	go.opentelemetry.io/otel v1.19.0 // indirect
-	go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 // indirect
-	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 // indirect
-	go.opentelemetry.io/otel/exporters/zipkin v1.19.0 // indirect
-	go.opentelemetry.io/otel/metric v1.19.0 // indirect
-	go.opentelemetry.io/otel/sdk v1.19.0 // indirect
-	go.opentelemetry.io/otel/trace v1.19.0 // indirect
-	go.opentelemetry.io/proto/otlp v1.0.0 // indirect
+	go.etcd.io/etcd/api/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
+	go.etcd.io/etcd/client/v3 v3.5.9 // indirect
+	go.opentelemetry.io/otel v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/jaeger v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 // indirect
+	go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 // indirect
+	go.opentelemetry.io/otel/exporters/zipkin v1.15.1 // indirect
+	go.opentelemetry.io/otel/sdk v1.15.1 // indirect
+	go.opentelemetry.io/otel/trace v1.15.1 // indirect
+	go.opentelemetry.io/proto/otlp v0.19.0 // indirect
 	go.uber.org/atomic v1.10.0 // indirect
-	go.uber.org/automaxprocs v1.5.3 // indirect
+	go.uber.org/automaxprocs v1.5.2 // indirect
 	go.uber.org/multierr v1.9.0 // indirect
 	go.uber.org/zap v1.24.0 // indirect
 	golang.org/x/crypto v0.14.0 // indirect
 	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/oauth2 v0.12.0 // indirect
-	golang.org/x/sync v0.3.0 // indirect
+	golang.org/x/oauth2 v0.7.0 // indirect
+	golang.org/x/sync v0.1.0 // indirect
 	golang.org/x/sys v0.13.0 // indirect
 	golang.org/x/term v0.13.0 // indirect
 	golang.org/x/text v0.13.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
-	google.golang.org/appengine v1.6.8 // indirect
-	google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b // indirect
-	google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b // indirect
-	google.golang.org/grpc v1.59.0 // indirect
+	google.golang.org/appengine v1.6.7 // indirect
+	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
+	google.golang.org/grpc v1.56.1 // indirect
 	google.golang.org/protobuf v1.31.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/inf.v0 v0.9.1 // indirect
@@ -151,12 +148,12 @@ require (
 	gorm.io/driver/mysql v1.0.5 // indirect
 	gorm.io/gorm v1.21.3 // indirect
 	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20231017031425-45003ca9f35a // indirect
-	k8s.io/api v0.28.3 // indirect
-	k8s.io/apimachinery v0.28.3 // indirect
-	k8s.io/client-go v0.28.3 // indirect
-	k8s.io/klog/v2 v2.100.1 // indirect
-	k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect
-	k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
+	k8s.io/api v0.26.3 // indirect
+	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
+	k8s.io/client-go v0.26.3 // indirect
+	k8s.io/klog/v2 v2.90.1 // indirect
+	k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840 // indirect
+	k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
 	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
 	sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
 	sigs.k8s.io/yaml v1.3.0 // indirect

+ 95 - 96
src/jfw/modules/publicapply/src/go.sum

@@ -78,6 +78,7 @@ github.com/ClickHouse/clickhouse-go/v2 v2.2.0/go.mod h1:8f2XZUi7XoeU+uPIytSi1cvx
 github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/RoaringBitmap/roaring v1.5.0/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
@@ -121,11 +122,11 @@ github.com/alibabacloud-go/tea-utils/v2 v2.0.4 h1:SoFgjJuO7pze88j9RBJNbKb7AgTS52
 github.com/alibabacloud-go/tea-utils/v2 v2.0.4/go.mod h1:sj1PbjPodAVTqGTA3olprfeeqqmwD0A5OQz94o9EuXQ=
 github.com/alibabacloud-go/tea-xml v1.1.2 h1:oLxa7JUXm2EDFzMg+7oRsYc+kutgCVwm+bZlhhmvW5M=
 github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8=
+github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
 github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
-github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE=
 github.com/alicebob/miniredis/v2 v2.14.1/go.mod h1:uS970Sw5Gs9/iK3yBg0l9Uj9s25wXxSpQUE9EaJ/Blg=
 github.com/alicebob/miniredis/v2 v2.22.0/go.mod h1:XNqvJdQJv5mSuVMc0ynneafpnL/zv52acZ6kqeS0t88=
-github.com/alicebob/miniredis/v2 v2.31.0 h1:ObEFUNlJwoIiyjxdrYF0QIDE7qXcLc7D3WpSH4c22PU=
+github.com/alicebob/miniredis/v2 v2.30.3 h1:hrqDB4cHFSHQf4gO3xu6YKQg8PqJpNjLYsQAFYHstqw=
 github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY=
 github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw=
 github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q=
@@ -153,6 +154,7 @@ github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414
 github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
 github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
@@ -169,6 +171,7 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
 github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 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-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 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=
@@ -217,6 +220,7 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 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.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
 github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 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=
@@ -272,12 +276,11 @@ github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34
 github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
 github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
 github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
-github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
+github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
 github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
 github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
-github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU=
-github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
 github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
 github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
@@ -294,7 +297,6 @@ github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrt
 github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
 github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8=
 github.com/go-xorm/builder v0.3.4/go.mod h1:KxkQkNN1DpPKTedxXyTQcmH+rXfvk4LZ9SOOBoZBAxw=
 github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
@@ -340,7 +342,8 @@ github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w
 github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
 github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
+github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
 github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -384,8 +387,8 @@ github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
-github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
-github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
+github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
+github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
 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=
@@ -419,14 +422,12 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
 github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
-github.com/google/pprof v0.0.0-20211214055906-6f57359322fd h1:1FjCyPC+syAzJ5/2S8fqdZK1R22vvA0J7JZKcuOIQ7Y=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
-github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
@@ -454,8 +455,9 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf
 github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0=
 github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0 h1:1JYBfzqrWPcCclBwxFCPAou9n+q86mfnu7NAeHfte7A=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.0/go.mod h1:YDZoGHuwE+ov0c8smSH49WLF3F2LaWnYYuDVd+EWrc0=
 github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
 github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
 github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
@@ -557,8 +559,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
-github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
-github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw=
+github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -609,8 +611,8 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
-github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
 github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
@@ -671,7 +673,7 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
 github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
 github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
 github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
+github.com/onsi/ginkgo/v2 v2.7.0 h1:/XxtEV3I3Eif/HobnVx9YmJgk8ENdRsuUmM+fLCFNow=
 github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
@@ -680,18 +682,18 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
 github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
 github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
 github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
-github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
+github.com/onsi/gomega v1.26.0 h1:03cDLK28U6hWvCAns6NeydX3zIm4SF3ci69ulidS32Q=
 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
 github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
 github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ=
-github.com/openzipkin/zipkin-go v0.4.2 h1:zjqfqHjUpPmB3c1GlCvvgsM1G4LkvqQbBDueDOCg/jA=
-github.com/openzipkin/zipkin-go v0.4.2/go.mod h1:ZeVkFjuuBiSy13y8vpSDCjMi9GoI3hPpCJSBx/EYFhY=
+github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfPcEO5A=
+github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM=
 github.com/paulmach/orb v0.7.1/go.mod h1:FWRlTgl88VI1RBx/MkrwWDRhQ96ctqMCh8boXhmqB/A=
 github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY=
 github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
 github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI=
-github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
-github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
+github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
+github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
 github.com/pierrec/lz4 v2.5.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
@@ -714,23 +716,23 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP
 github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
-github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
-github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
+github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
+github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM=
-github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
+github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
+github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
 github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
 github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
-github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
+github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
+github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -738,8 +740,8 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
-github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
+github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
+github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
 github.com/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg=
 github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
@@ -753,7 +755,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L
 github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
 github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
@@ -783,6 +785,7 @@ github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
 github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
@@ -818,8 +821,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F
 github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
-github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
 github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
 github.com/tal-tech/go-zero v1.1.5/go.mod h1:LbN0C7/rbl2+LUWTSUYx5leXmgedeMWjt1jc3/8/zFA=
@@ -853,9 +856,8 @@ github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHM
 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
 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/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk=
-github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -870,22 +872,22 @@ github.com/yuin/gopher-lua v1.1.0 h1:BojcDhfyDWgU2f2TOzYK/g5p2gxMrku8oupLDqlnSqE
 github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 github.com/zeromicro/go-zero v1.3.5/go.mod h1:wh4o794b7Ul3W0k35Pw9nc3iB4O0OpaQTMQz/PJc1bc=
-github.com/zeromicro/go-zero v1.6.0 h1:UwSOR1lGZ2g7L0S07PM8RoneAcubtd5x//EfbuNucQ0=
-github.com/zeromicro/go-zero v1.6.0/go.mod h1:E9GCFPb0SwsTKFBcFr9UynGvXiDMmfc6fI5F15vqvAQ=
+github.com/zeromicro/go-zero v1.5.3 h1:9poyd+raeL7gSMUu6P19N7bssTppieR2j7Oos2j1yFQ=
+github.com/zeromicro/go-zero v1.5.3/go.mod h1:dmoBpgJTxt9KWmgrNGpv06XxZRPXMakrxUVgROFAR3g=
 github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb h1:uWiILQloLUVdtPYr1ZZo2zqtlpzo4G8vUpglo/Fs2H8=
 github.com/ziutek/blas v0.0.0-20190227122918-da4ca23e90bb/go.mod h1:J3xKssoVdrwZ2E29fIox/EKxOZWimS7AZ4fOTCFkOLo=
 github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 go.etcd.io/etcd v0.0.0-20200402134248-51bdeb39e698/go.mod h1:YoUyTScD3Vcv2RBm3eGVOq7i1ULiz3OuXoQFWOirmAM=
 go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
-go.etcd.io/etcd/api/v3 v3.5.10 h1:szRajuUUbLyppkhs9K6BRtjY37l66XQQmw7oZRANE4k=
-go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI=
+go.etcd.io/etcd/api/v3 v3.5.9 h1:4wSsluwyTbGGmyjJktOf3wFQoTBIURXHnq9n/G/JQHs=
+go.etcd.io/etcd/api/v3 v3.5.9/go.mod h1:uyAal843mC8uUVSLWz6eHa/d971iDGnCRpmKd2Z+X8k=
 go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/pkg/v3 v3.5.10 h1:kfYIdQftBnbAq8pUWFXfpuuxFSKzlmM5cSn76JByiT0=
-go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U=
+go.etcd.io/etcd/client/pkg/v3 v3.5.9 h1:oidDC4+YEuSIQbsR94rY9gur91UPL6DnxDCIYd2IGsE=
+go.etcd.io/etcd/client/pkg/v3 v3.5.9/go.mod h1:y+CzeSmkMpWN2Jyu1npecjB9BBnABxGM4pN8cGuJeL4=
 go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
-go.etcd.io/etcd/client/v3 v3.5.10 h1:W9TXNZ+oB3MCd/8UjxHTWK5J9Nquw9fQBLJd5ne5/Ao=
-go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc=
+go.etcd.io/etcd/client/v3 v3.5.9 h1:r5xghnU7CwbUxD/fbUtRyJGaYNfDun8sp/gTr1hew6E=
+go.etcd.io/etcd/client/v3 v3.5.9/go.mod h1:i/Eo5LrZ5IKqpbtpPDuaUnDOUv471oDg8cjQaUr2MbA=
 go.mongodb.org/mongo-driver v1.5.0/go.mod h1:boiGPFqyBs5R0R5qf2ErokGRekMfwn+MqKaUyHs7wy0=
 go.mongodb.org/mongo-driver v1.9.0/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
 go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
@@ -902,38 +904,38 @@ go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnf
 go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
 go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
 go.opentelemetry.io/otel v1.8.0/go.mod h1:2pkj+iMj0o03Y+cW6/m8Y4WkRdYN3AvCXCnzRMp9yvM=
-go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs=
-go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY=
+go.opentelemetry.io/otel v1.15.1 h1:3Iwq3lfRByPaws0f6bU3naAqOR1n5IeDWd9390kWHa8=
+go.opentelemetry.io/otel v1.15.1/go.mod h1:mHHGEHVDLal6YrKMmk9LqC4a3sF5g+fHfrttQIB1NTc=
 go.opentelemetry.io/otel/exporters/jaeger v1.8.0/go.mod h1:GbWg+ng88rDtx+id26C34QLqw2erqJeAjsCx9AFeHfE=
-go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4=
-go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0 h1:Nw7Dv4lwvGrI68+wULbcq7su9K2cebeCUrDjVrUJHxM=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.19.0/go.mod h1:1MsF6Y7gTqosgoZvHlzcaaM8DIMNZgJh87ykokoNH7Y=
+go.opentelemetry.io/otel/exporters/jaeger v1.15.1 h1:x3SLvwli0OyAJapNcOIzf1xXBRBA+HD3elrMQmFfmXo=
+go.opentelemetry.io/otel/exporters/jaeger v1.15.1/go.mod h1:0Ck9b5oLL/bFZvfAEEqtrb1U0jZXjm5fWXMCOCG3vvM=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1 h1:XYDQtNzdb2T4uM1pku2m76eSMDJgqhJ+6KzkqgQBALc=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.1/go.mod h1:uOTV75+LOzV+ODmL8ahRLWkFA3eQcSC2aAsbxIu4duk=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1 h1:tyoeaUh8REKay72DVYsSEBYV18+fGONe+YYPaOxgLoE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.1/go.mod h1:HUSnrjQQ19KX9ECjpQxufsF+3ioD3zISPMlauTPZu2g=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1 h1:pIfoG5IAZFzp9EUlJzdSkpUwpaUAAnD+Ru1nBLTACIQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.15.1/go.mod h1:poNKBqF5+nR/6ke2oGTDjHfksrsHDOHXAl2g4+9ONsY=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1 h1:pnJfHmVcCEBcH5lkM+npJF8cTAjV/d+9cXVNCs5P/ao=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.15.1/go.mod h1:cC3Eu2V56zXY09YlijmqDhOUnL2jVL6KKJg4PGh++dU=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0 h1:sEL90JjOO/4yhquXl5zTAkLLsZ5+MycAgX99SDsxGc8=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.14.0/go.mod h1:oCslUcizYdpKYyS9e8srZEqM6BB8fq41VJBjLAE6z1w=
 go.opentelemetry.io/otel/exporters/zipkin v1.8.0/go.mod h1:0uYAyCuGT67MFV9Z/Mmx93wGuugHw0FbxMc74fs3LNo=
-go.opentelemetry.io/otel/exporters/zipkin v1.19.0 h1:EGY0h5mGliP9o/nIkVuLI0vRiQqmsYOcbwCuotksO1o=
-go.opentelemetry.io/otel/exporters/zipkin v1.19.0/go.mod h1:JQgTGJP11yi3o4GHzIWYodhPisxANdqxF1eHwDSnJrI=
-go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE=
-go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8=
+go.opentelemetry.io/otel/exporters/zipkin v1.15.1 h1:B6s/o48bx00ayJu7F+jIMJfhPTyxW+S8vthjTZMNBj0=
+go.opentelemetry.io/otel/exporters/zipkin v1.15.1/go.mod h1:EjjV7/YfYXG+khxCOfG6PPeRGoOmtcSusyW66qPqpRQ=
 go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
 go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
 go.opentelemetry.io/otel/sdk v1.8.0/go.mod h1:uPSfc+yfDH2StDM/Rm35WE8gXSNdvCg023J6HeGNO0c=
-go.opentelemetry.io/otel/sdk v1.19.0 h1:6USY6zH+L8uMH8L3t1enZPR3WFEmSTADlqldyHtJi3o=
-go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A=
+go.opentelemetry.io/otel/sdk v1.15.1 h1:5FKR+skgpzvhPQHIEfcwMYjCBr14LWzs3uSqKiQzETI=
+go.opentelemetry.io/otel/sdk v1.15.1/go.mod h1:8rVtxQfrbmbHKfqzpQkT5EzZMcbMBwTzNAggbEAM0KA=
 go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=
 go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
 go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
 go.opentelemetry.io/otel/trace v1.8.0/go.mod h1:0Bt3PXY8w+3pheS3hQUt+wow8b1ojPaTBoTCh2zIFI4=
-go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg=
-go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo=
+go.opentelemetry.io/otel/trace v1.15.1 h1:uXLo6iHJEzDfrNC0L0mNjItIp06SyaBQxu5t3xMlngY=
+go.opentelemetry.io/otel/trace v1.15.1/go.mod h1:IWdQG/5N1x7f6YUlmdLeJvH9yxtuJAfc4VW5Agv9r/8=
 go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
-go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
+go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
+go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
 go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
@@ -944,8 +946,8 @@ go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0
 go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA=
 go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q=
 go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU=
-go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
-go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
+go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME=
+go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
 go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
@@ -1095,8 +1097,9 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ
 golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4=
-golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
+golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
 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=
@@ -1110,9 +1113,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/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.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
-golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1303,7 +1305,6 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM=
 golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1337,9 +1338,8 @@ google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
-google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
-google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -1381,14 +1381,11 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D
 google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
 google.golang.org/genproto v0.0.0-20220228195345-15d65a4533f7/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
-google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b h1:+YaDE2r2OG8t/z5qmsh7Y+XXwCbvadxxZ0YY6mTdrVA=
-google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI=
-google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b h1:CIC2YMXmIhYw6evmhPxBKJ4fmLbOFtXQN/GV3XOZR8k=
-google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:IBQ646DjkDkvUIsVq/cc03FUFQ9wbZu7yE396YcL870=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b h1:ZlWIi1wSK56/8hn4QcBp/j9M7Gt3U/3hZw3mC7vDICo=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc=
+google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
+google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
 google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
@@ -1410,13 +1407,15 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5
 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
 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.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
 google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
+google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
 google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
-google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
-google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
+google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ=
+google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s=
 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=
@@ -1497,27 +1496,27 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
 jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20231017031425-45003ca9f35a h1:kwjO4pqB3gnNGrQ9aXyz6f8s9qXAUenPUDWip8gYR/Q=
 jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20231017031425-45003ca9f35a/go.mod h1:p/595fgbj4r6GhSJhHDpx3Ru1NkD5UASFL8OuIQw09E=
 k8s.io/api v0.22.9/go.mod h1:rcjO/FPOuvc3x7nQWx29UcDrFJMx82RxDob71ntNH4A=
-k8s.io/api v0.28.3 h1:Gj1HtbSdB4P08C8rs9AR94MfSGpRhJgsS+GF9V26xMM=
-k8s.io/api v0.28.3/go.mod h1:MRCV/jr1dW87/qJnZ57U5Pak65LGmQVkKTzf3AtKFHc=
+k8s.io/api v0.26.3 h1:emf74GIQMTik01Aum9dPP0gAypL8JTLl/lHa4V9RFSU=
+k8s.io/api v0.26.3/go.mod h1:PXsqwPMXBSBcL1lJ9CYDKy7kIReUydukS5JiRlxC3qE=
 k8s.io/apimachinery v0.22.9/go.mod h1:ZvVLP5iLhwVFg2Yx9Gh5W0um0DUauExbRhe+2Z8I1EU=
-k8s.io/apimachinery v0.28.3 h1:B1wYx8txOaCQG0HmYF6nbpU8dg6HvA06x5tEffvOe7A=
-k8s.io/apimachinery v0.28.3/go.mod h1:uQTKmIqs+rAYaq+DFaoD2X7pcjLOqbQX2AOiO0nIpb8=
+k8s.io/apimachinery v0.27.0-alpha.3 h1:uujqsdFrbqF+cEbqFHrkLKp+s3XxRgphTpc6Yg84qLo=
+k8s.io/apimachinery v0.27.0-alpha.3/go.mod h1:TO4higCGNMwebVSdb1XPJdXMU4kk+nmMY/cTMVCGa6M=
 k8s.io/client-go v0.22.9/go.mod h1:IoH7exYnoH/zgvHOuVxh2c4yJepcCBt72FzCTisOc4k=
-k8s.io/client-go v0.28.3 h1:2OqNb72ZuTZPKCl+4gTKvqao0AMOl9f3o2ijbAj3LI4=
-k8s.io/client-go v0.28.3/go.mod h1:LTykbBp9gsA7SwqirlCXBWtK0guzfhpoW4qSm7i9dxo=
+k8s.io/client-go v0.26.3 h1:k1UY+KXfkxV2ScEL3gilKcF7761xkYsSD6BC9szIu8s=
+k8s.io/client-go v0.26.3/go.mod h1:ZPNu9lm8/dbRIPAgteN30RSXea6vrCpFvq+MateTUuQ=
 k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
 k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
 k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
 k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
-k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg=
-k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
+k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
 k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
-k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780=
-k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA=
+k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840 h1:1Q4XWtrQQh04ZweCpL7aMNYafFMoPEiST4dl5b4PmYw=
+k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840/go.mod h1:y5VtZWM9sHHc2ZodIH/6SHzXj+TPU5USoA8lcIeKEKY=
 k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 k8s.io/utils v0.0.0-20220706174534-f6158b442e7c/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
-k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 48 - 46
src/jfw/modules/subscribepay/src/dataexport.json


+ 1 - 1
src/jfw/modules/subscribepay/src/entity/dataExportPackStruct.go

@@ -392,7 +392,7 @@ func (this *dataExportPackStruct) DoPerPackRepeatCheck(userId string, isSenior b
 // GetExcelFile 数据包生成excel文件
 func GetExcelFile(selectId string, checkCount int, isSenior bool, success func(excelPath string, exportIds []string), fail func(error)) {
 	list, err := dataexport.GetDataExportSearchResultByScdId(util.MQFW, util.Mgo_bidding, config.Config.Mongobidding.DbName, config.Config.Elasticsearch, selectId, qutil.If(isSenior, "2", "1").(string), checkCount)
-	url := util.GetExcelFilePath(pay.GetOrderCode(selectId))
+	url := util.GetExcelFilePath(pay.GetOrderCode(selectId), checkCount)
 	if err == nil && list != nil && len(*list) > 0 {
 		list = dataexport.FormatExportData(util.MQFWENT, list, config.Config.WebDomain, "2")
 		err = util.CreateDataExportExcelFile(list, isSenior, config.ExConf.ExcelPayedPath+url) //创建excel文件

+ 5 - 2
src/jfw/modules/subscribepay/src/entity/dataexport.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"io/ioutil"
 	"jy/src/jfw/modules/subscribepay/src/config"
+	"jy/src/jfw/modules/subscribepay/src/pay"
 	"jy/src/jfw/modules/subscribepay/src/util"
 	"log"
 	"os"
@@ -83,9 +84,11 @@ func (d *dataExportStruct) PayCallBack(param *CallBackParam) bool {
 				"out_trade_no": param.OutTradeno,
 			}
 			orderCode := qutil.ObjToString((*orderdata)["order_code"])
+			dataCount := qutil.IntAll((*orderdata)["data_count"])
+
 			download_url := qutil.ObjToString((*orderdata)["download_url"])
 			if download_url == "" { //若未生成execl
-				download_url = util.GetExcelFilePath(orderCode)
+				download_url = util.GetExcelFilePath(orderCode, dataCount)
 				updateMap["download_url"] = download_url
 			}
 
@@ -95,7 +98,7 @@ func (d *dataExportStruct) PayCallBack(param *CallBackParam) bool {
 			if update {
 				//先发个通知
 				go SendMailToBJFinance(orderdata, pay_time, param.TransactionId, 1, config.GmailAuth)
-
+				go pay.CheckSave(userId, qutil.InterfaceToStr((*orderdata)["filter_id"])) //数据导出成功保存筛选条件
 				//发送邮件移至定时任务
 				//go SendMailToPayUser(orderdata, float64(param.CashFee)/100, pay_time, download_url, config.GmailAuth)
 

+ 32 - 27
src/jfw/modules/subscribepay/src/entity/order.go

@@ -25,7 +25,7 @@ import (
 	"github.com/shopspring/decimal"
 )
 
-//资源包
+// 资源包
 type commonOrderStruct struct {
 }
 
@@ -88,15 +88,18 @@ func (this *commonOrderStruct) RequestCheck(product string, m map[string]interfa
 }
 
 /*
-	param
-		product:产品类型
-		m:订单需要的参数
-		lotteryId, discountId:优惠券相关
-		sess:session
-		activityType 活动类型 0满减、1折扣券、2满赠、3促销、4限时折扣、5限时减免  0、1才有券 2以后没券(虚假的券)
-	return
-		insertMap:创建订单的参数
-		msg:错误信息
+param
+
+	product:产品类型
+	m:订单需要的参数
+	lotteryId, discountId:优惠券相关
+	sess:session
+	activityType 活动类型 0满减、1折扣券、2满赠、3促销、4限时折扣、5限时减免  0、1才有券 2以后没券(虚假的券)
+
+return
+
+	insertMap:创建订单的参数
+	msg:错误信息
 */
 func (this *commonOrderStruct) InserMap(product, productId, userid, lotteryId, discountId string, m map[string]interface{}, session *httpsession.Session, activityType int) (orderinfo *OrderInfo, msg string) {
 	switch product {
@@ -240,7 +243,7 @@ func dataExportCheck(m map[string]interface{}, sess *httpsession.Session) string
 	return ""
 }
 
-//历史数据
+// 历史数据
 func dataExportOrder(m map[string]interface{}, userId string) (*OrderInfo, string) {
 	id := encrypt.SE.Decode4Hex(qu.ObjToString(m["id"]))
 	if id == "" {
@@ -309,7 +312,7 @@ func dataExportOrder(m map[string]interface{}, userId string) (*OrderInfo, strin
 	}
 
 	ordercode := pay.GetOrderCode(userId)
-	download_url := util.GetExcelFilePath(ordercode)
+	download_url := util.GetExcelFilePath(ordercode, data_count)
 	go func() {
 		list, err := dataexport.GetDataExportSearchResultByScdId(util.MQFW, util.Mgo_bidding, config.Config.Mongobidding.DbName, config.Config.Elasticsearch, id, qu.If(data_spec == "高级字段包", "2", "1").(string), data_count)
 		if err == nil && list != nil && len(*list) > 0 {
@@ -359,7 +362,7 @@ func (this *commonOrderStruct) DataExportPhoneAndMailCheck(sess *httpsession.Ses
 	return
 }
 
-//商机管理
+// 商机管理
 func entnicheOrder(m map[string]interface{}, userId string) (*OrderInfo, string) {
 	if phone, _ := util.GetMyPhoneAndName(userId); phone == "" {
 		return nil, "未绑定手机号"
@@ -446,7 +449,7 @@ var EntnichePirce entnichePrice
 
 type entnichePrice struct{}
 
-//商机管理计算价格
+// 商机管理计算价格
 func (this *entnichePrice) GetOrderMoney(userId string, personnum, cycle int) int {
 	if personnum < 5 || cycle < 1 {
 		log.Println(userId, "商机管理订单personnum、cycle参数不合法", personnum, cycle)
@@ -478,7 +481,7 @@ func (this *entnichePrice) GetOrderMoney(userId string, personnum, cycle int) in
 	return order_money
 }
 
-//获取解密后的企业id
+// 获取解密后的企业id
 func DecodeEntId(encodeId string) int {
 	encodeId = strings.TrimSpace(encodeId)
 	if encodeId == "" {
@@ -495,7 +498,7 @@ func DecodeEntId(encodeId string) int {
 	return id
 }
 
-//超级订阅
+// 超级订阅
 func vipOrder(m map[string]interface{}, userId string, session *httpsession.Session) (*OrderInfo, string) {
 	types := qu.ObjToString(m["type"])
 	switch types {
@@ -509,7 +512,7 @@ func vipOrder(m map[string]interface{}, userId string, session *httpsession.Sess
 	return nil, "未知类型"
 }
 
-//超级订阅首次购买
+// 超级订阅首次购买
 func vipFirstBuy(m map[string]interface{}, userId string, session *httpsession.Session) (*OrderInfo, string) {
 	//area := qu.ObjToMap(m["area"])          //地区  p195不再选择地区 只选择数量
 	areaCount := qu.IntAll(m["areaCount"]) //地区
@@ -629,7 +632,7 @@ func vipFirstBuy(m map[string]interface{}, userId string, session *httpsession.S
 	}, ""
 }
 
-//超级订阅续费
+// 超级订阅续费
 func vipRenew(m map[string]interface{}, userId string, session *httpsession.Session) (*OrderInfo, string) {
 	disWord := qu.ObjToString(m["disWord"])
 	// req_price := qu.IntAll(m["price"])
@@ -725,7 +728,7 @@ func vipRenew(m map[string]interface{}, userId string, session *httpsession.Sess
 	}, ""
 }
 
-//超级订阅升级
+// 超级订阅升级
 func vipUpgrade(m map[string]interface{}, userId string, session *httpsession.Session) (*OrderInfo, string) {
 	areaCount := qu.IntAll(m["areaCount"]) //地区
 	//area := qu.ObjToMap(m["area"])                  //地区  p195不再选择地区 只选数量
@@ -879,7 +882,7 @@ func vipUpgrade(m map[string]interface{}, userId string, session *httpsession.Se
 	return orderinfo, ""
 }
 
-//大会员
+// 大会员
 func memberOrder(m map[string]interface{}, userId string, session *httpsession.Session) (*OrderInfo, string) {
 	//校验是否有转账待审核订单
 	num := util.Mysql.Count("dataexport_order", map[string]interface{}{
@@ -930,7 +933,7 @@ func memberOrder(m map[string]interface{}, userId string, session *httpsession.S
 	}, ""
 }
 
-//剑鱼币
+// 剑鱼币
 func integralOrder(m map[string]interface{}, userId string) (*OrderInfo, string) {
 	//参数验证 price:价格(已折扣);score:购买积分
 	price := qu.IntAll(m["price"])
@@ -968,7 +971,7 @@ func integralOrder(m map[string]interface{}, userId string) (*OrderInfo, string)
 	}, ""
 }
 
-//数据流量包
+// 数据流量包
 func dataexportPackOrder(m map[string]interface{}, userId string) (*OrderInfo, string) {
 	packId := qu.ObjToString(m["packId"])
 	// 获取用户分销口令
@@ -1015,7 +1018,7 @@ func dataexportPackOrder(m map[string]interface{}, userId string) (*OrderInfo, s
 	}, ""
 }
 
-//省份订阅包
+// 省份订阅包
 func areaPackOrder(m map[string]interface{}, userId string, session *httpsession.Session) (*OrderInfo, string) {
 	orderType := qu.IntAll(m["orderType"])
 	area := qu.ObjToMap(m["area"])
@@ -1108,7 +1111,7 @@ func areaPackOrder(m map[string]interface{}, userId string, session *httpsession
 	return orderinfo, ""
 }
 
-//附件下载包
+// 附件下载包
 func filePackOrder(m map[string]interface{}, userId string, session *httpsession.Session) (*OrderInfo, string) {
 	data := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
 	if data.VipStatus <= 0 {
@@ -1156,7 +1159,9 @@ func filePackOrder(m map[string]interface{}, userId string, session *httpsession
 	useProduct :产品类型
 	useProductType:商品类型 0普通的 1线上课程
 	discountId:活动赠品对应标识
+
 return:
+
 	timeNum:赠送数量
 	查看赠品
 */
@@ -1182,7 +1187,7 @@ func GiveInfo(userid string, useProduct, useProductType, discountId int) []map[s
 	return nil
 }
 
-//采购单位画像包 -超级订阅升级版用户可以购买使用
+// 采购单位画像包 -超级订阅升级版用户可以购买使用
 func buyerPortraitPackOrder(m map[string]interface{}, userId string, session *httpsession.Session) (*OrderInfo, string) {
 	uData := jy.GetBigVipUserBaseMsg(session, *config.Middleground)
 	if uData.VipStatus <= 0 || uData.Vip_BuySet.Upgrade <= 0 {
@@ -1224,7 +1229,7 @@ func buyerPortraitPackOrder(m map[string]interface{}, userId string, session *ht
 	}, ""
 }
 
-//数据报告
+// 数据报告
 func newDataReportOrder(m map[string]interface{}, userId string) (*OrderInfo, string) {
 	reportId := qu.IntAll(m["reportId"]) //报告id
 	email := qu.ObjToString(m["email"])
@@ -1285,7 +1290,7 @@ func newDataReportOrder(m map[string]interface{}, userId string) (*OrderInfo, st
 	}, ""
 }
 
-//中标必听课
+// 中标必听课
 func courseOnlineOrder(m map[string]interface{}, userId string) (*OrderInfo, string) {
 	pay_way := "wx_app"
 	_id := qu.ObjToString(m["courseId"])

+ 25 - 27
src/jfw/modules/subscribepay/src/entity/subscribeVip.go

@@ -329,6 +329,15 @@ func (this *vipSubscribeStruct) GetUserLastOrderDetaul(userid string) (VipSimple
 	}
 	return vmsg, nil
 }
+func (this *vipSubscribeStruct) ClearCache(userId string) {
+	positionId := util.MongoIdToPositionId(userId)
+	jy.ClearBigVipUserPower(positionId)
+	config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
+		PositionId: positionId,
+		AppId:      "10000",
+	})
+	config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+}
 
 // 设置开始使用vip订阅
 func (this *vipSubscribeStruct) StartSubVip(userId string, vmsg VipSimpleMsg, startTime, endTime time.Time, isTrial bool, positionType, entId, entUserId int64) bool {
@@ -357,14 +366,7 @@ func (this *vipSubscribeStruct) StartSubVip(userId string, vmsg VipSimpleMsg, st
 
 	util.MergeKws(userId, positionType, entId, entUserId) //初始化vip订阅关键词
 	redis.Del("other", "p1_indexMessage_"+userId)         //清除redis中vip状态
-	positionId := util.MongoIdToPositionId(userId)
-	jy.ClearBigVipUserPower(positionId)
-	config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-		PositionId: positionId,
-		AppId:      "10000",
-	})
-	config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
-
+	this.ClearCache(userId)
 	return true
 }
 
@@ -385,6 +387,7 @@ func (this *vipSubscribeStruct) RenewSubVip(userId string, end string) bool {
 		log.Printf("%s更新结束%d日期出错\n", userId, endTime.Unix())
 		return false
 	}
+	this.ClearCache(userId)
 	return true
 }
 
@@ -424,6 +427,7 @@ func (this *vipSubscribeStruct) WillNew(userId string, vmsg VipSimpleMsg, start,
 		log.Printf("%s续费保存续费表出错 %+v\n", userId, value)
 		return false
 	} else {
+		this.ClearCache(userId)
 		return true
 	}
 }
@@ -464,13 +468,7 @@ func (this *vipSubscribeStruct) UpgradeSubVip(userId string, vmsg VipSimpleMsg,
 		log.Printf("%s更新用户出错 %+v\n", userId, updata)
 		return false
 	} else {
-		positionId := util.MongoIdToPositionId(userId)
-		jy.ClearBigVipUserPower(positionId)
-		config.Middleground.UserCenter.WorkDesktopClearUserInfo(pb.WorkDesktopClearUserInfoReq{
-			PositionId: positionId,
-			AppId:      "10000",
-		})
-		config.Middleground.PowerCheckCenter.DelCheckRedis("10000", qutil.Int64All(positionId))
+		this.ClearCache(userId)
 		return true
 	}
 }
@@ -603,18 +601,18 @@ func (this *vipSubscribeStruct) SubChange(userId string, oldVip, areaNew *map[st
 	if !updateOk {
 		return false
 	}
-    //保存修改日志
-    go func() {
-        util.MQFW.Save("subvip_edit_log", map[string]interface{}{
-            "s_userid":         userId,
-            "o_area_old":       (*oldVip)["o_area"],
-            "a_buyerclass_old": (*oldVip)["a_buyerclass"],
-            "o_area":           areaNew,
-            "a_buyerclass":     industryNew,
-            "l_changeTime":     time.Now().Unix(),
-        })
-    }()
-    return true
+	//保存修改日志
+	go func() {
+		util.MQFW.Save("subvip_edit_log", map[string]interface{}{
+			"s_userid":         userId,
+			"o_area_old":       (*oldVip)["o_area"],
+			"a_buyerclass_old": (*oldVip)["a_buyerclass"],
+			"o_area":           areaNew,
+			"a_buyerclass":     industryNew,
+			"l_changeTime":     time.Now().Unix(),
+		})
+	}()
+	return true
 }
 
 // 获取省份,城市,行业购买内容

+ 2 - 2
src/jfw/modules/subscribepay/src/go.mod

@@ -5,7 +5,7 @@ go 1.20
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7
+	app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.15-0.20230925060020-8e4db0f1e13e
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
@@ -14,6 +14,7 @@ require (
 	github.com/tealeg/xlsx v1.0.5
 	go.mongodb.org/mongo-driver v1.11.6
 	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22
+	k8s.io/apimachinery v0.27.0-alpha.3
 )
 
 require (
@@ -139,7 +140,6 @@ require (
 	gorm.io/gorm v1.21.3 // indirect
 	jygit.jydev.jianyu360.cn/ApplicationCenter/publicService v0.0.0-20231017031425-45003ca9f35a // indirect
 	k8s.io/api v0.26.3 // indirect
-	k8s.io/apimachinery v0.27.0-alpha.3 // indirect
 	k8s.io/client-go v0.26.3 // indirect
 	k8s.io/klog/v2 v2.90.1 // indirect
 	k8s.io/kube-openapi v0.0.0-20230307230338-69ee2d25a840 // indirect

+ 2 - 2
src/jfw/modules/subscribepay/src/go.sum

@@ -9,8 +9,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b h1:Wtytm2QqQWtBV+s
 app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
-app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7 h1:i7sFy+e/zjqhTQci+0x4E1qEXZOEYCIe6EDug+8LyFk=
-app.yhyue.com/moapp/jypkg v1.0.7-0.20231114011545-acf570b01ea7/go.mod h1:LuxdVd+j3uwm7N5j2hivmpPU0LJytEV7iwAIljdoc4Q=
+app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3 h1:6Jv5DcoGYCsHVMwUjvlZubuTgY/vu4fWP5+rcXIKNj0=
+app.yhyue.com/moapp/jypkg v1.0.7-0.20231114075116-499de5b076d3/go.mod h1:LuxdVd+j3uwm7N5j2hivmpPU0LJytEV7iwAIljdoc4Q=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

+ 121 - 0
src/jfw/modules/subscribepay/src/pay/derivedCondition.go

@@ -0,0 +1,121 @@
+package pay
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	qutil "jy/src/jfw/modules/subscribepay/src/util"
+	"k8s.io/apimachinery/pkg/util/json"
+	"sort"
+	"strings"
+	"time"
+)
+
+func CheckSave(userid, filterId string) {
+	if filterId == "" || userid == "" {
+		return
+	}
+	id, _ := primitive.ObjectIDFromHex(filterId)
+	dataMap, ok := qutil.MQFW.FindOne("export_search", map[string]interface{}{
+		"s_userid":   userid,
+		"_id":        id,
+		"comeinfrom": "exportPage",
+	})
+	if !ok || dataMap == nil || len(*dataMap) == 0 {
+		return
+	}
+	data := make(map[string]interface{})
+	query := map[string]interface{}{
+		"s_userid": userid,
+	}
+	area, _ := (*dataMap)["area"].([]interface{})
+	data["area"] = ArrSort(area)
+	city, _ := (*dataMap)["city"].([]interface{})
+	data["city"] = ArrSort(city)
+	region, _ := (*dataMap)["region"].([]interface{})
+	data["region"] = ArrSort(region)
+	industry, _ := (*dataMap)["industry"].([]interface{})
+	data["industry"] = ArrSort(industry)
+	buyerclass, _ := (*dataMap)["buyerclass"].([]interface{})
+	data["buyerclass"] = ArrSort(buyerclass)
+	buyer, _ := (*dataMap)["buyer"].([]interface{})
+	data["buyer"] = ArrSort(buyer)
+	winner, _ := (*dataMap)["winner"].([]interface{})
+	data["winner"] = ArrSort(winner)
+	keyword, _ := (*dataMap)["keywords"].([]interface{})
+	data["keywords"] = keywordSort(util.ObjArrToMapArr(keyword))
+
+	data["publishtime"] = util.InterfaceToStr((*dataMap)["publishtime"])
+	data["selectType"] = ValueSort(util.InterfaceToStr((*dataMap)["selectType"]))
+	data["minprice"] = util.InterfaceToStr((*dataMap)["minprice"])
+	data["isTitle"] = util.IntAll((*dataMap)["isTitle"])
+	data["maxprice"] = util.InterfaceToStr((*dataMap)["maxprice"])
+	data["subtype"] = ValueSort(util.InterfaceToStr((*dataMap)["subtype"]))
+
+	inKey := GetKeysByParam(data)
+	query["in_key"] = inKey
+	tm := time.Now()
+	if qutil.MQFW.Count("export_condition", query) > 0 {
+		qutil.MQFW.Update("export_condition", query, map[string]interface{}{
+			"$set": map[string]interface{}{
+				"update_time": tm.Unix(),
+			}}, false, false)
+	} else {
+		delete(*dataMap, "_id")
+		delete(*dataMap, "comeinfrom")
+		delete(*dataMap, "comeintime")
+
+		(*dataMap)["create_time"] = tm.Unix()
+		(*dataMap)["update_time"] = tm.Unix()
+		(*dataMap)["in_key"] = inKey
+		(*dataMap)["filter_id"] = filterId
+		qutil.MQFW.Save("export_condition", *dataMap)
+	}
+}
+
+func keywordSort(data []map[string]interface{}) string {
+	var (
+		dataArr []map[string]string
+	)
+	if data == nil || len(data) == 0 {
+		return ""
+	}
+	for _, v := range data {
+		dm := make(map[string]string)
+		for k, v1 := range v {
+			var v2 string
+			if k == "keyword" {
+				v2 = ValueSort(util.InterfaceToStr(v1))
+			} else if (k == "appended" && v1 != "" && v1 != nil) || (k == "exclude" && v1 != "" && v1 != nil) {
+				vs, _ := v1.([]interface{})
+				v2 = ArrSort(vs)
+			}
+			dm[k] = v2
+		}
+		dataArr = append(dataArr, dm)
+	}
+	SortData(&dataArr, "keyword", false)
+	b, _ := json.Marshal(dataArr)
+	return string(b)
+}
+
+func ValueSort(v string) string {
+	if v == "" {
+		return ""
+	}
+	vs := strings.Split(v, ",")
+	sort.Slice(vs, func(i, j int) bool {
+		return vs[i] < vs[j]
+	})
+	return strings.Join(vs, ",")
+}
+
+func ArrSort(value []interface{}) string {
+	if value == nil || len(value) == 0 {
+		return ""
+	}
+	vs := util.ObjArrToStringArr(value)
+	sort.Slice(vs, func(i, j int) bool {
+		return vs[i] < vs[j]
+	})
+	return strings.Join(vs, ",")
+}

+ 160 - 7
src/jfw/modules/subscribepay/src/pay/util.go

@@ -1,12 +1,15 @@
 package pay
 
 import (
+	"bytes"
 	"crypto"
+	"crypto/md5"
 	"crypto/rand"
 	"crypto/rsa"
 	"crypto/sha256"
 	"crypto/x509"
 	"encoding/base64"
+	"encoding/json"
 	"encoding/pem"
 	"errors"
 	"fmt"
@@ -14,6 +17,9 @@ import (
 	"jy/src/jfw/modules/subscribepay/src/config"
 	"jy/src/jfw/modules/subscribepay/src/util"
 	"log"
+	"net/url"
+	"reflect"
+	"sort"
 	"strings"
 	"sync"
 	"time"
@@ -297,7 +303,7 @@ func GetCacheOrderCode(tradeNo string) (orderCode string) {
 	return redis.GetStr("other", fmt.Sprintf(CacheOrderTradeNo, tradeNo))
 }
 
-//关闭订单
+// 关闭订单
 func CloseOrderByOrderCode(ordercode string) error {
 	res := util.Mysql.FindOne("dataexport_order", map[string]interface{}{"order_code": ordercode}, "out_trade_no,pay_way", "")
 	if res == nil || len(*res) == 0 {
@@ -330,13 +336,13 @@ func CloseOrder(tradeno, payWay string) bool {
 	return false
 }
 
-//创建订单号
+// 创建订单号
 func GetOrderCode(id ...string) string {
 	//2020-08-01之前的规则 fmt.Sprintf("%s%s", time.Now().Format("150405"), qutil.GetRandom(6))
 	return <-varOrderCode.pool
 }
 
-//关闭订单
+// 关闭订单
 func CloseDataExportOrder(payWay, tradeno, prepayTime string) (status bool) {
 	//如果订单超时 则不用关闭订单
 	t, err := time.ParseInLocation(Date_Full_Layout, prepayTime, time.Local)
@@ -361,7 +367,7 @@ func CloseDataExportOrder(payWay, tradeno, prepayTime string) (status bool) {
 	return status
 }
 
-//加载秘钥
+// 加载秘钥
 func parsePrivateKey(key string) (*rsa.PrivateKey, error) {
 	block, _ := pem.Decode([]byte(key))
 	if block == nil {
@@ -377,7 +383,7 @@ func parsePrivateKey(key string) (*rsa.PrivateKey, error) {
 	return rsaPrivateKey.(*rsa.PrivateKey), nil
 }
 
-//加载支付宝后台公钥
+// 加载支付宝后台公钥
 func parseAliPayPublicKey(key string) (*rsa.PublicKey, error) {
 	publicKeyDecoded, err := base64.StdEncoding.DecodeString(key)
 	if err != nil {
@@ -393,7 +399,7 @@ func parseAliPayPublicKey(key string) (*rsa.PublicKey, error) {
 	return nil, errors.New("rsa.PublicKey 断言出错")
 }
 
-//生成加密token
+// 生成加密token
 func (a *aliPayStruct) getSign(data []byte) (signature string, err error) {
 	var h hash.Hash
 	var hType crypto.Hash
@@ -411,7 +417,7 @@ func (a *aliPayStruct) getSign(data []byte) (signature string, err error) {
 	return
 }
 
-//处理商户订单号
+// 处理商户订单号
 func processTradeno(tradeno string) string {
 	if devTradenoSign, _ := config.PayConf["devTradenoSign"].(string); devTradenoSign != "" {
 		tradeno = devTradenoSign + tradeno
@@ -419,3 +425,150 @@ func processTradeno(tradeno string) string {
 	}
 	return tradeno
 }
+
+type paramSorter struct {
+	Keys   []string
+	Values []string
+}
+
+var SP = strings.Replace
+
+func (ps *paramSorter) String() string {
+	str := ""
+	for n, k := range ps.Keys {
+		str += k + "=" + ps.Values[n]
+		if n < len(ps.Keys)-1 {
+			str += "&"
+		}
+	}
+	return str
+}
+
+func (ps *paramSorter) Sort() {
+	sort.Sort(ps)
+}
+func (ps *paramSorter) Len() int {
+	return len(ps.Values)
+}
+
+func (ps *paramSorter) Less(i, j int) bool {
+	return bytes.Compare([]byte(ps.Keys[i]), []byte(ps.Keys[j])) < 0
+}
+
+func (ps *paramSorter) Swap(i, j int) {
+	ps.Values[i], ps.Values[j] = ps.Values[j], ps.Values[i]
+	ps.Keys[i], ps.Keys[j] = ps.Keys[j], ps.Keys[i]
+}
+
+func percentEncode(str string) string {
+	str = url.QueryEscape(str)
+	str = SP(SP(SP(str, "+", "%20", -1), "*", "%2A", -1), "%7E", "~", -1)
+	return str
+}
+
+// 排序 排序键必须为数字类型
+type SortBy struct {
+	Data    []map[string]interface{}
+	Sortkey string
+}
+
+func (a SortBy) Len() int { return len(a.Data) }
+
+func (a SortBy) Swap(i, j int) {
+	a.Data[i], a.Data[j] = a.Data[j], a.Data[i]
+}
+
+func (a SortBy) Less(i, j int) bool {
+	//return Float64(a.Data[i][a.Sortkey]) < Float64(a.Data[j][a.Sortkey])
+	m := a.Data[i][a.Sortkey]
+	n := a.Data[j][a.Sortkey]
+	w := reflect.ValueOf(m)
+	v := reflect.ValueOf(n)
+	switch v.Kind() {
+	case reflect.String:
+		return w.String() < v.String()
+	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+		return w.Int() < v.Int()
+	case reflect.Float64, reflect.Float32:
+		return w.Float() < v.Float()
+	default:
+		return fmt.Sprintf("%v", w) < fmt.Sprintf("%v", v)
+	}
+}
+
+// 根据指定字符排序
+//
+//	m := []map[string]int{
+//	   {"k": 2},
+//	   {"k": 1},
+//	   {"k": 3},
+//	}
+//
+// customer.SortData(&m, "k", true)
+// ture  倒序3, 2, 1
+// fmt.Println(m)
+func SortData(data interface{}, sortkey string, reverse bool) {
+	//func SortData(data interface{}, sortkey string, reverse bool) {
+	var db []map[string]interface{}
+	err := Bind(data, &db)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	stb := SortBy{db, sortkey}
+	if !reverse {
+		sort.Sort(stb)
+	} else {
+		sort.Sort(sort.Reverse(stb))
+	}
+	err = Bind(stb.Data, data)
+	if err != nil {
+		fmt.Println(err)
+	}
+
+}
+
+func Bind(data interface{}, ret interface{}) error {
+	v := reflect.ValueOf(ret)
+	if v.Kind() != reflect.Ptr {
+		return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
+	}
+	havdata := false
+	var bk interface{}
+	if v.Elem().Kind() == reflect.Slice {
+		t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
+		bk = v.Elem().Interface()
+		v.Elem().Set(t)
+		havdata = true
+	}
+	_data, _ := json.MarshalIndent(data, "", "    ")
+	err := json.Unmarshal(_data, ret)
+	if err != nil {
+		fmt.Println(err)
+		if havdata {
+			v.Elem().Set(reflect.ValueOf(bk))
+		}
+		return err
+	}
+	return nil
+}
+
+func GetKeysByParam(param map[string]interface{}) string {
+	ps := &paramSorter{[]string{}, []string{}}
+	for k, v := range param {
+		ps.Keys = append(ps.Keys, k)
+		ps.Values = append(ps.Values, qutil.InterfaceToStr(v))
+	}
+	ps.Sort()
+	reqStr := ps.String()
+	str := percentEncode(reqStr)
+	str = SP(str, "%3A", "%253A", -1)
+	return MD5(str)
+}
+
+func MD5(str string) string {
+	data := []byte(str)
+	has := md5.Sum(data)
+	md5str := fmt.Sprintf("%x", has)
+	return md5str
+}

+ 1 - 1
src/jfw/modules/subscribepay/src/service/dataExportPay.go

@@ -164,7 +164,7 @@ func (p *DataExportPay) CreateOrder() {
 			}
 		}
 		ordercode := pay.GetOrderCode(openId)
-		download_url := util.GetExcelFilePath(ordercode)
+		download_url := util.GetExcelFilePath(ordercode, data_count)
 		go func() {
 			list, err := dataexport.GetDataExportSearchResultByScdId(util.MQFW, util.Mgo_bidding, config.Config.Mongobidding.DbName, config.Config.Elasticsearch, id, qutil.If(data_spec == "高级字段包", "2", "1").(string), data_count)
 			if err == nil && list != nil && len(*list) > 0 {

+ 105 - 2
src/jfw/modules/subscribepay/src/service/dataexportPack.go

@@ -2,6 +2,7 @@ package service
 
 import (
 	"encoding/json"
+	"errors"
 	"fmt"
 	"io/ioutil"
 	"jy/src/jfw/modules/subscribepay/src/config"
@@ -15,6 +16,8 @@ import (
 	"strings"
 	"time"
 
+	"go.mongodb.org/mongo-driver/bson/primitive"
+
 	. "app.yhyue.com/moapp/jybase/api"
 	qutil "app.yhyue.com/moapp/jybase/common"
 	. "app.yhyue.com/moapp/jybase/date"
@@ -37,6 +40,103 @@ type DataExportPack struct {
 	rechargeList   xweb.Mapper `xweb:"/dataExportPack/rechargeList"` //数据导出-流量包充值记录
 	recordList     xweb.Mapper `xweb:"/dataExportPack/recordList"`   //数据导出记录
 	sendExportMail xweb.Mapper `xweb:"/dataExportPack/sendMail"`     //移动端导出记录发送附件邮件
+
+	screenList   xweb.Mapper `xweb:"/dataExportPack/screenList"`   //数据导出_筛选列表
+	screenDelete xweb.Mapper `xweb:"/dataExportPack/screenDelete"` //数据导出_删除筛选
+
+}
+
+func (des *DataExportPack) ScreenList() {
+	data, err := func() (*[]map[string]interface{}, error) {
+		qMap := map[string]interface{}{
+			"s_userid": des.GetSession("userId"),
+			"update_time": map[string]interface{}{
+				"$gte": time.Now().AddDate(-1, 0, 0).Unix(),
+			},
+		}
+		data, ok := util.MQFW.Find("export_condition", qMap, `{"update_time":-1}`, "", false, -1, -1)
+		if !ok {
+			log.Printf("获取筛选条件失败;qMap:%v", qMap)
+			return nil, errors.New("获取筛选条件失败")
+		}
+		if data != nil && len(*data) > 0 {
+			for _, dataMap := range *data {
+				area, _ := dataMap["area"].([]interface{})
+				dataMap["area"] = strings.Join(qutil.ObjArrToStringArr(area), ",")
+				city, _ := dataMap["city"].([]interface{})
+				dataMap["city"] = strings.Join(qutil.ObjArrToStringArr(city), ",")
+				region, _ := dataMap["region"].([]interface{})
+				dataMap["region"] = strings.Join(qutil.ObjArrToStringArr(region), ",")
+				industry, _ := dataMap["industry"].([]interface{})
+				dataMap["industry"] = strings.Join(qutil.ObjArrToStringArr(industry), ",")
+				buyerclass, _ := dataMap["buyerclass"].([]interface{})
+				dataMap["buyerclass"] = strings.Join(qutil.ObjArrToStringArr(buyerclass), ",")
+				buyer, _ := dataMap["buyer"].([]interface{})
+				dataMap["buyer"] = strings.Join(qutil.ObjArrToStringArr(buyer), ",")
+				winner, _ := dataMap["winner"].([]interface{})
+				dataMap["winner"] = strings.Join(qutil.ObjArrToStringArr(winner), ",")
+				keywords, _ := dataMap["keywords"].([]interface{})
+				if keywords != nil && len(keywords) > 0 {
+					mb, _ := json.Marshal(dataMap["keywords"])
+					dataMap["keywords"] = string(mb)
+				} else {
+					dataMap["keywords"] = ""
+				}
+				dataMap["publishtime"] = qutil.InterfaceToStr(dataMap["publishtime"])
+				dataMap["selectType"] = qutil.InterfaceToStr(dataMap["selectType"])
+				dataMap["minprice"] = qutil.InterfaceToStr(dataMap["minprice"])
+				dataMap["isTitle"] = qutil.IntAll(dataMap["isTitle"])
+				dataMap["maxprice"] = qutil.InterfaceToStr(dataMap["maxprice"])
+				dataMap["subtype"] = qutil.InterfaceToStr(dataMap["subtype"])
+
+				dataMap["_id"] = encrypt.SE.EncodeString(qutil.InterfaceToStr(dataMap["_id"]))
+
+				isTitle := qutil.IntAll(dataMap["isTitle"])
+				selectType := qutil.InterfaceToStr(dataMap["selectType"])
+				if isTitle == 3 {
+					selectType = selectType + ",title"
+				}
+				dataMap["selectType"] = selectType
+				delete(dataMap, "user_id")
+				delete(dataMap, "filter_id")
+			}
+		}
+		return data, nil
+	}()
+
+	des.ServeJson(NewResult(data, err))
+}
+
+func (des *DataExportPack) ScreenDelete() {
+	err := func() error {
+		userid := des.GetSession("userId")
+		if len(des.Body()) == 0 {
+			return errors.New("body数据异常")
+		}
+		data := make(map[string]interface{})
+		err := json.Unmarshal(des.Body(), &data)
+		if err != nil {
+			return errors.New("获取ids失败")
+		}
+		ids := qutil.InterfaceToStr(data["ids"])
+		var idArr []primitive.ObjectID
+		for _, v := range strings.Split(ids, ",") {
+			if id := encrypt.SE.DecodeString(v); id != "" {
+				mgoId, _ := primitive.ObjectIDFromHex(id)
+				idArr = append(idArr, mgoId)
+			}
+		}
+		//log.Println("userid", userid, idArr)
+		util.MQFW.Delete("export_condition", map[string]interface{}{
+			"s_userid": userid,
+			"_id": map[string]interface{}{
+				"$in": idArr,
+			},
+		})
+		return nil
+	}()
+
+	des.ServeJson(NewResult("", err))
 }
 
 // PackGoodsList 数据包规格及价格列表
@@ -108,7 +208,6 @@ func (this *DataExportPack) CreateOrder() {
 			endTime := qutil.Int64All((*userfilter)["endTime"])
 			if startTime != 0 {
 				if startTime <= time.Now().Unix() && endTime >= time.Now().Unix() {
-
 					disWordStr = qutil.ObjToString((*userfilter)["disWords"])
 				}
 			}
@@ -303,11 +402,11 @@ func (this *DataExportPack) Statistics() {
 // return	serialNumber 流水号(暂定为记录id)
 func (this *DataExportPack) PackPay() {
 	userId, _ := this.GetSession("userId").(string)
+	filterId := encrypt.SE.Decode4Hex(this.GetString("filterId"))
 	rData, errMsg := func() (interface{}, error) {
 		//企业数据包、个人数据包流量包支付
 		//数据总量,扣除量
 		total_req, _ := this.GetInteger("total") //导出总量
-		filterId := encrypt.SE.Decode4Hex(this.GetString("filterId"))
 		if filterId == "" {
 			return nil, fmt.Errorf("请求参数异常")
 		}
@@ -380,6 +479,9 @@ func (this *DataExportPack) PackPay() {
 	}()
 	if errMsg != nil {
 		log.Printf("%s DataExportPack PackPay 异常:%s\n", userId, errMsg.Error())
+	} else {
+		//条件保存
+		go pay.CheckSave(userId, filterId)
 	}
 	this.ServeJson(NewResult(rData, errMsg))
 }
@@ -472,6 +574,7 @@ func (this *DataExportPack) SendExportMail() {
 		if downurl == "" || userMail == "" {
 			return nil, fmt.Errorf("缺少字段")
 		}
+		downurl = strings.ReplaceAll(downurl, config.Config.WebDomain, config.Config.WxDomain)
 		mailContent := fmt.Sprintf(config.ExConf.Mail_attach_pack_attachment, downurl)
 		//用户发送邮件
 		sendOk := false

+ 124 - 44
src/jfw/modules/subscribepay/src/util/dataExportExcel.go

@@ -5,6 +5,7 @@ import (
 	qutil "app.yhyue.com/moapp/jybase/common"
 	"errors"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"io"
 	"jy/src/jfw/modules/subscribepay/src/config"
 	"os"
@@ -16,26 +17,33 @@ import (
 
 var (
 	defaultExcelBorder = xlsx.Border{ //边框样式
-		Left:        "thin",
-		LeftColor:   "00A6A6A6",
-		Right:       "thin",
-		RightColor:  "00A6A6A6",
-		Top:         "thin",
-		TopColor:    "00A6A6A6",
-		Bottom:      "thin",
-		BottomColor: "00A6A6A6",
+		Left:        "dotted",
+		LeftColor:   "00000000",
+		Right:       "dotted",
+		RightColor:  "00000000",
+		Top:         "dotted",
+		TopColor:    "00000000",
+		Bottom:      "dotted",
+		BottomColor: "00000000",
 	}
+
 	defaultExcelAlignment = xlsx.Alignment{ //对其方式
-		Horizontal: "center",
+		Horizontal: "left",
 		Vertical:   "center",
 		WrapText:   true,
 	}
+	defaultFont = xlsx.NewFont(12, "等线")
+	blueFont    = xlsx.Font{
+		Size:  12,
+		Name:  "等线",
+		Color: "00376092",
+	}
 )
 
 // 获取
-func GetExcelFilePath(orderCode string) string {
+func GetExcelFilePath(orderCode string, num int) string {
 	now := time.Now()
-	filename := fmt.Sprintf("%s.xlsx", fmt.Sprintf("%s_%s_%s", now.Format("20060102150405"), orderCode, qutil.GetLetterRandom(5)))
+	filename := fmt.Sprintf("%s.xlsx", fmt.Sprintf("%s_%d_%s_%s", now.Format("20060102"), num, orderCode, qutil.GetLetterRandom(5)))
 	return fmt.Sprintf("/dataexport/%s/%s/%s", now.Format("2006"), now.Format("01"), filename)
 }
 
@@ -57,9 +65,9 @@ func GetDataExportFileDataLen(path string) (int, error) {
 
 // 生成数据导出excel
 func CreateDataExportExcelFile(list *[]map[string]interface{}, isSenior bool, filePath string) error {
-	if list == nil || len(*list) == 0 {
-		return errors.New("未查询到数据")
-	}
+	//if list == nil || len(*list) == 0 {
+	//	return errors.New("未查询到数据")
+	//}
 	//创建excel文件
 	file := xlsx.NewFile()
 	sheet, err := file.AddSheet("Sheet1")
@@ -77,18 +85,20 @@ func CreateDataExportExcelFile(list *[]map[string]interface{}, isSenior bool, fi
 		for index, excel := range excelHead {
 			cell = row.AddCell()
 			cell.SetString(excel.Name)
-			cell.SetStyle(&xlsx.Style{
+			style := &xlsx.Style{
 				Fill:      *xlsx.NewFill("solid", excel.Color, excel.Color),
-				Border:    defaultExcelBorder,
 				Alignment: defaultExcelAlignment,
-			})
+				Font:      *defaultFont,
+				Border:    defaultExcelBorder,
+			}
+			cell.SetStyle(style)
 			sheet.Col(index).Width = excel.Width
 		}
 	} else {
 		excelHead = config.ExConf.Senior_Fields
 		//铺设第一层title
 		row = sheet.AddRow()
-		row.SetHeight(12)
+		row.SetHeight(20)
 		lastF := false //合并行时标识
 		for _, excel := range excelHead {
 			if excel.VMerge != 1 && excel.HMerge == 0 {
@@ -107,15 +117,17 @@ func CreateDataExportExcelFile(list *[]map[string]interface{}, isSenior bool, fi
 			if excel.HMerge != 0 {
 				lastF = true
 			}
-			cell.SetStyle(&xlsx.Style{
+			style := &xlsx.Style{
 				Fill:      *xlsx.NewFill("solid", excel.Color, excel.Color),
-				Border:    defaultExcelBorder,
 				Alignment: defaultExcelAlignment,
-			})
+				Font:      *defaultFont,
+				Border:    defaultExcelBorder,
+			}
+			cell.SetStyle(style)
 		}
 		//铺设第二层title并设置宽度
 		row = sheet.AddRow()
-		row.SetHeight(12)
+		row.SetHeight(20)
 		cNum := 0
 		for _, excel := range excelHead {
 			if excel.HMerge != 0 {
@@ -131,35 +143,103 @@ func CreateDataExportExcelFile(list *[]map[string]interface{}, isSenior bool, fi
 				Fill:      *xlsx.NewFill("solid", excel.Color, excel.Color),
 				Border:    defaultExcelBorder,
 				Alignment: defaultExcelAlignment,
+				Font:      *defaultFont,
 			})
 		}
 	}
-	//填充数据
-	for k, data := range *list {
-		row = sheet.AddRow()
-		row.SetHeight(50)
-		data["index"] = k + 1
-		for _, v := range excelHead {
-			if v.Filed == "" {
-				continue
-			}
-			cell = row.AddCell()
+	if list != nil && len(*list) > 0 {
+		//填充数据
+		for k, data := range *list {
+			winnerMaps := gconv.Maps(data["winnerMaps"])
+			winnerTotal := len(winnerMaps)
+			data["index"] = k + 1
+			if winnerTotal > 0 {
+				for index, winnerDatas := range winnerMaps {
+					row = sheet.AddRow()
+					row.SetHeight(20)
 
-			if v.Filed == "title" || v.Filed == "url" {
-				cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["url_jump"], data[v.Filed]))
-			} else if v.Filed == "href" {
-				cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["href"], data[v.Filed]))
+					for _, v := range excelHead {
+						if v.Filed == "" {
+							continue
+						}
+						cell = row.AddCell()
+						style := &xlsx.Style{
+							Border:    defaultExcelBorder,
+							Alignment: defaultExcelAlignment,
+						}
+
+						if v.Filed != "legal_person" && v.Filed != "company_phone" && v.Filed != "company_email" && v.Filed != "company_name" {
+							if index == 0 {
+								cell.VMerge = winnerTotal - 1
+
+								if v.Filed == "title" || v.Filed == "url" {
+									cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["url_jump"], data[v.Filed]))
+								} else if v.Filed == "href" {
+									cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["href"], data[v.Filed]))
+								} else {
+									cell.SetValue(data[v.Filed])
+								}
+							}
+						} else {
+							cell.SetValue(winnerDatas[v.Filed])
+						}
+						if v.Filed == "title" {
+							style.Font = blueFont
+						}
+						cell.SetStyle(style)
+					}
+				}
 			} else {
-				cell.SetValue(data[v.Filed])
+				row = sheet.AddRow()
+				row.SetHeight(20)
+
+				for _, v := range excelHead {
+					if v.Filed == "" {
+						continue
+					}
+					cell = row.AddCell()
+					style := &xlsx.Style{
+						Border:    defaultExcelBorder,
+						Alignment: defaultExcelAlignment,
+					}
+					if v.Filed == "title" || v.Filed == "url" {
+						cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["url_jump"], data[v.Filed]))
+					} else if v.Filed == "href" {
+						cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["href"], data[v.Filed]))
+					} else {
+						cell.SetValue(data[v.Filed])
+					}
+					if v.Filed == "title" {
+						style.Font = blueFont
+					}
+					cell.SetStyle(style)
+				}
 			}
-			cell.SetStyle(&xlsx.Style{
-				Border:    defaultExcelBorder,
-				Alignment: defaultExcelAlignment,
-			})
+			//row = sheet.AddRow()
+			//row.SetHeight(50)
+			//data["index"] = k + 1
+			//for _, v := range excelHead {
+			//	if v.Filed == "" {
+			//		continue
+			//	}
+			//	cell = row.AddCell()
+			//
+			//	if v.Filed == "title" || v.Filed == "url" {
+			//		cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["url_jump"], data[v.Filed]))
+			//	} else if v.Filed == "href" {
+			//		cell.SetFormula(fmt.Sprintf("=HYPERLINK(\"%s\",\"%s\")", data["href"], data[v.Filed]))
+			//	} else {
+			//		cell.SetValue(data[v.Filed])
+			//	}
+			//	cell.SetStyle(&xlsx.Style{
+			//		Border:    defaultExcelBorder,
+			//		Alignment: defaultExcelAlignment,
+			//	})
+			//}
+		}
+		if err := FolderCheck(filePath); err != nil {
+			return err
 		}
-	}
-	if err := FolderCheck(filePath); err != nil {
-		return err
 	}
 	return file.Save(filePath)
 }

+ 9 - 1
src/web/staticres/big-member/js/unit_portrayal.js

@@ -562,9 +562,17 @@ var vNode = {
             location.href = '/big/wx/page/free_buyer_project_news?entName=' + decodeURIComponent(utils.getParam('entName'))
           }
         },
+        next_export (obj){
+          console.log(obj)
+          this.onExport('popupClick')
+        },
         //数据导出
-        onExport(){
+        onExport(type){
           var _this = this
+          if(this.dt.pageCount > 20000 && type !== 'popupClick' && this.$refs.popup_dataExport.isPrompt){
+            this.$refs.popup_dataExport.show = true
+            return
+          }
           var storageSet = this.getHighSet()
           var data = {
             buyer: decodeURIComponent(utils.getParam('entName')),

+ 19 - 1
src/web/staticres/common-module/collection/js/ent_portrait.js

@@ -326,6 +326,11 @@ var vNode = {
       var entniche = info.vipStatus <= 0 && info.memberStatus <= 0 && info.entniche
       return memberCustom || isNewVip || entniche
     },
+    phoneUnlockTip () {
+      var info = this.powerInfo
+      var phone = this.entBaseInfo.phone
+      return info.isFree && phone && phone.indexOf('*') !== -1
+    },
     noShowTip: function () {
       return (!this.isFree && !this.updateVipStatus && !this.customerServiceStatus) || (this.isFree && this.canFreeTrial)
     }
@@ -561,8 +566,17 @@ var vNode = {
       }
       return urls
     },
+    next_export (obj){
+      console.log(obj)
+      this.onExport('popupClick')
+    },
+    
     //数据导出
-    onExport(){
+    onExport(type){
+      if(this.topProject.count > 20000 && type !== 'popupClick' && this.$refs.popup_dataExport.isPrompt){
+        this.$refs.popup_dataExport.show = true
+        return
+      }
       var _this = this
       var storageSet = this.getHighSet()
       var data = {
@@ -774,6 +788,10 @@ var vNode = {
         this.changeFollowStateRequest()
       }
     },
+    goToUnlock: function () {
+      // this.savePageState()
+      location.href = '/weixin/frontPage/bigmember/free/perfect_info?source=ent_portrait_contacts'
+    },
     goExpAnalysis () {
       location.href = '/weixin/frontPage/bigmember/free/perfect_info?source=ent_portrait_freeuser';
     },

+ 13 - 3
src/web/staticres/common-module/collection/js/index-wx.js

@@ -265,6 +265,7 @@ var vNode = {
           }
           if (res.error_code == 0) {
             if (res.data && res.data.res && $.isArray(res.data.res)) {
+              _this.listState.total = res.data.count
               try {
                 res.data.res.forEach(function (item) {
                     item.isCB = {
@@ -343,6 +344,7 @@ var vNode = {
       })
     },
     getCBProject: function(arr) {
+      let _this = this
       let idArr = arr.map(item => item._id)
       if (idArr.length > 0) {
         idArr = idArr.join(',')
@@ -370,8 +372,8 @@ var vNode = {
             }
           }
         },
-        error: function(){
-          _this.$toast(res.error_msg)
+        error: function(err){
+          // _this.$toast(err.error_msg)
         }
       })
     },
@@ -591,11 +593,19 @@ var vNode = {
         }
       })
     },
+    next_export (obj){
+      console.log(obj)
+      this.dataReport('popupClick')
+    },
     // 数据导出
-    dataReport: function() {
+    dataReport: function(type) {
       if(this.listState.list.length == 0) {
         this.$toast('暂无数据')
       } else {
+        if(this.listState.total> 20000 && type !== 'popupClick' && this.$refs.popup_dataExport.isPrompt){
+          this.$refs.popup_dataExport.show = true
+          return
+        }
         $.ajax({
           url: '/publicapply/dataexpoet/bycollection',
           type: 'POST',

+ 13 - 3
src/web/staticres/common-module/collection/js/index.js

@@ -267,6 +267,7 @@ var vNode = {
           }
           if (res.error_code == 0) {
             if (res.data && res.data.res && $.isArray(res.data.res)) {
+              _this.listState.total = res.data.count
               try {
                 res.data.res.forEach(function (item) {
                     item.isCB = {
@@ -345,6 +346,7 @@ var vNode = {
       })
     },
     getCBProject: function(arr) {
+      let _this = this
       let idArr = arr.map(item => item._id)
       if (idArr.length > 0) {
         idArr = idArr.join(',')
@@ -372,8 +374,8 @@ var vNode = {
             }
           }
         },
-        error: function(){
-          _this.$toast(res.error_msg)
+        error: function(err){
+          // _this.$toast(err.error_msg)
         }
       })
     },
@@ -594,11 +596,19 @@ var vNode = {
         }
       })
     },
+    next_export (obj){
+      console.log(obj)
+      this.dataReport('popupClick')
+    },
     // 数据导出
-    dataReport: function() {
+    dataReport: function(type) {
       if(this.listState.list.length == 0) {
         this.$toast('暂无数据')
       }else {
+        if(this.listState.total> 20000 && type !== 'popupClick' && this.$refs.popup_dataExport.isPrompt){
+          this.$refs.popup_dataExport.show = true
+          return
+        }
         $.ajax({
           url: '/publicapply/dataexpoet/bycollection',
           type: 'POST',

+ 162 - 0
src/web/staticres/common-module/dataExport/components/popup-data-export.js

@@ -0,0 +1,162 @@
+Vue.component('popup-data-export', {
+  delimiters: ['@@', '@@'],
+  template: `
+  <div class="popupDataexport">
+    <van-popup v-model="show">
+      <div class="warm">
+        <div class="close" @click="show = false"></div>
+        <div class="content_box">
+          <p class="title">温馨提示</p>
+          <div class="text_box">您选择的数据超过了导出数据最大值<span class="blue">20,000</span>,请优化条件后导出。您也可联系客服:<span @click="callPhone('400-108-6670')">400-108-6670</span>,或添加<span class="blue">客服微信</span>进行定制化导出。</div>
+          <div class="qr_box">
+            <img :src="img" alt="">
+          </div>
+          <div class="desc">客服微信</div>
+          <div class="btn_box">
+            <div class="btn"><div :class="choose?'choosed':'nochoose'" @click="btnClick"></div></div>
+            <p class="text">后续不再提醒</p>
+          </div>
+        </div>
+        <div class="footer" @click="next">
+          <span>继续导出20000条</span>
+        </div>
+      </div>
+    </van-popup>  
+  </div>
+  `,
+  props: {
+
+  },
+  data: function () {
+    return {
+      show: false,
+      choose:false,
+      img:'',
+      isPrompt:true
+
+    }
+  } ,
+  created (){
+    let this_ = this
+    this.getqr()
+    $.ajax({
+      type: 'POST',
+      url:this_.isWX ? '/front/dataExport/getDontPromptAgain' : '/jyapp/front/dataExport/getDontPromptAgain',
+      success: function (res) { 
+        if(!res){return}
+        this_.isPrompt = res.isPrompt
+       },
+      error: function (error) {
+      }
+    })
+  },
+  mounted () {
+
+  },
+  computed: {
+    isWX () {
+      if (navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1) { 
+        return true
+
+      }else{
+        return false
+      }
+    }
+
+  },
+  methods: {
+    getqr () {
+      let _this = this
+      $.ajax({
+        type: 'POST',
+        url: '/bigmember/use/isAdd?t=' + Date.now(),
+        success: function (res) { 
+          if(!res.data){return}
+          if(res.data.customers&&res.data.customers.length>0){
+            let list = res.data.customers
+            list.forEach(e => {
+              if(e.remark === '客户经理'){
+                _this.img = e.wxer 
+              }  
+            })
+            if(_this.img == ''){
+              _this.img = customer[0].wxer
+            }
+          }
+         },
+        error: function (error) {
+        }
+      })
+
+    },
+    btnClick(){
+      this.choose = !this.choose
+      this.setDontPrompt()
+    },
+    next(){
+      this.$emit('next',{choose:this.choose})
+    },
+    setDontPrompt: debounce_(function(){
+      let this_ = this
+      let url_ = this.isWX ? '/front/dataExport/setDontPromptAgain' : '/jyapp/front/dataExport/setDontPromptAgain'
+      if(this.choose){
+        $.ajax({
+          type: 'POST',
+          url: url_,
+          data: {status:1},
+          contentType: 'application/x-www-form-urlencoded',
+          success: function (res) { 
+            this_.isPrompt = true
+           },
+          error: function (error) {
+          }
+        })
+      }else{
+        $.ajax({
+          type: 'POST',
+          url: url_,
+          data: {status:0},
+          contentType: 'application/x-www-form-urlencoded',
+          success: function (res) { 
+            this_.isPrompt = false
+           },
+          error: function (error) {
+          }
+        })
+      }
+    },300),
+    callPhone: function (tel) {
+      if (navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1) { // 微信
+        location.href = 'tel:' + tel
+      } else {
+        try {
+          JyObj.callPhone(tel);
+        } catch (error) {
+          console.log(error)
+        }
+      }
+    },
+  }
+})
+function debounce_ (func, delay, immediate){
+  var timer = null;
+  delay = delay || 200
+  return function() {
+      var context = this;
+      var args = arguments;
+      if(timer) clearTimeout(timer);
+      if(immediate){
+          var doNow = !timer;
+          timer = setTimeout(function(){
+              timer = null;
+          },delay);
+          if(doNow){
+              func.apply(context,args);
+          }
+      }else{
+          timer = setTimeout(function(){
+              func.apply(context,args);
+          },delay);
+      }
+  }
+}

+ 81 - 0
src/web/staticres/common-module/dataExport/css/association.css

@@ -0,0 +1,81 @@
+.association-list-box{
+  flex: 1;
+  box-sizing: border-box;
+  /* padding-top: 0.16rem; */
+  overflow-y: scroll;
+  padding-bottom: 1.8rem;
+  /* background-color: #fff; */
+  /* border-radius: 0.2rem 0.2rem 0 0; */
+}
+.association-list{
+  /* height: 100%;
+  overflow-y: scroll; */
+  box-sizing: border-box;
+  padding-left: 0.32rem;
+  background-color: #fff;
+  /* border-radius: 0.2rem 0.2rem 0 0; */
+  border-top: 1px solid #F5F6F7;
+  
+}
+.association-item{
+  height: 0.92rem;
+  display: flex;
+  align-items: center;
+  border-bottom: 1px solid #F5F6F7;
+  background-color: #fff;
+  color: #171826;
+  font-size: 0.28rem;
+  /* padding-left: 0.32rem; */
+}
+.btn{
+  height: 1.8rem;
+  background-color: #fff;
+  box-sizing: border-box;
+  padding-left: 0.32rem;
+  padding-top: 0.16rem;
+  padding-right: 0.32rem;
+}
+.btn .close{
+  background-color: #EDEFF2 !important;
+  color: #5F5E64 !important;
+  width: 3.3rem !important;
+  height: 0.8rem !important;
+  border-radius: 0.08rem !important;
+  font-size: 0.32rem !important;
+}
+.btn .save-btn{
+  width: 3.3rem !important;
+  height: 0.8rem !important;
+  border-radius: 0.08rem !important;
+  font-size: 0.32rem !important;
+}
+.keyWord {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+  overflow: scroll;
+
+}
+.keyWord .content{
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+
+}
+.enter.addkeyWord{
+  /* height: 100%; */
+  /* margin-bottom: 0.16rem; */
+}
+.highlight-text{
+  color: #2ABED1;
+}
+.fixed-bottom{
+  width: 100%;
+  position: fixed;
+  left: 0;
+  bottom: 0;
+}
+.pb-0-impor{
+  padding-bottom: 0 !important;
+}

+ 150 - 0
src/web/staticres/common-module/dataExport/css/dataExportAppend.css

@@ -0,0 +1,150 @@
+.screeningCondition{
+  box-sizing: border-box;
+  height: 1.12rem;
+  padding-right: 0.35rem;
+  width: 100%;
+}
+.screeningCondition .sc-btnContent{
+  float: right;
+  overflow: hidden;
+}
+.screeningCondition .sc-btn{
+  padding: 0.08rem 0.16rem;
+  display: flex;
+  background-color: #fff;
+  justify-content: center;
+  align-items: center;
+  border: 1px solid #2ABED1;
+  border-radius: 0.08rem;
+  color: #2ABED1;
+  float: right;
+  margin-top: 0.26rem;
+
+}
+.screeningCondition .sc-icon{
+  width: 0.4rem;
+  height: 0.4rem;
+  background-image: url(/common-module/dataExport/image/help.png);
+  background-size: contain;
+  display: flex;
+  margin-left: 0.16rem;
+  float: right;
+  margin-top: 0.36rem;
+}
+html .page .elseChoose .elseChooseList ul li{
+  height: 1.08rem;
+  line-height: 1.08rem;
+  border-bottom: 1px solid #F5F6F7;
+  padding-left: 0;
+  color: #171826;
+}
+html .page .elseChoose .elseChooseList ul {
+  margin-bottom: 0.24rem;
+  padding-left: 0.32rem;
+  box-sizing: border-box;
+  background-color: #fff;
+}
+html .page .elseChoose .elseChooseList ul li a span{
+  height: 1.08rem;
+}
+html .page .elseChoose .elseChooseList ul li a i{
+  color: #C0C4CC;
+}
+html .page .elseChoose .elseChooseList ul .iconfont{
+  font-size: 15px;
+}
+html .page .elseChoose .elseChooseList ul li a span{
+  color: #9B9CA3;
+}
+html .page .elseChoose p{
+  color: #9B9CA3;
+}
+html .page .chooseTime{
+  background-color: #fff;
+  padding-top: 0.32rem;
+  margin-top: 0;
+  padding-bottom: 0.16rem;
+}
+html .page .progress{
+/* padding: 0 0.32rem; */
+margin: 0 0.32rem;
+border-bottom: 1px solid #F5F6F7;
+}
+html .page .progress .p-item{
+  /* border-bottom: 1px solid #F5F6F7; */
+  /* padding: 0.2rem 0; */
+  color: #9B9CA3;
+}
+html .page .progressBox{
+  background-color: #fff;
+
+}
+html .page .chooseTime ul li{
+  color: #5F5E64;
+  background-color: #F5F6F7;
+}
+html .page .chooseTime .dateMake {
+  height: 1.04rem;
+  line-height: 1.04rem;
+  width: 6.84rem;
+  padding: 0.16rem;
+  margin: auto;
+  margin-top: 0.16rem;
+  box-sizing: border-box;
+}
+html .page .chooseTime .dateMake .heng{
+  color: #0000004D;
+}
+html .page .chooseTime .dateMake input{
+  width: 2.96rem !important;
+  margin: 0!important;
+  border-radius: 0.08rem !important;
+  border: 1px solid #0000001A !important;
+  color: #171826 !important;
+  padding-left: 0.38rem!important;
+  padding-right: 0.38rem!important;;
+  /* text-align:center; */
+}
+html .page .chooseTimebox{
+  background-color: #E8FAFD !important;
+  position: relative;
+  border-radius: 0.08rem;
+}
+html .page .chooseTimebox::before{
+  content: '';
+  position: absolute;
+  width: 0.28rem;
+  height: 0.24rem;
+  background-image: url(/common-module/dataExport/image/right_corner.png);
+  background-size: contain;
+  right: 0;
+  bottom: 0;
+}
+
+html .page .progress .p-item .p-item-icon{
+  width: 0.2rem;
+  height: 0.2rem;
+  line-height: 0.2rem;
+  background-color: #E6E6E6;
+}
+html .page .progress .p-item .line{
+  top: 0.1rem;
+  background-color: #E6E6E6;
+  height: 0.02rem;
+  width: 2rem;
+  right: -1rem;
+}
+.van-dialog.msgDialog {
+  border-radius: 0.16rem;
+}
+.van-dialog.msgDialog .van-dialog__header{
+  font-size: 0.36rem;
+  color: #171826;
+
+}
+.van-dialog.msgDialog .van-dialog__content div{
+  color: #171826 !important;
+}
+.van-dialog.msgDialog  .van-button__content{
+  font-size: 0.36rem;
+}

+ 105 - 0
src/web/staticres/common-module/dataExport/css/popup-data-export.css

@@ -0,0 +1,105 @@
+.popupDataexport .van-popup {
+  background-color: rgba(0, 0, 0, 0);
+}
+.popupDataexport .warm {
+  width: 6.06rem;
+  height: 8.9rem;
+  background-color: #FFF;
+  border-radius: 0.16rem;
+  position: relative;
+}
+.popupDataexport .warm .close {
+  width: 0.4rem;
+  height: 0.4rem;
+  display: block;
+  position: absolute;
+  right: 0.16rem;
+  top: 0.16rem;
+  z-index: 2;
+  background-image: url(/images/dataExport/close.png);
+  background-size: contain;
+}
+.popupDataexport .warm .content_box {
+  padding: 0.48rem 0.6rem 0.32rem 0.6rem;
+}
+.popupDataexport .warm .content_box .title {
+  font-size: 0.36rem;
+  font-weight: 400;
+  line-height: 0.52rem;
+  text-align: center;
+  color: #171826;
+}
+.popupDataexport .warm .content_box .text_box {
+  font-size: 0.28rem;
+  font-weight: 400;
+  line-height: 0.4rem;
+  color: #5F5E64;
+  margin-top: 0.16rem;
+}
+.popupDataexport .warm .content_box .text_box .blue {
+  color: #2ABED1;
+}
+.popupDataexport .warm .content_box .qr_box {
+  border: 0.02rem solid #0000001A;
+  border-radius: 0.16rem;
+  width: 2.82rem;
+  height:2.82rem;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin: auto;
+  margin-top: 0.48rem;
+}
+.popupDataexport .warm .content_box .qr_box img {
+  width: 2.68rem;
+  height: 2.68rem;
+}
+.popupDataexport .warm .content_box .desc {
+  text-align: center;
+  font-size: 0.28rem;
+  font-weight: 400;
+  line-height: 0.4rem;
+  color: #1B1A2A;
+  margin-top: 0.24rem;
+}
+.popupDataexport .warm .btn_box {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-top: 0.48rem;
+}
+.popupDataexport .warm .btn_box .btn {
+  width: 0.48rem;
+  height: 0.48rem;
+  justify-content: center;
+  display: flex;
+  align-items: center;
+}
+.popupDataexport .warm .btn_box .choosed {
+  width: 0.48rem;
+  height: 0.48rem;
+  background-image: url(/images/dataExport/choose_right.png);
+  background-size: contain;
+}
+.popupDataexport .warm .btn_box .nochoose {
+  width: 0.36rem;
+  height: 0.36rem;
+  border-radius: 50%;
+  border: 0.02rem solid #0000001A;
+}
+.popupDataexport .warm .btn_box .text {
+  font-size: 0.24rem;
+  font-weight: 400;
+  line-height: 0.36rem;
+  color: #9B9CA3;
+  margin-left: 0.08rem
+}
+.popupDataexport .warm .footer {
+  border-top: 0.02rem solid #0000001A;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  color: #2ABED1;
+  font-size: 0.36rem;
+  height: 0.9rem;
+}

BIN
src/web/staticres/common-module/dataExport/image/help.png


BIN
src/web/staticres/common-module/dataExport/image/right_corner.png


+ 86 - 0
src/web/staticres/common-module/dataExport/js/association.js

@@ -0,0 +1,86 @@
+$(function(){
+  var chooseindex;
+  var debouncedInputHandler = utils.debounce(function(e) {
+    if($('.keyWord .addkeyWord').css('display') != 'none'){
+      var input_query = $('.keyWord input').val()
+      $('.association-list-box').removeClass('pb-0-impor')
+    }else{
+      var input_query = $('.keyWord textarea').eq(chooseindex).val()
+      $('.association-list-box').addClass('pb-0-impor')
+    } 
+    let type = ''
+    if(window.location.href.indexOf('buyer') > -1){
+      type = 'buyer'
+    }else{
+      type = 'ent'
+    }
+    associationNameList(type,input_query,function(res){
+      $('.keyWord .association-list').html('')
+      if(res.length > 0){
+        $('.keyWord .association-list').html('')
+        res.forEach(function(item){
+          $('.keyWord .association-list').append('<li class="association-item" data-val='+item.value+'>'+ utils.replaceKeyword(item.value,input_query, '<span class="highlight-text">' + input_query + '</span>')+'</li>')
+        })
+        $('.keyWord .association-list-box').show()
+        }else{
+          $('.keyWord .association-list-box').hide()
+        }
+    })
+  },300)
+  $('.keyWord').on('click','.editKeyWord',function(){
+     chooseindex = $(this).index('.editKeyWord') // 当前修改索引赋值
+     console.log(chooseindex)
+  })
+  $('.keyWord input').on('input',debouncedInputHandler) // 新增
+  $('.keyWord').on('input','textarea',debouncedInputHandler) // 修改
+  $('.keyWord input').on('blur',function(){
+    setTimeout(function () {
+      $('.keyWord .association-list-box').hide()
+    }, 100);
+  })
+  $('.keyWord').on('blur','textarea',function(){
+    setTimeout(function () {
+      $('.keyWord .association-list-box').hide()
+    }, 100);
+  })
+  $('.keyWord .association-list').on('click','.association-item',function(){
+    if($('.keyWord .addkeyWord').css('display') != 'none'){
+      $('.keyWord input').val($(this).attr('data-val'))
+    }else{
+      $('.keyWord textarea').eq(chooseindex).val($(this).attr('data-val'))
+
+    }
+    $('.keyWord .association-list-box').hide()
+  })
+})
+function associationNameList (type,str, cb) {
+  const query = str.replace(/\s+/g, '')
+  if (query.length < 2) {
+    return cb([])
+  }
+  $.ajax({
+    type: 'post',
+    url: '/bigmember/search/'+type+'/association',
+    dataType: "json",
+    data: {
+      name:query,
+    },
+    success: function (res) {
+      if (res.error_code == 0) {
+        if (res.data) {
+          const result = (res.data.list || []).map(v => {
+            return {
+              ...v,
+              value: v.name?v.name:v
+            }
+          })
+          // const result = [{value:'中国佛学院'},{value:'中国佛学院'},{value:'中国佛学院'},{value:'中国佛学院'},{value:'中国佛学院'},{value:'中国佛学院'},{value:'中国佛学院'}]
+          cb(result)
+        }
+      }
+    },
+    error: function (error) {
+      cb([])
+    }
+  })
+}

+ 2429 - 0
src/web/staticres/common-module/js/mapJSON.js

@@ -0,0 +1,2429 @@
+/**
+ * @file china-map.json
+ * @author zhangyuhan2016 <hi_zhangyuhan@163.com>
+ */
+var chinaMapJSON = [{
+  "ProID": 1,
+  "name": "北京市",
+  "ProSort": 1,
+  "ProRemark": "直辖市",
+  "city": [{
+    "CityID": 1,
+    "name": "北京市",
+    "ProID": 1,
+    "CitySort": 1,
+    "area": ["东城区", "西城区", "崇文区", "宣武区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区", "密云县", "延庆县"]
+  }]
+}, {
+  "ProID": 2,
+  "name": "天津市",
+  "ProSort": 2,
+  "ProRemark": "直辖市",
+  "city": [{
+    "CityID": 2,
+    "name": "天津市",
+    "ProID": 2,
+    "CitySort": 2,
+    "area": ["和平区", "河东区", "河西区", "南开区", "河北区", "红桥区", "塘沽区", "汉沽区", "大港区", "东丽区", "西青区", "津南区", "北辰区", "武清区", "宝坻区", "宁河县", "静海县", "蓟县"]
+  }]
+}, {
+  "ProID": 3,
+  "name": "河北省",
+  "ProSort": 5,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 5,
+    "name": "邯郸市",
+    "ProID": 3,
+    "CitySort": 5,
+    "area": ["邯山区", "丛台区", "复兴区", "峰峰矿区", "邯郸县", "临漳县", "成安县", "大名县", "涉县", "磁县", "肥乡县", "永年县", "邱县", "鸡泽县", "广平县", "馆陶县", "魏县", "曲周县", "武安市"]
+  }, {
+    "CityID": 6,
+    "name": "石家庄市",
+    "ProID": 3,
+    "CitySort": 6,
+    "area": ["长安区", "桥东区", "桥西区", "新华区", "井陉矿区", "裕华区", "井陉县", "正定县", "栾城县", "行唐县", "灵寿县", "高邑县", "深泽县", "赞皇县", "无极县", "平山县", "元氏县", "赵县", "辛集市", "藁城市", "晋州市", "新乐市", "鹿泉市"]
+  }, {
+    "CityID": 666,
+    "name": "秦皇岛市",
+    "ProID": 3,
+    "CitySort": 666,
+    "area": ["海港区", "山海关区", "北戴河区", "抚宁区", "青龙满族自治县", "昌黎县", "卢龙县"]
+  }, {
+    "CityID": 7,
+    "name": "保定市",
+    "ProID": 3,
+    "CitySort": 7,
+    "area": ["新市区", "北市区", "南市区", "满城县", "清苑县", "涞水县", "阜平县", "徐水县", "定兴县", "唐县", "高阳县", "容城县", "涞源县", "望都县", "安新县", "易县", "曲阳县", "蠡县", "顺平县", "博野县", "雄县", "涿州市", "定州市", "安国市", "高碑店市"]
+  }, {
+    "CityID": 8,
+    "name": "张家口市",
+    "ProID": 3,
+    "CitySort": 8,
+    "area": ["桥东区", "桥西区", "宣化区", "下花园区", "宣化县", "张北县", "康保县", "沽源县", "尚义县", "蔚县", "阳原县", "怀安县", "万全县", "怀来县", "涿鹿县", "赤城县", "崇礼县"]
+  }, {
+    "CityID": 9,
+    "name": "承德市",
+    "ProID": 3,
+    "CitySort": 9,
+    "area": ["双桥区", "双滦区", "鹰手营子矿区", "承德县", "兴隆县", "平泉县", "滦平县", "隆化县", "丰宁满族自治县", "宽城满族自治县", "围场满族蒙古族自治县"]
+  }, {
+    "CityID": 10,
+    "name": "唐山市",
+    "ProID": 3,
+    "CitySort": 10,
+    "area": ["路南区", "路北区", "古冶区", "开平区", "丰南区", "丰润区", "滦县", "滦南县", "乐亭县", "迁西县", "玉田县", "唐海县", "遵化市", "迁安市"]
+  }, {
+    "CityID": 11,
+    "name": "廊坊市",
+    "ProID": 3,
+    "CitySort": 11,
+    "area": ["安次区", "广阳区", "固安县", "永清县", "香河县", "大城县", "文安县", "大厂回族自治县", "霸州市", "三河市"]
+  }, {
+    "CityID": 12,
+    "name": "沧州市",
+    "ProID": 3,
+    "CitySort": 12,
+    "area": ["新华区", "运河区", "沧县", "青县", "东光县", "海兴县", "盐山县", "肃宁县", "南皮县", "吴桥县", "献县", "孟村回族自治县", "泊头市", "任丘市", "黄骅市", "河间市"]
+  }, {
+    "CityID": 13,
+    "name": "衡水市",
+    "ProID": 3,
+    "CitySort": 13,
+    "area": ["桃城区", "枣强县", "武邑县", "武强县", "饶阳县", "安平县", "故城县", "景县", "阜城县", "冀州市", "深州市"]
+  }, {
+    "CityID": 14,
+    "name": "邢台市",
+    "ProID": 3,
+    "CitySort": 14,
+    "area": ["桥东区", "桥西区", "邢台县", "临城县", "内丘县", "柏乡县", "隆尧县", "任县", "南和县", "宁晋县", "巨鹿县", "新河县", "广宗县", "平乡县", "威县", "清河县", "临西县", "南宫市", "沙河市"]
+  }]
+}, {
+  "ProID": 4,
+  "name": "山西省",
+  "ProSort": 6,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 16,
+    "name": "朔州市",
+    "ProID": 4,
+    "CitySort": 16,
+    "area": ["朔城区", "平鲁区", "山阴县", "应县", "右玉县", "怀仁县"]
+  }, {
+    "CityID": 17,
+    "name": "忻州市",
+    "ProID": 4,
+    "CitySort": 17,
+    "area": ["忻府区", "定襄县", "五台县", "代县", "繁峙县", "宁武县", "静乐县", "神池县", "五寨县", "岢岚县", "河曲县", "保德县", "偏关县", "原平市"]
+  }, {
+    "CityID": 18,
+    "name": "太原市",
+    "ProID": 4,
+    "CitySort": 18,
+    "area": ["小店区", "迎泽区", "杏花岭区", "尖草坪区", "万柏林区", "晋源区", "清徐县", "阳曲县", "娄烦县", "古交市"]
+  }, {
+    "CityID": 19,
+    "name": "大同市",
+    "ProID": 4,
+    "CitySort": 19,
+    "area": ["矿区", "南郊区", "新荣区", "阳高县", "天镇县", "广灵县", "灵丘县", "浑源县", "左云县", "大同县"]
+  }, {
+    "CityID": 20,
+    "name": "阳泉市",
+    "ProID": 4,
+    "CitySort": 20,
+    "area": ["矿区", "平定县", "盂县"]
+  }, {
+    "CityID": 21,
+    "name": "晋中市",
+    "ProID": 4,
+    "CitySort": 21,
+    "area": ["榆次区", "榆社县", "左权县", "和顺县", "昔阳县", "寿阳县", "太谷县", "祁县", "平遥县", "灵石县", "介休市"]
+  }, {
+    "CityID": 22,
+    "name": "长治市",
+    "ProID": 4,
+    "CitySort": 22,
+    "area": ["城区", "长治县", "襄垣县", "屯留县", "平顺县", "黎城县", "壶关县", "长子县", "武乡县", "沁县", "沁源县", "潞城市"]
+  }, {
+    "CityID": 23,
+    "name": "晋城市",
+    "ProID": 4,
+    "CitySort": 23,
+    "area": ["沁水县", "阳城县", "陵川县", "泽州县", "高平市"]
+  }, {
+    "CityID": 24,
+    "name": "临汾市",
+    "ProID": 4,
+    "CitySort": 24,
+    "area": ["尧都区", "曲沃县", "翼城县", "襄汾县", "洪洞县", "古县", "安泽县", "浮山县", "吉县", "乡宁县", "大宁县", "隰县", "永和县", "蒲县", "汾西县", "侯马市", "霍州市"]
+  }, {
+    "CityID": 25,
+    "name": "吕梁市",
+    "ProID": 4,
+    "CitySort": 25,
+    "area": ["离石区", "文水县", "交城县", "兴县", "临县", "柳林县", "石楼县", "岚县", "方山县", "中阳县", "交口县", "孝义市", "汾阳市"]
+  }, {
+    "CityID": 26,
+    "name": "运城市",
+    "ProID": 4,
+    "CitySort": 26,
+    "area": ["盐湖区", "临猗县", "万荣县", "闻喜县", "稷山县", "新绛县", "绛县", "垣曲县", "夏县", "平陆县", "芮城县", "永济市", "河津市"]
+  }]
+}, {
+  "ProID": 5,
+  "name": "内蒙古自治区",
+  "ProSort": 32,
+  "ProRemark": "自治区",
+  "city": [{
+    "CityID": 351,
+    "name": "呼伦贝尔市",
+    "ProID": 5,
+    "CitySort": 351,
+    "area": ["海拉尔区", "阿荣旗", "莫力达瓦达斡尔族自治旗", "鄂伦春自治旗", "鄂温克族自治旗", "陈巴尔虎旗", "新巴尔虎左旗", "新巴尔虎右旗", "满洲里市", "牙克石市", "扎兰屯市", "额尔古纳市", "根河市"]
+  }, {
+    "CityID": 352,
+    "name": "呼和浩特市",
+    "ProID": 5,
+    "CitySort": 352,
+    "area": ["新城区", "回民区", "玉泉区", "赛罕区", "土默特左旗", "托克托县", "和林格尔县", "清水河县", "武川县"]
+  }, {
+    "CityID": 353,
+    "name": "包头市",
+    "ProID": 5,
+    "CitySort": 353,
+    "area": ["东河区", "昆都仑区", "青山区", "石拐区", "白云鄂博矿区", "九原区", "土默特右旗", "固阳县", "达尔罕茂明安联合旗"]
+  }, {
+    "CityID": 354,
+    "name": "乌海市",
+    "ProID": 5,
+    "CitySort": 354,
+    "area": ["海勃湾区", "海南区", "乌达区"]
+  }, {
+    "CityID": 355,
+    "name": "乌兰察布市",
+    "ProID": 5,
+    "CitySort": 355,
+    "area": ["集宁区", "卓资县", "化德县", "商都县", "兴和县", "凉城县", "察哈尔右翼前旗", "察哈尔右翼中旗", "察哈尔右翼后旗", "四子王旗", "丰镇市"]
+  }, {
+    "CityID": 356,
+    "name": "通辽市",
+    "ProID": 5,
+    "CitySort": 356,
+    "area": ["科尔沁区", "科尔沁左翼中旗", "科尔沁左翼后旗", "开鲁县", "库伦旗", "奈曼旗", "扎鲁特旗", "霍林郭勒市"]
+  }, {
+    "CityID": 357,
+    "name": "赤峰市",
+    "ProID": 5,
+    "CitySort": 357,
+    "area": ["红山区", "元宝山区", "松山区", "阿鲁科尔沁旗", "巴林左旗", "巴林右旗", "林西县", "克什克腾旗", "翁牛特旗", "喀喇沁旗", "宁城县", "敖汉旗"]
+  }, {
+    "CityID": 358,
+    "name": "鄂尔多斯市",
+    "ProID": 5,
+    "CitySort": 358,
+    "area": ["东胜区", "达拉特旗", "准格尔旗", "鄂托克前旗", "鄂托克旗", "杭锦旗", "乌审旗", "伊金霍洛旗"]
+  }, {
+    "CityID": 359,
+    "name": "巴彦淖尔市",
+    "ProID": 5,
+    "CitySort": 359,
+    "area": ["临河区", "五原县", "磴口县", "乌拉特前旗", "乌拉特中旗", "乌拉特后旗", "杭锦后旗"]
+  }, {
+    "CityID": 360,
+    "name": "锡林郭勒盟",
+    "ProID": 5,
+    "CitySort": 360,
+    "area": ["二连浩特市", "锡林浩特市", "阿巴嘎旗", "苏尼特左旗", "苏尼特右旗", "东乌珠穆沁旗", "西乌珠穆沁旗", "太仆寺旗", "镶黄旗", "正镶白旗", "正蓝旗", "多伦县"]
+  }, {
+    "CityID": 361,
+    "name": "兴安盟",
+    "ProID": 5,
+    "CitySort": 361,
+    "area": ["乌兰浩特市", "阿尔山市", "科尔沁右翼前旗", "科尔沁右翼中旗", "扎赉特旗", "突泉县"]
+  }, {
+    "CityID": 362,
+    "name": "阿拉善盟",
+    "ProID": 5,
+    "CitySort": 362,
+    "area": ["阿拉善左旗", "阿拉善右旗", "额济纳旗"]
+  }]
+}, {
+  "ProID": 6,
+  "name": "辽宁省",
+  "ProSort": 8,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 27,
+    "name": "沈阳市",
+    "ProID": 6,
+    "CitySort": 27,
+    "area": ["和平区", "沈河区", "大东区", "皇姑区", "铁西区", "苏家屯区", "东陵区", "沈北新区", "于洪区", "辽中县", "康平县", "法库县", "新民市"]
+  }, {
+    "CityID": 28,
+    "name": "铁岭市",
+    "ProID": 6,
+    "CitySort": 28,
+    "area": ["银州区", "清河区", "铁岭县", "西丰县", "昌图县", "调兵山市", "开原市"]
+  }, {
+    "CityID": 29,
+    "name": "大连市",
+    "ProID": 6,
+    "CitySort": 29,
+    "area": ["长海县", "旅顺口区", "中山区", "西岗区", "沙河口区", "甘井子区", "金州区", "普兰店区", "瓦房店市", "庄河市"]
+  }, {
+    "CityID": 30,
+    "name": "鞍山市",
+    "ProID": 6,
+    "CitySort": 30,
+    "area": ["铁东区", "铁西区", "立山区", "千山区", "台安县", "岫岩满族自治县", "海城市"]
+  }, {
+    "CityID": 31,
+    "name": "抚顺市",
+    "ProID": 6,
+    "CitySort": 31,
+    "area": ["新抚区", "东洲区", "望花区", "顺城区", "抚顺县", "新宾满族自治县", "清原满族自治县"]
+  }, {
+    "CityID": 32,
+    "name": "本溪市",
+    "ProID": 6,
+    "CitySort": 32,
+    "area": ["平山区", "溪湖区", "明山区", "南芬区", "本溪满族自治县", "桓仁满族自治县"]
+  }, {
+    "CityID": 33,
+    "name": "丹东市",
+    "ProID": 6,
+    "CitySort": 33,
+    "area": ["元宝区", "振兴区", "振安区", "宽甸满族自治县", "东港市", "凤城市"]
+  }, {
+    "CityID": 34,
+    "name": "锦州市",
+    "ProID": 6,
+    "CitySort": 34,
+    "area": ["古塔区", "凌河区", "太和区", "黑山县", "义县", "凌海市", "北镇市"]
+  }, {
+    "CityID": 35,
+    "name": "营口市",
+    "ProID": 6,
+    "CitySort": 35,
+    "area": ["站前区", "西市区", "鮁鱼圈区", "老边区", "盖州市", "大石桥市"]
+  }, {
+    "CityID": 36,
+    "name": "阜新市",
+    "ProID": 6,
+    "CitySort": 36,
+    "area": ["海州区", "新邱区", "太平区", "清河门区", "细河区", "阜新蒙古族自治县", "彰武县"]
+  }, {
+    "CityID": 37,
+    "name": "辽阳市",
+    "ProID": 6,
+    "CitySort": 37,
+    "area": ["白塔区", "文圣区", "宏伟区", "弓长岭区", "太子河区", "辽阳县", "灯塔市"]
+  }, {
+    "CityID": 38,
+    "name": "朝阳市",
+    "ProID": 6,
+    "CitySort": 38,
+    "area": ["双塔区", "龙城区", "朝阳县", "建平县", "喀喇沁左翼蒙古族自治县", "北票市", "凌源市"]
+  }, {
+    "CityID": 39,
+    "name": "盘锦市",
+    "ProID": 6,
+    "CitySort": 39,
+    "area": ["双台子区", "兴隆台区", "大洼县", "盘山县"]
+  }, {
+    "CityID": 40,
+    "name": "葫芦岛市",
+    "ProID": 6,
+    "CitySort": 40,
+    "area": ["连山区", "龙港区", "南票区", "绥中县", "建昌县", "兴城市"]
+  }]
+}, {
+  "ProID": 7,
+  "name": "吉林省",
+  "ProSort": 9,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 41,
+    "name": "长春市",
+    "ProID": 7,
+    "CitySort": 41,
+    "area": ["南关区", "宽城区", "朝阳区", "二道区", "绿园区", "双阳区", "农安县", "九台市", "榆树市", "德惠市"]
+  }, {
+    "CityID": 42,
+    "name": "吉林市",
+    "ProID": 7,
+    "CitySort": 42,
+    "area": ["昌邑区", "龙潭区", "船营区", "丰满区", "永吉县", "蛟河市", "桦甸市", "舒兰市", "磐石市"]
+  }, {
+    "CityID": 43,
+    "name": "延边朝鲜族自治州",
+    "ProID": 7,
+    "CitySort": 43,
+    "area": ["延吉市", "图们市", "敦化市", "珲春市", "龙井市", "和龙市", "汪清县", "安图县"]
+  }, {
+    "CityID": 44,
+    "name": "四平市",
+    "ProID": 7,
+    "CitySort": 44,
+    "area": ["铁西区", "铁东区", "梨树县", "伊通满族自治县", "公主岭市", "双辽市"]
+  }, {
+    "CityID": 45,
+    "name": "通化市",
+    "ProID": 7,
+    "CitySort": 45,
+    "area": ["东昌区", "二道江区", "通化县", "辉南县", "柳河县", "梅河口市", "集安市"]
+  }, {
+    "CityID": 46,
+    "name": "白城市",
+    "ProID": 7,
+    "CitySort": 46,
+    "area": ["洮北区", "镇赉县", "通榆县", "洮南市", "大安市"]
+  }, {
+    "CityID": 47,
+    "name": "辽源市",
+    "ProID": 7,
+    "CitySort": 47,
+    "area": ["龙山区", "西安区", "东丰县", "东辽县"]
+  }, {
+    "CityID": 48,
+    "name": "松原市",
+    "ProID": 7,
+    "CitySort": 48,
+    "area": ["宁江区", "前郭尔罗斯蒙古族自治县", "长岭县", "乾安县", "扶余县"]
+  }, {
+    "CityID": 49,
+    "name": "白山市",
+    "ProID": 7,
+    "CitySort": 49,
+    "area": ["八道江区", "江源区", "抚松县", "靖宇县", "长白朝鲜族自治县", "临江市"]
+  }]
+}, {
+  "ProID": 8,
+  "name": "黑龙江省",
+  "ProSort": 10,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 50,
+    "name": "哈尔滨市",
+    "ProID": 8,
+    "CitySort": 50,
+    "area": ["道里区", "南岗区", "道外区", "平房区", "松北区", "香坊区", "呼兰区", "阿城区", "依兰县", "方正县", "宾县", "巴彦县", "木兰县", "通河县", "延寿县", "双城市", "尚志市", "五常市"]
+  }, {
+    "CityID": 51,
+    "name": "齐齐哈尔市",
+    "ProID": 8,
+    "CitySort": 51,
+    "area": ["龙沙区", "建华区", "铁锋区", "昂昂溪区", "富拉尔基区", "碾子山区", "梅里斯达翰尔族区", "龙江县", "依安县", "泰来县", "甘南县", "富裕县", "克山县", "克东县", "拜泉县", "讷河市"]
+  }, {
+    "CityID": 52,
+    "name": "鸡西市",
+    "ProID": 8,
+    "CitySort": 52,
+    "area": ["鸡冠区", "恒山区", "滴道区", "梨树区", "城子河区", "麻山区", "鸡东县", "虎林市", "密山市"]
+  }, {
+    "CityID": 53,
+    "name": "牡丹江市",
+    "ProID": 8,
+    "CitySort": 53,
+    "area": ["东安区", "阳明区", "爱民区", "西安区", "东宁县", "林口县", "绥芬河市", "海林市", "宁安市", "穆棱市"]
+  }, {
+    "CityID": 54,
+    "name": "七台河市",
+    "ProID": 8,
+    "CitySort": 54,
+    "area": ["新兴区", "桃山区", "茄子河区", "勃利县"]
+  }, {
+    "CityID": 55,
+    "name": "佳木斯市",
+    "ProID": 8,
+    "CitySort": 55,
+    "area": ["向阳区", "前进区", "东风区", "桦南县", "桦川县", "汤原县", "抚远县", "同江市", "富锦市"]
+  }, {
+    "CityID": 56,
+    "name": "鹤岗市",
+    "ProID": 8,
+    "CitySort": 56,
+    "area": ["向阳区", "工农区", "南山区", "兴安区", "东山区", "兴山区", "萝北县", "绥滨县"]
+  }, {
+    "CityID": 57,
+    "name": "双鸭山市",
+    "ProID": 8,
+    "CitySort": 57,
+    "area": ["尖山区", "岭东区", "四方台区", "宝山区", "集贤县", "友谊县", "宝清县", "饶河县"]
+  }, {
+    "CityID": 58,
+    "name": "绥化市",
+    "ProID": 8,
+    "CitySort": 58,
+    "area": ["北林区", "望奎县", "兰西县", "青冈县", "庆安县", "明水县", "绥棱县", "安达市", "肇东市", "海伦市"]
+  }, {
+    "CityID": 59,
+    "name": "黑河市",
+    "ProID": 8,
+    "CitySort": 59,
+    "area": ["爱辉区", "嫩江县", "逊克县", "孙吴县", "北安市", "五大连池市"]
+  }, {
+    "CityID": 60,
+    "name": "大兴安岭地区",
+    "ProID": 8,
+    "CitySort": 60,
+    "area": ["呼玛县", "塔河县", "漠河县"]
+  }, {
+    "CityID": 61,
+    "name": "伊春市",
+    "ProID": 8,
+    "CitySort": 61,
+    "area": ["伊春区", "南岔区", "友好区", "西林区", "翠峦区", "新青区", "美溪区", "金山屯区", "五营区", "乌马河区", "汤旺河区", "带岭区", "乌伊岭区", "红星区", "上甘岭区", "嘉荫县", "铁力市"]
+  }, {
+    "CityID": 62,
+    "name": "大庆市",
+    "ProID": 8,
+    "CitySort": 62,
+    "area": ["萨尔图区", "龙凤区", "让胡路区", "红岗区", "大同区", "肇州县", "肇源县", "林甸县", "杜尔伯特蒙古族自治县"]
+  }]
+}, {
+  "ProID": 9,
+  "name": "上海市",
+  "ProSort": 3,
+  "ProRemark": "直辖市",
+  "city": [{
+    "CityID": 3,
+    "name": "上海市",
+    "ProID": 9,
+    "CitySort": 3,
+    "area": ["黄浦区", "卢湾区", "徐汇区", "长宁区", "静安区", "普陀区", "闸北区", "虹口区", "杨浦区", "闵行区", "宝山区", "嘉定区", "浦东新区", "金山区", "松江区", "青浦区", "南汇区", "奉贤区", "崇明县"]
+  }]
+}, {
+  "ProID": 10,
+  "name": "江苏省",
+  "ProSort": 11,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 63,
+    "name": "南京市",
+    "ProID": 10,
+    "CitySort": 63,
+    "area": ["江宁区", "浦口区", "玄武区", "白下区", "秦淮区", "建邺区", "鼓楼区", "下关区", "栖霞区", "雨花台区", "六合区", "溧水县", "高淳县"]
+  }, {
+    "CityID": 64,
+    "name": "无锡市",
+    "ProID": 10,
+    "CitySort": 64,
+    "area": ["崇安区", "南长区", "北塘区", "锡山区", "惠山区", "滨湖区", "江阴市", "宜兴市"]
+  }, {
+    "CityID": 65,
+    "name": "镇江市",
+    "ProID": 10,
+    "CitySort": 65,
+    "area": ["京口区", "润州区", "丹徒区", "丹阳市", "扬中市", "句容市"]
+  }, {
+    "CityID": 66,
+    "name": "苏州市",
+    "ProID": 10,
+    "CitySort": 66,
+    "area": ["沧浪区", "常熟市", "平江区", "金阊区", "虎丘区", "昆山市", "太仓市", "吴江市", "吴中区", "相城区", "张家港市"]
+  }, {
+    "CityID": 67,
+    "name": "南通市",
+    "ProID": 10,
+    "CitySort": 67,
+    "area": ["崇川区", "港闸区", "海安县", "如东县", "启东市", "如皋市", "通州市", "海门市"]
+  }, {
+    "CityID": 68,
+    "name": "扬州市",
+    "ProID": 10,
+    "CitySort": 68,
+    "area": ["高邮市", "广陵区", "邗江区", "维扬区", "宝应县", "江都市", "仪征市"]
+  }, {
+    "CityID": 69,
+    "name": "盐城市",
+    "ProID": 10,
+    "CitySort": 69,
+    "area": ["亭湖区", "盐都区", "响水县", "滨海县", "阜宁县", "射阳县", "建湖县", "东台市", "大丰市"]
+  }, {
+    "CityID": 70,
+    "name": "徐州市",
+    "ProID": 10,
+    "CitySort": 70,
+    "area": ["鼓楼区", "云龙区", "九里区", "贾汪区", "泉山区", "丰县", "沛县", "铜山县", "睢宁县", "新沂市", "邳州市"]
+  }, {
+    "CityID": 71,
+    "name": "淮安市",
+    "ProID": 10,
+    "CitySort": 71,
+    "area": ["清河区", "楚州区", "淮阴区", "清浦区", "涟水县", "洪泽县", "盱眙县", "金湖县"]
+  }, {
+    "CityID": 72,
+    "name": "连云港市",
+    "ProID": 10,
+    "CitySort": 72,
+    "area": ["连云区", "新浦区", "海州区", "赣榆县", "东海县", "灌云县", "灌南县"]
+  }, {
+    "CityID": 73,
+    "name": "常州市",
+    "ProID": 10,
+    "CitySort": 73,
+    "area": ["天宁区", "钟楼区", "戚墅堰区", "新北区", "武进区", "溧阳市", "金坛市"]
+  }, {
+    "CityID": 74,
+    "name": "泰州市",
+    "ProID": 10,
+    "CitySort": 74,
+    "area": ["海陵区", "高港区", "兴化市", "靖江市", "泰兴市", "姜堰市"]
+  }, {
+    "CityID": 75,
+    "name": "宿迁市",
+    "ProID": 10,
+    "CitySort": 75,
+    "area": ["宿城区", "宿豫区", "沭阳县", "泗阳县", "泗洪县"]
+  }]
+}, {
+  "ProID": 11,
+  "name": "浙江省",
+  "ProSort": 12,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 76,
+    "name": "舟山市",
+    "ProID": 11,
+    "CitySort": 76,
+    "area": ["定海区", "普陀区", "岱山县", "嵊泗县"]
+  }, {
+    "CityID": 77,
+    "name": "衢州市",
+    "ProID": 11,
+    "CitySort": 77,
+    "area": ["柯城区", "衢江区", "常山县", "开化县", "龙游县", "江山市"]
+  }, {
+    "CityID": 78,
+    "name": "杭州市",
+    "ProID": 11,
+    "CitySort": 78,
+    "area": ["上城区", "下城区", "江干区", "拱墅区", "西湖区", "滨江区", "余杭区", "桐庐县", "淳安县", "建德市", "富阳市", "临安市", "萧山区"]
+  }, {
+    "CityID": 79,
+    "name": "湖州市",
+    "ProID": 11,
+    "CitySort": 79,
+    "area": ["吴兴区", "南浔区", "德清县", "长兴县", "安吉县"]
+  }, {
+    "CityID": 80,
+    "name": "嘉兴市",
+    "ProID": 11,
+    "CitySort": 80,
+    "area": [" 南湖区", " 秀洲区", " 嘉善县", " 海盐县", " 海宁市", " 平湖市", " 桐乡市 "]
+  }, {
+    "CityID": 81,
+    "name": "宁波市",
+    "ProID": 11,
+    "CitySort": 81,
+    "area": ["海曙区", "江东区", "江北区", "北仑区", "镇海区", "鄞州区", "象山县", "宁海县", "余姚市", "慈溪市", "奉化市"]
+  }, {
+    "CityID": 82,
+    "name": "绍兴市",
+    "ProID": 11,
+    "CitySort": 82,
+    "area": ["越城区", "绍兴县", "新昌县", "诸暨市", "上虞市", "嵊州市"]
+  }, {
+    "CityID": 83,
+    "name": "温州市",
+    "ProID": 11,
+    "CitySort": 83,
+    "area": ["鹿城区", "龙湾区", "瓯海区", "洞头县", "永嘉县", "平阳县", "苍南县", "文成县", "泰顺县", "瑞安市", "乐清市"]
+  }, {
+    "CityID": 84,
+    "name": "丽水市",
+    "ProID": 11,
+    "CitySort": 84,
+    "area": ["莲都区", "青田县", "缙云县", "遂昌县", "松阳县", "云和县", "庆元县", "景宁畲族自治县", "龙泉市"]
+  }, {
+    "CityID": 85,
+    "name": "金华市",
+    "ProID": 11,
+    "CitySort": 85,
+    "area": ["婺城区", "金东区", "武义县", "浦江县", "磐安县", "兰溪市", "义乌市", "东阳市", "永康市"]
+  }, {
+    "CityID": 86,
+    "name": "台州市",
+    "ProID": 11,
+    "CitySort": 86,
+    "area": ["椒江区", "黄岩区", "路桥区", "玉环县", "三门县", "天台县", "仙居县", "温岭市", "临海市"]
+  }]
+}, {
+  "ProID": 12,
+  "name": "安徽省",
+  "ProSort": 13,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 87,
+    "name": "合肥市",
+    "ProID": 12,
+    "CitySort": 87,
+    "area": ["瑶海区", "庐阳区", "蜀山区", "包河区", "长丰县", "肥东县", "肥西县"]
+  }, {
+    "CityID": 88,
+    "name": "芜湖市",
+    "ProID": 12,
+    "CitySort": 88,
+    "area": ["镜湖区", "弋江区", "鸠江区", "三山区", "芜湖县", "繁昌县", "南陵县"]
+  }, {
+    "CityID": 89,
+    "name": "蚌埠市",
+    "ProID": 12,
+    "CitySort": 89,
+    "area": ["龙子湖区", "蚌山区", "禹会区", "淮上区", "怀远县", "五河县", "固镇县"]
+  }, {
+    "CityID": 90,
+    "name": "淮南市",
+    "ProID": 12,
+    "CitySort": 90,
+    "area": ["大通区", "田家庵区", "谢家集区", "八公山区", "潘集区", "凤台县"]
+  }, {
+    "CityID": 91,
+    "name": "马鞍山市",
+    "ProID": 12,
+    "CitySort": 91,
+    "area": ["金家庄区", "花山区", "雨山区", "当涂县"]
+  }, {
+    "CityID": 92,
+    "name": "淮北市",
+    "ProID": 12,
+    "CitySort": 92,
+    "area": ["杜集区", "相山区", "烈山区", "濉溪县 "]
+  }, {
+    "CityID": 93,
+    "name": "铜陵市",
+    "ProID": 12,
+    "CitySort": 93,
+    "area": ["铜官山区", "狮子山区", "铜陵县"]
+  }, {
+    "CityID": 94,
+    "name": "安庆市",
+    "ProID": 12,
+    "CitySort": 94,
+    "area": ["迎江区", "大观区", "宜秀区", "怀宁县", "枞阳县", "潜山县", "太湖县", "宿松县", "望江县", "岳西县", "桐城市"]
+  }, {
+    "CityID": 95,
+    "name": "黄山市",
+    "ProID": 12,
+    "CitySort": 95,
+    "area": ["屯溪区", "黄山区", "徽州区", "歙县", "休宁县", "黟县", "祁门县"]
+  }, {
+    "CityID": 96,
+    "name": "滁州市",
+    "ProID": 12,
+    "CitySort": 96,
+    "area": ["琅琊区", "南谯区", "来安县", "全椒县", "定远县", "凤阳县", "天长市", "明光市"]
+  }, {
+    "CityID": 97,
+    "name": "阜阳市",
+    "ProID": 12,
+    "CitySort": 97,
+    "area": ["颍州区", "颍东区", "颍泉区", "临泉县", "太和县", "阜南县", "颍上县", "界首市"]
+  }, {
+    "CityID": 98,
+    "name": "宿州市",
+    "ProID": 12,
+    "CitySort": 98,
+    "area": ["埇桥区", "砀山县", "萧县", "灵璧县", "泗县 "]
+  }, {
+    "CityID": 99,
+    "name": "巢湖市",
+    "ProID": 12,
+    "CitySort": 99,
+    "area": ["居巢区", "庐江县", "无为县", "含山县", "和县 "]
+  }, {
+    "CityID": 100,
+    "name": "六安市",
+    "ProID": 12,
+    "CitySort": 100,
+    "area": ["金安区", "裕安区", "寿县", "霍邱县", "舒城县", "金寨县", "霍山县"]
+  }, {
+    "CityID": 101,
+    "name": "亳州市",
+    "ProID": 12,
+    "CitySort": 101,
+    "area": ["谯城区", "涡阳县", "蒙城县", "利辛县"]
+  }, {
+    "CityID": 102,
+    "name": "池州市",
+    "ProID": 12,
+    "CitySort": 102,
+    "area": ["贵池区", "东至县", "石台县", "青阳县"]
+  }, {
+    "CityID": 103,
+    "name": "宣城市",
+    "ProID": 12,
+    "CitySort": 103,
+    "area": ["宣州区", "郎溪县", "广德县", "泾县", "绩溪县", "旌德县", "宁国市"]
+  }]
+}, {
+  "ProID": 13,
+  "name": "福建省",
+  "ProSort": 14,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 104,
+    "name": "福州市",
+    "ProID": 13,
+    "CitySort": 104,
+    "area": ["鼓楼区", "台江区", "仓山区", "马尾区", "晋安区", "闽侯县", "连江县", "罗源县", "闽清县", "永泰县", "平潭县", "福清市", "长乐市"]
+  }, {
+    "CityID": 105,
+    "name": "厦门市",
+    "ProID": 13,
+    "CitySort": 105,
+    "area": ["思明区", "海沧区", "湖里区", "集美区", "同安区", "翔安区"]
+  }, {
+    "CityID": 106,
+    "name": "宁德市",
+    "ProID": 13,
+    "CitySort": 106,
+    "area": ["蕉城区", "霞浦县", "古田县", "屏南县", "寿宁县", "周宁县", "柘荣县", "福安市", "福鼎市"]
+  }, {
+    "CityID": 107,
+    "name": "莆田市",
+    "ProID": 13,
+    "CitySort": 107,
+    "area": ["城厢区", "涵江区", "荔城区", "秀屿区", "仙游县"]
+  }, {
+    "CityID": 108,
+    "name": "泉州市",
+    "ProID": 13,
+    "CitySort": 108,
+    "area": ["鲤城区", "丰泽区", "洛江区", "泉港区", "惠安县", "安溪县", "永春县", "德化县", "石狮市", "晋江市", "南安市"]
+  }, {
+    "CityID": 109,
+    "name": "漳州市",
+    "ProID": 13,
+    "CitySort": 109,
+    "area": ["芗城区", "龙文区", "云霄县", "漳浦县", "诏安县", "长泰县", "东山县", "南靖县", "平和县", "华安县", "龙海市"]
+  }, {
+    "CityID": 110,
+    "name": "龙岩市",
+    "ProID": 13,
+    "CitySort": 110,
+    "area": ["新罗区", "长汀县", "永定县", "上杭县", "武平县", "连城县", "漳平市"]
+  }, {
+    "CityID": 111,
+    "name": "三明市",
+    "ProID": 13,
+    "CitySort": 111,
+    "area": ["梅列区", "三元区", "明溪县", "清流县", "宁化县", "大田县", "尤溪县", "沙县", "将乐县", "泰宁县", "建宁县", "永安市"]
+  }, {
+    "CityID": 112,
+    "name": "南平市",
+    "ProID": 13,
+    "CitySort": 112,
+    "area": ["延平区", "顺昌县", "浦城县", "光泽县", "松溪县", "政和县", "邵武市", "武夷山市", "建瓯市", "建阳市"]
+  }]
+}, {
+  "ProID": 14,
+  "name": "江西省",
+  "ProSort": 15,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 113,
+    "name": "鹰潭市",
+    "ProID": 14,
+    "CitySort": 113,
+    "area": ["月湖区", "余江县", "贵溪市"]
+  }, {
+    "CityID": 114,
+    "name": "新余市",
+    "ProID": 14,
+    "CitySort": 114,
+    "area": ["渝水区", "分宜县"]
+  }, {
+    "CityID": 115,
+    "name": "南昌市",
+    "ProID": 14,
+    "CitySort": 115,
+    "area": ["东湖区", "西湖区", "青云谱区", "湾里区", "青山湖区", "南昌县", "新建县", "安义县", "进贤县"]
+  }, {
+    "CityID": 116,
+    "name": "九江市",
+    "ProID": 14,
+    "CitySort": 116,
+    "area": ["庐山区", "浔阳区", "九江县", "武宁县", "修水县", "永修县", "德安县", "星子县", "都昌县", "湖口县", "彭泽县", "瑞昌市"]
+  }, {
+    "CityID": 117,
+    "name": "上饶市",
+    "ProID": 14,
+    "CitySort": 117,
+    "area": ["信州区", "上饶县", "广丰县", "玉山县", "铅山县", "横峰县", "弋阳县", "余干县", "鄱阳县", "万年县", "婺源县", "德兴市"]
+  }, {
+    "CityID": 118,
+    "name": "抚州市",
+    "ProID": 14,
+    "CitySort": 118,
+    "area": ["临川区", "南城县", "黎川县", "南丰县", "崇仁县", "乐安县", "宜黄县", "金溪县", "资溪县", "东乡县", "广昌县"]
+  }, {
+    "CityID": 119,
+    "name": "宜春市",
+    "ProID": 14,
+    "CitySort": 119,
+    "area": ["袁州区", "奉新县", "万载县", "上高县", "宜丰县", "靖安县", "铜鼓县", "丰城市", "樟树市", "高安市"]
+  }, {
+    "CityID": 120,
+    "name": "吉安市",
+    "ProID": 14,
+    "CitySort": 120,
+    "area": ["吉州区", "青原区", "吉安县", "吉水县", "峡江县", "新干县", "永丰县", "泰和县", "遂川县", "万安县", "安福县", "永新县", "井冈山市"]
+  }, {
+    "CityID": 121,
+    "name": "赣州市",
+    "ProID": 14,
+    "CitySort": 121,
+    "area": ["章贡区", "赣县", "信丰县", "大余县", "上犹县", "崇义县", "安远县", "龙南县", "定南县", "全南县", "宁都县", "于都县", "兴国县", "会昌县", "寻乌县", "石城县", "瑞金市", "南康市"]
+  }, {
+    "CityID": 122,
+    "name": "景德镇市",
+    "ProID": 14,
+    "CitySort": 122,
+    "area": ["昌江区", "珠山区", "浮梁县", "乐平市"]
+  }, {
+    "CityID": 123,
+    "name": "萍乡市",
+    "ProID": 14,
+    "CitySort": 123,
+    "area": ["安源区", "湘东区", "莲花县", "上栗县", "芦溪县"]
+  }]
+}, {
+  "ProID": 15,
+  "name": "山东省",
+  "ProSort": 16,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 124,
+    "name": "菏泽市",
+    "ProID": 15,
+    "CitySort": 124,
+    "area": ["牡丹区", "曹县", "单县", "成武县", "巨野县", "郓城县", "鄄城县", "定陶县", "东明县"]
+  }, {
+    "CityID": 125,
+    "name": "济南市",
+    "ProID": 15,
+    "CitySort": 125,
+    "area": ["历下区", "市中区", "槐荫区", "天桥区", "历城区", "长清区", "平阴县", "济阳县", "商河县", "章丘市"]
+  }, {
+    "CityID": 126,
+    "name": "青岛市",
+    "ProID": 15,
+    "CitySort": 126,
+    "area": ["市南区", "市北区", "四方区", "黄岛区", "崂山区", "李沧区", "城阳区", "胶州市", "即墨市", "平度市", "胶南市", "莱西市"]
+  }, {
+    "CityID": 127,
+    "name": "淄博市",
+    "ProID": 15,
+    "CitySort": 127,
+    "area": ["淄川区", "张店区", "博山区", "临淄区", "周村区", "桓台县", "高青县", "沂源县"]
+  }, {
+    "CityID": 128,
+    "name": "德州市",
+    "ProID": 15,
+    "CitySort": 128,
+    "area": ["德城区", "陵县", "宁津县", "庆云县", "临邑县", "齐河县", "平原县", "夏津县", "武城县", "乐陵市", "禹城市"]
+  }, {
+    "CityID": 129,
+    "name": "烟台市",
+    "ProID": 15,
+    "CitySort": 129,
+    "area": ["芝罘区", "福山区", "牟平区", "莱山区", "长岛县", "龙口市", "莱阳市", "莱州市", "蓬莱市", "招远市", "栖霞市", "海阳市"]
+  }, {
+    "CityID": 130,
+    "name": "潍坊市",
+    "ProID": 15,
+    "CitySort": 130,
+    "area": ["潍城区", "寒亭区", "坊子区", "奎文区", "临朐县", "昌乐县", "青州市", "诸城市", "寿光市", "安丘市", "高密市", "昌邑市"]
+  }, {
+    "CityID": 131,
+    "name": "济宁市",
+    "ProID": 15,
+    "CitySort": 131,
+    "area": ["市中区", "任城区", "微山县", "鱼台县", "金乡县", "嘉祥县", "汶上县", "泗水县", "梁山县", "曲阜市", "兖州市", "邹城市"]
+  }, {
+    "CityID": 132,
+    "name": "泰安市",
+    "ProID": 15,
+    "CitySort": 132,
+    "area": ["泰山区", "岱岳区", "宁阳县", "东平县", "新泰市", "肥城市"]
+  }, {
+    "CityID": 133,
+    "name": "临沂市",
+    "ProID": 15,
+    "CitySort": 133,
+    "area": ["兰山区", "罗庄区", "河东区", "沂南县", "郯城县", "沂水县", "苍山县", "费县", "平邑县", "莒南县", "蒙阴县", "临沭县"]
+  }, {
+    "CityID": 134,
+    "name": "滨州市",
+    "ProID": 15,
+    "CitySort": 134,
+    "area": ["滨城区", "惠民县", "阳信县", "无棣县", "沾化县", "博兴县", "邹平县"]
+  }, {
+    "CityID": 135,
+    "name": "东营市",
+    "ProID": 15,
+    "CitySort": 135,
+    "area": ["东营区", "河口区", "垦利县", "利津县", "广饶县"]
+  }, {
+    "CityID": 136,
+    "name": "威海市",
+    "ProID": 15,
+    "CitySort": 136,
+    "area": ["环翠区", "文登市", "荣成市", "乳山市"]
+  }, {
+    "CityID": 137,
+    "name": "枣庄市",
+    "ProID": 15,
+    "CitySort": 137,
+    "area": ["市中区", "薛城区", "峄城区", "台儿庄区", "山亭区", "滕州市"]
+  }, {
+    "CityID": 138,
+    "name": "日照市",
+    "ProID": 15,
+    "CitySort": 138,
+    "area": ["东港区", "岚山区", "五莲县", "莒县"]
+  }, {
+    "CityID": 139,
+    "name": "莱芜市",
+    "ProID": 15,
+    "CitySort": 139,
+    "area": ["莱城区", "钢城区"]
+  }, {
+    "CityID": 140,
+    "name": "聊城市",
+    "ProID": 15,
+    "CitySort": 140,
+    "area": ["东昌府区", "阳谷县", "莘县", "茌平县", "东阿县", "冠县", "高唐县", "临清市"]
+  }]
+}, {
+  "ProID": 16,
+  "name": "河南省",
+  "ProSort": 17,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 141,
+    "name": "商丘市",
+    "ProID": 16,
+    "CitySort": 141,
+    "area": ["梁园区", "睢阳区", "民权县", "睢县", "宁陵县", "柘城县", "虞城县", "夏邑县", "永城市"]
+  }, {
+    "CityID": 142,
+    "name": "郑州市",
+    "ProID": 16,
+    "CitySort": 142,
+    "area": ["中原区", "高新区", "经济技术开发区", "航空港区", "郑东新区", "二七区", "管城回族区", "金水区", "上街区", "惠济区", "中牟县", "巩义市", "荥阳市", "新密市", "新郑市", "登封市"]
+  }, {
+    "CityID": 143,
+    "name": "安阳市",
+    "ProID": 16,
+    "CitySort": 143,
+    "area": ["文峰区", "北关区", "殷都区", "龙安区", "安阳县", "汤阴县", "滑县", "内黄县", "林州市"]
+  }, {
+    "CityID": 144,
+    "name": "新乡市",
+    "ProID": 16,
+    "CitySort": 144,
+    "area": ["红旗区", "卫滨区", "凤泉区", "牧野区", "新乡县", "获嘉县", "原阳县", "延津县", "封丘县", "长垣县", "卫辉市", "辉县市"]
+  }, {
+    "CityID": 145,
+    "name": "许昌市",
+    "ProID": 16,
+    "CitySort": 145,
+    "area": ["魏都区", "许昌县", "鄢陵县", "襄城县", "禹州市", "长葛市"]
+  }, {
+    "CityID": 146,
+    "name": "平顶山市",
+    "ProID": 16,
+    "CitySort": 146,
+    "area": ["新华区", "卫东区", "石龙区", "湛河区", "宝丰县", "叶县", "鲁山县", "郏县", "舞钢市", "汝州市"]
+  }, {
+    "CityID": 147,
+    "name": "信阳市",
+    "ProID": 16,
+    "CitySort": 147,
+    "area": ["浉河区", "平桥区", "罗山县", "光山县", "新县", "商城县", "固始县", "潢川县", "淮滨县", "息县"]
+  }, {
+    "CityID": 148,
+    "name": "南阳市",
+    "ProID": 16,
+    "CitySort": 148,
+    "area": ["宛城区", "卧龙区", "南召县", "方城县", "西峡县", "镇平县", "内乡县", "淅川县", "社旗县", "唐河县", "新野县", "桐柏县", "邓州市"]
+  }, {
+    "CityID": 149,
+    "name": "开封市",
+    "ProID": 16,
+    "CitySort": 149,
+    "area": ["龙亭区", "顺河回族区", "鼓楼区", "禹王台区", "金明区", "杞县", "通许县", "尉氏县", "开封县", "兰考县"]
+  }, {
+    "CityID": 150,
+    "name": "洛阳市",
+    "ProID": 16,
+    "CitySort": 150,
+    "area": ["老城区", "西工区", "瀍河回族区", "涧西区", "吉利区", "洛龙区", "孟津县", "新安县", "栾川县", "嵩县", "汝阳县", "宜阳县", "洛宁县", "伊川县", "偃师市"]
+  }, {
+    "CityID": 151,
+    "name": "济源市",
+    "ProID": 16,
+    "CitySort": 151,
+    "area": ['其他']
+  }, {
+    "CityID": 152,
+    "name": "焦作市",
+    "ProID": 16,
+    "CitySort": 152,
+    "area": ["解放区", "中站区", "马村区", "山阳区", "修武县", "博爱县", "武陟县", "温县", "沁阳市", "孟州市"]
+  }, {
+    "CityID": 153,
+    "name": "鹤壁市",
+    "ProID": 16,
+    "CitySort": 153,
+    "area": ["鹤山区", "山城区", "淇滨区", "浚县", "淇县"]
+  }, {
+    "CityID": 154,
+    "name": "濮阳市",
+    "ProID": 16,
+    "CitySort": 154,
+    "area": ["华龙区", "清丰县", "南乐县", "范县", "台前县", "濮阳县"]
+  }, {
+    "CityID": 155,
+    "name": "周口市",
+    "ProID": 16,
+    "CitySort": 155,
+    "area": ["川汇区", "扶沟县", "西华县", "商水县", "沈丘县", "郸城县", "淮阳县", "太康县", "鹿邑县", "项城市"]
+  }, {
+    "CityID": 156,
+    "name": "漯河市",
+    "ProID": 16,
+    "CitySort": 156,
+    "area": ["源汇区", "郾城区", "召陵区", "舞阳县", "临颍县"]
+  }, {
+    "CityID": 157,
+    "name": "驻马店市",
+    "ProID": 16,
+    "CitySort": 157,
+    "area": ["驿城区", "西平县", "上蔡县", "平舆县", "正阳县", "确山县", "泌阳县", "汝南县", "遂平县", "新蔡县"]
+  }, {
+    "CityID": 158,
+    "name": "三门峡市",
+    "ProID": 16,
+    "CitySort": 158,
+    "area": ["湖滨区", "渑池县", "陕县", "卢氏县", "义马市", "灵宝市"]
+  }]
+}, {
+  "ProID": 17,
+  "name": "湖北省",
+  "ProSort": 18,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 159,
+    "name": "武汉市",
+    "ProID": 17,
+    "CitySort": 159,
+    "area": ["江岸区", "江汉区", "硚口区", "汉阳区", "武昌区", "青山区", "洪山区", "东西湖区", "汉南区", "蔡甸区", "江夏区", "黄陂区", "新洲区"]
+  }, {
+    "CityID": 160,
+    "name": "襄阳市",
+    "ProID": 17,
+    "CitySort": 160,
+    "area": ["襄城区", "樊城区", "襄阳区", "南漳县", "谷城县", "保康县", "老河口市", "枣阳市", "宜城市"]
+  }, {
+    "CityID": 161,
+    "name": "鄂州市",
+    "ProID": 17,
+    "CitySort": 161,
+    "area": ["梁子湖区", "华容区", "鄂城区"]
+  }, {
+    "CityID": 162,
+    "name": "孝感市",
+    "ProID": 17,
+    "CitySort": 162,
+    "area": ["孝南区", "孝昌县", "大悟县", "云梦县", "应城市", "安陆市", "汉川市"]
+  }, {
+    "CityID": 163,
+    "name": "黄冈市",
+    "ProID": 17,
+    "CitySort": 163,
+    "area": ["黄州区", "团风县", "红安县", "罗田县", "英山县", "浠水县", "蕲春县", "黄梅县", "麻城市", "武穴市"]
+  }, {
+    "CityID": 164,
+    "name": "黄石市",
+    "ProID": 17,
+    "CitySort": 164,
+    "area": ["黄石港区", "西塞山区", "下陆区", "铁山区", "阳新县", "大冶市"]
+  }, {
+    "CityID": 165,
+    "name": "咸宁市",
+    "ProID": 17,
+    "CitySort": 165,
+    "area": ["咸安区", "嘉鱼县", "通城县", "崇阳县", "通山县", "赤壁市"]
+  }, {
+    "CityID": 166,
+    "name": "荆州市",
+    "ProID": 17,
+    "CitySort": 166,
+    "area": ["沙市区", "荆州区", "公安县", "监利县", "江陵县", "石首市", "洪湖市", "松滋市"]
+  }, {
+    "CityID": 167,
+    "name": "宜昌市",
+    "ProID": 17,
+    "CitySort": 167,
+    "area": ["西陵区", "伍家岗区", "点军区", "猇亭区", "夷陵区", "远安县", "兴山县", "秭归县", "长阳土家族自治县", "五峰土家族自治县", "宜都市", "当阳市", "枝江市"]
+  }, {
+    "CityID": 168,
+    "name": "恩施土家族苗族自治州",
+    "ProID": 17,
+    "CitySort": 168,
+    "area": ["恩施市", "利川市", "建始县", "巴东县", "宣恩县", "咸丰县", "来凤县", "鹤峰县"]
+  }, {
+    "CityID": 169,
+    "name": "神农架林区",
+    "ProID": 17,
+    "CitySort": 169,
+    "area": ['其他']
+  }, {
+    "CityID": 170,
+    "name": "十堰市",
+    "ProID": 17,
+    "CitySort": 170,
+    "area": ["茅箭区", "张湾区", "郧县", "郧西县", "竹山县", "竹溪县", "房县", "丹江口市"]
+  }, {
+    "CityID": 171,
+    "name": "随州市",
+    "ProID": 17,
+    "CitySort": 171,
+    "area": ["曾都区", "广水市"]
+  }, {
+    "CityID": 172,
+    "name": "荆门市",
+    "ProID": 17,
+    "CitySort": 172,
+    "area": ["东宝区", "掇刀区", "京山县", "沙洋县", "钟祥市"]
+  }, {
+    "CityID": 173,
+    "name": "仙桃市",
+    "ProID": 17,
+    "CitySort": 173,
+    "area": ['其他']
+  }, {
+    "CityID": 174,
+    "name": "天门市",
+    "ProID": 17,
+    "CitySort": 174,
+    "area": ['其他']
+  }, {
+    "CityID": 175,
+    "name": "潜江市",
+    "ProID": 17,
+    "CitySort": 175,
+    "area": ['其他']
+  }]
+}, {
+  "ProID": 18,
+  "name": "湖南省",
+  "ProSort": 19,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 176,
+    "name": "岳阳市",
+    "ProID": 18,
+    "CitySort": 176,
+    "area": ["岳阳楼区", "云溪区", "君山区", "岳阳县", "华容县", "湘阴县", "平江县", "汨罗市", "临湘市"]
+  }, {
+    "CityID": 177,
+    "name": "长沙市",
+    "ProID": 18,
+    "CitySort": 177,
+    "area": ["芙蓉区", "天心区", "岳麓区", "开福区", "雨花区", "长沙县", "望城县", "宁乡县", "浏阳市"]
+  }, {
+    "CityID": 178,
+    "name": "湘潭市",
+    "ProID": 18,
+    "CitySort": 178,
+    "area": ["雨湖区", "岳塘区", "湘潭县", "湘乡市", "韶山市"]
+  }, {
+    "CityID": 179,
+    "name": "株洲市",
+    "ProID": 18,
+    "CitySort": 179,
+    "area": ["荷塘区", "芦淞区", "石峰区", "天元区", "株洲县", "攸县", "茶陵县", "炎陵县", "醴陵市"]
+  }, {
+    "CityID": 180,
+    "name": "衡阳市",
+    "ProID": 18,
+    "CitySort": 180,
+    "area": ["珠晖区", "雁峰区", "石鼓区", "蒸湘区", "南岳区", "衡阳县", "衡南县", "衡山县", "衡东县", "祁东县", "耒阳市", "常宁市"]
+  }, {
+    "CityID": 181,
+    "name": "郴州市",
+    "ProID": 18,
+    "CitySort": 181,
+    "area": ["北湖区", "苏仙区", "桂阳县", "宜章县", "永兴县", "嘉禾县", "临武县", "汝城县", "桂东县", "安仁县", "资兴市"]
+  }, {
+    "CityID": 182,
+    "name": "常德市",
+    "ProID": 18,
+    "CitySort": 182,
+    "area": ["武陵区", "鼎城区", "安乡县", "汉寿县", "澧县", "临澧县", "桃源县", "石门县", "津市市"]
+  }, {
+    "CityID": 183,
+    "name": "益阳市",
+    "ProID": 18,
+    "CitySort": 183,
+    "area": ["资阳区", "赫山区", "南县", "桃江县", "安化县", "沅江市"]
+  }, {
+    "CityID": 184,
+    "name": "娄底市",
+    "ProID": 18,
+    "CitySort": 184,
+    "area": ["娄星区", "双峰县", "新化县", "冷水江市", "涟源市"]
+  }, {
+    "CityID": 185,
+    "name": "邵阳市",
+    "ProID": 18,
+    "CitySort": 185,
+    "area": ["双清区", "大祥区", "北塔区", "邵东县", "新邵县", "邵阳县", "隆回县", "洞口县", "绥宁县", "新宁县", "城步苗族自治县", "武冈市"]
+  }, {
+    "CityID": 186,
+    "name": "湘西土家族苗族自治州",
+    "ProID": 18,
+    "CitySort": 186,
+    "area": ["吉首市", "泸溪县", "凤凰县", "花垣县", "保靖县", "古丈县", "永顺县", "龙山县"]
+  }, {
+    "CityID": 187,
+    "name": "张家界市",
+    "ProID": 18,
+    "CitySort": 187,
+    "area": ["永定区", "武陵源区", "慈利县", "桑植县"]
+  }, {
+    "CityID": 188,
+    "name": "怀化市",
+    "ProID": 18,
+    "CitySort": 188,
+    "area": ["鹤城区", "中方县", "沅陵县", "辰溪县", "溆浦县", "会同县", "麻阳苗族自治县", "新晃侗族自治县", "芷江侗族自治县", "靖州苗族侗族自治县", "通道侗族自治县", "洪江市"]
+  }, {
+    "CityID": 189,
+    "name": "永州市",
+    "ProID": 18,
+    "CitySort": 189,
+    "area": ["零陵区", "冷水滩区", "祁阳县", "东安县", "双牌县", "道县", "江永县", "宁远县", "蓝山县", "新田县", "江华瑶族自治县"]
+  }]
+}, {
+  "ProID": 19,
+  "name": "广东省",
+  "ProSort": 20,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 190,
+    "name": "广州市",
+    "ProID": 19,
+    "CitySort": 190,
+    "area": ["从化市", "荔湾区", "越秀区", "海珠区", "天河区", "白云区", "花都区", "黄埔区", "萝岗区", "南沙区", "番禺区", "增城市"]
+  }, {
+    "CityID": 191,
+    "name": "汕尾市",
+    "ProID": 19,
+    "CitySort": 191,
+    "area": ["海丰县", "陆河县", "陆丰市"]
+  }, {
+    "CityID": 192,
+    "name": "阳江市",
+    "ProID": 19,
+    "CitySort": 192,
+    "area": ["江城区", "阳西县", "阳东县", "阳春市"]
+  }, {
+    "CityID": 193,
+    "name": "揭阳市",
+    "ProID": 19,
+    "CitySort": 193,
+    "area": ["榕城区", "揭东县", "揭西县", "惠来县", "普宁市"]
+  }, {
+    "CityID": 194,
+    "name": "茂名市",
+    "ProID": 19,
+    "CitySort": 194,
+    "area": ["茂南区", "茂港区", "电白县", "高州市", "化州市", "信宜市"]
+  }, {
+    "CityID": 195,
+    "name": "惠州市",
+    "ProID": 19,
+    "CitySort": 195,
+    "area": ["惠城区", "惠阳区", "博罗县", "惠东县", "龙门县"]
+  }, {
+    "CityID": 196,
+    "name": "江门市",
+    "ProID": 19,
+    "CitySort": 196,
+    "area": ["蓬江区", "江海区", "新会区", "台山市", "开平市", "鹤山市", "恩平市"]
+  }, {
+    "CityID": 197,
+    "name": "韶关市",
+    "ProID": 19,
+    "CitySort": 197,
+    "area": ["武江区", "浈江区", "曲江区", "始兴县", "仁化县", "翁源县", "乳源瑶族自治县", "新丰县", "乐昌市", "南雄市"]
+  }, {
+    "CityID": 198,
+    "name": "梅州市",
+    "ProID": 19,
+    "CitySort": 198,
+    "area": ["梅江区", "梅县", "大埔县", "丰顺县", "五华县", "平远县", "蕉岭县", "兴宁市"]
+  }, {
+    "CityID": 199,
+    "name": "汕头市",
+    "ProID": 19,
+    "CitySort": 199,
+    "area": ["龙湖区", "金平区", "濠江区", "潮阳区", "潮南区", "澄海区", "南澳县"]
+  }, {
+    "CityID": 200,
+    "name": "深圳市",
+    "ProID": 19,
+    "CitySort": 200,
+    "area": ["罗湖区", "福田区", "南山区", "宝安区", "龙岗区", "盐田区"]
+  }, {
+    "CityID": 201,
+    "name": "珠海市",
+    "ProID": 19,
+    "CitySort": 201,
+    "area": ["香洲区", "斗门区", "金湾区"]
+  }, {
+    "CityID": 202,
+    "name": "佛山市",
+    "ProID": 19,
+    "CitySort": 202,
+    "area": ["禅城区", "南海区", "顺德区", "三水区", "高明区"]
+  }, {
+    "CityID": 203,
+    "name": "肇庆市",
+    "ProID": 19,
+    "CitySort": 203,
+    "area": ["端州区", "鼎湖区", "广宁县", "怀集县", "封开县", "德庆县", "高要市", "四会市"]
+  }, {
+    "CityID": 204,
+    "name": "湛江市",
+    "ProID": 19,
+    "CitySort": 204,
+    "area": ["赤坎区", "霞山区", "坡头区", "麻章区", "遂溪县", "徐闻县", "廉江市", "雷州市", "吴川市"]
+  }, {
+    "CityID": 205,
+    "name": "中山市",
+    "ProID": 19,
+    "CitySort": 205,
+    "area": ['其他']
+  }, {
+    "CityID": 206,
+    "name": "河源市",
+    "ProID": 19,
+    "CitySort": 206,
+    "area": ["源城区", "紫金县", "龙川县", "连平县", "和平县", "东源县"]
+  }, {
+    "CityID": 207,
+    "name": "清远市",
+    "ProID": 19,
+    "CitySort": 207,
+    "area": ["清城区", "佛冈县", "阳山县", "连山壮族瑶族自治县", "连南瑶族自治县", "清新县", "英德市", "连州市"]
+  }, {
+    "CityID": 208,
+    "name": "云浮市",
+    "ProID": 19,
+    "CitySort": 208,
+    "area": ["云城区", "新兴县", "郁南县", "云安县", "罗定市"]
+  }, {
+    "CityID": 209,
+    "name": "潮州市",
+    "ProID": 19,
+    "CitySort": 209,
+    "area": ["湘桥区", "潮安县", "饶平县"]
+  }, {
+    "CityID": 210,
+    "name": "东莞市",
+    "ProID": 19,
+    "CitySort": 210,
+    "area": ['其他']
+  }]
+}, {
+  "ProID": 20,
+  "name": "海南省",
+  "ProSort": 24,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 255,
+    "name": "海口市",
+    "ProID": 20,
+    "CitySort": 255,
+    "area": ["秀英区", "龙华区", "琼山区", "美兰区"]
+  }, {
+    "CityID": 256,
+    "name": "三亚市",
+    "ProID": 20,
+    "CitySort": 256,
+    "area": ['其他']
+  }, {
+    "CityID": 257,
+    "name": "五指山市",
+    "ProID": 20,
+    "CitySort": 257,
+    "area": ['其他']
+  }, {
+    "CityID": 258,
+    "name": "琼海市",
+    "ProID": 20,
+    "CitySort": 258,
+    "area": ['其他']
+  }, {
+    "CityID": 259,
+    "name": "儋州市",
+    "ProID": 20,
+    "CitySort": 259,
+    "area": ['其他']
+  }, {
+    "CityID": 260,
+    "name": "文昌市",
+    "ProID": 20,
+    "CitySort": 260,
+    "area": ['其他']
+  }, {
+    "CityID": 261,
+    "name": "万宁市",
+    "ProID": 20,
+    "CitySort": 261,
+    "area": ['其他']
+  }, {
+    "CityID": 262,
+    "name": "东方市",
+    "ProID": 20,
+    "CitySort": 262,
+    "area": ['其他']
+  }, {
+    "CityID": 263,
+    "name": "澄迈县",
+    "ProID": 20,
+    "CitySort": 263,
+    "area": ['其他']
+  }, {
+    "CityID": 264,
+    "name": "定安县",
+    "ProID": 20,
+    "CitySort": 264,
+    "area": ['其他']
+  }, {
+    "CityID": 265,
+    "name": "屯昌县",
+    "ProID": 20,
+    "CitySort": 265,
+    "area": ['其他']
+  }, {
+    "CityID": 266,
+    "name": "临高县",
+    "ProID": 20,
+    "CitySort": 266,
+    "area": ['其他']
+  }, {
+    "CityID": 267,
+    "name": "白沙黎族自治县",
+    "ProID": 20,
+    "CitySort": 267,
+    "area": ['其他']
+  }, {
+    "CityID": 268,
+    "name": "昌江黎族自治县",
+    "ProID": 20,
+    "CitySort": 268,
+    "area": ['其他']
+  }, {
+    "CityID": 269,
+    "name": "乐东黎族自治县",
+    "ProID": 20,
+    "CitySort": 269,
+    "area": ['其他']
+  }, {
+    "CityID": 270,
+    "name": "陵水黎族自治县",
+    "ProID": 20,
+    "CitySort": 270,
+    "area": ['其他']
+  }, {
+    "CityID": 271,
+    "name": "保亭黎族苗族自治县",
+    "ProID": 20,
+    "CitySort": 271,
+    "area": ['其他']
+  }, {
+    "CityID": 272,
+    "name": "琼中黎族苗族自治县",
+    "ProID": 20,
+    "CitySort": 272,
+    "area": ['其他']
+  },{
+    "CityID": 272,
+    "name": "三沙市",
+    "ProID": 20,
+    "CitySort": 272,
+    "area": ['其他']
+  }]
+}, {
+  "ProID": 21,
+  "name": "广西壮族自治区",
+  "ProSort": 28,
+  "ProRemark": "自治区",
+  "city": [{
+    "CityID": 307,
+    "name": "防城港市",
+    "ProID": 21,
+    "CitySort": 307,
+    "area": ["港口区", "防城区", "上思县", "东兴市"]
+  }, {
+    "CityID": 308,
+    "name": "南宁市",
+    "ProID": 21,
+    "CitySort": 308,
+    "area": ["兴宁区", "青秀区", "江南区", "西乡塘区", "良庆区", "邕宁区", "武鸣县", "隆安县", "马山县", "上林县", "宾阳县", "横县"]
+  }, {
+    "CityID": 309,
+    "name": "崇左市",
+    "ProID": 21,
+    "CitySort": 309,
+    "area": ["江洲区", "扶绥县", "宁明县", "龙州县", "大新县", "天等县", "凭祥市"]
+  }, {
+    "CityID": 310,
+    "name": "来宾市",
+    "ProID": 21,
+    "CitySort": 310,
+    "area": ["兴宾区", "忻城县", "象州县", "武宣县", "金秀瑶族自治县", "合山市"]
+  }, {
+    "CityID": 311,
+    "name": "柳州市",
+    "ProID": 21,
+    "CitySort": 311,
+    "area": ["城中区", "鱼峰区", "柳南区", "柳北区", "柳江县", "柳城县", "鹿寨县", "融安县", "融水苗族自治县", "三江侗族自治县"]
+  }, {
+    "CityID": 312,
+    "name": "桂林市",
+    "ProID": 21,
+    "CitySort": 312,
+    "area": ["秀峰区", "叠彩区", "象山区", "七星区", "雁山区", "阳朔县", "临桂县", "灵川县", "全州县", "兴安县", "永福县", "灌阳县", "龙胜各族自治县", "资源县", "平乐县", "荔浦县", "恭城瑶族自治县"]
+  }, {
+    "CityID": 313,
+    "name": "梧州市",
+    "ProID": 21,
+    "CitySort": 313,
+    "area": ["万秀区", "碟山区", "长洲区", "苍梧县", "藤县", "蒙山县", "岑溪市"]
+  }, {
+    "CityID": 314,
+    "name": "贺州市",
+    "ProID": 21,
+    "CitySort": 314,
+    "area": ["八步区", "昭平县", "钟山县", "富川瑶族自治县"]
+  }, {
+    "CityID": 315,
+    "name": "贵港市",
+    "ProID": 21,
+    "CitySort": 315,
+    "area": ["港北区", "港南区", "覃塘区", "平南县", "桂平市"]
+  }, {
+    "CityID": 316,
+    "name": "玉林市",
+    "ProID": 21,
+    "CitySort": 316,
+    "area": ["玉州区", "容县", "陆川县", "博白县", "兴业县", "北流市"]
+  }, {
+    "CityID": 317,
+    "name": "百色市",
+    "ProID": 21,
+    "CitySort": 317,
+    "area": ["右江区", "田阳县", "田东县", "平果县", "德保县", "靖西县", "那坡县", "凌云县", "乐业县", "田林县", "西林县", "隆林各族自治县"]
+  }, {
+    "CityID": 318,
+    "name": "钦州市",
+    "ProID": 21,
+    "CitySort": 318,
+    "area": ["钦南区", "钦北区", "灵山县", "浦北县"]
+  }, {
+    "CityID": 319,
+    "name": "河池市",
+    "ProID": 21,
+    "CitySort": 319,
+    "area": ["金城江区", "南丹县", "天峨县", "凤山县", "东兰县", "罗城仫佬族自治县", "环江毛南族自治县", "巴马瑶族自治县", "都安瑶族自治县", "大化瑶族自治县", "宜州市"]
+  }, {
+    "CityID": 320,
+    "name": "北海市",
+    "ProID": 21,
+    "CitySort": 320,
+    "area": ["海城区", "银海区", "铁山港区", "合浦县"]
+  }]
+}, {
+  "ProID": 22,
+  "name": "甘肃省",
+  "ProSort": 21,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 211,
+    "name": "兰州市",
+    "ProID": 22,
+    "CitySort": 211,
+    "area": ["城关区", "七里河区", "西固区", "安宁区", "红古区", "永登县", "皋兰县", "榆中县"]
+  }, {
+    "CityID": 212,
+    "name": "金昌市",
+    "ProID": 22,
+    "CitySort": 212,
+    "area": ["金川区", "永昌县"]
+  }, {
+    "CityID": 213,
+    "name": "白银市",
+    "ProID": 22,
+    "CitySort": 213,
+    "area": ["白银区", "平川区", "靖远县", "会宁县", "景泰县"]
+  }, {
+    "CityID": 214,
+    "name": "天水市",
+    "ProID": 22,
+    "CitySort": 214,
+    "area": ["秦州区", "麦积区", "清水县", "秦安县", "甘谷县", "武山县", "张家川回族自治县"]
+  }, {
+    "CityID": 215,
+    "name": "嘉峪关市",
+    "ProID": 22,
+    "CitySort": 215,
+    "area": ['其他']
+  }, {
+    "CityID": 216,
+    "name": "武威市",
+    "ProID": 22,
+    "CitySort": 216,
+    "area": ["凉州区", "民勤县", "古浪县", "天祝藏族自治县"]
+  }, {
+    "CityID": 217,
+    "name": "张掖市",
+    "ProID": 22,
+    "CitySort": 217,
+    "area": ["甘州区", "肃南裕固族自治县", "民乐县", "临泽县", "高台县", "山丹县"]
+  }, {
+    "CityID": 218,
+    "name": "平凉市",
+    "ProID": 22,
+    "CitySort": 218,
+    "area": ["崆峒区", "泾川县", "灵台县", "崇信县", "华亭县", "庄浪县", "静宁县"]
+  }, {
+    "CityID": 219,
+    "name": "酒泉市",
+    "ProID": 22,
+    "CitySort": 219,
+    "area": ["肃州区", "金塔县", "瓜州县", "肃北蒙古族自治县", "阿克塞哈萨克族自治县", "玉门市", "敦煌市"]
+  }, {
+    "CityID": 220,
+    "name": "庆阳市",
+    "ProID": 22,
+    "CitySort": 220,
+    "area": ["西峰区", "庆城县", "环县", "华池县", "合水县", "正宁县", "宁县", "镇原县"]
+  }, {
+    "CityID": 221,
+    "name": "定西市",
+    "ProID": 22,
+    "CitySort": 221,
+    "area": ["安定区", "通渭县", "陇西县", "渭源县", "临洮县", "漳县", "岷县"]
+  }, {
+    "CityID": 222,
+    "name": "陇南市",
+    "ProID": 22,
+    "CitySort": 222,
+    "area": ["武都区", "成县", "文县", "宕昌县", "康县", "西和县", "礼县", "徽县", "两当县"]
+  }, {
+    "CityID": 223,
+    "name": "临夏回族自治州",
+    "ProID": 22,
+    "CitySort": 223,
+    "area": ["临夏市", "临夏县", "康乐县", "永靖县", "广河县", "和政县", "东乡族自治县", "积石山保安族东乡族撒拉族自治县"]
+  }, {
+    "CityID": 224,
+    "name": "甘南藏族自治州",
+    "ProID": 22,
+    "CitySort": 224,
+    "area": ["合作市", "临潭县", "卓尼县", "舟曲县", "迭部县", "玛曲县", "碌曲县", "夏河县"]
+  }]
+}, {
+  "ProID": 23,
+  "name": "陕西省",
+  "ProSort": 27,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 297,
+    "name": "西安市",
+    "ProID": 23,
+    "CitySort": 297,
+    "area": ["新城区", "碑林区", "莲湖区", "灞桥区", "未央区", "雁塔区", "阎良区", "临潼区", "长安区", "蓝田县", "周至县", "户县", "高陵县"]
+  }, {
+    "CityID": 298,
+    "name": "咸阳市",
+    "ProID": 23,
+    "CitySort": 298,
+    "area": ["秦都区", "杨陵区", "渭城区", "三原县", "泾阳县", "乾县", "礼泉县", "永寿县", "彬县", "长武县", "旬邑县", "淳化县", "武功县", "兴平市"]
+  }, {
+    "CityID": 299,
+    "name": "延安市",
+    "ProID": 23,
+    "CitySort": 299,
+    "area": ["宝塔区", "延长县", "延川县", "子长县", "安塞县", "志丹县", "吴起县", "甘泉县", "富县", "洛川县", "宜川县", "黄龙县", "黄陵县"]
+  }, {
+    "CityID": 300,
+    "name": "榆林市",
+    "ProID": 23,
+    "CitySort": 300,
+    "area": ["榆阳区", "神木县", "府谷县", "横山县", "靖边县", "定边县", "绥德县", "米脂县", "佳县", "吴堡县", "清涧县", "子洲县"]
+  }, {
+    "CityID": 301,
+    "name": "渭南市",
+    "ProID": 23,
+    "CitySort": 301,
+    "area": ["临渭区", "华县", "潼关县", "大荔县", "合阳县", "澄城县", "蒲城县", "白水县", "富平县", "韩城市", "华阴市"]
+  }, {
+    "CityID": 302,
+    "name": "商洛市",
+    "ProID": 23,
+    "CitySort": 302,
+    "area": ["商州区", "洛南县", "丹凤县", "商南县", "山阳县", "镇安县", "柞水县"]
+  }, {
+    "CityID": 303,
+    "name": "安康市",
+    "ProID": 23,
+    "CitySort": 303,
+    "area": ["汉滨区", "汉阴县", "石泉县", "宁陕县", "紫阳县", "岚皋县", "平利县", "镇坪县", "旬阳县", "白河县"]
+  }, {
+    "CityID": 304,
+    "name": "汉中市",
+    "ProID": 23,
+    "CitySort": 304,
+    "area": ["汉台区", "南郑县", "城固县", "洋县", "西乡县", "勉县", "宁强县", "略阳县", "镇巴县", "留坝县", "佛坪县"]
+  }, {
+    "CityID": 305,
+    "name": "宝鸡市",
+    "ProID": 23,
+    "CitySort": 305,
+    "area": ["渭滨区", "金台区", "陈仓区", "凤翔县", "岐山县", "扶风县", "眉县", "陇县", "千阳县", "麟游县", "凤县", "太白县"]
+  }, {
+    "CityID": 306,
+    "name": "铜川市",
+    "ProID": 23,
+    "CitySort": 306,
+    "area": ["王益区", "印台区", "耀州区", "宜君县"]
+  }]
+}, {
+  "ProID": 24,
+  "name": "新疆维吾尔自治区",
+  "ProSort": 31,
+  "ProRemark": "自治区",
+  "city": [{
+    "CityID": 333,
+    "name": "塔城地区",
+    "ProID": 24,
+    "CitySort": 333,
+    "area": ["塔城市", "乌苏市", "额敏县", "沙湾县", "托里县", "裕民县", "和布克赛尔蒙古自治县"]
+  }, {
+    "CityID": 334,
+    "name": "哈密地区",
+    "ProID": 24,
+    "CitySort": 334,
+    "area": ["哈密市", "巴里坤哈萨克自治县", "伊吾县"]
+  }, {
+    "CityID": 335,
+    "name": "和田地区",
+    "ProID": 24,
+    "CitySort": 335,
+    "area": ["和田市", "和田县", "墨玉县", "皮山县", "洛浦县", "策勒县", "于田县", "民丰县"]
+  }, {
+    "CityID": 336,
+    "name": "阿勒泰地区",
+    "ProID": 24,
+    "CitySort": 336,
+    "area": ["阿勒泰市", "布尔津县", "富蕴县", "福海县", "哈巴河县", "青河县", "吉木乃县"]
+  }, {
+    "CityID": 337,
+    "name": "克孜勒苏柯尔克孜自治州",
+    "ProID": 24,
+    "CitySort": 337,
+    "area": ["阿图什市", "阿克陶县", "阿合奇县", "乌恰县"]
+  }, {
+    "CityID": 338,
+    "name": "博尔塔拉蒙古自治州",
+    "ProID": 24,
+    "CitySort": 338,
+    "area": ["博乐市", "精河县", "温泉县"]
+  }, {
+    "CityID": 339,
+    "name": "克拉玛依市",
+    "ProID": 24,
+    "CitySort": 339,
+    "area": ["独山子区", "克拉玛依区", "白碱滩区", "乌尔禾区"]
+  }, {
+    "CityID": 340,
+    "name": "乌鲁木齐市",
+    "ProID": 24,
+    "CitySort": 340,
+    "area": ["天山区", "沙依巴克区", "新市区", "水磨沟区", "头屯河区", "达坂城区", "米东区", "乌鲁木齐县"]
+  }, {
+    "CityID": 341,
+    "name": "石河子市",
+    "ProID": 24,
+    "CitySort": 341,
+    "area": ['其他']
+  }, {
+    "CityID": 342,
+    "name": "昌吉回族自治州",
+    "ProID": 24,
+    "CitySort": 342,
+    "area": ["昌吉市", "阜康市", "呼图壁县", "玛纳斯县", "奇台县", "吉木萨尔县", "木垒哈萨克自治县"]
+  }, {
+    "CityID": 343,
+    "name": "五家渠市",
+    "ProID": 24,
+    "CitySort": 343,
+    "area": ['其他']
+  }, {
+    "CityID": 344,
+    "name": "吐鲁番市",
+    "ProID": 24,
+    "CitySort": 344,
+    "area": ["吐鲁番市", "鄯善县", "托克逊县"]
+  }, {
+    "CityID": 345,
+    "name": "巴音郭楞蒙古自治州",
+    "ProID": 24,
+    "CitySort": 345,
+    "area": ["库尔勒市", "轮台县", "尉犁县", "若羌县", "且末县", "焉耆回族自治县", "和静县", "和硕县", "博湖县"]
+  }, {
+    "CityID": 346,
+    "name": "阿克苏地区",
+    "ProID": 24,
+    "CitySort": 346,
+    "area": ["阿克苏市", "温宿县", "库车县", "沙雅县", "新和县", "拜城县", "乌什县", "阿瓦提县", "柯坪县"]
+  }, {
+    "CityID": 347,
+    "name": "阿拉尔市",
+    "ProID": 24,
+    "CitySort": 347,
+    "area": ['其他']
+  }, {
+    "CityID": 348,
+    "name": "喀什地区",
+    "ProID": 24,
+    "CitySort": 348,
+    "area": ["喀什市", "疏附县", "疏勒县", "英吉沙县", "泽普县", "莎车县", "叶城县", "麦盖提县", "岳普湖县", "伽师县", "巴楚县", "塔什库尔干塔吉克自治县"]
+  }, {
+    "CityID": 349,
+    "name": "图木舒克市",
+    "ProID": 24,
+    "CitySort": 349,
+    "area": ['其他']
+  }, {
+    "CityID": 350,
+    "name": "伊犁哈萨克自治州",
+    "ProID": 24,
+    "CitySort": 350,
+    "area": ["伊宁市", "奎屯市", "伊宁县", "察布查尔锡伯自治县", "霍城县", "巩留县", "新源县", "昭苏县", "特克斯县", "尼勒克县"]
+  }]
+}, {
+  "ProID": 25,
+  "name": "青海省",
+  "ProSort": 26,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 289,
+    "name": "海北藏族自治州",
+    "ProID": 25,
+    "CitySort": 289,
+    "area": ["门源回族自治县", "祁连县", "海晏县", "刚察县"]
+  }, {
+    "CityID": 290,
+    "name": "西宁市",
+    "ProID": 25,
+    "CitySort": 290,
+    "area": ["城东区", "城中区", "城西区", "城北区", "大通回族土族自治县", "湟中县", "湟源县"]
+  }, {
+    "CityID": 291,
+    "name": "海东市",
+    "ProID": 25,
+    "CitySort": 291,
+    "area": ["平安县", "民和回族土族自治县", "乐都县", "互助土族自治县", "化隆回族自治县", "循化撒拉族自治县"]
+  }, {
+    "CityID": 292,
+    "name": "黄南藏族自治州",
+    "ProID": 25,
+    "CitySort": 292,
+    "area": ["同仁县", "尖扎县", "泽库县", "河南蒙古族自治县"]
+  }, {
+    "CityID": 293,
+    "name": "海南藏族自治州",
+    "ProID": 25,
+    "CitySort": 293,
+    "area": ["共和县", "同德县", "贵德县", "兴海县", "贵南县"]
+  }, {
+    "CityID": 294,
+    "name": "果洛藏族自治州",
+    "ProID": 25,
+    "CitySort": 294,
+    "area": ["玛沁县", "班玛县", "甘德县", "达日县", "久治县", "玛多县"]
+  }, {
+    "CityID": 295,
+    "name": "玉树藏族自治州",
+    "ProID": 25,
+    "CitySort": 295,
+    "area": ["玉树县", "杂多县", "称多县", "治多县", "囊谦县", "曲麻莱县"]
+  }, {
+    "CityID": 296,
+    "name": "海西蒙古族藏族自治州",
+    "ProID": 25,
+    "CitySort": 296,
+    "area": ["格尔木市", "德令哈市", "乌兰县", "都兰县", "天峻县"]
+  }]
+}, {
+  "ProID": 26,
+  "name": "宁夏回族自治区",
+  "ProSort": 30,
+  "ProRemark": "自治区",
+  "city": [{
+    "CityID": 328,
+    "name": "银川市",
+    "ProID": 26,
+    "CitySort": 328,
+    "area": ["兴庆区", "西夏区", "金凤区", "永宁县", "贺兰县", "灵武市"]
+  }, {
+    "CityID": 329,
+    "name": "石嘴山市",
+    "ProID": 26,
+    "CitySort": 329,
+    "area": ["大武口区", "惠农区", "平罗县"]
+  }, {
+    "CityID": 330,
+    "name": "吴忠市",
+    "ProID": 26,
+    "CitySort": 330,
+    "area": ["利通区", "盐池县", "同心县", "青铜峡市"]
+  }, {
+    "CityID": 331,
+    "name": "固原市",
+    "ProID": 26,
+    "CitySort": 331,
+    "area": ["原州区", "西吉县", "隆德县", "泾源县", "彭阳县"]
+  }, {
+    "CityID": 332,
+    "name": "中卫市",
+    "ProID": 26,
+    "CitySort": 332,
+    "area": ["沙坡头区", "中宁县", "海原县"]
+  }]
+}, {
+  "ProID": 27,
+  "name": "重庆市",
+  "ProSort": 4,
+  "ProRemark": "直辖市",
+  "city": [{
+    "CityID": 4,
+    "name": "重庆市",
+    "ProID": 27,
+    "CitySort": 4,
+    "area": ["万州区", "涪陵区", "渝中区", "大渡口区", "江北区", "沙坪坝区", "九龙坡区", "南岸区", "北碚区", "万盛区", "双桥区", "渝北区", "巴南区", "黔江区", "长寿区", "江津区", "合川区", "永川区", "南川区", "綦江县", "潼南县", "铜梁县", "大足县", "荣昌县", "璧山县", "梁平县", "城口县", "丰都县", "垫江县", "武隆县", "忠县", "开县", "云阳县", "奉节县", "巫山县", "巫溪县", "石柱土家族自治县", "秀山土家族苗族自治县", "酉阳土家族苗族自治县", "彭水苗族土家族自治县"]
+  }]
+}, {
+  "ProID": 28,
+  "name": "四川省",
+  "ProSort": 22,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 225,
+    "name": "成都市",
+    "ProID": 28,
+    "CitySort": 225,
+    "area": ["锦江区", "青羊区", "金牛区", "武侯区", "成华区", "龙泉驿区", "青白江区", "新都区", "温江区", "金堂县", "双流县", "郫县", "大邑县", "蒲江县", "新津县", "都江堰市", "彭州市", "邛崃市", "崇州市"]
+  }, {
+    "CityID": 226,
+    "name": "攀枝花市",
+    "ProID": 28,
+    "CitySort": 226,
+    "area": ["东区", "西区", "仁和区", "米易县", "盐边县"]
+  }, {
+    "CityID": 227,
+    "name": "自贡市",
+    "ProID": 28,
+    "CitySort": 227,
+    "area": ["自流井区", "贡井区", "大安区", "沿滩区", "荣县", "富顺县"]
+  }, {
+    "CityID": 228,
+    "name": "绵阳市",
+    "ProID": 28,
+    "CitySort": 228,
+    "area": ["涪城区", "游仙区", "三台县", "盐亭县", "安县", "梓潼县", "北川羌族自治县", "平武县", "江油市"]
+  }, {
+    "CityID": 229,
+    "name": "南充市",
+    "ProID": 28,
+    "CitySort": 229,
+    "area": ["顺庆区", "高坪区", "嘉陵区", "南部县", "营山县", "蓬安县", "仪陇县", "西充县", "阆中市"]
+  }, {
+    "CityID": 230,
+    "name": "达州市",
+    "ProID": 28,
+    "CitySort": 230,
+    "area": ["通川区", "达县", "宣汉县", "开江县", "大竹县", "渠县", "万源市"]
+  }, {
+    "CityID": 231,
+    "name": "遂宁市",
+    "ProID": 28,
+    "CitySort": 231,
+    "area": ["船山区", "安居区", "蓬溪县", "射洪县", "大英县"]
+  }, {
+    "CityID": 232,
+    "name": "广安市",
+    "ProID": 28,
+    "CitySort": 232,
+    "area": ["广安区", "岳池县", "武胜县", "邻水县", "华蓥市"]
+  }, {
+    "CityID": 233,
+    "name": "巴中市",
+    "ProID": 28,
+    "CitySort": 233,
+    "area": ["巴州区", "通江县", "南江县", "平昌县"]
+  }, {
+    "CityID": 234,
+    "name": "泸州市",
+    "ProID": 28,
+    "CitySort": 234,
+    "area": ["江阳区", "纳溪区", "龙马潭区", "泸县", "合江县", "叙永县", "古蔺县"]
+  }, {
+    "CityID": 235,
+    "name": "宜宾市",
+    "ProID": 28,
+    "CitySort": 235,
+    "area": ["翠屏区", "宜宾县", "南溪县", "江安县", "长宁县", "高县", "珙县", "筠连县", "兴文县", "屏山县"]
+  }, {
+    "CityID": 236,
+    "name": "资阳市",
+    "ProID": 28,
+    "CitySort": 236,
+    "area": ["雁江区", "安岳县", "乐至县", "简阳市"]
+  }, {
+    "CityID": 237,
+    "name": "内江市",
+    "ProID": 28,
+    "CitySort": 237,
+    "area": ["市中区", "东兴区", "威远县", "资中县", "隆昌县"]
+  }, {
+    "CityID": 238,
+    "name": "乐山市",
+    "ProID": 28,
+    "CitySort": 238,
+    "area": ["市中区", "沙湾区", "五通桥区", "金口河区", "犍为县", "井研县", "夹江县", "沐川县", "峨边彝族自治县", "马边彝族自治县", "峨眉山市"]
+  }, {
+    "CityID": 239,
+    "name": "眉山市",
+    "ProID": 28,
+    "CitySort": 239,
+    "area": ["东坡区", "仁寿县", "彭山县", "洪雅县", "丹棱县", "青神县"]
+  }, {
+    "CityID": 240,
+    "name": "凉山彝族自治州",
+    "ProID": 28,
+    "CitySort": 240,
+    "area": ["西昌市", "木里藏族自治县", "盐源县", "德昌县", "会理县", "会东县", "宁南县", "普格县", "布拖县", "金阳县", "昭觉县", "喜德县", "冕宁县", "越西县", "甘洛县", "美姑县", "雷波县"]
+  }, {
+    "CityID": 241,
+    "name": "雅安市",
+    "ProID": 28,
+    "CitySort": 241,
+    "area": ["雨城区", "名山县", "荥经县", "汉源县", "石棉县", "天全县", "芦山县", "宝兴县"]
+  }, {
+    "CityID": 242,
+    "name": "甘孜藏族自治州",
+    "ProID": 28,
+    "CitySort": 242,
+    "area": ["康定县", "泸定县", "丹巴县", "九龙县", "雅江县", "道孚县", "炉霍县", "甘孜县", "新龙县", "德格县", "白玉县", "石渠县", "色达县", "理塘县", "巴塘县", "乡城县", "稻城县", "得荣县"]
+  }, {
+    "CityID": 243,
+    "name": "阿坝藏族羌族自治州",
+    "ProID": 28,
+    "CitySort": 243,
+    "area": ["汶川县", "理县", "茂县", "松潘县", "九寨沟县", "金川县", "小金县", "黑水县", "马尔康县", "壤塘县", "阿坝县", "若尔盖县", "红原县"]
+  }, {
+    "CityID": 244,
+    "name": "德阳市",
+    "ProID": 28,
+    "CitySort": 244,
+    "area": ["旌阳区", "中江县", "罗江县", "广汉市", "什邡市", "绵竹市"]
+  }, {
+    "CityID": 245,
+    "name": "广元市",
+    "ProID": 28,
+    "CitySort": 245,
+    "area": ["市中区", "元坝区", "朝天区", "旺苍县", "青川县", "剑阁县", "苍溪县"]
+  }]
+}, {
+  "ProID": 29,
+  "name": "贵州省",
+  "ProSort": 23,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 246,
+    "name": "贵阳市",
+    "ProID": 29,
+    "CitySort": 246,
+    "area": ["南明区", "云岩区", "花溪区", "乌当区", "白云区", "小河区", "开阳县", "息烽县", "修文县", "清镇市"]
+  }, {
+    "CityID": 247,
+    "name": "遵义市",
+    "ProID": 29,
+    "CitySort": 247,
+    "area": ["红花岗区", "汇川区", "遵义县", "桐梓县", "绥阳县", "正安县", "道真仡佬族苗族自治县", "务川仡佬族苗族自治县", "凤冈县", "湄潭县", "余庆县", "习水县", "赤水市", "仁怀市"]
+  }, {
+    "CityID": 248,
+    "name": "安顺市",
+    "ProID": 29,
+    "CitySort": 248,
+    "area": ["西秀区", "平坝县", "普定县", "镇宁布依族苗族自治县", "关岭布依族苗族自治县", "紫云苗族布依族自治县"]
+  }, {
+    "CityID": 249,
+    "name": "黔南布依族苗族自治州",
+    "ProID": 29,
+    "CitySort": 249,
+    "area": ["都匀市", "福泉市", "荔波县", "贵定县", "瓮安县", "独山县", "平塘县", "罗甸县", "长顺县", "龙里县", "惠水县", "三都水族自治县"]
+  }, {
+    "CityID": 250,
+    "name": "黔东南苗族侗族自治州",
+    "ProID": 29,
+    "CitySort": 250,
+    "area": ["凯里市", "黄平县", "施秉县", "三穗县", "镇远县", "岑巩县", "天柱县", "锦屏县", "剑河县", "台江县", "黎平县", "榕江县", "从江县", "雷山县", "麻江县", "丹寨县"]
+  }, {
+    "CityID": 251,
+    "name": "铜仁市",
+    "ProID": 29,
+    "CitySort": 251,
+    "area": ["铜仁市", "江口县", "玉屏侗族自治县", "石阡县", "思南县", "印江土家族苗族自治县", "德江县", "沿河土家族自治县", "松桃苗族自治县", "万山特区"]
+  }, {
+    "CityID": 252,
+    "name": "毕节市",
+    "ProID": 29,
+    "CitySort": 252,
+    "area": ["毕节市", "大方县", "黔西县", "金沙县", "织金县", "纳雍县", "威宁彝族回族苗族自治县", "赫章县"]
+  }, {
+    "CityID": 253,
+    "name": "六盘水市",
+    "ProID": 29,
+    "CitySort": 253,
+    "area": ["钟山区", "六枝特区", "水城县", "盘县"]
+  }, {
+    "CityID": 254,
+    "name": "黔西南布依族苗族自治州",
+    "ProID": 29,
+    "CitySort": 254,
+    "area": ["兴义市", "兴仁县", "普安县", "晴隆县", "贞丰县", "望谟县", "册亨县", "安龙县"]
+  }]
+}, {
+  "ProID": 30,
+  "name": "云南省",
+  "ProSort": 25,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 273,
+    "name": "西双版纳傣族自治州",
+    "ProID": 30,
+    "CitySort": 273,
+    "area": ["景洪市", "勐海县", "勐腊县"]
+  }, {
+    "CityID": 274,
+    "name": "德宏傣族景颇族自治州",
+    "ProID": 30,
+    "CitySort": 274,
+    "area": ["瑞丽市", "潞西市", "梁河县", "盈江县", "陇川县"]
+  }, {
+    "CityID": 275,
+    "name": "昭通市",
+    "ProID": 30,
+    "CitySort": 275,
+    "area": ["昭阳区", "鲁甸县", "巧家县", "盐津县", "大关县", "永善县", "绥江县", "镇雄县", "彝良县", "威信县", "水富县"]
+  }, {
+    "CityID": 276,
+    "name": "昆明市",
+    "ProID": 30,
+    "CitySort": 276,
+    "area": ["五华区", "盘龙区", "官渡区", "西山区", "东川区", "呈贡县", "晋宁县", "富民县", "宜良县", "石林彝族自治县", "嵩明县", "禄劝彝族苗族自治县", "寻甸回族彝族自治县", "安宁市"]
+  }, {
+    "CityID": 277,
+    "name": "大理白族自治州",
+    "ProID": 30,
+    "CitySort": 277,
+    "area": ["大理市", "漾濞彝族自治县", "祥云县", "宾川县", "弥渡县", "南涧彝族自治县", "巍山彝族回族自治县", "永平县", "云龙县", "洱源县", "剑川县", "鹤庆县"]
+  }, {
+    "CityID": 278,
+    "name": "红河哈尼族彝族自治州",
+    "ProID": 30,
+    "CitySort": 278,
+    "area": ["个旧市", "开远市", "蒙自县", "屏边苗族自治县", "建水县", "石屏县", "弥勒县", "泸西县", "元阳县", "红河县", "金平苗族瑶族傣族自治县", "绿春县", "河口瑶族自治县"]
+  }, {
+    "CityID": 279,
+    "name": "曲靖市",
+    "ProID": 30,
+    "CitySort": 279,
+    "area": ["麒麟区", "马龙县", "陆良县", "师宗县", "罗平县", "富源县", "会泽县", "沾益县", "宣威市"]
+  }, {
+    "CityID": 280,
+    "name": "保山市",
+    "ProID": 30,
+    "CitySort": 280,
+    "area": ["隆阳区", "施甸县", "腾冲县", "龙陵县", "昌宁县"]
+  }, {
+    "CityID": 281,
+    "name": "文山壮族苗族自治州",
+    "ProID": 30,
+    "CitySort": 281,
+    "area": ["文山县", "砚山县", "西畴县", "麻栗坡县", "马关县", "丘北县", "广南县", "富宁县"]
+  }, {
+    "CityID": 282,
+    "name": "玉溪市",
+    "ProID": 30,
+    "CitySort": 282,
+    "area": ["红塔区", "江川县", "澄江县", "通海县", "华宁县", "易门县", "峨山彝族自治县", "新平彝族傣族自治县", "元江哈尼族彝族傣族自治县"]
+  }, {
+    "CityID": 283,
+    "name": "楚雄彝族自治州",
+    "ProID": 30,
+    "CitySort": 283,
+    "area": ["楚雄市", "双柏县", "牟定县", "南华县", "姚安县", "大姚县", "永仁县", "元谋县", "武定县", "禄丰县"]
+  }, {
+    "CityID": 284,
+    "name": "普洱市",
+    "ProID": 30,
+    "CitySort": 284,
+    "area": ["思茅区", "宁洱哈尼族彝族自治县", "墨江哈尼族自治县", "景东彝族自治县", "景谷傣族彝族自治县", "镇沅彝族哈尼族拉祜族自治县", "江城哈尼族彝族自治县", "孟连傣族拉祜族佤族自治县", "澜沧拉祜族自治县", "西盟佤族自治县"]
+  }, {
+    "CityID": 285,
+    "name": "临沧市",
+    "ProID": 30,
+    "CitySort": 285,
+    "area": ["临翔区", "凤庆县", "云县", "永德县", "镇康县", "双江拉祜族佤族布朗族傣族自治县", "耿马傣族佤族自治县", "沧源佤族自治县"]
+  }, {
+    "CityID": 286,
+    "name": "怒江傈僳族自治州",
+    "ProID": 30,
+    "CitySort": 286,
+    "area": ["泸水县", "福贡县", "贡山独龙族怒族自治县", "兰坪白族普米族自治县"]
+  }, {
+    "CityID": 287,
+    "name": "迪庆藏族自治州",
+    "ProID": 30,
+    "CitySort": 287,
+    "area": ["香格里拉县", "德钦县", "维西傈僳族自治县"]
+  }, {
+    "CityID": 288,
+    "name": "丽江市",
+    "ProID": 30,
+    "CitySort": 288,
+    "area": ["古城区", "玉龙纳西族自治县", "永胜县", "华坪县", "宁蒗彝族自治县"]
+  }]
+}, {
+  "ProID": 31,
+  "name": "西藏自治区",
+  "ProSort": 29,
+  "ProRemark": "自治区",
+  "city": [{
+    "CityID": 321,
+    "name": "拉萨市",
+    "ProID": 31,
+    "CitySort": 321,
+    "area": ["城关区", "林周县", "当雄县", "尼木县", "曲水县", "堆龙德庆县", "达孜县", "墨竹工卡县"]
+  }, {
+    "CityID": 322,
+    "name": "日喀则市",
+    "ProID": 31,
+    "CitySort": 322,
+    "area": ["日喀则市", "南木林县", "江孜县", "定日县", "萨迦县", "拉孜县", "昂仁县", "谢通门县", "白朗县", "仁布县", "康马县", "定结县", "仲巴县", "亚东县", "吉隆县", "聂拉木县", "萨嘎县", "岗巴县"]
+  }, {
+    "CityID": 323,
+    "name": "山南市",
+    "ProID": 31,
+    "CitySort": 323,
+    "area": ["乃东县", "扎囊县", "贡嘎县", "桑日县", "琼结县", "曲松县", "措美县", "洛扎县", "加查县", "隆子县", "错那县", "浪卡子县"]
+  }, {
+    "CityID": 324,
+    "name": "林芝市",
+    "ProID": 31,
+    "CitySort": 324,
+    "area": ["林芝县", "工布江达县", "米林县", "墨脱县", "波密县", "察隅县", "朗县"]
+  }, {
+    "CityID": 325,
+    "name": "昌都市",
+    "ProID": 31,
+    "CitySort": 325,
+    "area": ["昌都县", "江达县", "贡觉县", "类乌齐县", "丁青县", "察雅县", "八宿县", "左贡县", "芒康县", "洛隆县", "边坝县"]
+  }, {
+    "CityID": 326,
+    "name": "那曲地区",
+    "ProID": 31,
+    "CitySort": 326,
+    "area": ["那曲县", "嘉黎县", "比如县", "聂荣县", "安多县", "申扎县", "索县", "班戈县", "巴青县", "尼玛县"]
+  }, {
+    "CityID": 327,
+    "name": "阿里地区",
+    "ProID": 31,
+    "CitySort": 327,
+    "area": ["普兰县", "札达县", "噶尔县", "日土县", "革吉县", "改则县", "措勤县"]
+  }]
+}, {
+  "ProID": 32,
+  "name": "台湾省",
+  "ProSort": 7,
+  "ProRemark": "省份",
+  "city": [{
+    "CityID": 327,
+    "name": "台湾",
+    "ProID": 31,
+    "CitySort": 327,
+    "area": ["台北市","高雄市","台北县","桃园县","新竹县","苗栗县","台中县","彰化县","南投县","云林县","嘉义县","台南县","高雄县","屏东县","宜兰县","花莲县","台东县","澎湖县","基隆市","新竹市","台中市","嘉义市","台南市","其他"]
+  }]
+}, {
+  "ProID": 33,
+  "name": "澳门特别行政区",
+  "ProSort": 33,
+  "ProRemark": "特别行政区",
+  "city": [{
+    "CityID": 370,
+    "name": "澳门",
+    "ProID": 33,
+    "CitySort": 370,
+    "area": ["花地玛堂区","圣安多尼堂区","大堂区","望德堂区","风顺堂区","嘉模堂区","圣方济各堂区","路凼","其他"]
+  }]
+}, {
+  "ProID": 34,
+  "name": "香港特别行政区",
+  "ProSort": 34,
+  "ProRemark": "特别行政区",
+  "city": [{
+    "CityID": 371,
+    "name": "香港",
+    "ProID": 34,
+    "CitySort": 371,
+    "area": ["中西区","湾仔区","东区","南区","深水埗区","油尖旺区","九龙城区","黄大仙区","观塘区","北区","大埔区","沙田区","西贡区","元朗区","屯门区","荃湾区","葵青区","离岛区","其他"]
+  },]
+},{
+  "ProID": 35,
+  "name": "钓鱼岛",
+  "ProSort": 35,
+  "ProRemark": "特别行政区",
+  "city": [{
+    "CityID": 372,
+    "name": "钓鱼岛",
+    "ProID": 35,
+    "CitySort": 372,
+    "area": ["钓鱼岛"]
+  },]
+},{
+  "ProID": 36,
+  "name": " 海外",
+  "ProSort": 35,
+  "ProRemark": "特别行政区",
+  "city": [{
+    "CityID": 372,
+    "name": "海外",
+    "ProID": 35,
+    "CitySort": 372,
+    "area": ['美国','加拿大','澳大利亚','新西兰','英国','法国','德国','捷克','荷兰','瑞士','希腊','挪威','瑞典','丹麦','芬兰','爱尔兰','奥地利','意大利','乌克兰','俄罗斯','西班牙','韩国','新加坡','马来西亚','印度','泰国','日本','巴西','阿根廷','南非','埃及','其他']
+  },]
+}]

+ 7 - 7
src/web/staticres/css/dev2/biddingSearch.css

@@ -1668,18 +1668,18 @@ position: absolute;
   border: 1px solid #2CB7CA;
 }
 .liLuceneList .bid-list-tags .icon-collect,
-.liLuceneList .bid-list-tags .icon-canbiao,
+.liLuceneList .bid-list-tags .icon-canbiao-img,
 .liLuceneList .bid-list-tags .icon-shoulu{
   position: relative;
   width: 54px;
   background-size: 20px 20px;
   background-position: left center;
 }
-.liLuceneList .bid-list-tags .icon-canbiao{
+.liLuceneList .bid-list-tags .icon-canbiao-img{
     width: 60px;
 }
 .liLuceneList .bid-list-tags .icon-collect::after,
-.liLuceneList .bid-list-tags .icon-canbiao::after,
+.liLuceneList .bid-list-tags .icon-canbiao-img::after,
 .liLuceneList .bid-list-tags .icon-shoulu::after{
   position: absolute;
   content: '收藏';
@@ -1692,7 +1692,7 @@ position: absolute;
 .liLuceneList .bid-list-tags .icon-shoulu.icon-a-Property1yishoulu::after{
   width: 42px;
 }
-.liLuceneList .bid-list-tags .icon-canbiao::after {
+.liLuceneList .bid-list-tags .icon-canbiao-img::after {
     content: '参标';
 }
 .liLuceneList .bid-list-tags .icon-shoulu::after {
@@ -1701,11 +1701,11 @@ position: absolute;
 .liLuceneList .bid-list-tags .icon-collect.checked{
   width: 68px;
 }
-.liLuceneList .bid-list-tags .icon-canbiao.checked{
+.liLuceneList .bid-list-tags .icon-canbiao-img.checked{
     width: 88px;
 }
 .liLuceneList .bid-list-tags .icon-collect.checked::after,
-.liLuceneList .bid-list-tags .icon-canbiao.checked::after,
+.liLuceneList .bid-list-tags .icon-canbiao-img.checked::after,
 .liLuceneList .bid-list-tags .icon-shoulu.checked::after{
   position: absolute;
   content: '已收藏';
@@ -1716,7 +1716,7 @@ position: absolute;
   color: #1D1D1D;
 }
 
-.liLuceneList .bid-list-tags .icon-canbiao.checked::after{
+.liLuceneList .bid-list-tags .icon-canbiao-img.checked::after{
     content: '终止参标';
     width: 88px !important;
 }

+ 70 - 3
src/web/staticres/css/dev2/newBidSearch.css

@@ -221,7 +221,7 @@
   background-size: 20px;
 }
 .icon-collect,
-.icon-canbiao{
+.icon-canbiao-img{
   display: inline-block;
   width: 20px;
   height: 20px;
@@ -236,11 +236,11 @@
   background-size: contain;
 }
 
-.icon-canbiao {
+.icon-canbiao-img {
   background-image: url(/images/canbiao.png);
 }
 
-.icon-canbiao.checked {
+.icon-canbiao-img.checked {
   background-image: url(/images/canbiao-active.png);
 }
 
@@ -340,6 +340,73 @@
   border-radius: 6px;
   text-decoration: none;
 }
+.custom-dialog.have-thousand-dialog .dialog-container{
+  width: 388px;
+}
+.custom-dialog.have-thousand-dialog .dialog-header{
+  position: relative;
+}
+.custom-dialog.have-thousand-dialog .dialog-content{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.custom-dialog.have-thousand-dialog .have-thousand-close{
+  position: absolute;
+  right: -8px;
+  top: -8px;
+  font-size: 24px;
+  color: #AAAAAA;
+
+  cursor: pointer;
+}
+.custom-dialog.have-thousand-dialog .dialog-container .custom-wx{
+  margin: 20px 0 8px;
+  width: 128px;
+  height: 128px;
+}
+.custom-dialog.have-thousand-dialog .custom-wx img{
+  width: 100%;
+  height: 100%;
+}
+.custom-dialog.have-thousand-dialog .continue-export-btn{
+  margin-top: 32px;
+  padding: 6px 16px;
+  background: #2ABED1;
+  font-size: 16px;
+  color: #fff;
+  border-radius: 6px;
+  border: none;
+}
+.dialog-checkbox{
+  position: relative;
+  margin-top: 12px;
+}
+.cheBoxjy-label{
+  margin-left: 20px;
+}
+#checkBoxjy {
+  position: absolute;
+  left: 0;
+  top: 3px;
+  padding: 0;
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  cursor: pointer;
+  box-sizing: border-box;
+  border: 1px solid #ccc;
+}
+#checkBoxjy.hideBf:before {
+  content: "\e62d";
+  position: absolute;
+  left: -3px;
+  top: -4.5px;
+  width: 14px;
+  height: 14px;
+  font-size: 18px;
+  color: #2CB7CA;
+}
 .custom-dialog .default-btn{
   float: right;
   border: 1px solid #e0e0e0;

+ 292 - 2
src/web/staticres/dataExport/css/conditions.css

@@ -604,10 +604,15 @@ input.sm {
 }
 
 .user-input {
+  position: relative;
   width: 100%;
   text-align: left;
 }
 
+.user-input .pre-search-list{
+  position: absolute;
+}
+
 .add-input-w {
   margin-top: 15px;
   width: 590px;
@@ -825,7 +830,7 @@ input.sm {
   overflow: -moz-scrollbars-none;
 }
 .previewData_gj{
-  height: 68px;
+  height: 54px;
   overflow-y: hidden;
   overflow-x: scroll;
 }
@@ -949,6 +954,53 @@ input.sm {
   z-index: 999;
   margin: 0 auto;
 }
+.dataExport-footer .data-footer-tip {
+  height: 40px;
+  background: #F5F5FB;
+}
+.data-footer-tip .footer-tip-main{
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  margin: 0 auto;
+  width: 1200px;
+  height: 100%;
+  background: #F9F2EA;
+  font-size: 14px;
+  color: #F56500;
+}
+.footer-tip-main .custom-service-wx{
+  position: relative;
+
+}
+.footer-tip-main .custom-service-wx .custom-service-wximg{
+  position: absolute;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  padding: 16px 16px 12px;
+  width: 160px;
+  height: 186px;
+  background: #fff;
+  border-radius: 8px;
+  top: -212px;
+  left: -54px;
+  box-shadow: 0px 0px 28px 0px rgba(0, 0, 0, 0.16);
+}
+.custom-service-wx .custom-service-wximg .triangle{
+  position: absolute;
+  display:inline-block;
+  border: 14px solid transparent;
+  border-top-color: #fff;
+  bottom: -26px;
+  left: 68px;
+}
+
+.custom-service-wximg img{
+  width: 128px;
+  height: 128px;
+}
+
 .dataExport-footer.bottomfixed {
   position: fixed;
   bottom: 0;
@@ -960,7 +1012,7 @@ input.sm {
   justify-content: flex-end;
   align-items: center;
   width: 1200px;
-  height: 100%;
+  height: 68px;
   margin: 0 auto;
 }
 .dataBtnCom{
@@ -1033,3 +1085,241 @@ input.sm {
   height: 100%;
 }
 /*E 新增数据预览样式 */
+
+/* S P289数据导出迭代优化 S*/
+.filter-data-container{
+  max-height: 400px;
+  overflow-y: scroll;
+  width: 694px;
+}
+.filter-dialog ::-webkit-scrollbar {
+  /*滚动条整体样式*/
+  width: 8px!important;
+}
+.filter-dialog .el-dialog__headerbtn{
+  width: auto;
+  right: 56px;
+  top: 10px;
+}
+.filter-data-container {
+  scrollbar-width: thin
+}
+.filter-data-container .filter-data-list{
+  margin-top: 12px;
+  padding: 0 16px;
+  background: #F5F6F7;
+  border-radius: 4px;
+}
+.filter-data-container  .f-l-title{
+  padding: 8px 0 2px;
+}
+.filter-data-container .f-l-content {
+  padding: 12px 0;
+  border-top: 1px dashed #ddd;
+  font-size: 12px;
+  color: #686868;
+  cursor: pointer;
+}
+.icon-caret-bottom{
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin-right: 4px;
+  background: url('/images/biddingSearch/icon-caret-bottom-gray.png') no-repeat center;
+  background-size: contain;
+  cursor: pointer;
+}
+.icon-caret-top{
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  margin-right: 4px;
+  background: url('/images/biddingSearch/icon-caret-top-gray.png') no-repeat center;
+  background-size: contain;
+  cursor: pointer;
+}
+
+.icon-clean{
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  background: url('/images/biddingSearch/icon-clean-gray.png') no-repeat center;
+  cursor: pointer;
+  background-size: contain;
+}
+.filter-data-list .has-search-model{
+  padding:0 0 8px 22px;
+  font-size: 12px;
+  line-height: 18px;
+}
+.filter-data-list .f-l-title{
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  cursor: pointer;
+  font-size: 14px;
+  min-height: 22px;
+  color: #1D1D1D;
+}
+.filter-data-list .f-l-title .f-l-title-text{
+  flex: 1;
+  text-align: justify;
+  font-size: 14px;
+  line-height: 22px;
+  max-width: 582px;
+}
+.filter-data-list .f-l-title:hover .icon-caret-bottom{
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin-right: 4px;
+  background: url('/images/biddingSearch/icon-caret-bottom-gold.png') no-repeat center;
+  background-size: contain;
+  cursor: pointer;
+}
+.filter-data-list .f-l-title:hover .icon-caret-top{
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin-right: 4px;
+  background: url('/images/biddingSearch/icon-caret-top-gold.png') no-repeat center;
+  background-size: contain;
+  cursor: pointer;
+}
+.filter-data-list .f-l-title:hover .f-l-title-text{
+  color: #2cb7ca;
+}
+.filter-data-list .f-l-title:hover .icon-clean{
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  background: url('/images/biddingSearch/icon-clean-gold.png') no-repeat center;
+  cursor: pointer;
+  background-size: contain;
+}
+.filter-data-list .f-l-c-item{
+  margin-top: 8px;
+  line-height: 18px;
+}
+.filter-data-list .f-l-c-item > span {
+  margin-right: 16px;
+}
+.filter-data-list .f-l-c-item .i-value {
+  color: #1D1D1D;
+}
+/* 删除筛选提示框 */
+.filter-dialog .btn-group,
+.filter-messagebox .btn-group{
+  width: 132px;
+  height: 36px;
+  padding: 0;
+  border-radius: 6px;
+  font-size: 16px;
+}
+.filter-dialog .btn-group.confirm-btn,
+.filter-messagebox .btn-group.confirm-btn{
+  background: #2cb7ca;
+  margin-right: 52px;
+  border: 0;
+  color: #fff;
+}
+.filter-dialog .btn-group.confirm-btn:hover,
+.filter-dialog .btn-group.confirm-btn:focus,
+.filter-messagebox .btn-group.confirm-btn:hover,
+.filter-dialog .btn-group.confirm-btn:focus{
+  color: #fff;
+}
+.filter-messagebox{
+  width: 380px;
+  border-radius: 8px;
+  padding: 32px;
+}
+.el-message-box__title{
+  color: #1D1D1D;
+}
+.filter-messagebox .el-message-box__header{
+  padding: 0!important;
+}
+.filter-messagebox .el-message-box__content{
+  padding: 20px 0 32px;
+}
+.filter-messagebox .el-message-box__message p{
+  font-size: 14px;
+  color: #686868;
+}
+.filter-messagebox .el-message-box__btns{
+  display: flex;
+  flex-direction: row-reverse;
+  justify-content: space-between;
+}
+
+.buyer-search-list, .winner-search-list {
+  padding: 20px 0;
+  position: absolute;
+  z-index: 6;
+  top: 52px;
+  width: 640px;
+  background: #fff;
+  box-shadow: 0 0 20px rgb(0,0,0,0.1);
+  border-radius: 8px;
+  overflow: hidden;
+}
+.pre-search-item {
+  padding: 12px 40px;
+  width: 100%;
+  font-size: 16px;
+  line-height: 24px;
+  color: #686868;
+  box-sizing: border-box;
+  transition: all .3s;
+  cursor: pointer;
+}
+.pre-search-item:hover {
+  padding: 12px 30px;
+  color: #1d1d1d;
+  background-color: #ececec;
+}
+/* E P289数据导出迭代优化 E*/
+
+/* loading */
+body .loading_ {
+  height: 100%;
+  width: 100%;
+  position: fixed;
+  background: #382f3d;
+  z-index: 999999999990;
+opacity: .7;
+    margin-top: 20px;
+}
+body .loading_ > p {
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 0;
+  bottom: 0;
+  margin: auto;
+  height: 60px;
+  width: 60px;
+  text-align: center;
+  line-height: 60px;
+  font-size: 0.36rem;
+  color: rgba(44, 183, 202, 0.8);
+}
+body .loading_ p span {
+  position: absolute;
+  display: block;
+  height: 40px;
+  width: 40px;
+  margin: 10px;
+  border-radius: 50%;
+  -webkit-box-shadow: 0 2px 3px rgba(44, 183, 202, 0.8);
+  animation: loading_ ease 1s infinite;
+  left: 0;
+  top: 0;
+}
+@keyframes loading_ {
+0% {
+  transform: rotate(0deg); }
+100% {
+  transform: rotate(360deg); }
+}

+ 92 - 0
src/web/staticres/dataExport/css/previewData.css

@@ -36,6 +36,14 @@ body{
     white-space: nowrap;
 }
 
+.d_body .d_gj tr:nth-child(1) td, .d_body .d_gj tr:nth-child(2) td{
+  background-color: transparent;
+}
+
+.d_body .d_bz tr:nth-child(1) td, .d_body .d_bz tr:nth-child(2) td{
+  background-color: transparent;
+}
+
 .d_bz tr:nth-child(odd),.d_gj tr:nth-child(odd){
 	background-color: #f9f9f9;
 }
@@ -191,7 +199,32 @@ body{
 	width: 4%;
 }
 
+.d_gj tr.content td.multi_packet{
+  padding: 0;
+}
+
+.d_gj tr:nth-child(1) td.multi_packet_trd, .d_gj tr:nth-child(2) td.multi_packet_trd{
+  background: transparent;
+  color: unset;
+}
 
+.d_bz tr:nth-child(odd).multi_packet_tr, .d_gj tr:nth-child(odd).multi_packet_tr{
+  background: transparent;
+  height: 26px;
+}
+.d_bz tr:nth-child(even).multi_packet_tr, .d_gj tr:nth-child(even).multi_packet_tr{
+  background: transparent;
+  height: 26px;
+}
+.d_gj tr.multi_packet_tr td{
+  border-left: none;
+}
+.d_gj tr.multi_packet_tr:last-child td{
+  border-bottom: none;
+}
+th {
+  height: 54px; /* 设置多级表头的高度 */
+}
 .floatBtn{
     border-radius: 5px;
     padding-top: 15px;
@@ -230,3 +263,62 @@ body{
 	top: 0px;
     left: 0px;
 }
+
+.d_body {
+  position: relative;
+  width: fit-content;
+}
+.d_body .d_gj {
+  min-width: initial;
+}
+.d_body .d_gj .el-table__header-wrapper .is-group tr th {
+  padding: 0;
+}
+.d_body .d_gj .el-table__header-wrapper .is-group tr th .cell {
+  padding: 0 4px;
+}
+
+.d_body .d_bz {
+  min-width: initial;
+}
+.d_body .d_bz .el-table__header-wrapper tr th {
+  padding: 0;
+}
+.d_body .d_bz .el-table__header-wrapper tr th .cell {
+  padding: 0 4px;
+}
+
+.d_body td {
+  font-family: MyNewFont,'微软雅黑';
+}
+
+.d_body .d_gj tr:nth-child(1) td,.d_gj tr:nth-child(2) td{
+  padding: 0;
+}
+.d_body .el-table .el-table__cell{
+  padding: 0;
+}
+.d_body .el-table .cell {
+  padding: 2px 5px;
+  line-height: 18px;
+}
+
+.d_body .el-table .winner_list{
+  display: flex;
+  flex-direction: column;
+}
+
+.d_body .el-table .set-table-line{
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 100%;
+  min-height: 24px;
+  border-bottom: 1px solid #e6e6e6;
+}
+.d_body .el-table .set-table-line:last-child{
+  border-bottom: none;
+}
+.d_body .el-table .set-cell-padding .cell {
+  padding:  2px 0;
+}

+ 13 - 9
src/web/staticres/dataExport/js/conditions_order.js

@@ -234,15 +234,15 @@ function delAddBox(n) {
   })
 }
 /* 输入事件 */
-$(".user-input input").on('input',function () {
-  var dom = $(this)
-  var f =  $.trim(dom.val()).length> 0
-  if(f) {
-    dom.next().show()
-  } else {
-    dom.next().hide()
-  }
-})
+// $(".user-input input").on('input',function () {
+//   var dom = $(this)
+//   var f =  $.trim(dom.val()).length> 0
+//   if(f) {
+//     dom.next().show()
+//   } else {
+//     dom.next().hide()
+//   }
+// })
 /* 生成子标签 */
 function createCKey(title,arr,clazz) {
   if(arr.length === 0) {
@@ -347,6 +347,9 @@ function addDelInput(t,type) {
 }
 /* 采购单位、中标单位 input-blur -- 添加可删除Input标签 -- 20190103*/
 function addDelInputB(t,type) {
+  setTimeout(() => {
+    $('.buyer-search-list').hide()
+    $('.winner-search-list').hide()
     var d = document.createElement('div');
     var text = $(t).val();
     if(!text){
@@ -370,6 +373,7 @@ function addDelInputB(t,type) {
     $(t).val('');
     $(t).hide();
     addDelBox(text,'#'+box,arr,null);
+  }, 500);
 }
 /* 添加排除/附加词 */
 var excludeArr = []

+ 3 - 1
src/web/staticres/dataExport/js/delbox.js

@@ -115,7 +115,9 @@ var DelBox = function () {
           return v !== _this3.arr[index];
         });
         var d = this.domArr.splice(index, 1)[0];
-        d.remove();
+        if(d) {
+          d.remove();
+        }
       }
     }
   }]);

+ 125 - 2
src/web/staticres/frontRouter/pc/collection/css/index-pc.css

@@ -39,7 +39,7 @@
     background-repeat: no-repeat;
     background-size: contain;
 }
-.icon-canbiao {
+.icon-canbiao-img {
     background:transparent url(/images/canbiao.png) no-repeat center;
     background-size: contain;
 }
@@ -47,7 +47,7 @@
     margin-right:0px !important;
 }
 
-.icon-canbiao-active {
+.icon-canbiao-img-active {
     background:transparent url(/images/canbiao-active.png) no-repeat center;
     background-size: contain;
 }
@@ -406,3 +406,126 @@
   opacity: 0.6;
   cursor: not-allowed;
 } */
+
+/* 弹框 */
+.mask{
+  position: fixed;
+  width: 100%;
+  height: 100%;
+  right: 0;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  background: rgba(0, 0, 0, .65);
+  z-index: 1031;
+}
+.custom-dialog{
+  display: none;
+}
+.custom-dialog .dialog-container{
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  padding: 32px;
+  width: 380px;
+  transform: translateX(-50%) translateY(-50%);
+  background: #ffffff;
+  border-radius: 8px;
+  transition: all 2s linear;
+  z-index: 1038;
+  box-sizing: border-box;
+}
+.custom-dialog .dialog-header {
+  padding: 0 0 20px;
+}
+.custom-dialog .dialog-header .dialog-title{
+  text-align: center;
+  color: #1D1D1D;
+  font-size: 18px;
+  line-height: 28px;
+}
+.custom-dialog .dialog-content{
+  color: #686868;
+  text-align: center;
+  font-size: 14px;
+  line-height: 22px;
+}
+.custom-dialog .dialog-footer{
+  margin-top: 32px;
+}
+.custom-dialog .dialog-footer .dialog-btn{
+  display: inline-block;
+  width: 132px;
+  height: 36px;
+  line-height: 36px;
+  text-align: center;
+  border-radius: 6px;
+  text-decoration: none;
+}
+.custom-dialog.have-thousand-dialog .dialog-container{
+  width: 388px;
+}
+.custom-dialog.have-thousand-dialog .dialog-header{
+  position: relative;
+}
+.custom-dialog.have-thousand-dialog .dialog-content{
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+.custom-dialog.have-thousand-dialog .have-thousand-close{
+  position: absolute;
+  right: -8px;
+  top: -8px;
+  font-size: 24px;
+  color: #AAAAAA;
+
+  cursor: pointer;
+}
+.custom-dialog.have-thousand-dialog .dialog-container .custom-wx{
+  margin: 20px 0 8px;
+  width: 128px;
+  height: 128px;
+}
+.custom-dialog.have-thousand-dialog .custom-wx img{
+  width: 100%;
+  height: 100%;
+}
+.custom-dialog.have-thousand-dialog .continue-export-btn{
+  margin-top: 32px;
+  padding: 6px 16px;
+  background: #2ABED1;
+  font-size: 16px;
+  color: #fff;
+  border-radius: 6px;
+  border: none;
+}
+.dialog-checkbox{
+  position: relative;
+  margin-top: 12px;
+}
+.cheBoxjy-label{
+  margin-left: 20px;
+}
+#checkBoxjy {
+  position: absolute;
+  left: 0;
+  top: 3px;
+  padding: 0;
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  cursor: pointer;
+  box-sizing: border-box;
+  border: 1px solid #ccc;
+}
+.el-icon-check {
+  content: "\e62d";
+  position: absolute;
+  left: -3px;
+  top: -6.5px;
+  width: 14px;
+  height: 14px;
+  font-size: 18px;
+  color: #2CB7CA;
+}

+ 94 - 29
src/web/staticres/frontRouter/pc/collection/js/index-pc.js

@@ -81,9 +81,22 @@ var vm = new Vue({
             urlFilterTagId: [],
             tableShowData: [],
             tableFirst20: [],
-            checkNum: 0
+            checkNum: 0,
+            exportChecked: false
         }
     },
+    watch: {
+      exportChecked (newval) {
+        $.ajax({
+          type: 'POST',
+          url: '/front/dataExport/setDontPromptAgain',
+          contentType: 'application/x-www-form-urlencoded',
+          data: {
+            status: newval ? '1' : '0'
+          }
+        })
+      }
+    },
     computed: {
         biEnv: function () {
             return this.inInjectBI
@@ -407,37 +420,89 @@ var vm = new Vue({
             this.listState.listType = type
         },
         dataExport: function () {
-            this.onPageChange(this.listState.pageNum)
-            var info = this.getSelectedIdArr()
-            var ids = info.ids
-            var data = null
-            if (ids.length === 0 && selectDataIds.length === 0) {
-                data = {
-                    label: this.filterState.tags.join(','),
-                    selectTime: this.filterState.selectTime,
-                    buyerclass: this.filterState.buyerclass.join(','),
-                    buyerPhone: this.filterState.buyerPhone ? this.filterState.buyerPhone : 0,
-                    winnerPhone: this.filterState.winnerPhone ? this.filterState.winnerPhone : 0
+          const _this = this
+          if(!_this.listState.total) return
+          //数据导出
+          $.ajax({
+            type: "POST",
+            url: "/front/dataExport/getDontPromptAgain",
+            contentType: "application/x-www-form-urlencoded",
+            success: function (res) {
+              if(res.error_code === 0) {
+                let countBool = false
+                if (_this.checkNum > 0) {
+                  countBool = _this.checkNum >= 20000
+                } else {
+                  countBool = _this.listState.total >= 20000
                 }
-            } else {
-                data = {
-                    selectIds: selectDataIds.join(',')
+                // 数据导出-判断是否展示弹框
+                if(res.isPrompt && countBool) {
+                  $('.have-thousand-dialog').show()
+                  // 获取微信客服二维码
+                  if (window.customers && window.customers.length > 0) {
+                    const customerInfo = window.customers.filter(v => v.name === '高静')
+                    if (customerInfo) {
+                      const html = `<img src="${customerInfo[0].wxer}" alt="">`
+                      $('.custom-wx').html(html)
+                    }
+                  }
+                } else {
+                  $('.have-thousand-dialog').hide()
+                  _this.toDataExportEvent()
                 }
+              } else {
+                $('.have-thousand-dialog').hide()
+                _this.toDataExportEvent()
+              }
+            },
+            error: function(err) {
+              _this.toDataExportEvent()
             }
-            $.ajax({
-                url: '/publicapply/dataexpoet/bycollection',
-                type: 'POST',
-                data: data,
-                success: function (res) {
-                    if (res.error_code === 0) {
-                        if (res.data._id) {
-                            this.savePageState()
-                            this.listState.loaded = true
-                            location.href = '/front/dataExport/toCreateOrderPage/' + res.data._id
-                        }
-                    }
-                }.bind(this)
-            })
+          })
+        },
+        toDataExportEvent: function () {
+          this.onPageChange(this.listState.pageNum)
+          var info = this.getSelectedIdArr()
+          var ids = info.ids
+          var data = null
+          if (ids.length === 0 && selectDataIds.length === 0) {
+              data = {
+                  label: this.filterState.tags.join(','),
+                  selectTime: this.filterState.selectTime,
+                  buyerclass: this.filterState.buyerclass.join(','),
+                  buyerPhone: this.filterState.buyerPhone ? this.filterState.buyerPhone : 0,
+                  winnerPhone: this.filterState.winnerPhone ? this.filterState.winnerPhone : 0
+              }
+          } else {
+              data = {
+                  selectIds: selectDataIds.join(',')
+              }
+          }
+          $.ajax({
+              url: '/publicapply/dataexpoet/bycollection',
+              type: 'POST',
+              data: data,
+              success: function (res) {
+                  if (res.error_code === 0) {
+                      if (res.data._id) {
+                          this.savePageState()
+                          this.listState.loaded = true
+                          location.href = '/front/dataExport/toCreateOrderPage/' + res.data._id
+                      }
+                  }
+              }.bind(this)
+          })
+        },
+        setCloseDialog () {
+          $('.have-thousand-dialog').hide()
+        },
+        setCheckBox ($this, type) {
+          $($this).hide()
+          if (type === 'open') {
+            $('.el-icon-check').show()
+          } else {
+            $('.bif-checkbox').show()
+          }
         },
         checkNotEnoughOnePage: function (unStarCount) {
             // 当前数据总共多少页数据

BIN
src/web/staticres/images/dataExport/choose_right.png


BIN
src/web/staticres/images/dataExport/close.png


BIN
src/web/staticres/images/dataExport/qr.png


BIN
src/web/staticres/images/right_corner.png


+ 42 - 1
src/web/staticres/js/biddingSearch.js

@@ -308,11 +308,52 @@ $(function() {
 				}
 			}else if($(this).attr("id")=="right-export"){
 				//数据导出
-				toPaydataExport();
+        if(!searchInnerVue.listState.allCount) return
+        $.ajax({
+          type: "POST",
+          url: "/front/dataExport/getDontPromptAgain",
+          contentType: "application/x-www-form-urlencoded",
+          success: function (res) {
+            if(res.error_code === 0) {
+              // 数据导出-判断是否展示弹框
+              let countBool = false
+              if(selectDataIds && selectDataIds.length) {
+                countBool = selectDataIds.length >= 20000
+              } else {
+                countBool = searchInnerVue.listState.allCount >= 20000
+              }
+              if(res.isPrompt && countBool) {
+                $('.have-thousand-dialog').show()
+                // 获取微信客服二维码
+                if (window.customers && window.customers.length > 0) {
+                  const customerInfo = window.customers.filter(v => v.name === '高静')
+                  if (customerInfo) {
+                    const html = `<img src="${customerInfo[0].wxer}" alt="">`
+                    $('.custom-wx').html(html)
+                  }
+                }
+              } else {
+                $('.have-thousand-dialog').hide()
+				        toPaydataExport();
+              }
+            } else {
+              $('.have-thousand-dialog').hide()
+				      toPaydataExport();
+            }
+          },
+          error: function(err) {
+				    toPaydataExport();
+          }
+        });
 			}
 		})
 	}
 
+  $('.have-thousand-close').click(function (e) { 
+    e.preventDefault();
+    $('.have-thousand-dialog').hide()
+  });
+
 	/*全文搜索 标题搜索 添加类名*/
 	luceneTab();
 

+ 9 - 1
src/web/staticres/js/ent-search-index-pc.js

@@ -1,4 +1,4 @@
-var vm = new Vue({
+var entSearch = new Vue({
     el: '.vue-search-container',
     delimiters: ['${', '}'],
     components: {
@@ -9,6 +9,7 @@ var vm = new Vue({
     },
     data: function () {
         return {
+            isFree: true,
             foundingTime:'',//成立时间
             provinceMap: provinceMap,
             searchContent: pageInfo.searchContent,
@@ -295,6 +296,9 @@ var vm = new Vue({
                 }
             }
         },
+        company_phone_show :function (){
+            return  this.isLogin && !this.isFree
+        },
         getBIParams () {
           const urlParams = new URLSearchParams(window.location.search)
           return urlParams.get('resource')
@@ -1063,6 +1067,10 @@ var vm = new Vue({
     }
 })
 
+function getPowerComplete () {
+    entSearch.isFree = window.isFree
+}
+
 ;(function () {
     var backUpLoginCallback = logic
     logic = function (data, num) {

+ 1 - 0
src/web/staticres/js/login.js

@@ -340,6 +340,7 @@ function checkBigStatus () {
       if (res && res.data) {
         window.memberStatus = res.data.memberStatus
         window.memberPower = res.data.power
+        window.customers = res.data.customers
         window.vipStatus = res.data.vipStatus // 是否是超级订阅用户
         window.isFree = res.data.isFree // 是否是免费用户
         window.freeFile = res.data.freeFile // 免费用户 是否体验过 0:未体验过 -1:体验过

+ 8 - 8
src/web/staticres/js/superSearch.js

@@ -369,7 +369,7 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
             }
             // 分类标签、收藏
             listHtml += '<div class="bid-list-tags">'
-                +'<div>'
+                +'<div class="bid-list-tags-left">'
                 if (datas[i].site == '剑鱼信息发布平台') {
                   listHtml += '<span class="tags-item tags-publish">用户发布</span>'
                 }
@@ -415,9 +415,9 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
                   listHtml+='<span class="tags-item tags-file">'+'有附件'+'</span>'
                 }
                 listHtml+='</div>'
-                listHtml+='<div>'
+                listHtml+='<div class="bid-list-tags-right">'
                 // 是否参标(2022/05/12)
-                 listHtml += '<i class="icon-canbiao" style="display:none" dataid="'+datas[i]._id+'" ></i>'
+                 listHtml += '<i class="icon-canbiao-img" style="display:none" dataid="'+datas[i]._id+'" ></i>'
 
                 // // 是否收藏
                 var resource = inResourceBIiframe
@@ -1917,14 +1917,14 @@ function getBidIsJoin () {
         if(data.length > 0) {
           Bidrenewal_Dialog.initBidrenewalDialog = true // 加载参标状态更新弹窗
          }
-        $('.icon-canbiao').removeClass('checked')
+        $('.icon-canbiao-img').removeClass('checked')
         data.forEach(function (item, index) {
           if(!inResourceBIiframe) {
-            $('.icon-canbiao[dataid="' + item.id + '"]').show()
+            $('.icon-canbiao-img[dataid="' + item.id + '"]').show()
           }
-          // $('.icon-canbiao[dataid="' + item + '"]').css("display","inline-block");
+          // $('.icon-canbiao-img[dataid="' + item + '"]').css("display","inline-block");
           if(item.value) {
-            $('.icon-canbiao[dataid="' + item.id + '"]').addClass('checked')
+            $('.icon-canbiao-img[dataid="' + item.id + '"]').addClass('checked')
           }
         })
       }
@@ -1936,7 +1936,7 @@ function getBidIsJoin () {
 function joinBidsClick() {
   // console.log(vipState, '是否是超级订阅用户')
   // 单个参标点击事件
-  $('.icon-canbiao').unbind('click').on('click',function(e) {
+  $('.icon-canbiao-img').unbind('click').on('click',function(e) {
     // 登录判断
     if (!loginflag) {
       openLoginDig()

+ 0 - 1
src/web/staticres/public-pc/js/article-content.js

@@ -580,7 +580,6 @@ function clearup(rp){
   if(projectName){
     dtcontent = keyWordHighlight(dtcontent,projectName,"<span class='keyword' style=\"border-bottom:1px solid #2cb7ca\">$1</span>");
     dttitlecopy = keyWordHighlight(dttitlecopy,projectName,"<span class='keyword' id='hst'  style=\"border-bottom:1px solid #2cb7ca;cursor: pointer;\">$1</span>");
-
   }
   if(dataCode=="winner"&&rp=="P"){
     s_winner=$.trim($("#pop-textarea").val());

+ 3 - 3
src/web/staticres/wx_dataExport/css/dataExport.css

@@ -169,12 +169,12 @@ html .page .elseChoose .elseChooseList {
 
 html .page .elseChoose .elseChooseList ul li {
   padding: 0 .4rem;
-  height: .88rem;
-  line-height: .88rem;
+  /* height: .88rem;
+  line-height: .88rem; */
   background: #fff;
   font-size: 0.3rem;
   color: #1d1d1d;
-  margin-bottom: .24rem;
+  /* margin-bottom: .24rem; */
 }
 
 html .page .elseChoose .elseChooseList ul li a {

+ 3 - 0
src/web/templates/big-member/wx/page_unit_portrayal.html

@@ -37,6 +37,7 @@
     <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/css/unit_portrayal.css?v={{Msg "seo" "version"}}' />
   <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/mainSearch/css/j-icons.css?v={{Msg "seo" "version"}}' />
   <link rel="stylesheet" type="text/css" href='{{Msg "seo" "cdn"}}/common-module/forward-share/css/forward.css?v={{Msg "seo" "version"}}'/>
+  <link rel="stylesheet" type="text/css" href='{{Msg "seo" "cdn"}}/common-module/dataExport/css/popup-data-export.css?v={{Msg "seo" "version"}}'/>
   <style>
         .skeleton{
             height: 100%;
@@ -786,6 +787,7 @@
             </van-tab>
         </van-tabs>
       </div>
+      <popup-data-export ref="popup_dataExport" @next="next_export"></popup-data-export>
     </div>
   <div id="jyKeepComponent">
     <keep-component ref="vKeepComponent" @on-change-keep="changeKeepStatus" :bid="nowOpenBid" :first="false"></keep-component>
@@ -819,6 +821,7 @@
 <script src='{{Msg "seo" "cdn"}}/big-member/js/unit_portrayal.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/keep-tags/keep-tags-template.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/dataExport/components/popup-data-export.js?v={{Msg "seo" "version"}}'></script>
 <script>
   // 收藏组件
   var vKeepComponent = new Vue({

+ 24 - 1
src/web/templates/frontRouter/pc/collection/sess/index.html

@@ -187,6 +187,29 @@
                         </div>
                     </div>
                 </div>
+                <!-- 超出两万条弹框提示 -->
+                <div class="custom-dialog have-thousand-dialog" style="display: none;">
+                  <div class="mask"></div>
+                  <div class="dialog-container">
+                    <div class="dialog-header">
+                      <h3 class="dialog-title">温馨提示</h3>
+                      <i class="el-icon-close have-thousand-close" @click="setCloseDialog"></i>
+                      <!-- <i class="j-icon icon-delete-gray" style="width: 24px;height: 24px;"></i> -->
+                    </div>
+                    <div class="dialog-content">
+                      <span>您选择的数据超过了导出数据最大值<span style="color: #2ABED1;">20,000</span> ,请优化条件后导出。您也可联系客服:400-108-6670 ,或添加<span style="color: #2ABED1;">客服微信</span><span>进行定制化导出</span></span>
+                      <div class="custom-wx"></div>
+                      <p style="color: #1D1D1D;">客服微信</p>
+                      <button class="continue-export-btn">继续导出20000条</button>
+                      <div class="dialog-checkbox">
+                        <!-- <span id="checkBoxjy" class="bif-checkbox iconfont" @click="setCheckBox(this, 'open')"></span> -->
+                        <!-- <i class="el-icon-check" @click="setCheckBox(this, 'close')" style="display: none;color: #fff;background-color: #2ABED1;"></i> -->
+                        <el-checkbox v-model="exportChecked">后续不再提醒</el-checkbox>
+                        <!-- <label class="cheBoxjy-label" for="myCheckbox">后续不再提醒</label> -->
+                      </div>
+                    </div>
+                  </div>
+                </div>
                 <div class="collect-list-content no-select">
                     <div class="list collect-line-list" v-loading="listState.loading" v-show="listState.listType === 'line'">
                         <div class="list-item flex" :class="{ visited: item.visited }" v-for="(item, index) in listState.list" :key="item._id">
@@ -205,7 +228,7 @@
                             </div>
                             <div class="append-container">
                                 <button class="bi-report-inject-button" :disabled="item.added" v-if="biEnv" @click.prevent.stop="biAddProject(item)">${ item.added ? '已添加' : '添加' }</button>
-                                <span class="j-icon i-canbiao" v-if="!biEnv && item.joinBid !== undefined" :class="item.joinBid ? 'icon-canbiao-active' : 'icon-canbiao'" @click.prevent.stop="joinBidAction(item)"></span>
+                                <span class="j-icon i-canbiao" v-if="!biEnv && item.joinBid !== undefined" :class="item.joinBid ? 'icon-canbiao-img-active' : 'icon-canbiao-img'" @click.prevent.stop="joinBidAction(item)"></span>
                                 <span class="j-icon" v-if="!biEnv" :class="item.star ? 'icon-star-active' : 'icon-star'" @click.prevent.stop="unStarThis(item)"></span>
                             </div>
                         </div>

+ 7 - 1
src/web/templates/frontRouter/wx/collection/sess/ent_portrait.html

@@ -27,6 +27,7 @@
         <link rel="stylesheet" type="text/css" href='{{Msg "seo" "cdn"}}/common-module/forward-share/css/forward.css?v={{Msg "seo" "version"}}'/>
         <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/ent_portrait.css?v={{Msg "seo" "version"}}' />
         <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/mainSearch/css/j-icons.css?v={{Msg "seo" "version"}}' />
+        <link rel="stylesheet" type="text/css" href='{{Msg "seo" "cdn"}}/common-module/dataExport/css/popup-data-export.css?v={{Msg "seo" "version"}}'/>
 </head>
 <style>
     .vip_openDialog{
@@ -167,7 +168,10 @@
                             </div>
                             <div class="card-column organization-code">
                                 <div class="ent-info-label">联系方式</div>
-                                <div class="ent-info-text">${entBaseInfo.phone ? entBaseInfo.phone : '-'}</div>
+                                <div class="ent-info-text">
+                                    <p>${entBaseInfo.phone ? entBaseInfo.phone : '-'}</p>
+                                    <p class="highlight-text" v-show="phoneUnlockTip" @click="goToUnlock">解锁查看</p>
+                                </div>
                             </div>
                         </div>
                         <div class="card-row">
@@ -651,6 +655,7 @@
                 </div>
             </div>
         </div>
+        <popup-data-export ref="popup_dataExport" @next="next_export"></popup-data-export>
     </div>
   <div id="jyKeepComponent">
     <keep-component ref="vKeepComponent" @on-change-keep="changeKeepStatus" :bid="nowOpenBid" :first="false"></keep-component>
@@ -677,6 +682,7 @@
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/ent_portrait.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/keep-tags/keep-tags-template.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/keep-tags/keep-ent-tags-template.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/dataExport/components/popup-data-export.js?v={{Msg "seo" "version"}}'></script>
 <script>
   // 收藏组件
   var vKeepComponent = new Vue({

+ 3 - 0
src/web/templates/frontRouter/wx/collection/sess/index.html

@@ -24,6 +24,7 @@
     <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/css/j-icons.css?v={{Msg "seo" "version"}}'>
     <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}' />
     <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/bidstatus-update/css/bid-status-update.css?v={{Msg "seo" "version"}}'></link>
+    <link rel="stylesheet" type="text/css" href='{{Msg "seo" "cdn"}}/common-module/dataExport/css/popup-data-export.css?v={{Msg "seo" "version"}}'/>
 </head>
 <style>
   .list-mian{
@@ -180,6 +181,7 @@
       <van-popup class="j-container" :style="popupHeight" v-model="showBidStatus" round position="bottom">
         <bid-status-node @cancel-update="cancelUpdate" @save-success="saveSuccess" :project-cell-info="projectCellInfo" @set-height="setHeight"></bid-status-node>
       </van-popup>
+      <popup-data-export ref="popup_dataExport" @next="next_export"></popup-data-export>
     </div>
   </div>
   <!--S-当前页面的资源-->
@@ -196,6 +198,7 @@
   <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/visited.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Msg "seo" "cdn"}}/common-module/bidstatus-update/js/bid-status-update.js?v={{Msg "seo" "version"}}'></script>
   <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/index-wx.js?v={{Msg "seo" "version"}}'></script>
+  <script src='{{Msg "seo" "cdn"}}/common-module/dataExport/components/popup-data-export.js?v={{Msg "seo" "version"}}'></script>
   <script>
     // 数据包默认选中企业需请求默认企业接口
     try {

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 748 - 21
src/web/templates/pc/dataExport_sieve.html


+ 1 - 1
src/web/templates/pc/entsearchindex.html

@@ -403,7 +403,7 @@
                                         <div class="i-label">成立日期:</div>
                                         <div class="i-text">${ item.establishStamp ? new Date(item.establishStamp * 1000).pattern('yyyy-MM-dd') : '-' }</div>
                                     </div>
-                                    <div class="ei-r-info-item">
+                                    <div class="ei-r-info-item" v-if="company_phone_show">
                                         <div class="i-label">联系方式:</div>
                                         <div class="i-text">${ item.company_phone ? item.company_phone : '-' }</div>
                                     </div>

+ 326 - 156
src/web/templates/pc/previewData.html

@@ -4,6 +4,9 @@
 		<meta charset="utf-8" />
 		<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 		<link rel="stylesheet" href="{{Msg "seo" "cdn"}}/dataExport/css/previewData.css?v={{Msg "seo" "version"}}">
+    <link href="//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.7/lib/theme-chalk/index.css" rel="stylesheet" />
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.7/lib/index.js></script>
 		<script src="https://cdn.bootcss.com/js-polyfills/0.1.42/polyfill.min.js"></script>
 		<script src="https://cdn.bootcdn.net/ajax/libs/fontfaceobserver/2.1.0/fontfaceobserver.js"></script>
 		<script src="{{Msg "seo" "cdn"}}/dataExport/js/html2canvas.min.js"></script>
@@ -18,158 +21,325 @@
 				src: url('/fonts/ttf/{{.T.ttf}}.eot?#iefix') format('embedded-opentype'), /* IE Fix for IE 6-8*/
 				url("{{Msg "seo" "cdn"}}/fonts/ttf/{{.T.ttf}}.ttf") format("truetype");  /* chrome、firefox、opera、Safari, Android, iOS 4.2+ */
 			}
-			.mosaic-text {
+			/* .mosaic-text {
 				display: inline !important;
 				color: transparent !important;
 				text-shadow: 0 0 10px rgba(0,0,0,0.5);
-			}
+			} */
 		</style>
-		<script>
-			var index=1;
-			/*document.oncontextmenu = function(){
-		   		return false;
-			}
-			document.onselectstart = function(){
-			    return false;
-			}
-			document.oncopy = function(){
-			    return false;
-			}*/
-		</script>
 	</head>
-			{{if eq .T.dataType "1"}}
-			<body style="min-width:2020px;">
-				<table class="d_bz" cellspacing="0" cellpadding="0">
-					<tr>
-            <td>序号</td>
-            <td>匹配关键词</td>
-          	<td>省份</td>
-						<td>城市</td>
-						<td>公告标题</td>
-            <td>公告类别</td>
-            <td>发布时间</td>
-            <td>采购单位</td>
-            <td>中标单位</td>
-            <td>中标金额<br>(万元)</td>
-            <td>项目名称</td>
-						<td>公告内容</td>
-            <td>剑鱼标讯地址</td>
-					</tr>
-					{{range $i, $v := .T.data}}
-						<tr>
-						<td>
-							<script>
-							document.write(index++)
-							</script>
-						</td>
-            <td>{{$v.keyword}}</td>
-            <td>{{$v.area}}</td>
-						<td>{{$v.city}}</td>
-						<td>{{$v.title}}</td>
-            <td>{{$v.subtype}}</td>
-            <td>{{$v.publishtime}}</td>
-            <td>{{$v.buyer}}</td>
-            <td>{{$v.s_winner}}</td>
-            <td name="money">{{$v.bidamount}}</td>
-            <td>{{$v.projectname}}</td>
-						<td>{{$v.detail}}</td>
-            <td>{{$v.url}}</td>
-
-					</tr>
-					{{end}}
-				</table>
-			{{else}}
-			<body style="min-width:2820px;">
-				<table class="d_gj" cellspacing="0" cellpadding="0">
-				<tr>
-					<td rowspan=2>序号</td>
-          <td rowspan=2>匹配关键词</td>
-          <td rowspan=2>省份</td>
-					<td rowspan=2>城市</td>
-          <td rowspan=2>区县</td>
-					<td rowspan=2>公告标题</td>
-          <td rowspan=2>公告类别</td>
-					<td rowspan=2>公告内容</td>
-          <td rowspan=2>发布时间</td>
-					<td rowspan=2>公告地址</td>
-          <td rowspan=2>剑鱼标讯地址</td>
-          <td rowspan=2>项目名称</td>
-		      <td rowspan=2>项目编号</td>
-          <td rowspan=2>项目范围</td>
-          <td rowspan=2>预算金额<br>(万元)</td>
-          <td rowspan=2>中标金额<br>(万元)</td>
-          <td rowspan=2>报名截止日期</td>
-          <td rowspan=2>开标日期</td>
-          <td rowspan=2>投标截止日期</td>
-          <td colspan=4>采购单位信息</td>
-          <td rowspan=2>招标代理机构</td>
-          <td colspan=3>中标单位信息(来源:招标公告网站)</td>
-          <td colspan=3>中标单位信息(来源:国家企业公示网站)</td>
-				</tr>
-        <tr>
-          <td>单位名称</td>
-					<td>联系人</td>
-					<td>联系电话</td>
-          <td>单位地址</td>
-
-          <td>单位名称</td>
-          <td>联系人</td>
-          <td>联系电话</td>
-
-          <td>联系人</td>
-          <td>联系电话</td>
-          <td>电子邮箱</td>
-        </tr>
-
-
-				{{range $i, $v := .T.data}}
-				<tr class="content">
-					<td>
-					<script>
-					document.write(index++)
-					</script>
-					</td>
-          <td>{{$v.keyword}}</td>
-          <td>{{$v.area}}</td>
-					<td>{{$v.city}}</td>
-          <td>{{$v.district}}</td>
-					<td>{{$v.title}}</td>
-          <td>{{$v.subtype}}</td>
-					<td>{{$v.detail}}</td>
-          <td>{{$v.publishtime}}</td>
-					<td>{{$v.href}}</td>
-          <td>{{$v.url}}</td>
-          <td>{{$v.projectname}}</td>
-          <td>{{$v.projectcode}}</td>
-          <td>{{$v.projectscope}}</td>
-          <td name="money">{{$v.budget}}</td>
-          <td name="money">{{$v.bidamount}}</td>
-          <td>{{$v.signendtime}}</td>
-          <td>{{$v.bidopentime}}</td>
-          <td>{{$v.bidendtime}}</td>
-          <td>{{$v.buyer}}</td>
-          <td name="name">{{$v.buyerperson}}</td>
-          <td name="phone">{{$v.buyertel}}</td>
-          <td>{{$v.buyeraddr}}</td>
-
-          <td>{{$v.agency}}</td>
-          <td>{{$v.s_winner}}</td>
-          <td name="name">{{$v.winnerperson}}</td>
-          <td name="phone">{{$v.winnertel}}</td>
-
-          <td name="name">{{$v.legal_person}}</td>
-          <td name="phone">{{$v.company_phone}}</td>
-          <td>{{$v.company_email}}</td>
-
-
-				</tr>
-				{{end}}
-			</table>
-			{{end}}
-			<div class="sy">
-			</div>
+  <body style="min-width:2020px;">
+    <div class="d_body">
+      <div class="d_bz" v-if="dataType == '1'">
+        <el-table
+          :data="getList"
+          :row-style="rowStyle"
+          style="width: 100%"
+          :header-row-style="headerRowStyle"
+          :header-cell-style="setHeaderStyle"
+          >
+          <el-table-column
+          v-for="(item, index) in bzInfo"
+            :key="index"
+            :width="item.width"
+            :type="index === 0 ? 'index' : undefined"
+            :prop="item.filed"
+            :label="item.title"
+            align="center"
+            >
+          </el-table-column>
+          
+        </el-table>
+      </div>
+      <div class="d_gj" v-if="dataType == '2'">
+        <el-table
+          :data="getList"
+          :header-row-style="headerRowStyle"
+          :header-cell-style="setHeaderStyle"
+          style="width: 100%">
+          <el-table-column
+            v-for="(item, index) in gjInfo"
+            :key="index"
+            :type="index === 0 ? 'index' : undefined"
+            :prop="item.filed"
+            :width="item.width"
+            :label="item.title"
+            align="center"
+            >
+            <template v-if="item.title == '采购单位信息'">
+              <el-table-column
+                prop="buyer"
+                width="82"
+                label="单位名称"
+                align="center"
+                >
+              </el-table-column>
+              <el-table-column
+                prop="buyerclass"
+                width="108"
+                label="采购单位类型"
+                align="center"
+                >
+              </el-table-column>
+              <el-table-column
+                prop="buyerperson"
+                width="89"
+                label="联系人"
+                align="center"
+                >
+                <template slot-scope="scope">
+                  {scope.row.buyerperson ? textFormatForMosaic(scope.row.buyerperson) : '-'}
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="buyertel"
+                width="143"
+                label="联系电话"
+                align="center"
+                >
+                <template slot-scope="scope">
+                  {textFormatForMosaic(scope.row.buyertel)}
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="buyeraddr"
+                width="83"
+                label="单位地址"
+                align="center"
+                >
+              </el-table-column>
+            </template>
+            <template v-if="item.title == '中标单位信息(来源:招标公告网站)'">
+              <el-table-column
+                prop="s_winner"
+                width="200"
+                label="单位名称"
+                class-name="set-cell-padding"
+                align="center"
+                >
+                <template slot-scope="scope">
+                  <div class="winner_list" v-if="scope.row.winnerList && scope.row.winnerList.length">
+                    <div class="set-table-line" v-for="win in scope.row.winnerList">
+                      {win}<br>
+                    </div>
+                  </div>
+                  <div v-else>{scope.row.s_winner}</div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="winnerperson"
+                width="74"
+                label="联系人"
+                align="center"
+                >
+                <template slot-scope="scope">
+                  {scope.row.winnerperson}
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="winnertel"
+                width="66"
+                label="联系电话"
+                align="center"
+                >
+                <template slot-scope="scope">
+                  {scope.row.winnertel}
+                </template>
+              </el-table-column>
+            </template>
+            <template v-if="item.title == '中标单位信息(来源:国家企业公示网站)'">
+              <el-table-column
+                prop="legal_person"
+                width="60"
+                label="联系人"
+                class-name="set-cell-padding"
+                align="center"
+                >
+                <template slot-scope="scope">
+                  <div class="winner_list" v-if="scope.row.personArr && scope.row.personArr.length">
+                    <div class="set-table-line" v-for="person in scope.row.personArr">
+                      {person || '-'}<br>
+                    </div>
+                  </div>
+                  <div v-else>{scope.row.legal_person}</div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="company_phone"
+                width="100"
+                label="联系电话"
+                class-name="set-cell-padding"
+                align="center"
+                >
+                <template slot-scope="scope">
+                  <div class="winner_list" v-if="scope.row.phoneArr && scope.row.phoneArr.length">
+                    <div class="set-table-line" v-for="phone in scope.row.phoneArr">
+                      {phone || '-'}<br>
+                    </div>
+                  </div>
+                  <div v-else>{scope.row.company_phone}</div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="company_email"
+                width="106"
+                label="电子邮箱"
+                class-name="set-cell-padding"
+                align="center"
+                >
+                <template slot-scope="scope">
+                  <div class="winner_list" v-if="scope.row.emailArr && scope.row.emailArr.length">
+                    <div class="set-table-line" v-for="email in scope.row.emailArr">
+                      {email || '-'}<br>
+                    </div>
+                  </div>
+                  <div v-else>{scope.row.company_email}</div>
+                </template>
+              </el-table-column>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div class="sy"></div>
+    </div>
 	</body>
 	<script>
+  var list = {{.T.data}}
+  var node = new Vue({
+    el: '.d_body',
+    delimiters: ['{', '}'],
+    data () {
+      return {
+        listInfo: list,
+        dataType: '2',
+        bzInfo: [
+          {width: '40', filed: 'index', title: '序号'},
+          {width: '70', filed: 'keyword', title: '匹配关键词'},
+          {width: '60', filed: 'area', title: '省份'},
+          {width: '60', filed: 'city', title: '城市'},
+          {width: '262', filed: 'title', title: '公告标题'},
+          {width: '60', filed: 'subtype', title: '公告类别'},
+          {width: '90', filed: 'publishtime', title: '发布时间'},
+          {width: '202', filed: 'buyer', title: '采购单位'},
+          {width: '202', filed: 's_winner', title: '中标单位'},
+          {width: '75', filed: 'bidamount', title: '中标金额(万元)'},
+          {width: '262', filed: 'projectname', title: '项目名称'},
+          {width: '484', filed: 'detail', title: '公告内容'},
+          {width: '200', filed: 'url', title: '剑鱼标讯地址'}
+        ],
+        gjInfo: [
+          {width: '40', filed: 'index', title: '序号',},
+          {width: '70', filed: 'keyword', title: '匹配关键词',},
+          {width: '60', filed: 'area', title: '省份',},
+          {width: '60', filed: 'city', title: '城市',},
+          {width: '60', filed: 'district', title: '区县',},
+          {width: '153', filed: 'title', title: '公告标题',},
+          {width: '60', filed: 'subtype', title: '公告类别',},
+          {width: '221', filed: 'detail', title: '公告内容',},
+          {width: '90', filed: 'publishtime', title: '发布时间',},
+          {width: '116', filed: 'href', title: '公告地址',},
+          {width: '123', filed: 'url', title: '剑鱼标讯地址',},
+          {width: '136', filed: 'projectname', title: '项目名称',},
+          {width: '160', filed: 's_topscopeclass', title: '行业',},
+          {width: '146', filed: 'projectcode', title: '项目编号',},
+          {width: '146', filed: 'projectscope', title: '项目范围',},
+          {width: '64', filed: 'budget', title: '预算金额(万元)',},
+          {width: '64', filed: 'bidamount', title: '中标金额(万元)',},
+          {width: '90', filed: 'signendtime', title: '报名截止日期',},
+          {width: '90', filed: 'bidopentime', title: '开标日期',},
+          {width: '90', filed: 'bidendtime', title: '投标截止日期',},
+          {width: '', filed: '', title: '采购单位信息',},
+          {width: '143', filed: 'agency', title: '招标代理机构',},
+          {width: '', filed: '', title: '中标单位信息(来源:招标公告网站)',},
+          {width: '', filed: '', title: '中标单位信息(来源:国家企业公示网站)',}
+        ]
+      }
+    },
+    created: function () {
+      var params = new URLSearchParams(window.location.search);
+      this.dataType = params.get('dataType')
+    },
+    computed: {
+      getList () {
+        const list = this.listInfo
+        if (list && list.length) {
+          list.forEach((v) => {
+            let persons = []
+            let phone = []
+            let email = []
+            if(v.s_winner && v.winnerMaps) {
+              if(v.s_winner.indexOf(',') !== -1) {
+                // 多个中标单位
+                v.winnerList = v.s_winner.split(',')
+                v.winnerList.forEach((m,i) => {
+                  const winnerItem = v.winnerMaps.filter(item => item.company_name == m)
+                  if(winnerItem && winnerItem.length) {
+                    persons.push(winnerItem[0].legal_person || '')
+                    phone.push(winnerItem[0].company_phone || '')
+                    email.push(winnerItem[0].company_email || '')
+                  } else {
+                    persons.push('')
+                    phone.push('')
+                    email.push('')
+                  }
+                })
+              } else {
+                // 只有一个中标单位
+                const winnerItem = v.winnerMaps.filter(item => item.company_name == v.s_winner)
+                if(winnerItem && winnerItem.length) {
+                  persons.push(winnerItem[0].legal_person || '')
+                  phone.push(winnerItem[0].company_phone || '')
+                  email.push(winnerItem[0].company_email || '')
+                }
+              }
+            }
+            if (persons && persons.length) {
+              v.personArr = persons
+            }
+            if (phone && phone.length) {
+              v.phoneArr = phone
+            }
+            if (email && email.length) {
+              v.emailArr = email
+            }
+          })
+        }
+        this.listInfo = list
+        return this.listInfo
+      },
+      setHeaderStyle () {
+        return {
+            textAlign: 'center',
+            height: '14px',
+            background: '#e9f6ff',
+            color: '#565f66',
+            'border-right': '1px solid #DCE1E4',
+            'border-bottom': '1px solid #DCE1E4'
+        }
+      },
+      headerRowStyle () {
+        if(this.dataType === '1') {
+          return {
+            height: '54px',
+            fontSize: '12px',
+          }
+        } else if(this.dataType === '2') {
+          return {
+            height: '31px',
+            fontSize: '12px',
+          }
+        }
+      },
+      rowStyle () {
+        return {
+          'min-height': '58px',
+          'height': '58px',
+        }
+      }
+    },
+    methods: {
+    }
+  })
 	// 字体加载异常处理
 	try {
 		document.fonts.ready.then(function() {
@@ -181,7 +351,7 @@
 	try {
 		var font = new FontFaceObserver('MyNewFont');
 		font.load().then(function () {
-			var html = document.querySelector('body');
+			var html = document.querySelector('.d_body');
 			html.classList.add('font-loaded');
 			renderImg()
 		}, function () {
@@ -221,20 +391,20 @@
 		return money
 	}
 
-	$("td[name='name']").each(function () {
-		$(this).html(textFormatForMosaic($(this).text()))
-	})
-	$("td[name='phone']").each(function () {
-		$(this).html(textFormatForMosaic($(this).text(), true))
-	})
-	$("td[name='money']").each(function () {
-		$(this).html(moneyFormatForCover($(this).text()))
-	})
+	// $("td[name='name']").each(function () {
+	// 	$(this).html(textFormatForMosaic($(this).text()))
+	// })
+	// $("td[name='phone']").each(function () {
+	// 	$(this).html(textFormatForMosaic($(this).text(), true))
+	// })
+	// $("td[name='money']").each(function () {
+	// 	$(this).html(moneyFormatForCover($(this).text()))
+	// })
 
 	function renderImg () {
 		var w=$("table").width();
 		var h=$("table").height();
-		$(".sy").width($("table").width()).height($("table").height());
+		$(".sy").width($("table").width()).height('100%');
 		html2canvas(document.querySelector("body"),{
 			useCORS:true,
 			scale:1,

+ 40 - 0
src/web/templates/pc/supsearch.html

@@ -9,6 +9,8 @@
   <meta content="招标搜索" theme="light" name="enable-header"/>
   <meta content="330" name="data-backside"/>
   {{include "/common/pnc.html"}}
+  <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/dataExport/css/font_624651_bjdvktmum68.css?v={{Msg "seo" "version"}}">
+  <link href='{{Msg "seo" "cdn"}}/dataExport/css/j-icons.css?v={{Msg "seo" "version"}}' rel="stylesheet">
   <link href='{{Msg "seo" "cdn"}}/css/pc.css?v={{Msg "seo" "version"}}' rel="stylesheet">
   <link href='{{Msg "seo" "cdn"}}/css/dev2/reset_pc.css?v={{Msg "seo" "version"}}' rel="stylesheet">
   <link href='{{Msg "seo" "cdn"}}/css/dev2/biddingSearch.css?v={{Msg "seo" "version"}}' rel="stylesheet">
@@ -1748,6 +1750,27 @@
         </div>
       </div>
     </div>
+    <!-- 超出两万条弹框提示 -->
+    <div class="custom-dialog have-thousand-dialog" style="display: none;">
+      <div class="mask"></div>
+      <div class="dialog-container">
+        <div class="dialog-header">
+          <h3 class="dialog-title">温馨提示</h3>
+          <i class="el-icon-close have-thousand-close"></i>
+          <!-- <i class="j-icon icon-delete-gray" style="width: 24px;height: 24px;"></i> -->
+        </div>
+        <div class="dialog-content">
+          <span>您选择的数据超过了导出数据最大值<span style="color: #2ABED1;">20,000</span> ,请优化条件后导出。您也可联系客服:400-108-6670 ,或添加<span style="color: #2ABED1;">客服微信</span><span>进行定制化导出</span></span>
+          <div class="custom-wx"></div>
+          <p style="color: #1D1D1D;">客服微信</p>
+          <button onclick="toPaydataExport()" class="continue-export-btn">继续导出20000条</button>
+          <div class="dialog-checkbox">
+            <span id="checkBoxjy" class="bif-checkbox iconfont"></span>
+            <label class="cheBoxjy-label" for="myCheckbox">后续不再提醒</label>
+          </div>
+        </div>
+      </div>
+    </div>
     <!-- 订阅弹框 -->
     <el-dialog custom-class="sub-key-dialog" top="20vh" title="订阅搜索词" :close-on-click-modal="false" :close-on-press-escape="false" width="380" :center="true" :show-close="false" :visible.sync="subDialog">
       <div class="sub-tips">
@@ -1939,6 +1962,23 @@
       $('.tab-item-ent-search').show()
       $('.tab-item-buyer-search').show()
     }
+
+    // 数据导出后续不再提示复选框
+    $('.bif-checkbox').on('click', function () {
+        $('.bif-checkbox').toggleClass('hideBf');
+        const haveClassBF = $('.bif-checkbox').hasClass('hideBf')
+        $.ajax({
+          type: 'POST',
+          url: '/front/dataExport/setDontPromptAgain',
+          contentType: 'application/x-www-form-urlencoded',
+          data: {
+            status: haveClassBF ? '1' : 0
+          },
+          success: function(res) {
+
+          }
+        })
+    })
     window.loginCallback = function () {//登录成功回调
       // @2023/9/26 未登录限制搜索条件
       $(".no-login-mask").remove()

+ 323 - 22
src/web/templates/weixin/dataExport/dataExport.html

@@ -7,12 +7,15 @@
     <meta http-equiv="X-UA-Compatible" content="ie=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
     <title>数据导出</title>
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/index.css />
+    <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/icon/local.css />
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/base.css?v={{Msg "seo" "version"}}">
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
 <!--    <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/weui.min.css">-->
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/dataExport.css?v={{Msg "seo" "version"}}5">
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/css/wxbutton.css?v={{Msg "seo" "version"}}1">
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/weui.min.css">
+    <link rel="stylesheet"href='{{Msg "seo" "cdn"}}/common-module/dataExport/css/dataExportAppend.css?v={{Msg "seo" "version"}}'/>
     <script src="{{Msg "seo" "cdn"}}/wx_dataExport/js/rem.js?v={{Msg "seo" "version"}}"></script>
   <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
   <script src="//cdn-common.jianyu360.com/cdn/lib/vue/2.6.14/vue.min.js"></script>
@@ -25,9 +28,11 @@
     <script src="https://cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js"></script>
     <script src="{{Msg "seo" "cdn"}}/js/common.js?v={{Msg "seo" "version"}}"></script>
     <script src="{{Msg "seo" "cdn"}}/wxswordfish/share.js"></script>
+    <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
     <!--2.10.4-->
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/vipsubscribe/css/weui.min.css?v={{Msg "seo" "version"}}"/>
     <script type="text/javascript" src="{{Msg "seo" "cdn"}}/vipsubscribe/js/weui.min.js?v={{Msg "seo" "version"}}"></script>
+    <script src="{{Msg "seo" "cdn"}}/common-module/js/mapJSON.js?v={{Msg "seo" "version"}}"></script>
 </head>
 <style>
   .j-container {
@@ -83,9 +88,10 @@
         border: 1px solid #CECECE;
         margin: .16rem .13rem;
         border-radius: 0.02rem;
-		    padding-top: 0.14rem;
-    	  padding-bottom: 0.14rem;
-		    padding-left: 0.68rem;
+		padding-top: 0.14rem;
+    	padding-bottom: 0.14rem;
+		padding-left: 0.68rem;
+        line-height: 0.4rem;
     }
     html .page .chooseTime > i{
         position: relative;
@@ -223,15 +229,25 @@
   .swiper-container-horizontal>.swiper-pagination-bullets, .swiper-pagination-custom, .swiper-pagination-fraction{
     top: 80%;
   }
+  [v-cloak] {
+    display: none!important;
+   }
 </style>
 <body class="p13">
-    <div class="page j-container">
+    <div class="page j-container" style="background-color:#F5F6F7;">
       <div class="main j-main">
        <div>
-        <div class="progress">
+        <div class="screeningCondition">
+          <div class="sc-btnContent">
+            <span class="sc-icon" ></span>
+            <div class="sc-btn" ><span class="sc-text">已存筛选&nbsp;</span><span class="sc-num">0</span></div>
+          </div>
+        </div>
+        <div class="progressBox">
+         <div class="progress">
         	<div class="p-item">
         		<p class="p-item-icon" style="background: #2cb7ca;">
-        			<i class="icon iconfont" >&#xe606;</i>
+        			<!-- <i class="icon iconfont" >&#xe606;</i> -->
         		</p>
         		<span class="active">条件筛选</span>
         		<div class="line"></div>
@@ -239,7 +255,7 @@
 
         	<div class="p-item">
         		<p class="p-item-icon">
-        			<i class="icon iconfont">&#xe617;</i>
+        			<!-- <i class="icon iconfont">&#xe617;</i> -->
         		</p>
         		<span>支付订单</span>
         		<div class="line"></div>
@@ -247,12 +263,13 @@
 
         	<div class="p-item">
         		<p class="p-item-icon icon-gray">
-        			<i class="icon iconfont">&#xe616;</i>
+        			<!-- <i class="icon iconfont">&#xe616;</i> -->
         		</p>
         		<span>数据导出</span>
         	</div>
+         </div>
         </div>
-            <div class="tit">
+            <!-- <div class="tit">
               <div class="helpwhat">数据导出可以帮助您做什么<img style="width: 15px; margin-top: -2px; margin-left: 2px;transform: rotate(180deg);" src="/wx_dataExport/images/jt.png"/></div>
               <div class="btn_img" style="display:none;" >
                 <span class="j-icon icon-arrow-top cion_img"></span>
@@ -267,7 +284,7 @@
                 <div class="sieve-cont ">2、准确掌握行业客户、竞争对手、合作伙伴的招投标活动;</div>
                 <div class="sieve-cont mar-bot10">3、轻松挖掘潜在客户、合作伙伴、拓展市场空间。</div>
               </div>
-          </div>
+          </div> -->
          <div>
         <!-- dateChooseStart -->
         <div class="chooseTime">
@@ -278,11 +295,11 @@
                 <li><span data-value="2016_toNow"></span></li>
             </ul>
             <div class="dateMake">
-            	<i class="iconfont icon-rili" id="first"></i>
+            	<!-- <i class="iconfont icon-rili" id="first"></i> -->
                 <input id="starttime" placeholder="开始日期" readonly="readonly">
                 <div class="heng">—</div>
                 <input id="endtime" placeholder="截止日期" readonly="readonly">
-                <i class="iconfont icon-rili" id="second"></i>
+                <!-- <i class="iconfont icon-rili" id="second"></i> -->
             </div>
         </div>
         <!-- dateChooseEnd -->
@@ -293,28 +310,28 @@
                <div class="elseChooseList">
                    <ul>
                        	<li class="list-item">
-							<a href="/front/wx_dataExport/area">
+							<a href="JavaScript:;" onclick="goChoosedetail('/front/wx_dataExport/area')">
 	                           <strong class="label">区域</strong>
 	                           <span id="area" class="content"></span>
 	                           <i class="iconfont icon-arrow"></i>
                         	</a>
 						</li>
                        <li class="list-item">
-							<a href="/front/wx_dataExport/industry">
+							<a href="JavaScript:;" onclick="goChoosedetail('/front/wx_dataExport/industry')">
 	                        <strong class="label">行业</strong>
                                <span id="industry" class="content"></span>
                                <i class="iconfont icon-arrow"></i>
 	                        </a>
                         </li>
                         <li class="list-item">
-							<a href="/front/wx_dataExport/buyerclass">
+							<a href="JavaScript:;" onclick="goChoosedetail('/front/wx_dataExport/buyerclass')">
 	                        <strong class="label" style="width: 2.2rem;">采购单位类型</strong>
                                <span id="buyClass" class="content"></span>
                                <i class="iconfont icon-arrow"></i>
 	                        </a>
 						</li>
                        <li class="list-item">
-							<a href="/front/wx_dataExport/keyWord">
+							<a href="JavaScript:;" onclick="goChoosedetail('/front/wx_dataExport/keyWord')">
 	                        	<strong class="label">关键词</strong>
 	                           <span id="keyWord" class="content"></span>
 	                           <i class="iconfont icon-arrow"></i>
@@ -326,24 +343,24 @@
                            <i class="iconfont icon-arrow"></i>
                        </a></li>
 
-                        <li class="list-item"><a href="/front/wx_dataExport/price">
+                        <li class="list-item"><a href="JavaScript:;" onclick="goChoosedetail('/front/wx_dataExport/price')">
                             <strong class="label">金额</strong>
                             <span id="price" class="content"></span>
                             <i class="iconfont icon-arrow"></i>
                         </a></li>
 
-                        <li class="list-item"><a href="/front/wx_dataExport/subType">
+                        <li class="list-item"><a href="JavaScript:;" onclick="goChoosedetail('/front/wx_dataExport/subType')">
                             <strong class="label">信息类型</strong>
                             <span id="subType" class="content"></span>
                             <i class="iconfont icon-arrow"></i>
                         </a></li>
 
-                       <li class="list-item"><a href="/front/wx_dataExport/buyerEdit">
+                       <li class="list-item"><a href="JavaScript:;" onclick="goChoosedetail('/front/wx_dataExport/buyerEdit')">
                             <strong class="label">采购单位</strong>
                            <span id="buyer" class="content"></span>
                            <i class="iconfont icon-arrow"></i>
                         </a></li>
-                       <li class="list-item"><a href="/front/wx_dataExport/winnerEdit">
+                       <li class="list-item"><a href="JavaScript:;" onclick="goChoosedetail('/front/wx_dataExport/winnerEdit')">
                             <strong class="label">中标单位</strong>
                            <span id="winner" class="content"></span>
                            <i class="iconfont icon-arrow"></i>
@@ -477,7 +494,7 @@
         </div>
     </div>
     <!-- 多选弹框 -->
-    <div id="checkbox_dialog">
+    <div id="checkbox_dialog" v-cloak>
         <div class="mask" v-show="dialog_show">
             <div class="box">
                 <div class="head"><p>关键词匹配方式</p><img src="{{Msg "seo" "cdn"}}/wx_dataExport/images/icon_delete_gray@2x.png?v={{Msg "seo" "version"}}" alt="" @click.stop="dialog_show=false"></div>
@@ -526,6 +543,149 @@
             }
         });
         //
+           //接口回显逻辑
+           $.ajax({
+        type: 'get',
+        url: '/subscribepay/dataExportPack/screenList',
+        async:sessionStorage.getItem('goScreen') != '1'?false:true,
+        success: function (res) { 
+          if(res.data && res.data.length > 0){
+            $('.sc-num').text(res.data.length)
+            if(sessionStorage.getItem('goScreen') != '1'){
+            localStorage.removeItem('date') 
+            localStorage.removeItem('areaHtml') 
+            localStorage.removeItem('city') 
+            localStorage.removeItem('province') 
+            localStorage.removeItem('area') 
+            localStorage.removeItem('industry')  
+            localStorage.removeItem('buyclass') 
+            localStorage.removeItem('keyWord') 
+            localStorage.removeItem('export_selectType')  
+            localStorage.removeItem('price')  
+            localStorage.removeItem('subType') 
+            localStorage.removeItem('subTypes')   
+            localStorage.removeItem('buyer') 
+            localStorage.removeItem('winner')
+            localStorage.setItem('index','-1') 
+            let val =res.data[0]
+            if(val.publishtime){
+        localStorage.setItem('date',val.publishtime) 
+        }
+        if (val.city || val.area) {
+        let str = ''
+        if (val.area) {
+          str += val.area.replace(/,/g, "、")
+        }
+        if (val.city) {
+          let arr = val.city.split(',')
+          str = str+'、'+ getArea_city(arr)
+        }
+        localStorage.setItem('areaHtml',str)  
+      }
+        if(val.city){
+          localStorage.setItem('city',val.city) 
+          let area = val.city.replace(/,/g, " ")
+          localStorage.setItem('area',area) 
+        }
+        if(val.area){
+          let allcity = ""
+          let str = ""
+          let arr = val.area.split(",")
+          let cityarr =[]
+          if(val.city){
+            str = val.city
+          }
+          arr.forEach(e=>{ // 选整个省下的所有城市
+            cityarr = cityarr.concat(getCitiesFromJSONMap(e))     
+          })
+          allcity = cityarr.toString()
+          localStorage.setItem('province', val.area)
+        if (str) {
+          localStorage.setItem('city', allcity + ',' + str)
+        } else {
+          localStorage.setItem('city', allcity)
+        }
+        let area;
+        if (allcity) {
+          area = allcity + ',' + val.region
+        } else {
+          area = val.region
+        }
+        let areaList = area.split(',') || []
+        areaList.forEach((e, index) => {
+          if(e === '上海' || e === '北京' || e === '天津' || e === '重庆'){
+            areaList[index] = e + '市'
+          }
+          if( e === '台湾'){
+            areaList[index]  = e + '省'
+          }
+        })
+        let areaStr = areaList.join(',')
+        if(areaStr){
+          localStorage.setItem('area', areaStr.replace(/,/g, " "))
+        }
+        }
+        if(!val.area && !val.city){
+          localStorage.setItem('area','全国') 
+          localStorage.setItem('areaHtml','全国') 
+        }
+         console.log(val.industry)
+        if(val.industry){
+          let str = val.industry.replace(/,/g, " ")
+          localStorage.setItem('industry',str)    
+        }else{
+          localStorage.setItem('industry','全部')   
+        }
+        if(val.buyerclass){
+          localStorage.setItem('buyclass',JSON.stringify(val.buyerclass.split(',')))    
+        }else{
+          localStorage.setItem('buyclass','[]')   
+        }
+        if (val.keywords && val.keywords.length > 0) {
+        let keyjson
+        try{
+          keyjson = JSON.parse(val.keywords)
+        }catch(e){
+          keyjson = val.keywords
+        }
+       // keyWord储存本地处理为驼峰式 自助导出页面使用本地回显存取的为驼峰式
+        keyjson.forEach((item) =>{
+          item.keyWord = item.keyword 
+          })
+        localStorage.setItem('keyWord', JSON.stringify(keyjson))
+       } else {
+        localStorage.setItem('keyWord', '[]')
+       }
+        if(val.selectType){
+          localStorage.setItem('export_selectType',selectType_dispose(val.selectType))  
+        }
+        if(val.minprice || val.maxprice){
+          let str = ""
+          str += (val.minprice || '' )+'万元'+'-'+(val.maxprice || '')+'万元'
+          localStorage.setItem('price',str)  
+        }else{
+          localStorage.setItem('price','全部')  
+        }
+        if(val.subtype){
+          let str = val.subtype.replace(/,/g, " ")
+          localStorage.setItem('subTypes',str)  
+          localStorage.setItem('subType',str)  
+        }else{
+          localStorage.setItem('subType','全部') 
+        }
+        if(val.buyer){
+          localStorage.setItem('buyer',val.buyer)
+        }
+        if(val.winner){
+          localStorage.setItem('winner',val.winner)
+        }
+       }
+       }
+          sessionStorage.setItem('goScreen','2');
+         },
+         error: function (error) {
+         }
+         })
         $('.match').click(function () {
              //单选原有逻辑
             // $('.match_way').slideDown('slow');
@@ -584,6 +744,7 @@
             $("#starttime").removeClass("timeSelect");
             $("#endtime").removeClass("timeSelect");
             $(".dateMake").css({"color":"#888"});
+            $(".dateMake").removeClass('chooseTimebox')
 			localStorage.removeItem("export_starttime");
            	localStorage.removeItem("export_endtime");
         });
@@ -912,10 +1073,12 @@
                     $("#starttime").addClass("timeSelect");
                     $("#endtime").addClass("timeSelect");
                     $(".dateMake").css({"color":"#24C0D7"});
+                    $(".dateMake").addClass('chooseTimebox')
                     $(".chooseTime ul li").removeClass('active');
 
                     $(".confirm").hide();
                     $(".resetOne").show();
+                    // localStorage.removeItem("date"); // 重新选择日期不在移除date 重新访问页面以提交的时间为准回显
                     localStorage.removeItem("date");
                     localStorage.removeItem("index");
                 }
@@ -934,6 +1097,7 @@
                     $("#endtime").removeClass("timeSelect");
                     $("#starttime").removeClass("timeSelect");
                     $(".dateMake").css({"color":"#000"});
+                    $(".dateMake").removeClass('chooseTimebox')
                     $(".chooseTime > i").css("color","#888");
                     $(".chooseTime ul li").removeClass('active');
                     $(".chooseTime ul li:eq(0)").addClass('active');
@@ -975,10 +1139,12 @@
                     $("#starttime").addClass("timeSelect");
                     $("#endtime").addClass("timeSelect");
                     $(".dateMake").css({"color":"#24C0D7"});
+                    $(".dateMake").addClass('chooseTimebox')
                     $(".chooseTime ul li").removeClass('active');
 
                     $(".confirm").hide();
                     $(".resetOne").show();
+                    // localStorage.removeItem("date"); // 重新选择日期不在移除date 重新访问页面以提交的时间为准回显
                     localStorage.removeItem("date");
                     localStorage.removeItem("index");
                 }
@@ -997,6 +1163,7 @@
                     $("#endtime").removeClass("timeSelect");
                     $("#starttime").removeClass("timeSelect");
                     $(".dateMake").css({"color":"#000"});
+                    $(".dateMake").removeClass('chooseTimebox')
                     $(".chooseTime > i").css("color","#888");
                     $(".chooseTime ul li").removeClass('active');
                     $(".chooseTime ul li:eq(0)").addClass('active');
@@ -1018,6 +1185,7 @@
             $("#starttime").addClass("timeSelect");
             $("#endtime").addClass("timeSelect");
             $(".dateMake").css({"color":"#24C0D7"});
+            $(".dateMake").addClass('chooseTimebox')
             $(".chooseTime ul li").removeClass('active');
             $(".confirm").hide();
             $(".resetOne").css('display','flex');
@@ -1035,6 +1203,7 @@
             $("#starttime").addClass("timeSelect");
             $("#endtime").addClass("timeSelect");
             $(".dateMake").css({"color":"#24C0D7"});
+            $(".dateMake").addClass('chooseTimebox')
             $(".chooseTime ul li").removeClass('active');
             $(".confirm").hide();
             $(".resetOne").css('display','flex');
@@ -1046,6 +1215,7 @@
         }
         //
         if(localStorage.date!==undefined && localStorage.date!==""){
+            // localStorage.setItem('index','-1') // 存在提交的date直接回显时间至具体时间组件
             if(localStorage.index !== "-1"){
                 $(".chooseTime ul li.active").removeClass("active");
                 $(".chooseTime ul li").eq(localStorage.index).addClass("active");
@@ -1082,6 +1252,7 @@
                     $("#starttime").addClass("timeSelect");
                     $("#endtime").addClass("timeSelect");
                     $(".dateMake").css({"color":"#24C0D7"});
+                    $(".dateMake").addClass('chooseTimebox')
                     $(".chooseTime ul li").removeClass('active');
                 }
             }
@@ -1093,6 +1264,17 @@
             sessionStorage.removeItem("keyWord");
             sessionStorage.IOSsession = "";
         }
+        $(".screeningCondition .sc-btn").on('click', function () { // 跳转至保存筛选列表页
+            if($('.sc-num').text()=='0'){
+            return
+        }
+        sessionStorage.setItem('goScreen','1');
+         window.location.href = "/jy_mobile/search/filter-history/bidding?from=dataExport";
+       })
+       $(".screeningCondition .sc-icon").on('click', function () { // 调起说明弹框
+        checkboxVm.showDialog({title:'已存筛选说明', message:'数据导出后,会将历史筛选条件保存在已存筛选中。您可从已存筛选中直接选择并使用。'})
+         
+       })
         //
         //筛选条件发送
         $(".saveData").on('click', function () {
@@ -1111,6 +1293,8 @@
             var selectType = "";
             var date = getDate();
 			var comeinfrom = "";
+            var prvinceArr = [];
+            var areaArr = [];
             localStorage.date = date;
             localStorage.removeItem("export_starttime");
             localStorage.removeItem("export_endtime");
@@ -1121,6 +1305,16 @@
             if(localStorage.province!==undefined&&localStorage.province!==""){
                 province = localStorage.province;
             }
+            prvinceArr = province.split(",");
+             areaArr =area.split(" ");
+              
+             let result_city = areaArr.filter(function(item) { // 筛选出未全选的省中的市
+              return !prvinceArr.includes(item);
+             });
+             result_city = result_city.join(",");
+             if(result_city == '全国'){
+                result_city=''
+             }
             if(localStorage.city!==undefined&&localStorage.city!==""){
                 city = localStorage.city;
             }
@@ -1223,7 +1417,7 @@
                     "date":date,
                     "area":area,
                     "province": province,
-                    "city":city,
+                    "city":result_city,
                     "industry":industry,
                     "buyerclass": buyclass,
                     "keyWord":keyWord,
@@ -1245,6 +1439,7 @@
                       if(data._id!==""){
                         // /front/wx_dataExport/submitOrder
                         // window.location.href="/jy_mobile/common/order/create/dataexport?id="+data._id+"&source=d&dataspec="+data_spec;
+                        sessionStorage.setItem('goScreen','1'); // 储存参数 返回页面不使用接口回显使用已存本地存储
                         window.location.href = "/jy_mobile/dataexport/limitpreview/" + data._id + '?type=senior';
                       }
                     }
@@ -1292,6 +1487,7 @@
             $("#starttime").removeClass("timeSelect");
             $("#endtime").removeClass("timeSelect");
             $(".dateMake").css({"color":"#888"});
+            $(".dateMake").removeClass('chooseTimebox')
             $("#starttime").val("");
             $("#endtime").val("");
             //
@@ -1309,6 +1505,7 @@
           r = null;
           return context == null || context == "" || context == "undefined" ? "" : context;
         }
+
         //
         function getDate() {
             var start;
@@ -1391,6 +1588,16 @@
         mounted() {
         },
         methods: {
+            showDialog ({title,message}){
+                this.$dialog({
+                    className:'msgDialog',
+                    title: title,
+                    message: message,
+                    messageAlign:'left',
+                    confirmButtonText: '我知道了',
+                    confirmButtonColor: '#2ABED1'
+                })
+            },
             open_(str){
                 this.list=[
                     {name:'标题',val:false},
@@ -1466,6 +1673,100 @@
         }
       })
     })
+    function selectType_dispose(selectType) {
+            let select = [];
+            if (selectType) {
+                let titleNum = 0
+            selectType.split(',').forEach((v) => {
+        if (v === 'title') {
+          titleNum++
+        }
+      })
+      if(selectType.indexOf("detail") !== -1){
+        if (titleNum > 1) {
+           select.push('标题') 
+         }
+      }else{
+        if (titleNum > 0) {
+           select.push('标题') 
+         }
+      }
+    if (selectType.indexOf("title") !== -1 && selectType.indexOf("detail") !== -1) {
+       select.push('正文')
+    }
+    if (selectType.indexOf("filetext") !== -1) {
+      select.push('附件')
+    }
+    if (selectType.indexOf('purchasing') !== -1 && selectType.indexOf('projectname.pname')) {
+      select.push('项目名称/标的物')
+    }
+    return select.toString()
+    }else{
+      return ''
+    }
+    }
+    function getCitiesFromJSONMap(provinceName) {
+      var temp = null
+      let arr =[]
+      for (var i = 0; i < chinaMapJSON.length; i++) {
+        var findThis = chinaMapJSON[i].name.indexOf(provinceName) !== -1
+        // 如果找到了,就不再循环后面的了
+        if (findThis) {
+          temp = chinaMapJSON[i]
+          break
+        }
+      }
+      temp.city.forEach(function (c) {
+        if(c.name.indexOf('北京') == -1&&c.name.indexOf('上海') == -1&&c.name.indexOf('重庆') == -1&&c.name.indexOf('天津') == -1&&c.name.indexOf('澳门') == -1&&c.name.indexOf('香港') == -1){
+          arr.push(c.name)   
+        }
+               
+       })
+       return arr
+    }
+    function getArea_city(arr) {
+      let obj = {}
+      let haveVal = {}
+      chinaMapJSON.forEach(p => {
+        obj[p.name] = []
+        p.city.forEach(c => {
+          arr.forEach(ele => {
+            if (c.name == ele) {
+              obj[p.name].push(c.name)
+            }
+          })
+        })
+      })
+       console.log(obj)
+       for(let key in obj){
+        if(obj[key].length>0){
+          haveVal[key] = obj[key]
+        }
+       }
+      let str = ""
+      for(let key in haveVal){
+        str += key + '('
+        for(let i=0;i<haveVal[key].length;i++){
+          str += haveVal[key][i]
+          if(i==haveVal[key].length-1){
+            str += ')、'
+          }else{
+            str += '、'
+          }
+        }
+      }
+      str =  str.replace(/省/g, "")
+      str =  str.replace(/维吾尔自治区/g, "")
+      str =  str.replace(/壮族自治区/g, "")
+      str =  str.replace(/自治区/g, "")
+      str =  str.replace(/回族自治区/g, "")
+      return str
+    }
+    function goChoosedetail(url){
+      sessionStorage.setItem('goScreen','1');
+      window.location.href=url;
+            
+    }
 </script>
 	{{include "/common/baiducc.html"}}
 </body>

+ 8 - 1
src/web/templates/weixin/dataExport/dataExport_buyerEdit.html

@@ -10,6 +10,7 @@
 	<link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/weui.min.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/keyWord.css?v={{Msg "seo" "version"}}5">
+	<link rel="stylesheet"href='{{Msg "seo" "cdn"}}/common-module/dataExport/css/association.css?v={{Msg "seo" "version"}}'/>
 	<script src="{{Msg "seo" "cdn"}}/wx_dataExport/js/rem.js"></script>
 	{{include "/common/weixin.html"}}
 	<script src="{{Msg "seo" "cdn"}}/wxswordfish/share.js?v={{Msg "seo" "version"}}"></script>
@@ -40,7 +41,7 @@
 <div class="keyWord">
 	<div class="enter addkeyWord">
 		<input type="text" class="enterOne" placeholder="采购单位名称" />
-		<div class="btn">
+		<div class="btn fixed-bottom">
 			<button disabled class="save-btn">确认</button>
 			<button class="close">取消</button>
 		</div>
@@ -54,6 +55,10 @@
 		</ul>
 
 	</div>
+	<div class="association-list-box" style="display: none;">
+		<ul class="association-list">
+		</ul>
+	</div>
 </div>
 <div class="addKeyWord">
 	<i class="iconfont icon-tianjia"></i>
@@ -100,6 +105,8 @@
 	}
 
 </script>
+<script src="{{Msg "seo" "cdn"}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}"></script>
+<script src="{{Msg "seo" "cdn"}}/common-module/dataExport/js/association.js?v={{Msg "seo" "version"}}"></script>
 
 	{{include "/common/baiducc.html"}}
 </body>

+ 8 - 1
src/web/templates/weixin/dataExport/dataExport_buyerInput.html

@@ -10,9 +10,11 @@
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/weui.min.css?v={{Msg "seo" "version"}}">
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/keyWord.css?v={{Msg "seo" "version"}}3">
+    <link rel="stylesheet"href='{{Msg "seo" "cdn"}}/common-module/dataExport/css/association.css?v={{Msg "seo" "version"}}'/>
     <script src="{{Msg "seo" "cdn"}}/wx_dataExport/js/rem.js"></script>
     {{include "/common/weixin.html"}}
     <script src="{{Msg "seo" "cdn"}}/wxswordfish/share.js?v={{Msg "seo" "version"}}"></script>
+    <script src="{{Msg "seo" "cdn"}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}"></script>
     </head>
     <style>
         .keyWord .addKeyWord {
@@ -34,7 +36,7 @@
     <div class="keyWord">
         <div class="enter addkeyWord">
         <input type="text" class="enterOne" placeholder="采购单位名称" />
-        <div class="btn">
+        <div class="btn fixed-bottom">
         <button disabled class="save-btn">确认</button>
         <button class="close">取消</button>
         </div>
@@ -51,6 +53,10 @@
         <i class="iconfont icon-tianjia"></i>
         </div>
         </div>
+        <div class="association-list-box" style="display: none;">
+            <ul class="association-list">
+            </ul>
+        </div>
         </div>
         <script src="https://cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js"></script>
     <script src="{{Msg "seo" "cdn"}}/wx_dataExport/js/weui.min.js"></script>
@@ -121,6 +127,7 @@
         })
 
     </script>
+    <script src="{{Msg "seo" "cdn"}}/common-module/dataExport/js/association.js?v={{Msg "seo" "version"}}"></script>
 
 	{{include "/common/baiducc.html"}}
 </body>

+ 9 - 2
src/web/templates/weixin/dataExport/dataExport_winnerEdit.html

@@ -11,8 +11,11 @@
 	<link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/weui.min.css?v={{Msg "seo" "version"}}">
 	<link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/keyWord.css?v={{Msg "seo" "version"}}4">
+	<link rel="stylesheet"href='{{Msg "seo" "cdn"}}/common-module/dataExport/css/association.css?v={{Msg "seo" "version"}}'/>
 	{{include "/common/weixin.html"}}
+	<script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
 	<script src="{{Msg "seo" "cdn"}}/wxswordfish/share.js?v={{Msg "seo" "version"}}"></script>
+	<script src="{{Msg "seo" "cdn"}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}"></script>
 	</head>
 	<style>
 		.addKeyWord i {
@@ -38,7 +41,7 @@
 	<div class="keyWord">
 		<div class="enter addkeyWord">
 			<input type="text" class="enterOne" placeholder="中标单位名称" />
-			<div class="btn">
+			<div class="btn fixed-bottom">
 				<button class="save-btn" disabled>确认</button>
 				<button class="close">取消</button>
 			</div>
@@ -50,7 +53,10 @@
 			</ul>
 
 		</div>
-
+		<div class="association-list-box" style="display: none;">
+			<ul class="association-list">
+			</ul>
+		</div>
 	</div>
 	<div class="addKeyWord">
 		<i class="iconfont icon-tianjia"></i>
@@ -282,6 +288,7 @@
 		})
 
 	</script>
+	<script src="{{Msg "seo" "cdn"}}/common-module/dataExport/js/association.js?v={{Msg "seo" "version"}}"></script>
 	{{include "/common/baiducc.html"}}
 	</body>
 

+ 9 - 2
src/web/templates/weixin/dataExport/dataExport_winnerInput.html

@@ -10,9 +10,12 @@
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/iconfont/iconfont.css?v={{Msg "seo" "version"}}">
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/weui.min.css?v={{Msg "seo" "version"}}">
     <link rel="stylesheet" href="{{Msg "seo" "cdn"}}/wx_dataExport/css/keyWord.css?v={{Msg "seo" "version"}}4">
+    <link rel="stylesheet"href='{{Msg "seo" "cdn"}}/common-module/dataExport/css/association.css?v={{Msg "seo" "version"}}'/>
     <script src="{{Msg "seo" "cdn"}}/wx_dataExport/js/rem.js?v={{Msg "seo" "version"}}"></script>
     {{include "/common/weixin.html"}}
     <script src="{{Msg "seo" "cdn"}}/wxswordfish/share.js?v={{Msg "seo" "version"}}"></script>
+    <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
+    <script src="{{Msg "seo" "cdn"}}/common-module/public/js/utils.js?v={{Msg "seo" "version"}}"></script>
     </head>
     <style>
         .keyWord .addKeyWord {
@@ -33,7 +36,7 @@
     <div class="keyWord">
         <div class="enter addkeyWord">
         <input type="text" class="enterOne" placeholder="中标单位名称" />
-        <div class="btn">
+        <div class="btn fixed-bottom">
         <button class="save-btn" disabled>确认</button>
         <button class="close">取消</button>
     </div>
@@ -50,7 +53,10 @@
         </div>
 
         </div>
-
+        <div class="association-list-box" style="display: none;">
+            <ul class="association-list">
+            </ul>
+        </div>
         </div>
         <script src="https://cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js"></script>
     <script src="{{Msg "seo" "cdn"}}/wx_dataExport/js/weui.min.js?v={{Msg "seo" "version"}}"></script>
@@ -124,6 +130,7 @@
         })
 
     </script>
+     <script src="{{Msg "seo" "cdn"}}/common-module/dataExport/js/association.js?v={{Msg "seo" "version"}}"></script>
 	{{include "/common/baiducc.html"}}
     </body>
 

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.