Browse Source

专家企业机构产品统计

lyn7568 6 years ago
parent
commit
a1c3c5a290

+ 4 - 4
config/prod.env.js

@ -4,8 +4,8 @@ module.exports = {
4 4
  ENV_CONFIG:'"prod"',
5 5
  PLAT_ID: '"F5DEA8EDB12E421A9FC4B701BB6176A6"',
6 6
  BASE_API: '""',
7
  // XT_API: '"http://www.xttjpt.cn"',
8
  // KX_API: '"http://www.ekexiu.com"'
9
  XT_API: '"http://192.168.3.233:84"',
10
  KX_API: '"http://192.168.3.233:81"'
7
  XT_API: '"http://www.xttjpt.cn"',
8
  KX_API: '"http://www.ekexiu.com"'
9
  // XT_API: '"http://192.168.3.233:84"',
10
  // KX_API: '"http://192.168.3.233:81"'
11 11
}

+ 5 - 0
src/api/statistics.js

@ -2,3 +2,8 @@ export const pqFilterList = '/ajax/log/article/pq' // 筛选内容列表
2 2
export const queryCreator = '/ajax/sys/name' // 查询发布者
3 3
export const queryTotalView = '/ajax/log/total' // 查询每天浏览量
4 4
export const queryOneView = '/ajax/log/qo' // 查询单个浏览量
5
6
export const pqCompanyFilterList = '/ajax/log/company/pq'
7
export const pqProductFilterList = '/ajax/log/product/pq'
8
export const pqOrgFilterList = '/ajax/log/org/ql'
9
export const pqExpertFilterList = '/ajax/log/professor/ql'

+ 24 - 0
src/router/index.js

@ -344,6 +344,30 @@ export const asyncRouterMap = [
344 344
          component: () => import('@/views/statistics/contentCount'),
345 345
          name: 'contentCount',
346 346
          meta: { title: '内容数据统计' }
347
        },
348
        {
349
          path: 'expertCount',
350
          component: () => import('@/views/statistics/expertCount'),
351
          name: 'expertCount',
352
          meta: { title: '特约专家数据统计' }
353
        },
354
        {
355
          path: 'orgCount',
356
          component: () => import('@/views/statistics/orgCount'),
357
          name: 'orgCount',
358
          meta: { title: '合作机构数据统计' }
359
        },
360
        {
361
          path: 'companyCount',
362
          component: () => import('@/views/statistics/companyCount'),
363
          name: 'companyCount',
364
          meta: { title: '企业数据统计' }
365
        },
366
        {
367
          path: 'productCount',
368
          component: () => import('@/views/statistics/productCount'),
369
          name: 'productCount',
370
          meta: { title: '企业产品数据统计' }
347 371
        }
348 372
      ]
349 373
    }

+ 7 - 6
src/views/cooperationAgency/index.vue

@ -31,6 +31,7 @@
31 31
        dataList: [], //  拉去专家数据存到dataList这个数组里面
32 32
        tableData: [], //  每一页的存储的数据
33 33
        total: 0, //  页码总数
34
        pageSize: 10,
34 35
        tableItem: [ // 表头信息
35 36
          {
36 37
            prop: 'level',
@ -90,8 +91,8 @@
90 91
                if (j === 0) {
91 92
                  this.dataList = epData
92 93
                  this.total = epData.length
93
                  if (this.total >= 20) {
94
                    this.tableData = this.dataList.slice(0, 20)
94
                  if (this.total >= this.pageSize) {
95
                    this.tableData = this.dataList.slice(0, this.pageSize)
95 96
                  } else {
96 97
                    const array = this.dataList
97 98
                    ret.gapFilling(array)
@ -119,13 +120,13 @@
119 120
        this.$refs.sort.form = { ...obj }
120 121
      },
121 122
      current(val) { // 点击页码
122
        if (val <= Math.ceil(this.total / 20)) {
123
          this.tableData = this.dataList.slice(20 * (val - 1), 20 * val)
124
          if (val === Math.ceil(this.total / 20)) {
123
        if (val <= Math.ceil(this.total / this.pageSize)) {
124
          this.tableData = this.dataList.slice(this.pageSize * (val - 1), this.pageSize * val)
125
          if (val === Math.ceil(this.total / this.pageSize)) {
125 126
            ret.gapFilling(this.tableData)
126 127
          }
127 128
        } else {
128
          const array = this.dataList.slice(20 * val)
129
          const array = this.dataList.slice(this.pageSize * val)
129 130
          ret.gapFilling(array)
130 131
          this.tableData = array
131 132
        }

+ 7 - 6
src/views/specialExperts/index.vue

@ -34,6 +34,7 @@
34 34
        dataList: [], //  拉去专家数据存到dataList这个数组里面
35 35
        tableData: [], //  每一页的存储的数据
36 36
        total: 0, //  页码总数
37
        pageSize: 10,
37 38
        tableItem: [ // 表头信息
38 39
          {
39 40
            prop: 'level',
@ -103,8 +104,8 @@
103 104
                if (j === 0) {
104 105
                  this.dataList = epData
105 106
                  this.total = epData.length
106
                  if (this.total >= 20) {
107
                    this.tableData = this.dataList.slice(0, 20)
107
                  if (this.total >= this.pageSize) {
108
                    this.tableData = this.dataList.slice(0, this.pageSize)
108 109
                  } else {
109 110
                    const array = this.dataList
110 111
                    if (epData.length !== 0) {
@ -134,13 +135,13 @@
134 135
        this.$refs.sort.form = { ...obj }
135 136
      },
136 137
      current(val) { // 点击页码
137
        if (val <= Math.ceil(this.total / 20)) {
138
          this.tableData = this.dataList.slice(20 * (val - 1), 20 * val)
139
          if (val === Math.ceil(this.total / 20)) {
138
        if (val <= Math.ceil(this.total / this.pageSize)) {
139
          this.tableData = this.dataList.slice(this.pageSize * (val - 1), this.pageSize * val)
140
          if (val === Math.ceil(this.total / this.pageSize)) {
140 141
            ret.gapFilling(this.tableData)
141 142
          }
142 143
        } else {
143
          const array = this.dataList.slice(20 * val)
144
          const array = this.dataList.slice(this.pageSize * val)
144 145
          ret.gapFilling(array)
145 146
          this.tableData = array
146 147
        }

+ 277 - 0
src/views/statistics/companyCount.vue

@ -0,0 +1,277 @@
1
<template>
2
  <div class="app-container">
3
    <div class="box-container">
4
      <div class="contain-title">企业数据统计</div>
5
    </div>
6
    <div class="content-container">
7
      <div class="content-item" style="padding-top:0">
8
        <div class="content-item-tit">内容浏览量统计</div>
9
        <div class="line-chart-box">
10
          <LineChart :chartData="chartData"></LineChart>
11
        </div>
12
      </div>
13
      <div class="content-item">
14
        <div class="content-item-tit">企业浏览量查询</div>
15
        <div class="contain-search" style="margin-top:20px; width:95%">
16
          <el-form :model="formFilter" class="demo-form" label-width="100px">
17
            <el-row :gutter="10">
18
              <el-col :span="8">
19
                <el-form-item label="企业名称:">
20
                  <el-input v-model="formFilter.name" placeholder="搜索企业名称"></el-input>
21
                </el-form-item>
22
              </el-col>
23
              <el-col :span="8">
24
                <el-form-item label="所属行业:">
25
                  <el-input v-model="formFilter.industry" placeholder="搜索所属行业"></el-input>
26
                </el-form-item>
27
              </el-col>
28
              <el-col :span="8">
29
                <el-form-item label="企业状态:">
30
                  <el-select v-model="formFilter.actived" placeholder="选择分类" clearable @change="catalogChanged">
31
                    <el-option :label="item.tit" :value="item.val" v-for="item in [{tit: '已激活', val: '1'},{tit: '未激活', val: '0'}]" :key="item.index"></el-option>
32
                  </el-select>
33
                </el-form-item>
34
              </el-col>
35
              <el-col :span="8">
36
                <el-form-item label="创建时间:">
37
                  <el-date-picker v-model="formFilter.dateRange" type="daterange"
38
                    range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
39
                    format="yyyy-MM-dd" value-format="yyyyMMdd" @change="changeRangerDate">
40
                  </el-date-picker>
41
                </el-form-item>
42
              </el-col>
43
              <el-col :span="8">
44
                <el-form-item label="排序方式:">
45
                  <el-select v-model="formFilter.orderBy" placeholder="选择排序方式" @change="sortChanged">
46
                    <el-option label="按创建时间由新到旧排序" value="1"></el-option>
47
                    <el-option label="按浏览量由高到底排序" value="2"></el-option>
48
                  </el-select>
49
                </el-form-item>
50
              </el-col>
51
              <el-col :span="8">
52
                <el-form-item label-width="30px" align="right">
53
                  <el-button type="primary" @click="filterSearch">查询</el-button>
54
                </el-form-item>
55
              </el-col>
56
            </el-row>
57
          </el-form>
58
        </div>
59
        <complex-table :tableData="tableData" :tableItem="tableItem" :total="total" :jump="'company'" v-on:current="current" :chartLine= true @showChart="showChart"></complex-table>
60
      </div>
61
    </div>
62
    <el-dialog title="企业流量分析" :visible.sync="ChartItemDialogVisible" width="860px">
63
      <LineChart :chartData="chartOneData"></LineChart>
64
    </el-dialog>
65
  </div>
66
</template>
67
68
<script>
69
import { pqCompanyFilterList, queryTotalView, queryOneView } from '@/api/statistics'
70
import { queryCompKeyword } from '@/api/companyCen'
71
72
import { parseTime } from '@/utils/index'
73
import complexTable from '@/components/complexTable'
74
import ret from '@/utils/comTable'
75
import LineChart from './lineChart/LineChart'
76
import { dayListFn, chartModel } from './lineChart/chart'
77
78
export default {
79
  data() {
80
    return {
81
      ChartItemDialogVisible: false,
82
      formFilter: {
83
        name: '',
84
        industry: '',
85
        actived: '',
86
        dateRange: '',
87
        orderBy: '1'
88
      },
89
      pageSize: 10,
90
      pageNo: 1,
91
      total: 0,
92
      tableData: [],
93
      tableItem: [
94
        {
95
          tit: '图表',
96
          chart: true,
97
          width: 80
98
        },
99
        {
100
          prop: 'name',
101
          tit: '企业名称',
102
          active: 'active'
103
        },
104
        {
105
          prop: 'industry',
106
          tit: '所属行业',
107
          tag: true
108
        },
109
        {
110
          prop: 'linkman',
111
          tit: '联系人'
112
        },
113
        {
114
          prop: 'linkphone',
115
          tit: '联系电话',
116
          width: '120'
117
        },
118
        {
119
          prop: 'linkemail',
120
          tit: '联系邮箱',
121
          width: '160'
122
        },
123
        {
124
          prop: 'createTime',
125
          tit: '创建时间',
126
          width: '160'
127
        },
128
        {
129
          prop: 'sum',
130
          tit: '浏览数量'
131
        }
132
      ],
133
      chartData: [],
134
      chartOneData: [],
135
      beginDate: dayListFn(true)
136
    }
137
  },
138
  components: {
139
    complexTable,
140
    LineChart
141
  },
142
  created() {
143
    this.queryInfoList()
144
    this.getInfoTotal()
145
  },
146
  methods: {
147
    getInfoTotal() {
148
      this.$http.get(queryTotalView, {
149
        tn: 'company',
150
        bt: this.beginDate
151
      }, (res) => {
152
        var obj = res.data
153
        this.chartData = chartModel(obj)
154
      })
155
    },
156
    filterSearch() {
157
      this.pageNo = 1
158
      this.total = 0
159
      this.tableData = []
160
      this.queryInfoList()
161
    },
162
    queryInfoList() {
163
      var that = this
164
      const form = this.formFilter
165
      let st = ''
166
      let et = ''
167
      if (form.dateRange) {
168
        st = form.dateRange[0]
169
        et = form.dateRange[1]
170
      }
171
      var obj = {
172
        name: form.name,
173
        industry: form.industry,
174
        actived: form.actived,
175
        bt: st,
176
        et: et,
177
        orderBy: form.orderBy,
178
        pageSize: this.pageSize,
179
        pageNo: this.pageNo
180
      }
181
      this.$http.get(pqCompanyFilterList, obj, (res) => {
182
        if (res.success && res.data) {
183
          const obj = res.data.data
184
          if (obj.length > 0) {
185
            var hData = { num: 1, data: obj }
186
            for (let i = 0; i < obj.length; ++i) {
187
              if (obj[i].createTime) {
188
                obj[i].createTime = parseTime(obj[i].createTime)
189
              }
190
              if (obj[i].activeTime) {
191
                obj[i].activeTime = parseTime(obj[i].activeTime)
192
              }
193
              (function(item, num) {
194
                item.industry = ''
195
                that.getCompanyKeyword(item, num)
196
              })(obj[i], hData.num)
197
            }
198
            hData.num--
199
            that.total = res.data.total
200
            if (hData.num === 0) {
201
              that.tableData = obj
202
            }
203
            ret.gapFilling(that.tableData)
204
          } else {
205
            that.pageNo = 1
206
            that.total = 0
207
            that.tableData = []
208
          }
209
        } else {
210
          that.pageNo = 1
211
          that.total = 0
212
          that.tableData = []
213
        }
214
      })
215
    },
216
    getCompanyKeyword(lmt, num) {
217
      var that = this
218
      var objKey = []
219
      num++
220
      that.$http.get(queryCompKeyword, {
221
        id: lmt.id,
222
        type: 1
223
      }, function(res) {
224
        num--
225
        if (res.success && res.data) {
226
          const str = res.data
227
          if (str.length > 0) {
228
            str.map(item => {
229
              objKey.push(item.value)
230
            })
231
            lmt.industry = objKey.join(',')
232
            that.$forceUpdate()
233
          }
234
        }
235
      })
236
    },
237
    current(val) {
238
      this.pageNo = val
239
      this.queryInfoList()
240
    },
241
    changeRangerDate(val) {
242
      this.formFilter.dateRange = val
243
    },
244
    catalogChanged(val) {
245
      this.formFilter.actived = val
246
    },
247
    sortChanged(val) {
248
      this.formFilter.orderBy = val
249
    },
250
    showChart(val) {
251
      this.chartOneData = []
252
      this.$http.get(queryOneView, {
253
        tn: 'company',
254
        id: val,
255
        bt: this.beginDate
256
      }, (res) => {
257
        if (res.success) {
258
          this.chartOneData = chartModel(res.data)
259
          this.ChartItemDialogVisible = true
260
        }
261
      })
262
    }
263
  }
264
}
265
</script>
266
267
<style>
268
  .content-item{
269
    padding: 10px;
270
  }
271
  .content-item + .content-item {
272
    border-top: 1px solid #ccc;
273
  }
274
  .content-item-tit{
275
    line-height: 30px;
276
  }
277
</style>

+ 2 - 4
src/views/statistics/contentCount.vue

@ -119,8 +119,7 @@ export default {
119 119
        },
120 120
        {
121 121
          prop: 'creator',
122
          tit: '发布人',
123
          width: '160'
122
          tit: '发布人'
124 123
        },
125 124
        {
126 125
          prop: 'modifyTime',
@ -129,8 +128,7 @@ export default {
129 128
        },
130 129
        {
131 130
          prop: 'sum',
132
          tit: '浏览数量',
133
          width: '160'
131
          tit: '浏览数量'
134 132
        }
135 133
      ],
136 134
      chartData: [],

+ 298 - 0
src/views/statistics/expertCount.vue

@ -0,0 +1,298 @@
1
<template>
2
  <div class="app-container">
3
    <div class="box-container">
4
      <div class="contain-title">特约专家数据统计列表</div>
5
    </div>
6
    <div class="content-container">
7
      <div class="content-item" style="padding-top:0">
8
        <div class="content-item-tit">特约专家总浏览量统计</div>
9
        <div class="line-chart-box">
10
          <LineChart :chartData="chartData"></LineChart>
11
        </div>
12
      </div>
13
      <div class="content-item">
14
        <div class="content-item-tit">特约专家浏览量查询</div>
15
        <div class="contain-search" style="margin-top:20px; width:95%">
16
          <el-form :model="formFilter" class="demo-form" label-width="100px">
17
            <el-row :gutter="10">
18
              <el-col :span="8">
19
                <el-form-item label="真实姓名:">
20
                  <el-input v-model="formFilter.name" placeholder="搜索真实姓名"></el-input>
21
                </el-form-item>
22
              </el-col>
23
              <el-col :span="8">
24
                <el-form-item label="所在机构:">
25
                  <el-input v-model="formFilter.orgName" placeholder="搜索所在机构"></el-input>
26
                </el-form-item>
27
              </el-col>
28
              <el-col :span="8">
29
                <el-form-item label="所在城市:">
30
                  <el-input v-model="formFilter.address" placeholder="搜索所在城市"></el-input>
31
                </el-form-item>
32
              </el-col>
33
              <el-col :span="8">
34
                <el-form-item label="入驻时间:">
35
                  <el-date-picker v-model="formFilter.dateRange" type="daterange"
36
                    range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
37
                    format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="changeRangerDate">
38
                  </el-date-picker>
39
                </el-form-item>
40
              </el-col>
41
              <el-col :span="8">
42
                <el-form-item label="排序方式:">
43
                  <el-select v-model="formFilter.orderBy" placeholder="选择排序方式" @change="sortChanged">
44
                    <el-option label="按入驻时间由新到旧排序" value="1"></el-option>
45
                    <el-option label="按浏览量由高到底排序" value="2"></el-option>
46
                  </el-select>
47
                </el-form-item>
48
              </el-col>
49
              <el-col :span="8">
50
                <el-form-item label-width="30px" align="right">
51
                  <el-button type="primary" @click="filterSearch">查询</el-button>
52
                </el-form-item>
53
              </el-col>
54
            </el-row>
55
          </el-form>
56
        </div>
57
        <complex-table :tableData="tableDataEnd" :tableItem="tableItem" :total="total" :jump="'expert'" v-on:current="current" :chartLine= true @showChart="showChart"
58
          v-loading="tableLoding"></complex-table>
59
      </div>
60
    </div>
61
    <el-dialog title="专家流量分析" :visible.sync="ChartItemDialogVisible" width="860px">
62
      <LineChart :chartData="chartOneData"></LineChart>
63
    </el-dialog>
64
  </div>
65
</template>
66
67
<script>
68
import { pqExpertFilterList, queryTotalView, queryOneView } from '@/api/statistics'
69
import { parseTime } from '@/utils/index'
70
import complexTable from '@/components/complexTable'
71
import crossDomin from '@/utils/CrossDomain'
72
import LineChart from './lineChart/LineChart'
73
import { dayListFn, chartModel } from './lineChart/chart'
74
import { doneFilter } from './ObjFilters'
75
76
export default {
77
  data() {
78
    return {
79
      ChartItemDialogVisible: false,
80
      formFilter: {
81
        name: '',
82
        orgName: '',
83
        address: '',
84
        dateRange: '',
85
        orderBy: '1'
86
      },
87
      pageSize: 10,
88
      pageNo: 1,
89
      total: 0,
90
      tableData: [],
91
      tableDataEnd: [],
92
      filterTableDataEnd: [],
93
      flag: false,
94
      tableLoding: true,
95
      tableItem: [
96
        {
97
          tit: '图表',
98
          chart: true,
99
          width: 80
100
        },
101
        {
102
          prop: 'name',
103
          tit: '真实姓名',
104
          active: 'active'
105
        },
106
        {
107
          prop: 'title',
108
          tit: '职称'
109
        },
110
        {
111
          prop: 'orgName',
112
          tit: '所在机构'
113
        },
114
        {
115
          prop: 'address',
116
          tit: '所在城市'
117
        },
118
        {
119
          prop: 'phone',
120
          tit: '联系电话',
121
          width: '160'
122
        },
123
        {
124
          prop: 'email',
125
          tit: '联系邮箱',
126
          width: '160'
127
        },
128
        {
129
          prop: 'assTime',
130
          tit: '入驻时间',
131
          width: '160'
132
        },
133
        {
134
          prop: 'sum',
135
          tit: '浏览数量'
136
        }
137
      ],
138
      chartData: [],
139
      chartOneData: [],
140
      beginDate: dayListFn(true)
141
    }
142
  },
143
  components: {
144
    complexTable,
145
    LineChart
146
  },
147
  created() {
148
    this.queryInfoList()
149
    this.getInfoTotal()
150
  },
151
  methods: {
152
    getInfoTotal() {
153
      this.$http.get(queryTotalView, {
154
        tn: 'professor',
155
        bt: this.beginDate
156
      }, (res) => {
157
        var obj = res.data
158
        this.chartData = chartModel(obj)
159
      })
160
    },
161
    filterSearch() {
162
      this.tableLoding = true
163
      const form = this.formFilter
164
      let st = new Date('1970-01-01')
165
      let et = new Date().getTime()
166
      if (form.dateRange) {
167
        st = new Date(form.dateRange[0]).getTime()
168
        et = new Date(form.dateRange[1]).getTime()
169
      }
170
      // 筛选条件
171
      var Conditions = {
172
        strs: [
173
          {
174
            type: 'name',
175
            val: form.name
176
          },
177
          {
178
            type: 'orgName',
179
            val: form.orgName
180
          },
181
          {
182
            type: 'address',
183
            val: form.address
184
          }
185
        ],
186
        ranges: [
187
          {
188
            type: 'assTime',
189
            min: st,
190
            max: et
191
          }
192
        ]
193
      }
194
      this.tableDataEnd = []
195
      this.filterTableDataEnd = []
196
      this.filterTableDataEnd = doneFilter(this.tableData, Conditions)
197
      this.pageNo = 1
198
      this.total = this.filterTableDataEnd.length
199
      this.currentChangePage(this.filterTableDataEnd)
200
      this.flag = true
201
      this.tableLoding = false
202
    },
203
    sortChanged(val) {
204
      this.formFilter.orderBy = val
205
    },
206
    sortTableOperate(val) {
207
      if (val.length > 0) {
208
        val.sort((a, b) => {
209
          if (this.formFilter.orderBy === '1') {
210
            return new Date(b.assTime).getTime() - new Date(a.assTime).getTime()
211
          } else if (this.formFilter.orderBy === '2') {
212
            return b.sum - a.sum
213
          }
214
        })
215
      }
216
      return val
217
    },
218
    queryInfoList() {
219
      this.$http.get(pqExpertFilterList, {}, (response) => {
220
        if (response.success && response.data) {
221
          const epData = response.data
222
          let j = 0
223
          for (let i = 0; i < epData.length; i++) {
224
            epData[i].assTime = parseTime(epData[i].assTime).substr(0, 16)
225
            j++
226
            crossDomin.getUserInfo(epData[i].id, data => {
227
              j--
228
              Object.assign(epData[i], data)
229
              if (j === 0) {
230
                this.tableData = epData
231
                this.total = epData.length
232
                if (this.total > this.pageSize) {
233
                  for (let i = 0; i < this.pageSize; i++) {
234
                    this.tableDataEnd.push(epData[i])
235
                  }
236
                } else {
237
                  this.tableDataEnd = epData
238
                }
239
                this.tableLoding = false
240
                this.tableDataEnd = this.sortTableOperate(this.tableDataEnd)
241
              }
242
            })
243
          }
244
        } else {
245
          this.tableLoding = false
246
        }
247
      })
248
    },
249
    current(val) {
250
      this.pageNo = val
251
      if (!this.flag) {
252
        this.currentChangePage(this.tableDataEnd)
253
      } else {
254
        this.currentChangePage(this.filterTableDataEnd)
255
      }
256
    },
257
    currentChangePage(list) {
258
      let from = (this.pageNo - 1) * this.pageSize
259
      const to = this.pageNo * this.pageSize
260
      this.tableDataEnd = []
261
      for (; from < to; from++) {
262
        if (list[from]) {
263
          this.tableDataEnd.push(list[from])
264
        }
265
      }
266
      this.tableDataEnd = this.sortTableOperate(this.tableDataEnd)
267
    },
268
    changeRangerDate(val) {
269
      this.formFilter.dateRange = val
270
    },
271
    showChart(val) {
272
      this.chartOneData = []
273
      this.$http.get(queryOneView, {
274
        tn: 'professor',
275
        id: val,
276
        bt: this.beginDate
277
      }, (res) => {
278
        if (res.success) {
279
          this.chartOneData = chartModel(res.data)
280
          this.ChartItemDialogVisible = true
281
        }
282
      })
283
    }
284
  }
285
}
286
</script>
287
288
<style>
289
  .content-item{
290
    padding: 10px;
291
  }
292
  .content-item + .content-item {
293
    border-top: 1px solid #ccc;
294
  }
295
  .content-item-tit{
296
    line-height: 30px;
297
  }
298
</style>

+ 89 - 0
src/views/statistics/objFilters.js

@ -0,0 +1,89 @@
1
const ObjFilters = {
2
  /**
3
   * 字符串类型筛选
4
   * @param {array<Obj>} objArr
5
   * @param {array<{type: String, val: String}>} strs
6
   */
7
  strsFilter(objArr, strs) {
8
    if (strs.length === 0) {
9
      return objArr
10
    } else {
11
      for (const str of strs) {
12
        objArr = objArr.filter(item => {
13
          if (item[str.type]) {
14
            return item[str.type].match(str.val) !== null
15
          } else {
16
            return item
17
          }
18
        })
19
      }
20
    }
21
    return objArr
22
  },
23
  /**
24
   * 区间类型筛选
25
   * @param {array<Obj>} objArr
26
   * @param {array<{type: String, min: String, max: String}>} ranges
27
   */
28
  rangesFilter(objArr, ranges) {
29
    if (ranges.length === 0) {
30
      return objArr
31
    } else {
32
      /**
33
       * 循环多个区间条件,
34
       * 每种区间类型应该只有一个,
35
       * 比如价格区间不会有1000-2000和4000-6000同时需要的情况
36
       */
37
      for (const range of ranges) {
38
        // 多个不同类型区间是与逻辑,可以直接赋值给自身
39
        objArr = objArr.filter(item => {
40
          if (item[range.type]) {
41
            const r = new Date(item[range.type]).getTime()
42
            if (range.min && range.max) {
43
              return r >= range.min && r <= range.max
44
            }
45
          } else {
46
            return item
47
          }
48
        })
49
      }
50
      return objArr
51
    }
52
  },
53
54
  /**
55
   * 选择类型筛选
56
   * @param {array<Obj>} objArr
57
   * @param {array<{type: String, val: String}>} chooses
58
   */
59
  choosesFilter(objArr, chooses) {
60
    let tmpObj = []
61
    if (chooses.length === 0) {
62
      tmpObj = objArr
63
    } else {
64
      /**
65
       * 选择类型条件是或逻辑,使用数组连接concat
66
       */
67
      for (const choice of chooses) {
68
        tmpObj = tmpObj.concat(objArr.filter(item => {
69
          if (item[choice.type]) {
70
            return item[choice.type].match(choice.val) !== null
71
          }
72
        }))
73
      }
74
    }
75
    return tmpObj
76
  }
77
}
78
79
export function doneFilter(obj, conditions) {
80
  // 根据条件循环调用筛选器里的方法
81
  for (const key in conditions) {
82
    // 判断是否有需要的过滤方法
83
    if (ObjFilters.hasOwnProperty(key + 'Filter') && typeof ObjFilters[key + 'Filter'] === 'function') {
84
      obj = ObjFilters[key + 'Filter'](obj, conditions[key])
85
    }
86
  }
87
  return obj
88
}
89

+ 286 - 0
src/views/statistics/orgCount.vue

@ -0,0 +1,286 @@
1
<template>
2
  <div class="app-container">
3
    <div class="box-container">
4
      <div class="contain-title">合作机构数据统计</div>
5
    </div>
6
    <div class="content-container">
7
      <div class="content-item" style="padding-top:0">
8
        <div class="content-item-tit">机构总浏览量统计</div>
9
        <div class="line-chart-box">
10
          <LineChart :chartData="chartData"></LineChart>
11
        </div>
12
      </div>
13
      <div class="content-item">
14
        <div class="content-item-tit">机构浏览量查询</div>
15
        <div class="contain-search" style="margin-top:20px; width:70%">
16
          <el-form :model="formFilter" class="demo-form" label-width="100px">
17
            <el-row :gutter="10">
18
              <el-col :span="12">
19
                <el-form-item label="机构名称:">
20
                  <el-input v-model="formFilter.name" placeholder="搜索机构名称"></el-input>
21
                </el-form-item>
22
              </el-col>
23
              <el-col :span="12">
24
                <el-form-item label="机构类型:">
25
                  <el-input v-model="formFilter.orgType" placeholder="搜索机构类型"></el-input>
26
                </el-form-item>
27
              </el-col>
28
              <el-col :span="12">
29
                <el-form-item label="入驻时间:">
30
                  <el-date-picker v-model="formFilter.dateRange" type="daterange"
31
                    range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
32
                    format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="changeRangerDate">
33
                  </el-date-picker>
34
                </el-form-item>
35
              </el-col>
36
              <el-col :span="12">
37
                <el-form-item label="排序方式:">
38
                  <el-select v-model="formFilter.orderBy" placeholder="选择排序方式" @change="sortChanged">
39
                    <el-option label="按入驻时间由新到旧排序" value="1"></el-option>
40
                    <el-option label="按浏览量由高到底排序" value="2"></el-option>
41
                  </el-select>
42
                </el-form-item>
43
              </el-col>
44
              <el-col :span="24">
45
                <el-form-item label-width="30px" align="right">
46
                  <el-button type="primary" @click="filterSearch">查询</el-button>
47
                </el-form-item>
48
              </el-col>
49
            </el-row>
50
          </el-form>
51
        </div>
52
        <complex-table :tableData="tableDataEnd" :tableItem="tableItem" :total="total" :jump="'org'" v-on:current="current" :chartLine= true @showChart="showChart"
53
          v-loading="tableLoding"></complex-table>
54
      </div>
55
    </div>
56
    <el-dialog title="机构流量分析" :visible.sync="ChartItemDialogVisible" width="860px">
57
      <LineChart :chartData="chartOneData"></LineChart>
58
    </el-dialog>
59
  </div>
60
</template>
61
62
<script>
63
import { pqOrgFilterList, queryTotalView, queryOneView } from '@/api/statistics'
64
import { parseTime } from '@/utils/index'
65
import complexTable from '@/components/complexTable'
66
import crossDomin from '@/utils/CrossDomain'
67
import LineChart from './lineChart/LineChart'
68
import { dayListFn, chartModel } from './lineChart/chart'
69
import { doneFilter } from './ObjFilters'
70
71
export default {
72
  data() {
73
    return {
74
      ChartItemDialogVisible: false,
75
      formFilter: {
76
        name: '',
77
        orgType: '',
78
        dateRange: '',
79
        orderBy: '1'
80
      },
81
      pageSize: 10,
82
      pageNo: 1,
83
      total: 0,
84
      tableData: [],
85
      tableDataEnd: [],
86
      filterTableDataEnd: [],
87
      flag: false,
88
      tableLoding: true,
89
      tableItem: [
90
        {
91
          tit: '图表',
92
          chart: true,
93
          width: 80
94
        },
95
        {
96
          prop: 'name',
97
          tit: '机构名称',
98
          active: 'active'
99
        },
100
        {
101
          prop: 'orgType',
102
          tit: '机构类型'
103
        },
104
        {
105
          prop: 'phone',
106
          tit: '联系电话',
107
          width: '160'
108
        },
109
        {
110
          prop: 'email',
111
          tit: '联系邮箱',
112
          width: '160'
113
        },
114
        {
115
          prop: 'assTime',
116
          tit: '入驻时间',
117
          width: '160'
118
        },
119
        {
120
          prop: 'sum',
121
          tit: '浏览数量'
122
        }
123
      ],
124
      chartData: [],
125
      chartOneData: [],
126
      beginDate: dayListFn(true)
127
    }
128
  },
129
  components: {
130
    complexTable,
131
    LineChart
132
  },
133
  created() {
134
    this.queryInfoList()
135
    this.getInfoTotal()
136
  },
137
  methods: {
138
    getInfoTotal() {
139
      this.$http.get(queryTotalView, {
140
        tn: 'organization',
141
        bt: this.beginDate
142
      }, (res) => {
143
        var obj = res.data
144
        this.chartData = chartModel(obj)
145
      })
146
    },
147
    filterSearch() {
148
      this.tableLoding = true
149
      const form = this.formFilter
150
      let st = new Date('1970-01-01')
151
      let et = new Date().getTime()
152
      if (form.dateRange) {
153
        st = new Date(form.dateRange[0]).getTime()
154
        et = new Date(form.dateRange[1]).getTime()
155
      }
156
      // 筛选条件
157
      var Conditions = {
158
        strs: [
159
          {
160
            type: 'name',
161
            val: form.name
162
          },
163
          {
164
            type: 'orgType',
165
            val: form.orgType
166
          }
167
        ],
168
        ranges: [
169
          {
170
            type: 'assTime',
171
            min: st,
172
            max: et
173
          }
174
        ]
175
      }
176
      this.tableDataEnd = []
177
      this.filterTableDataEnd = []
178
      this.filterTableDataEnd = doneFilter(this.tableData, Conditions)
179
      this.pageNo = 1
180
      this.total = this.filterTableDataEnd.length
181
      this.currentChangePage(this.filterTableDataEnd)
182
      this.flag = true
183
      this.tableLoding = false
184
    },
185
    sortChanged(val) {
186
      this.formFilter.orderBy = val
187
    },
188
    sortTableOperate(val) {
189
      if (val.length > 0) {
190
        val.sort((a, b) => {
191
          if (this.formFilter.orderBy === '1') {
192
            return new Date(b.assTime).getTime() - new Date(a.assTime).getTime()
193
          } else if (this.formFilter.orderBy === '2') {
194
            return b.sum - a.sum
195
          }
196
        })
197
      }
198
      return val
199
    },
200
    queryInfoList() {
201
      this.$http.get(pqOrgFilterList, {}, (response) => {
202
        if (response.success && response.data) {
203
          const epData = response.data
204
          let j = 0
205
          for (let i = 0; i < epData.length; i++) {
206
            epData[i].assTime = parseTime(epData[i].assTime).substr(0, 10)
207
            j++
208
            crossDomin.getAgencyInfo(epData[i].id, data => {
209
              j--
210
              Object.assign(epData[i], data)
211
              if (j === 0) {
212
                this.tableData = epData
213
                this.total = epData.length
214
                if (this.total > this.pageSize) {
215
                  for (let i = 0; i < this.pageSize; i++) {
216
                    this.tableDataEnd.push(epData[i])
217
                  }
218
                } else {
219
                  this.tableDataEnd = epData
220
                }
221
                this.tableLoding = false
222
                this.tableDataEnd = this.sortTableOperate(this.tableDataEnd)
223
              }
224
            })
225
          }
226
          if (epData.length === 0) {
227
            this.dataList = []
228
            this.tableData = []
229
            this.total = 0
230
          }
231
        } else {
232
          this.$sort.total = 0
233
          this.tableData = []
234
        }
235
      })
236
    },
237
    current(val) {
238
      this.pageNo = val
239
      if (!this.flag) {
240
        this.currentChangePage(this.tableDataEnd)
241
      } else {
242
        this.currentChangePage(this.filterTableDataEnd)
243
      }
244
    },
245
    currentChangePage(list) {
246
      let from = (this.pageNo - 1) * this.pageSize
247
      const to = this.pageNo * this.pageSize
248
      this.tableDataEnd = []
249
      for (; from < to; from++) {
250
        if (list[from]) {
251
          this.tableDataEnd.push(list[from])
252
        }
253
      }
254
      this.tableDataEnd = this.sortTableOperate(this.tableDataEnd)
255
    },
256
    changeRangerDate(val) {
257
      this.formFilter.dateRange = val
258
    },
259
    showChart(val) {
260
      this.chartOneData = []
261
      this.$http.get(queryOneView, {
262
        tn: 'organization',
263
        id: val,
264
        bt: this.beginDate
265
      }, (res) => {
266
        if (res.success) {
267
          this.chartOneData = chartModel(res.data)
268
          this.ChartItemDialogVisible = true
269
        }
270
      })
271
    }
272
  }
273
}
274
</script>
275
276
<style>
277
  .content-item{
278
    padding: 10px;
279
  }
280
  .content-item + .content-item {
281
    border-top: 1px solid #ccc;
282
  }
283
  .content-item-tit{
284
    line-height: 30px;
285
  }
286
</style>

+ 269 - 0
src/views/statistics/productCount.vue

@ -0,0 +1,269 @@
1
<template>
2
  <div class="app-container">
3
    <div class="box-container">
4
      <div class="contain-title">企业产品数据统计</div>
5
    </div>
6
    <div class="content-container">
7
      <div class="content-item" style="padding-top:0">
8
        <div class="content-item-tit">企业产品总浏览量统计</div>
9
        <div class="line-chart-box">
10
          <LineChart :chartData="chartData"></LineChart>
11
        </div>
12
      </div>
13
      <div class="content-item">
14
        <div class="content-item-tit">企业产品浏览量查询</div>
15
        <div class="contain-search" style="margin-top:20px; width:70%">
16
          <el-form :model="formFilter" class="demo-form" label-width="100px">
17
            <el-row :gutter="10">
18
              <el-col :span="12">
19
                <el-form-item label="产品名称:">
20
                  <el-input v-model="formFilter.title" placeholder="搜索产品名称"></el-input>
21
                </el-form-item>
22
              </el-col>
23
              <el-col :span="12">
24
                <el-form-item label="所属企业:">
25
                  <el-select v-model="formFilter.companyId" clearable filterable remote :remote-method="remoteOwnerName"
26
                  suffix-icon="el-icon-search" @change="ownerChanged" placeholder="搜索所属企业">
27
                    <el-option v-for="item in nameOptions" :key="item.value" :label="item.label" :value="item.value">
28
                    </el-option>
29
                  </el-select>
30
                </el-form-item>
31
              </el-col>
32
              <el-col :span="12">
33
                <el-form-item label="创建时间:">
34
                  <el-date-picker v-model="formFilter.dateRange" type="daterange"
35
                    range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
36
                    format="yyyy-MM-dd" value-format="yyyyMMdd" @change="changeRangerDate">
37
                  </el-date-picker>
38
                </el-form-item>
39
              </el-col>
40
              <el-col :span="12">
41
                <el-form-item label="排序方式:">
42
                  <el-select v-model="formFilter.orderBy" placeholder="选择排序方式" @change="sortChanged">
43
                    <el-option label="按创建时间由新到旧排序" value="1"></el-option>
44
                    <el-option label="按浏览量由高到底排序" value="2"></el-option>
45
                  </el-select>
46
                </el-form-item>
47
              </el-col>
48
              <el-col :span="24">
49
                <el-form-item label-width="30px" align="right">
50
                  <el-button type="primary" @click="filterSearch">查询</el-button>
51
                </el-form-item>
52
              </el-col>
53
            </el-row>
54
          </el-form>
55
        </div>
56
        <complex-table :tableData="tableData" :tableItem="tableItem" :total="total" :jump="'product'" v-on:current="current" :chartLine= true @showChart="showChart"></complex-table>
57
      </div>
58
    </div>
59
    <el-dialog title="企业产品流量分析" :visible.sync="ChartItemDialogVisible" width="860px">
60
      <LineChart :chartData="chartOneData"></LineChart>
61
    </el-dialog>
62
  </div>
63
</template>
64
65
<script>
66
import { queryCompName, queryCompanyOne } from '@/api/companyCen'
67
import { pqProductFilterList, queryTotalView, queryOneView } from '@/api/statistics'
68
import { parseTime } from '@/utils/index'
69
import complexTable from '@/components/complexTable'
70
import ret from '@/utils/comTable'
71
import LineChart from './lineChart/LineChart'
72
import { dayListFn, chartModel } from './lineChart/chart'
73
74
export default {
75
  data() {
76
    return {
77
      ChartItemDialogVisible: false,
78
      nameOptions: [],
79
      formFilter: {
80
        title: '',
81
        companyId: '',
82
        dateRange: '',
83
        orderBy: '1'
84
      },
85
      pageSize: 10,
86
      pageNo: 1,
87
      total: 0,
88
      tableData: [],
89
      tableItem: [
90
        {
91
          tit: '图表',
92
          chart: true,
93
          width: 80
94
        },
95
        {
96
          prop: 'name',
97
          tit: '产品名称',
98
          active: 'active'
99
        },
100
        {
101
          prop: 'companyName',
102
          tit: '所属企业'
103
        },
104
        {
105
          prop: 'createTime',
106
          tit: '创建时间',
107
          width: '160'
108
        },
109
        {
110
          prop: 'sum',
111
          tit: '浏览数量'
112
        }
113
      ],
114
      chartData: [],
115
      chartOneData: [],
116
      beginDate: dayListFn(true)
117
    }
118
  },
119
  components: {
120
    complexTable,
121
    LineChart
122
  },
123
  created() {
124
    this.queryInfoList()
125
    this.getInfoTotal()
126
  },
127
  methods: {
128
    getInfoTotal() {
129
      this.$http.get(queryTotalView, {
130
        tn: 'product',
131
        bt: this.beginDate
132
      }, (res) => {
133
        var obj = res.data
134
        this.chartData = chartModel(obj)
135
      })
136
    },
137
    filterSearch() {
138
      this.pageNo = 1
139
      this.total = 0
140
      this.tableData = []
141
      this.queryInfoList()
142
    },
143
    queryInfoList() {
144
      var that = this
145
      const form = this.formFilter
146
      let st = ''
147
      let et = ''
148
      if (form.dateRange) {
149
        st = form.dateRange[0]
150
        et = form.dateRange[1]
151
      }
152
      var obj = {
153
        title: form.title,
154
        companyId: form.companyId,
155
        bt: st,
156
        et: et,
157
        orderBy: form.orderBy,
158
        pageSize: this.pageSize,
159
        pageNo: this.pageNo
160
      }
161
      this.$http.get(pqProductFilterList, obj, (res) => {
162
        if (res.success && res.data) {
163
          const obj = res.data.data
164
          if (obj.length > 0) {
165
            var hData = { num: 1, data: obj }
166
            for (let i = 0; i < obj.length; ++i) {
167
              if (obj[i].createTime) {
168
                obj[i].createTime = parseTime(obj[i].createTime)
169
              }
170
              (function(item, num) {
171
                item.companyName = ''
172
                that.getCompanyName(item, num)
173
              })(obj[i], hData.num)
174
            }
175
            hData.num--
176
            that.total = res.data.total
177
            if (hData.num === 0) {
178
              that.tableData = obj
179
            }
180
            ret.gapFilling(that.tableData)
181
          } else {
182
            that.pageNo = 1
183
            that.total = 0
184
            that.tableData = []
185
          }
186
        } else {
187
          that.pageNo = 1
188
          that.total = 0
189
          that.tableData = []
190
        }
191
      })
192
    },
193
    getCompanyName(lmt, num) {
194
      var that = this
195
      num++
196
      that.$http.get(queryCompanyOne, {
197
        id: lmt.companyId
198
      }, function(res) {
199
        num--
200
        if (res.success) {
201
          const obj = res.data
202
          lmt.companyName = obj.name
203
          that.$forceUpdate()
204
        }
205
      })
206
    },
207
    current(val) {
208
      this.pageNo = val
209
      this.queryInfoList()
210
    },
211
    remoteOwnerName(query) {
212
      var that = this
213
      if (query !== '') {
214
        that.selectLoading = true
215
        that.$http.get(queryCompName, {
216
          name: query,
217
          size: 5
218
        }, function(res) {
219
          that.selectLoading = false
220
          if (res.success && res.data) {
221
            const obj = res.data
222
            that.nameOptions = obj.map(item => {
223
              return { value: item.id, label: item.name }
224
            })
225
          } else {
226
            that.nameOptions = []
227
          }
228
        })
229
      } else {
230
        that.compOptions = []
231
      }
232
    },
233
    changeRangerDate(val) {
234
      this.formFilter.dateRange = val
235
    },
236
    ownerChanged(val) {
237
      this.formFilter.companyId = val
238
    },
239
    sortChanged(val) {
240
      this.formFilter.orderBy = val
241
    },
242
    showChart(val) {
243
      this.chartOneData = []
244
      this.$http.get(queryOneView, {
245
        tn: 'product',
246
        id: val,
247
        bt: this.beginDate
248
      }, (res) => {
249
        if (res.success) {
250
          this.chartOneData = chartModel(res.data)
251
          this.ChartItemDialogVisible = true
252
        }
253
      })
254
    }
255
  }
256
}
257
</script>
258
259
<style>
260
  .content-item{
261
    padding: 10px;
262
  }
263
  .content-item + .content-item {
264
    border-top: 1px solid #ccc;
265
  }
266
  .content-item-tit{
267
    line-height: 30px;
268
  }
269
</style>