IotInfoFormTree.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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="filename">-->
  11. <!-- <el-input v-model="formData.filename" placeholder="请输入文件名称" />-->
  12. <!-- </el-form-item>-->
  13. <el-form-item :label="t('fileInfo.fileDirectory')" prop="classId">
  14. <el-tree-select
  15. disabled="true"
  16. v-model="formData.classId"
  17. :data="fileList"
  18. :props="defaultProps"
  19. check-strictly
  20. placeholder="请选择文件目录"
  21. value-key="id"
  22. />
  23. </el-form-item>
  24. <el-form-item :label="t('fileInfo.appendix')" prop="filePath" style="">
  25. <UploadFileAll style="vertical-align: middle"
  26. :is-show-tip="false"
  27. :disabled="formType==='detail'"
  28. v-model="formData.filePath"
  29. :multiple="formType === 'create'"
  30. :limit="formType === 'create' ? 5 : 1"
  31. />
  32. </el-form-item>
  33. <el-form-item :label="t('fileInfo.fileType')" prop="fileType">
  34. <el-select v-model="formData.fileType" placeholder="请选择" :disabled="formType==='detail'">
  35. <el-option
  36. v-for="dict in getStrDictOptions(DICT_TYPE.PMS_FILE_TYPE)"
  37. :key="dict.label"
  38. :label="dict.label"
  39. :value="dict.value"
  40. />
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item :label="t('fileInfo.remark')" prop="remark">
  44. <el-input v-model="formData.remark" :disabled="formType==='detail'" type="textarea" :placeholder="t('deviceForm.remarkHolder')" />
  45. </el-form-item>
  46. </el-form>
  47. <template #footer>
  48. <el-button @click="submitForm" type="primary" v-if="formType!=='detail'" :disabled="formLoading">{{t('common.ok')}}</el-button>
  49. <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
  50. </template>
  51. </Dialog>
  52. </template>
  53. <script setup lang="ts">
  54. import { IotInfoApi, IotInfoVO } from '@/api/pms/iotinfo'
  55. import { DICT_TYPE, getStrDictOptions } from '@/utils/dict'
  56. import {defaultProps, handleTree} from "@/utils/tree";
  57. import * as FileClassifyApi from "@/api/pms/info";
  58. import {IotTreeApi} from "@/api/system/tree";
  59. /** 资料 表单 */
  60. defineOptions({ name: 'IotInfoFormTree' })
  61. const { t } = useI18n() // 国际化
  62. const message = useMessage() // 消息弹窗
  63. const dialogVisible = ref(false) // 弹窗的是否展示
  64. const dialogTitle = ref('') // 弹窗的标题
  65. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  66. const fileList = ref<Tree[]>([]) // 树形结构
  67. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  68. const formData = ref({
  69. id: undefined,
  70. deviceId: undefined,
  71. classId: undefined,
  72. deptId: undefined,
  73. filename: undefined,
  74. fileType: undefined,
  75. filePath: undefined,
  76. remark: undefined,
  77. fileList: []
  78. })
  79. const formRules = reactive({
  80. // classId: [{ required: true, message: '文件不能为空', trigger: 'blur' }],
  81. filePath: [{ required: true, message: '文件不能为空', trigger: 'blur' }]
  82. })
  83. const formRef = ref() // 表单 Ref
  84. const props = defineProps<{
  85. deviceId: string
  86. classId: string
  87. nodeId: string
  88. }>()
  89. const classIdd = ref('')
  90. /** 打开弹窗 */
  91. const open = async (type: string, id?: number) => {
  92. // if (props.type==='file') {
  93. await getTreeInfo()
  94. // } else {
  95. // await getTree();
  96. // }
  97. dialogVisible.value = true
  98. dialogTitle.value = t('action.' + type)
  99. formType.value = type
  100. resetForm()
  101. // 修改时,设置数据
  102. if (id) {
  103. formLoading.value = true
  104. try {
  105. formData.value.classid =
  106. formData.value = await IotInfoApi.getIotInfo(id)
  107. } finally {
  108. formLoading.value = false
  109. }
  110. }else {
  111. formData.value.fileType = 'file'
  112. }
  113. classIdd.value = props.classId
  114. formData.value.classId = props.nodeId
  115. }
  116. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  117. const getTreeInfo = async () => {
  118. const res = await IotTreeApi.getSimpleTreeList()
  119. fileList.value = []
  120. fileList.value.push(...handleTree(res))
  121. // firstLevelKeys.value = treeList.value.map(node => node.id);
  122. // emits('success', treeList.value[0].id)
  123. }
  124. /** 获得分类树 */
  125. const getTree = async () => {
  126. const res = await FileClassifyApi.IotInfoClassifyApi.getSimpleInfotClassifyList(props.deviceId)
  127. fileList.value = []
  128. fileList.value.push(...handleTree(res))
  129. }
  130. /** 提交表单 */
  131. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  132. const submitForm = async () => {
  133. // 校验表单
  134. await formRef.value.validate()
  135. // 提交请求
  136. formLoading.value = true
  137. try {
  138. formData.value.fileList = formData.value.filePath
  139. formData.value.filePath = ''
  140. const data = formData.value as unknown as IotInfoVO
  141. if (formType.value === 'create') {
  142. data.deviceId = props.deviceId
  143. // data.filePath = data.filePath.join(',')
  144. await IotInfoApi.createIotInfo(data)
  145. message.success(t('common.createSuccess'))
  146. } else {
  147. await IotInfoApi.updateIotInfo(data)
  148. message.success(t('common.updateSuccess'))
  149. }
  150. dialogVisible.value = false
  151. // 发送操作成功的事件
  152. emit('success')
  153. } finally {
  154. formLoading.value = false
  155. }
  156. }
  157. /** 重置表单 */
  158. const resetForm = () => {
  159. formData.value = {
  160. id: undefined,
  161. deviceId: undefined,
  162. deptId: undefined,
  163. filename: undefined,
  164. fileType: undefined,
  165. filePath: undefined,
  166. remark: undefined
  167. }
  168. formRef.value?.resetFields()
  169. }
  170. </script>