vehicle.vue 15.3 KB
<template>
    <div>
        <el-row>
            <el-card  style="background-color: #F5F7FA">
                <el-row>
                    <el-form :model="queryInfo" :rules="rules" ref="ruleForm">
                        <el-col :span="6">
                        <el-form-item label="" prop="vno">
                            <div class="my-text-area">
                                <div class="el-input-group__prepend prepand">车牌号</div>
                                <el-select v-model="queryInfo.vno"
                                           @click.native="getCreden"
                                           default-first-option
                                           :loading="loading" clearable placeholder="请选择"   style="width: 100px">
                                    <el-option
                                            v-for="item in vnos"
                                            :key="item.lisenceNo"
                                            :label="item.lisenceNo"
                                            :value="item.lisenceNo"
                                            :disabled="item.disabled">
                                    </el-option>
                                </el-select>
                            </div>


<!--                                <el-input v-model="queryInfo.vno"  size="small" style="width: 200px"-->
<!--                                          placeholder="车牌号" clearable required>-->
<!--                                    <template slot="prepend">车牌号</template>-->
<!--                                </el-input>-->
                        </el-form-item>
                        </el-col>
                        <el-col :span="6">
                        <el-form-item label="" prop="vnocolor">
                                <div class="my-text-area">
                                    <div class="el-input-group__prepend prepand">车牌类型</div>
                                    <el-select required v-model="queryInfo.vnocolor" placeholder="车牌类型" style="width: 100px">
                                        <el-option label="蓝牌" value="1"></el-option>
                                        <el-option label="黄牌" value="2"></el-option>
                                        <el-option label="绿牌" value="3"></el-option>
                                    </el-select>
                                </div>
                        </el-form-item>
                        </el-col>
                        <el-col :span="6">
                            <el-form-item label="" prop="satellite">
                                <div class="my-text-area">
                                    <div class="el-input-group__prepend prepand">卫星</div>
                                    <el-select required v-model="satellite" placeholder="卫星" style="width: 100px">
                                        <el-option label="北斗" value="1"></el-option>
                                        <el-option label="GPS" value="2"></el-option>
                                    </el-select>
                                </div>
                            </el-form-item>
                        </el-col>
                        <el-col :span="2">
                            <el-button type="primary" icon="el-icon-search" size="mini" @click="getList()">
                                查询
                            </el-button>
                        </el-col>
                        <el-col :span="2">
                            <el-button @click="getByliscenNo()" type="success" style="margin-left: 16px;">
                                车辆图片
                            </el-button>
                        </el-col>
                    </el-form>
                </el-row>
                <el-drawer
                        title="车辆图片"
                        :visible.sync="drawer"
                        :with-header="false">
                    <div>
                        <div v-for="(imageInfo, index) in imageInfos" :key="index" class="image-container">
                            <el-divider content-position="left">
                                <p v-if="imageInfo && imageInfo.content">{{ imageInfo.content }}</p>
                            </el-divider>
                            <img v-if="imageInfo && imageInfo.url" :src="imageInfo.url" alt="Image" class="image" />

                        </div>
                    </div>
                </el-drawer>
            </el-card>
        </el-row>
        <div id="mapContainer" style="width: 100%;height: 100vh;"></div>
    </div>
</template>
<script>
    import AMapLoader from '@amap/amap-jsapi-loader';
    import {selectVehicle, selectNameList, selectByliscenNo, selectList, gpslastlocation} from '../../api/consigner/vehicle';
    import {loginedUserInfo} from "../../api/user";

    export default {
        name: 'MapComponent',
        data() {
            return {
                drawer: false,
                mapInstance: null,
                queryInfo: {
                    vno: '',
                    vnocolor: '2'
                },
                satellite:'1',
                vnos:[],
                loading:false,
                imageUrls: [], // 存储图片地址的数组
                imageInfos:[],
                rules: {
                    vno: [
                        { required: true, message: '请输入车牌号', trigger: 'blur' },
                        // { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
                    ],
                    vnocolor: [
                        { required: true, message: '请选择车牌类型', trigger: 'change' }
                    ],
                }
            };
        },
        methods: {
            //获取图片
            getByliscenNo(){
                if(this.queryInfo.vno == null||this.queryInfo.vno ==''){
                    return this.$message.error('请选择车牌号')
                }
                this.drawer = true;
                selectByliscenNo({lisenceNo:this.queryInfo.vno}).then((response) => {
                    const res = response.data
                    console.log(response.data)
                    if (res.code !== '200') {
                        return this.$message.error('获取消息收发记录,失败!')
                    }
                    this.imageInfos = res.data.imgurl.split(',').map(url => {
                        if (url !== 'null') {
                            const parts = url.split('/');
                            const fileName = parts.pop();
                            const content = fileName.split('-')[0];
                            return {
                                url: url,
                                content: content
                            };
                        }
                    });
                }).catch(error => {
                    // 关闭加载
                    this.$message.error(error.toString())
                })
            },
            //获取车牌号
            getCreden(){
                this.vnos=[];
                //let params={};
                this.loading = true;
                console.log(loginedUserInfo().username)
                selectNameList({'username':loginedUserInfo().username}).then(res =>{
                    console.log(res)
                    if (res!=null) {
                        console.log(res.data.data)
                        setTimeout(() => {
                            this.loading = false;
                            this.vnos=res.data.data;
                        }, 200);
                    } else {
                        this.vnos = [];
                    }
                });
            },
            getList() {
                if(this.satellite=='1'){
                    this.$refs.ruleForm.validate(valid => {
                        if (!valid) return;
                        const _this = this;
                        selectVehicle(this.queryInfo).then((response) => {
                            const res = response.data;
                            if (res.code !== '200') {
                                return _this.$message.error('获取车辆位置失败!');
                            }
                            if(res.data.data!=='' && res.data.data!=null){
                                // 获取车辆位置信息
                                const vehicle = res.data.data.firstVcl;
                                // 在获取车辆位置成功的部分,创建信息窗口或者自定义标记

                                if (vehicle.lon && vehicle.lat) {
                                    const lon = parseFloat(vehicle.lon) / 600000.0; // 将经度字符串转换为数值并除以 600000.0
                                    const lat = parseFloat(vehicle.lat) / 600000.0; // 将纬度字符串转换为数值并除以 600000.0
                                    //const coords = wgs84togcj02(lon, lat);
                                    const markerContent = document.createElement('div');
                                    markerContent.innerHTML = `
                                        <div class="rounded-corner" STYLE="width: 200px;background-color: rgba(255,255,255,0.7);text-align: center">
                                            <p>车牌号:${vehicle.vno}</p >
                                            <p>已行驶距离:${vehicle.runDistance}公里</p >
                                            <p>剩余距离:${vehicle.remainDistance}公里</p >
                                        </div>
                                    `;
                                    // 添加车辆位置标记
                                    const marker = new AMap.Marker({
                                        position: [lon, lat],
                                        map: _this.mapInstance,
                                        content: markerContent
                                    });
                                    const defaultMarker = new AMap.Marker({
                                        position: [lon, lat],
                                        map: _this.mapInstance,
                                    });
                                    // 移动地图中心到车辆位置
                                    _this.mapInstance.setCenter([lon, lat]);
                                    _this.$message.success('获取车辆位置成功!');
                                } else {
                                    _this.$message.warning('车辆位置信息不完整!');
                                }
                            }else{
                                return _this.$message.error('无相关车辆信息返回');
                            }
                        }).catch(error => {
                            _this.$message.error('获取车辆位置失败:' + error.toString());
                        });
                    })
                }else{
                    this.$refs.ruleForm.validate(valid => {
                        if (!valid) return;
                        const _this = this;
                        gpslastlocation({vno:this.queryInfo.vno}).then((response) => {
                            const res = response.data;
                            if (res.code !== '200') {
                                return _this.$message.error('获取车辆位置失败!');
                            }
                            if(res.data.data!=='' && res.data.data!=null){
                                // 获取车辆位置信息
                                const vehicle = res.data.data;
                                // 在获取车辆位置成功的部分,创建信息窗口或者自定义标记
                                if (vehicle[0].lon && vehicle[0].lat) {

                                    const markerContent = document.createElement('div');
                                    markerContent.innerHTML = `
                                        <div class="rounded-corner" STYLE="width: 250px;background-color: rgba(255,255,255,0.7);text-align: left">
                                            <p>车牌号:${vehicle[0].vehicle}</p >
                                            <p>速度:${vehicle[0].speed}</p >
                                            <p>车辆位置:${vehicle[0].placeName}</p >
                                        </div>
                                    `;
                                    // 添加车辆位置标记
                                    const marker = new AMap.Marker({
                                        position: [vehicle[0].lon, vehicle[0].lat],
                                        map: _this.mapInstance,
                                        content: markerContent
                                    });
                                    const defaultMarker = new AMap.Marker({
                                        position: [vehicle[0].lon, vehicle[0].lat],
                                        map: _this.mapInstance,
                                    });
                                    // 移动地图中心到车辆位置
                                    _this.mapInstance.setCenter([vehicle[0].lon, vehicle[0].lat]);
                                    _this.$message.success('获取车辆位置成功!');
                                } else {
                                    _this.$message.warning('车辆位置信息不完整!');
                                }
                            }else{
                                return _this.$message.error('无相关车辆信息返回');
                            }
                        }).catch(error => {
                            _this.$message.error('获取车辆位置失败:' + error.toString());
                        });
                    })
                }
            },
            initMap() {
                AMapLoader.load({
                    key: 'fdb27c13681d084e85ff8457b5cbe540',
                    version: '2.0',
                    plugins: [], // 可以加载地图插件,比如定位、地图工具等
                }).then((AMap) => {
                    this.mapInstance = new AMap.Map('mapContainer', {
                        zoom: 10,
                        center: [116.397428, 39.90923], // 设置地图中心点
                    });
                }).catch((err) => {
                    console.error(err);
                });
            },
        },
        mounted() {
            this.initMap();
        },
    };
</script>

<style scoped>
    .my-text-area .prepand{
        float: left;
        width:89px;
        height: 28px;
        font-size: 12px;
        line-height: 28px;
    }
</style>
<style>
    .image-container {
        margin-bottom: 10px;
    }

    .image {
        max-width: 100%;
        max-height: 200px;
    }
      .my-text-area .el-textarea__inner{
          min-height: 28px;
          height: 28px;
          border-bottom-left-radius: 0;
          border-top-left-radius: 0;
      }
      .rounded-corner {
          border-radius: 10px; /* 设置圆角的半径为10像素 */
          background-color: #f0f0f0; /* 背景颜色 */
          padding: 10px; /* 内边距 */
          margin: 10px; /* 外边距 */
          box-shadow: 0 0 5px #ddd; /* 盒子阴影效果 */
      }
</style>