Newer
Older
sanitationFront / src / views / routeManage / detailRoute.vue
StephanieGitHub on 24 Mar 2021 9 KB MOD: 完善环卫系统UI
<!--suppress ALL -->
<template>
  <div v-loading="loading" id="detailroute" class="app-container">
    <el-collapse v-model="activeNames">
      <el-collapse-item title="(一)基本信息" name="1" >
        <el-form ref="dataForm" :model="routeForm" label-position="right" label-width="130px" style="padding-top:20px;padding-right: 40px">
          <el-row :gutter="20">
            <el-col :span="8">
              <el-form-item label="路线描述" prop="routeName" >
                <el-input v-model.trim="routeForm.routeName" :disabled="dialogStatus=='detail'" :placeholder="dialogStatus=='detail'?'':'必填'" type="text"/>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="起点地址">
                <el-input v-model.trim="routeForm.startAddress" :disabled="dialogStatus=='detail'" :placeholder="dialogStatus=='detail'?'':'起点地址'" type="text"/>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="终点地址">
                <el-input v-model.trim="routeForm.endAddress" :disabled="dialogStatus=='detail'" :placeholder="dialogStatus=='detail'?'':'终点地址'" type="text"/>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="8">
              <el-form-item label="主要途径道路">
                <el-input v-model.trim="routeForm.mainRoad" :disabled="dialogStatus=='detail'" :placeholder="dialogStatus=='detail'?'':'主要途径道路'" type="text"/>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="开始日期">
                <el-date-picker
                  v-model="routeForm.startDate"
                  :disabled="dialogStatus=='detail'"
                  :placeholder="dialogStatus=='detail'?'':'开始日期'"
                  style="width: 100%"
                  type="date"
                  value-format="yyyy-MM-dd"/>
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="结束日期">
                <el-date-picker
                  v-model="routeForm.endDate"
                  :disabled="dialogStatus=='detail'"
                  :placeholder="dialogStatus=='detail'?'':'结束日期'"
                  style="width: 100%"
                  type="date"
                  value-format="yyyy-MM-dd"/>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="24">
              <el-form-item label="准行时间段">
                <el-checkbox-group v-model="accessTime">
                  <el-checkbox v-for="time in times" :label="time" :key="time" :disabled="dialogStatus=='detail'" style="width: 90px;line-height: 10px">{{ time }}:00</el-checkbox>
                </el-checkbox-group>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="24">
              <el-form-item label="备注">
                <el-input v-model.trim="routeForm.remarks" :disabled="dialogStatus=='detail'" :placeholder="dialogStatus=='detail'?'':'备注'" type="textarea" />
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>
      </el-collapse-item>
      <el-collapse-item title="(二)关联车辆" name="2">
        <div v-if="carlist.length==0" style="margin-left: 40px;padding-top: 10px">
          暂无关联车辆
        </div>
        <div v-else class="infinite-list-wrapper" style="overflow:auto;padding-left: 40px;padding-top: 10px">
          <el-checkbox-group v-model="removelist" class="checkbox" disabled>
            <el-checkbox v-for="item in carlist" :label="item.id" :key="item.id" style="width: 150px">{{ item.description }}</el-checkbox>
          </el-checkbox-group>
        </div>
      </el-collapse-item>
      <el-collapse-item title="(三)地图展示" name="3">
        <div id="map">
          <map-view ref="map" @ready="initMap">
            <l-polyline :lat-lngs="pathlist" />
            <l-marker
              v-for="(star,index) in pathlist"
              :icon="index==0?iconStart:index==(pathlist.length-1)?iconEnd:iconMiddle"
              :key="'star'+index"
              :lat-lng="star"/>
          </map-view>
        </div>
      </el-collapse-item>
    </el-collapse>
  </div>
</template>
<script>
import { getRouteInfo } from '@/api/sanitation/route'
import * as L from 'leaflet'
import { LMarker, LPolyline } from 'vue2-leaflet'
import MapView from '../mapViews/mapView'
import {getConstant} from '@/utils/routeutils'
import { getPathBounds, getCenterByBounds, getZoomByBounds } from '@/utils/maputils'
export default {
  components: { MapView, LMarker, LPolyline },
  data() {
    const routeConstant = getConstant()
    return {
      loading: true, // 加载状态
      dialogStatus: 'detail', // 对话框类型:create,update
      activeNames: ['1', '2', '3'], // 可以展开的面板
      deptShow: true,
      routeId: '', // 路线id
      map: null, // 地图对象
      list: [], // ?
      accessTime: [], // 允许通行时间列表
      carlist: [], // ?
      removelist: [], // 移除车辆列表
      pathlist: [], // 路线列表
      routeForm: {
        id: '',
        routeName: '',
        alarmType: '',
        alarmDistance: '',
        startAddress: '',
        endAddress: '',
        mainRoad: '',
        startDate: '',
        endDate: '',
        accessTime: '',
        remarks: ''
      }, // 路线基本信息表单
      times: routeConstant.times, // 所有时间列表
      options: routeConstant.timeSelectOptions, // 允许通行时间下拉选项
      iconStart: L.icon({
        iconUrl: require('../../assets/icons/start.png'),
        iconSize: [45, 45], // 图片大小
        iconAnchor: [22, 35] // 偏移x,y,针对图片的左上角
      }), // 开始图标
      iconEnd: L.icon({
        iconUrl: require('../../assets/icons/end.png'),
        iconSize: [45, 45], // 图片大小
        iconAnchor: [22, 35] // 偏移x,y,针对图片的左上角
      }), // 结束图标
      iconMiddle: L.divIcon({
        className: 'my-div-icon', // 自定义icon css样式
        iconSize: [15, 15]// 点大小
      }) // 中间图标
    }
  },
  created() {
    this.initdata()
  },
  methods: {
    // 初始化地图
    initMap() {
      this.map = this.$refs.map.map
    },
    // 初始化基础数据
    initdata() {
      if (this.$route.query) {
        this.routeId = this.$route.query.id
        this.routeForm = {
          id: this.$route.query.id,
          routeName: this.$route.query.routeName,
          alarmType: this.$route.query.alarmType,
          alarmDistance: this.$route.query.alarmDistance,
          startAddress: this.$route.query.startAddress,
          endAddress: this.$route.query.endAddress,
          mainRoad: this.$route.query.mainRoad,
          startDate: this.$route.query.startDate,
          endDate: this.$route.query.endDate,
          accessTime: this.$route.query.accessTime,
          remarks: this.$route.query.remarks
        }
        if (this.routeForm.accessTime.length !== 0) {
          var accesslist = this.routeForm.accessTime.split(',')
          this.accessTime = []
          for (var i = 0; i < accesslist.length; i++) {
            this.accessTime.push(Number(accesslist[i]))
          }
        }
      }
      // 获取路线详情
      getRouteInfo(this.routeId).then(response => {
        this.loading = false
        this.carlist = response.data.carList // 车辆列表
        this.removelist = []
        for (var i = 0; i < this.carlist.length; i++) {
          this.removelist.push(this.carlist[i].id)
        }
        this.pathlist = []
        for (i = 0; i < response.data.pathList.length; i++) {
          var item = [Number(response.data.pathList[i].startLat), Number(response.data.pathList[i].startLng)]
          this.pathlist.push(item)
          if (i === response.data.pathList.length - 1) {
            item = [Number(response.data.pathList[i].endLat), Number(response.data.pathList[i].endLng)]
            this.pathlist.push(item)
          }
        }
        if (this.pathlist.length !== 0) {
          this.setZoom(this.pathlist)
        }
      })
    },
    // 计算缩放边界
    setZoom(points) {
      console.log(points)
      if (points.length > 0) {
        // 计算边界
        const { maxLng, minLng, maxLat, minLat } = getPathBounds(points)
        // 计算中心点
        const { cenLat, cenLng } = getCenterByBounds({ maxLng, minLng, maxLat, minLat })
        // 计算缩放
        const zoom = getZoomByBounds({ maxLng, minLng, maxLat, minLat })
        this.map.setView({ lat: cenLat, lng: cenLng }, zoom)
      }
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss">
  #detailroute .el-checkbox__label {
    font-size: 15px ;
    font-weight: bold;
  }
  #map {
    width:100%;
    height:50vh;
  }
  .my-div-icon {
    width: 10px;
    height: 10px;
    background-color: orange;
    border-radius: 50%;
  }
  #detailroute .el-form-item {
    margin-bottom: 10px;
  }
  .el-input.is-disabled .el-input__inner {
    background-color: #f8fafd;
    border-color: #E4E7ED;
    color: #696b6f;
    cursor: default;
  }
  .el-textarea.is-disabled .el-textarea__inner{
    background-color: #f8fafd;
    border-color: #E4E7ED;
    color: #696b6f;
    cursor: default;
  }
  .el-checkbox__input.is-disabled + span.el-checkbox__label{
    color: #696b6f;
    cursor: default;
  }
  .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{
    border-color: #696b6f;
  }
</style>