Files
dvcp_v2_webapp/packages/bigscreen/dv/AppMonitorMapDv.vue
yanran200730 7d3169b077 bug
2023-01-10 15:03:42 +08:00

888 lines
21 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="map">
<div id="map" ref="rootmap" />
<div class="community-info" v-show="isShowInfo">
<div class="community-info__close" title="关闭" @click="closeInfo">
<i class="iconClean iconfont"></i>
</div>
<div class="community-info__header">
<div class="user" :style="userStyle">
<span>{{ formatName(info.name) }}</span>
</div>
<h2>{{ info.name }}</h2>
<h3>{{ info.gpsDesc }}</h3>
<p>最后更新时间{{ info.lastUpdateTime }}</p>
<div class="community-info__header--status">
<div :style="{color: info.onlineStatus === '1' ? '#2EA222' : '#F46' }">
<i class="iconfont iconzhuangtai"></i>
<span>设备{{ info.onlineStatus === '1' ? '在线' : '离线' }}</span>
</div>
<div>
<i class="iconfont icondianliang"></i>
<span>剩余{{ info.electricQuantity }}%</span>
</div>
</div>
<div class="community-info__header--info">
<div class="community-info__header--info-item" v-for="(item, index) in testItem" :key="item.name" v-if="index !== 0">
<div class="left">
<div :style="{backgroundColor: item.color}">
<i :class="item.icon" class="iconfont"></i>
</div>
<span>{{ item.name }}</span>
</div>
<i :style="{color: (testData[index] && testData[index].abnormalStatus === '1') ? '#F46' : ''}">{{ testData[index] ? testData[index].itemValue : '-' }}{{ index === '1' ? '℃' : '' }}</i>
</div>
</div>
</div>
<div class="community-info__wrapper">
<div class="community-info__title">
<h2>人员信息</h2>
<span :style="userStatusColor">{{ userStatus }}</span>
</div>
<div class="community-info__item">
<label>姓名</label>
<span>{{ info.name}}</span>
</div>
<div class="community-info__item">
<label>性别</label>
<span>{{ info.sex === '1' ? '男' : '女' }}</span>
</div>
<div class="community-info__item">
<label>年龄</label>
<span>{{ info.age }}</span>
</div>
<div class="community-info__item">
<label>所属地区</label>
<span>{{ info.areaName }}</span>
</div>
<div class="community-info__item">
<label>联系电话</label>
<span>{{ info.phone }}</span>
</div>
</div>
</div>
</div>
</template>
<script>
import AMapLoader from '@amap/amap-jsapi-loader'
import {mapState} from 'vuex'
export default {
name: 'AppMonitorMapDv',
label: '监护地图',
provide() {
return {
root: this
}
},
props: {
instance: Function,
dict: Object
},
data() {
return {
map: null,
community: '',
isShowInfo: false,
info: {},
satellite: null,
zoom: 11,
choosedId: '',
testItem: [{
name: '体温',
icon: 'icontiwen',
color: '#6BA3DB'
}, {
name: '心率',
icon: 'iconxinlv',
color: '#72BB5C'
}, {
name: '血压',
icon: 'iconxueya',
color: '#7577CB'
}, {
name: '血氧',
icon: 'iconxueyang',
color: '#FF5656'
}],
testData: [],
center: []
}
},
computed: {
...mapState(['user']),
userStatus () {
if (this.info.abnormalStatus === '2') {
return '求助'
}
if (this.info.abnormalStatus === '1') {
return '异常'
}
if (this.info.abnormalStatus === '0') {
return '正常'
}
return '-'
},
userStatusColor () {
if (this.info.abnormalStatus === '2') {
return {
color: '#FF69DD',
border: '1px solid #FF69DD'
}
}
if (this.info.abnormalStatus === '1') {
return {
color: '#FF6969',
border: '1px solid #FF6969'
}
}
return {
color: '#22FF81',
border: '1px solid #22FF81'
}
},
userStyle () {
if (this.info.abnormalStatus === '2') {
return {
background: 'rgba(96,8,102,0.80)',
border: '1px solid #FF69DD',
boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #C312CA'
}
}
if (this.info.abnormalStatus === '1') {
return {
background: 'rgba(79,14,7,0.80)',
border: '1px solid #FF6969',
boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #C60E0E'
}
}
return {
background: 'rgba(8,73,35,0.80)',
border: '1px solid #22FF81',
boxShadow: '0 4px 4px 0 #000000, inset 0 0 8px 4px #15BE55'
}
}
},
mounted() {
this.getCorpLocation()
},
methods: {
getIdInfo (UUserCard, num) {
if (num == 1) {
var birth = UUserCard.substring(6, 10) + '-' + UUserCard.substring(10, 12) + '-' + UUserCard.substring(12, 14)
return birth
}
if (num == 2) {
if (parseInt(UUserCard.substr(16, 1)) % 2 == 1) {
return '1'
} else {
return '0'
}
}
if (num == 3) {
var myDate = new Date()
var month = myDate.getMonth() + 1
var day = myDate.getDate()
var age = myDate.getFullYear() - UUserCard.substring(6, 10) - 1;
if (UUserCard.substring(10, 12) < month || UUserCard.substring(10, 12) == month && UUserCard.substring(12, 14) <= day) {
age ++
}
return age
}
},
getCorpLocation(){
this.instance.post("/app/appdvcpconfig/getCorpLocation").then(res=>{
if(res.code==0){
this.initMap(res.data);
}
})
},
getList () {
this.instance.post(`/app/appintelligentguardianshipdevice/list`, null, {
params: {
size: 8000,
current: 1
}
}).then(res => {
if (res.code == 0) {
const points = res.data.records.map(item => {
return {
...item,
lnglat: [item.lng, item.lat],
id: item.id,
corpId: item.corpId,
areaName:item.areaName,
name: item.name
}
})
this.addMakert(points)
if (this.$route.query.id) {
this.onTreeChange({
type: '1',
deviceId: this.$route.query.id,
lng: this.$route.query.lng,
lat: this.$route.query.lat
})
}
}
})
},
formatName (str) {
if (!str) return ''
return str.substr(str.length - 2)
},
getInfo (id) {
this.instance.post(`/app/appintelligentguardianshipdevice/queryMonitorList?deviceId=${id}&type=1`).then(res => {
if (res.code === 0) {
let obj = {}
this.testData = res.data.records.forEach(item => {
obj[item.item] = item
})
this.testData = obj
}
})
this.instance.post(`/app/appintelligentguardianshipdevice/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.info = res.data
this.info.age = this.getIdInfo(res.data.idNumber, 3)
this.isShowInfo = true
}
})
},
toCenter() {
this.map.setZoomAndCenter(this.zoom, this.center, false, 600)
},
renderClusterMarker(context) {
let el = `<div class="polymeric">
<div class="polymeric-container">
<p>${context.count}</p>
</div>
</div>`
let offset = new AMap.Pixel(-9, -9)
context.marker.setContent(el)
context.marker.setOffset(offset)
context.marker.lnglat = context.clusterData[0].lnglat
context.marker.on('click', e => {
this.map.setZoomAndCenter(this.map.getZoom() + 3, e.target.lnglat, false, 500)
})
},
renderMarker(context) {
const buildId = context.data[0].id
let el = `<div class="mark mark${context.data[0].abnormalStatus}" id="buildId-${buildId}">
<div class="mark-contaienr">
<span>${context.data[0].name}</span>
</div>
</div>`
context.marker.setContent(el);
context.marker.setAnchor("center")
context.marker.id = `${buildId}`
context.marker.data = JSON.stringify(context.data[0])
context.marker.lnglat = context.data[0].lnglat
context.marker.on('click', e => {
this.choosedId = e.target.id
this.getInfo(e.target.id)
context.marker.setContent(el);
document.querySelectorAll('.mark').forEach(el => {
el.classList.remove('mark-active')
})
document.querySelector(`#buildId-${e.target.id}`).add('mark-active')
this.map.setZoomAndCenter(this.map.getZoom() + 0.000000001, e.target.lnglat, false, 300)
})
},
closeInfo () {
this.info = {}
this.isShowInfo = false
this.choosedId = ''
this.map.setZoom(this.map.getZoom() + 0.0001)
},
addMakert(points) {
new AMap.MarkerClusterer(this.map, points, {
gridSize: 60,
maxZoom: 15,
clusterByZoomChange: false,
renderClusterMarker: this.renderClusterMarker,
renderMarker: this.renderMarker
})
},
initMap({lng,lat}) {
this.center = [lng,lat];
AMapLoader.load({
key: '54a02a43d9828a8f9cd4f26fe281e74e',
version: '2.0',
plugins: ['AMap.ToolBar', 'AMap.Scale', 'AMap.MouseTool', 'AMap.MarkerClusterer'],
AMapUI: {
version: '1.1',
plugins: []
}
}).then((AMap) => {
this.map = new AMap.Map('map', {
resizeEnable: true,
zooms: [6, 20],
center: [lng, lat],
zoom: this.zoom,
mapStyle: 'amap://styles/40f6fba77127e061a058f670433a67ec'
})
this.satellite = new AMap.TileLayer.Satellite()
this.getList()
})
}
}
}
</script>
<style lang="scss" scoped>
.map {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
.community-info {
position: absolute;
top: 10px;
right: 10px;
width: 400px;
max-height: calc(100% - 20px);
overflow-y: overlay;
overflow-x: hidden;
z-index: 111;
background: rgba(7,11,35,0.50);
border: 1px solid #14345F;
.community-info__close {
position: absolute;
right: 0;
top: 0;
padding: 16px 12px 0 12px;
font-size: 16px;
color: #8899bb;
cursor: pointer;
&:hover {
opacity: 0.6;
}
}
&::-webkit-scrollbar {
width: 6px;
height: 1px;
}
&::-webkit-scrollbar-thumb {
border-radius: 6px;
background: rgba(144, 147, 153, .5);
}
.community-info__header {
padding-top: 40px;
text-align: center;
.user {
display: flex;
align-items: center;
justify-content: center;
width: 50px;
height: 50px;
margin: 0 auto 8px;
border-radius: 50%;
background: #2266FF;
span {
color: #fff;
font-size: 16px;
}
}
h2 {
line-height: 24px;
margin-bottom: 12px;
font-weight: Bold;
font-size: 16px;
color: #FFFFFF;
}
h3, p {
width: 300px;
line-height: 22px;
margin: 0 auto 4px;
font-size: 13px;
color: #82C5FF;
text-align: center;
font-weight: normal;
}
& > h3 {
line-height: 1.4;
color: #82C5FF;
}
.community-info__header--info {
display: flex;
flex-wrap: wrap;
padding: 0 20px;
.community-info__header--info-item {
display: flex;
align-items: center;
justify-content: space-between;
width: 174px;
height: 56px;
margin-bottom: 10px;
padding: 0 12px;
background-image: linear-gradient(270deg, rgba(119,169,255,0.20) 0%, rgba(66,112,255,0.50) 100%);
border-radius: 4px;
&:nth-of-type(2n - 1) {
margin-right: 10px;
}
& > i {
position: relative;
top: 2px;
font-style: normal;
color: #fff;
font-size: 16px;
font-weight: 700;
}
.left {
display: flex;
align-items: center;
span {
font-size: 14px;
color: rgba(130, 197, 255, 1);
}
div {
display: flex;
align-items: center;
justify-content: center;
margin-right: 8px;
width: 24px;
height: 24px;
border-radius: 50%;
background: #6BA3DB;
i {
color: #fff;
font-size: 16px;
}
}
}
}
}
.community-info__header--status {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
div {
display: flex;
align-items: center;
color: #74FF66;
}
span {
font-size: 14px;
}
div:first-child {
margin-right: 20px;
}
i {
position: relative;
margin-right: 2px;
font-size: 16px;
}
div:last-child {
color: #fff;
span {
font-size: 12px;
}
}
}
}
.community-info__wrapper {
padding: 0 20px 40px;
.community-info__title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
h2 {
position: relative;
width: 169px;
padding: 0 20px;
font-size: 15px;
color: #fff;
font-weight: 700;
background: url(https://cdn.cunwuyun.cn/dvcp/ply/title-bg.png) no-repeat;
background-size: 169px 30px;
background-position-y: -5px;
background-position-x: -10px;
}
span {
width: 52px;
height: 24px;
line-height: 24px;
color: #fff;
font-size: 14px;
text-align: center;
border-radius: 12px;
}
}
.community-info__item {
display: flex;
align-items: center;
justify-content: space-between;
height: 40px;
padding: 0 12px;
font-size: 12px;
color: #fff;
background: transparent;
&:nth-of-type(2n) {
background-image: linear-gradient(270deg, rgba(119,169,255,0.20) 0%, rgba(66,112,255,0.50) 100%);
}
span {
max-width: 70%;
text-align: right;
}
label {
flex-shrink: 1;
color: rgba(130, 197, 255, 1);
}
}
&.community-info__wrapper--last {
.community-info__item {
background: #fff;
&:nth-of-type(2n) {
background: #F3F6F9;
}
}
}
}
}
:deep( .ol-zoom ){
display: none !important;
top: inherit !important;
bottom: 0.5em !important;
}
div {
box-sizing: border-box;
}
#map {
width: 100%;
height: 100%;
}
:deep( .amap-logo), :deep( .amap-copyright ){
display: none !important;
}
:deep( .amap-icon ){
width: 40px !important;
height: 40px !important;
img {
width: 100%;
height: 100%;
}
}
.no-more {
display: block;
height: 60px;
line-height: 60px;
margin-top: 2px;
text-align: center;
font-size: 12px;
color: #999;
width: 100%;
}
}
.community {
display: flex;
align-items: center;
position: relative;
height: 28px;
padding: 0 10px;
background: #0F8F64;
border-radius: 26px;
color: #fff;
font-size: 12px;
cursor: pointer;
&.color1 {
background: #2266FF;
em:after {
border-top-color: #2266FF !important;
}
}
&.color2 {
background: #F46159;
em:after {
border-top-color: #F46159 !important;
}
}
em {
position: absolute;
bottom: -6px;
left: 50%;
transform: translate(-50%, 0);
&::after {
position: absolute;
bottom: -6px;
left: 0;
width: 0;
height: 0;
border: 6px solid #0F8F64;
border-bottom-color: transparent;
border-left-color: transparent;
border-right-color: transparent;
transform: translate(-50%, 0);
overflow: hidden;
content: ' ';
}
}
i {
padding-right: 2px;
position: relative;
color: #ffc928;
font-size: 16px;
font-style: normal;
}
}
:deep( .polymeric ){
display: flex;
position: relative;
align-items: center;
justify-content: center;
width: 62px;
height: 62px;
border-radius: 50%;
cursor: pointer;
user-select: none;
&.polymeric-active {
.polymeric-container {
background: #F46159;
}
&::after {
background-color: #F46159;
}
}
&::after {
position: absolute;
z-index: -1;
width: 62px;
height: 62px;
border-radius: 50%;
-webkit-animation: warn 1s ease-out 0s infinite;
animation: warn 1s ease-out 0s infinite;
background-color: rgba(15, 143, 100, 1);
transform: translate(-50%, -50%);
content: " ";
}
.polymeric-container {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
width: 62px;
height: 62px;
border-radius: 50%;
background: rgba(15, 143, 100, 1);
p {
text-align: center;
width: 58px;
color: #fff;
font-size: 18px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
p:first-child{
font-size: 14px;
}
h2 {
color: #fff;
font-weight: normal;
font-size: 12px;
}
}
}
:deep( .mark){
display: flex;
align-items: center;
justify-content: center;
position: relative;
user-select: none;
cursor: pointer;
width: 56px;
height: 56px;
background: rgba(108,94,14,0.80);
border: 1px solid #FFDF54;
box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #D1A818;
border-radius: 50%;
box-sizing: border-box;
font-size: 14px;
color: #FFFFFF;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-shadow: 0 2px 4px rgba(0,0,0,0.50);
&.mark0 {
background: rgba(8,73,35,0.80);
border: 1px solid #22FF81;
box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #15BE55;
}
&.mark1 {
background: rgba(79,14,7,0.80);
border: 1px solid #FF6969;
box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #C60E0E;
}
&.mark2 {
background: rgba(96,8,102,0.80);
border: 1px solid #FF69DD;
box-shadow: 0 4px 4px 0 #000000, inset 0 0 8px 4px #C312CA;
}
.mark-contaienr {
width: 56px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: center;
}
// &.mark1::after {
// position: absolute;
// z-index: -1;
// width: 100px;
// height: 100px;
// border-radius: 50%;
// -webkit-animation: warn 1s ease-out 0s infinite;
// animation: warn 1s ease-out 0s infinite;
// background-color: #FF6969;
// transform: translate(-50%, -50%);
// content: " ";
// }
// &.mark2::after {
// position: absolute;
// z-index: -1;
// width: 100px;
// height: 100px;
// border-radius: 50%;
// -webkit-animation: warn 1s ease-out 0s infinite;
// animation: warn 1s ease-out 0s infinite;
// background-color: #FF69DD;
// transform: translate(-50%, -50%);
// content: " ";
// }
}
@-webkit-keyframes warn {
0% {
transform: scale(.5);
opacity: 1
}
30% {
opacity: .5
}
to {
transform: scale(1.8);
opacity: 0
}
}
@keyframes warn {
0% {
transform: scale(.5);
opacity: 1
}
30% {
opacity: .5
}
to {
transform: scale(1.4);
opacity: 0
}
}
</style>