潘志宝
2024-11-22 df90c0c5cfa4de114798015b92120ad8ba8b4826
提交 | 用户 | 时间
6c2636 1 <template>
J 2   <Dialog v-model="dialogVisible" title="Tag导入" width="400">
3     <el-upload
4       ref="uploadRef"
5       v-model:file-list="fileList"
6       :action="importUrl + '?updateSupport=' + updateSupport + '&device=' + parameter"
7       :auto-upload="false"
8       :disabled="formLoading"
9       :headers="uploadHeaders"
10       :limit="1"
11       :on-error="submitFormError"
12       :on-exceed="handleExceed"
13       :on-success="submitFormSuccess"
14       accept=".xlsx, .xls"
15       drag
16     >
17       <Icon icon="ep:upload" />
18       <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
19       <template #tip>
20         <div class="el-upload__tip text-center">
21           <div class="el-upload__tip">
22             <el-checkbox v-model="updateSupport" />
23             是否更新已经存在的Tag数据
24           </div>
25           <span>仅允许导入 xls、xlsx 格式文件。</span>
26           <el-link
27             :underline="false"
28             style="font-size: 12px; vertical-align: baseline"
29             type="primary"
30             @click="importTemplate"
31           >
32             下载模板
33           </el-link>
34         </div>
35       </template>
36     </el-upload>
37     <template #footer>
38       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
39       <el-button @click="dialogVisible = false">取 消</el-button>
40     </template>
41   </Dialog>
42 </template>
43 <script lang="ts" setup>
44
45 import { getAccessToken, getTenantId } from '@/utils/auth'
46 import download from '@/utils/download'
47 import * as ModBusTagApi from "@/api/data/channel/modbus/tag"
48
49 defineOptions({ name: 'PointImportForm' })
50
51 const message = useMessage() // 消息弹窗
52
53 const dialogVisible = ref(false) // 弹窗的是否展示
54 const formLoading = ref(false) // 表单的加载中
55 const uploadRef = ref()
56 const importUrl = ref()
57 const uploadHeaders = ref() // 上传 Header 头
58 const fileList = ref([]) // 文件列表
59 const updateSupport = ref(0) // 是否更新已经存在的测点数据
60 const decName = ref()
61 const typeName = ref()
62 const parameter = ref()
63 let importTemplateApi = reactive()
64 /** 打开弹窗 */
65 const open = (name?: string, url?:string, tagApi?:Object, type?:string, params?:string) => {
66   importTemplateApi = tagApi
67   dialogVisible.value = true
68   updateSupport.value = 0
69   fileList.value = []
70   decName.value = name
71   typeName.value = type
72   parameter.value = params
73   importUrl.value =  import.meta.env.VITE_BASE_URL + import.meta.env.VITE_API_URL + url
74   resetForm()
75 }
76 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
77
78 /** 提交表单 */
79 const submitForm = async () => {
80   if (fileList.value.length == 0) {
81     message.error('请上传文件')
82     return
83   }
84   // 提交请求
85   uploadHeaders.value = {
86     Authorization: 'Bearer ' + getAccessToken(),
87     'tenant-id': getTenantId()
88   }
89   formLoading.value = true
90   uploadRef.value!.submit()
91 }
92
93 /** 文件上传成功 */
94 const emits = defineEmits(['success'])
95 const submitFormSuccess = (response: any) => {
96   if (response.code !== 0) {
97     message.error(response.msg)
98     formLoading.value = false
99     return
100   }
101   // 拼接提示语
102   const data = response.data
103   let text = '上传成功数量:' + data.createTagNames.length + ';'
104   for (let tagName of data.createTagNames) {
105     text += '< ' + tagName + ' >'
106   }
107   text += '更新成功数量:' + data.updateTagNames.length + ';'
108   for (const tagName of data.updateTagNames) {
109     text += '< ' + tagName + ' >'
110   }
111   text += '更新失败数量:' + Object.keys(data.failureTagNames).length + ';'
112   for (const tagName in data.failureTagNames) {
113     text += '< ' + tagName + ': ' + data.failureTagNames[tagName] + ' >'
114   }
115   message.alert(text)
116   formLoading.value = false
117   dialogVisible.value = false
118   // 发送操作成功的事件
119   emits('success')
120 }
121
122 /** 上传错误提示 */
123 const submitFormError = (): void => {
124   message.error('上传失败,请您重新上传!')
125   formLoading.value = false
126 }
127
128 /** 重置表单 */
129 const resetForm = async (): Promise<void> => {
130   // 重置上传状态和文件
131   formLoading.value = false
132   await nextTick()
133   uploadRef.value?.clearFiles()
134 }
135
136 /** 文件数超出提示 */
137 const handleExceed = (): void => {
138   message.error('最多只能上传一个文件!')
139 }
140
141 /** 下载模板操作 */
142 const importTemplate = async () => {
143   const res = await importTemplateApi
144   const excelName = typeName.value + '_' + decName.value + '_' + 'Tag导入模板.xlsx'
145   download.excel(res, excelName)
146 }
147 </script>