Browse Source

Merge branch 'master' into feature/v4.8.96

lianbingjie 1 year ago
parent
commit
b180c08056
34 changed files with 1302 additions and 223 deletions
  1. 1 1
      src/go.mod
  2. 2 2
      src/go.sum
  3. 2 2
      src/jfw/modules/app/src/go.mod
  4. 4 4
      src/jfw/modules/app/src/go.sum
  5. 20 0
      src/jfw/modules/app/src/web/templates/big-member/area_three_mobile.html
  6. 301 86
      src/jfw/modules/app/src/web/templates/big-member/page_forecast_list.html
  7. 2 1
      src/jfw/modules/bigmember/src/config.json
  8. 1 0
      src/jfw/modules/bigmember/src/config/config.go
  9. 2 0
      src/jfw/modules/bigmember/src/service/analysis/analysis.go
  10. 395 61
      src/jfw/modules/bigmember/src/service/analysis/forecastproject.go
  11. 8 0
      src/jfw/modules/bigmember/src/util/view.go
  12. 2 2
      src/jfw/modules/publicapply/src/go.mod
  13. 4 4
      src/jfw/modules/publicapply/src/go.sum
  14. 3 4
      src/jfw/modules/subscribepay/src/config.json
  15. 1 0
      src/jfw/modules/subscribepay/src/dataexport.json
  16. 4 0
      src/jfw/modules/subscribepay/src/entity/equityActive.go
  17. 3 3
      src/jfw/modules/subscribepay/src/go.mod
  18. 4 4
      src/jfw/modules/subscribepay/src/go.sum
  19. 87 0
      src/web/staticres/common-module/collection/css/area-three-mobile.css
  20. 206 0
      src/web/staticres/common-module/collection/js/area-three-mobile.js
  21. 13 7
      src/web/staticres/common-module/collection/js/date-mobile.js
  22. 15 0
      src/web/staticres/common-module/vipsubscribe/css/sidebar-selector-ui-template.css
  23. 94 8
      src/web/staticres/common-module/vipsubscribe/js/area-three-sidebar-template.js
  24. 11 7
      src/web/staticres/course/css/order_list.css
  25. 85 10
      src/web/staticres/js/selector/area-city-country.js
  26. 0 0
      src/web/staticres/js/selector/area-city-country.min.js
  27. 1 1
      src/web/templates/frontRouter/pc/messageCenter/sess/index.html
  28. 1 1
      src/web/templates/pc/createOrderPage.html
  29. 5 2
      src/web/templates/pc/dataExport_sieve.html
  30. 1 1
      src/web/templates/pc/dataPack/createOrderForDataPackage.html
  31. 3 3
      src/web/templates/pc/messageDetail.html
  32. 17 7
      src/web/templates/pc/orderDetail.html
  33. 1 0
      src/web/templates/pc/previewData.html
  34. 3 2
      src/web/templates/pc/supsearch.html

+ 1 - 1
src/go.mod

@@ -6,7 +6,7 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230308011651-df591d32df88
 	app.yhyue.com/moapp/jybase v0.0.0-20231116061739-cd852201a8f4
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.1.9
+	app.yhyue.com/moapp/jypkg v1.10.2
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.15-0.20230925060020-8e4db0f1e13e
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/bwmarrin/snowflake v0.3.0

+ 2 - 2
src/go.sum

@@ -9,8 +9,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20231116061739-cd852201a8f4 h1:qfqQL2GJV3N31DF
 app.yhyue.com/moapp/jybase v0.0.0-20231116061739-cd852201a8f4/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.1.9 h1:NRm/vfmoGhZ48YGqjut8CMhtw6fL0Pai031fMi+GApg=
-app.yhyue.com/moapp/jypkg v1.1.9/go.mod h1:j8v5+elGJ14UxJvofhqa+XLy6Ppb3hkLHdDcMsAmWEU=
+app.yhyue.com/moapp/jypkg v1.10.2 h1:ycfFGV/VMb3huhvLgCjI5xIg8cGnt/Zdj+w993KhnbY=
+app.yhyue.com/moapp/jypkg v1.10.2/go.mod h1:j8v5+elGJ14UxJvofhqa+XLy6Ppb3hkLHdDcMsAmWEU=
 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=

+ 2 - 2
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.1.7
+	app.yhyue.com/moapp/jypkg v1.10.2
 	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
@@ -18,7 +18,7 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 // indirect
 	app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae // indirect
 	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e // indirect
-	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d // indirect
+	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822 // indirect
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.8 // indirect
 	github.com/BurntSushi/toml v1.1.0 // indirect
 	github.com/RoaringBitmap/roaring v1.5.0 // indirect

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

@@ -9,14 +9,14 @@ 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.1.7 h1:msXjcVazmiUnlarqpUEnK4nA1iGCbpds8NYeefY6YL4=
-app.yhyue.com/moapp/jypkg v1.1.7/go.mod h1:sMZxJOsD3STWGY04aDhUtRD+1u5nqhQpdDdpSW3JC1Y=
+app.yhyue.com/moapp/jypkg v1.10.2 h1:ycfFGV/VMb3huhvLgCjI5xIg8cGnt/Zdj+w993KhnbY=
+app.yhyue.com/moapp/jypkg v1.10.2/go.mod h1:j8v5+elGJ14UxJvofhqa+XLy6Ppb3hkLHdDcMsAmWEU=
 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=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e/go.mod h1:7Xhygw0KBuL4h0G76FnFg4otQcA9bmOO0c8M0FCjAyQ=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d h1:x17+SAYxlBChNWn2IS2eDWZlhZrxtgEWjlb1JF0946E=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d/go.mod h1:rCCaOSWBYfQabf/yIvSVheSPtN2THnHeTl2J5/RrcuU=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822 h1:wSSygQd/AppmJCSEu+TXtmmIqVU18X0psEqU3VKEavI=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822/go.mod h1:rCCaOSWBYfQabf/yIvSVheSPtN2THnHeTl2J5/RrcuU=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.8 h1:14Yxzutsej7LQe3jnN61wuRX9qjAZ4FtdWMA27ewQ3w=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.8/go.mod h1:rRiGzKG4F/fmkNxXQCxrkxNWc8yf1SmW8qWCKfGIQSM=
 bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.15-0.20230925060020-8e4db0f1e13e h1:bncHHkJLqiDW1ZN6MVe+3bj3i0LxWgFkfqge6Gk7lB4=

+ 20 - 0
src/jfw/modules/app/src/web/templates/big-member/area_three_mobile.html

@@ -0,0 +1,20 @@
+<!-- s-地区三级选择框css-->
+<link rel="stylesheet" type="text/css"
+      href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/css/sidebar-selector-ui-template.css?v={{Msg "seo" "version"}}'>
+<link rel="stylesheet" type="text/css"
+      href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/css/area-three-sidebar-template.css?v={{Msg "seo" "version"}}'>
+<link rel="stylesheet" rel="stylesheet" type="text/css"
+      href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/area-three-mobile.css?v={{Msg "seo" "version"}}'>
+<!-- e-地区三级选择框css-->
+
+<!-- 需要结合vant、vue使用-->
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/utils.js'></script>
+<!-- s-地区三级选择需要以下js-->
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/js/china-map-data.js?v={{Msg "seo" "version"}}'></script>
+<!-- 地区三级选择框模板js-->
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/js/sidebar-selector-ui-template.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/vipsubscribe/js/area-three-sidebar-template.js?v={{Msg "seo" "version"}}'></script>
+<script  src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/area-three-mobile.js?v={{Msg "seo" "version"}}'></script>
+<!-- e-地区三级选择需要以下js-->
+
+

+ 301 - 86
src/jfw/modules/app/src/web/templates/big-member/page_forecast_list.html

@@ -15,8 +15,9 @@
     <link rel="stylesheet" href=//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css />
     <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='{{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/mainSearch/css/j-icons.css?v={{Msg "seo" "version"}}' />
+    <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/css/index.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资源-->
 
     <!--小于100行的样式插入html而不是css,有助于减少请求数-->
@@ -37,7 +38,7 @@
         }
 
         .van-steps--vertical {
-            padding: .2rem 0 0 .8rem;
+            padding: 0 0 0 .8rem;
         }
 
         .van-step--vertical {
@@ -122,7 +123,12 @@
             align-items: center;
             padding-top: 0.8rem;
         }
-
+        .empty-img.working {
+            width: 3rem;
+            height: 3rem;
+            padding: 0;
+            margin-bottom: 0;
+        }
         .empty-img.noData {
             width: 4rem;
             height: 4rem;
@@ -218,13 +224,26 @@
             border-bottom: 1px solid #0000000D;
             padding-bottom: 0.08rem;
         }
-
+        .analysis-tab .van-tab{
+            color: #5F5E64 !important;
+            font-size: .28rem;
+        }
+        .analysis-tab .van-tab.van-tab--active{
+            color: #2ABED1 !important;
+        }
+        /*时间选择框*/
+        .timebox.collection .dateTags {
+            height: unset;
+            padding: 0 0.36rem 0;
+            overflow: visible;
+            display: block;
+        }
         .collection .dateTags .customTime {
             display: none;
         }
 
         .timebox.collection .timeTag {
-            padding: 0.32rem 0 0.3rem 0;
+            padding: 0.32rem 0 .24rem;
         }
 
         .timebox.collection .timeTag .area-card-item {
@@ -236,51 +255,81 @@
             height: auto;
             line-height: 0.4rem;
         }
-
+        .timebox.collection .van-dropdown-menu__item {
+            width: 50% !important;
+        }
+        .timebox.collection .van-dropdown-menu__title{
+            color: #5F5E64 !important;
+            font-size: .28rem;
+            line-height: .4rem;
+        }
+        .timebox.collection .van-dropdown-menu__title.van-dropdown-menu__title--active {
+            color: #2ABED1 !important;
+        }
+        .timebox.collection .timePicker {
+            min-width: 6.84rem;
+            padding: 0.16rem;
+            position: relative;
+            border-radius: 0.08rem;
+        }
         .timebox.collection .timePicker .van-cell.van-field {
-            width: 2.4rem;
-            height: 0.64rem;
+            width: 2.96rem;
+            height: 0.72rem;
             box-sizing: border-box;
-            padding: 0.12rem 0.26rem;
+            padding: 0.16rem 0.38rem;
+            border-radius: 0.08rem;
         }
-
         .timebox.collection .timePicker.clickactive .van-cell.van-field {
             border-color: #2abed1;
         }
-
-        .timebox.collection .timePicker.clickactive {
-            background-color: inherit;
-        }
-
-        .timebox.collection .dateTags .van-field__control {
-            font-size: 0.24rem;
+        .timebox.collection .timePicker.selectedActive{
+            background: #E8FAFD;
+            background-size: auto;
         }
-
-        .timebox.collection .timePicker {
-            padding: 0 0 0.3rem 0;
-            height: auto;
-            min-width: 5.36rem;
-            position: relative;
-            left: -1.2rem
+        .timebox.collection .timePicker.selectedActive::after{
+            content: "";
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAHHSURBVHgB7ZS/TsJQFMa/tkpIVEIMCRodIMQEZYGBB8An8AWMuOqgbm46uqFPIImzCS9gqrMDYhxYNAwODiQi/iMEe72nUkJJbe/FwuQ33Z57en49t+d+wL98VEovp1WMSUm9sgGm6grGIIKpDEVaj7zDFb1yYMFII+2QYGA47I+NDJjSbwuMsd3BuO/AtF4Ot6EVwFjead9XoAnjk0jL33J8A3JYrAuLueX5AhSF+QKUgf0ZSFZF7sGAsOg7Q198y6pkYEMDl/XKDrmHG2x9MYLz7BKS00FbXIOkyD0UhiO3nO1YFHuJeUQCk6i3O7huvPf2pDp0sion2FY8aq6rb584e6zb9oU7JKvisP1seMqctNeO4QnLlx943pctx3NK+62KYMVMwiySL9/zoi0pGEn1hNEd6/oiAZq8yMyEZoKtgRCF8e5uFBeY44UmyCmHhTiUil7UX7A2N+sJIzGGE0UG5gS15AUjGYoRV2VhP8Vb2OT/sNktLgKDohSruUzN1qGsVS0EA1iNhFB6enaHATXeXc4GJKvSGI5lrUpAPRg9mEcqYlVDiR/jh2JkLJgZEnEP4fpAg390jU/jlaYapbtc5nIw5xuaNAINUmtJBQAAAABJRU5ErkJggg==) no-repeat;
+            width: .28rem;
+            height: .28rem;
+            background-size: 100% 100%;
         }
-
         .timebox.collection .timeTag .area-card-item.active::after {
             display: none;
         }
-
         .timebox.collection .timePicker.clickactive::after {
             display: none;
         }
-
-        .timebox.collection .j-footer {
-            display: none;
+        .date-selector .j-footer {
+            margin-top: 2.52rem;
+            border-top: 1px solid rgba(0, 0, 0, 0.05);
         }
-
-        .timebox.collection .dateTags {
-            height: unset;
-            padding: 0 0 0 0.32rem;
-            overflow: visible;
-            display: block;
+        .timebox.collection .j-footer button{
+            border-radius: 0.08rem;
+        }
+        .export-row {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 0.24rem 0.32rem 0.16rem 0.32rem;
+            color:  #686868;
+            font-size: 0.28rem;
+            background: #f5f6f7;
+            margin-left:-0.8rem;
+            line-height: .44rem;
+        }
+        .export-row .highlight{
+            color: #2ABED1;
+        }
+        .export-row .export {
+            display: flex;
+            align-items: center;
+        }
+        .icon-download{
+            width: .32rem;
+            height: .32rem;
         }
     </style>
 
@@ -298,14 +347,26 @@
                     :color="tabConf.color" @change="tabChange" v-model="tabActiveName">
                     <van-tab v-for="(tab, index) in tabList" :key="index" :title="tab.label" :name="tab.name"></van-tab>
                 </van-tabs>
-                <div class="timebox collection" v-show = "tabActiveName == 'fwl'">
-                    <div class="cell-title">合同到期时间</div>
-                    <date-component ref="dateSelector" popup-container="body" :diy="true" :times="timeOptions"
-                        @confirm="confirm"></date-component>
+                <div class="timebox collection" v-show="tabActiveName == 'fwl'">
+                    <van-dropdown-menu ref="dropdownRef" :close-on-click-overlay="false" :close-on-click-outside="false">
+                        <van-dropdown-item title="合同到期时间" @opened="openDateDropdown"  ref="dateDropdownRef" class="date-selector">
+                            <date-component ref="dateSelector" popup-container="body" :diy="false" :times="timeOptions" @confirm="dateConfirm" @cancel="dateCancel"></date-component>
+                        </van-dropdown-item>
+                        <van-dropdown-item title="项目地区" @opened="openAreaDropdown" ref="areaDropdownRef" class="area-selector">
+                            <area-three-component  ref="areaSelector" :filter-area-obj="subscribeArea" :can-empty-select="true" @confirm="areaConfirm"></area-three-component>
+                        </van-dropdown-item>
+                    </van-dropdown-menu>
                 </div>
             </div>
             <div class="steps" v-if="list.length && list.length > 0">
                 <van-steps direction="vertical" :active="0">
+                    <div class="export-row" v-if="tabActiveName === 'fwl'">
+                        <span>搜索到<em class="highlight">${totalCount}</em>条信息</span>
+                        <span class="export highlight" @click="dataExport">
+                            <i class="j-icon base-icon icon-download"></i>
+                            <em>数据导出</em>
+                        </span>
+                    </div>
                     <van-list v-model="loading" :finished="finished" :immediate-check="false" finished-text="没有更多了"
                         @load="onLoad" :offset="50">
                         <van-step v-for="item in list" :key="item.id">
@@ -341,15 +402,24 @@
                 </div>
             </div>
             <div class="empty" v-else>
-                <img class="empty-img noData" src="/jyapp/big-member/image/noData.png" alt="" />
-                <div v-show="set.notKey" style="text-align: center;">
-                    <p class="empty-tip">暂无设置订阅关键词,无法进行预测</p>
-                    <a class="link-btn" @click="goSetting" href="javascript:;" v-show="isSubCount">去设置</a>
-                </div>
-                <div v-show="set.notList">
-                    <p class="empty-tip">暂未预测出潜在项目</p>
+                <img class="empty-img working" v-if="loading" src="/jyapp/big-member/image/working.gif" alt="" />
+                <img class="empty-img noData"  v-else src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/public/image/jy-cry.png' alt="" />
+                <div v-if="finished">
+                    <div v-show="set.notKey" style="text-align: center;">
+                        <p class="empty-tip">暂未设置订阅关键词,无法进行预测</p>
+                        <a class="link-btn" @click="goSetting" href="javascript:;" v-show="isSubCount">去设置</a>
+                    </div>
+                    <div v-show="set.notList">
+                        <p class="empty-tip">您设置的订阅关键词无法进行预测</p>
+                        <a class="link-btn" @click="goSetting" href="javascript:;" v-show="isSubCount">前往订阅设置</a>
+                    </div>
+                    <div v-show="set.noData" style="text-align: center;">
+                        <p class="empty-tip">当前筛选条件下结果为空</p>
+                        <a class="link-btn" @click="resetQuery" href="javascript:;" >重置筛选条件</a>
+                    </div>
                 </div>
             </div>
+            <popup-data-export ref="popup_dataExport" @next="next_export"></popup-data-export>
         </div>
     </div>
 
@@ -366,8 +436,10 @@
     <script src=//cdn-common.jianyu360.com/cdn/lib/vue/2.6.11/vue.min.js></script>
     <script src=//cdn-common.jianyu360.com/cdn/lib/vant/2.12.24/lib/vant.min.js></script>
     <script src=//cdn-common.jianyu360.com/cdn/lib/zepto/1.2.0/zepto.min.js></script>
-    <script
-        src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/date-mobile.js?v={{Msg "seo" "version"}}'></script>
+    <script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/collection/js/date-mobile.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 "/big-member/area_three_mobile.html"}}
     <!--E-当前页面的资源-->
     {{include "/big-member/commonjs.html"}}
     <!--小于100行同css,减少请求数-->
@@ -377,6 +449,7 @@
             el: '#forecast-list',
             components: {
                 dateComponent: dateComponent,
+                areaThreeComponent: areaThreeComponent
             },
             data: {
                 isSet: true,
@@ -385,8 +458,12 @@
                     hasListNotKey: false,
                     notList: false,
                     notKey: false,
+                    noData: false, // 无数据
                 },
                 list: [],
+                allSearchTotal: 0, // 进页面默认全部筛选时记录的total,用于传给服务端判断无数据的code返回
+                totalCount: 0,
+                distinctCount: 0, // 数据导出的标讯数量
                 page: 1,
                 loading: false,
                 finished: false,
@@ -424,7 +501,18 @@
                 startTime: '',
                 endTime: '',
                 dataType: 'fwl',
-                exact : 'all'
+                exact : 'all',
+                selectArea: '',
+              options: [
+                { text: '全部商品', value: 0 },
+                { text: '新款商品', value: 1 },
+                { text: '活动商品', value: 2 },
+              ],
+              value: 0,
+              switch1: false,
+              switch2: false,
+              // 订阅的省份
+              subscribeArea: {}
             },
             created() {
                 let that = this
@@ -432,6 +520,8 @@
                 if (pData) {
                     this.isSet = pData.isSet;
                     this.scrollTop = pData.scrollTop;
+                    this.totalCount = pData.totalCount;
+                    this.distinctCount = pData.distinctCount;
                     this.set = pData.set;
                     this.list = pData.list;
                     this.page = pData.page;
@@ -442,17 +532,13 @@
                     this.tabActiveName = pData.tabActiveName
                     this.startTime = pData.startTime
                     this.endTime = pData.endTime
-                    this.$nextTick(function(){
-                        if(that.exact){
-                            that.$refs.dateSelector.setState({exact:that.exact})
-                        }else{
-                            that.$refs.dateSelector.setState({startDate:parseInt(that.startTime*1000),endDate:parseInt(that.endTime*1000),exact:'exact'})
-                        }
-                    })
-                    
+                    this.exact = pData.exact
+                    this.selectArea = pData.selectArea
+                    this.allSearchTotal = pData.allSearchTotal
                 } else {
                     this.getList()
                 }
+                this.getSubscribeArea()
             },
             mounted() {
                 sessionStorage.removeItem('forecast_keys')
@@ -460,7 +546,6 @@
                 if (_this.scrollTop != 0) {
                     setTimeout(function () {
                         $('.van-steps').scrollTop(_this.scrollTop)
-                        console.log($('.van-steps').scrollTop())
                         sessionStorage.removeItem('$data-forecast_list')
                     }, 50)
                 }
@@ -468,33 +553,56 @@
             methods: {
                 onLoad: function () {
                     var that = this;
+                    that.page++;
                     setTimeout(function () {
                         // that.loading = true;
                         that.getList();
                     }, 500)
                 },
                 getList: function () {
+                    if(sessionStorage.getItem('$data-forecast_list')) {
+                      sessionStorage.removeItem('$data-forecast_list')
+                    }
                     var that = this;
+                    var searchAll = that.dataType==='fwl' && !that.startTime && !that.endTime && !that.selectArea
+                    that.loading = true
+                    that.resetSet()
+                    var searchParams = {
+                      pageNum: that.page,
+                      dataType: that.dataType,
+                      startTime: that.startTime,
+                      endTime: that.endTime,
+                      area: that.selectArea,
+                    }
+                    if(that.dataType==='fwl' && (that.startTime || that.endTime || that.selectArea)) {
+                      searchParams.total = that.allSearchTotal
+                    }
                     $.ajax({
                         type: 'POST',
                         url: '/bigmember/forecast/forPList?t=' + new Date().getTime(),
-                        data: {
-                            pageNum: that.page, dataType: that.dataType, startTime: that.startTime, endTime: that.endTime
-                        },
+                        data:searchParams,
                         success: function (res) {
-                            console.log(res)
+                          that.loading = false;
                             if (res.error_code == 0) {
                                 that.isSubCount = !res.data.isSubCount
-                                if (res.data.code === 1 && (!res.data.list || res.data.list.length == 0)) {
+                                if (res.data.code === 1) {
                                     // 暂无设置订阅关键词,无法进行预测
                                     that.set.notKey = true;
                                 } else if (res.data.code === 2) {
                                     // 您设置的订阅关键词无法进行预测
                                     that.set.notList = true
+                                } else if(res.data.code === 3) {
+                                  // 当前筛选条件下结果为空
+                                  that.set.noData = true
                                 } else if (res.data.code === 1 && res.data.list.length && res.data.list.length > 0) {
                                     that.set.hasListNotKey = true;
                                 }
-
+                                that.totalCount = res.data.count || 0
+                                that.distinctCount = res.data.distinctCount || 0
+                                // 默认筛选全部的时候,记录当前总数(服务端需要参数)
+                                if(that.dataType==='fwl' && !that.startTime && !that.endTime && !that.selectArea) {
+                                  that.allSearchTotal = res.data.count || 0
+                                }
                                 if (res.data.list) {
                                     that.loading = false;
                                     res.data.list.forEach(function (v, i) {
@@ -506,7 +614,6 @@
                                         }
                                     })
                                     that.list = that.list.concat(res.data.list);
-                                    that.page++;
                                     if ($.isArray(res.data.list) && res.data.list.length != 0) {
                                         console.log('有数据')
                                     } else {
@@ -523,46 +630,155 @@
                             }
                         },
                         error: function (err) {
-                            console.log(err)
+                          that.loading = false;
+                          console.log(err)
                         }
                     })
                 },
+              resetSet () {
+               this.set.notKey = false
+                this.set.notList = false
+                this.set.noData = false
+                this.set.hasListNotKey = false
+              },
+              // 获取订阅的地区(用于地区筛选条件)
+                getSubscribeArea () {
+                  var _this = this
+                  $.ajax({
+                    type: 'get',
+                    url: '/bigmember/forecast/forArea?t=' + new Date().getTime(),
+                    success: function (res) {
+                      if(res.error_code === 0 && res.data) {
+                         _this.subscribeArea = res.data
+                      }
+                    },
+                    error: function (err) {
+                      console.log(err)
+                    }
+                  })
+                },
                 // 去设置
                 goSetting: function () {
                     location.href = './bigVip_detail'
                 },
                 // 去详情
                 goDetail: function (item) {
-                    // console.log(item)
                     var arr = [];
                     item.purchasing.forEach(function (v) {
                         if (v) {
                             arr.push(v.toString())
                         }
                     })
-                    console.log(arr)
                     this.scrollTop = $('.van-steps').scrollTop();
                     sessionStorage.setItem('$data-forecast_list', JSON.stringify(this.$data))
                     sessionStorage.setItem('forecast_keys', arr.toString())
                     location.href = './forecast_detail?id=' + item.id + '&keys=' + encodeURIComponent(arr.toString())
                 },
-                tabChange(val) {
-                    this.$refs.dateSelector.setState({
-                        exact: 'all'
-                    })
-                    this.$refs.dateSelector.resetAll()
+                resetQuery () {
                     this.startTime = ''
                     this.endTime = ''
-                    this.dataType = val
-                    this.list= [],
-                    this.page = 1,
-                    this.finished = false,
+                    this.selectArea = ''
+                    this.list= []
+                    this.page = 1
+                    this.finished = false
+                    this.resetSelector()
                     this.getList()
                 },
-                confirm(val) {
-                    console.log(val)
-
-                }
+                resetList () {
+                    this.page = 1
+                    this.list= []
+                    this.finished = false
+                    this.getList()
+                },
+                // 重置过滤器值
+                resetSelector () {
+                  if(this.$refs.dateDropdownRef) {
+                    if(this.$refs.dateSelector) {
+                      this.$refs.dateSelector.setState({exact: 'all'})
+                      this.$refs.dateSelector.resetAll()
+                    }
+                    this.$refs.dateDropdownRef.toggle(false)
+                  }
+                  if(this.$refs.areaDropdownRef) {
+                    this.$refs.areaDropdownRef.toggle(false)
+                    if(this.$refs.areaSelector) {
+                      this.$refs.areaSelector.backSelectedArea()
+                    }
+                  }
+                },
+                tabChange(val) {
+                   sessionStorage.removeItem('$data-forecast_list')
+                   this.resetSelector()
+                   this.dataType = val
+                   this.resetQuery()
+                },
+                openDateDropdown () {
+                  // 日期框展开时,如果本地缓存有日期数据则回显(跳转详情页存储的缓存数据,返回回显处理)
+                  var pData = sessionStorage.getItem('$data-forecast_list') ? JSON.parse(sessionStorage.getItem('$data-forecast_list')) : null
+                  if(pData && this.$refs.dateSelector) {
+                      if(this.exact){
+                        this.$refs.dateSelector.setState({exact:this.exact})
+                      }else{
+                        this.$refs.dateSelector.setState({startDate:parseInt(this.startTime*1000),endDate:parseInt(this.endTime*1000),exact:'exact'})
+                      }
+                  }
+                },
+                openAreaDropdown () {
+                  // 地区框展开时,如果本地缓存有地区数据则回显(跳转详情页存储的缓存数据,返回回显处理)
+                  var pData = sessionStorage.getItem('$data-forecast_list') ? JSON.parse(sessionStorage.getItem('$data-forecast_list')) : null
+                  if(pData && this.$refs.areaSelector && pData.selectArea) {
+                    this.$refs.areaSelector.backSelectedArea(JSON.parse(pData.selectArea))
+                  }
+                },
+                // 日期重置
+                dateCancel () {
+                  this.$refs.dateSelector && this.$refs.dateSelector.clearDateTimePicker()
+                  this.startTime = ''
+                  this.endTime = ''
+                },
+                // 日期确认
+                dateConfirm () {
+                  this.resetList()
+                  this.$refs.dateDropdownRef.toggle(false)
+                },
+                areaConfirm (areaVal) {
+                  if(!areaVal || (areaVal && Object.keys(areaVal).length == 0)) {
+                    this.selectArea = ''
+                  } else {
+                    this.selectArea = JSON.stringify(areaVal)
+                  }
+                  this.resetList()
+                  this.$refs.areaDropdownRef.toggle(false)
+                },
+                // 数据导出
+                dataExport (type) {
+                  if(this.distinctCount > 20000 && type !== 'popupClick' && this.$refs.popup_dataExport.isPrompt){
+                    this.$refs.popup_dataExport.show = true
+                    return
+                  }
+                  var _this = this
+                  $.ajax({
+                    url: '/bigmember/forecast/forDerive',
+                    type: 'POST',
+                    data: {
+                      pageNum: _this.page,
+                      dataType: _this.dataType,
+                      startTime: _this.startTime,
+                      endTime: _this.endTime,
+                      area: _this.selectArea,
+                      count: _this.totalCount,
+                      selectIds: ''
+                    },
+                    success: function(res) {
+                      if(res.error_code == 0 && res.data) {
+                        location.href = '/jy_mobile/common/order/create/dataexport?id=' + res.data._id
+                      }
+                    }
+                  })
+                },
+               next_export (){
+                 this.dataExport('popupClick')
+               },
             }
         }
         var forecastList = new Vue(vNode)
@@ -583,18 +799,17 @@
                 }
                 if(data.exact){
                     forecastList.exact = data.exact
-                    
+
                 }else{
                     forecastList.exact = null
                 }
                 forecastList.list = []
                 forecastList.page = 1
-                forecastList.finished = false,
-                forecastList.getList()
+                forecastList.finished = false
             }
         }
     </script>
 
 </body>
 
-</html>
+</html>

+ 2 - 1
src/jfw/modules/bigmember/src/config.json

@@ -186,5 +186,6 @@
   "portraitCount": 30,
   "nsq": "192.168.3.240:4260",
   "nsq_topic": "jy_event",
-  "attachmentResPower": ["bi_sj_sjqk","bi_sf_sjqd","bi_sj_yyszs"]
+  "attachmentResPower": ["bi_sj_sjqk","bi_sf_sjqd","bi_sj_yyszs"],
+  "msgMaxCount": 20000
 }

+ 1 - 0
src/jfw/modules/bigmember/src/config/config.go

@@ -76,6 +76,7 @@ type config struct {
 	Nsq                 string   `json:"nsq"`
 	Nsq_topic           string   `json:"nsq_topic"`
 	AttachmentResPower  []string `json:"attachmentResPower"`
+	MsgMaxCount         int      `json:"msgMaxCount"`
 }
 
 type CustomerInfo struct {

+ 2 - 0
src/jfw/modules/bigmember/src/service/analysis/analysis.go

@@ -25,8 +25,10 @@ type Analysis struct {
 	rMyRivals        xweb.Mapper `xweb:"/potential/rMyRivals"`       //移除我的潜在竞争对手rivals
 	decInfo          xweb.Mapper `xweb:"/decision/decInfo"`          //投标决策分析
 	trialInfo        xweb.Mapper `xweb:"/decision/trialInfo"`        //投标决策分析-使用用户 剩余次数
+	forArea          xweb.Mapper `xweb:"/forecast/forArea"`          //新项目预测省份城市
 	forPList         xweb.Mapper `xweb:"/forecast/forPList"`         //新项目预测结果list
 	forPContent      xweb.Mapper `xweb:"/forecast/forPContent"`      //新项目预测结果详情
+	forDerive        xweb.Mapper `xweb:"/forecast/forDerive"`        //新项目预测导出
 	fWData           xweb.Mapper `xweb:"/forecast/forWData"`         //中标预测分析
 	fWStatus         xweb.Mapper `xweb:"/forecast/forWStatus"`       //查看中标预测状态
 	fWResult         xweb.Mapper `xweb:"/forecast/forWResult"`       //中标预测结果

+ 395 - 61
src/jfw/modules/bigmember/src/service/analysis/forecastproject.go

@@ -2,17 +2,19 @@
 package analysis
 
 import (
+	. "app.yhyue.com/moapp/jybase/api"
+	. "app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/dataexport"
 	"encoding/json"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/modules/bigmember/src/config"
 	"jy/src/jfw/modules/bigmember/src/db"
 	"jy/src/jfw/modules/bigmember/src/util"
 	"sort"
 	"strconv"
 
-	. "app.yhyue.com/moapp/jybase/api"
-	. "app.yhyue.com/moapp/jybase/date"
-
 	"log"
 
 	qutil "app.yhyue.com/moapp/jybase/common"
@@ -92,6 +94,16 @@ func getForecastProjectSql(scd *util.ViewCondition, startTime, endTime int, data
 		areaquery += `]}}`
 		areaCity = append(areaCity, areaquery)
 	}
+	//县
+	if len(scd.District) > 0 {
+		for _, v := range scd.District {
+			cityName := strings.Split(v, "_")[0]
+			districtName := strings.Split(v, "_")[1]
+			query_bool_must_and_district := `{"bool":{"must":[{"terms":{"city":["%s"]}},{"terms":{"district":["%s"]}}]}}`
+			areaCity = append(areaCity, fmt.Sprintf(query_bool_must_and_district, cityName, districtName))
+		}
+	}
+
 	if len(areaCity) > 0 {
 		musts = append(musts, fmt.Sprintf(filter_must_area_city, strings.Join(areaCity, ",")))
 	}
@@ -224,6 +236,156 @@ func (this *Analysis) ForPContent() {
 	this.ServeJson(NewResult(rData, errMsg))
 }
 
+func (this *Analysis) ForArea() {
+	defer qutil.Catch()
+	var (
+		regMap = Result{
+			Data:       []map[string]interface{}{},
+			Error_code: Error_code,
+			Error_msg:  "",
+		}
+	)
+
+	data := make(map[string]map[string][]string)
+	main_userId, _, _ := util.MainUserId(this.Session())
+	//查库获得大会员用户的信息
+	o_mb := config.Compatible.Select(main_userId, `{"o_member_jy":1}`)
+	if (*o_mb)["o_member_jy"] == nil {
+		//PC端大会员 没有进行初始化
+		regMap.Data = map[string]interface{}{
+			"msg":  "暂无设置订阅信息,无法获取省份",
+			"code": 1,
+		}
+		this.ServeJson(regMap)
+		return
+	}
+	oMemberJy := qutil.ObjToMap((*o_mb)["o_member_jy"])
+	o_area := map[string]interface{}{}
+	o_district := map[string]interface{}{}
+	if (*oMemberJy)["o_area"] != nil {
+		o_area = (*oMemberJy)["o_area"].(map[string]interface{})
+	}
+	if (*oMemberJy)["o_district"] != nil {
+		o_district, _ = (*oMemberJy)["o_district"].(map[string]interface{})
+	}
+	for s, i := range o_area {
+		cityMap := make(map[string][]string)
+		city, _ := i.([]interface{})
+		citys := ArrToStringArr(city)
+		for _, c := range citys {
+			var ds []interface{}
+			if district, ok := o_district[c]; ok {
+				ds, _ = district.([]interface{})
+			}
+			cityMap[c] = ArrToStringArr(ds)
+		}
+		data[s] = cityMap
+	}
+	regMap.Data = data
+	this.ServeJson(regMap)
+}
+
+func ArrToStringArr(old []interface{}) []string {
+	newData := []string{}
+	if old != nil {
+		newData = make([]string, len(old))
+		for i, v := range old {
+			newData[i], _ = v.(string)
+		}
+	}
+	return newData
+}
+
+func (this *Analysis) ForDerive() {
+	defer qutil.Catch()
+	userId, _ := this.GetSession("userId").(string)
+	main_userId, _, _ := util.MainUserId(this.Session())
+
+	startTime, _ := this.GetInteger("startTime")
+	endTime, _ := this.GetInteger("endTime")
+	dataType := this.GetString("dataType")
+	area := this.GetString("area")
+	if area == "{}" {
+		area = ""
+	}
+	count, _ := this.GetInteger("count")
+	ids := strings.Split(this.GetString("selectIds"), ",")
+	var (
+		selectIds []string
+		sql       *util.ViewCondition
+	)
+	idTrue := make(map[string]bool)
+	for _, id := range ids {
+		if id == "" {
+			continue
+		}
+		sid := util.DecodeId(id)
+		if idTrue[sid] {
+			continue
+		}
+		idTrue[sid] = true
+		selectIds = append(selectIds, sid)
+	}
+
+	o_member_jy := &map[string]interface{}{}
+	//查库获得大会员用户的信息
+	o_mb := config.Compatible.Select(main_userId, `{"o_member_jy":1}`)
+	if o_mb != nil && (*o_mb) != nil {
+		if (*o_mb)["o_member_jy"] != nil {
+			o_member_jy = qutil.ObjToMap((*o_mb)["o_member_jy"])
+			//项目预测检索库
+			selectIds, sql = getNewForecastDerive(main_userId, *o_member_jy, startTime, endTime, count, dataType, area, selectIds)
+		}
+	}
+	if selectIds == nil || len(selectIds) == 0 || sql == nil {
+		this.ServeJson(Result{
+			Error_code: -1,
+			Error_msg:  "统计infoid异常",
+		})
+		return
+	}
+	var region []string
+	if sql.District != nil {
+		for _, s := range sql.District {
+			str := strings.Split(s, "_")
+			if len(str) == 2 {
+				region = append(region, str[1])
+			}
+		}
+	}
+	var dKWord []*util.DeriveKeyWord
+	for _, word := range sql.Keyword {
+		dKWord = append(dKWord, &util.DeriveKeyWord{
+			Keyword:  strings.Join(word.Keyword, " "),
+			Appended: word.Appended,
+			Exclude:  word.Exclude,
+			MatchWay: word.MatchWay,
+		})
+	}
+	saveData := map[string]interface{}{
+		"selectIds":  selectIds,
+		"s_userid":   userId,
+		"keywords":   dKWord,
+		"area":       sql.Area,
+		"city":       sql.City,
+		"region":     region,
+		"district":   sql.District,
+		"buyerclass": sql.Buyerclass,
+		"selectType": "purchasing",
+		"subtype":    strings.Join(sql.Subtype, ","),
+		"dataType":   dataType,
+		"comeinfrom": "latentPrediction",
+		"comeintime": time.Now().Unix(),
+	}
+	if startTime > 0 || endTime > 0 {
+		saveData["publishtime"] = fmt.Sprintf("%d_%d", startTime, endTime)
+	}
+	id := db.Mgo.Save(dataexport.ExportTable, saveData)
+	this.ServeJson(NewResult(map[string]interface{}{
+		"_id": encrypt.SE.Encode2Hex(id),
+	}, nil))
+}
+
 func (this *Analysis) ForPList() {
 	defer qutil.Catch()
 	var regMap = Result{
@@ -234,10 +396,11 @@ func (this *Analysis) ForPList() {
 	if this.Method() == METHOD {
 		msg := ""
 		code := 0
-		list := []map[string]interface{}{}
+		//list := []map[string]interface{}{}
 		flist := []map[string]interface{}{}
-		count := 0
-		var fcount int64 = 0
+		var (
+			fcount, distinctCount int64
+		)
 		userId, _ := this.GetSession("userId").(string)
 		main_userId, _, _ := util.MainUserId(this.Session())
 		isSubCount := false
@@ -250,45 +413,52 @@ func (this *Analysis) ForPList() {
 		startTime, _ := this.GetInteger("startTime")
 		endTime, _ := this.GetInteger("endTime")
 		dataType := this.GetString("dataType")
+		area := this.GetString("area")
+		total, _ := this.GetInteger("total")
+		if area == "{}" {
+			area = ""
+		}
+		if total == 0 && (area != "" || endTime > 0 || startTime > 0) {
+			regMap.Data = map[string]interface{}{
+				"msg":        "您设置的订阅关键词无法进行预测",
+				"code":       2,
+				"isSubCount": isSubCount,
+			}
+			this.ServeJson(regMap)
+			return
+		}
 		if pageSize == 0 {
 			pageSize = 10
 		}
-		o_member_jy := &map[string]interface{}{}
 		//查库获得大会员用户的信息
 		o_mb := config.Compatible.Select(main_userId, `{"o_member_jy":1}`)
-		if o_mb != nil && (*o_mb) != nil {
-			if (*o_mb)["o_member_jy"] != nil {
-				o_member_jy = qutil.ObjToMap((*o_mb)["o_member_jy"])
-				//项目预测检索库
-				flist, fcount = getNewForecast(main_userId, pageNum, *o_member_jy, pageSize, startTime, endTime, dataType)
-				if pageNum == 1 {
-					if (*o_member_jy)["a_items"] != nil {
-						a_items := qutil.ObjArrToMapArr((*o_member_jy)["a_items"].([]interface{}))
-						if len(a_items) == 0 || a_items[0]["a_key"] == nil || len(a_items[0]["a_key"].([]interface{})) == 0 {
-							msg = "暂无设置订阅关键词,无法进行预测"
-							code = 1
-						} else if (list == nil || len(list) == 0) && len(flist) == 0 {
-							msg = "您设置的订阅关键词无法进行预测"
-							code = 2
-						}
+		isKWD, o_member_jy := isKeWord(o_mb)
+		if isKWD {
+			flist, fcount, distinctCount = getNewForecast(main_userId, pageNum, *o_member_jy, pageSize, startTime, endTime, dataType, area)
+			if pageNum == 1 {
+				if len(flist) == 0 {
+					if area != "" || startTime != 0 || endTime != 0 {
+						msg = "当前筛选条件下结果为空"
+						code = 3
 					} else {
-						msg = "暂无设置订阅关键词,无法进行预测"
-						code = 1
+						msg = "您设置的订阅关键词无法进行预测"
+						code = 2
 					}
 				}
-
-			} else {
-				//PC端大会员 没有进行初始化
-				msg = "暂无设置订阅关键词,无法进行预测"
-				code = 1
 			}
+		} else {
+			//PC端大会员 没有进行初始化
+			msg = "暂无设置订阅关键词,无法进行预测"
+			code = 1
 		}
+
 		regMap.Data = map[string]interface{}{
-			"msg":        msg,
-			"code":       code,
-			"list":       forecastMerge(list, flist),
-			"count":      int64(count) + fcount,
-			"isSubCount": isSubCount,
+			"msg":           msg,
+			"code":          code,
+			"distinctCount": distinctCount,
+			"list":          forecastMerge(nil, flist),
+			"count":         fcount,
+			"isSubCount":    isSubCount,
 		}
 	} else {
 		regMap.Error_code = Error_code_1005
@@ -297,6 +467,26 @@ func (this *Analysis) ForPList() {
 	this.ServeJson(regMap)
 }
 
+func isKeWord(o_mb *map[string]interface{}) (bool, *map[string]interface{}) {
+	if o_mb == nil || len(*o_mb) == 0 || (*o_mb)["o_member_jy"] == nil {
+		return false, nil
+	}
+	o_member_jy := qutil.ObjToMap((*o_mb)["o_member_jy"])
+	if (*o_member_jy)["a_items"] == nil {
+		return false, nil
+	}
+	a_items := qutil.ObjArrToMapArr((*o_member_jy)["a_items"].([]interface{}))
+	if len(a_items) == 0 {
+		return false, nil
+	}
+	for _, item := range a_items {
+		if item["a_key"] != nil && len(item["a_key"].([]interface{})) > 0 {
+			return true, o_member_jy
+		}
+	}
+	return false, nil
+}
+
 type ForecastInfo struct {
 	Buyer       string   `json:"buyer"`
 	Id          string   `json:"id"`
@@ -306,6 +496,7 @@ type ForecastInfo struct {
 	Keys        string   `json:"keys"`
 	Jyhref      string   `json:"jyhref"`
 	Yuceendtime int64    `json:"yuceendtime"`
+	InfoId      string   `json:"infoId"`
 }
 
 // 合并去重
@@ -343,6 +534,7 @@ func forecastMerge(r, f []map[string]interface{}) []*ForecastInfo {
 				Jyhref:      qutil.ObjToString(fv["jyhref"]),
 				Keys:        "",
 				Yuceendtime: qutil.Int64All(fv["yuceendtime"]),
+				InfoId:      util.EncodeId(qutil.ObjToString(fv["infoid"])),
 			})
 		}
 	}
@@ -357,11 +549,11 @@ func forecastMerge(r, f []map[string]interface{}) []*ForecastInfo {
 
 var d = &dfa.DFA{}
 
-func getNewForecast(userId string, pageNum int, o_member_jy map[string]interface{}, pageSize int, startTime, endTime int, dataType string) (list []map[string]interface{}, count int64) {
+func getNewForecast(userId string, pageNum int, o_member_jy map[string]interface{}, pageSize int, startTime, endTime int, dataType, area string) (list []map[string]interface{}, count, distinctCount int64) {
 	if userId == "" {
 		return
 	}
-	sql := getSqlObjFromId(o_member_jy)
+	sql := getSqlObjFromId(o_member_jy, area)
 	if sql == nil {
 		return
 	}
@@ -387,26 +579,44 @@ func getNewForecast(userId string, pageNum int, o_member_jy map[string]interface
 	// qstr := GetMemberForecastSql(sql)
 	qstr := getForecastProjectSql(sql, startTime, endTime, dataType)
 	count = elastic.Count(INDEX, TYPE, qstr)
+	distinctCount = count
+	if int(distinctCount) > config.Config.MsgMaxCount { //超过20000 计算去重后的实际标讯数据
+		distinctSql := fmt.Sprintf(`%s,"aggs": {"distinct_infoid_count": {"cardinality": {"field": "infoid"}}},"size": 0}`, qstr[:len(qstr)-1])
+		res := util.GetAggs(INDEX, TYPE, distinctSql)
+		if res != nil && len(res) > 0 {
+			var infoIds DistinctInfoidCount
+			if b, err := res["distinct_infoid_count"].MarshalJSON(); err == nil && b != nil {
+				err = json.Unmarshal(b, &infoIds)
+				if err == nil {
+					distinctCount = int64(infoIds.Value)
+				}
+			}
+		}
+	}
 	list = *elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, (pageNum-1)*pageSize, pageSize, 0, false)
 	if list != nil {
 		d.AddWord(keys...)
 		for _, v := range list {
+			rsvMap := map[string]bool{}
 			var rsArr = []string{}
 			var rsArrRes = []string{}
-			if v["results"] != nil {
-				results := qutil.ObjArrToMapArr(v["results"].([]interface{}))
-				rsvMap := map[string]bool{}
-				for _, rsv := range results {
-					rsArr = append(rsArr, d.Analy(rsv["purchasing"].(string))...)
-				}
-				for _, rv := range rsArr {
-					if rsvMap[strings.Join(rsArr, "+")] {
-						continue
+			if dataType == "nj" {
+				rsArr = append(rsArr, d.Analy(qutil.InterfaceToStr(v["title"]))...)
+			} else {
+				if v["results"] != nil {
+					results := qutil.ObjArrToMapArr(v["results"].([]interface{}))
+					for _, rsv := range results {
+						rsArr = append(rsArr, d.Analy(rsv["purchasing"].(string))...)
 					}
-					rsArrRes = append(rsArrRes, rv)
-					rsvMap[strings.Join(rsArr, "+")] = true
 				}
 			}
+			for _, rv := range rsArr {
+				if rsvMap[strings.Join(rsArr, "+")] {
+					continue
+				}
+				rsArrRes = append(rsArrRes, rv)
+				rsvMap[strings.Join(rsArr, "+")] = true
+			}
 			v["results"] = rsArrRes
 			v["id"] = qutil.ObjToString(v["_id"])
 			v["yucetime"] = qutil.Int64All(v["yucetime"].(float64))
@@ -417,6 +627,69 @@ func getNewForecast(userId string, pageNum int, o_member_jy map[string]interface
 	return
 }
 
+type DistinctInfoId struct {
+	Buckets []struct {
+		Key string `json:"key"`
+	} `json:"buckets"`
+}
+
+type DistinctInfoidCount struct {
+	Value int `json:"value"`
+}
+
+func getNewForecastDerive(userId string, o_member_jy map[string]interface{}, startTime, endTime, count int, dataType, area string, selectIds []string) (ids []string, sql *util.ViewCondition) {
+	if userId == "" {
+		return
+	}
+	sql = getSqlObjFromId(o_member_jy, area)
+	if sql == nil || len(selectIds) != 0 {
+		return selectIds, sql
+	}
+	keys := []string{}
+	keyIsexists := map[string]bool{}
+	for _, v := range sql.Keyword {
+		var keys_one []string
+		for _, k := range v.Keyword {
+			keys_one = append(keys_one, k)
+		}
+		for _, k := range v.Appended {
+			keys_one = append(keys_one, k)
+		}
+		if keyIsexists[strings.Join(keys_one, "+")] {
+			continue
+		}
+		keyIsexists[strings.Join(keys_one, "+")] = true
+		keys = append(keys, strings.Join(keys_one, "+"))
+	}
+	if len(keys) == 0 {
+		return
+	}
+	// qstr := GetMemberForecastSql(sql)
+	qstr := getForecastProjectSql(sql, startTime, endTime, dataType)
+	if count > config.Config.MsgMaxCount {
+		count = config.Config.MsgMaxCount
+	}
+	//聚合去重infoid
+	aggSql := fmt.Sprintf(`,"size": 0,"aggs": {"distinct_infoid": {"terms": {"field": "infoid","size": %d,"order": {"top_yucetime.value": "desc"}},"aggs": {"top_yucetime": {"max": {"field": "yucetime"}}}}}}`, count)
+	qstr = fmt.Sprintf("%s%s", qstr[:len(qstr)-1], aggSql)
+	res := util.GetAggs(INDEX, TYPE, qstr)
+	if res == nil || len(res) == 0 {
+		return
+	}
+	var infoIds DistinctInfoId
+	if b, err := res["distinct_infoid"].MarshalJSON(); err == nil && b != nil {
+		err = json.Unmarshal(b, &infoIds)
+		if err == nil {
+			for _, bucket := range infoIds.Buckets {
+				if bucket.Key != "" {
+					ids = append(ids, bucket.Key)
+				}
+			}
+		}
+	}
+	return
+}
+
 // 获取大会员forecast 检索库查询语句 - 查询逻辑有调整 dev4.6.8 -ws 新方法:getForecastProjectSql()
 func GetMemberForecastSql(scd *util.ViewCondition) string {
 	query := `{"query":{"bool":{"must":[%s],"should":[%s],"minimum_should_match": %d}}}`
@@ -518,7 +791,7 @@ func GetMemberForecastSql(scd *util.ViewCondition) string {
 }
 
 // member_jy
-func getSqlObjFromId(o_member_jy map[string]interface{}) *util.ViewCondition {
+func getSqlObjFromId(o_member_jy map[string]interface{}, area string) *util.ViewCondition {
 	if o_member_jy["a_items"] == nil {
 		return nil
 	}
@@ -537,18 +810,75 @@ func getSqlObjFromId(o_member_jy map[string]interface{}) *util.ViewCondition {
 	if o_member_jy["a_infotype"] != nil {
 		a_infotype = o_member_jy["a_infotype"].([]interface{})
 	}
+	var (
+		areaArr, cityArr, districtArr []string
+	)
 	o_area := map[string]interface{}{}
+	o_district := map[string]interface{}{}
 	if o_member_jy["o_area"] != nil {
 		o_area = o_member_jy["o_area"].(map[string]interface{})
 	}
+	if o_member_jy["o_district"] != nil {
+		o_district, _ = o_member_jy["o_district"].(map[string]interface{})
+	}
+
+	if area != "" {
+		data := qutil.ObjToMap(area)
+		if data != nil {
+			for s, is := range *data {
+				i, _ := is.(map[string]interface{})
+				//未选城市 订阅城市也为空
+				if vs, ok := o_area[s]; (!ok || vs == nil || len(vs.([]interface{})) == 0) && len(i) == 0 {
+					areaArr = append(areaArr, s)
+					continue
+				}
+				if len(i) == 0 { //未选城市 订阅城市不为空 默认为订阅的城市 对应的区县
+					for _, i3 := range o_area[s].([]interface{}) {
+						city := qutil.InterfaceToStr(i3)
+						i[city] = o_district[city]
+					}
+				}
+				for s2, is2 := range i {
+					i2, _ := is2.([]interface{})
+					//订阅区县为空
+					if len(i2) == 0 {
+						cityArr = append(cityArr, s2)
+						continue
+					}
+					for _, s3 := range i2 {
+						districtArr = append(districtArr, fmt.Sprintf("%s_%s", s2, s3))
+					}
+				}
+			}
+		}
+	} else {
+		areaArr, cityArr, districtArr = getStringArrFromDbResult(o_area, o_district)
+	}
+
 	return &util.ViewCondition{
 		Keyword:    getKeyWordArr(a_items, "", -1),
 		Buyerclass: qutil.ObjArrToStringArr(a_buyerclass),
 		Subtype:    qutil.ObjArrToStringArr(a_infotype),
-		Area:       getStringArrFromDbResult(o_area, 1),
-		City:       getStringArrFromDbResult(o_area, 2),
+		Area:       areaArr,
+		City:       cityArr,
 		SelectType: strconv.Itoa(qutil.IntAll(o_member_jy["i_matchway"])),
+		District:   districtArr,
+	}
+}
+
+func getStringArrFromDistrict(district map[string]interface{}) (arr []string) {
+	if district == nil {
+		return
+	}
+	for k, v := range district {
+		if len(gconv.SliceAny(v)) > 0 {
+			for _, v1 := range gconv.SliceAny(v) {
+				arr = append(arr, fmt.Sprintf("%s_%s", k, v1))
+			}
+
+		}
 	}
+	return
 }
 
 // 关键词 附加词 排除词
@@ -596,23 +926,27 @@ func getKeyWordArr(a_items []interface{}, item string, index int) (arr []util.Vi
 	return
 }
 
-func getStringArrFromDbResult(area map[string]interface{}, i int) (arr []string) {
+func getStringArrFromDbResult(area, oDistrict map[string]interface{}) (areaArr, cityArr, districtArr []string) {
 	if area == nil {
 		return
 	}
-	var eareArr []string
-	var cityArr []string
 	for k, v := range area {
-		if len(v.([]interface{})) > 0 {
-			cityArr = append(cityArr, qutil.ObjArrToStringArr(v.([]interface{}))...)
+		if len(v.([]interface{})) > 0 { //是否有城市
+			vs := ArrToStringArr(v.([]interface{}))
+			for _, i := range vs {
+				if is, ok := oDistrict[i]; ok && is != nil && len(is.([]interface{})) > 0 { //是否有区县
+					dt := ArrToStringArr(is.([]interface{}))
+					for _, s := range dt {
+						districtArr = append(districtArr, fmt.Sprintf("%s_%s", i, s))
+					}
+				} else {
+					cityArr = append(cityArr, i)
+				}
+			}
 		} else {
-			eareArr = append(eareArr, k)
+			areaArr = append(areaArr, k)
+
 		}
 	}
-	if i == 1 {
-		arr = eareArr
-	} else {
-		arr = cityArr
-	}
 	return
 }

+ 8 - 0
src/jfw/modules/bigmember/src/util/view.go

@@ -23,6 +23,14 @@ type ViewKeyWord struct {
 	MatchWay int      `json:"matchway"`  //匹配模式
 }
 
+/*已选条件--关键词*/
+type DeriveKeyWord struct {
+	Keyword  string   `json:"key"`       //关键词
+	Appended []string `json:"appendkey"` //附加词
+	Exclude  []string `json:"notkey"`    //排除词
+	MatchWay int      `json:"matchway"`  //匹配模式
+}
+
 /*已选条件*/
 type ViewCondition struct {
 	Area       []string      //地区-省份

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

@@ -5,7 +5,7 @@ go 1.18
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20231116061739-cd852201a8f4
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v1.1.7
+	app.yhyue.com/moapp/jypkg v1.10.2
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.15
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4
@@ -22,7 +22,7 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 // indirect
 	app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae // indirect
 	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e // indirect
-	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d // indirect
+	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822 // indirect
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.8 // indirect
 	github.com/BurntSushi/toml v1.2.0 // indirect
 	github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect

+ 4 - 4
src/jfw/modules/publicapply/src/go.sum

@@ -9,14 +9,14 @@ app.yhyue.com/moapp/jybase v0.0.0-20231116061739-cd852201a8f4 h1:qfqQL2GJV3N31DF
 app.yhyue.com/moapp/jybase v0.0.0-20231116061739-cd852201a8f4/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.1.7 h1:msXjcVazmiUnlarqpUEnK4nA1iGCbpds8NYeefY6YL4=
-app.yhyue.com/moapp/jypkg v1.1.7/go.mod h1:sMZxJOsD3STWGY04aDhUtRD+1u5nqhQpdDdpSW3JC1Y=
+app.yhyue.com/moapp/jypkg v1.10.2 h1:ycfFGV/VMb3huhvLgCjI5xIg8cGnt/Zdj+w993KhnbY=
+app.yhyue.com/moapp/jypkg v1.10.2/go.mod h1:j8v5+elGJ14UxJvofhqa+XLy6Ppb3hkLHdDcMsAmWEU=
 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=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e/go.mod h1:7Xhygw0KBuL4h0G76FnFg4otQcA9bmOO0c8M0FCjAyQ=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d h1:x17+SAYxlBChNWn2IS2eDWZlhZrxtgEWjlb1JF0946E=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d/go.mod h1:rCCaOSWBYfQabf/yIvSVheSPtN2THnHeTl2J5/RrcuU=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822 h1:wSSygQd/AppmJCSEu+TXtmmIqVU18X0psEqU3VKEavI=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822/go.mod h1:rCCaOSWBYfQabf/yIvSVheSPtN2THnHeTl2J5/RrcuU=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.8 h1:14Yxzutsej7LQe3jnN61wuRX9qjAZ4FtdWMA27ewQ3w=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.8/go.mod h1:rRiGzKG4F/fmkNxXQCxrkxNWc8yf1SmW8qWCKfGIQSM=
 bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.15 h1:V8RSWazAsREs+8mpk7h2kXiavSExFFaDG1guhf3Qux8=

+ 3 - 4
src/jfw/modules/subscribepay/src/config.json

@@ -165,15 +165,14 @@
       "callPlatform": "subscribepay",
       "msgType": 13,
       "title": "%s已到账,戳我解锁!",
-      "content": "购买%s产品赠送%s已到账。兑换码%s。兑换截止日期:%s,请前往腾讯视频进行兑换解锁福利。#jy#购买%s赠送%s#jy#兑换码%s。请前往腾讯视频进行兑换解锁福利。",
-      "link": "",
+      "content": "购买%s产品赠送%s已到账。兑换码%s。兑换截止日期:%s。点击链接<a style=\"color:blue\">https://22233.cn/2258</a>进行兑换,兑换后登录腾讯视频APP进行查询。#jy#购买%s赠送%s#jy#兑换码%s。请前往腾讯视频进行兑换解锁福利。",
+      "link": "https://22233.cn/2258",
       "androidUrl": "",
       "iosUrl": "",
       "weChatUrl": ""
     },
     "mailAlarm": {
       "to": [
-        "328974233@qq.com"
       ],
       "title": "视频会员权益码数据告警",
       "reTry": 3,
@@ -191,7 +190,7 @@
     "sms": {
       "args": [
         "%s。兑换码%s。兑换截止日期:%s",
-        "腾讯视频"
+        "点击链接https://22233.cn/2258进行兑换,兑换后登录腾讯视频APP进行查询。"
       ],
       "tid": "04"
     },

+ 1 - 0
src/jfw/modules/subscribepay/src/dataexport.json

@@ -66,6 +66,7 @@
     {"name":"报名截止日期","filed":"signendtime","width":22,"color":"00FFDCCB","vMerge":1,"hMerge":0},
     {"name":"开标日期","filed":"bidopentime","width":20,"color":"00FFDCCB","vMerge":1,"hMerge":0},
     {"name":"投标截止日期","filed":"bidendtime","width":22,"color":"00FFDCCB","vMerge":1,"hMerge":0},
+    {"name":"合同签订时间","filed":"signaturedate","width":22,"color":"00FFDCCB","vMerge":1,"hMerge":0},
     {"name":"采购单位信息","filed":"","width":0,"color":"00FFDCCB","vMerge":0,"hMerge":4},
     {"name":"单位名称","filed":"buyer","width":18,"color":"00FFDCCB","vMerge":0,"hMerge":0},
     {"name":"采购单位类型","filed":"buyerclass","width":18,"color":"00FFDCCB","vMerge":0,"hMerge":0},

+ 4 - 0
src/jfw/modules/subscribepay/src/entity/equityActive.go

@@ -250,6 +250,10 @@ func (e *EquityActive) sendVipMsg(eName, code, ex_end_time string) {
 		Content:     fmt.Sprintf(siteMsg.Content, e.ProductType, eName, code, ex_end_time, e.ProductType, eName, code),
 		MsgType:     siteMsg.MsgType,
 		SendMode:    2,
+		Link:        siteMsg.Link,
+		IosUrl:      siteMsg.IosUrl,
+		AndroidUrl:  siteMsg.AndroidUrl,
+		WeChatUrl:   siteMsg.WeChatUrl,
 	}
 	util.EquityActiveSend.SendStationMessages(p)
 

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

@@ -1,11 +1,11 @@
 module jy/src/jfw/modules/subscribepay/src
 
-go 1.20
+go 1.19
 
 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.1.7
+	app.yhyue.com/moapp/jypkg v1.10.2
 	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
@@ -22,7 +22,7 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 // indirect
 	app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae // indirect
 	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e // indirect
-	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d // indirect
+	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822 // indirect
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.8 // indirect
 	github.com/BurntSushi/toml v1.1.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect

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

@@ -9,14 +9,14 @@ 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.1.7 h1:msXjcVazmiUnlarqpUEnK4nA1iGCbpds8NYeefY6YL4=
-app.yhyue.com/moapp/jypkg v1.1.7/go.mod h1:sMZxJOsD3STWGY04aDhUtRD+1u5nqhQpdDdpSW3JC1Y=
+app.yhyue.com/moapp/jypkg v1.10.2 h1:ycfFGV/VMb3huhvLgCjI5xIg8cGnt/Zdj+w993KhnbY=
+app.yhyue.com/moapp/jypkg v1.10.2/go.mod h1:j8v5+elGJ14UxJvofhqa+XLy6Ppb3hkLHdDcMsAmWEU=
 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=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e/go.mod h1:7Xhygw0KBuL4h0G76FnFg4otQcA9bmOO0c8M0FCjAyQ=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d h1:x17+SAYxlBChNWn2IS2eDWZlhZrxtgEWjlb1JF0946E=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231115092908-cb4608f3a96d/go.mod h1:rCCaOSWBYfQabf/yIvSVheSPtN2THnHeTl2J5/RrcuU=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822 h1:wSSygQd/AppmJCSEu+TXtmmIqVU18X0psEqU3VKEavI=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20231219095433-7e7d4aa59822/go.mod h1:rCCaOSWBYfQabf/yIvSVheSPtN2THnHeTl2J5/RrcuU=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d h1:mqOFpjEX8eNNskmu0cejgA8fqmbDjFG/ggeNrUO3shw=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d/go.mod h1:UKLwPLx9be595yaiIwqqdKSloKK/Kdf/wTLr4XUClV0=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.8 h1:14Yxzutsej7LQe3jnN61wuRX9qjAZ4FtdWMA27ewQ3w=

+ 87 - 0
src/web/staticres/common-module/collection/css/area-three-mobile.css

@@ -0,0 +1,87 @@
+/*地区选择框*/
+.area-selector-layout{
+    /* height: 12.26rem; */
+    height: 11.26rem;
+    border-top-left-radius: 8px;
+    border-top-right-radius: 8px;
+}
+.is-dropdown-area.area-selector-layout {
+    height: 9.34rem;
+}
+.area-selector-layout .j-header{
+    padding: .44rem .32rem .24rem;
+    flex-direction: column;
+    align-items: flex-start;
+    color:  #171826;
+}
+.area-selector-layout .j-header .title-row{
+    width:100%;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    font-size: 20px;
+    line-height: 30px;
+    margin-bottom: .24rem;
+}
+.area-selector-layout .j-header .count-row{
+    font-size: 14px;
+}
+.area-selector-layout .j-header .count-row span{
+    color: #5F5E64;
+}
+.area-selector-layout .j-header .count-row strong{
+    font-weight: normal;
+    color: #2ABDD1;
+}
+.area-selector-layout .j-header:after{
+    background:none;
+}
+.area-selector-layout .j-main{
+    overflow-y: hidden;
+}
+.area-selector-layout .j-footer{
+    padding: 0;
+}
+.area-selector-layout .dialog-close{
+    width: 20px;
+    height: 20px;
+}
+.area-selector-layout .j-button-cancel.disabled, .area-selector-layout .j-button-confirm.disabled{
+    opacity: .6;
+}
+/*地区超出限制弹窗*/
+.area-tip-dialog .van-dialog__header{
+    padding: 24px 0 0;
+    text-align: center;
+}
+.area-tip-dialog .van-dialog__header {
+    color: #171826;
+    text-align: center;
+    font-size: .36rem;
+    font-style: normal;
+    font-weight: normal;
+    line-height: 26px;
+}
+.area-tip-dialog .van-dialog__message{
+    padding:0;
+}
+.area-tip-dialog .van-dialog__content{
+    margin:0;
+    padding: .16rem .6rem .44rem;
+    color: #5F5E64;
+    font-size: 15px;
+    font-style: normal;
+    font-weight: 400;
+    line-height: 22px;
+    text-align: left;
+}
+.area-tip-dialog .van-dialog__content .highlight {
+    color: #2ABDD1;
+}
+.area-tip-dialog  .van-dialog__footer button {
+    text-align: center;
+    font-size: .36rem;
+    font-style: normal;
+    font-weight: 400;
+    line-height: 26px;
+}

+ 206 - 0
src/web/staticres/common-module/collection/js/area-three-mobile.js

@@ -0,0 +1,206 @@
+var areaThreeTemplate = `
+  <div class="area-selector-layout" :class="{'is-dropdown-area': isDropdownArea}">
+     <div class="j-container  layout-card" ref="layoutCard">
+         <div class="j-header" v-if="showSelectedCount">
+             <div class="title-row" >
+                <span>区域选择</span>
+                <img v-if="!isDropdownArea" @click="closeHandle" class="dialog-close" src="/jyapp/vipsubscribe/image/dialog-close.png" alt="">
+             </div>
+             <div class="count-row">
+             <span>可选:</span><strong v-if="buyAreaCount === -1">全国</strong><span v-else><strong>{{buyAreaCount}}</strong>个省</span>,
+             <span>已选:</span>
+                  <strong v-if="selectedCount === -1">全国</strong>
+                  <span v-else><strong>{{selectedCount}}</strong>个省</span>
+             </div>
+           </div>
+          <div class="j-main">
+            <area-three-sidebar-component
+            ref="areaThreeSidebar"
+            class="area-city-sidebar"
+            :tagTextOnlySelectedCount="true"
+            :useProvinceCitySplit="true"
+            v-model="bindArea"
+            :before-change="areaExceedLimit"
+            :can-empty-selected="true"
+            :only-show-filter-area="true"
+            :filter-area-obj="filterAreaObj"
+            />
+          </div>
+          <div class="j-footer">
+              <slot name="footer">
+                <div class="j-button-group height40">
+                  <button class="j-button-cancel" :class="{'disabled': resetButtonDisabled }" @click="areaCancelHandle">重置</button>
+                  <button class="j-button-confirm" @click="areaConfirmHandle">确认</button>
+                </div>
+              </slot>
+            </div>
+       </div>
+  </div>
+`
+var areaThreeComponent = {
+  name: 'areaThreeComponent',
+  template: areaThreeTemplate,
+  components: {
+    areaThreeSidebarComponent: areaThreeSidebarComponent
+  },
+  props: {
+    // 是否需要展示选择数量
+    showSelectedCount: {
+      type: Boolean,
+      default: false
+    },
+    // true为下拉选择地区,false为popup弹出
+    isDropdownArea: {
+      type: Boolean,
+      default: true
+    },
+    // 购买的省份数量,全国为-1(用以处理超出地区选择限制)
+    buyAreaCount: {
+      type: Number,
+      default: -1
+    },
+    // 选中过的地区数据(用于回显处理)
+    oldArea: {
+      type: Object,
+      default: {}
+    },
+    // 过滤后的地区(仅展示已经过滤后的地区时需要该项)
+    filterAreaObj: {
+      type: Object,
+      default: {}
+    },
+    // 是否可以空选提交
+    canEmptySelect: {
+      type: Boolean,
+      default: false
+    },
+  },
+  data: function() {
+    return {
+      // 组件绑定的area
+      bindArea: {},
+     // 已选省份数量
+      selectedCount: 0,
+      // 是否只展示有权限的地区
+      showFilterArea: false
+    }
+  },
+  created(){
+    // 只展示部分省份时
+    if(this.filterAreaObj && Object.keys(this.filterAreaObj).length > 0) {
+      this.showFilterArea = true
+    }
+  },
+  mounted () {},
+  computed: {
+    // 地区重置按钮是否禁用
+    resetButtonDisabled: function () {
+      var isSame = utils.deepCompare(this.oldArea, this.bindArea)
+      return isSame
+    }
+  },
+  watch: {
+    bindArea: function(newVal){
+      // 获取已选择的省份数据
+      if(newVal) {
+        if (newVal === -1) {
+          this.selectedCount = 0
+        } else {
+          this.selectedCount = Object.keys(newVal).length || -1
+        }
+      }
+    }
+  },
+  methods: {
+    // 超出省份提示
+    areaExceedLimit (parent, child) {
+      if(this.showFilterArea) {
+        return true
+      }
+      // 全国(无限制)
+      if(this.buyAreaCount < 0) {
+        return true
+      } else {
+        // 非全国(省份有限制)
+        if(parent.parentName && parent.parentName === '全国') {
+          this.areaExceedLimitTip()
+          return false
+        } else {
+          if(this.selectedCount >= this.buyAreaCount) {
+            // 已选择过的省份列表
+            var selectedProvinceList = []
+            var sourceFirstCount = this.$refs.areaThreeSidebar.sourceFirstCount || []
+            for (var key in sourceFirstCount) {
+              selectedProvinceList.push(key)
+            }
+            // 已经选中过的可勾选掉
+            if (parent.parentName && selectedProvinceList.indexOf(parent.parentName) > -1) {
+              return true
+            } else {
+              this.areaExceedLimitTip()
+              return false
+            }
+          } else {
+            return true
+          }
+        }
+      }
+    },
+    // 超出地区限制时
+    areaExceedLimitTip () {
+      var  message = `<div>可选:<span class="highlight">${this.buyAreaCount}个省</span>,如需增加省份数量,您可联系客服升级产品套餐。</div>`
+      this.$dialog({
+        title: '超出可选省份数量',
+        className: 'area-tip-dialog',
+        message: message,
+        showCancelButton: true,
+        cancelButtonText: '取消',
+        cancelButtonColor: '#171826',
+        confirmButtonText: '联系客服',
+        confirmButtonColor: '#2ABED1',
+        allowHtml: true,
+        overlayStyle: {'background': 'rgba(0, 0, 0, .2)'},
+      })
+      .then(() => {
+        location.href = '/jyapp/free/customer'
+      })
+      .catch(() => {})
+    },
+    // 回勾地区选择数据
+    backSelectedArea (backArea) {
+      var _this = this
+      setTimeout(function () {
+        _this.bindArea = backArea || _this.oldArea
+      }, 100)
+    },
+    // 地区选择取消
+    areaCancelHandle() {
+      if(this.resetButtonDisabled) {
+        return
+      }
+      this.backSelectedArea()
+      this.$emit('cancel', this.oldArea)
+    },
+    // 确认地区选择数据
+    areaConfirmHandle () {
+      if(this.canEmptySelect) {
+        this.$emit('confirm', this.bindArea)
+        return
+      }
+      if(this.selectedCount === 0) {
+        this.$toast('请选择省份')
+        return
+      }
+      // 超出区域选择
+      if(this.buyAreaCount > 0 && this.selectedCount > this.buyAreaCount) {
+        this.areaExceedLimitTip()
+        return
+      }
+      this.$emit('confirm', this.bindArea)
+    },
+    // 如果是popup弹出的地区,关闭popup回调
+    closeHandle () {
+      this.$emit('close')
+    }
+  }
+}

+ 13 - 7
src/web/staticres/common-module/collection/js/date-mobile.js

@@ -15,7 +15,7 @@ var dateComponentTemplate = `
         <span class="customTime-title">自定义时间</span>
         <span class="root_open" v-if="!rootopen">开通</span>
       </div>
-      <div v-show="getShowDiyInput" class="timePicker" @click.self="dateShowEvent" :class="{clickactive:dateStyle==true}">
+      <div v-show="getShowDiyInput" class="timePicker" @click.self="dateShowEvent" :class="{clickactive:dateStyle==true, selectedActive: dateTimePickerState.startPlaceHolder && dateTimePickerState.endPlaceHolder}">
         <van-field @focus="getStratFocus" v-model="dateTimePickerState.startPlaceHolder" placeholder="开始时间"></van-field>
         <div class="line"></div>
         <van-field @focus="getEndFocus" v-model="dateTimePickerState.endPlaceHolder" placeholder="结束时间"></van-field>
@@ -343,7 +343,6 @@ var dateComponent = {
           timeState.end = ''
         }
       }
-      console.log(timeState)
       return timeState
     },
     // 计算lately7/lately30/lastYear的开始和结束时间
@@ -424,7 +423,7 @@ var dateComponent = {
       return t
     },
     selectFixedDate: function(item) {
-     
+
       if (item.selected) return
       if (!item.isFree && !this.rootopen) {
         var _this = this
@@ -441,22 +440,21 @@ var dateComponent = {
         return
       }
       this.timeSelectList.forEach(v => (v.selected = false))
-      item.selected = true 
+      item.selected = true
       console.log(item)
       // this.$emit('tagsChange')
       let that = this
-      try{ 
+      try{
        window.$tagsChange()
        let result = that.getState()
         window.$chooseData({result,exact:item.value})
       }catch(e){
 
       }
-      
+
     },
     // 显示选择时间弹窗
     dateShowEvent: function() {
-      console.log(this.rootopen)
       if(this.rootopen) {
         this.timeSelectList.forEach(v => (v.selected = false))
         this.dateStyle = true
@@ -552,6 +550,10 @@ var dateComponent = {
       if(this.dateTimePickerState.end == '') {
         this.datePicker.endshow = true
       }else{
+        if(this.type === 'more-picker') {
+          // 如果开始日期和结束日期均已选择,则将一些快捷选项重置掉
+          this.setTimeSelectListState(null)
+        }
         this.datePicker.endshow = false
       }
       this.sortTime(this.dateTimePickerState.start, this.dateTimePickerState.end)
@@ -568,6 +570,10 @@ var dateComponent = {
       this.dateTimePickerState.endPlaceHolder = this.$refs.getendValues.value.pattern('yyyy年MM月dd日')
       this.datePicker.endshow = false
       this.sortTime(this.dateTimePickerState.start, this.dateTimePickerState.end)
+      // 如果开始日期和结束日期均已选择,则将一些快捷选项重置掉
+      if(this.type === 'more-picker' && this.dateTimePickerState.start && this.dateTimePickerState.end) {
+        this.setTimeSelectListState(null)
+      }
       let that = this
       try{
         let result = that.getState()

+ 15 - 0
src/web/staticres/common-module/vipsubscribe/css/sidebar-selector-ui-template.css

@@ -104,3 +104,18 @@
 .content-list-item-container .van-cell{
     align-items: center;
 }
+.checkbox {
+    display: inline-block;
+    width: 0.36rem;
+    height: 0.36rem;
+    border: 1px solid #ddd;
+    border-radius: 50%;
+    margin-right: 0.2rem;
+    -webkit-appearance: none;
+    background: #fff;
+}
+.checkbox.checked {
+    border: 0;
+    background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAACpElEQVRogc1asa2DMBBlhIyQMpKNxAiMwAiMwAhswAgZgQrOHSVwLhiBERghvwCSwMdgOzYG6aQUhLw7v3u+Z+J5Bq4g724U6pCUTeIznlGGHQHsKcOBAPbT544yntOiTSnUoYnf/Rm0X7YRAXxShgMFfCkH4zkBjE8HTos21QYtCJ/xzDpwAhgTwN4k8OWK4GBlRYK8u1HGc2vA/yfSPaC+GwFPoQ6tVn1vNQoMfgJPyiYxzXXl3ijbSA88YOwa/BzKfUEKDK4C/hOSe8cD6vv1wOOLMhykGvtUtVFPotunDmDsHORBCPth1PoLUmeDStvUKdrUObgxqinE9xRt+q/6TjarZWW79cZFGXaiVQjy7va+0S/byDX4LYUhZZOIvrPoBafKw7BbVFOW1ozn7pt3B/xe9ed4QH33KNSho+pXv4CngC9SNon0zVcDTwFHNTqb/wTwqcX5TQry3KNHmmswfMYzEXif8Uz5mQwHT1r/55MGC+AJ4FPruVIJrJwRhToUbjA74LeATxuoHvg5gSMJFf24bO9YAy+7AgTwuQVAirfrmeULvBHxYDhINTEpm0SYhGgMsQ1+LG4v3f17B09rCyqa2Y0fzzCeq8pXJUpiPB/F6jTwc1GVJ1GNQ6dp3lJSLqkEyjbSG+YYDrKnBA+o77a8xruQunK219yeN/aGNaM0j9NTAvpmXqA2VsHDSigMWMrFdDnt1vY8xtpSep4hUz+qTGXbIG1K+iWMvW7137x1Y27UQtBzHyqd6A80qi/00AsqXfKETuWFh0OjLwSv/KLjSkkcbZjXTYLhoA3eeRI6tBFd86h8Inhzr1m/L+v7xESZQ6m8XCJnARckoketca+paNGmVuiievllG032tKKjtezf1f36u43PeEYAY1PV/gMeU6lGAhyHxgAAAABJRU5ErkJggg==) no-repeat center center;
+    background-size: 100% 100%;
+}

+ 94 - 8
src/web/staticres/common-module/vipsubscribe/js/area-three-sidebar-template.js

@@ -68,9 +68,9 @@ var AreaThreeSidebarTemplate = `
             @onChange="onChange($event, parent.value)"
             :beforeChildChange="beforeChildChange"
            :showParentWhenChildrenEmpty="false">
-            <template #tab-item="{ parent }">
-              <div class="title-name" v-show="!isGAT(parent.name)">{{ parent.name }}</div>
-              <div class="title-text" v-show="!isGAT(parent.name)">
+            <template #tab-item="{ parent }">   
+              <div class="title-name" v-show="parent.name !== parent.parentName">{{ parent.name }}</div>
+              <div class="title-text" v-show="parent.name !== parent.parentName">
                 <slot name="tab-tag" :parent="parent">
                   <van-tag
                     round
@@ -157,6 +157,13 @@ var areaThreeSidebarComponent = {
     canEmptySelected: {
       type: Boolean,
       default: false
+    },
+    // 只展示过滤后数据
+    filterAreaObj: {
+      type: Object,
+      default () {
+        return {}
+      }
     }
   },
   model: {
@@ -391,7 +398,11 @@ var areaThreeSidebarComponent = {
           })
         })
       }
-      this.provinceList = provinceList
+      if(this.filterAreaObj && Object.keys(this.filterAreaObj).length > 0) {
+        this.provinceList = this.formatFilterArea(provinceList)
+      } else {
+        this.provinceList = provinceList
+      }
     },
     disabledCityClick () {
       this.$emit('on-disabled-city-click')
@@ -643,10 +654,85 @@ var areaThreeSidebarComponent = {
       this.$set(this.sourceFirstCount, value, result)
       this.$refs.firstSidebar.setParentLevel0State(false)
     },
-    // 是否是港澳台地区
-    isGAT(val) {
-      var GATList = ['香港', '澳门', '台湾']
-      return val && GATList.indexOf(val) > -1
+    // 格式化需要过滤的省,市,区县
+    formatFilterArea: function (provinceList) {
+      var allProvince = [] // 选择了全省
+      var otherProvince = [] // 选择了非全省
+      var allCity = []
+      var otherCity = []
+      var district = []
+      for(var pKey in this.filterAreaObj) {
+        var cObj = this.filterAreaObj[pKey]
+        if(Object.keys(cObj).length === 0) {
+          // 选择了全省的
+          allProvince.push(pKey)
+        } else {
+          otherProvince.push(pKey)
+          for(var cKey in cObj) {
+            // 城市
+            var dList = cObj[cKey]
+            if(!dList || (dList && dList.length === 0)) {
+              allCity.push(cKey)
+            } else {
+              otherCity.push(cKey)
+              if(dList && Array.isArray(dList)) {
+                for(var dItem of dList) {
+                  district.push(cKey + '_' + dItem)
+                }
+              }
+            }
+          }
+        }
+      }
+      // 过滤数组
+      var resultList =[]
+       for(var pItem of provinceList) {
+         var pName = pItem.name
+         if(pItem.name === '全国') {
+           continue
+         } else {
+           // 选择了全省
+           if(allProvince.indexOf(pName) > -1) {
+             resultList.push(pItem)
+           } else if (otherProvince.indexOf(pName) > -1) {
+             // 当前省
+             var pObj = {}
+             if(pItem.children && Array.isArray(pItem.children)) {
+               // 城市
+               var cArr = []
+               for(var cItem of pItem.children) {
+                 var cName = cItem.name
+                 // 选择了全市
+                 if(allCity.indexOf(cName) > -1) {
+                   cArr.push(cItem)
+                 } else if(otherCity.indexOf(cName) > -1) {
+                   // 当前城市
+                   var cObj = {}
+                   if(cItem.children && Array.isArray(cItem.children)) {
+                       // 区县
+                       var dArr = []
+                       for(var dItem of cItem.children) {
+                         var dName = dItem.name
+                         if(district.indexOf((cName + '_' + dName)) > -1) {
+                           dArr.push(dItem)
+                         }
+                       }
+                       cObj = Object.assign(cItem, {
+                         children: dArr
+                       })
+                   }
+                   cArr.push(cObj)
+                 }
+               }
+               pObj = Object.assign(pItem, {
+                 children: cArr
+               })
+             }
+             resultList.push(pObj)
+           }
+         }
+       }
+      return resultList
     }
   }
 }

+ 11 - 7
src/web/staticres/course/css/order_list.css

@@ -261,13 +261,11 @@
   background-color: #E5F8FA;
 }
 .shop_main{
-	width:600px;
-}
-
-@media only screen and (max-width:1440px),only screen and (max-device-width:1440px) {
-  .shop_main{
-    width: auto;
-  }
+  flex: 1;
+  width: auto;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
 }
 
 .shop_main p{
@@ -275,3 +273,9 @@
     overflow: hidden;
     text-overflow: ellipsis;
 }
+
+@media only screen and (max-width:1440px),only screen and (max-device-width:1440px) {
+  .shop_main{
+    width: 420px;
+  }
+}

+ 85 - 10
src/web/staticres/js/selector/area-city-country.js

@@ -72,6 +72,24 @@ var areaCityCountrySelector = {
   name: 'areaCityCountry',
   template: areaCityCountryTemp,
   props: {
+     /**
+     *  const obj = {
+          安徽: {},
+          广西: {
+            贺州市: ['富川瑶族自治县']
+          },
+          河南: {
+            郑州市: []
+          }
+        }
+     *  父组件传递要显示的省市县区数据源(需要再从chinaMapJSON中过滤,拿到完整的省市县区数据源)
+     */
+    source: {
+      type: Object,
+      default () {
+        return {}
+      }
+    },
     // 初始化选中的地区('': 不选, {}:全国)
     initMap: {
       type: [Object, String],
@@ -189,6 +207,9 @@ var areaCityCountrySelector = {
     }
   },
   watch: {
+    source (val) {
+      this.initAreaMap()
+    }
     // initMap (val) {
     //   this.setState(val)
     // }
@@ -293,15 +314,17 @@ var areaCityCountrySelector = {
     initAreaMap () {
       const provinceList = this.getCitiesFromJSONArray()
       const specialRegion = ['全国', '香港', '澳门', '台湾']
-      // 如果需要包含全国、全部选项
-      if (this.isHaveAll) {
-        provinceList.unshift({
-          name: '全国',
-          checked: false,
-          disabled: false,
-          indeterminate: false,
-          children: []
-        })
+      if (Object.keys(this.source).length === 0) {
+        // 如果需要包含全国、全部选项
+        if (this.isHaveAll) {
+          provinceList.unshift({
+            name: '全国',
+            checked: false,
+            disabled: false,
+            indeterminate: false,
+            children: []
+          })
+        }
       }
       provinceList.forEach((province) => {
         province.children.unshift({
@@ -390,7 +413,12 @@ var areaCityCountrySelector = {
           }
         }
       })
-      return standardData
+      if (this.source && Object.keys(this.source).length > 0) {
+        // 显示部分省市县区数据(接口返回)
+        return this.formatSourceMapJson(standardData)
+      } else {
+        return standardData
+      }
     },
     /**
      * 将过滤好的地区数据转换成map格式(根据场景需要转换)
@@ -878,6 +906,53 @@ var areaCityCountrySelector = {
         }
       }
       return tagsArr.join(mark)
+    },
+    // 从chinaMapJSON数据中过滤出需要展示的省市县数据
+    formatSourceMapJson (arr) {
+      // const obj = {
+      //   安徽: {},
+      //   广西: {
+      //     贺州市: ['富川瑶族自治县']
+      //   },
+      //   河南: {
+      //     郑州市: []
+      //   }
+      // }
+      const obj = this.source
+      const data = JSON.parse(JSON.stringify(arr))
+      const newData = data.filter(item => {
+        const province = item.name
+        if (obj[province]) {
+          const cities = item.children
+          const objCities = Object.keys(obj[province])
+          const filteredCities = cities.filter(city => {
+            if (Object.keys(obj[province]).length === 0) {
+              return city
+            } else {
+              return objCities.includes(city.name)
+            }
+          })
+          filteredCities.forEach(city => {
+            const districts = city.children
+            const objDistricts = obj[province][city.name]
+            if (objDistricts) {
+              const filteredDistricts = districts.filter(district => {
+                if (objDistricts.length === 0) {
+                  return district
+                } else {
+                  return objDistricts.includes(district.name)
+                }
+              })
+              city.children = filteredDistricts
+            }
+          })
+          item.children = filteredCities
+          return true
+        }
+        return false
+      })
+      // console.log(newData, 'newData')
+      return newData
     }
   }
 }

File diff suppressed because it is too large
+ 0 - 0
src/web/staticres/js/selector/area-city-country.min.js


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

@@ -75,7 +75,7 @@
                           <span>{temp.title}</span>
                           <span>{dateMatter(temp.createtime)}</span>
                       </div>
-                      <p>{temp.content}</p>
+                      <p v-html="temp.content"></p>
                   </div>
                 </div>
               </div>

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

@@ -191,7 +191,7 @@
                   </div>
               </div>
               <div style="font-size: 14px;flex: 1;">
-                <span style="color: #2CB7CA">包含:</span>匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、项目范围、预算金额、中标金额、报名截止日期、开标日期、投标截止日期、采购单位信息(采购单位名称、采购单位联系人、采购单位联系电话、采购单位地址)、招标代理机构、中标单位信息(中标单位名称、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)
+                <span style="color: #2CB7CA">包含:</span>匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、项目范围、预算金额、中标金额、报名截止日期、开标日期、投标截止日期、合同签订时间、采购单位信息(采购单位名称、采购单位联系人、采购单位联系电话、采购单位地址)、招标代理机构、中标单位信息(中标单位名称、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)
               </div>
               <div class="dataPreview" type="gj" style="color: #2CB7CA;width: 56px;font-size: 14px;margin-right: 20px;margin-left: 33px;cursor: pointer">预览数据</div>
             </div>

+ 5 - 2
src/web/templates/pc/dataExport_sieve.html

@@ -1063,7 +1063,7 @@
                 标准字段包:<br/>
                 匹配关键词、省份、城市、公告标题、剑鱼标讯地址、公告类别、发布时间、采购单位、中标单位、中标金额、项目名称、公告内容<br/>
                 高级字段包:<br/>
-                匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、行业、项目范围、预算金额、中标金额、报名截止日期、开标日期、投标截止日期、采购单位信息(采购单位名称、采购单位类型、采购单位联系人、采购单位联系电话、采购单位地址)、招标代理机构、中标单位信息(中标单位名称、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)
+                匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、行业、项目范围、预算金额、中标金额、报名截止日期、开标日期、投标截止日期、合同签订时间、采购单位信息(采购单位名称、采购单位类型、采购单位联系人、采购单位联系电话、采购单位地址)、招标代理机构、中标单位信息(中标单位名称、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)
               </template>
               <img class="data_help_img" src='{{Msg "seo" "cdn"}}/images/help.png' />
             </el-tooltip>
@@ -1092,7 +1092,7 @@
                 标准字段包:<br/>
                 匹配关键词、省份、城市、公告标题、剑鱼标讯地址、公告类别、发布时间、采购单位、中标单位、中标金额、项目名称、公告内容<br/>
                 高级字段包:<br/>
-                匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、行业、项目范围、预算金额、中标金额、报名截止日期、开标日期、投标截止日期、采购单位信息(采购单位名称、采购单位类型、采购单位联系人、采购单位联系电话、采购单位地址)、招标代理机构、中标单位信息(中标单位名称、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)
+                匹配关键词、省份、城市、区县、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、行业、项目范围、预算金额、中标金额、报名截止日期、开标日期、投标截止日期、合同签订时间、采购单位信息(采购单位名称、采购单位类型、采购单位联系人、采购单位联系电话、采购单位地址)、招标代理机构、中标单位信息(中标单位名称、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)
               </template>
               <img class="data_help_img" src='{{Msg "seo" "cdn"}}/images/help.png' />
             </el-tooltip>
@@ -1274,6 +1274,7 @@
               <td>${item.signendtime}</td>
               <td>${item.bidopentime}</td>
               <td>${item.bidendtime}</td>
+              <td>${item.signaturedate}</td>
               <td>${item.buyer}</td>
               <td>${item.buyerclass}</td>
               <td name="name">${textFormatForMosaic(item.buyerperson)}</td>
@@ -1476,6 +1477,7 @@
         {rowspan: 2,colspan: 1,title: '报名截止日期',},
         {rowspan: 2,colspan: 1,title: '开标日期',},
         {rowspan: 2,colspan: 1,title: '投标截止日期',},
+        {rowspan: 2,colspan: 1,title: '合同签订时间',},
         {rowspan: 1,colspan: 5,title: '采购单位信息',},
         {rowspan: 2,colspan: 1,title: '招标代理机构',},
         {rowspan: 1,colspan: 3,title: '中标单位信息(来源:招标公告网站)',},
@@ -2299,6 +2301,7 @@
             {rowspan: 2,colspan: 1,title: '报名截止日期',},
             {rowspan: 2,colspan: 1,title: '开标日期',},
             {rowspan: 2,colspan: 1,title: '投标截止日期',},
+            {rowspan: 2,colspan: 1,title: '合同签订时间',},
             {rowspan: 1,colspan: 5,title: '采购单位信息',},
             {rowspan: 2,colspan: 1,title: '招标代理机构',},
             {rowspan: 1,colspan: 3,title: '中标单位信息(来源:招标公告网站)',},

+ 1 - 1
src/web/templates/pc/dataPack/createOrderForDataPackage.html

@@ -147,7 +147,7 @@
                 <div>标准字段包</div>
                 <div>匹配关键词、省份、城市、公告标题、剑鱼标讯地址、公告类别、发布时间、采购单位、中标单位、中标金额、项目名称、公告内容</div>
                 <div>高级字段包</div>
-                <div>匹配关键词、省份、城市、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、项目范围、预算金额、中标金额、开标日期、投标截止日期、采购单位、采购单位信息(采购单位联系人、采购单位联系电话、招标代理机构)、中标单位信息(中标单位、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)</div>
+                <div>匹配关键词、省份、城市、公告标题、公告类别、公告内容、发布时间、公告地址、剑鱼标讯地址、项目名称、项目范围、预算金额、中标金额、开标日期、投标截止日期、合同签订时间、采购单位、采购单位信息(采购单位联系人、采购单位联系电话、招标代理机构)、中标单位信息(中标单位、中标单位联系人、中标单位联系电话)(来源:招标公告网站)、中标单位信息(中标单位联系人、中标单位联系电话、电子邮箱)(来源:国家企业公示网站)</div>
             </span>
         </span>
         <div class="main_footer">

+ 3 - 3
src/web/templates/pc/messageDetail.html

@@ -17,7 +17,7 @@
             background: #F2F4F7;
         }
         .j-container{
-            padding-top:72px;
+            /* padding-top:72px; */
         }
         .main-content{
             background: #fff;
@@ -98,9 +98,9 @@
       success:function (res) {
         var data = res.data
         if (data) {
-          $('.msg-title').text(data.title)
+          $('.msg-title').html(data.title)
           $('.msg-date').text(dateMatter(data.createtime || Date.now()))
-          $('.msg-content').text(data.content)
+          $('.msg-content').html(data.content)
         }
       },
       error:function () {}

+ 17 - 7
src/web/templates/pc/orderDetail.html

@@ -280,6 +280,8 @@
             var publishtime = filter["publishtime"];
             var region = filter["region"];
             var area = filter["area"];
+            var city = filter["city"];
+            var district = filter["district"]
             var industry = filter["industry"];
             var keywords = filter["keywords"];
             var buyerclass = filter["buyerclass"]
@@ -297,16 +299,24 @@
                 }
             }
             var regionHtml = "";
-            if (region && region.length > 0) {
-                for (var i = 0; i < region.length; i++) {
-                    regionHtml += "<span>" + region[i] + "</span>";
-                }
-            } else if (area && area.length > 0) {
+            if (!area && !city && !district && !region) {
+              regionHtml += "<span>全国</span>";
+            } else {
+              if (area && area.length > 0) {
                 for (var i = 0; i < area.length; i++) {
                     regionHtml += "<span>" + area[i] + "</span>";
                 }
-            } else {
-                regionHtml += "<span>全国</span>";
+              }
+              if (city && city.length > 0) {
+                for (var i = 0; i < city.length; i++) {
+                    regionHtml += "<span>" + city[i] + "</span>";
+                  }
+              }
+              if (district && district.length > 0) {
+                for (var i = 0; i < district.length; i++) {
+                    regionHtml += "<span>" + district[i] + "</span>";
+                  }
+              }
             }
             var industryHtml = "";
             if (industry && industry.length > 0) {

+ 1 - 0
src/web/templates/pc/previewData.html

@@ -248,6 +248,7 @@
           {width: '90', filed: 'signendtime', title: '报名截止日期',},
           {width: '90', filed: 'bidopentime', title: '开标日期',},
           {width: '90', filed: 'bidendtime', title: '投标截止日期',},
+          {width: '90', filed: 'signaturedate', title: '合同签订时间',},
           {width: '', filed: '', title: '采购单位信息',},
           {width: '143', filed: 'agency', title: '招标代理机构',},
           {width: '', filed: '', title: '中标单位信息(来源:招标公告网站)',},

+ 3 - 2
src/web/templates/pc/supsearch.html

@@ -385,7 +385,7 @@
         $("#infoBtn").removeClass("active");
         subtype = subtype.split(",");
         for(var i=0;i<subtype.length;i++){
-          $(".info-content>font").each(function(){
+          $(".info-content font").each(function(){
             if($(this).text() == subtype[i]){
               $(this).addClass("active")
             }
@@ -4612,7 +4612,7 @@ function checkTagDisabled () {
           $(".info-content font").removeClass('active').removeClass('secondActice')
           item.subtype = item.subtype.toString().split(",");
           for(var i=0;i<item.subtype.length;i++){
-            $(".info-content>font").each(function(){
+            $(".info-content font").each(function(){
               if($(this).text() == item.subtype[i]){
                 $(this).addClass("active")
               }
@@ -5082,6 +5082,7 @@ function checkTagDisabled () {
             location.replace('/jylab/supsearch/index.html?searchGroup=1')
           }
         }
+        $("#zbSeatchT [name='searchGroup']").val(item)
         this.searchTab = item
         // if (item !== 0) {
         //   // 招标采购公共、超前项目切换时要清除信息类型选择结果

Some files were not shown because too many files changed in this diff