CaiYuanYiTiHua/src/views/map/dataScreen/index.vue

708 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div style="width: 100%; height: 100%">
<div class="map" @click="mapClick"></div>
<div class="data-screen">
<div class="basic-data">
<div class="title">基本数据</div>
<div class="show-quantity-div">
<div class="number-1 show-span-div">
<div class="show-quantity">
<div class="sub-title">企业总数</div>
<div class="show-number">3157</div>
</div>
</div>
<div class="number-2 show-span-div">
<div class="show-quantity">
<div class="sub-title">测算土地面积</div>
<div class="show-number">6360<span class="suffix"></span></div>
</div>
</div>
<div class="number-3 show-span-div">
<div class="show-quantity">
<div class="sub-title">测算房产面积</div>
<div class="show-number">3157<span class="suffix"></span></div>
</div>
</div>
</div>
</div>
<div class="enterprise-area">
<div class="title">企业占地面积分乡镇情况</div>
<div class="enterprise-area-bar"></div>
</div>
<div class="enterprise-income">
<div class="title">企业收入分镇情况</div>
<div class="enterprise-income-bar"></div>
</div>
<div class="area-pie-div">
<div class="title">企业占地面积土地房产</div>
<div class="area-pie">
<div class="land-area">
<div class="pie-title">土地面积占比</div>
<div class="land-area-pie"></div>
</div>
<div class="real-estate-area">
<div class="pie-title">房产面积占比</div>
<div class="real-estate-area-pie"></div>
</div>
</div>
</div>
<div class="pack-up"></div>
</div>
<div class="search-div">
<a-input-search
class="search-input"
v-model:value="value"
placeholder="请输入企业名称/法人/地址搜索"
size="large"
@search="onSearch"
>
<template #enterButton>
<a-button class="search-button" type="primary" :icon="h(SearchOutlined)">搜索</a-button>
</template>
</a-input-search>
<div class="show-search-list">
<div class="show-search-title"></div>
<div class="show-search-content">
<div class="show-search-item" v-for="(item, index) in searchList" :key="index">
<div style="width: 100%; color: #d3f1ff">
<div style="display: flex; justify-content: space-between; margin-bottom: 8px">
<div class="item-name">{{ item.name }}</div>
<div class="item-person-name">{{ item.personName }}</div>
</div>
<div class="item-address"
><img :src="'dataScreen/address.svg'" style="margin-right: 10px" />{{
item.address
}}</div
>
</div>
</div>
</div>
</div>
</div>
<div class="show-enterprise-info" :style="`top:${infoPosition.top};left:${infoPosition.left}`">
<div class="title-div">
<div class="title-span">隆兴板材厂A</div>
<div class="title-close-button"><img :src="'dataScreen/info-close.svg'" /></div>
</div>
<div v-for="(item, index) in enterpriseInfo" :key="index" class="show-info-item">
<div class="first-span">{{ item.title }}</div>
<div class="last-span">{{ showEnterpriseInfoData[item.key] }}</div>
</div>
<div class="show-image">图片</div>
</div>
</div>
</template>
<script setup lang="ts">
import * as echarts from 'echarts';
import { onMounted, ref, h, onBeforeUnmount } from 'vue';
import { SearchOutlined } from '@ant-design/icons-vue';
import { enterpriseInfo } from './util';
const mapClick = (event) => {
let left = 0;
let top = 0;
// console.log(event.x,event.offsetX,event.offsetX + 265,window.innerWidth)
if (event.x + 265 > window.innerWidth) {
left = event.offsetX - (event.x + 265 - window.innerWidth);
} else {
left = event.offsetX;
}
if (event.y + 322 > window.innerHeight) {
top = event.offsetY - (event.y + 322 - window.innerHeight);
} else {
top = event.offsetY;
}
infoPosition.value = {
left: left + 'px',
top: top + 'px',
};
};
const infoPosition = ref({
left: '50%',
top: '50%',
});
let enterpriseAreaBarChartOption = {
xAxis: {
type: 'category',
data: [
'上冶镇',
'薛庄镇',
'探沂镇',
'朱田镇',
'梁邱镇',
'新庄镇',
'马庄镇',
'胡阳镇',
'石井镇',
'东蒙镇',
],
axisTick: {
show: false,
},
axisLabel: {
show: true,
interval: 0,
color: '#D0DEEE',
},
},
yAxis: [
{
type: 'value',
show: false,
},
],
series: [
{
name: '土地面积',
type: 'bar',
showBackground: true,
barGap: '0%',
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.1)',
},
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: 'rgba(102, 225, 223, 1)',
},
{
offset: 0.5,
color: 'rgba(102, 225, 223, 0.5)',
},
{
offset: 1,
color: 'rgba(102, 225, 223, 0)',
},
],
},
},
data: [18203, 23489, 29034, 104970, 131744, 630230, 104860, 29034, 104970, 131744],
},
{
name: '房产面积',
type: 'bar',
showBackground: true,
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.1)',
},
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: 'rgba(255, 183, 66, 1)',
},
{
offset: 0.5,
color: 'rgba(255, 183, 66, 0.5)',
},
{
offset: 1,
color: 'rgba(255, 183, 66, 0)',
},
],
},
},
data: [19325, 23438, 31000, 121594, 134141, 681807, 9034, 104970, 131744, 630230],
},
],
grid: {
top: '20%',
left: '0%',
right: '0%',
bottom: '17%',
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
},
},
legend: {
top: '5%',
right: '5%',
textStyle: {
color: '#D0DEEE',
fontSize: 12,
},
},
};
let enterpriseIncomeBarChartOption = {
xAxis: {
type: 'category',
data: [
'上冶镇',
'薛庄镇',
'探沂镇',
'朱田镇',
'梁邱镇',
'新庄镇',
'马庄镇',
'胡阳镇',
'石井镇',
'东蒙镇',
],
axisTick: {
show: false,
},
axisLabel: {
show: true,
interval: 0,
color: '#D0DEEE',
},
},
yAxis: [
{
type: 'value',
show: false,
},
],
series: [
{
name: '测算收入',
type: 'bar',
showBackground: true,
barGap: '0%',
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.1)',
},
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: 'rgba(52, 220, 254, 1)',
},
{
offset: 0.5,
color: 'rgba(52, 220, 254, 0.5)',
},
{
offset: 1,
color: 'rgba(52, 220, 254, 0)',
},
],
},
borderRadius: [8, 8, 0, 0],
},
data: [18203, 23489, 29034, 104970, 131744, 630230, 104860, 29034, 104970, 131744],
},
{
name: '实缴收入',
type: 'bar',
showBackground: true,
backgroundStyle: {
color: 'rgba(180, 180, 180, 0.1)',
},
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: 'rgba(84, 107, 255, 1)',
},
{
offset: 0.5,
color: 'rgba(84, 107, 255, 0.5)',
},
{
offset: 1,
color: 'rgba(84, 107, 255, 0)',
},
],
},
borderRadius: [8, 8, 0, 0],
},
data: [19325, 23438, 31000, 121594, 134141, 681807, 9034, 104970, 131744, 630230],
},
],
grid: {
top: '20%',
left: '0%',
right: '0%',
bottom: '17%',
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
},
},
legend: {
top: '5%',
right: '5%',
textStyle: {
color: '#D0DEEE',
fontSize: 12,
},
},
};
let landAreaPieChartOption = {
legend: {
orient: 'vertical',
right: 'right',
data: ['≥40亩', '30-40亩', '20-30亩', '10-20亩', '0-10亩'],
textStyle: {
color: '#fff',
fontSize: 10,
},
itemWidth: 6,
itemHeight: 6,
},
series: [
{
right: '30%',
type: 'pie',
radius: ['30%', '85%'],
label: {
show: true,
position: 'inner',
color: '#fff',
},
data: [
{ value: 1048, name: '≥40亩', itemStyle: { color: '#12CEFF' } },
{ value: 735, name: '30-40亩', itemStyle: { color: '#FFBD00' } },
{ value: 580, name: '20-30亩', itemStyle: { color: '#1257FF' } },
{ value: 484, name: '10-20亩', itemStyle: { color: '#73D85A' } },
{ value: 300, name: '0-10亩', itemStyle: { color: '#161BF6' } },
],
},
],
};
let realEstateAreaPieChartOption = {
legend: {
orient: 'vertical',
right: 'right',
data: ['≥100㎡', '80-100㎡', '50-80㎡', '20-50㎡', '0-20㎡'],
textStyle: {
color: '#fff',
fontSize: 10,
},
itemWidth: 6,
itemHeight: 6,
},
series: [
{
right: '30%',
type: 'pie',
radius: ['30%', '85%'],
label: {
show: true,
position: 'inner',
color: '#fff',
},
data: [
{ value: 1048, name: '≥100㎡', itemStyle: { color: '#04C7FF' } },
{ value: 735, name: '80-100㎡', itemStyle: { color: '#FF12CE' } },
{ value: 580, name: '50-80㎡', itemStyle: { color: '#FF6700' } },
{ value: 484, name: '20-50㎡', itemStyle: { color: '#161BF6' } },
{ value: 300, name: '0-20㎡', itemStyle: { color: '#5202FF' } },
],
},
],
};
let enterpriseAreaBarChart = {};
let enterpriseIncomeBarChart = {};
let landAreaPieChart = {};
let realEstateAreaPieChart = {};
onMounted(() => {
let enterpriseAreaBarDom = document.getElementsByClassName('enterprise-area-bar')[0];
let enterpriseIncomeBarDom = document.getElementsByClassName('enterprise-income-bar')[0];
let landAreaPieDom = document.getElementsByClassName('land-area-pie')[0];
let realEstateAreaPieDom = document.getElementsByClassName('real-estate-area-pie')[0];
enterpriseAreaBarChart = echarts.init(enterpriseAreaBarDom);
enterpriseIncomeBarChart = echarts.init(enterpriseIncomeBarDom);
landAreaPieChart = echarts.init(landAreaPieDom);
realEstateAreaPieChart = echarts.init(realEstateAreaPieDom);
enterpriseAreaBarChart.setOption(enterpriseAreaBarChartOption);
enterpriseIncomeBarChart.setOption(enterpriseIncomeBarChartOption);
landAreaPieChart.setOption(landAreaPieChartOption);
realEstateAreaPieChart.setOption(realEstateAreaPieChartOption);
});
onBeforeUnmount(() => {
// 及时销毁
enterpriseAreaBarChart.dispose();
enterpriseIncomeBarChart.dispose();
landAreaPieChart.dispose();
realEstateAreaPieChart.dispose();
console.log('onBeforeUnmount>>>');
});
const value = ref('');
const showEnterpriseInfoData = ref({
legalPerson: '刘明',
phone: '15056888888',
realEstateArea: '500m²',
landArea: '1500m²',
type: '板材加工',
address: '和平路与文山路交汇处200米以北',
surveySheet: '测绘表 (企业确认文件)',
});
const searchList = ref([
{ name: '隆兴板材厂A', personName: '刘明', address: '临沂市费县探沂镇209国道石行村' },
{ name: '隆兴板材厂B', personName: '刘明', address: '临沂市费县探沂镇209国道石行村' },
{ name: '隆兴板材厂C', personName: '刘明', address: '临沂市费县探沂镇209国道石行村' },
]);
</script>
<style lang="scss" scoped>
.map {
width: 100%;
height: 100%;
background-color: #4e7243;
}
.data-screen {
height: 100%;
width: 466px;
background-color: rgba(0, 0, 0, 0.6);
position: absolute;
left: 0;
top: 0;
padding-top: 25px;
padding-left: 19px;
padding-right: 29px;
.title {
width: 100%;
height: 44px;
background: url(/dataScreen/title.png) no-repeat;
font-size: 18px;
color: #fff;
display: flex;
align-items: center;
padding-left: 32px;
}
.show-quantity-div {
padding-top: 16px;
padding-bottom: 16px;
display: flex;
justify-content: space-between;
.show-span-div {
display: flex;
align-items: center;
padding-left: 50px;
.sub-title {
font-size: 10px;
color: #fff;
}
.show-number {
font-size: 18px;
font-weight: normal;
color: #17b0cc;
.suffix {
font-size: 12px;
}
}
}
.number-1 {
width: 129px;
height: 55px;
background: url(/dataScreen/number1.png) no-repeat;
}
.number-2 {
width: 129px;
height: 55px;
background: url(/dataScreen/number2.png) no-repeat;
}
.number-3 {
width: 129px;
height: 55px;
background: url(/dataScreen/number3.png) no-repeat;
}
}
.enterprise-area {
.enterprise-area-bar {
width: 100%;
height: 193px;
}
}
.enterprise-income {
.enterprise-income-bar {
width: 100%;
height: 193px;
}
}
.area-pie-div {
.area-pie {
display: flex;
margin-top: 7px;
.land-area {
flex: 1;
.land-area-pie {
height: 165px;
}
}
.real-estate-area {
flex: 1;
.real-estate-area-pie {
height: 165px;
}
}
}
.pie-title {
width: 108px;
height: 27px;
background: url(/dataScreen/pie-title.png) no-repeat;
font-size: 14px;
color: #fff;
display: flex;
justify-content: center;
align-items: center;
}
}
.pack-up {
width: 34px;
height: 130px;
background: url(/dataScreen/pack-up.png) no-repeat;
cursor: pointer;
position: absolute;
top: 50%;
right: 0;
transform: translate(100%, -50%);
}
}
.search-div {
width: 370px;
height: 47px;
position: absolute;
top: 30px;
left: calc(466px + 50px);
.show-search-list {
position: absolute;
top: 47px;
width: 100%;
height: 280px;
background: #032567;
.show-search-title {
width: 100%;
height: 5px;
background: #0542b7;
}
.show-search-content {
width: 100%;
height: 275px;
overflow: auto;
padding-left: 16px;
padding-right: 16px;
.show-search-item {
width: 100%;
height: 64px;
border-bottom: 1px dashed #90a1b0;
display: flex;
align-items: center;
.item-name {
font-size: 16px;
}
.item-person-name {
font-size: 14px;
}
.item-address {
font-size: 12px;
opacity: 0.56;
}
}
}
}
}
.show-enterprise-info {
position: absolute;
// top: 50%;
// left: 50%;
// transform: translate(-50%, -50%);
width: 265px;
min-height: 307px;
background: url(/dataScreen/show-enterprise-info.png) no-repeat;
background-size: 100% 100%;
padding: 13px 20px 20px 16px;
.title-div {
display: flex;
justify-content: space-between;
margin-bottom: 22px;
.title-span {
font-size: 16px;
color: #fff;
}
}
.show-info-item {
display: flex;
font-size: 12px;
height: 25px;
align-items: center;
.first-span {
color: #a6e4f7;
margin-right: 12px;
}
.first-span::before {
content: '';
width: 3px;
height: 3px;
border-radius: 50%;
background: #fff;
display: inline-block;
margin-left: 2px;
margin-right: 7px;
}
.last-span {
color: #fff;
}
}
.show-info-item:nth-last-child(2) {
margin-bottom: 5px;
}
.show-image {
width: 119px;
height: 69px;
background: #2473d5;
margin-left: 10px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
opacity: 0.2;
}
}
</style>
<style lang="scss">
.search-div {
.search-input {
input::placeholder {
color: rgba(255, 255, 255, 0.63);
}
input {
background-color: #121c2d;
border: 1px solid #103a84;
color: rgba(255, 255, 255, 0.63);
border-radius: 20px;
}
button.css-dev-only-do-not-override-n9spb6.ant-btn.ant-btn-primary.ant-btn-lg.search-button.ant-input-search-button {
border-top-right-radius: 20px;
border-bottom-right-radius: 20px;
background: #0a44ad;
}
}
}
</style>