소스 검색

fix: 定制化分析报告页面优化

cuiyalong 3 년 전
부모
커밋
9ce2b91473

+ 10 - 0
src/components/selector/IndustrySelectorContent.vue

@@ -302,6 +302,9 @@ export default {
      * @param { Array | undefined } data 要恢复的数据
      */
     setIndustryState (data) {
+      if (Array.isArray(data)) {
+        return this.setBuyerclassState(data)
+      }
       // 设置全部按钮
       if (!data || Object.keys(data).length === 0) {
         // 其他全部设置不选中,全部按钮设置选中
@@ -332,6 +335,13 @@ export default {
         })
       }
     },
+    setBuyerclassState (data) {
+      this.getIndustryListMap.forEach(item => {
+        if (data.includes(item.name)) {
+          this.changeIndustryState(item)
+        }
+      })
+    },
     // 获取选中的数据
     getSelected () {
       const map = {}

+ 40 - 0
src/components/selector/PopSelector.vue

@@ -285,6 +285,46 @@ export default {
     getSelectedKeysWithClassifyName (name) {
       return this.selectInfo.originMap[name].selects || []
     },
+    // 选中的key的字符串数组,key用空格拼接
+    setState (keysList) {
+      for (const cname in this.selectInfo.popMap) {
+        const keysArr = this.selectInfo.popMap[cname]
+        if (Array.isArray(keysArr)) {
+          if (keysArr.length === 0) {
+            continue
+          } else {
+            keysArr.forEach(key => {
+              key.checked = keysList.includes(key.key)
+            })
+          }
+        }
+      }
+      this.refreshOriginMap()
+    },
+    refreshOriginMap () {
+      for (const cname in this.selectInfo.popMap) {
+        const keysArr = this.selectInfo.popMap[cname]
+        if (!Array.isArray(keysArr)) {
+          continue
+        }
+
+        const selectedKeysArr = []
+        if (keysArr.length === 0) {
+          continue
+        } else {
+          keysArr.forEach(key => {
+            if (key.checked) {
+              selectedKeysArr.push(key.key)
+            }
+          })
+        }
+
+        const selectedCount = selectedKeysArr.length
+        this.selectInfo.originMap[cname].select = selectedCount > 0
+        this.selectInfo.originMap[cname].selectAll = selectedCount > 0 && selectedCount === keysArr.length
+        this.selectInfo.originMap[cname].selects = selectedKeysArr
+      }
+    },
     onChange (selected) {
       this.$emit('onChange', selected)
     }

+ 3 - 1
src/components/selector/TimeSelector.vue

@@ -12,6 +12,7 @@
       ref="content"
       :selectorTime="selectorTime"
       :selectorType="selectorType"
+      :defaultSelectedKey="defaultSelectedKey"
       @onChange="onChange"
     />
   </selector-card>
@@ -34,7 +35,8 @@ export default {
     selectorTime: {
       type: String,
       default: 'default'
-    }
+    },
+    defaultSelectedKey: String
   },
   data () {
     return {}

+ 41 - 9
src/components/selector/TimeSelectorContent.vue

@@ -14,7 +14,7 @@
         @click="clickTimeButton(item)"
       >{{ item.name }}</div>
     </div>
-    <div class="date-time-container">
+    <div class="date-time-container" :class="{ active: state.exact === 'exact' }">
       <el-date-picker
         v-model="dateTimePickerState.start"
         class="date-time-item left"
@@ -140,6 +140,10 @@ export default {
     selectorTime: {
       type: String,
       default: 'default' // default/sub/more
+    },
+    defaultSelectedKey: {
+      type: String,
+      default: 'all' // all/lately30/lately90...
     }
   },
   data () {
@@ -177,6 +181,11 @@ export default {
       }
     }
   },
+  computed: {
+    state () {
+      return this.getState()
+    }
+  },
   created () {
     this.calcLastTime()
   },
@@ -210,7 +219,7 @@ export default {
       //   exact: 'all'
       // }
       if (!data || Object.keys(data).length === 0) {
-        this.setTimeSelectListState('all')
+        this.setTimeSelectListState(this.defaultSelectedKey)
       } else {
         switch (data.exact) {
           case 'all':
@@ -231,6 +240,7 @@ export default {
           case 'exact': {
             if (!data.start || !data.end) break
             if (data.start < data.end) {
+              this.timeSelectList.forEach(v => (v.selected = false))
               this.dateTimePickerState.start = new Date(data.start)
               this.dateTimePickerState.end = new Date(data.end)
             }
@@ -250,14 +260,25 @@ export default {
         end: 0,
         exact: 'exact'
       }
+      const durations = {
+        hour1: 60 * 60 * 1000,
+        day1: 60 * 60 * 1000 * 24 * 1,
+        day7: 60 * 60 * 1000 * 24 * 7,
+        day30: 60 * 60 * 1000 * 24 * 30
+      }
       const selectButton = this.timeSelectList.find(item => item.selected)
       if (selectButton) {
         timeState.exact = selectButton.value
         Object.assign(timeState, this.calcNotExactTime(timeState.exact))
       } else {
         timeState.exact = 'exact'
-        timeState.start = this.dateTimePickerState.start.getTime()
-        timeState.end = this.dateTimePickerState.end.getTime()
+        if (this.dateTimePickerState.start) {
+          timeState.start = this.dateTimePickerState.start.getTime()
+        }
+        if (this.dateTimePickerState.end) {
+          // 结束时间为当天23:59:59
+          timeState.end = this.dateTimePickerState.end.getTime() + (durations.day1 - 1000)
+        }
       }
       return timeState
     },
@@ -316,11 +337,11 @@ export default {
           t.start = t.end - durations.day30
           break
         }
-        case 'lately90': { // 近3个月
+        case 'lately90': { // 近90天
           t.start = t.end - (durations.day30 * 3)
           break
         }
-        case 'lately180': { // 近6个月(近半年)
+        case 'lately180': { // 180天
           t.start = t.end - (durations.day30 * 6)
           break
         }
@@ -369,7 +390,7 @@ export default {
         this.setTimeSelectListState()
         this.onChange()
       } else if (!start && !end) { // start和end都没值
-        this.setTimeSelectListState('all')
+        this.setTimeSelectListState(this.defaultSelectedKey)
         this.onChange()
       }
     },
@@ -379,7 +400,7 @@ export default {
         this.setTimeSelectListState()
         this.onChange()
       } else if (!start && !end) { // start和end都没值
-        this.setTimeSelectListState('all')
+        this.setTimeSelectListState(this.defaultSelectedKey)
         this.onChange()
       }
     }
@@ -401,6 +422,17 @@ export default {
   }
   .date-time-container {
     display: flex;
+    padding: 6px;
+    background-color: #F4F5F7;
+    border-radius: 4px;
+    &.active {
+      background-color: #2CB7CA;
+      .date-time-item {
+        &.left::after {
+          background-color: #e0e0e0;
+        }
+      }
+    }
     .clear-icon {
       display: none;
     }
@@ -416,7 +448,7 @@ export default {
           content: '';
           position: absolute;
           width: 12px;
-          height: 1px;
+          height: 2px;
           top: 50%;
           right: -10px;
           transform: translate(100%,-50%);

+ 59 - 5
src/views/analysisReport/MarketAnalysis.vue

@@ -15,7 +15,7 @@
           <div class="tip-text">注:如需新增分析内容,请完善您的订阅关键词组</div>
           <button class="button-submit" @click="toSubManage">订阅管理<i class="el-icon-arrow-right"></i></button>
         </div>
-        <TimeSelector class="bottom-divider" @onChange="changeTime" ref="timeSelector" selectorTime="more" selectorType="line">
+        <TimeSelector class="bottom-divider" @onChange="changeTime" ref="timeSelector" defaultSelectedKey="sinceYearBeforeLast" selectorTime="more" selectorType="line">
           <div slot="header">时间:</div>
         </TimeSelector>
         <AreaSelector class="bottom-divider" @onChange="changeArea" ref="areaSelector" selectorType="line">
@@ -33,7 +33,7 @@
         </div>
       </div>
     </el-collapse-transition>
-    <div class="bg-grey-h24"></div>
+    <div class="bg-grey-h24" v-if="loaded && analysisReportId"></div>
     <MarketAnalysisResult v-if="loaded && analysisReportId" :rid="analysisReportId" @loadedFilters="loadedFilters" @onEmpty="onEmpty" />
     <Empty v-if="loaded && !analysisReportId">对不起,没有匹配到相关信息,请修改您的分析条件</Empty>
   </div>
@@ -104,7 +104,6 @@ export default {
       if (id) {
         this.analysisReportId = id
         this.loaded = true
-        this.showMoreFilters = false
       }
     },
     getAllKeyMap () {
@@ -140,7 +139,7 @@ export default {
       const keys = this.filters.keys
       if (Array.isArray(keys) && keys.length) {
         return JSON.stringify(keys)
-      } else{
+      } else {
         const allKeys = this.getAllKeyMap()
         return JSON.stringify(allKeys)
       }
@@ -197,7 +196,6 @@ export default {
       this.filters.industry = item
     },
     changeBuyer (item) {
-      console.log(item)
       this.filters.buyerclass = this.formatIndustryMap(item).map(v => v.split('_')[1])
     },
     resetFilters () {
@@ -227,8 +225,64 @@ export default {
     onEmpty () {
       this.analysisReportId = ''
     },
+    // 整理数据,并赋值给filters
     loadedFilters (filters) {
       console.log(filters)
+      if (filters.keys) {
+        this.filters.keys = filters.keys
+        this.restoreFilterKeys(filters.keys)
+      }
+      if (filters.selectTime) {
+        this.filters.selectTime = filters.selectTime
+      }
+      if (filters.selectTimeExtra) {
+        this.filters.selectTimeExtra = filters.selectTimeExtra
+      }
+      this.restoreFilterTimes(filters.selectTime, filters.selectTimeExtra)
+
+      if (filters.area) {
+        this.filters.area = filters.area
+        this.restoreFilterArea(filters.area)
+      }
+      if (filters.industry) {
+        this.filters.industry = filters.industry
+        this.restoreFilterIndustry(filters.industry)
+      }
+      if (filters.buyerclass) {
+        this.filters.buyerclass = filters.buyerclass
+        this.restoreFilterBuyerclass(filters.buyerclass)
+      }
+    },
+    restoreFilterKeys (keys) {
+      if (!Array.isArray(keys)) return
+      const keysArr = []
+      keys.forEach(classify => {
+        if (Array.isArray(classify.a_key)) {
+          classify.a_key.forEach(item => {
+            keysArr.push(item.key.join(' '))
+          })
+        }
+      })
+      this.$refs.keySelector.setState(keysArr)
+    },
+    restoreFilterTimes (selectTime, extra) {
+      const selectTimeArr = selectTime.split('-')
+      const struct = {
+        start: selectTimeArr[0] * 1000,
+        end: selectTimeArr[1] * 1000,
+        exact: extra ? extra : 'exact'
+      }
+      console.log(struct)
+      this.$refs.timeSelector.setState(struct)
+    },
+    restoreFilterArea (area) {
+      this.$refs.areaSelector.setCitySelected(area)
+    },
+    restoreFilterIndustry (i) {
+      this.$refs.industrySelector.setIndustryState(i)
+    },
+    restoreFilterBuyerclass (b) {
+      this.$refs.buyerclassSelector.setIndustryState(b)
     },
     toSubManage () {
       if (this.isSubCount) {

+ 79 - 66
src/views/analysisReport/MarketAnalysisResult.vue

@@ -86,7 +86,7 @@
             </div>
           </div>
           <!-- 地区分布 -->
-          <div class="sub-section area-scatter" v-if="sections.areaScatter.dataAlready">
+          <div class="sub-section area-scatter" v-if="sections.areaScatter.dataAlready && oneAreaFilter">
             <div class="sub-section-header">
               <div class="sub-section-title">地区分布</div>
             </div>
@@ -406,6 +406,11 @@ export default {
     }
   },
   computed: {
+    oneAreaFilter () {
+      const area = this.reportFilters.area
+      const showArea = area && (Object.keys(area).length > 1 || Object.keys(area).length === 0)
+      return showArea
+    },
     buyerclassSectionShow () {
       const winnerState = this.sections.buyerclass
       return winnerState.dataAlready && winnerState.projectCountTop3 && winnerState.projectAmountTop3
@@ -447,14 +452,10 @@ export default {
       const flagArr = [
         0, // 筛选条件
         // 1, // 市场概括与时间分布
-        2, // 项目规模分布
-        3, // 项目规模Top10
+        2, // 项目规模Top10
+        3, // 项目规模分布/地区规模分布/客户分布/地区分布及客户分布&Top3(table+chart)
         4, // 细分市场
-        5, // 采购单位
-        6, // 中标单位
-        7, // 地区规模分布
-        8, // 客户分布
-        9 // 地区分布及客户分布Top3
+        5 // 采购单位/中标单位&Top3(table+chart)
       ]
 
       flagArr.forEach(this.getReport)
@@ -495,29 +496,26 @@ export default {
         // 时间分布
         this.sortTimeScatter(data)
       } else if (flag === 2) {
-        // 项目规模分布
-        this.sortProjectScatter(data.projectScale)
-      } else if (flag === 3) {
         // 项目规模Top10
         this.sortProjectTop10(data.ProjectTop10)
+      } else if (flag === 3) {
+        // 项目规模分布/地区规模分布/客户分布/地区分布及客户分布&Top3(table+chart)
+        // 项目规模分布
+        this.sortProjectScatter(data.projectScale)
+        // 地区规模分布
+        this.sortAreaScatter(data.area_infos)
+        // 客户分布
+        this.sortUserScatter(data.customer_scale)
+        // 地区分布及客户分布Top3
+        this.sortAreaUserTop3(data)
       } else if (flag === 4) {
         // 细分市场
         this.sortMarketRefineData(data)
       } else if (flag === 5) {
-        // 采购单位
+        // 采购单位/中标单位&Top3(table+chart)
         this.sortBuyerclassData(data)
-      } else if (flag === 6) {
         // 中标单位分析
         this.sortWinnerData(data)
-      } else if (flag === 7) {
-        // 地区规模分布
-        this.sortAreaScatter(data.area_infos)
-      } else if (flag === 8) {
-        // 客户分布
-        this.sortUserScatter(data.customer_scale)
-      } else if (flag === 9) {
-        // 地区分布及客户分布Top3
-        this.sortAreaUserTop3(data)
       }
     },
     formatSelectTime (value) {
@@ -590,12 +588,12 @@ export default {
       list[1].count = projectTotalMoney.count
       list[1].unit = projectTotalMoney.unit
 
-      list[1].ringRatio = profile.projctamount_ratio ? (profile.projctamount_ratio * 100).toFixed(4) : 0
+      list[1].ringRatio = profile.projctamount_ratio ? (profile.projctamount_ratio * 100).toFixed(2) : 0
       // 项目平均金额
       const projectAvgMoney = this.moneyUnit(profile.projectavgmoney ? profile.projectavgmoney : 0)
       list[2].count = projectAvgMoney.count
       list[2].unit = projectAvgMoney.unit
-      list[2].ringRatio = profile.projectavgmoney_ratio ? (profile.projectavgmoney_ratio * 100).toFixed(4) : 0
+      list[2].ringRatio = profile.projectavgmoney_ratio ? (profile.projectavgmoney_ratio * 100).toFixed(2) : 0
       // 中标单位数
       list[3].count = profile.winnercount ? profile.winnercount : 0
       list[3].ringRatio = profile.winnercount_ratio ? (profile.winnercount_ratio * 100).toFixed(2) : 0
@@ -846,7 +844,8 @@ export default {
       // }
 
       const areaChartData = {
-        columns: ['项目所在地', '项目数量', '项目金额'],
+        columns: ['项目所在地', '项目数量'],
+        sColumns: ['项目金额'],
         rows: []
       }
       let total = 0
@@ -855,13 +854,13 @@ export default {
         const field = {
           [areaChartData.columns[0]]: 'area',
           [areaChartData.columns[1]]: 'total',
-          [areaChartData.columns[2]]: 'amount'
+          [areaChartData.sColumns[0]]: 'amount'
         }
         areaList.forEach(item => {
           const row = {}
-          areaChartData.columns.forEach(column => {
+          areaChartData.columns.concat(areaChartData.sColumns).forEach(column => {
             if (field[column] === 'amount') {
-              row[column] = formatPrice(item[field[column]] / 10000)
+              row[column] = formatPrice(item[field[column]] / 10000) - 0
             } else {
               row[column] = item[field[column]]
             }
@@ -907,11 +906,11 @@ export default {
     },
     sorAreaTop3 (data) {
       const tableDataCount = {
-        columns: ['序号', '地区:项目数量(个),占比', '前3中标单位:中标数量(个),该地区占比'],
+        columns: ['序号', '地区:项目数量(个),占比', '前3中标单位:中标数量(个)'], // ,该地区占比
         rows: []
       }
       const tableDataAmount = {
-        columns: ['序号', '地区:项目金额(万元),占比', '前3中标单位:中标金额(万元),该地区占比'],
+        columns: ['序号', '地区:项目金额(万元),占比', '前3中标单位:中标金额(万元)'], // ,该地区占比
         rows: []
       }
 
@@ -924,12 +923,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: item.area_count + '个',
-                percent: formatPrice(item.area_scale * 100) + '%',
+                percent: item.area_scale ? `${formatPrice(item.area_scale * 100)}%` : '',
                 winner_id: w.id,
+                winner_type: 'winner', // 用于判断采购单位或者中标单位
                 winner_index: i + 1,
                 winner_name: w.winner,
                 winner_value: w.winner_total ? `${w.winner_total}个` : 0,
-                winner_percent: w.total_scale ? `${formatPrice(w.total_scale * 100)}%` : 0,
+                // winner_percent: w.total_scale ? `${formatPrice(w.total_scale * 100)}%` : 0,
                 rowspan: i === 0 ? item.winner.length : 0
               }
               tableDataCount.rows.push(row)
@@ -939,7 +939,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: item.area_count + '个',
-              percent: formatPrice(item.area_scale * 100) + '%',
+              percent: item.area_scale ? `${formatPrice(item.area_scale * 100)}%` : '',
               rowspan: 1
             }
             tableDataCount.rows.push(row)
@@ -956,12 +956,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: formatPrice(item.area_amount / 10000) + '万元',
-                percent: formatPrice(item.area_scale * 100) + '%',
+                percent: item.area_scale ? `${formatPrice(item.area_scale * 100)}%` : '',
                 winner_id: w.id,
+                winner_type: 'winner',
                 winner_index: i + 1,
                 winner_name: w.winner,
                 winner_value: w.winner_amount ? `${formatPrice(w.winner_amount / 10000)}万元` : 0,
-                winner_percent: w.amount_scale ? `${formatPrice(w.amount_scale * 100)}%` : 0,
+                // winner_percent: w.amount_scale ? `${formatPrice(w.amount_scale * 100)}%` : 0,
                 rowspan: i === 0 ? item.winner.length : 0
               }
               tableDataAmount.rows.push(row)
@@ -971,7 +972,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: formatPrice(item.area_amount / 10000) + '万元',
-              percent: formatPrice(item.area_scale * 100) + '%',
+              percent: item.area_scale ? `${formatPrice(item.area_scale * 100)}%` : '',
               rowspan: 1
             }
             tableDataAmount.rows.push(row)
@@ -988,11 +989,11 @@ export default {
     },
     sorUserTop3 (data) {
       const tableDataCount = {
-        columns: ['序号', '客户类型:项目数量(个),占比', '前3中标单位:中标数量(个),该客户类型占比'],
+        columns: ['序号', '客户类型:项目数量(个),占比', '前3中标单位:中标数量(个)'], // ,该客户类型占比
         rows: []
       }
       const tableDataAmount = {
-        columns: ['序号', '客户类型:项目金额(万元),占比', '前3中标单位:中标金额(万元),该客户类型占比'],
+        columns: ['序号', '客户类型:项目金额(万元),占比', '前3中标单位:中标金额(万元)'], // ,该客户类型占比
         rows: []
       }
 
@@ -1005,12 +1006,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: item.buyclass_count + '个',
-                percent: formatPrice(item.buyclass_scale * 100) + '%',
+                percent: item.buyclass_scale ? `${formatPrice(item.buyclass_scale * 100)}%` : '',
                 winner_id: w.id,
+                winner_type: 'winner', // 用于判断采购单位或者中标单位
                 winner_index: i + 1,
                 winner_name: w.winner,
                 winner_value: w.winner_total ? `${w.winner_total}个` : 0,
-                winner_percent: w.total_scale ? `${formatPrice(w.total_scale * 100)}%` : 0,
+                // winner_percent: w.total_scale ? `${formatPrice(w.total_scale * 100)}%` : 0,
                 rowspan: i === 0 ? item.winner.length : 0
               }
               tableDataCount.rows.push(row)
@@ -1020,7 +1022,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: item.area_count + '个',
-              percent: formatPrice(item.area_scale * 100) + '%',
+              percent: item.buyclass_scale ? `${formatPrice(item.buyclass_scale * 100)}%` : '',
               rowspan: 1
             }
             tableDataCount.rows.push(row)
@@ -1037,12 +1039,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: formatPrice(item.buyclass_amount / 10000) + '万元',
-                percent: formatPrice(item.buyclass_scale * 100) + '%',
+                percent: item.buyclass_scale ? `${formatPrice(item.buyclass_scale * 100)}%` : '',
                 winner_id: w.id,
+                winner_type: 'winner', // 用于判断采购单位或者中标单位
                 winner_index: i + 1,
                 winner_name: w.winner,
                 winner_value: w.winner_amount ? `${formatPrice(w.winner_amount / 10000)}万元` : 0,
-                winner_percent: w.amount_scale ? `${formatPrice(w.amount_scale * 100)}%` : 0,
+                // winner_percent: w.amount_scale ? `${formatPrice(w.amount_scale * 100)}%` : 0,
                 rowspan: i === 0 ? item.winner.length : 0
               }
               tableDataAmount.rows.push(row)
@@ -1052,7 +1055,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: formatPrice(item.area_amount / 10000) + '万元',
-              percent: formatPrice(item.area_scale * 100) + '%',
+              percent: item.buyclass_scale ? `${formatPrice(item.buyclass_scale * 100)}%` : '',
               rowspan: 1
             }
             tableDataAmount.rows.push(row)
@@ -1115,11 +1118,11 @@ export default {
     },
     sortRefineTop3 (data) {
       const tableDataCount = {
-        columns: ['序号', '细分市场:项目数量(个),占比', '前3中标单位:中标数量(个),该细分市场占比'],
+        columns: ['序号', '细分市场:项目数量(个),占比', '前3中标单位:中标数量(个)'], // ,该细分市场占比
         rows: []
       }
       const tableDataAmount = {
-        columns: ['序号', '细分市场:项目金额(万元),占比', '前3中标单位:中标金额(万元),该细分市场占比'],
+        columns: ['序号', '细分市场:项目金额(万元),占比', '前3中标单位:中标金额(万元)'], // ,该细分市场占比
         rows: []
       }
 
@@ -1132,11 +1135,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: item.total + '个',
+                percent: item.prop ? `${formatPrice(item.prop * 100)}%` : '',
                 winner_id: w.id,
+                winner_type: 'winner',
                 winner_index: i + 1,
                 winner_name: w.name,
                 winner_value: w.value ? `${w.value}个` : 0,
-                winner_percent: w.prop ? `${formatPrice(w.prop * 100)}%` : 0,
+                // winner_percent: w.prop ? `${formatPrice(w.prop * 100)}%` : 0,
                 rowspan: i === 0 ? item.totalTop.length : 0
               }
               tableDataCount.rows.push(row)
@@ -1146,6 +1151,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: item.total + '个',
+              percent: item.prop ? `${formatPrice(item.prop * 100)}%` : '',
               rowspan: 1
             }
             tableDataCount.rows.push(row)
@@ -1162,11 +1168,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: formatPrice(item.amount / 10000) + '万元',
+                percent: item.prop ? `${formatPrice(item.prop * 100)}%` : '',
                 winner_id: w.id,
+                winner_type: 'winner',
                 winner_index: i + 1,
                 winner_name: w.name,
                 winner_value: w.value ? `${formatPrice(w.value / 10000)}万元` : 0,
-                winner_percent: w.prop ? `${formatPrice(w.prop * 100)}%` : 0,
+                // winner_percent: w.prop ? `${formatPrice(w.prop * 100)}%` : 0,
                 rowspan: i === 0 ? item.amountTop.length : 0
               }
               tableDataAmount.rows.push(row)
@@ -1176,6 +1184,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: formatPrice(item.amount / 10000) + '万元',
+              percent: item.prop ? `${formatPrice(item.prop * 100)}%` : '',
               rowspan: 1
             }
             tableDataAmount.rows.push(row)
@@ -1231,11 +1240,11 @@ export default {
     },
     sortBuyerclassTableData (data) {
       const dataCount = {
-        columns: ['序号', '采购单位:采购数量(个),占比', '前3中标单位:中标数量(个),占该采购单位'],
+        columns: ['序号', '采购单位:采购数量(个)', '前3中标单位:中标数量(个)'], // ,占比 | ,占该采购单位
         rows: []
       }
       const dataAmount = {
-        columns: ['序号', '采购单位:采购金额(万元),占比', '前3中标单位:中标金额(万元),占该采购单位'],
+        columns: ['序号', '采购单位:采购金额(万元)', '前3中标单位:中标金额(万元)'], // ,占比 |  ,占该采购单位
         rows: []
       }
 
@@ -1248,12 +1257,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: item.number + '个',
-                percent: formatPrice(item.accounted * 100) + '%',
+                // percent: item.accounted ? `${formatPrice(item.accounted * 100)}%` : '',
                 winner_id: w.id,
+                winner_type: 'winner',
                 winner_index: i + 1,
                 winner_name: w.name,
                 winner_value: w.number ? `${w.number}个` : 0,
-                winner_percent: w.accounted ? `${formatPrice(w.accounted * 100)}%` : 0,
+                // winner_percent: w.accounted ? `${formatPrice(w.accounted * 100)}%` : 0,
                 rowspan: i === 0 ? item.winnertop3.length : 0
               }
               dataCount.rows.push(row)
@@ -1263,7 +1273,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: item.number + '个',
-              percent: formatPrice(item.accounted * 100) + '%',
+              // percent: item.accounted ? `${formatPrice(item.accounted * 100)}%` : '',
               rowspan: 1
             }
             dataCount.rows.push(row)
@@ -1280,12 +1290,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: formatPrice(item.amount / 10000) + '万元',
-                percent: formatPrice(item.accounted * 100) + '%',
+                // percent: item.accounted ? `${formatPrice(item.accounted * 100)}%` : '',
                 winner_id: w.id,
+                winner_type: 'winner',
                 winner_index: i + 1,
                 winner_name: w.name,
                 winner_value: w.amount ? `${formatPrice(w.amount / 10000)}万元` : 0,
-                winner_percent: w.accounted ? `${formatPrice(w.accounted * 100)}%` : 0,
+                // winner_percent: w.accounted ? `${formatPrice(w.accounted * 100)}%` : 0,
                 rowspan: i === 0 ? item.winnertop3.length : 0
               }
               dataAmount.rows.push(row)
@@ -1295,7 +1306,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: formatPrice(item.amount / 10000) + '万元',
-              percent: formatPrice(item.accounted * 100) + '%',
+              // percent: item.accounted ? `${formatPrice(item.accounted * 100)}%` : '',
               rowspan: 1
             }
             dataAmount.rows.push(row)
@@ -1352,11 +1363,11 @@ export default {
     },
     sortWinnerTableData (data) {
       const dataCount = {
-        columns: ['序号', '中标单位:中标数量(个),占比', '前3采购单位:采购数量(个),占该中标单位'],
+        columns: ['序号', '中标单位:中标数量(个)', '前3采购单位:采购数量(个)'], // ,占比 | ,占该中标单位
         rows: []
       }
       const dataAmount = {
-        columns: ['序号', '中标单位:中标金额(万元),占比', '前3采购单位:采购金额(万元),占该中标单位'],
+        columns: ['序号', '中标单位:中标金额(万元)', '前3采购单位:采购金额(万元)'], // ,占比 | ,占该中标单位
         rows: []
       }
 
@@ -1369,12 +1380,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: item.number + '个',
-                percent: formatPrice(item.accounted * 100) + '%',
-                winner_id: w.id,
+                // percent: item.accounted ? `${formatPrice(item.accounted * 100)}%` : '',
+                winner_id: w.name,
+                winner_type: 'buyer',
                 winner_index: i + 1,
                 winner_name: w.name,
                 winner_value: w.number ? `${w.number}个` : 0,
-                winner_percent: w.accounted ? `${formatPrice(w.accounted * 100)}%` : 0,
+                // winner_percent: w.accounted ? `${formatPrice(w.accounted * 100)}%` : 0,
                 rowspan: i === 0 ? item.buyertop3.length : 0
               }
               dataCount.rows.push(row)
@@ -1384,7 +1396,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: item.number + '个',
-              percent: formatPrice(item.accounted * 100) + '%',
+              // percent: item.accounted ? `${formatPrice(item.accounted * 100)}%` : '',
               rowspan: 1
             }
             dataCount.rows.push(row)
@@ -1401,12 +1413,13 @@ export default {
                 index: index + 1,
                 name: item.name,
                 value: formatPrice(item.amount / 10000) + '万元',
-                percent: formatPrice(item.accounted * 100) + '%',
-                winner_id: w.id,
+                // percent: formatPrice(item.accounted * 100) + '%',
+                winner_id: w.name,
+                winner_type: 'buyer',
                 winner_index: i + 1,
                 winner_name: w.name,
                 winner_value: w.amount ? `${formatPrice(w.amount / 10000)}万元` : 0,
-                winner_percent: w.accounted ? `${formatPrice(w.accounted * 100)}%` : 0,
+                // winner_percent: w.accounted ? `${formatPrice(w.accounted * 100)}%` : 0,
                 rowspan: i === 0 ? item.buyertop3.length : 0
               }
               dataAmount.rows.push(row)
@@ -1416,7 +1429,7 @@ export default {
               index: index + 1,
               name: item.name,
               value: formatPrice(item.amount / 10000) + '万元',
-              percent: formatPrice(item.accounted * 100) + '%',
+              // percent: formatPrice(item.accounted * 100) + '%',
               rowspan: 1
             }
             dataAmount.rows.push(row)

+ 1 - 1
src/views/analysisReport/components/MarketAreaScatter.vue

@@ -43,7 +43,7 @@ export default {
     return {
       options: {
         height: '570px',
-        colors: ['#05a6f3'],
+        colors: ['#05A6F3', '#0BD991', '#FF9F40'],
         config: this.configArea
       }
     }

+ 3 - 4
src/views/analysisReport/components/MarketOverview.vue

@@ -8,14 +8,13 @@
         <div class="o-item-count">{{ item.count }}</div>
         <div
           class="o-item-percent flex-r-c center"
-          v-if="item.ringRatio"
           :class="{
-            'color-red': item.ringRatio >= 0,
+            'color-red': item.ringRatio > 0,
             'icon-reverse color-green': item.ringRatio < 0,
           }"
         >
-          <span class="o-item-percent-text">环比:{{ Math.abs(item.ringRatio) }}%</span>
-          <span class="el-icon-top"></span>
+          <span class="o-item-percent-text">环比:{{ item.ringRatio ? (Math.abs(item.ringRatio) + '%') : '-' }}</span>
+          <span class="el-icon-top" v-if="item.ringRatio"></span>
         </div>
       </div>
     </div>

+ 1 - 1
src/views/analysisReport/components/MarketSegment.vue

@@ -89,7 +89,7 @@ export default {
         const suffix = type === 'count' ? '个' : '万元'
         options.xAxis[0].axisLabel.rotate = 60
         options.xAxis[0].axisLabel.formatter = name => {
-          if (name && name.length >= 4) {
+          if (name && name.length > 4) {
             return `${name.slice(0, 4)}...`
           } else {
             return name

+ 31 - 7
src/views/analysisReport/components/MarketTop3Table.vue

@@ -39,9 +39,15 @@
         header-align="center"
         :label="tableData.columns[2]">
         <template slot-scope="scope">
-          <div class="area" v-if="scope.row.winner_name" @click="clickScope(scope)">
-            <span>{{ scope.row.winner_index }}. {{ scope.row.winner_name }}:</span>
-            <span v-if="scope.row.winner_value">{{ scope.row.winner_value }}</span>
+          <div class="area" v-if="scope.row.winner_name">
+            <span>
+              {{ scope.row.winner_index }}.&nbsp;
+              <el-link
+                :underline="false"
+                :disabled="!scope.row.winner_id"
+                @click="toOtherPage(scope.row.winner_id, scope.row.winner_type)">{{ scope.row.winner_name }}</el-link>
+            </span>
+            <span v-if="scope.row.winner_value">&nbsp;{{ scope.row.winner_value }}</span>
             <span v-if="scope.row.winner_value && scope.row.winner_percent">,</span>
             <span v-if="scope.row.winner_percent">{{ scope.row.winner_percent }}</span>
           </div>
@@ -53,10 +59,11 @@
 </template>
 
 <script>
-import { Table, TableColumn } from 'element-ui'
+import { Table, TableColumn, Link } from 'element-ui'
 export default {
   name: 'market-top3-table',
   components: {
+    [Link.name]: Link,
     [Table.name]: Table,
     [TableColumn.name]: TableColumn
   },
@@ -103,8 +110,20 @@ export default {
     }
   },
   methods: {
-    clickScope (scope) {
-      console.log(scope)
+    toOtherPage (id, type) {
+      let routeUrl = {
+        url: ''
+      }
+      if (type === 'winner') {
+        routeUrl = this.$router.resolve({
+          path: `/svip/ent_ser_portrait/${id}`
+        })
+      } else if (type === 'buyer') {
+        routeUrl = this.$router.resolve({
+          path: `/unit_portrayal/${id}`
+        })
+      }
+      window.open(routeUrl.href)
     },
     objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
       if (columnIndex === 0 || columnIndex === 1) {
@@ -119,6 +138,11 @@ export default {
 </script>
 <style lang="scss" scoped>
 ::v-deep {
-  // reset-ele-table
+  // reset-ele
+  .area {
+    a {
+      vertical-align: unset;
+    }
+  }
 }
 </style>