Newer
Older
sensorHubPlusFront / src / views / basic / device / addDeviceDialog.vue
liyaguang 8 days ago 9 KB 配置下发页面
<!-- 添加 / 编辑 -->
<script name="AddDeviceDialog" lang="ts" setup>
import { ElMessage, ElMessageBox, dayjs } from 'element-plus'
import type { IDictType } from '../common-interface'
import type { IDeviceInfo } from './device-info'
import { addDevice, updateDevice } from '@/api/basic/device'
import useUserStore from '@/store/modules/user'
import { getProductListPage } from '@/api/basic/product'
import { getGroupListPage } from '@/api/basic/group'
import { getDictByCode } from '@/api/system/dict'
const emit = defineEmits(['recordSaved'])
const $props = defineProps({
  needGroup: {
    type: Boolean,
    default: false
  },
})
// 从路由中传过来的参数
const type = ref<string>('')
const id = ref<string>('')

const userInfo = useUserStore()
const isFirst = ref(true)

const title = ref('')

const infoFormRef = ref()

const deviceInfo = ref<IDeviceInfo>({
  id: '',
  devcode: '',
  groupId: '',
  deviceType: '',
  model: '',
  productId: '',
  encipherType: '',
  imei: '',
  iccid: '',
  createUserId: '',
  createTime: '',
})

const deviceInfoRules = ref({
  devcode: [{ required: true, message: '设备编号不能为空', trigger: 'blur' }],
  groupId: [{ required: true, message: '所属分组不能为空,请选择', trigger: ['blur', 'change'] }],
  productId: [{ required: true, message: '所属产品不能为空,请选择', trigger: ['blur', 'change'] }],
}) // 表单验证规则

const deviceTypeDict = ref<Array<IDictType>>([])  // 设备类型列表
const encipherTypeDict = ref<Array<IDictType>>([]) // 加密方式
const productLoading = ref(false)
const productList = ref<any[]>([]) // 产品列表
const groupLoading = ref(false)
const groupList = ref<any[]>([]) // 分组列表

const showDialog = ref<boolean>(false)
const loadingBtn = ref(false)
// 逻辑
const resetForm = () => {
  sessionStorage.removeItem('deviceInfo') // 返回列表时 将缓存中的数据删除

  deviceInfo.value = {
    id: '',
    devcode: '',
    groupId: '',
    deviceType: '',
    model: '',
    productId: '',
    encipherType: '',
    imei: '',
    iccid: '',
    createUserId: '',
    createTime: '',
  }

  infoFormRef.value.clearValidate()
  showDialog.value = false
}

// 添加
const saveInfo = () => {
  loadingBtn.value = true
  // 将创建时间改为提交的时间
  deviceInfo.value.createTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
  addDevice(deviceInfo.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')

      emit('recordSaved')
      resetForm()
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
    loadingBtn.value = false
  }).catch(() => {
    loadingBtn.value = false
  })
}
// 编辑
const updateInfoById = () => {
  loadingBtn.value = true
  updateDevice(deviceInfo.value).then((res) => {
    if (res.code === 200) {
      // 提示保存成功
      ElMessage.success('保存成功')

      emit('recordSaved')
      resetForm()
    }
    else {
      // 提示失败信息
      ElMessage.error(`保存失败:${res.message}`)
    }
    loadingBtn.value = false
  }).catch(() => {
    loadingBtn.value = false
  })
}

// 保存
const saveForm = async () => {
  if (!infoFormRef) { return }

  await infoFormRef.value.validate((valid: boolean, fields: any) => {
    if (valid === true) {
      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
        if (type.value === 'create') {
          saveInfo()
        }
        else if (type.value === 'update') {
          updateInfoById()
        }
      })
    }
  })
}

const initDialog = (params: any) => {
  isFirst.value = true
  // 从路由中获取参数
  type.value = params.type
  id.value = params.id !== undefined ? params.id : ''

  // if (sessionStorage.getItem('deviceType') !== undefined) {
  //   deviceTypeDict.value = JSON.parse(sessionStorage.getItem('deviceType')!)
  // }
  // if (sessionStorage.getItem('encipherType') !== undefined) {
  //   encipherTypeDict.value = JSON.parse(sessionStorage.getItem('encipherType')!)
  // }

  switch (params.type) {
    case 'create':
      title.value = '新增设备'

      deviceInfo.value.createUserId = userInfo.id
      deviceInfo.value.groupId = params.groupId

      break
    case 'update':
      title.value = '编辑设备'

      deviceInfo.value = JSON.parse(sessionStorage.getItem('deviceInfo')!)
      deviceInfo.value.deviceType = deviceInfo.value.deviceType.toString()

      break
    default:
      title.value = ''
      break
  }

  nextTick(() => {
    infoFormRef.value.clearValidate()
  })

  showDialog.value = true
  setTimeout(() => {
    isFirst.value = false
  })
}

defineExpose({
  initDialog,
})

// 获取字典相关
const fetchDict = () => {
  // 产品列表
  productLoading.value = true
  getProductListPage({ limit: 9999, offset: 1 }).then(res => {
    productList.value = res.data.rows
    productLoading.value = false
  }).catch(() => {
    productLoading.value = false
  })
  // 分组列表
  groupLoading.value = true
  getGroupListPage({ limit: 9999, offset: 1 }).then(res => {
    groupList.value = res.data.rows
    groupLoading.value = false
  }).catch(() => {
    groupLoading.value = false
  })

  // 设备类型
  getDictByCode('deviceType').then((res: any) => {
    deviceTypeDict.value = res.data
  })
  // 加密方式
  getDictByCode('encipherType').then((res: any) => {
    encipherTypeDict.value = res.data
  })
}
fetchDict()

watch(() => deviceInfo.value.productId, (newVal) => {
  // if (isFirst.value) {
  //   return
  // }
  if (newVal) {
    const product = productList.value.find(item => item.id === newVal)
    deviceInfo.value.model = product.model
    deviceInfo.value.encipherType = product.encipherType
    deviceInfo.value.deviceType = product.deviceType
  }
  else {
    deviceInfo.value.model = ''
    deviceInfo.value.encipherType = ''
    deviceInfo.value.deviceType = ''
  }
})
</script>

<template>
  <el-dialog v-model="showDialog" :title="title" :append-to-body="true" :close-on-click-modal="false" :modal="true"
    @closed="resetForm" width="450px">
    <detail-block title="">
      <el-form ref="infoFormRef" :model="deviceInfo" :rules="deviceInfoRules" label-position="right" label-width="110px"
        stripe>
        <el-row :gutter="24">
          <el-col :span="22">
            <el-form-item label="设备编号" prop="devcode">
              <el-input v-model="deviceInfo.devcode" placeholder="请输入设备编号" :disabled="type === 'update'" clearable />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="22">
            <el-form-item label="所属产品" prop="productId">
              <el-select v-model="deviceInfo.productId" placeholder="请选择所属产品" clearable filterable
                :loading="productLoading">
                <el-option v-for="dict in productList" :key="dict.id" :value="dict.id" :label="dict.name" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row v-if="$props.needGroup" :gutter="24">
          <el-col :span="22">
            <el-form-item label="所属分组" prop="groupId">
              <el-select v-model="deviceInfo.groupId" placeholder="请选择所属分组" clearable filterable
                :loading="groupLoading">
                <el-option v-for="dict in groupList" :key="dict.id" :value="dict.id" :label="dict.groupName" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="22">
            <el-form-item label="设备类型" prop="deviceType">
              <el-select v-model="deviceInfo.deviceType" placeholder="" clearable disabled>
                <el-option v-for="dict in deviceTypeDict" :key="dict.id" :value="dict.value" :label="dict.name" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="24">
          <el-col :span="22">
            <el-form-item label="设备型号">
              <!-- <el-select v-model="deviceInfo.model" placeholder="" clearable filterable disabled /> -->
              <el-input v-model="deviceInfo.model" placeholder="" clearable disabled />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="22">
            <el-form-item label="加密方式">
              <el-select v-model="deviceInfo.encipherType" placeholder="" clearable disabled>
                <el-option v-for="dict in encipherTypeDict" :key="dict.id" :value="dict.value" :label="dict.name" />
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="22">
            <el-form-item label="设备IMEI">
              <el-input v-model="deviceInfo.imei" placeholder="请输入设备IMEI号" clearable />
            </el-form-item>
          </el-col>
        </el-row>

        <el-row :gutter="24">
          <el-col :span="22">
            <el-form-item label="ICCID">
              <el-input v-model="deviceInfo.iccid" placeholder="请输入ICCID号" clearable />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </detail-block>

    <template #footer>
      <span class="dialog-footer">
        <el-button type="primary" @click="saveForm" :disabled="loadingBtn" :loading="loadingBtn">
          保存
        </el-button>
        <el-button @click="resetForm">取消</el-button>
      </span>
    </template>
  </el-dialog>
</template>