From 7cf85ad3023d84ac6f80cb535f629f37703bd5d6 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期二, 23 四月 2024 10:36:42 +0800
Subject: [PATCH] 添加数据统计
---
/dev/null | 9 -
src/views/Admin/dataStatistic.vue | 223 +++++++++++++++++++++++++++++++
src/components/Home/QuickNavigation.vue | 2
src/layout/menu/index.js | 6
src/components/Home/Team.vue | 97 +++++++++++--
src/views/Admin/msgRecord.vue | 2
src/router/index.js | 6
src/api/list.js | 17 ++
8 files changed, 327 insertions(+), 35 deletions(-)
diff --git a/src/api/list.js b/src/api/list.js
index 1b9fef7..b1d77e6 100644
--- a/src/api/list.js
+++ b/src/api/list.js
@@ -68,4 +68,21 @@
url: '/attachment/delete/' + id,
method: 'get'
})
+}
+
+// 获取30天总体用量
+export function getTotalStatistics(){
+ return request({
+ url: '/statistics/sms/countByTime',
+ method: 'get'
+ })
+}
+
+// 获取各地总体用量
+export function getTotalStatisticsByArea(data){
+ return request({
+ url: '/statistics/sms/count',
+ method: 'post',
+ data: data
+ })
}
\ No newline at end of file
diff --git a/src/components/Home/QuickNavigation.vue b/src/components/Home/QuickNavigation.vue
index e6505b4..203fd65 100644
--- a/src/components/Home/QuickNavigation.vue
+++ b/src/components/Home/QuickNavigation.vue
@@ -14,7 +14,7 @@
<a :class="toReview>0?'resColor':''" @click="toRev" v-if="userinfo.role.id == 2">待审核<span v-if="toReview > 0">({{toReview}})</span></a>
</a-tooltip>
<a href="massSend" v-if="userinfo.role.id == 3">发布通知</a>
- <a href="audit" >查看统计</a>
+ <a href="dataStatistic" >查看统计</a>
<a href="user" v-if="userinfo.role.id == 3">用户管理</a>
<!-- <a-button><a-icon type="plus" />添加</a-button> -->
</a-card>
diff --git a/src/components/Home/Team.vue b/src/components/Home/Team.vue
index 381357c..285d73b 100644
--- a/src/components/Home/Team.vue
+++ b/src/components/Home/Team.vue
@@ -1,17 +1,14 @@
<template>
<a-card title="各地区统计数据">
<div class="item" v-for="(item, index) in lists" :key="'team' + index">
- <a-tooltip overlayClassName="tip">
- <template #title>
- 数据统计模块待呈现
- </template>
- <a style="border: 1px solid #1890ff;padding: 5px 8px;border-radius: 5px;">{{ item.title }}</a>
- </a-tooltip>
+ <a style="border: 1px solid #1890ff;padding: 5px 8px;border-radius: 5px;" @click="toDetails(item.name)">{{ item.title }}</a>
</div>
</a-card>
</template>
<script>
+import dataStatistic from "@/views/Admin/dataStatistic";
+
export default {
name: 'Team',
data () {
@@ -19,35 +16,99 @@
lists: [
{
title: '全疆汇总',
- url:''
+ name: '新疆维吾尔自治区',
+ url:''
},
{
title: '乌鲁木齐市',
- url:''
+ name: '乌鲁木齐市',
+ url:''
+ },
+ {
+ title: '克拉玛依市',
+ name: '克拉玛依市',
+ url:''
},
{
title: '吐鲁番市',
- url:''
+ name: '吐鲁番市',
+ url:''
},
{
- title: '昌吉市',
- url:''
+ title: '哈密市',
+ name: '哈密市',
+ url:''
+ },
+ {
+ title: '昌吉回族自治州',
+ name: '昌吉回族自治州',
+ url:''
+ },
+ {
+ title: '博尔塔拉蒙古自治州',
+ name: '博尔塔拉蒙古自治州',
+ url:''
},
{
title: '巴音郭楞蒙古自治州',
- url:''
- },
- {
- title: '伊犁哈萨克自治州',
- url:''
+ name: '巴音郭楞蒙古自治州',
+ url:''
},
{
title: '阿克苏地区',
- url:''
+ name: '阿克苏地区',
+ url:''
},
+ {
+ title: '克孜勒苏柯尔克孜自治州',
+ name: '克孜勒苏柯尔克孜自治州',
+ url:''
+ },
+ {
+ title: '喀什地区',
+ name: '喀什地区',
+ url:''
+ },
+ {
+ title: '和田地区',
+ name: '和田地区',
+ url:''
+ },
+ {
+ title: '伊犁哈萨克自治州',
+ name: '伊犁哈萨克自治州',
+ url:''
+ },
+ {
+ title: '塔城地区',
+ name: '塔城地区',
+ url:''
+ },
+ {
+ title: '阿勒泰地区',
+ name: '阿勒泰地区',
+ url:''
+ },
+ {
+ title: '自治区直辖县级行政区划',
+ name: '自治区直辖县级行政区划',
+ url:''
+ }
]
}
- }
+ },
+ methods: {
+ toDetails(name){
+ this.$router.push(
+ {
+ name: 'dataStatistic',
+ query: {
+ name: name
+ }
+ }
+ )
+ }
+ },
}
</script>
diff --git a/src/layout/menu/index.js b/src/layout/menu/index.js
index c440bd8..3ee28c2 100644
--- a/src/layout/menu/index.js
+++ b/src/layout/menu/index.js
@@ -26,7 +26,7 @@
{
MenuID: "13",
MenuTitle: "数据统计",
- MenuPath: "/audit"
+ MenuPath: "/dataStatistic"
}
],
},
@@ -142,7 +142,7 @@
{
MenuID: "13",
MenuTitle: "数据统计",
- MenuPath: "/audit"
+ MenuPath: "/dataStatistic"
}
],
},
@@ -186,7 +186,7 @@
{
MenuID: "13",
MenuTitle: "数据统计",
- MenuPath: "/audit"
+ MenuPath: "/dataStatistic"
}
],
},
diff --git a/src/router/index.js b/src/router/index.js
index 550d46b..8c9b385 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -41,10 +41,10 @@
component: () => import('@/views/Admin/list'),
},
{
- path: '/audit',
- name: 'audit',
+ path: '/dataStatistic',
+ name: 'dataStatistic',
meta: { title: '数据统计' },
- component: () => import('@/views/Admin/Audit'),
+ component: () => import('@/views/Admin/dataStatistic'),
},
{
path: '/notice',
diff --git a/src/views/Admin/Audit.vue b/src/views/Admin/Audit.vue
deleted file mode 100644
index 3777a7e..0000000
--- a/src/views/Admin/Audit.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
- <div>数据统计模块待呈现</div>
-</template>
-
-<script>
-</script>
-
-<style>
-</style>
\ No newline at end of file
diff --git a/src/views/Admin/dataStatistic.vue b/src/views/Admin/dataStatistic.vue
new file mode 100644
index 0000000..3a3010d
--- /dev/null
+++ b/src/views/Admin/dataStatistic.vue
@@ -0,0 +1,223 @@
+<template>
+ <div class="inner">
+ <div id="charts" style="width: 100%;height: 400px"></div>
+ <a-row type="flex" justify="space-between" style="margin-bottom: 20px">
+ <a-col :span="20">
+ <a-row type="flex" :gutter="18">
+ <a-col :span="8">
+ <a-range-picker
+ v-model="timeRange"
+ format="YYYY-MM-DD"
+ :placeholder="['开始时间', '结束时间']"
+ @change="timeChange"
+ @ok="timeOk"
+ style="width: 100%"
+ />
+ </a-col>
+ <a-col :span="6">
+ <a-button type="primary" @click="searchData">查询</a-button>
+ <a-button style="margin-left: 12px" @click="resetSearch">重置</a-button>
+ </a-col>
+ </a-row>
+ </a-col>
+ </a-row>
+
+ <!-- 表格实体部分-->
+ <div class="table-cont">
+ <a-button type="primary" v-if="backButton" @click="backData" :loading="backLoading" style="margin-bottom: 20px">返回上级</a-button>
+ <a-table :columns="columns" :data-source="data" bordered :pagination="false" :rowKey="record=>record.name">
+ <template #index="text,record,index">
+ {{ index + 1 }}
+ </template>
+ <template #name="text,record">
+ <a-button type="link" v-if="record.chidren" @click="openSubData(record)">{{ text }}</a-button>
+ <span v-else>{{ text }}</span>
+ </template>
+ </a-table>
+ </div>
+ </div>
+</template>
+<script>
+import {getTotalStatistics, getTotalStatisticsByArea} from "@/api/list";
+import {getReviewDetailByWorker} from "@/api/review";
+import axios from "axios";
+import Cookies from "js-cookie";
+import {getUserInfo} from "@/util/storage";
+import * as echarts from 'echarts';
+const columns = [{
+ title: '序号',
+ dataIndex: 'index',
+ scopedSlots: {
+ customRender: 'index'
+ }
+},
+ {
+ title: '地区',
+ dataIndex: 'name',
+ scopedSlots: {
+ customRender: 'name'
+ }
+ },
+ {
+ title: '本级任务数',
+ dataIndex: 'curentTaskCount'
+ },
+ {
+ title: '短信计费条数',
+ dataIndex: 'currentSmsCount'
+ },
+ {
+ title: '下级总任务数',
+ dataIndex: 'subordinateTaskCount'
+ },
+ {
+ title: '下级短信计费条数',
+ dataIndex: 'subordinateSmsCount'
+ },
+ {
+ title: '合计条数',
+ dataIndex: 'smsTotalCount'
+ }
+];
+export default {
+ name: 'dataStatistic',
+ components: {},
+ data() {
+ return {
+ search:{
+ startTime: '',
+ endTime: ''
+ },
+ timeRange: [],
+ category: 'default',
+ data:[],
+ columns,
+ backButton: false,
+ backLoading: false,
+ areaName: null
+ }
+ },
+ mounted() {
+ if(getUserInfo().role.id == 1){
+ this.columns = this.columns.filter(i=>i.dataIndex !== 'operation')
+ }
+ this.getChartsData()
+ },
+ created() {
+ const t = this
+ if(t.$route.query.name){
+ t.areaName = t.$route.query.name
+ t.$router.push(t.$route.path)
+ }
+ t.getData()
+ },
+ methods: {
+ async getData(){
+ const t = this
+ t.backLoading = true
+ const res = await getTotalStatisticsByArea(t.search)
+ if(res.data.code == 100){
+ if(t.areaName && t.areaName !== '新疆维吾尔自治区'){
+ t.data = res.data.data.find(i=>i.name == t.areaName).chidren
+ t.backButton = true
+ t.areaName = null
+ }else{
+ t.data = res.data.data
+ t.backButton = false
+ }
+ t.backLoading = false
+ }else{
+ this.$message.error(res.data.msg)
+ }
+ },
+
+ async getChartsData(){
+ const t = this
+ const res = await getTotalStatistics()
+ if(res.data.code == 100){
+ const data = res.data.data
+ await t.initChart(data)
+ }else{
+ this.$message.error(res.data.msg)
+ }
+ },
+
+ async initChart(data){
+ var chartDom = document.getElementById('charts');
+ var myChart = echarts.init(chartDom);
+ var option;
+ option = {
+ title: {
+ text: '近30日用量趋势'
+ },
+ tooltip: {
+ trigger: 'axis',
+ formatter: function (params){
+ return '日期:' + params[0].name + '<br/>' + '用量:' + params[0].value + '条'
+ }
+ },
+ xAxis: {
+ type: 'category',
+ data: data.map(i=>i.time)
+ },
+ yAxis: {
+ type: 'value'
+ },
+ series: [
+ {
+ data: data.map(i=>i.smsCount),
+ type: 'line'
+ }
+ ],
+ grid: [
+ {
+ left: '5%',
+ right: '5%',
+ top: '20%'
+ }
+ ],
+ color: ['#91cc75']
+ };
+
+ option && myChart.setOption(option);
+ },
+
+ async openSubData(record){
+ this.data = record.chidren
+ this.backButton = true
+ },
+
+ async backData(){
+ await this.getData()
+ this.backButton = false
+ },
+
+ timeChange(value, dateString) {
+ const t = this
+ if(dateString){
+ t.search.startTime = value[0].format('YYYY-MM-DD')
+ t.search.endTime = value[1].format('YYYY-MM-DD')
+ }
+ },
+
+ timeOk(value) {
+ console.log('onOk: ', value);
+ },
+
+ searchData(){
+ this.getData()
+ },
+
+ resetSearch(){
+ const t = this
+ t.search = {
+ startTime: '',
+ endTime: ''
+ }
+ t.timeRange = []
+ t.getData()
+ }
+ }
+}
+
+</script>
\ No newline at end of file
diff --git a/src/views/Admin/msgRecord.vue b/src/views/Admin/msgRecord.vue
index ac55650..ba945fb 100644
--- a/src/views/Admin/msgRecord.vue
+++ b/src/views/Admin/msgRecord.vue
@@ -27,7 +27,7 @@
<div class="tit">
任务ID:<span>{{item.id}}</span>
</div>
- 发送人数:{{item.recipients.length}}
+ 发送人数:{{item.recipients.length}}
</template>
<p>
{{item.content}}
--
Gitblit v1.9.2