Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
a5565bb5
authored
Dec 15, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【功能新增】IoT:设备管理,增加批量导入
parent
87300563
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
159 additions
and
3 deletions
+159
-3
src/api/iot/device/device/index.ts
+6
-1
src/views/iot/device/device/DeviceImportForm.vue
+139
-0
src/views/iot/device/device/index.vue
+14
-2
No files found.
src/api/iot/device/device/index.ts
View file @
a5565bb5
...
...
@@ -123,7 +123,7 @@ export const DeviceApi = {
return
await
request
.
get
({
url
:
`/iot/device/simple-list?`
,
params
:
{
deviceType
}
})
},
// 获取设备属性最
新
数据
// 获取设备属性最
���
数据
getDevicePropertiesLatestData
:
async
(
params
:
any
)
=>
{
return
await
request
.
get
({
url
:
`/iot/device/data/latest`
,
params
})
},
...
...
@@ -131,5 +131,10 @@ export const DeviceApi = {
// 获取设备属性历史数据
getDevicePropertiesHistoryData
:
async
(
params
:
any
)
=>
{
return
await
request
.
get
({
url
:
`/iot/device/data/history`
,
params
})
},
// 获取导入模板
importDeviceTemplate
:
async
()
=>
{
return
await
request
.
download
({
url
:
`/iot/device/get-import-template`
})
}
}
src/views/iot/device/device/DeviceImportForm.vue
0 → 100644
View file @
a5565bb5
<
template
>
<Dialog
v-model=
"dialogVisible"
title=
"设备导入"
width=
"400"
>
<el-upload
ref=
"uploadRef"
v-model:file-list=
"fileList"
:action=
"importUrl + '?updateSupport=' + updateSupport"
:auto-upload=
"false"
:disabled=
"formLoading"
:headers=
"uploadHeaders"
:limit=
"1"
:on-error=
"submitFormError"
:on-exceed=
"handleExceed"
:on-success=
"submitFormSuccess"
accept=
".xlsx, .xls"
drag
>
<Icon
icon=
"ep:upload"
/>
<div
class=
"el-upload__text"
>
将文件拖到此处,或
<em>
点击上传
</em></div>
<template
#
tip
>
<div
class=
"el-upload__tip text-center"
>
<div
class=
"el-upload__tip"
>
<el-checkbox
v-model=
"updateSupport"
/>
是否更新已经存在的设备数据
</div>
<span>
仅允许导入 xls、xlsx 格式文件。
</span>
<el-link
:underline=
"false"
style=
"font-size: 12px; vertical-align: baseline"
type=
"primary"
@
click=
"importTemplate"
>
下载模板
</el-link>
</div>
</
template
>
</el-upload>
<
template
#
footer
>
<el-button
:disabled=
"formLoading"
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</Dialog>
</template>
<
script
lang=
"ts"
setup
>
import
{
DeviceApi
}
from
'@/api/iot/device/device'
import
{
getAccessToken
,
getTenantId
}
from
'@/utils/auth'
import
download
from
'@/utils/download'
defineOptions
({
name
:
'IoTDeviceImportForm'
})
const
message
=
useMessage
()
// 消息弹窗
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
formLoading
=
ref
(
false
)
// 表单的加载中
const
uploadRef
=
ref
()
const
importUrl
=
import
.
meta
.
env
.
VITE_BASE_URL
+
import
.
meta
.
env
.
VITE_API_URL
+
'/iot/device/import'
const
uploadHeaders
=
ref
()
// 上传 Header 头
const
fileList
=
ref
([])
// 文件列表
const
updateSupport
=
ref
(
0
)
// 是否更新已经存在的设备数据
/** 打开弹窗 */
const
open
=
()
=>
{
dialogVisible
.
value
=
true
updateSupport
.
value
=
0
fileList
.
value
=
[]
resetForm
()
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
/** 提交表单 */
const
submitForm
=
async
()
=>
{
if
(
fileList
.
value
.
length
==
0
)
{
message
.
error
(
'请上传文件'
)
return
}
// 提交请求
uploadHeaders
.
value
=
{
Authorization
:
'Bearer '
+
getAccessToken
(),
'tenant-id'
:
getTenantId
()
}
formLoading
.
value
=
true
uploadRef
.
value
!
.
submit
()
}
/** 文件上传成功 */
const
emits
=
defineEmits
([
'success'
])
const
submitFormSuccess
=
(
response
:
any
)
=>
{
if
(
response
.
code
!==
0
)
{
message
.
error
(
response
.
msg
)
formLoading
.
value
=
false
return
}
// 拼接提示语
const
data
=
response
.
data
let
text
=
'上传成功数量:'
+
data
.
createDeviceNames
.
length
+
';'
for
(
let
deviceName
of
data
.
createDeviceNames
)
{
text
+=
'
<
' + deviceName + '
>
'
}
text += '
更新成功数量:
' + data.updateDeviceNames.length + '
;
'
for (const deviceName of data.updateDeviceNames) {
text += '
<
' + deviceName + '
>
'
}
text += '
更新失败数量:
' + Object.keys(data.failureDeviceNames).length + '
;
'
for (const deviceName in data.failureDeviceNames) {
text += '
<
' + deviceName + '
:
' + data.failureDeviceNames[deviceName] + '
>
'
}
message.alert(text)
formLoading.value = false
dialogVisible.value = false
// 发送操作成功的事件
emits('
success
')
}
/** 上传错误提示 */
const submitFormError = (): void => {
message.error('
上传失败,请您重新上传!'
)
formLoading
.
value
=
false
}
/** 重置表单 */
const
resetForm
=
async
():
Promise
<
void
>
=>
{
// 重置上传状态和文件
formLoading
.
value
=
false
await
nextTick
()
uploadRef
.
value
?.
clearFiles
()
}
/** 文件数超出提示 */
const
handleExceed
=
():
void
=>
{
message
.
error
(
'最多只能上传一个文件!'
)
}
/** 下载模板操作 */
const
importTemplate
=
async
()
=>
{
const
res
=
await
DeviceApi
.
importDeviceTemplate
()
download
.
excel
(
res
,
'设备导入模版.xls'
)
}
</
script
>
src/views/iot/device/device/index.vue
View file @
a5565bb5
...
...
@@ -123,6 +123,9 @@
>
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
</el-button>
<el-button
type=
"warning"
plain
@
click=
"handleImport"
v-hasPermi=
"['iot:device:import']"
>
<Icon
icon=
"ep:upload"
/>
导入
</el-button>
<el-button
type=
"primary"
plain
...
...
@@ -355,6 +358,8 @@
<DeviceForm
ref=
"formRef"
@
success=
"getList"
/>
<!-- 分组表单组件 -->
<DeviceGroupForm
ref=
"groupFormRef"
@
success=
"getList"
/>
<!-- 导入表单组件 -->
<DeviceImportForm
ref=
"importFormRef"
@
success=
"getList"
/>
</template>
<
script
setup
lang=
"ts"
>
...
...
@@ -366,6 +371,7 @@ import { ProductApi, ProductVO } from '@/api/iot/product/product'
import
{
DeviceGroupApi
,
DeviceGroupVO
}
from
'@/api/iot/device/group'
import
download
from
'@/utils/download'
import
DeviceGroupForm
from
'./DeviceGroupForm.vue'
import
DeviceImportForm
from
'./DeviceImportForm.vue'
/** IoT 设备列表 */
defineOptions
({
name
:
'IoTDevice'
})
...
...
@@ -373,7 +379,7 @@ defineOptions({ name: 'IoTDevice' })
const
message
=
useMessage
()
// 消息弹窗
const
{
t
}
=
useI18n
()
// 国际化
const
loading
=
ref
(
true
)
// 列表
���
加载中
const
loading
=
ref
(
true
)
// 列表加载中
const
list
=
ref
<
DeviceVO
[]
>
([])
// 列表的数据
const
total
=
ref
(
0
)
// 列表的总页数
const
queryParams
=
reactive
({
...
...
@@ -420,7 +426,7 @@ const resetQuery = () => {
handleQuery
()
}
/**
���
加/修改操作 */
/**
添
加/修改操作 */
const
formRef
=
ref
()
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
formRef
.
value
.
open
(
type
,
id
)
...
...
@@ -488,6 +494,12 @@ const openModel = (id: number) => {
push
({
name
:
'IoTDeviceDetail'
,
params
:
{
id
},
query
:
{
tab
:
'model'
}
})
}
/** 设备导入 */
const
importFormRef
=
ref
()
const
handleImport
=
()
=>
{
importFormRef
.
value
.
open
()
}
/** 初始化 **/
onMounted
(
async
()
=>
{
getList
()
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment