Newer
Older
robot_dog_patrol_front / src / views / device / deviceManage / editDialog.vue
<!-- 新增、编辑设备 -->
<script lang="ts" setup name="DeviceManageEdit">
import { reactive, ref } from 'vue'
import { ElMessage, type FormInstance, type FormRules } from 'element-plus'
import { addDevice, editDevice } from '@/api/device/deviceManage'
import { isIp, isPort } from '@/utils/validate'
const emits = defineEmits(['closeRefresh'])
const dialogStatus = ref('add')
const dialogVisible = ref(false) // 弹窗显示隐藏
// 显示标题
const textMap: { [key: string]: string } = {
  detail: '详情',
  edit: '编辑',
  add: '新增',
}

// 表单数据对象
const formData = ref({
  id: '', //	主键
  robotCode: '', //	设备编号
  robotIp: '', //	设备ip
  robotName: '', //	设备名称
  robotPort: '', //	设备端口
  // robotCell: '', //	电量
  // robotStatus: '', //	设备状态(1,在线,离线)
  // routeId: '', // 正在执行路线id
  // valid: '', //	删除状态(1,有效,0无效)
})
const btnLoading = ref(false) // 保存按钮加载状态
const formDataRef = ref<FormInstance>() // 表单对象

const validateIp = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error('ip必填'))
  }
  else if (!isIp(value)) {
    callback(new Error('请输入正确的ip'))
  }
  else {
    callback()
  }
}

const validatePort = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error('端口必填'))
  }
  else if (!isPort(value)) {
    callback(new Error('请输入正确的端口'))
  }
  else {
    callback()
  }
}
// 校验规则
const rules = reactive<FormRules>({
  robotCode: [{ required: true, message: '设备编号必填', trigger: ['blur', 'change'] }],
  robotName: [{ required: true, message: '设备名称必填', trigger: ['blur', 'change'] }],
  robotIp: [{ required: true, validator: validateIp, trigger: ['blur', 'change'] }],
  robotPort: [{ required: true, validator: validatePort, trigger: ['blur', 'change'] }],
})

// -------------------------------------------------------------------------------------------
// 表单提交
function submitForm() {
  // return ElMessage.info('敬请期待')
  if (formDataRef.value) {
    formDataRef.value?.validate((valid: boolean) => {
      if (valid) {
        const params = {
          ...formData.value,
        }
        if (dialogStatus.value === 'add') { // 新建
          addDevice(params).then((res) => {
            ElMessage.success('新增成功')
            closeRefresh()
          })
        }
        else if (dialogStatus.value === 'edit') { // 编辑
          editDevice(params).then((res) => {
            ElMessage.success('编辑成功')
            closeRefresh()
          })
        }
      }
    })
  }
}

// 重置表单
function resetForm() {
  formData.value = {
    id: '', //	主键
    robotCode: '', //	设备编号
    robotIp: '', //	设备ip
    robotName: '', //	设备名称
    robotPort: '', //	设备端口
    // robotCell: '', //	电量
    // robotStatus: '', //	设备状态(1,在线,离线)
    // routeId: '', // 正在执行路线id
    // valid: '', //	删除状态(1,有效,0无效)
  }
}
// -----------------------------------初始化、关闭对话框相关-----------------------------------------
function initDialog(dialogstatus: string, row: any) {
  dialogVisible.value = true
  if (dialogstatus === 'edit' || dialogstatus === 'detail') {
    formData.value.id = row.id
    formData.value.robotCode = row.robotCode //	设备编号
    formData.value.robotIp = row.robotIp //	设备ip
    formData.value.robotName = row.robotName //	设备名称
    formData.value.robotPort = row.robotPort //	设备端口
    // formData.value.robotCell = '' //	电量
    // formData.value.robotStatus = '' //	设备状态(1在线,离线)
    // formData.value.routeId = '' // 正在执行路线id
    // formData.value.valid = '' //	删除状态(1,有效,0无效)
  }

  // 详情隐藏表单校验
  if (dialogstatus === 'detail') {
    formDataRef.value?.clearValidate()
  }
  dialogStatus.value = dialogstatus // 类型 新建add 编辑edit 详情detail
  btnLoading.value = false
}

// 关闭并刷新
function closeRefresh() {
  dialogVisible.value = false
  resetForm()
  if (formDataRef.value) {
    formDataRef.value?.clearValidate()
  }
  emits('closeRefresh')
}

// ----------------------- 以下是暴露的方法内容 ----------------------------
defineExpose({ initDialog })
</script>

<template>
  <el-dialog
    v-model="dialogVisible" :title="textMap[dialogStatus]" width="600" :before-close="closeRefresh" append-to-body
    :open-delay="0" :close-on-click-modal="false"
  >
    <el-form
      ref="formDataRef" :model="formData" :rules="rules" label-position="right" label-width="130px"
      class="form-container" size="default" :disabled="dialogStatus === 'detail'" @submit.prevent
    >
      <el-row :gutter="10">
        <el-col :span="24">
          <el-form-item label="设备编号" prop="robotCode">
            <el-input v-model="formData.robotCode" :disabled="dialogStatus === 'detail'" :maxlength="100" show-word-limit autosize type="textarea" placeholder="必填" />
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="设备名称" prop="robotName">
            <el-input v-model="formData.robotName" :disabled="dialogStatus === 'detail'" :maxlength="100" show-word-limit autosize type="textarea" placeholder="必填" />
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="ip" prop="robotIp">
            <el-input v-model="formData.robotIp" :disabled="dialogStatus === 'detail'" placeholder="必填" />
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="端口" prop="robotPort">
            <el-input v-model="formData.robotPort" :disabled="dialogStatus === 'detail'" placeholder="必填" />
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button v-if="dialogStatus !== 'detail'" :loading="btnLoading" type="primary" @click="submitForm">
          保存
        </el-button>
        <el-button @click="closeRefresh">
          取消
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
//
</style>