ProductForm.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. <template>
  2. <Dialog :title="dialogTitle" v-model="dialogVisible">
  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="deviceType">
  14. <el-select
  15. v-model="formData.deviceType"
  16. placeholder="请选择设备类型"
  17. :disabled="formType === 'update'"
  18. >
  19. <el-option
  20. v-for="dict in getIntDictOptions(DICT_TYPE.IOT_PRODUCT_DEVICE_TYPE)"
  21. :key="dict.value"
  22. :label="dict.label"
  23. :value="dict.value"
  24. />
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item
  28. v-if="formData.deviceType === 0 || formData.deviceType === 2"
  29. label="联网方式"
  30. prop="netType"
  31. >
  32. <el-select
  33. v-model="formData.netType"
  34. placeholder="请选择联网方式"
  35. :disabled="formType === 'update'"
  36. >
  37. <el-option
  38. v-for="dict in getIntDictOptions(DICT_TYPE.IOT_NET_TYPE)"
  39. :key="dict.value"
  40. :label="dict.label"
  41. :value="dict.value"
  42. />
  43. </el-select>
  44. </el-form-item>
  45. <el-form-item v-if="formData.deviceType === 1" label="接入网关协议" prop="protocolType">
  46. <el-select
  47. v-model="formData.protocolType"
  48. placeholder="请选择接入网关协议"
  49. :disabled="formType === 'update'"
  50. >
  51. <el-option
  52. v-for="dict in getIntDictOptions(DICT_TYPE.IOT_PROTOCOL_TYPE)"
  53. :key="dict.value"
  54. :label="dict.label"
  55. :value="dict.value"
  56. />
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item label="数据格式" prop="dataFormat">
  60. <el-select
  61. v-model="formData.dataFormat"
  62. placeholder="请选择接数据格式"
  63. :disabled="formType === 'update'"
  64. >
  65. <el-option
  66. v-for="dict in getIntDictOptions(DICT_TYPE.IOT_DATA_FORMAT)"
  67. :key="dict.value"
  68. :label="dict.label"
  69. :value="dict.value"
  70. />
  71. </el-select>
  72. </el-form-item>
  73. <el-form-item label="数据校验级别" prop="validateType">
  74. <el-radio-group v-model="formData.validateType" :disabled="formType === 'update'">
  75. <el-radio
  76. v-for="dict in getIntDictOptions(DICT_TYPE.IOT_VALIDATE_TYPE)"
  77. :key="dict.value"
  78. :label="dict.value"
  79. >
  80. {{ dict.label }}
  81. </el-radio>
  82. </el-radio-group>
  83. </el-form-item>
  84. <el-form-item label="产品描述" prop="description">
  85. <el-input type="textarea" v-model="formData.description" placeholder="请输入产品描述" />
  86. </el-form-item>
  87. </el-form>
  88. <template #footer>
  89. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  90. <el-button @click="dialogVisible = false">取 消</el-button>
  91. </template>
  92. </Dialog>
  93. </template>
  94. <script setup lang="ts">
  95. import { ProductApi, ProductVO } from '@/api/iot/product'
  96. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  97. defineOptions({ name: 'IoTProductForm' })
  98. const { t } = useI18n()
  99. const message = useMessage()
  100. const dialogVisible = ref(false)
  101. const dialogTitle = ref('')
  102. const formLoading = ref(false)
  103. const formType = ref('')
  104. const formData = ref({
  105. name: undefined,
  106. id: undefined,
  107. productKey: undefined,
  108. protocolId: undefined,
  109. categoryId: undefined,
  110. description: undefined,
  111. validateType: undefined,
  112. status: undefined,
  113. deviceType: undefined,
  114. netType: undefined,
  115. protocolType: undefined,
  116. dataFormat: undefined
  117. })
  118. const formRules = reactive({
  119. name: [{ required: true, message: '产品名称不能为空', trigger: 'blur' }],
  120. deviceType: [{ required: true, message: '设备类型不能为空', trigger: 'change' }],
  121. netType: [
  122. {
  123. // TODO @haohao:0、1、/2 最好前端也枚举下;另外,这里的 required 可以直接设置为 true。然后表单那些 v-if。只要不存在,它自动就不校验了哈
  124. required: formData.deviceType === 0 || formData.deviceType === 2,
  125. message: '联网方式不能为空',
  126. trigger: 'change'
  127. }
  128. ],
  129. protocolType: [
  130. { required: formData.deviceType === 1, message: '接入网关协议不能为空', trigger: 'change' }
  131. ],
  132. dataFormat: [{ required: true, message: '数据格式不能为空', trigger: 'change' }],
  133. validateType: [{ required: true, message: '数据校验级别不能为空', trigger: 'change' }]
  134. })
  135. const formRef = ref()
  136. /** 打开弹窗 */
  137. const open = async (type: string, id?: number) => {
  138. dialogVisible.value = true
  139. dialogTitle.value = t('action.' + type)
  140. formType.value = type
  141. resetForm()
  142. if (id) {
  143. formLoading.value = true
  144. try {
  145. formData.value = await ProductApi.getProduct(id)
  146. } finally {
  147. formLoading.value = false
  148. }
  149. }
  150. }
  151. defineExpose({ open, close: () => (dialogVisible.value = false) })
  152. /** 提交表单 */
  153. const emit = defineEmits(['success'])
  154. const submitForm = async () => {
  155. await formRef.value.validate()
  156. formLoading.value = true
  157. try {
  158. const data = formData.value as unknown as ProductVO
  159. if (formType.value === 'create') {
  160. await ProductApi.createProduct(data)
  161. message.success(t('common.createSuccess'))
  162. } else {
  163. await ProductApi.updateProduct(data)
  164. message.success(t('common.updateSuccess'))
  165. }
  166. dialogVisible.value = false // 确保关闭弹框
  167. emit('success')
  168. } finally {
  169. formLoading.value = false
  170. }
  171. }
  172. /** 重置表单 */
  173. const resetForm = () => {
  174. formData.value = {
  175. name: undefined,
  176. id: undefined,
  177. productKey: undefined,
  178. protocolId: undefined,
  179. categoryId: undefined,
  180. description: undefined,
  181. validateType: undefined,
  182. status: undefined,
  183. deviceType: undefined,
  184. netType: undefined,
  185. protocolType: undefined,
  186. dataFormat: undefined
  187. }
  188. formRef.value?.resetFields()
  189. }
  190. </script>