OtaTaskForm.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <template>
  2. <el-dialog v-model="dialogVisible" title="新增升级任务" width="800px" append-to-body>
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formRules"
  7. label-width="100px"
  8. v-loading="formLoading"
  9. >
  10. <el-form-item label="任务名称" prop="name">
  11. <el-input v-model="formData.name" placeholder="请输入任务名称" />
  12. </el-form-item>
  13. <el-form-item label="任务描述" prop="description">
  14. <el-input
  15. v-model="formData.description"
  16. type="textarea"
  17. :rows="3"
  18. placeholder="请输入任务描述"
  19. />
  20. </el-form-item>
  21. <el-form-item label="升级范围" prop="deviceScope">
  22. <el-select v-model="formData.deviceScope" placeholder="请选择升级范围" class="w-full">
  23. <el-option
  24. v-for="item in Object.values(IoTOtaTaskDeviceScopeEnum)"
  25. :key="item.value"
  26. :label="item.label"
  27. :value="item.value"
  28. />
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item
  32. label="选择设备"
  33. prop="deviceIds"
  34. v-if="formData.deviceScope === IoTOtaTaskDeviceScopeEnum.SELECT.value"
  35. >
  36. <el-select
  37. v-model="formData.deviceIds"
  38. multiple
  39. placeholder="请选择设备"
  40. class="w-full"
  41. filterable
  42. reserve-keyword
  43. >
  44. <el-option
  45. v-for="device in devices"
  46. :key="device.id"
  47. :label="
  48. device.nickname ? `${device.deviceName} (${device.nickname})` : device.deviceName
  49. "
  50. :value="device.id"
  51. />
  52. </el-select>
  53. </el-form-item>
  54. </el-form>
  55. <template #footer>
  56. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  57. <el-button @click="dialogVisible = false">取 消</el-button>
  58. </template>
  59. </el-dialog>
  60. </template>
  61. <script setup lang="ts">
  62. import { IoTOtaTaskApi, OtaTask } from '@/api/iot/ota/task'
  63. import { IoTOtaTaskDeviceScopeEnum } from '@/views/iot/utils/constants'
  64. import { DeviceApi, DeviceVO } from '@/api/iot/device/device'
  65. /** IoT OTA 升级任务表单 */
  66. defineOptions({ name: 'OtaTaskForm' })
  67. const props = defineProps<{
  68. firmwareId: number
  69. productId: number
  70. }>()
  71. const message = useMessage() // 消息弹窗
  72. const dialogVisible = ref(false) // 弹窗的是否展示
  73. const formLoading = ref(false) // 表单的加载中:修改时的数据加载
  74. const formData = ref<OtaTask>({
  75. name: '',
  76. deviceScope: IoTOtaTaskDeviceScopeEnum.ALL.value,
  77. firmwareId: props.firmwareId,
  78. description: '',
  79. deviceIds: []
  80. })
  81. const formRef = ref() // 表单 Ref
  82. const formRules = {
  83. name: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],
  84. deviceScope: [{ required: true, message: '请选择升级范围', trigger: 'change' }],
  85. deviceIds: [{ required: true, message: '请至少选择一个设备', trigger: 'change' }]
  86. }
  87. const devices = ref<DeviceVO[]>([]) // 设备选择相关
  88. /** 打开弹窗 */
  89. const open = async () => {
  90. dialogVisible.value = true
  91. resetForm()
  92. // 加载设备列表
  93. devices.value = (await DeviceApi.getDeviceListByProductId(props.productId)) || []
  94. }
  95. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  96. /** 提交表单 */
  97. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  98. const submitForm = async () => {
  99. // 校验表单
  100. await formRef.value.validate()
  101. // 提交请求
  102. formLoading.value = true
  103. try {
  104. await IoTOtaTaskApi.createOtaTask(formData.value)
  105. message.success('创建成功')
  106. dialogVisible.value = false
  107. // 发送操作成功的事件
  108. emit('success')
  109. } finally {
  110. formLoading.value = false
  111. }
  112. }
  113. /** 重置表单 */
  114. const resetForm = () => {
  115. formData.value = {
  116. name: '',
  117. deviceScope: IoTOtaTaskDeviceScopeEnum.ALL.value,
  118. firmwareId: props.firmwareId,
  119. description: '',
  120. deviceIds: []
  121. }
  122. formRef.value?.resetFields()
  123. }
  124. </script>