魏熙美 5 år sedan
förälder
incheckning
43347fc993

+ 80
- 0
src/components/charts/XLine.vue Visa fil

@@ -0,0 +1,80 @@
1
+<template>
2
+   <div ref="thirdChart" ></div>
3
+</template>
4
+<script>
5
+import Echarts from "echarts";
6
+export default {
7
+  name: "XLine",
8
+  props: ["value"],
9
+  data() {
10
+    return {
11
+      chart: undefined,
12
+      defaultOpts: {
13
+        //  dataset: {
14
+        //   dimensions: ['date', 'userCount', 'authorizationCount'],
15
+        //   source,
16
+        // },
17
+        title: {
18
+          text: "新增用户"
19
+        },
20
+        color: ["purple", "green"],
21
+        tooltip: {
22
+          trigger: "axis"
23
+        },
24
+        legend: {
25
+          data: ["新用户数", "授权注册"]
26
+        },
27
+        grid: {
28
+          left: "3%",
29
+          right: "4%",
30
+          bottom: "3%",
31
+          containLabel: true
32
+        },
33
+        toolbox: {},
34
+        xAxis: {
35
+          type: "category",
36
+          boundaryGap: false
37
+        },
38
+        yAxis: {
39
+          type: "value"
40
+        },
41
+        series: [
42
+          {
43
+            name: "新用户数",
44
+            type: "line",
45
+            stack: "1"
46
+          },
47
+          {
48
+            name: "授权注册",
49
+            type: "line",
50
+            stack: "2"
51
+          }
52
+        ]
53
+      }
54
+    };
55
+  },
56
+  watch: {
57
+    value (val) {
58
+      this.renderChart(val)
59
+    },
60
+  },
61
+  mounted() {
62
+    if (!this.chart) {
63
+      this.chart = Echarts.init(this.$refs.thirdChart);
64
+      this.renderChart(this.value)
65
+    }
66
+  },
67
+  methods: {
68
+    renderChart(val) {
69
+      // 绘制图表
70
+      this.chart.setOption({
71
+        ...this.defaultOpts,
72
+        ...val
73
+      });
74
+    }
75
+  }
76
+};
77
+</script>
78
+<style>
79
+</style>
80
+

+ 18
- 4
src/config/api.js Visa fil

@@ -318,15 +318,29 @@ const apis = {
318 318
       url: `${commPrefix}/taCustomerMessage`
319 319
     }
320 320
   },
321
+    report:{
322
+        list:{
323
+            method:'get',
324
+            url: `${commPrefix}/tdReports`
325
+        },
326
+        checkedlist:{
327
+            method:'get',
328
+            url: `${commPrefix}/taBuildingReports`
329
+        },
330
+        add:{
331
+            method:'post',
332
+            url: `${commPrefix}/taBuildingReport/add`
333
+        },
334
+    },
321 335
   indexEcharts:{
322 336
     list:{
323 337
       method:'get',
324 338
       url: `${commPrefix}/indexStatistical`
325 339
     },
326
-    userResource: {
327
-      method:'get',
328
-      url: `${commPrefix}/selectUserResource`
329
-    }
340
+      userResource: {
341
+          method:'get',
342
+          url: `${commPrefix}/selectUserResource`
343
+      }
330 344
   },
331 345
 }
332 346
 export default apis

+ 1
- 0
src/store/index.js Visa fil

@@ -21,6 +21,7 @@ const store = new Vuex.Store({
21 21
     carouselFigure: require('./modules/carouselFigure').default,
22 22
     indexEcharts: require('./modules/indexEcharts').default,
23 23
     message: require('./modules/message').default,
24
+    report: require('./modules/report').default,
24 25
     news
25 26
 
26 27
   }

+ 20
- 0
src/store/modules/indexEcharts.js Visa fil

@@ -5,11 +5,15 @@ export default {
5 5
   namespaced: true,
6 6
   state: {
7 7
     echartsInfo: {},
8
+    newsUserCount:{}
8 9
   },
9 10
   mutations: {
10 11
     updateList (state, payload) {
11 12
       state.echartsInfo = payload
12 13
     },
14
+    updateNewsUserCount (state, payload) {
15
+      state.newsUserCount = payload
16
+    },
13 17
   },
14 18
   actions: {
15 19
     setDetailNull ({ commit }) {
@@ -31,6 +35,22 @@ export default {
31 35
         })
32 36
       })
33 37
     },
38
+    getNewsUserCount ({ commit }, payload) {
39
+      return new Promise((resolve, reject) => {
40
+        request({
41
+          ...apis.indexEcharts.newsUserCount,
42
+          params: payload,
43
+        }).then((data) => {
44
+          commit('updateNewsUserCount', data)
45
+          resolve(data)
46
+        }).catch((err) => {
47
+          const message = err.message || err.msg
48
+          if (typeof message === 'string') {
49
+            reject(message)
50
+          }
51
+        })
52
+      })
53
+    },
34 54
     // changeExchangeStatus (_, payload) {
35 55
     //   return new Promise((resolve, reject) => {
36 56
     //     request({

+ 141
- 0
src/store/modules/report.js Visa fil

@@ -0,0 +1,141 @@
1
+import request from '../../utils/request'
2
+import apis from '../../config/api'
3
+
4
+export default {
5
+  namespaced: true,
6
+  state: {
7
+    dynamics: {},
8
+    detail: {}
9
+  },
10
+  mutations: {
11
+    updateList (state, payload) {
12
+      state.dynamics = payload
13
+    },
14
+    updateDetail (state, payload) {
15
+      state.detail = payload
16
+    }
17
+  },
18
+  actions: {
19
+    setDetailNull ({ commit }) {
20
+      commit('updateDetail', {})
21
+    },
22
+    getReportList ({ commit }, payload) {
23
+      return new Promise((resolve, reject) => {
24
+        request({
25
+          ...apis.report.list,
26
+          params: payload,
27
+        }).then((data) => {
28
+          commit('updateList', data)
29
+          resolve(data)
30
+        }).catch((err) => {
31
+          resolve(err)
32
+        })
33
+      })
34
+    },
35
+    getReportCheckedList ({ commit }, payload) {
36
+      return new Promise((resolve, reject) => {
37
+        request({
38
+          ...apis.report.checkedlist,
39
+          params: payload,
40
+        }).then((data) => {
41
+          commit('updateList', data)
42
+          resolve(data)
43
+        }).catch((err) => {
44
+          resolve(err)
45
+        })
46
+      })
47
+    },
48
+    getGoodsDetail ({ commit }, payload) {
49
+      return new Promise((resolve, reject) => {
50
+        request({
51
+          ...apis.goods.detail,
52
+          urlData: payload,
53
+        }).then((data) => {
54
+          commit('updateDetail', data)
55
+          resolve(data)
56
+        }).catch((err) => {
57
+          const message = err.message || err.msg
58
+
59
+          if (typeof message === 'string') {
60
+            reject(message)
61
+          }
62
+        })
63
+      })
64
+    },
65
+    saveCheckedReport (_, payload) {
66
+      return new Promise((resolve, reject) => {
67
+        request({
68
+          ...apis.report.add, 
69
+          data: payload,
70
+        }).then((data) => {
71
+          resolve(data)
72
+        }).catch((err) => {
73
+          const message = err.message || err.msg
74
+          if (typeof message === 'string') {
75
+            reject(message)
76
+          }
77
+        })
78
+      })
79
+    },
80
+    editGoods (_, payload) {
81
+      return new Promise((resolve, reject) => {
82
+        request({
83
+          ...apis.goods.edit,
84
+          data: payload,
85
+        }).then((data) => {
86
+          resolve(data)
87
+        }).catch((err) => {
88
+          const message = err.message || err.msg
89
+
90
+          if (typeof message === 'string') {
91
+            reject(message)
92
+          }
93
+        })
94
+      })
95
+    },
96
+    deleteDynamics (_, payload) {
97
+      return new Promise((resolve, reject) => {
98
+        request({
99
+          ...apis.dynamic.delete,
100
+          ...payload
101
+        }).then(() => {
102
+          resolve()
103
+        }).catch(() => {
104
+          reject()
105
+        })
106
+      })
107
+    },
108
+    changeGoodsStatus (_, payload) {
109
+      return new Promise((resolve, reject) => {
110
+        request({
111
+          ...apis.goods.change,
112
+          data: payload,
113
+        }).then((data) => {
114
+          resolve(data)
115
+        }).catch((err) => {
116
+          const message = err.message || err.msg
117
+
118
+          if (typeof message === 'string') {
119
+            reject(message)
120
+          }
121
+        })
122
+      })
123
+    },
124
+    cancelDynamic (_, payload) {
125
+      return new Promise((resolve, reject) => {
126
+        request({
127
+          ...apis.dynamic.cancel,
128
+          urlData: payload,
129
+        }).then((data) => {
130
+          resolve(data)
131
+        }).catch((err) => {
132
+          const message = err.message || err.msg
133
+
134
+          if (typeof message === 'string') {
135
+            reject(message)
136
+          }
137
+        })
138
+      })
139
+    }
140
+  }
141
+}

+ 9
- 0
src/views/index.js Visa fil

@@ -311,6 +311,15 @@ const pages = [
311 311
           title: '客户留言',
312 312
         },
313 313
       },
314
+      {
315
+        path: 'report',
316
+        name: 'report',
317
+        component: () => import('./systemManagement/report.vue'),
318
+        meta: {
319
+          menuShow: true,
320
+          title: '报表数据',
321
+        },
322
+      },
314 323
     ]
315 324
   },
316 325
   {

+ 1
- 1
src/views/indexEcharts/index.vue Visa fil

@@ -540,7 +540,7 @@ export default {
540 540
       //   this.members.push(this.echartsInfo.selectUserBehavior[i].members);
541 541
       // }
542 542
     }
543
-    this.drawLine();
543
+    this.initPage();
544 544
   }
545 545
 };
546 546
 </script>

+ 57
- 57
src/views/indexEcharts/newUsers.vue Visa fil

@@ -9,12 +9,9 @@
9 9
       end-placeholder="结束日期"
10 10
       default-value="2019-08-08">
11 11
     </el-date-picker></p>
12
-  <div class="grid-content" ref="thirdChart"  id="thirdChart"  :style="{ height: '500px',margin:'20px 0',border:'1px solid #eee', padding:'20px',borderRadius:'5px'}" ></div>
13
-   <el-table :data="tableData2"  border  center  style="width: 100%">
14
-    <el-table-column label="用户姓名" prop="name"></el-table-column>
15
-    <el-table-column label="手机号" prop="phone"></el-table-column>
16
-    <el-table-column label="意向楼盘" prop="building"></el-table-column>
17
-    <el-table-column label="意向值" prop="num"></el-table-column>
12
+  <x-line :style="{ height: '500px',margin:'20px 0',border:'1px solid #eee', padding:'20px',borderRadius:'5px'}"  :value="lineSeting"></x-line>
13
+   <el-table :data="tableData"  border  center  style="width: 100%">
14
+    <el-table-column v-for="(item, index) in tableTitle" :key="index" :label="item" :prop="index == 0 ? 'label': item"></el-table-column>
18 15
   </el-table>
19 16
 
20 17
 </div>
@@ -24,14 +21,30 @@
24 21
 import { createNamespacedHelpers } from "vuex";
25 22
 import apis from "../../config/api";
26 23
 import { mapState } from "vuex";
27
-import Echarts from "echarts";
28 24
 
25
+const {
26
+  mapState: mapIndexEchartsState,
27
+  mapActions: mapIndexEchartsActions
28
+} = createNamespacedHelpers("indexEcharts");
29 29
 export default {
30
-  components: {},
30
+  components: {
31
+    XLine: () => import('@/components/charts/XLine.vue'),
32
+  },
31 33
   data() {
32 34
     return {
33
-      value: '',
34
-       tableData2: [
35
+      value: "",
36
+      lineSeting: {
37
+        dataset: {
38
+          dimensions: ['date', 'userCount', 'authorizationCount'],
39
+          source: [],
40
+        },
41
+      },
42
+      tableData: [
43
+        { label: '新增用户', },
44
+        { label: '授权注册', }
45
+      ],
46
+      tableTitle: [ '类型' ],
47
+      tableData2: [
35 48
         {
36 49
           num: "98",
37 50
           name: "王晓红",
@@ -59,57 +72,44 @@ export default {
59 72
       ]
60 73
     };
61 74
   },
62
-  computed: {},
75
+  computed: {
76
+    ...mapIndexEchartsState({
77
+      newsUserCount: x => x.newsUserCount
78
+    })
79
+  },
63 80
   methods: {
64
-    drawLine() {
65
-      // 折线图
66
-      let thirdChart = Echarts.init(this.$refs.thirdChart);
67
-      // 绘制图表
68
-      thirdChart.setOption({
69
-        title: {
70
-          text: "新增用户"
71
-        },
72
-        color: ["purple", "green"],
73
-        tooltip: {
74
-          trigger: "axis"
75
-        },
76
-        legend: {
77
-          data: ["新用户数", "授权注册"]
78
-        },
79
-        grid: {
80
-          left: "3%",
81
-          right: "4%",
82
-          bottom: "3%",
83
-          containLabel: true
84
-        },
85
-        toolbox: {},
86
-        xAxis: {
87
-          type: "category",
88
-          boundaryGap: false,
89
-          data: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
90
-        },
91
-        yAxis: {
92
-          type: "value"
93
-        },
94
-        series: [
95
-          {
96
-            name: "新用户数",
97
-            type: "line",
98
-            stack: "1",
99
-            data: [120, 132, 101, 134, 90, 230, 210]
100
-          },
101
-          {
102
-            name: "授权注册",
103
-            type: "line",
104
-            stack: "2",
105
-            data: [220, 182, 191, 234, 290, 330, 310]
106
-          },
107
-        ]
81
+    ...mapIndexEchartsActions(["getNewsUserCount"]),
82
+    initPage() {
83
+      this.getNewsUserCount().then(x => {
84
+        const data = this.newsUserCount.selectNewsUserCount
85
+        this.lineSeting.dataset.source = data
86
+        this.tableData = (data || []).reduce((acc, item, index) => {
87
+          const { date, userCount, authorizationCount } = item
88
+
89
+          const row2 = {
90
+            ...acc[0],
91
+            [`${date}`]: userCount,
92
+          }
93
+
94
+          const row3 = {
95
+            ...acc[1],
96
+            [`${date}`]: authorizationCount,
97
+          }
98
+
99
+          this.tableTitle = this.tableTitle.concat(`${date}`)
100
+
101
+          return [row2, row3];          
102
+        }, this.tableData)
103
+
104
+
105
+        window.console.log(this.tableData, '-------')
108 106
       });
109
-    }
107
+    },
110 108
   },
111 109
   mounted() {
112
-    this.drawLine();
110
+    this.initPage();
111
+    // this.drawLine();
112
+  
113 113
   }
114 114
 };
115 115
 </script>

+ 179
- 0
src/views/systemManagement/report.vue Visa fil

@@ -0,0 +1,179 @@
1
+<template>
2
+  <div>
3
+  <el-checkbox-group 
4
+    v-model="checkedReport">
5
+    <el-checkbox v-for="report in reportList" :label="report.reportCode" :key="report.reportCode">{{report.reportName}}</el-checkbox>
6
+  </el-checkbox-group>
7
+  <el-row>
8
+      <el-button type="primary" @click="saveReport">保存</el-button>
9
+  </el-row>
10
+  </div>
11
+</template>
12
+
13
+<script>
14
+import { createNamespacedHelpers } from "vuex";
15
+import dayjs from 'dayjs'
16
+
17
+const { mapActions: mapReportActions } = createNamespacedHelpers("report");
18
+
19
+export default {
20
+  name: "report",
21
+  data() {
22
+    return {
23
+      checkedReport: [],
24
+      reportList: [],
25
+      pageNavi: {
26
+        current: 1,
27
+        size: 200,
28
+        total: 0
29
+      }
30
+    };
31
+  },
32
+  computed: {},
33
+  methods: {
34
+    ...mapReportActions(["getReportList", "getReportCheckedList", "saveCheckedReport"]),
35
+    getList() {
36
+      const pageNumber = this.pageNavi.current || 1;
37
+      const pageSize = this.pageNavi.size;
38
+
39
+      this.getReportList({
40
+        pageNumber,
41
+        pageSize
42
+      })
43
+        .then(res => {
44
+          const { records, ...pageNavi } = res;
45
+
46
+          this.reportList = records;
47
+          this.pageNavi = pageNavi;
48
+        })
49
+        .catch(err => {
50
+          this.$notify.error(err.msg || err.message);
51
+        });
52
+    },
53
+    getCheckedList() {
54
+      const pageNumber = this.pageNavi.current || 1;
55
+      const pageSize = this.pageNavi.size;
56
+      this.getReportCheckedList({
57
+        pageNumber,
58
+        pageSize
59
+      })
60
+        .then(res => {
61
+          const { records, ...pageNavi } = res;
62
+        
63
+          this.checkedReport = (records || []).map((x) => x.reportCode);
64
+          this.pageNavi = pageNavi;
65
+        })
66
+        .catch(err => {
67
+          this.$notify.error(err.msg || err.message);
68
+        });
69
+    },
70
+    saveReport() {
71
+      if(this.checkedReport.length < 1 ){
72
+        this.$notify.error("请选择在保存");
73
+        return
74
+      }
75
+      this.showLoadding("保存中...");
76
+      this.saveCheckedReport({
77
+        list: this.checkedReport
78
+      })
79
+        .then(res => {
80
+          this.hideLoadding();
81
+         this.$notify.info("保存成功");
82
+        })
83
+        .catch(err => {
84
+          this.hideLoadding();
85
+          this.$notify.error(err.msg || err.message);
86
+        });
87
+    },
88
+    toDetail(row) {
89
+      this.$router.push({
90
+        name: "goods.edit",
91
+        params: { id: row.goodsId }
92
+      });
93
+    },
94
+    changeStatus(row) {
95
+      this.showLoadding("保存中...");
96
+      this.changeGoodsStatus(row)
97
+        .then(res => {
98
+          this.hideLoadding();
99
+          this.$notify.info("保存成功");
100
+          this.search();
101
+        })
102
+        .catch(err => {
103
+          this.hideLoadding();
104
+          this.$notify.error(err.message);
105
+        });
106
+    },
107
+    showLoadding(text) {
108
+      this.loading = this.$loading({
109
+        text,
110
+        lock: true,
111
+        spinner: "el-icon-loading",
112
+        background: "rgba(255, 255, 255, 0.7)"
113
+      });
114
+    },
115
+    hideLoadding() {
116
+      if (this.loading) this.loading.close();
117
+    },
118
+    search() {
119
+      this.pageNavi.current = 1;
120
+      this.getList();
121
+    },
122
+    newPage(page) {
123
+      this.$router.replace({ name: "goods.list", query: { page } });
124
+    },
125
+    formateDate(dt) {
126
+      return !dt ? '' : dayjs(dt).format('YYYY-MM-DD HH:mm')
127
+    },
128
+  },
129
+  created() {
130
+    this.pageNavi.current = this.$route.query.page || 1;
131
+
132
+    this.getList();
133
+    this.getCheckedList();
134
+  }
135
+};
136
+</script>
137
+
138
+<style lang="scss" scoped>
139
+.list {
140
+  .header {
141
+    width: 50px;
142
+    height: 50px;
143
+    border-radius: 50%;
144
+  }
145
+  img {
146
+      width: 100%;
147
+      height: 100%;
148
+    }
149
+}
150
+.system-table-search {
151
+  width: calc(100% - 40px);
152
+  margin: 20px auto 0;
153
+}
154
+
155
+.system-table-search li {
156
+  margin-right: 20px;
157
+}
158
+
159
+.system-table-search ul {
160
+  font-size: 0;
161
+  white-space: nowrap;
162
+}
163
+
164
+.system-table-search ul > li {
165
+  display: inline-block;
166
+}
167
+
168
+.flex-h {
169
+  display: flex;
170
+  align-items: center;
171
+}
172
+
173
+.flex-item {
174
+  flex: 1;
175
+  -webkit-flex: 1;
176
+  position: relative;
177
+  overflow: hidden;
178
+}
179
+</style>