Newer
Older
SpaceIntegration_front / src / views / main / undergroundCavity / detail.vue
<!-- 地下空洞详情 -->
<script lang="ts" setup name="GanDetail">
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import uploadFile from './upload.vue'
import mapDialog from '@/views/main/database/mapDialog.vue'
import { getDictByCode } from '@/api/system/dict'
import { getLocation } from '@/api/map'
import { addHole, detailHole, editHole } from '@/api/page/undergroundCavity'
const emits = defineEmits(['refresh'])
const dataFormRef = ref()
const dialogFormVisible = ref(false) // 对话框是否显示
const dialogFormTyle = ref('create')
const typeDict = ref<{ [key: string]: string }>({
  create: '新建',
  update: '编辑',
  detail: '详情',
})
const areaForm = ref({
  abnormolWave: '', // 异常波形
  detectionDistance: '', // 探测距离
  holeSize: '', // 空洞大小
  holeType: '', // 空洞类型
  holePicture: '', // 空洞图片
  detectionTime: '', // 探测时间
  riskLevel: '', // 风险等级
  lnglat: '', // 经纬度
  longitude: '', // 经度
  latitude: '', // 纬度
  position: '', // 空洞位置
  isHandle: '', // 是否进行治理
}) // 表单
const rules: FormRules = {
  abnormolWave: [{ required: true, message: '异常波形必填', trigger: ['blur', 'change'] }],
  detectionDistance: [{ required: true, message: '探测距离必填', trigger: ['blur', 'change'] }],
  holeSize: [{ required: true, message: '空洞大小必填', trigger: ['blur', 'change'] }],
  holeType: [{ required: true, message: '空洞类型必填', trigger: ['blur', 'change'] }],
  // holePicture: [{ required: true, message: '空洞图片必须上传', trigger: ['blur', 'change'] }],
  detectionTime: [{ required: true, message: '探测时间必选', trigger: ['blur', 'change'] }],
  riskLevel: [{ required: true, message: '风险等级必选', trigger: ['blur', 'change'] }],
  position: [{ required: true, message: '空洞位置必填', trigger: ['blur', 'change'] }],
  lnglat: [{ required: true, message: '经纬度必选', trigger: ['blur', 'change'] }],
} // 前端校验规则
// 字典
const riskLevelList = ref<{ name: string;value: string;id: string }[]>() // 风险等级
const handlerList = ref<{ name: string;value: string;id: string }[]>([]) // 是否治理
const fetchDict = () => {
  getDictByCode('holeRiskLevel').then((res) => {
    riskLevelList.value = res.data
  })
  getDictByCode('isAlarm').then((response) => {
    handlerList.value = response.data
  })
}
fetchDict()
// 重置
const resetForm = () => {
  areaForm.value = {
    abnormolWave: '', // 异常波形
    detectionDistance: '', // 探测距离
    holeSize: '', // 空洞大小
    holeType: '', // 空洞类型
    holePicture: '', // 空洞图片
    detectionTime: '', // 探测时间
    riskLevel: '', // 风险等级
    lnglat: '', // 经纬度
    longitude: '', // 经度
    latitude: '', // 纬度
    position: '', // 空洞位置
    isHandle: '', // 是否进行治理
  }
  nextTick(() => {
    dataFormRef.value?.clearValidate()
  })
}
// 取消
const cancel = () => {
  resetForm()
  dialogFormVisible.value = false
}

// 保存数据
const saveData = () => {
  // addHole
  // editHole
  (dialogFormTyle.value === 'create' ? addHole : editHole)(areaForm.value).then((res) => {
    ElMessage.success('操作成功')
    emits('refresh')
    resetForm()
    dialogFormVisible.value = false
  })
}
// 确认
const confirm = async (formEl: FormInstance | undefined) => {
  if (!formEl) { return }
  await formEl.validate((valid, fields) => {
    if (valid) {
      if (valid) {
        saveData()
      }
    }
  })
}
// 地图选点
const mapRef = ref()
const selectMap = () => {
  mapRef.value.initDialog([areaForm.value.longitude, areaForm.value.latitude])
}
const confirmMap = (location: any) => {
  console.log(location, '选择的位置')
  areaForm.value.longitude = location[0]
  areaForm.value.latitude = location[1]
  areaForm.value.lnglat = location.join()
  getLocation(areaForm.value.lnglat).then((res) => {
    if (res.data.info === 'OK') {
      areaForm.value.position = res.data.regeocode.formatted_address
    }
    else {
      areaForm.value.position = '/'
    }
  })
}
// 初始化对话框
const initDialog = (type: string, row: any) => {
  dialogFormVisible.value = true
  dialogFormTyle.value = type
  areaForm.value = JSON.parse(JSON.stringify(row))
  if (type === 'create') {
    resetForm()
  }
}
defineExpose({
  initDialog,
})
</script>

<template>
  <el-dialog v-model="dialogFormVisible" :title="typeDict[dialogFormTyle]" append-to-body width="35%">
    <!-- 地图选点 -->
    <map-dialog ref="mapRef" @confirm="confirmMap" />
    <el-form ref="dataFormRef" :class="[dialogFormTyle === 'detail' ? 'isDetail' : '']" :rules="rules" :model="areaForm" label-position="right" label-width="120px" :disabled="dialogFormTyle === 'detail'">
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="异常波形" prop="abnormolWave">
            <el-input v-model.trim="areaForm.abnormolWave" type="text" placeholder="异常波形" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="探测距离" prop="detectionDistance">
            <el-input v-model.trim="areaForm.detectionDistance" type="text" placeholder="探测距离" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="空洞大小" prop="holeSize">
            <el-input v-model.trim="areaForm.holeSize" type="text" placeholder="空洞大小" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="空洞类型" prop="holeType">
            <el-input v-model.trim="areaForm.holeType" type="text" placeholder="空洞类型" />
          </el-form-item>
        </el-col>
      </el-row>
      <!-- <el-row :gutter="24">
        <el-col :span="12">
          <el-form-item label="空洞图片" prop="holePicture">
            <upload-file v-model.trim="areaForm.holePicture" />
          </el-form-item>
        </el-col>
      </el-row> -->
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="探测时间" prop="detectionTime">
            <el-date-picker
              v-model="areaForm.detectionTime"
              type="date"
              placeholder="探测时间"
              style="width: 100%;"
              format="YYYY-MM-DD"
              value-format="YYYY-MM-DD HH:mm:ss"
            />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="风险等级" prop="riskLevel">
            <el-select v-model="areaForm.riskLevel" class="short-input" placeholder="风险等级" clearable style="width: 100%;">
              <el-option v-for="item in riskLevelList" :key="item.id" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="空洞经纬度" prop="lnglat">
            <el-input v-model.trim="areaForm.lnglat" type="text" placeholder="空洞经纬度" />
          </el-form-item>
        </el-col>
        <el-col v-if="dialogFormTyle !== 'detail'" :span="4">
          <div style="margin-left: 15px;" class="icon-map" @click="selectMap">
            <el-tooltip
              class="box-item"
              effect="dark"
              content="地图选点"
              placement="top"
            >
              <svg-icon name="icon-xunjian" style="width: 35px;height: 35px;" />
            </el-tooltip>
          </div>
        </el-col>
      </el-row>
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="空洞位置">
            <el-tooltip
              class="box-item"
              effect="dark"
              :content="areaForm.position"
              placement="bottom"
            >
              <el-input v-model.trim="areaForm.position" type="textarea" maxlength="100" show-word-limit :rows="2" placeholder="空洞位置" />
            </el-tooltip>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="是否进行治理">
            <el-select v-model="areaForm.isHandle" class="short-input" placeholder="是否进行治理" clearable style="width: 100%;">
              <el-option v-for="item in handlerList" :key="item.id" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <!-- <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="治理描述">
            <el-input v-model.trim="areaForm.gasLevel" type="textarea" show-word-limit :rows="3" maxlength="100" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="24">
        <el-col :span="20">
          <el-form-item label="备注">
            <el-input v-model.trim="areaForm.gasLevel" type="textarea" show-word-limit :rows="3" maxlength="100" />
          </el-form-item>
        </el-col>
      </el-row> -->
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <div v-if="dialogFormTyle !== 'detail'">
          <el-button type="primary" @click="confirm(dataFormRef)">
            确认
          </el-button>
          <el-button type="info" @click="cancel">
            取消
          </el-button>
        </div>
        <div v-else>
          <el-button type="primary" @click="cancel">
            确认
          </el-button>
        </div>
      </div>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
.icon-map {
  &:hover {
    cursor: pointer;
  }
}

.el-dialog {
  width: 700px;
}

.el-select {
  width: 100%;
}
</style>

<style lang="scss" scoped>
// 样式
.isDetail {
  ::v-deep {
    .el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap > .el-form-item__label::before,
    .el-form-item.is-required:not(.is-no-asterisk) > .el-form-item__label::before {
      content: "";
      display: none;
    }
  }
}
</style>