You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

541 lines
18 KiB
Vue

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>
<el-row :gutter="12">
<el-col :offset="1" :span="5">
<el-card shadow="hover" style="margin:24px 0 ">
<h2>车辆信息</h2>
<p>车队名称<span>{{ cardInfo.name }}</span></p>
</el-card>
<h2>实时位置</h2>
<div id="container" class="container1"></div>
<!-- <div style="width: 25%;text-align: center;margin-top: 14px">-->
<!-- <img height="70" src="@/assets/images/tyre.png" style="" width="70"/>-->
<!-- <div style="width: 100%;font-size: 12px;white-space:nowrap">轮胎详情</div>-->
<!-- </div>-->
</el-col>
<el-col :offset="1" :span="11">
<div style="width: 100%;text-align: center;height: 100px">
<div style="width: calc(50% - 50px);float:left;">
<span style="font-weight: 600;font-size: 16px;color:#cba658;line-height: 40px">
<span class="platebg">
<span class="span1">{{ cardInfo.carLicense.slice(0, 2) }}</span>
<span class="span2">{{ cardInfo.carLicense.slice(2, 7) }}</span>
</span>
</span>
</div>
<div style="width: 100px;float:left;">
<span style="font-weight: 600;font-size: 20px;line-height: 40px">单车监控</span>
</div>
<div style="width: calc(50% - 50px);float:left;">
<span style="font-weight: 600;font-size: 16px;color:#cba658;line-height: 100px">
<span style="vertical-align:top;">
里程000.00km
</span>
</span>
</div>
</div>
<div v-for="(item,index) in TireRow" key="index" style="margin-bottom: 18px">
<div
style="vertical-align:top;width: 12.5%;margin: 0 12px; height: 100px;display: inline-block;border: 1px solid #666;border-radius: 10%"
@click="getTyreInfo(`${index+1}-1-1`)">
<div v-if="tyreDataList.includes(`${index+1}-1-1`)"
style="border-radius: 10%;width:100%;height:100%;background-color:green;vertical-align:top">
<div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">
<div class="icon1"/>
{{ parseFloat(tyreList.filter(e => e.tyrePositionS === (`${index + 1}-1-1`))[0].temperature).toFixed(3) }}℃
</div>
<div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">
<div class="icon2"/>
{{ parseFloat(tyreList.filter(e => e.tyrePositionS === (`${index + 1}-1-1`))[0].pressure).toFixed(3) }}Pa
</div>
<!-- <div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">-->
<!-- 花纹:{{ tyreList.filter(e => e.tyrePositionS === (`${index + 1}-1-1`))[0].pattern }}-->
<!-- </div>-->
</div>
</div>
<div
:style="'vertical-align: top;width: 12.5%;margin: 0 12px; height: 100px;display: inline-block;border: 1px solid'+ (TireRow[index] === 2 ? '#666;' :'rgba(0,0,0,0);') + 'border-radius: 10%'"
@click="getTyreInfo(`${index+1}-1-2`)">
<div v-if="tyreDataList.includes(`${index+1}-1-2`)"
style="border-radius: 10%;width:100%;height:100%;background-color:green;vertical-align: top">
<div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">
<div class="icon1"/>
{{ parseFloat(tyreList.filter(e => e.tyrePositionS === (`${index + 1}-1-2`))[0].temperature).toFixed(3) }}℃
</div>
<div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">
<div class="icon2"/>
{{ parseFloat(tyreList.filter(e => e.tyrePositionS === (`${index + 1}-1-2`))[0].pressure) }}Pa
</div>
<!-- <div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">-->
<!-- 花纹:{{ tyreList.filter(e => e.tyrePositionS === (`${index + 1}-1-2`))[0].pattern }}-->
<!-- </div>-->
</div>
</div>
<img sizes="100% 100%" src="@/assets/images/zhou.png"
style="width: calc(50% - 108px);height: 100px;display: inline-block;vertical-align:top"/>
<div
:style="'vertical-align: top;width: 12.5%;margin: 0 12px; height: 100px;display: inline-block;border: 1px solid '+ (TireRow[index] === 2 ? '#666' :'rgba(0,0,0,0)') +';border-radius: 10%'"
@click="getTyreInfo(`${index+1}-2-2`)">
<div v-if="tyreDataList.includes(`${index+1}-2-2`)"
style="border-radius: 10%;width:100%;height:100%;background-color:green;vertical-align:top">
<div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">
<div class="icon1"/>
{{ parseFloat(tyreList.filter(e => e.tyrePositionS === (`${index + 1}-2-2`))[0].temperature).toFixed(3) }}℃
</div>
<div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">
<div class="icon2"/>
{{ parseFloat(tyreList.filter(e => e.tyrePositionS === (`${index + 1}-2-2`))[0].pressure) }}Pa
</div>
<!-- <div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">-->
<!-- 花纹:{{ tyreList.filter(e => e.tyrePositionS === (`${index + 1}-2-2`))[0].pattern }}-->
<!-- </div>-->
</div>
</div>
<div
style="vertical-align: top;width: 12.5%;margin: 0 12px; height: 100px;display: inline-block;border: 1px solid #666;border-radius: 10%"
@click="getTyreInfo(`${index+1}-2-1`)">
<div v-if="tyreDataList.includes(`${index+1}-2-1`)"
style="border-radius: 10%;width:100%;height:100%;background-color:green;vertical-align:top">
<div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">
<div class="icon1"/>
{{ parseFloat(tyreList.filter(e => e.tyrePositionS === (`${index + 1}-2-1`))[0].temperature).toFixed(3) }}℃
</div>
<div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">
<div class="icon2"/>
{{ parseFloat(tyreList.filter(e => e.tyrePositionS === (`${index + 1}-2-1`))[0].pressure) }}Pa
</div>
<!-- <div style="white-space:nowrap;width: 100%;color:#fff;font-size: 0.7vw;line-height: 50px">-->
<!-- 花纹:{{ tyreList.filter(e => e.tyrePositionS === (`${index + 1}-2-1`))[0].pattern }}-->
<!-- </div>-->
</div>
</div>
</div>
</el-col>
<el-col :offset="1" :span="5">
<el-tabs
v-model="tabsName"
style="margin:24px 0 0 0"
type="card"
@tab-click="resetQuery"
>
<el-tab-pane label="有车载设备车辆" name="有车载设备车辆">
<el-form ref="queryRef" :inline="true" :model="queryParams"
label-width="60px" max-height="800">
<el-form-item label="车牌号" prop="carLicense">
<el-input
v-model="queryParams.carLicense"
clearable
style="width: 200px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label=" ">
<el-button icon="Search" type="primary" @click="handleQuery">{{ t('option.search') }}</el-button>
<el-button icon="Refresh" @click="resetQuery">{{ t('option.reset') }}</el-button>
</el-form-item>
</el-form>
<el-table
ref="tableRef1"
:data="tableData"
:show-header="false"
highlight-current-row
style="width: 100%"
@current-change="tableChange"
>
<el-table-column label="label" prop="label"/>
<el-table-column v-if="false" label="id" prop="id"/>
</el-table>
<pagination
v-show="total > 0"
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNum"
:total="total"
layout="sizes, prev, pager, next"
style="margin-bottom: 40px"
@pagination="getList"
/>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
<el-dialog v-model="open" :title="title" append-to-body width="800px">
<el-descriptions :column="2" border class="margin-top" width="150px">
<el-descriptions-item>
<template #label>
胎号
</template>
{{ tyreInfo.outerTireNumber }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
轮位描述
</template>
{{ tyreInfo.tyrePosition }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
传感器ID
</template>
{{ tyreInfo.sensorId }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
品牌
</template>
{{ tyreInfo.brand }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
总里程
</template>
{{ tyreInfo.internationalization2 }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
规格
</template>
{{ tyreInfo.size }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
花纹
</template>
{{ tyreInfo.pattern }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
当前花纹深度
</template>
{{ tyreInfo.currentTextureDepth }}mm
</el-descriptions-item>
<el-descriptions-item>
<template #label>
电池电压
</template>
{{ tyreInfo.internationalization2 }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
温度
</template>
{{ tyreInfo.temperature }}℃
</el-descriptions-item>
<el-descriptions-item>
<template #label>
压力
</template>
{{ tyreInfo.pressure }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
安装时间
</template>
{{ tyreInfo.internationalization2 }}
</el-descriptions-item>
</el-descriptions>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">{{ t('option.ok') }}</el-button>
<el-button @click="cancel">{{ t('option.cancel') }}</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {listBaseCar, getCarGpsList, getTyreList} from '@/api/realTimeMonitoring/carMonitoring'
import AMapLoader from '@amap/amap-jsapi-loader';
import {useI18n} from "vue-i18n";
import {ref} from 'vue'
import {useRouter} from 'vue-router';
import {parseTime} from "@/utils/ruoyi";
import {onBeforeUnmount} from "@vue/runtime-core";
import {addBaseDevice, updateBaseDevice} from "@/api/deviceManagement/info";
const title = '轮胎信息'
const {proxy} = getCurrentInstance();
const $router = useRouter();
const {t} = useI18n();
const TireRow = ref([])
const tyreList = ref([])
const tyreDataList = ref([])
const pageId = ref('')
const tableRef1 = ref()
const open = ref(false)
let map = null
const markers = ref(null)
const tyreInfo = ref({})
const childrenList = ref([])
const getTyreInfo = (e) => {
console.log(e)
console.log(tyreList.value)
let id = tyreList.value.filter(val => val.tyrePositionS === e)?.[0]?.tyreId || ''
console.log(id)
if (!id) return
open.value = true
getTyreList(id).then(e => {
tyreInfo.value = e.data
})
}
AMapLoader.load({
key: "ba8fb8d8bae1b280b93406d5959d492f", // 申请好的Web端开发者Key首次调用 load 时必填
// version: "1.4.15", //
version: "2.0", //
plugins: [],
AMapUI: {
version: '1.1',
plugins: []
}
}).then((AMap) => {
map = new AMap.Map("container", { //设置地图容器id
viewMode: "3D", //是否为3D地图模式
zoom: 16, //初始化地图级别
center: [116.397428, 39.90923], //初始化地图中心点位置
});
}).catch(e => {
})
proxy.$nextTick(async () => {
pageId.value = $router?.currentRoute?.value?.query?.id
if (pageId.value) {
// await tableChange({id: pageId.value})
const {rows: list} = await listBaseCar(queryParams.value)
tableData.value = list.map(e => {
return {
label: e.carLicense,
...e
}
})
tableRef1.value.setCurrentRow(tableData.value.find(e => e.id === pageId.value))
} else {
getList()
}
})
// 总条数
const total = ref(0);
const getList = async () => {
const {rows: list} = await listBaseCar(queryParams.value)
tableData.value = list.map(e => {
return {
label: e.carLicense,
...e
}
})
total.value = tableData.value.length
tableRef1.value.setCurrentRow(tableData.value[0])
console.log(tableData.value)
}
const setChildrenList =async (e) => {
const {rows: list} = await listBaseCar({
pageNum: 1,
pageSize: 10,
carLicense: '',
})
}
const tableChange = async (e) => {
pageId.value = e.id
const {data: info} = await getCarGpsList({id: pageId.value})
cardInfo.value = {
carLicense: info.carLicense,
name: info.carQueue
}
let TireRow1 = info.cartype?.split('T')[1]?.split('|').filter(e => e !== '') || []
let title = []
TireRow1.forEach((res) => {
title.push(parseInt(res.split('-')[1]))
})
TireRow.value = title
let tyreListData = info.tyreList.map(e => {
return {
...e,
tyrePositionS: e.tyrePosition?.split('-')[0] + '-' + e.tyrePosition?.split('-')[1] + '-' + e.tyrePosition?.split('-')[2]
}
})
tyreList.value = tyreListData
tyreDataList.value = tyreListData.map(e => e.tyrePositionS)
let timeOut = () => {
setTimeout(() => {
if (map) {
setMarker(info)
clearTimeout(timeOut)
}
}, 1000)
}
timeOut()
}
const cardInfo = ref({
name: '名称',
carLicense: ''
})
const tabsName = ref('有车载设备车辆')
const queryParams = ref({
pageNum: 1,
pageSize: 10,
carLicense: '',
})
const tableData = ref([])
/** 取消按钮 */
function cancel() {
open.value = false;
reset();
}
/** 表单重置 */
function reset() {
tyreInfo.value = {
id: null,
internetThingsNo: null,
deviceType: null,
state: null,
};
proxy.resetForm("postRef");
}
/** 提交按钮 */
function submitForm() {
open.value = false;
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
queryParams.value = {
pageNum: 1,
pageSize: 10,
carLicense: '',
}
handleQuery();
tableRef1.value.setCurrentRow()
}
const setMarker = (res) => {
let pathRow = [[res.longitude, res.latitude]]
markers.value && map.remove(markers.value)
AMap.convertFrom(pathRow, 'gps', function (status, result) {
if (result.info === 'ok') {
let lnglats = result.locations.map(e => [e.lng, e.lat]);
markers.value = new AMap.Marker({
content: '<div class="markerIcon" />',
position: lnglats[0],
anchor: 'bottom-center',
offset: new AMap.Pixel(0, 0),
});
map.add(markers.value)
map.setFitView()
map.setZoom(8)
}
})
}
onBeforeUnmount(() => {
map.destroy()
map = null
})
</script>
<style lang="scss">
.container1 {
padding: 0px;
margin: 0px;
width: 100%;
height: calc(30vh - 84px);
min-height: 200px;
}
.el-tabs__nav {
width: 100%;
border: 0 !important;
}
.el-tabs__item {
width: 100%;
text-align: center;
}
.el-tabs {
border: 1px solid #ddd
}
.platebg {
display: inline-block;
width: 192px;
height: 60px;
background-image: url("../../../assets/images/platebg.png");
background-repeat: no-repeat;
background-size: 100% 100%;
line-height: 40px;
font-size: 30px;
color: #fff;
margin-top: 20px;
.span1 {
display: inline-block;
float: left;
line-height: 60px;
width: 32%;
}
.span2 {
display: inline-block;
float: left;
line-height: 60px;
width: 68%;
letter-spacing: 4px;
}
}
.markerIcon {
width: 65px;
height: 50px;
background-repeat: no-repeat;
background-size: 100% 100%;
background-image: url("../../../assets/images/trucks.png");
}
.el-descriptions__label {
width: 170px;
}
.icon1 {
margin-left: 5px;
display: inline-block;
vertical-align: top;
margin-top: 13px;
width: 20px;
height: 20px;
margin-right: 3px;
background-repeat: no-repeat;
background-size: 100% 100%;
background-image: url('@/assets/images/temperature.png')
}
.icon2 {
margin-left: 5px;
display: inline-block;
vertical-align: top;
margin-top: 13px;
width: 20px;
height: 20px;
margin-right: 3px;
background-repeat: no-repeat;
background-size: 100% 100%;
background-image: url('@/assets/images/pressure.png')
}
</style>