|
|
@@ -1,3 +1,255 @@
|
|
|
<template>
|
|
|
- <div>数据看板</div>
|
|
|
-</template>
|
|
|
+ <div class="hc-datav-main hc-full">
|
|
|
+ <img class="hc-datav-bg" :src="bgPng" alt="bg">
|
|
|
+ <div id="hc-datav-header-body" class="relative">
|
|
|
+ <div class="hc-datav-header">
|
|
|
+ <img id="datav-header-bg" :src="png2" alt="头部图">
|
|
|
+ <div class="header-title hc-flex-center w-full">
|
|
|
+ <div ref="nameRef" class="name hc-flex" @click="toHomePage">
|
|
|
+ <i class="i-solar-graph-outline" />
|
|
|
+ 高速公路投资效益分析看板
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="hc-datav-total relative p-[14px]">
|
|
|
+ <el-row :gutter="24">
|
|
|
+ <el-col :span="12">
|
|
|
+ <HcDatavCard title="项目数" :num="0" unit="" color="#D5DEFF" />
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <HcDatavCard title="运营单位" :num="0" unit="" color="#EEB500" />
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+ <div class="hc-datav-statics-1 relative p-[14px]">
|
|
|
+ <el-row :gutter="24">
|
|
|
+ <el-col :span="8">
|
|
|
+ <div class="bg-box-card">
|
|
|
+ <div class="bg-box-card-title">
|
|
|
+ <i class="ri-share-line" /> <span>项目统计</span>
|
|
|
+ </div>
|
|
|
+ <div class="hc-full relative">
|
|
|
+ <ArrRoundChart
|
|
|
+ ref="fixedChartRef"
|
|
|
+ :datas="{
|
|
|
+ type1: 33,
|
|
|
+ type2: 120,
|
|
|
+ type3: 200,
|
|
|
+ }"
|
|
|
+ :config="{
|
|
|
+ color: ['#4B91FF', '#36CBCB', '#32C67C'],
|
|
|
+ name: ['四环线', '二十环线', '六十环线'],
|
|
|
+ key: ['type1', 'type2', 'type3'],
|
|
|
+ label: '项目统计',
|
|
|
+ }"
|
|
|
+ @chart-click="handleChartClick"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <div class="bg-box-card">
|
|
|
+ <div class="bg-box-card-title">
|
|
|
+ <i class="ri-numbers-line" style="color:rgb(62, 177, 165)" /> <span>运营统计</span>
|
|
|
+ </div>
|
|
|
+ <div class="hc-full relative">
|
|
|
+ <HcDatavBarChart
|
|
|
+ :datas="[
|
|
|
+ { name: '渝东公司', value: 100 },
|
|
|
+ { name: '南方公司', value: 150 },
|
|
|
+ { name: '北方公司', value: 200 },
|
|
|
+ { name: '中交一公司', value: 250 },
|
|
|
+ { name: '渝东公司', value: 100 },
|
|
|
+ { name: '南方公司', value: 150 },
|
|
|
+ { name: '北方公司', value: 200 },
|
|
|
+ { name: '中交一公司', value: 250 },
|
|
|
+ ]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="8">
|
|
|
+ <div class="bg-box-card">
|
|
|
+ <div class="bg-box-card-title flex justify-between">
|
|
|
+ <div> <i class="ri-line-chart-line" style="color:#18DD32" /> <span>收益统计</span></div>
|
|
|
+ <div ref="searchRef">
|
|
|
+ <HcDatavSelect v-model="searchForm.year" :datas="yearArr" :clearable="false" @change="searchChange" />
|
|
|
+ <HcDatavSelect v-model="searchForm.projectType" :datas="typeArr" placeholder="项目类型" @change="searchChange" />
|
|
|
+ <HcDatavSelect v-model="searchForm.projectType" :datas="typeArr2" placeholder="前五名" @change="searchChange" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="hc-full relative">
|
|
|
+ <HcDatavVerticalBarChart
|
|
|
+ :datas="[
|
|
|
+ { name: '1号高速公路', value: 100 },
|
|
|
+ { name: '2号高速公路', value: 50 },
|
|
|
+ { name: '3号高速公路', value: 200 },
|
|
|
+ { name: '4号高速公路', value: 120 },
|
|
|
+ { name: '5号高速公路', value: 150 },
|
|
|
+ ]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+ <div class="hc-datav-statics-2 relative p-[14px]">
|
|
|
+ <el-row :gutter="24">
|
|
|
+ <el-col :span="24">
|
|
|
+ <div class="bg-box-card-1">
|
|
|
+ <div class="bg-box-card-title flex justify-between">
|
|
|
+ <div> <i class="ri-taxi-wifi-line" style="color:#B3206F" /> <span>车流量统计</span></div>
|
|
|
+ <div ref="searchRef">
|
|
|
+ <HcDatavSelect v-model="searchForm.year" :datas="yearArr" :clearable="false" @change="searchChange" />
|
|
|
+ <HcDatavSelect v-model="searchForm.projectType" :datas="typeArr" placeholder="项目类型" @change="searchChange" />
|
|
|
+ <HcDatavSelect v-model="searchForm.projectType" :datas="typeArr2" placeholder="前五名" @change="searchChange" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="hc-full relative">
|
|
|
+ <HcDatavLineChart
|
|
|
+ :datas="[
|
|
|
+ { name: '1月', value: 100 },
|
|
|
+ { name: '2月', value: 150 },
|
|
|
+ { name: '3月', value: 220 },
|
|
|
+ { name: '4月', value: 100 },
|
|
|
+ { name: '5月', value: 140 },
|
|
|
+ { name: '6月', value: 180 },
|
|
|
+ { name: '7月', value: 160 },
|
|
|
+ { name: '8月', value: 100 },
|
|
|
+ { name: '9月', value: 200 },
|
|
|
+ { name: '10月', value: 220 },
|
|
|
+ { name: '11月', value: 180 },
|
|
|
+ { name: '12月', value: 140 },
|
|
|
+ ]"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { onMounted, onUnmounted, ref } from 'vue'
|
|
|
+import { useRouter } from 'vue-router'
|
|
|
+import { useAppStore } from '~src/store'
|
|
|
+import { getStore, setStore } from 'hc-vue3-ui'
|
|
|
+import bgPng from '~src/assets/view/beijing.png'
|
|
|
+import png2 from '~src/assets/view/top.png'
|
|
|
+import HcDatavSelect from './modules/select.vue'
|
|
|
+import HcDatavCard from './modules/card.vue'
|
|
|
+import HcDatavBarChart from './modules/echarts/HcDatavBarChart.vue'
|
|
|
+import HcDatavVerticalBarChart from './modules/echarts/HcDatavVerticalBarChart.vue'
|
|
|
+import HcDatavLineChart from './modules/echarts/HcDatavLineChart.vue'
|
|
|
+import ArrRoundChart from './modules/echarts/HcDatavRoundChart.vue'
|
|
|
+import { getArrValue, getObjValue, isNullES } from 'js-fast-way'
|
|
|
+import { getDictionaryData } from '~src/utils/tools'
|
|
|
+import projectApi from '~api/datav/projectdata'
|
|
|
+import dayjs from 'dayjs'
|
|
|
+
|
|
|
+const router = useRouter()
|
|
|
+const store = useAppStore()
|
|
|
+
|
|
|
+//引导
|
|
|
+const nameRef = ref(null)
|
|
|
+
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+
|
|
|
+
|
|
|
+})
|
|
|
+const yearArr = ref( [{ id: '2024年', name: '2024年' }, { id: '2025年', name: '2025年' }, { id: '2026年', name: '2026年' }])
|
|
|
+const typeArr = ref([])
|
|
|
+const typeArr2 = ref( [{ id: '前五名', name: '前五名' }, { id: '前十名', name: '前十名' }, { id: '前十名', name: '前十名' }])
|
|
|
+const fixedChartRef = ref(null)
|
|
|
+
|
|
|
+//搜索表单
|
|
|
+const pageType = ref('1')
|
|
|
+const searchRef = ref(null)
|
|
|
+const searchForm = ref({
|
|
|
+ year: new dayjs().year(), month: null, projectScheduleGrade: '-1', projectStage: null, projectType: null, projectScheduleType: null,
|
|
|
+ quarter: '1',
|
|
|
+})
|
|
|
+const searchChange = () => {
|
|
|
+ console.log(111111111)
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+//跳转到首页
|
|
|
+const toHomePage = () => {
|
|
|
+ console.log(store.page)
|
|
|
+ router.push( { name: 'project-data' })
|
|
|
+}
|
|
|
+
|
|
|
+//监听浏览器窗口变化
|
|
|
+const windowResize = () => {
|
|
|
+ window.addEventListener('resize', resizeEvent)
|
|
|
+}
|
|
|
+const resizeEvent = () => {
|
|
|
+ window.requestAnimationFrame(() => {
|
|
|
+ onWindowResize()
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+//设置尺寸
|
|
|
+const onWindowResize = () => {
|
|
|
+ const height = document.getElementById('hc-datav-header-body').offsetHeight
|
|
|
+ document.getElementById('hc-datav-row-total-body').style.height = `calc(100% - ${height + 10}px)`
|
|
|
+}
|
|
|
+
|
|
|
+//被卸载
|
|
|
+onUnmounted(() => {
|
|
|
+ window.removeEventListener('resize', resizeEvent)
|
|
|
+})
|
|
|
+// 在 script setup 中添加处理函数
|
|
|
+const handleChartClick = (data) => {
|
|
|
+ console.log('点击了扇形:', data)
|
|
|
+ router.push( { name: 'project-data' })
|
|
|
+ // 这里可以添加您的业务逻辑
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+@import '~src/styles/view/datav';
|
|
|
+.bg-box-card{
|
|
|
+ background-color: rgba(0, 43, 84, 0.8);
|
|
|
+ border: 1px solid rgba(15, 84, 155, 0.8);
|
|
|
+ border-radius: 4px;
|
|
|
+ height: calc(34vh); // 修改固定高度为动态高度
|
|
|
+ padding: 14px;
|
|
|
+}
|
|
|
+
|
|
|
+.bg-box-card-1{
|
|
|
+ background-color: rgba(0, 43, 84, 0.8);
|
|
|
+ border: 1px solid rgba(15, 84, 155, 0.8);
|
|
|
+ border-radius: 4px;
|
|
|
+ height: calc(33vh - 17px); // 修改固定高度为动态高度
|
|
|
+ padding: 14px;
|
|
|
+}
|
|
|
+.bg-box-card-title{
|
|
|
+ height: 25px;
|
|
|
+ color:#5087EC;
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: 700;
|
|
|
+ z-index: 999;
|
|
|
+ margin-bottom: 15px;
|
|
|
+
|
|
|
+}
|
|
|
+.hc-full {
|
|
|
+ height: calc(100% - 40px); // 减去标题和padding的高度
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+</style>
|