Bladeren bron

Merge branch 'dev/v4.8.26_tsz' of qmx/jy into feature/v4.8.26

汤世哲 2 jaren geleden
bovenliggende
commit
f5949d8dd9

+ 4 - 2
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/report_detail_month.js

@@ -136,7 +136,7 @@ var vNode = {
           finished: false
         },
         listParams: {
-          sortType: 0, // 项目明细排序方式
+          sort: 0, // 项目明细排序方式
           pageSize: 10,
           pageNum: 1,
           start: parseInt(utils.getParam('start')),
@@ -220,7 +220,9 @@ var vNode = {
       },
       // 设置排序方式
       setsortType (data) {
-        this.sortType = data
+        this.listParams.pageNum = 0
+        this.listParams.sort = data
+        this.onListLoad()
       },
       showLoading: function () {
         return this.$toast.loading({

+ 69 - 9
src/jfw/modules/app/src/web/staticres/jyapp/big-member/js/report_detail_week.js

@@ -8,6 +8,7 @@ var vNode = {
       empty: emptyComponent
     },
     data: {
+        sessStorageKey: "$data-report_week",
         barChart: barChart,
         keywordsList: [],
         keywords: '',
@@ -60,10 +61,11 @@ var vNode = {
         detailInfo: {},
         vanlistParams: {
           loading: false,
-          finished: false
+          finished: false,
+          scrollTop: 0
         },
         listParams: {
-          sortType: 0, // 项目明细排序方式
+          sort: 0, // 项目明细排序方式
           pageSize: 10,
           pageNum: 1,
           start: parseInt(utils.getParam('start')),
@@ -83,15 +85,68 @@ var vNode = {
         this.dateVal = startTime + '-' + endTime;
     },
     mounted() {
+      const recover = this.reStoreState()
+      if(!recover) {
         this.getUserPower()
-        this.getAllChartsData()
-        const observer = new IntersectionObserver(this.handleIntersection, {
-          root: null, // 默认为浏览器视窗
-          threshold: 0, // 交叉比例,0为完全进入视窗
-        });
-        observer.observe(this.$refs.reportSource)
+      }
+      this.getAllChartsData()
+      const observer = new IntersectionObserver(this.handleIntersection, {
+        root: null, // 默认为浏览器视窗
+        threshold: 0, // 交叉比例,0为完全进入视窗
+      });
+      observer.observe(this.$refs.reportSource)
     },
     methods: {
+      // 保存页面状态
+      saveState: function () {
+        this.saveScrollTop()
+        var $data = {
+          tabActive: this.tabActive,
+          listParams: this.listParams,
+          vanlistParams: this.vanlistParams,
+          filterData: this.filterData,
+          detailInfo: this.detailInfo,
+          projectInfo: this.projectInfo,
+          keywordsList: this.keywordsList,
+          keywords: this.keywords,
+        }
+        sessionStorage.setItem(this.sessStorageKey, JSON.stringify($data))
+      },
+      reStoreState: function () {
+        var $data = sessionStorage.getItem(this.sessStorageKey)
+        if ($data) {
+          $data = JSON.parse($data)
+          Object.assign(this.listParams, $data.listParams)
+          Object.assign(this.vanlistParams, $data.vanlistParams)
+          Object.assign(this.filterData, $data.filterData)
+          Object.assign(this.detailInfo, $data.detailInfo)
+          Object.assign(this.projectInfo, $data.projectInfo)
+          this.keywordsList = $data.keywordsList,
+          this.tabActive = $data.tabActive,
+          this.keywords = $data.keywords
+
+          setTimeout(function () {
+            // 恢复滚动高度
+            this.setScrollTop(this.vanlistParams.scrollTop)
+          }.bind(this), 0)
+
+          sessionStorage.removeItem(this.sessStorageKey)
+        }
+
+        return $data
+      },
+      setScrollTop: function (scrollTop) {
+        this.$nextTick(function () {
+          var wrapper = document.getElementById('report_week')
+          wrapper.scrollTop = scrollTop
+        })
+      },
+      saveScrollTop: function () {
+        var wrapper = document.getElementById('report_week')
+        if (wrapper.scrollTop) {
+          this.vanlistParams.scrollTop = parseInt(wrapper.scrollTop)
+        }
+      },
       handleIntersection(entries) {
         entries.forEach((entry) => {
           // 元素不可见
@@ -107,6 +162,7 @@ var vNode = {
         }.bind(this), 100)
       },
       setLinkUrl (data) {
+        this.saveState()
         if(data) {
           const params = {
             sid: data.id
@@ -116,14 +172,18 @@ var vNode = {
         location.href = '/jyapp/big/page/pro_follow_detail'
       },
       setBuyerLink (data) {
+        this.saveState()
         location.href = '/jyapp/big/page/unit_portrayal?entName=' + data.buyer
       },
       setWinnerLink (id) {
+        this.saveState()
         location.href = '/jyapp/big/page/ent_portrait?eId=' + id
       },
       // 设置排序方式
       setsortType (data) {
-        this.sortType = data
+        this.listParams.pageNum = 0
+        this.listParams.sort = data
+        this.onListLoad()
       },
       showLoading: function () {
         return this.$toast.loading({

+ 9 - 5
src/jfw/modules/app/src/web/templates/big-member/page_report_analysis.html

@@ -285,7 +285,7 @@
                             </div>
                         </div>
                         <!-- 城市分布 -->
-                        <div class="section bg-white pd-16 city-scatter" v-if="sections.areaScatter.dataAlready && notOneAreaFilter && getStatus">
+                        <div class="section bg-white pd-16 city-scatter" v-if="sections.areaScatter.dataAlready && notOneAreaCityFilter && getStatus">
                           <div class="section-title">城市分布</div>
                           <div class="section-content">
                             <!-- <market-area-scatter :chart-data="sections.areaScatter.chartData"></market-area-scatter> -->
@@ -295,15 +295,16 @@
                                 <van-icon name="play"></van-icon>
                               </div>
                               <div class="set-sort-type">
-                                <project-header :showtotal="false" @setsort-type="setsortType"></project-header>
+                                <project-header :sort-option="sortOptionContent" :sort-optiontitle="sortOptionTitle" :showtotal="false" @setsort="setsortType"></project-header>
                               </div>
-                              <div class="set-unit">单位:万元</div>
+                              <div class="set-unit">单位:${sections.areaScatter.sortType===0?'个':'万元'}</div>
                             </div>
                             <div class="progress-bar-container">
                               <div class="progress-bar-item" v-for="(item,index) in showAreaCityBtn" :key="index">
                                   <div class="item-label">
                                       <span class="item-name">${item.city}</span>
-                                      <span class="item-count" :class="[index < 3 && !getStatus ? 'shade': '']">${item.total}个</span>
+                                      <span class="item-count" v-if="sections.areaScatter.sortType===0">${item.total}个</span>
+                                      <span class="item-count" v-else>${showCountAmount(item)}万元</span>
                                   </div>
                                   <div class="item-progress">
                                       <span class="item-progress-count blue-progress" :style="{width: item.parent}"></span>
@@ -328,9 +329,12 @@
                           get-container="body">
                           <div class="j-container report-popup">
                               <div class="popup-header header-title">请选择省份</div>
-                              <div class="j-main">
+                              <div class="j-main area-content">
                                   <area-component
                                       :multiple="false"
+                                      :newprovincelist="reportFilters.area"
+                                      :showzxs="false"
+                                      :showcountry="false"
                                       ref="areaSelector"
                                       @cancel="cancelSelectArea"
                                       @confirm="confirmSelectArea"></area-component>

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

@@ -20,7 +20,7 @@
     <div class="j-main" id="analysisList" v-cloak>
       <filter-component :show-tip="false" :show-select="false" :filters="filters"  @confirm="confirm"></filter-component>
       <div class="project-detail-list" v-if="Object.keys(projectInfo).length != 0 && projectInfo.list.length > 0">
-        <project-header @setsort-type="setsortType"></project-header>
+        <project-header :total="projectInfo.total"  @setsort="setsortType"></project-header>
         <van-list
           v-model:loading="vanlistParams.loading"
           :finished="vanlistParams.finished"

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

@@ -893,7 +893,7 @@
           <van-tab name="1" title="本月项目明细">
             <filter-component :show-tip="false" :show-select="false" :arealist="area" :keyphraseslist="keywordsList" keyformat="phrases" @confirm="confirm"></filter-component>
             <div class="project-detail-list" v-if="Object.keys(projectInfo).length != 0 && projectInfo.list.length > 0">
-              <project-header :total="projectInfo.total" @setsort-type="setsortType"></project-header>
+              <project-header :total="projectInfo.total" @setsort="setsortType"></project-header>
               <van-list
                 v-model:loading="vanlistParams.loading"
                 :finished="vanlistParams.finished"

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

@@ -522,7 +522,7 @@
           <van-tab name="1" title="本周项目明细">
             <filter-component :show-tip="false" :show-select="false" :arealist="area" :keyphraseslist="keywordsList" keyformat="phrases" @confirm="confirm"></filter-component>
             <div class="project-detail-list" v-if="Object.keys(projectInfo).length != 0 && projectInfo.list.length > 0">
-              <project-header :total="projectInfo.total" @setsort-type="setsortType"></project-header>
+              <project-header :total="projectInfo.total" @setsort="setsortType"></project-header>
               <van-list
                 v-model:loading="vanlistParams.loading"
                 :finished="vanlistParams.finished"

+ 3 - 0
src/web/staticres/common-module/collection/css/index.css

@@ -843,6 +843,9 @@
 .select-area-box .van-index-bar__sidebar {
     top: 40%;
 }
+.area-content .select-area-box .van-index-bar__sidebar{
+  top: 65%;
+}
 
 .select-area-box .fix-bottom {
     box-sizing: border-box;

+ 78 - 1
src/web/staticres/common-module/collection/js/area-mobile.js

@@ -36,6 +36,26 @@ var areaComponent = {
         return []
       }
     },
+    // 新的省份数据,用于替换原始数组
+    newprovincelist: {
+      type: Object,
+      default () {
+        return {
+          // 安徽: ['合肥', '蚌埠'],
+          // 广州: ['广东', '揭阳']
+        }
+      }
+    },
+    // 是否展示全国按钮
+    showcountry: {
+      type: Boolean,
+      default: true
+    },
+    // 是否显示直辖市
+    showzxs: {
+      type: Boolean,
+      default: true
+    },
     initarealist: {
       type: Object,
       default: function () {
@@ -88,6 +108,14 @@ var areaComponent = {
         }
       },
       immediate: true
+    },
+    'newprovincelist' :{
+      handler(newval) {
+        if(Object.keys(newval) != 0) {
+          this.arrangeListMap(this.provinceListMap)
+        }
+      },
+      immediate: true
     }
   },
   created () {
@@ -99,11 +127,45 @@ var areaComponent = {
   methods: {
     // 整理数据得到indexListMap,同时获得indexList
     arrangeListMap: function (provinceListMap) {
+      if(Object.keys(this.newprovincelist).length > 0) {
+        let newProList = []
+        Object.keys(provinceListMap).forEach((v, i) => {
+          provinceListMap[v].forEach(m => {
+            Object.keys(this.newprovincelist).forEach(n => {
+              if (m == n) {
+                newProList.push({
+                  [v]: [n]
+                })
+              }
+            })
+          })
+        })
+        // 合并并去重数组中的元素
+        const result = newProList.reduce((acc, cur) => {
+          Object.keys(cur).forEach(key => {
+            acc[key] = Array.from(new Set([...(acc[key] || []), ...cur[key]]))
+          })
+          return acc
+        }, {})
+        provinceListMap = result
+      }
+      // 是否展示直辖市
+      if (!this.showzxs) {
+        provinceListMap = this.deleteZXSData(provinceListMap)
+      }
+      // 是否展示全国按钮
+      if(!this.showcountry) {
+        delete provinceListMap['#']
+      }
       this.indexList = []
       this.indexListMap = {}
 
       for (var key in provinceListMap) {
-        this.indexList.push(key)
+        if(provinceListMap[key].length == 0 && !this.showzxs) {
+          // this.indexList.push(key)
+        } else {
+          this.indexList.push(key)
+        }
         this.indexListMap[key] = provinceListMap[key].map(function (item) {
           return {
             name: item,
@@ -112,6 +174,19 @@ var areaComponent = {
         })
       }
     },
+    // 删除直辖市
+    deleteZXSData: function (data) {
+      for (var key in data) {
+        data[key].forEach((v, i) => {
+          chinaMapJSON.forEach(item => {
+            if (item.name.indexOf(v) !== -1 && (item.ProRemark === '直辖市' || item.ProRemark === '特别行政区')) {
+              data[key].splice(i, 1)
+            }
+          })
+        })
+      }
+      return data
+    },
     // 回显数据
     setState: function (data) {
       let optionArr = []
@@ -120,6 +195,7 @@ var areaComponent = {
       } else {
         optionArr = this.selectarealist
       }
+      const _this = this
       for (var key in this.indexListMap) {
         this.indexListMap[key].forEach(function (item) {
             item.selected = false
@@ -127,6 +203,7 @@ var areaComponent = {
               if(item.name == sum) {
                 item.selected = true
               }
+              _this.$forceUpdate()
             })
         })
       }

+ 12 - 26
src/web/staticres/common-module/filter/css/project_header.css

@@ -1,7 +1,8 @@
 .project-detail-list {
   padding: 0 .32rem;
+  background: #fff;
 }
-.project-detail-list .project-detail-title{
+.project-detail-title{
   display: flex;
   justify-content: space-between;
   align-items: center;
@@ -20,43 +21,28 @@
   font-size: .28rem;
   color: #9B9CA3;
 }
-.project-detail-title .p-d-t-right .van-dropdown-menu__bar{
-  box-shadow: none;
-}
 
-.project-detail-title .van-dropdown-menu__title{
-  padding-left: 0;
-}
-.project-detail-title .van-dropdown-menu__title .van-ellipsis{
+.sort-type-title{
   font-size: .28rem;
   color: #5F5E64;
 }
-.project-detail-list .van-dropdown-menu__title::after{
-  border: 5px solid;
-  border-color: transparent transparent #C0C4CC #C0C4CC;
-  margin-top: -.16rem;
-  right: -.2rem;
-}
-.project-detail-list .van-dropdown-item__content {
-  max-height: 100%;
+.sort-type-title .van-icon{
+  transform: rotate(90deg);
+  color: #C0C4CC;
 }
-.project-detail-list .van-dropdown-menu__title--down::after{
-  border-color: transparent transparent #2ABED1 #2ABED1;
-  margin-top: -.1rem;
-  right: -.2rem;
-}
-.project-detail-list .van-cell{
+.select_sort .van-cell{
   padding: 0 .32rem;
   height: .88rem;
 }
-.project-detail-list .van-cell.van-dropdown-item__option{
+.select_sort .van-cell.van-dropdown-item__option{
   font-size: .28rem;
   color: #5F5E64;
 }
-.project-detail-list .van-cell.activeColor{
+.select_sort .van-cell.activeColor{
   color: #2ABED1;
 }
-.project-detail-list .van-cell .select_active{
+.select_sort .van-cell .select_active{
   width: .48rem;
   height: .48rem;
-}
+}
+

+ 1 - 0
src/web/staticres/common-module/filter/js/filter_limit.js

@@ -376,6 +376,7 @@ var filterComponent = {
         text = this.resolveSelectBuyerclassText(filters.buyerclass)
       }
       if ((text != '全部' && text != '全国') && !this.showSelect) {
+        this.colorEdit[type] = true
         return text
       } else {
         return prefix + text

+ 45 - 17
src/web/staticres/common-module/filter/js/project_header.js

@@ -5,16 +5,32 @@ var projectHeaderTemp = `
   </div>
   <div class="p-d-t-right">
     <span class="sort-label" v-if="showtotal">排序:</span>
-    <van-dropdown-menu active-color="#2ABED1">
-      <van-dropdown-item ref="sortMenu" :title="sortOptionSelect">
-        <van-cell center :class="{'activeColor': item.active}" @click="setSortRules(item)" :title="item.text" v-for="(item, index) in sortOption" :key="index">
-          <template #right-icon>
-            <img v-if="item.active" class="select_active" src="/common-module/filter/image/right.png" alt="">
-          </template>
-        </van-cell>
-      </van-dropdown-item>
-    </van-dropdown-menu>
+    <div class="sort-type-title" @click="setSortType">
+      <span>{{ sortOptiontitle }}</span>
+      <van-icon name="play"></van-icon>
+    </div>
   </div>
+  <van-popup
+    v-model="showSortPopup"
+    closeable
+    round
+    position="bottom"
+    close-icon="clear"
+    class="j-popup collection select_sort"
+    :lazy-render="false"
+    overlay-class="j-overlay"
+    get-container="body">
+    <div class="j-container report-popup">
+        <div class="popup-header header-title">请选择排序</div>
+        <div class="j-main">
+          <van-cell center :class="{'activeColor': item.active}" @click="setSortRules(item)" :title="item.text" v-for="(item, index) in sortOption" :key="index">
+            <template #right-icon>
+              <img v-if="item.active" class="select_active" src="/common-module/filter/image/right.png" alt="">
+            </template>
+          </van-cell>
+        </div>
+    </div>
+  </van-popup>
 </div>
 `
 
@@ -29,28 +45,40 @@ var projectHeaderComponent = {
     showtotal: {
       type: Boolean,
       default: true
+    },
+    sortOptiontitle: {
+      type: String,
+      default: '项目更新时间由晚到早'
+    },
+    sortOption: {
+      type: Array,
+      default () {
+        return [
+          { text: '项目更新时间由晚到早', value: 0, active: true },
+          { text: '项目金额由大到小', value: 1, active: false }
+        ]
+      }
     }
   },
   data () {
     return {
-      sortOptionSelect: '项目更新时间由晚到早',
-      sortOption: [
-        { text: '项目更新时间由晚到早', value: 0, active: true },
-        { text: '项目金额由大到小', value: 1, active: false }
-      ]
+      showSortPopup: false
     }
   },
   methods: {
+    setSortType () {
+      this.showSortPopup = true
+    },
     // 选择排序方式
     setSortRules: function (data) {
       this.sortOption.forEach(option => {
         option.active = false
       })
       data.active = true
-      this.sortOptionSelect = data.text
-      this.$emit('setsortType', data.value)
+      this.sortOptiontitle = data.text
+      this.$emit('setsort', data.value)
       // 关闭菜单
-      this.$refs.sortMenu.toggle(false)
+      this.showSortPopup = false
     },
   }
 }

+ 50 - 9
src/web/staticres/common-module/report-analysis/js/report_analysis.js

@@ -203,6 +203,8 @@ var vm = new Vue({
       areaScatter: {
         dataAlready: false,
         chartData: null,
+        // 地区信息接口返回的原始数据
+        originAreaData: [],
         showAreaPopup: false,
         setCityList: [],
         selectArea: {},
@@ -249,7 +251,12 @@ var vm = new Vue({
     notSetKey: false, // 未设置关键词
     isSubCount: false, // 是否子账号
     powerInfo: {},
-    isWeixin: false
+    isWeixin: false,
+    sortOptionTitle: '项目数量由大到小排序',
+    sortOptionContent: [
+      { text: '项目数量由大到小排序', value: 0, active: true },
+      { text: '项目金额由大到小排序', value: 1, active: false }
+    ]
   },
   computed: {
     showBuyerBtn: function () {
@@ -267,13 +274,6 @@ var vm = new Vue({
     showAreaCityBtn: function () {
       return this.sections.areaScatter.showAreaCityListBtn ? this.sections.areaScatter.setCityList.slice(0, 5) : this.sections.areaScatter.setCityList
     },
-    // 选出项目数量最多的省份
-    getMaxProjectCount: function () {
-      const result  = this.sections.areaScatter.chartData.rows.reduce((max, item) => {
-        return item.项目数量 > max.项目数量 ? item : max
-      })
-      return result
-    },
     getStatus: function () {
       if (JSON.stringify(this.powerInfo) !== '{}') {
         return this.powerInfo.power.indexOf(10) !== -1
@@ -293,6 +293,15 @@ var vm = new Vue({
       var showArea = area && (Object.keys(area).length > 1 || Object.keys(area).length === 0)
       return showArea
     },
+    notOneAreaCityFilter () {
+      var area = this.reportFilters.area
+      if (!this.notOneAreaFilter) {
+        var showCity = area && (area[Object.keys(area)].length >=2)
+        return showCity
+      } else {
+        return this.notOneAreaFilter
+      }
+    },
     emptyShow () {
       return !this.rid && this.analysis.loaded
     },
@@ -367,10 +376,36 @@ var vm = new Vue({
     // 设置排序方式
     setsortType (data) {
       this.sections.areaScatter.sortType = data
+      this.sections.areaScatter.setCityList = this.formatterWinData(this.sections.areaScatter.setCityList, data===0?'total':'amount')
+      let newArr = []
+      if(data === 0) {
+        newArr = this.sections.areaScatter.setCityList.sort((a, b) => b.total - a.total)
+      } else {
+        newArr = this.sections.areaScatter.setCityList.sort((a, b) => b.amount - a.amount)
+      }
+      this.sortOptionTitle = this.sortOptionContent[data].text
+      this.sections.areaScatter.setCityList = newArr
+    },
+    cancelSelectArea () {
+      this.sections.areaScatter.showAreaPopup = false
     },
-    cancelSelectArea () {},
+    // 选择省份展示城市分布(单选)
     confirmSelectArea (data) {
       console.log(data)
+      if(this.sections.areaScatter.originAreaData.length > 0) {
+        this.sections.areaScatter.originAreaData.forEach(item => {
+          if(item.area == data.data[0]) {
+            this.sections.areaScatter.selectArea = item
+            const areaSort = this.sections.areaScatter.sortType === 0 ? 'total' : 'amount'
+            this.sections.areaScatter.setCityList = this.formatterWinData(item.areaDetails, areaSort)
+            this.sections.areaScatter.setCityList = this.sections.areaScatter.setCityList.sort((a, b) => b[areaSort] - a[areaSort])
+          }
+        })
+      }
+      this.sections.areaScatter.showAreaPopup = false
+    },
+    showCountAmount (data) {
+      return (data.amount / 10000).toFixed(2)
     },
     inProList () {
       this.saveState()
@@ -928,6 +963,7 @@ var vm = new Vue({
         // 项目规模分布
         this.sortProjectScatter(data.projectScale)
         // 地区规模分布
+        this.sections.areaScatter.originAreaData = data.area_infos
         this.sortAreaScatter(data.area_infos)
         // 城市分布
         this.sortAreaCityScatter(data.area_infos)
@@ -1340,6 +1376,8 @@ var vm = new Vue({
     },
     setAreaCity () {
       this.sections.areaScatter.showAreaPopup = true
+      const selectAreaArr = [this.sections.areaScatter.selectArea.area]
+      this.$refs.areaSelector.setState(selectAreaArr)
     },
     // 城市分布
     sortAreaCityScatter (areacitylist) {
@@ -1363,6 +1401,9 @@ var vm = new Vue({
             case 'total':
               v.parent = v.total / data[0].total*100 + "%";
               break;
+            case 'amount':
+              v.parent = v.amount / data[0].amount*100 + "%";
+              break;
           }
       })
       return data;

+ 67 - 64
src/web/staticres/common-module/report-analysis/js/report_analysis_pro_list.js

@@ -8,10 +8,11 @@ var vm = new Vue({
     empty: emptyComponent
   },
   data: {
-    sessStorageKey: '$data-report_analysis_history',
+    sessStorageKey: '$data-report_analysis_pro_list',
     vanlistParams: {
       loading: false,
-      finished: false
+      finished: false,
+      scrollTop: 0
     },
     filters: {
       selectKeysArr: [], // 关键词简单数组,用于恢复选择状态
@@ -27,7 +28,7 @@ var vm = new Vue({
       },
     },
     listParams: {
-      sortType: 0, // 项目明细排序方式
+      sort: 0, // 项目明细排序方式
       pageSize: 10,
       pageNum: 1
     },
@@ -36,14 +37,59 @@ var vm = new Vue({
   },
   computed: {
   },
-  created: function () {
-    this.getFilterData()
-  },
   mounted: function () {
-    this.reStoreState()
+    const recover = this.reStoreState()
+    if (!recover) {
+      this.getFilterData()
+    }
     utils.iosBackRefresh()
   },
   methods: {
+    // 保存页面状态
+    saveState: function () {
+      this.saveScrollTop()
+      var $data = {
+        filters: this.filters,
+        listParams: this.listParams,
+        filterData: this.filterData,
+        projectInfo: this.projectInfo,
+        vanlistParams: this.vanlistParams
+      }
+      sessionStorage.setItem(this.sessStorageKey, JSON.stringify($data))
+    },
+    // 恢复页面数据
+    reStoreState: function () {
+      var $data = sessionStorage.getItem(this.sessStorageKey)
+      if ($data) {
+        $data = JSON.parse($data)
+        Object.assign(this.filters, $data.filters)
+        Object.assign(this.listParams, $data.listParams)
+        Object.assign(this.filterData, $data.filterData)
+        Object.assign(this.projectInfo, $data.projectInfo)
+        Object.assign(this.vanlistParams, $data.vanlistParams)
+
+        setTimeout(function () {
+          // 恢复滚动高度
+          this.setScrollTop(this.vanlistParams.scrollTop)
+        }.bind(this), 0)
+
+        sessionStorage.removeItem(this.sessStorageKey)
+      }
+
+      return $data
+    },
+    setScrollTop: function (scrollTop) {
+      this.$nextTick(function () {
+        var wrapper = document.getElementById('analysisList')
+        wrapper.scrollTop = scrollTop
+      })
+    },
+    saveScrollTop: function () {
+      var wrapper = document.getElementById('analysisList')
+      if (wrapper.scrollTop) {
+        this.vanlistParams.scrollTop = parseInt(wrapper.scrollTop)
+      }
+    },
     // 获取筛选条件并回显
     getFilterData () {
       $.ajax({
@@ -105,6 +151,7 @@ var vm = new Vue({
     },
     // 点击项目
     setLinkUrl () {
+      this.saveState()
       if (utils.$envs.inWX) {
         location.href = '/big/wx/page/pro_follow_detail'
       } else {
@@ -112,6 +159,7 @@ var vm = new Vue({
       }
     },
     setBuyerLink (data) {
+      this.saveState()
       if (utils.$envs.inWX) {
         location.href = '/big/wx/page/unit_portrayal?entName=' + data.buyer
       } else {
@@ -119,15 +167,18 @@ var vm = new Vue({
       }
     },
     setWinnerLink (id) {
+      this.saveState()
       if (utils.$envs.inWX) {
-        location.href = '/big/wx/page/ent_portrait?eId=' + id
+        location.href = '/weixin/frontPage/collection/sess/ent_portrait?eId=' + id
       } else {
         location.href = '/jyapp/big/page/ent_portrait?eId=' + id
       }
     },
     // 设置排序方式
     setsortType (data) {
-      this.sortType = data
+      this.listParams.pageNum = 0
+      this.listParams.sort = data
+      this.onListLoad()
     },
     onListLoad: function () {
       this.listParams.pageNum++
@@ -144,15 +195,18 @@ var vm = new Vue({
       this.filters.buyerclass = buyerclass
       this.filters.buyer = buyer
       this.filters.winner = winner
+      let strBuyerClass = ''
+      if(buyerclass.length > 0) {
+        strBuyerClass = buyerclass.join(',')
+      }
       const params = {
         ...this.listParams,
         keysItems: JSON.stringify(items),
         area: JSON.stringify(area),
         industry: JSON.stringify(industry),
-        buyerclass: JSON.stringify(buyerclass),
+        buyerclass: strBuyerClass,
         buyer: buyer,
         winner: winner,
-        sort: this.listParams.sortType,
         rangeTime: parseInt(this.filters.rangeTime.start / 1000)+'-'+parseInt(this.filters.rangeTime.end / 1000),
         rangeTimeExtra: this.filters.rangeTimeExtra
       }
@@ -169,6 +223,7 @@ var vm = new Vue({
           this.vanlistParams.loading = false
           if (res && res.error_code === 0 && res.data) {
             if (!res.data.list) {
+              this.projectInfo.list = []
               if(loading) {
                 loading.clear()
               }
@@ -196,6 +251,7 @@ var vm = new Vue({
               }
             }
           } else {
+            this.projectInfo.list = []
             this.$toast(res.error_msg)
           }
           if(loading) {
@@ -232,59 +288,6 @@ var vm = new Vue({
         Object.assign(defaultConf, conf)
       }
       return this.$dialog.confirm(defaultConf)
-    },
-    setScrollTop: function (scrollTop) {
-      this.$nextTick(function () {
-        var wrapper = document.querySelector('.van-tabs__content')
-        wrapper.scrollTop = scrollTop
-      })
-    },
-    saveScrollTop: function () {
-      var wrapper = document.querySelector('.van-tabs__content')
-      if (wrapper.scrollTop) {
-        this.historyPageState.listState.scrollTop = parseInt(wrapper.scrollTop)
-      }
-    },
-    // 重置列表数据
-    resetHistoryState: function () {
-      var rState = {
-        refreshing: false,
-        loaded: false,
-        loading: false,
-        finished: false,
-        pageNum: 1,
-        pageSize: 10,
-        list: []
-      }
-
-      this.historyPageState.scrollTop = 0
-      Object.assign(this.historyPageState.listState, rState)
-    },
-    // 保存页面状态
-    saveState: function () {
-      this.saveScrollTop()
-      var $data = {
-        historyPageState: this.historyPageState
-      }
-      sessionStorage.setItem(this.sessStorageKey, JSON.stringify($data))
-    },
-    reStoreState: function () {
-      var $data = sessionStorage.getItem(this.sessStorageKey)
-      if ($data) {
-        $data = JSON.parse($data)
-        Object.assign(this.historyPageState, $data.historyPageState)
-
-        if (this.tabActiveName === 'history') {
-          setTimeout(function () {
-            // 恢复滚动高度
-            this.setScrollTop(this.historyPageState.scrollTop)
-          }.bind(this), 0)
-        }
-
-        sessionStorage.removeItem(this.sessStorageKey)
-      }
-
-      return $data
     }
   }
 })

+ 61 - 1
src/web/templates/big-member/wx/page_report_analysis.html

@@ -20,6 +20,7 @@
     <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/public.css?v={{Msg "seo" "version"}}'>
     <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/big-member/weixin/css/j-icons.css?v={{Msg "seo" "version"}}'>
     <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/collection/css/index.css?v={{Msg "seo" "version"}}'/>
+    <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/filter/css/project_header.css?v={{Msg "seo" "version"}}' />
     <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/common-module/report-analysis/css/report_analysis.css?v={{Msg "seo" "version"}}' />
     <style>
       /* fix: --- 弹窗组件不能显示底部问题  */
@@ -134,7 +135,7 @@
                       <div class="height8" v-show="false"></div>
                       <section class="section bg-white dimension">
                           <div class="section-title"> - 分析维度 -</div>
-                          <van-sticky class="section-sticky" z-index="99999999" :offset-top="stickyOffset">
+                          <van-sticky class="section-sticky" z-index="2000" :offset-top="stickyOffset">
                               <div class="section-content dimension-list bg-white">
                                   <div
                                       class="j-button j-button-item dimension-item"
@@ -291,6 +292,63 @@
                               <market-area-scatter :chart-data="sections.areaScatter.chartData"></market-area-scatter>
                           </div>
                       </div>
+                      <!-- 城市分布 -->
+                      <div class="section bg-white pd-16 city-scatter" v-if="sections.areaScatter.dataAlready && notOneAreaCityFilter && getStatus">
+                        <div class="section-title">城市分布</div>
+                        <div class="section-content">
+                          <!-- <market-area-scatter :chart-data="sections.areaScatter.chartData"></market-area-scatter> -->
+                          <div class="section-content-header">
+                            <div class="set-area-city" @click="setAreaCity">
+                              <span>${sections.areaScatter.selectArea.area}</span>
+                              <van-icon name="play"></van-icon>
+                            </div>
+                            <div class="set-sort-type">
+                              <project-header :sort-option="sortOptionContent" :sort-optiontitle="sortOptionTitle" :showtotal="false" @setsort="setsortType"></project-header>
+                            </div>
+                            <div class="set-unit">单位:${sections.areaScatter.sortType===0?'个':'万元'}</div>
+                          </div>
+                          <div class="progress-bar-container">
+                            <div class="progress-bar-item" v-for="(item,index) in showAreaCityBtn" :key="index">
+                                <div class="item-label">
+                                    <span class="item-name">${item.city}</span>
+                                    <span class="item-count" v-if="sections.areaScatter.sortType===0">${item.total}个</span>
+                                    <span class="item-count" v-else>${showCountAmount(item)}万元</span>
+                                </div>
+                                <div class="item-progress">
+                                    <span class="item-progress-count blue-progress" :style="{width: item.parent}"></span>
+                                </div>
+                            </div>
+                          </div>
+                          <div class="more" @click="sections.areaScatter.showAreaCityListBtn = false" v-if="sections.areaScatter.showAreaCityListBtn">
+                            <span>查看更多</span>
+                          </div>
+                        </div>
+                      </div>
+                      <van-popup
+                        v-model="sections.areaScatter.showAreaPopup"
+                        closeable
+                        round
+                        position="bottom"
+                        close-icon="clear"
+                        class="j-popup collection"
+                        :lazy-render="false"
+                        overlay-class="j-overlay"
+                        :style="{ height: '60%' }"
+                        get-container="body">
+                        <div class="j-container report-popup">
+                            <div class="popup-header header-title">请选择省份</div>
+                            <div class="j-main area-content">
+                                <area-component
+                                    :newprovincelist="reportFilters.area"
+                                    :showzxs="false"
+                                    :showcountry="false"
+                                    :multiple="false"
+                                    ref="areaSelector"
+                                    @cancel="cancelSelectArea"
+                                    @confirm="confirmSelectArea"></area-component>
+                            </div>
+                        </div>
+                      </van-popup>
                       <div class="section bg-white pd-16" v-if="sections.areaScatter.projectCountTop3 && getStatus">
                           <div class="section-title">项目数量TOP3地区的重点中标单位</div>
                           <div class="section-content">
@@ -582,6 +640,7 @@
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/keyword-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/date-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/area-city-mobile.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/collection/js/area-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/industry-mobile.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/collection/js/cate-mobile.js?v={{Msg "seo" "version"}}'></script>
 
@@ -595,6 +654,7 @@
 <script src='{{Msg "seo" "cdn"}}/common-module/report-analysis/js/components/marketUserScatter.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/report-analysis/js/components/marketSegment.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/report-analysis/js/components/lineChartScatter.js?v={{Msg "seo" "version"}}'></script>
+<script src='{{Msg "seo" "cdn"}}/common-module/filter/js/project_header.js?v={{Msg "seo" "version"}}'></script>
 <script src='{{Msg "seo" "cdn"}}/common-module/report-analysis/js/report_analysis.js?v={{Msg "seo" "version"}}'></script>
 {{include "/common/baiducc.html"}}
 </body>

+ 1 - 1
src/web/templates/big-member/wx/page_report_analysis_pro_list.html

@@ -31,7 +31,7 @@
     <div class="j-main" id="analysisList" v-cloak>
       <filter-component :show-tip="false" :show-select="false" :filters="filters"  @confirm="confirm"></filter-component>
       <div class="project-detail-list" v-if="Object.keys(projectInfo).length != 0 && projectInfo.list.length > 0">
-        <project-header @setsort-type="setsortType"></project-header>
+        <project-header :total="projectInfo.total"  @setsort="setsortType"></project-header>
         <van-list
           v-model:loading="vanlistParams.loading"
           :finished="vanlistParams.finished"