fix device and alert

main
chenshuichuan 2 years ago
parent da225628c0
commit 2fedf94894

@ -0,0 +1,76 @@
import request from '@/config/axios'
// 告警配置 VO
export interface AlertVO {
id: number // ID
alertCode: string // 编码
alertName: string // 名称
alertType: string // 告警类型
alertLevel: string // 告警等级
content: string // 告警内容
condition: string // 告警条件
conditionFormula: string // 逻辑表达式
alertAudio: string // 告警音频
isRepeat: boolean // 重复告警
noRepeatDuration: number // 不重复间隔
isEnable: boolean // 是否启用
}
// 告警配置 API
export const AlertApi = {
// 查询告警配置分页
getAlertPage: async (params: any) => {
return await request.get({ url: `/iot/alert/page`, params })
},
// 查询告警配置详情
getAlert: async (id: number) => {
return await request.get({ url: `/iot/alert/get?id=` + id })
},
// 新增告警配置
createAlert: async (data: AlertVO) => {
return await request.post({ url: `/iot/alert/create`, data })
},
// 修改告警配置
updateAlert: async (data: AlertVO) => {
return await request.put({ url: `/iot/alert/update`, data })
},
// 删除告警配置
deleteAlert: async (id: number) => {
return await request.delete({ url: `/iot/alert/delete?id=` + id })
},
// 导出告警配置 Excel
exportAlert: async (params) => {
return await request.download({ url: `/iot/alert/export-excel`, params })
},
// ==================== 子表(告警记录) ====================
// 获得告警记录分页
getAlertRecordPage: async (params) => {
return await request.get({ url: `/iot/alert/alert-record/page`, params })
},
// 新增告警记录
createAlertRecord: async (data) => {
return await request.post({ url: `/iot/alert/alert-record/create`, data })
},
// 修改告警记录
updateAlertRecord: async (data) => {
return await request.put({ url: `/iot/alert/alert-record/update`, data })
},
// 删除告警记录
deleteAlertRecord: async (id: number) => {
return await request.delete({ url: `/iot/alert/alert-record/delete?id=` + id })
},
// 获得告警记录
getAlertRecord: async (id: number) => {
return await request.get({ url: `/iot/alert/alert-record/get?id=` + id })
}
}

@ -0,0 +1,57 @@
import request from '@/config/axios'
// 告警记录 VO
export interface AlertRecordVO {
id: number // ID
alertCode: string // 编码
alertName: string // 名称
alertType: string // 告警类型
alertLevel: string // 告警等级
content: string // 告警内容
condition: string // 告警条件
conditionFormula: string // 逻辑表达式
dataValue: string // 数据值
dataType: string // 数据类型
dataUnit: string // 单位
dataTypeRemark: string // 描述
alertId: number // 告警ID
alertAudio: string // 告警音频
isRepeat: boolean // 重复告警
noRepeatDuration: number // 不重复间隔
dataId: number // 来源ID
dataCode: string // 来源编码
dataName: string // 来源名称
}
// 告警记录 API
export const AlertRecordApi = {
// 查询告警记录分页
getAlertRecordPage: async (params: any) => {
return await request.get({ url: `/iot/alert-record/page`, params })
},
// 查询告警记录详情
getAlertRecord: async (id: number) => {
return await request.get({ url: `/iot/alert-record/get?id=` + id })
},
// 新增告警记录
createAlertRecord: async (data: AlertRecordVO) => {
return await request.post({ url: `/iot/alert-record/create`, data })
},
// 修改告警记录
updateAlertRecord: async (data: AlertRecordVO) => {
return await request.put({ url: `/iot/alert-record/update`, data })
},
// 删除告警记录
deleteAlertRecord: async (id: number) => {
return await request.delete({ url: `/iot/alert-record/delete?id=` + id })
},
// 导出告警记录 Excel
exportAlertRecord: async (params) => {
return await request.download({ url: `/iot/alert-record/export-excel`, params })
}
}

@ -3,42 +3,18 @@ import request from '@/config/axios'
// 物联设备 VO
export interface DeviceVO {
id: number // ID
deviceConfigId: string // 设备配置id
deviceCode: string // 设备编号
deviceName: string // 设备名称
deviceType: string // 设备类型
siemensSeries: string // Siemens系列(S7-300、S7-1500)
siemensConnectParam: string // 连接参数(波特率,数据位,停止位,校验位 例如960081N
readCronType: string // 读取任务方式(0无1有)
readRepeatValue: number // 读取任务时间间隔
readRepeatUnit: string // 读取任务时间间隔单位
readCron: string // 读取任务时间表达式
writeCronType: string // 写入任务时间间隔
writeRepeatValue: number // 写入任务时间间隔
writeRepeatUnit: string // 写入任务时间间隔单位
writeCron: string // 写入任务时间表达式
localPersistent: string // 是否持久化(0不持久化1持久化)
uploadRate: string // 上传方式(1实时2自定义)
rateCount: number // 上传频率
modbusProtocol: string // modbus协议类型(serial-rtu)
modbusPattern: string // modbus模式(client)
portName: string // modbus串口号
modbusConnectParam: string // 连接参数(波特率,数据位,停止位,校验位 例如960081N
modbusReadAddrGap: string // 读地址是否连续(0否1是)
isUpload: string // 是否已下发(0下,1没下)
status: string // 状态
readTopic: string // 读主题
writeTopic: string // 写主题
gatewayId: number // 网关id
orgId: number // 组织设备id
deviceBrandId: number // 设备品牌id
offLineDuration: number // 离线间隔
lastOnlineTime: Date // 最后上线时间
remark: string // 备注
isEnable: boolean // 是否启用
deviceUseType: string // 数采设备类型
apIp: string // ap_ip
gateBridgeIp: string // 网桥ip
comServerIp: string // 串口服务器IP
comServerPort: string // 串口服务器端口
plcControllerIp: string // PLC控制器地址
plcScreenIp: string // PLC触控屏地址
orgMachineId: number // i机台id
}
// 物联设备 API
@ -72,10 +48,7 @@ export const DeviceApi = {
exportDevice: async (params) => {
return await request.download({ url: `/iot/device/export-excel`, params })
},
// 物联设备配置下发
pushDevice: async (id: number) => {
return await request.get({ url: `/iot/device/pushDevice?id=` + id })
},
// ==================== 子表(设备属性) ====================
// 获得设备属性分页
@ -100,5 +73,5 @@ export const DeviceApi = {
// 获得设备属性
getDeviceAttribute: async (id: number) => {
return await request.get({ url: `/iot/device/device-attribute/get?id=` + id })
},
}
}
}

@ -272,4 +272,6 @@ export enum DICT_TYPE {
IOT_DEVICE_DATA_TYPE = "iot_device_data_type",
IOT_PROXY_SERVER_STATUS = "iot_proxy_server_status",
IOT_DEVICE_USE_TYPE = "iot_device_use_type",
IOT_ALERT_TYPE = "iot_alert_type",
}

@ -0,0 +1,171 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="编码" prop="alertCode">
<el-input v-model="formData.alertCode" placeholder="请输入编码" />
</el-form-item>
<el-form-item label="名称" prop="alertName">
<el-input v-model="formData.alertName" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="告警类型" prop="alertType">
<el-select v-model="formData.alertType" placeholder="请选择告警类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_ALERT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="告警等级" prop="alertLevel">
<el-input v-model="formData.alertLevel" placeholder="请输入告警等级" />
</el-form-item>
<el-form-item label="告警内容" prop="content">
<Editor v-model="formData.content" height="150px" />
</el-form-item>
<el-form-item label="告警条件" prop="condition">
<el-input v-model="formData.condition" placeholder="请输入告警条件" />
</el-form-item>
<el-form-item label="逻辑表达式" prop="conditionFormula">
<el-input v-model="formData.conditionFormula" placeholder="请输入逻辑表达式" />
</el-form-item>
<el-form-item label="告警音频" prop="alertAudio">
<el-input v-model="formData.alertAudio" placeholder="请输入告警音频" />
</el-form-item>
<el-form-item label="重复告警" prop="isRepeat">
<el-radio-group v-model="formData.isRepeat">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="不重复间隔" prop="noRepeatDuration">
<el-input v-model="formData.noRepeatDuration" placeholder="请输入不重复间隔" />
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { AlertApi, AlertVO } from '@/api/iot/alert'
/** 告警配置 表单 */
defineOptions({ name: 'AlertForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
alertCode: undefined,
alertName: undefined,
alertType: undefined,
alertLevel: undefined,
content: undefined,
condition: undefined,
conditionFormula: undefined,
alertAudio: undefined,
isRepeat: undefined,
noRepeatDuration: undefined,
isEnable: undefined
})
const formRules = reactive({
alertCode: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
alertName: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
alertAudio: [{ required: true, message: '告警音频不能为空', trigger: 'blur' }],
isRepeat: [{ required: true, message: '重复告警不能为空', trigger: 'blur' }],
noRepeatDuration: [{ required: true, message: '不重复间隔不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await AlertApi.getAlert(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as AlertVO
if (formType.value === 'create') {
await AlertApi.createAlert(data)
message.success(t('common.createSuccess'))
} else {
await AlertApi.updateAlert(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
alertCode: undefined,
alertName: undefined,
alertType: undefined,
alertLevel: undefined,
content: undefined,
condition: undefined,
conditionFormula: undefined,
alertAudio: undefined,
isRepeat: undefined,
noRepeatDuration: undefined,
isEnable: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,196 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="编码" prop="alertCode">
<el-input v-model="formData.alertCode" placeholder="请输入编码" />
</el-form-item>
<el-form-item label="名称" prop="alertName">
<el-input v-model="formData.alertName" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="告警类型" prop="alertType">
<el-select v-model="formData.alertType" placeholder="请选择告警类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_ALERT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="告警等级" prop="alertLevel">
<el-input v-model="formData.alertLevel" placeholder="请输入告警等级" />
</el-form-item>
<el-form-item label="告警内容" prop="content">
<Editor v-model="formData.content" height="150px" />
</el-form-item>
<el-form-item label="告警条件" prop="condition">
<el-input v-model="formData.condition" placeholder="请输入告警条件" />
</el-form-item>
<el-form-item label="逻辑表达式" prop="conditionFormula">
<el-input v-model="formData.conditionFormula" placeholder="请输入逻辑表达式" />
</el-form-item>
<el-form-item label="数据值" prop="dataValue">
<el-input v-model="formData.dataValue" placeholder="请输入数据值" />
</el-form-item>
<el-form-item label="数据类型" prop="dataType">
<el-select v-model="formData.dataType" placeholder="请选择数据类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_DATA_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="单位" prop="dataUnit">
<el-input v-model="formData.dataUnit" placeholder="请输入单位" />
</el-form-item>
<el-form-item label="描述" prop="dataTypeRemark">
<el-input v-model="formData.dataTypeRemark" placeholder="请输入描述" />
</el-form-item>
<el-form-item label="告警音频" prop="alertAudio">
<el-input v-model="formData.alertAudio" placeholder="请输入告警音频" />
</el-form-item>
<el-form-item label="重复告警" prop="isRepeat">
<el-radio-group v-model="formData.isRepeat">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="不重复间隔" prop="noRepeatDuration">
<el-input v-model="formData.noRepeatDuration" placeholder="请输入不重复间隔" />
</el-form-item>
<el-form-item label="来源ID" prop="dataId">
<el-input v-model="formData.dataId" placeholder="请输入来源ID" />
</el-form-item>
<el-form-item label="来源编码" prop="dataCode">
<el-input v-model="formData.dataCode" placeholder="请输入来源编码" />
</el-form-item>
<el-form-item label="来源名称" prop="dataName">
<el-input v-model="formData.dataName" placeholder="请输入来源名称" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { AlertApi } from '@/api/iot/alert'
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
alertCode: undefined,
alertName: undefined,
alertType: undefined,
alertLevel: undefined,
content: undefined,
condition: undefined,
conditionFormula: undefined,
dataValue: undefined,
dataType: undefined,
dataUnit: undefined,
dataTypeRemark: undefined,
alertId: undefined,
alertAudio: undefined,
isRepeat: undefined,
noRepeatDuration: undefined,
dataId: undefined,
dataCode: undefined,
dataName: undefined
})
const formRules = reactive({
alertCode: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
alertName: [{ required: true, message: '名称不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number, alertId: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
formData.value.alertId = alertId
//
if (id) {
formLoading.value = true
try {
formData.value = await AlertApi.getAlertRecord(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value
if (formType.value === 'create') {
await AlertApi.createAlertRecord(data)
message.success(t('common.createSuccess'))
} else {
await AlertApi.updateAlertRecord(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
alertCode: undefined,
alertName: undefined,
alertType: undefined,
alertLevel: undefined,
content: undefined,
condition: undefined,
conditionFormula: undefined,
dataValue: undefined,
dataType: undefined,
dataUnit: undefined,
dataTypeRemark: undefined,
alertId: undefined,
alertAudio: undefined,
isRepeat: undefined,
noRepeatDuration: undefined,
dataId: undefined,
dataCode: undefined,
dataName: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,160 @@
<template>
<!-- 列表 -->
<ContentWrap>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['iot:alert:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="编码" align="center" prop="alertCode" />
<el-table-column label="名称" align="center" prop="alertName" />
<el-table-column label="告警类型" align="center" prop="alertType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_ALERT_TYPE" :value="scope.row.alertType" />
</template>
</el-table-column>
<el-table-column label="告警等级" align="center" prop="alertLevel">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_ALERT_LEVEL" :value="scope.row.alertLevel" />
</template>
</el-table-column>
<el-table-column label="告警内容" align="center" prop="content" />
<el-table-column label="告警条件" align="center" prop="condition" />
<el-table-column label="逻辑表达式" align="center" prop="conditionFormula" />
<el-table-column label="数据值" align="center" prop="dataValue" />
<el-table-column label="数据类型" align="center" prop="dataType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_DEVICE_DATA_TYPE" :value="scope.row.dataType" />
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="dataUnit" />
<el-table-column label="描述" align="center" prop="dataTypeRemark" />
<el-table-column label="告警音频" align="center" prop="alertAudio" />
<el-table-column label="重复告警" align="center" prop="isRepeat">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isRepeat" />
</template>
</el-table-column>
<el-table-column label="不重复间隔" align="center" prop="noRepeatDuration" />
<el-table-column label="来源ID" align="center" prop="dataId" />
<el-table-column label="来源编码" align="center" prop="dataCode" />
<el-table-column label="来源名称" align="center" prop="dataName" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="170px"
fixed="right"
/>
<el-table-column label="操作" align="center" fixed="right" width="150px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['iot:alert:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['iot:alert:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<AlertRecordForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import { AlertApi } from '@/api/iot/alert'
import AlertRecordForm from './AlertRecordForm.vue'
const { t } = useI18n() //
const message = useMessage() //
const props = defineProps<{
alertId?: number // ID
}>()
const loading = ref(false) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
alertId: undefined as unknown
})
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.alertId,
(val: number) => {
if (!val) {
return
}
queryParams.alertId = val
handleQuery()
},
{ immediate: true, deep: true }
)
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await AlertApi.getAlertRecordPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
if (!props.alertId) {
message.error('请选择一个告警配置')
return
}
formRef.value.open(type, id, props.alertId)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await AlertApi.deleteAlertRecord(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
</script>

@ -0,0 +1,255 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="名称" prop="alertName">
<el-input
v-model="queryParams.alertName"
placeholder="请输入名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="告警等级" prop="alertLevel">
<el-input
v-model="queryParams.alertLevel"
placeholder="请输入告警等级"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['iot:alert:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['iot:alert:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading="loading"
:data="list"
:stripe="true"
:show-overflow-tooltip="true"
highlight-current-row
@current-change="handleCurrentChange"
>
<el-table-column label="编码" align="center" prop="alertCode" />
<el-table-column label="名称" align="center" prop="alertName" />
<el-table-column label="告警类型" align="center" prop="alertType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_ALERT_TYPE" :value="scope.row.alertType" />
</template>
</el-table-column>
<el-table-column label="告警等级" align="center" prop="alertLevel">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_ALERT_LEVEL" :value="scope.row.alertLevel" />
</template>
</el-table-column>
<el-table-column label="告警内容" align="center" prop="content" />
<el-table-column label="告警条件" align="center" prop="condition" />
<el-table-column label="逻辑表达式" align="center" prop="conditionFormula" />
<el-table-column label="告警音频" align="center" prop="alertAudio" />
<el-table-column label="重复告警" align="center" prop="isRepeat">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isRepeat" />
</template>
</el-table-column>
<el-table-column label="不重复间隔" align="center" prop="noRepeatDuration" />
<el-table-column label="是否启用" align="center" prop="isEnable">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="170px"
fixed="right"
/>
<el-table-column label="操作" align="center" fixed="right" width="150px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['iot:alert:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['iot:alert:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<AlertForm ref="formRef" @success="getList" />
<!-- 子表的列表 -->
<ContentWrap>
<el-tabs model-value="alertRecord">
<el-tab-pane label="告警记录" name="alertRecord">
<AlertRecordList :alert-id="currentRow.id" />
</el-tab-pane>
</el-tabs>
</ContentWrap>
</template>
<script setup lang="ts">
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { AlertApi, AlertVO } from '@/api/iot/alert'
import AlertForm from './AlertForm.vue'
import AlertRecordList from './components/AlertRecordList.vue'
/** 告警配置 列表 */
defineOptions({ name: 'Alert' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<AlertVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
alertCode: undefined,
alertName: undefined,
alertType: undefined,
alertLevel: undefined,
content: undefined,
condition: undefined,
conditionFormula: undefined,
alertAudio: undefined,
isRepeat: undefined,
noRepeatDuration: undefined,
isEnable: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await AlertApi.getAlertPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await AlertApi.deleteAlert(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await AlertApi.exportAlert(queryParams)
download.excel(data, '告警配置.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 选中行操作 */
const currentRow = ref({}) //
const handleCurrentChange = (row) => {
currentRow.value = row
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -0,0 +1,201 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="编码" prop="alertCode">
<el-input v-model="formData.alertCode" placeholder="请输入编码" />
</el-form-item>
<el-form-item label="名称" prop="alertName">
<el-input v-model="formData.alertName" placeholder="请输入名称" />
</el-form-item>
<el-form-item label="告警类型" prop="alertType">
<el-select v-model="formData.alertType" placeholder="请选择告警类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_ALERT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="告警等级" prop="alertLevel">
<el-input v-model="formData.alertLevel" placeholder="请输入告警等级" />
</el-form-item>
<el-form-item label="告警内容" prop="content">
<Editor v-model="formData.content" height="150px" />
</el-form-item>
<el-form-item label="告警条件" prop="condition">
<el-input v-model="formData.condition" placeholder="请输入告警条件" />
</el-form-item>
<el-form-item label="逻辑表达式" prop="conditionFormula">
<el-input v-model="formData.conditionFormula" placeholder="请输入逻辑表达式" />
</el-form-item>
<el-form-item label="数据值" prop="dataValue">
<el-input v-model="formData.dataValue" placeholder="请输入数据值" />
</el-form-item>
<el-form-item label="数据类型" prop="dataType">
<el-select v-model="formData.dataType" placeholder="请选择数据类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_DATA_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="单位" prop="dataUnit">
<el-input v-model="formData.dataUnit" placeholder="请输入单位" />
</el-form-item>
<el-form-item label="描述" prop="dataTypeRemark">
<el-input v-model="formData.dataTypeRemark" placeholder="请输入描述" />
</el-form-item>
<el-form-item label="告警ID" prop="alertId">
<el-input v-model="formData.alertId" placeholder="请输入告警ID" />
</el-form-item>
<el-form-item label="告警音频" prop="alertAudio">
<el-input v-model="formData.alertAudio" placeholder="请输入告警音频" />
</el-form-item>
<el-form-item label="重复告警" prop="isRepeat">
<el-radio-group v-model="formData.isRepeat">
<el-radio
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="不重复间隔" prop="noRepeatDuration">
<el-input v-model="formData.noRepeatDuration" placeholder="请输入不重复间隔" />
</el-form-item>
<el-form-item label="来源ID" prop="dataId">
<el-input v-model="formData.dataId" placeholder="请输入来源ID" />
</el-form-item>
<el-form-item label="来源编码" prop="dataCode">
<el-input v-model="formData.dataCode" placeholder="请输入来源编码" />
</el-form-item>
<el-form-item label="来源名称" prop="dataName">
<el-input v-model="formData.dataName" placeholder="请输入来源名称" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { AlertRecordApi, AlertRecordVO } from '@/api/iot/alertrecord'
/** 告警记录 表单 */
defineOptions({ name: 'AlertRecordForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
alertCode: undefined,
alertName: undefined,
alertType: undefined,
alertLevel: undefined,
content: undefined,
condition: undefined,
conditionFormula: undefined,
dataValue: undefined,
dataType: undefined,
dataUnit: undefined,
dataTypeRemark: undefined,
alertId: undefined,
alertAudio: undefined,
isRepeat: undefined,
noRepeatDuration: undefined,
dataId: undefined,
dataCode: undefined,
dataName: undefined
})
const formRules = reactive({
alertCode: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
alertName: [{ required: true, message: '名称不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await AlertRecordApi.getAlertRecord(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as AlertRecordVO
if (formType.value === 'create') {
await AlertRecordApi.createAlertRecord(data)
message.success(t('common.createSuccess'))
} else {
await AlertRecordApi.updateAlertRecord(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
alertCode: undefined,
alertName: undefined,
alertType: undefined,
alertLevel: undefined,
content: undefined,
condition: undefined,
conditionFormula: undefined,
dataValue: undefined,
dataType: undefined,
dataUnit: undefined,
dataTypeRemark: undefined,
alertId: undefined,
alertAudio: undefined,
isRepeat: undefined,
noRepeatDuration: undefined,
dataId: undefined,
dataCode: undefined,
dataName: undefined
}
formRef.value?.resetFields()
}
</script>

@ -0,0 +1,287 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="告警名称" prop="alertName">
<el-input
v-model="queryParams.alertName"
placeholder="请输入名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="告警类型" prop="alertType">
<el-select
v-model="queryParams.alertType"
placeholder="请选择告警类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_ALERT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="告警等级" prop="alertLevel">
<el-input
v-model="queryParams.alertLevel"
placeholder="请输入告警等级"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="重复告警" prop="isRepeat">
<el-select
v-model="queryParams.isRepeat"
placeholder="请选择重复告警"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="来源名称" prop="dataName">
<el-input
v-model="queryParams.dataName"
placeholder="请输入来源名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['iot:alert-record:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['iot:alert-record:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="编码" align="center" prop="alertCode" />
<el-table-column label="名称" align="center" prop="alertName" />
<el-table-column label="告警类型" align="center" prop="alertType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_ALERT_TYPE" :value="scope.row.alertType" />
</template>
</el-table-column>
<el-table-column label="告警等级" align="center" prop="alertLevel">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_ALERT_LEVEL" :value="scope.row.alertLevel" />
</template>
</el-table-column>
<el-table-column label="告警内容" align="center" prop="content" />
<el-table-column label="告警条件" align="center" prop="condition" />
<el-table-column label="逻辑表达式" align="center" prop="conditionFormula" />
<el-table-column label="数据值" align="center" prop="dataValue" />
<el-table-column label="数据类型" align="center" prop="dataType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_DEVICE_DATA_TYPE" :value="scope.row.dataType" />
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="dataUnit" />
<el-table-column label="描述" align="center" prop="dataTypeRemark" />
<el-table-column label="告警音频" align="center" prop="alertAudio" />
<el-table-column label="重复告警" align="center" prop="isRepeat">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isRepeat" />
</template>
</el-table-column>
<el-table-column label="来源编码" align="center" prop="dataCode" />
<el-table-column label="来源名称" align="center" prop="dataName" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="170px"
fixed="right"
/>
<el-table-column label="操作" align="center" fixed="right" width="150px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['iot:alert-record:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['iot:alert-record:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<AlertRecordForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { AlertRecordApi, AlertRecordVO } from '@/api/iot/alertrecord'
import AlertRecordForm from './AlertRecordForm.vue'
/** 告警记录 列表 */
defineOptions({ name: 'AlertRecord' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<AlertRecordVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
alertCode: undefined,
alertName: undefined,
alertType: undefined,
alertLevel: undefined,
content: undefined,
condition: undefined,
conditionFormula: undefined,
dataValue: undefined,
dataType: undefined,
dataUnit: undefined,
dataTypeRemark: undefined,
createTime: [],
alertId: undefined,
alertAudio: undefined,
isRepeat: undefined,
noRepeatDuration: undefined,
dataId: undefined,
dataCode: undefined,
dataName: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await AlertRecordApi.getAlertRecordPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await AlertRecordApi.deleteAlertRecord(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await AlertRecordApi.exportAlertRecord(queryParams)
download.excel(data, '告警记录.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

@ -7,9 +7,6 @@
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="设备配置id" prop="deviceConfigId">
<el-input v-model="formData.deviceConfigId" placeholder="请输入设备配置id" />
</el-form-item>
<el-form-item label="设备编号" prop="deviceCode">
<el-input v-model="formData.deviceCode" placeholder="请输入设备编号" />
</el-form-item>
@ -17,20 +14,19 @@
<el-input v-model="formData.deviceName" placeholder="请输入设备名称" />
</el-form-item>
<el-form-item label="设备类型" prop="deviceType">
<el-radio-group v-model="formData.deviceType">
<el-radio
<el-select v-model="formData.deviceType" placeholder="请选择设备类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="Siemens系列" prop="siemensSeries">
<el-radio-group v-model="formData.siemensSeries">
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_SIEMENS_TYPE)"
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_GATEWAY_STATUS)"
:key="dict.value"
:label="dict.value"
>
@ -38,160 +34,22 @@
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="连接参数" prop="siemensConnectParam">
<el-input v-model="formData.siemensConnectParam" placeholder="请输入连接参数(波特率,数据位,停止位,校验位 例如960081N" />
</el-form-item>
<el-form-item label="读取方式" prop="readCronType">
<el-input v-model="formData.readCronType" placeholder="请输入读取方式" />
</el-form-item>
<el-form-item label="读取时间间隔" prop="readRepeatValue">
<el-input v-model="formData.readRepeatValue" placeholder="请输入读取时间间隔" />
</el-form-item>
<el-form-item label="读取时间间隔单位" prop="readRepeatUnit">
<el-radio-group v-model="formData.readRepeatUnit">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_DATA_UNIT)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
<el-form-item label="读主题" prop="readTopic">
<el-input v-model="formData.readTopic" placeholder="请输入读主题" />
</el-form-item>
<el-form-item label="读取时间表达式" prop="readCron">
<el-input v-model="formData.readCron" placeholder="请输入读取时间表达式" />
<el-form-item label="写主题" prop="writeTopic">
<el-input v-model="formData.writeTopic" placeholder="请输入写主题" />
</el-form-item>
<el-form-item label="写入时间间隔" prop="writeCronType">
<el-input v-model="formData.writeCronType" placeholder="请输入写入方式" />
<el-form-item label="网关" prop="gatewayId">
<el-input v-model="formData.gatewayId" placeholder="请输入网关" />
</el-form-item>
<el-form-item label="写入时间间隔" prop="writeRepeatValue">
<el-input v-model="formData.writeRepeatValue" placeholder="请输入写入时间间隔" />
</el-form-item>
<el-form-item label="写入时间间隔单位" prop="writeRepeatUnit">
<el-radio-group v-model="formData.writeRepeatUnit">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_DATA_UNIT)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="写入时间表达式" prop="writeCron">
<el-input v-model="formData.writeCron" placeholder="请输入写入时间表达式" />
</el-form-item>
<el-form-item label="是否持久化" prop="localPersistent">
<el-radio-group v-model="formData.localPersistent">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_1_OR_0)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="上传方式" prop="uploadRate">
<el-radio-group v-model="formData.uploadRate">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_UPLOADING_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="上传频率" prop="rateCount">
<el-input v-model="formData.rateCount" placeholder="请输入上传频率" />
</el-form-item>
<el-form-item label="modbus协议类型" prop="modbusProtocol">
<el-radio-group v-model="formData.modbusProtocol">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_MODBUS_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="modbus模式" prop="modbusPattern">
<el-radio-group v-model="formData.modbusPattern">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_MODBUS_MOLD)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="modbus串口号" prop="portName">
<el-radio-group v-model="formData.portName">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_MODBUS_PORT)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="连接参数" prop="modbusConnectParam">
<el-input v-model="formData.modbusConnectParam" placeholder="请输入连接参数(波特率,数据位,停止位,校验位 例如960081N" />
</el-form-item>
<el-form-item label="读地址是否连续" prop="modbusReadAddrGap">
<el-radio-group v-model="formData.modbusReadAddrGap">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_1_OR_0)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
<!-- <el-form-item label="设备品牌id" prop="deviceBrandId">-->
<!-- <el-input v-model="formData.deviceBrandId" placeholder="请输入设备品牌id" />-->
<!-- </el-form-item>-->
<el-form-item label="离线间隔" prop="offLineDuration">
<el-input v-model="formData.offLineDuration" placeholder="请输入离线间隔" />
</el-form-item>
<el-form-item label="网关id" prop="gatewayId">
<el-input v-model="formData.gatewayId" placeholder="请输入网关id" />
</el-form-item>
<el-form-item label="组织设备id" prop="orgId">
<el-input v-model="formData.orgId" placeholder="请输入组织设备id" />
</el-form-item>
<el-form-item label="数采设备类型" prop="deviceUseType">
<el-radio-group v-model="formData.deviceUseType">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_USE_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="ap_ip" prop="apIp">
<el-input v-model="formData.apIp" placeholder="请输入ap_ip" />
</el-form-item>
<el-form-item label="网桥ip" prop="gateBridgeIp">
<el-input v-model="formData.gateBridgeIp" placeholder="请输入网桥ip" />
</el-form-item>
<el-form-item label="串口服务器IP" prop="comServerIp">
<el-input v-model="formData.comServerIp" placeholder="请输入串口服务器IP" />
</el-form-item>
<el-form-item label="串口服务器端口" prop="comServerPort">
<el-input v-model="formData.comServerPort" placeholder="请输入串口服务器端口" />
</el-form-item>
<el-form-item label="PLC控制器地址" prop="plcControllerIp">
<el-input v-model="formData.plcControllerIp" placeholder="请输入PLC控制器地址" />
</el-form-item>
<el-form-item label="PLC触控屏地址" prop="plcScreenIp">
<el-input v-model="formData.plcScreenIp" placeholder="请输入PLC触控屏地址" />
</el-form-item>
<el-form-item label="i机台id" prop="orgMachineId">
<el-input v-model="formData.orgMachineId" placeholder="请输入i机台id" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
@ -214,7 +72,7 @@
</Dialog>
</template>
<script setup lang="ts">
import {getStrDictOptions, DICT_TYPE, getBoolDictOptions} from '@/utils/dict'
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { DeviceApi, DeviceVO } from '@/api/iot/device'
/** 物联设备 表单 */
@ -229,38 +87,24 @@ const formLoading = ref(false) // 表单的加载中1修改时的数据加
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
deviceConfigId: undefined,
deviceCode: undefined,
deviceName: undefined,
deviceType: undefined,
siemensSeries: undefined,
siemensConnectParam: undefined,
readCronType: undefined,
readRepeatValue: undefined,
readRepeatUnit: undefined,
readCron: undefined,
writeCronType: undefined,
writeRepeatValue: undefined,
writeRepeatUnit: undefined,
writeCron: undefined,
localPersistent: undefined,
uploadRate: undefined,
rateCount: undefined,
modbusProtocol: undefined,
modbusPattern: undefined,
portName: undefined,
modbusConnectParam: undefined,
modbusReadAddrGap: undefined,
isUpload: undefined,
status: undefined,
readTopic: undefined,
writeTopic: undefined,
gatewayId: undefined,
orgId: undefined,
deviceBrandId: undefined,
offLineDuration: undefined,
lastOnlineTime: undefined,
remark: undefined,
isEnable: undefined,
isEnable: undefined
})
const formRules = reactive({
gatewayId: [{ required: true, message: '网关id不能为空', trigger: 'blur' }],
orgId: [{ required: true, message: '组织设备id不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }],
deviceCode: [{ required: true, message: '设备编码不能为空', trigger: 'blur' }],
deviceName: [{ required: true, message: '设备名称不能为空', trigger: 'blur' }],
deviceType: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -310,33 +154,18 @@ const submitForm = async () => {
const resetForm = () => {
formData.value = {
id: undefined,
deviceConfigId: undefined,
deviceCode: undefined,
deviceName: undefined,
deviceType: undefined,
siemensSeries: undefined,
siemensConnectParam: undefined,
readCronType: undefined,
readRepeatValue: undefined,
readRepeatUnit: undefined,
readCron: undefined,
writeCronType: undefined,
writeRepeatValue: undefined,
writeRepeatUnit: undefined,
writeCron: undefined,
localPersistent: undefined,
uploadRate: undefined,
rateCount: undefined,
modbusProtocol: undefined,
modbusPattern: undefined,
portName: undefined,
modbusConnectParam: undefined,
modbusReadAddrGap: undefined,
isUpload: undefined,
status: undefined,
readTopic: undefined,
writeTopic: undefined,
gatewayId: undefined,
orgId: undefined,
deviceBrandId: undefined,
offLineDuration: undefined,
lastOnlineTime: undefined,
remark: undefined,
isEnable: undefined,
isEnable: undefined
}
formRef.value?.resetFields()
}

@ -7,52 +7,37 @@
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="地址编码" prop="attributeCode">
<el-input v-model="formData.attributeCode" placeholder="请输入地址编码" />
<el-form-item label="属性编码" prop="attributeCode">
<el-input v-model="formData.attributeCode" placeholder="请输入属性编码" />
</el-form-item>
<el-form-item label="地址" prop="address">
<el-input v-model="formData.address" placeholder="请输入地址" />
<el-form-item label="属性名称" prop="attributeName">
<el-input v-model="formData.attributeName" placeholder="请输入属性名称" />
</el-form-item>
<el-form-item label="地址名称" prop="attributeName">
<el-input v-model="formData.attributeName" placeholder="请输入地址名称" />
<el-form-item label="PLC点位地址" prop="address">
<el-input v-model="formData.address" placeholder="请输入PLC点位地址" />
</el-form-item>
<el-form-item label="地址描述" prop="description">
<el-input v-model="formData.description" placeholder="请输入描述" />
<Editor v-model="formData.description" height="150px" />
</el-form-item>
<el-form-item label="地址类型" prop="addressType">
<el-input v-model="formData.addressType" placeholder="请输入" />
</el-form-item>
<el-form-item label="地址偏移" prop="addressOffset">
<el-input v-model="formData.addressOffset" placeholder="请输入地址偏移" />
</el-form-item>
<el-form-item label="地址2类型" prop="address2Type">
<el-input v-model="formData.address2Type" placeholder="请输入" />
</el-form-item>
<el-form-item label="地址2偏移" prop="address2Offset">
<el-input v-model="formData.address2Offset" placeholder="请输入地址2偏移" />
</el-form-item>
<el-form-item label="所属组" prop="groupName">
<el-input v-model="formData.groupName" placeholder="请输入所属组" />
</el-form-item>
<el-form-item label="所属组id" prop="groupId">
<el-input v-model="formData.groupId" placeholder="请输入所属组id" />
</el-form-item>
<el-form-item label="安全类别" prop="securityType">
<el-input v-model="formData.securityType" placeholder="请输入安全类别" />
</el-form-item>
<el-form-item label="读写状态" prop="ioStatus">
<el-input v-model="formData.ioStatus" placeholder="请输入读写状态" />
<el-form-item label="地址类型" prop="attributeType">
<el-select v-model="formData.attributeType" placeholder="请选择地址类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.MES_DATA_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否线性换算" prop="isLinearTransfer">
<el-radio-group v-model="formData.isLinearTransfer">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_1_OR_0)"
<el-form-item label="读写方式" prop="ioType">
<el-select v-model="formData.ioType" placeholder="请选择读写方式">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_ATTRIBUTE_IO_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="数据类型" prop="dataType">
<el-select v-model="formData.dataType" placeholder="请选择数据类型">
@ -64,76 +49,20 @@
/>
</el-select>
</el-form-item>
<el-form-item label="单位" prop="unit">
<el-input v-model="formData.unit" placeholder="请输入单位" />
</el-form-item>
<el-form-item label="输入最小值" prop="inMinValue">
<el-input v-model="formData.inMinValue" placeholder="请输入输入最小值" />
</el-form-item>
<el-form-item label="输入最大值" prop="inMaxValue">
<el-input v-model="formData.inMaxValue" placeholder="请输入输入最大值" />
</el-form-item>
<el-form-item label="输出最小值" prop="outMinValue">
<el-input v-model="formData.outMinValue" placeholder="请输入输出最小值" />
</el-form-item>
<el-form-item label="输出最大值" prop="outMaxValue">
<el-input v-model="formData.outMaxValue" placeholder="请输入输出最大值" />
<el-form-item label="类型描述" prop="dataTypeRemark">
<el-input v-model="formData.dataTypeRemark" placeholder="请输入类型描述" />
</el-form-item>
<el-form-item label="输出数据类型" prop="outDataType">
<el-input v-model="formData.outDataType" placeholder="请输入输出数据类型" />
<el-form-item label="单位" prop="dataUnit">
<el-input v-model="formData.dataUnit" placeholder="请输入单位" />
</el-form-item>
<el-form-item label="精度" prop="siemensFieldPrecision">
<el-input v-model="formData.siemensFieldPrecision" placeholder="请输入精度" />
</el-form-item>
<el-form-item label="站号" prop="modbusSlaveId">
<el-input v-model="formData.modbusSlaveId" placeholder="请输入站号" />
</el-form-item>
<el-form-item label="寄存器地址" prop="modbusFieldAddress">
<el-input v-model="formData.modbusFieldAddress" placeholder="请输入寄存器地址" />
</el-form-item>
<el-form-item label="寄存器类型" prop="modbusAddressType">
<el-input v-model="formData.modbusAddressType" placeholder="请输入寄存器类型" />
</el-form-item>
<el-form-item label="个数" prop="modbusFieldSize">
<el-input v-model="formData.modbusFieldSize" placeholder="请输入个数" />
</el-form-item>
<el-form-item label="缩放因子" prop="modbusFieldPrecision">
<el-input v-model="formData.modbusFieldPrecision" placeholder="请输入缩放因子默认值为1大于0的小数" />
</el-form-item>
<el-form-item label="字节顺序" prop="modbusFieldOrder">
<el-input v-model="formData.modbusFieldOrder" placeholder="请输入字节顺序" />
</el-form-item>
<el-form-item label="mqtt进制类型" prop="sourceDataType">
<el-radio-group v-model="formData.sourceDataType">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_DATA_TRANSFER_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="结果进制类型" prop="transferDataType">
<el-radio-group v-model="formData.transferDataType">
<el-radio
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_DATA_TRANSFER_TYPE)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="系数" prop="factor">
<el-input v-model="formData.factor" placeholder="请输入系数" />
<el-form-item label="数据计算公式" prop="dataFormula">
<el-input v-model="formData.dataFormula" placeholder="请输入数据计算公式" />
</el-form-item>
<el-form-item label="网关id" prop="gatewayId">
<el-input v-model="formData.gatewayId" placeholder="请输入网关id" />
</el-form-item>
<el-form-item label="组织设备id" prop="orgId">
<el-input v-model="formData.orgId" placeholder="请输入组织设备id" />
<el-form-item label="告警id" prop="alertId">
<el-input v-model="formData.alertId" placeholder="请输入告警id" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
@ -157,7 +86,7 @@
</Dialog>
</template>
<script setup lang="ts">
import {getStrDictOptions, DICT_TYPE, getBoolDictOptions} from '@/utils/dict'
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { DeviceApi } from '@/api/iot/device'
const { t } = useI18n() //
@ -170,49 +99,25 @@ const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({
id: undefined,
attributeCode: undefined,
address: undefined,
attributeName: undefined,
address: undefined,
description: undefined,
addressType: undefined,
addressOffset: undefined,
address2Type: undefined,
address2Offset: undefined,
groupName: undefined,
groupId: undefined,
securityType: undefined,
ioStatus: undefined,
isLinearTransfer: undefined,
attributeType: undefined,
ioType: undefined,
dataType: undefined,
unit: undefined,
inMinValue: undefined,
inMaxValue: undefined,
outMinValue: undefined,
outMaxValue: undefined,
outDataType: undefined,
siemensFieldPrecision: undefined,
modbusSlaveId: undefined,
modbusFieldAddress: undefined,
modbusAddressType: undefined,
modbusFieldSize: undefined,
modbusFieldPrecision: 1,
modbusFieldOrder: undefined,
sourceDataType: undefined,
transferDataType: undefined,
factor: undefined,
dataTypeRemark: undefined,
dataUnit: undefined,
dataFormula: undefined,
gatewayId: undefined,
deviceId: undefined,
orgId: undefined,
alertId: undefined,
remark: undefined,
isEnable: undefined,
isEnable: undefined
})
const formRules = reactive({
attributeCode: [{ required: true, message: '地址编码不能为空', trigger: 'blur' }],
attributeName: [{ required: true, message: '地址名称不能为空', trigger: 'blur' }],
dataType: [{ required: true, message: '数据类型不能为空', trigger: 'blur' }],
gatewayId: [{ required: true, message: '网关id不能为空', trigger: 'blur' }],
deviceId: [{ required: true, message: '设备id不能为空', trigger: 'blur' }],
orgId: [{ required: true, message: '组织设备id不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }],
attributeCode: [{ required: true, message: '属性编码不能为空', trigger: 'blur' }],
attributeName: [{ required: true, message: '属性名称不能为空', trigger: 'blur' }],
isEnable: [{ required: true, message: '是否启用不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
@ -264,41 +169,21 @@ const resetForm = () => {
formData.value = {
id: undefined,
attributeCode: undefined,
address: undefined,
attributeName: undefined,
address: undefined,
description: undefined,
addressType: undefined,
addressOffset: undefined,
address2Type: undefined,
address2Offset: undefined,
groupName: undefined,
groupId: undefined,
securityType: undefined,
ioStatus: undefined,
isLinearTransfer: undefined,
attributeType: undefined,
ioType: undefined,
dataType: undefined,
unit: undefined,
inMinValue: undefined,
inMaxValue: undefined,
outMinValue: undefined,
outMaxValue: undefined,
outDataType: undefined,
siemensFieldPrecision: undefined,
modbusSlaveId: undefined,
modbusFieldAddress: undefined,
modbusAddressType: undefined,
modbusFieldSize: undefined,
modbusFieldPrecision: undefined,
modbusFieldOrder: undefined,
sourceDataType: undefined,
transferDataType: undefined,
factor: undefined,
dataTypeRemark: undefined,
dataUnit: undefined,
dataFormula: undefined,
gatewayId: undefined,
deviceId: undefined,
orgId: undefined,
alertId: undefined,
remark: undefined,
isEnable: undefined,
isEnable: undefined
}
formRef.value?.resetFields()
}
</script>
</script>

@ -10,41 +10,31 @@
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="地址编码" align="center" prop="attributeCode" />
<el-table-column label="地址" align="center" prop="address" />
<el-table-column label="地址名称" align="center" prop="attributeName" min-width="120px"/>
<el-table-column label="属性编码" align="center" prop="attributeCode" />
<el-table-column label="属性名称" align="center" prop="attributeName" />
<el-table-column label="PLC点位地址" align="center" prop="address" />
<el-table-column label="地址描述" align="center" prop="description" />
<el-table-column label="线性换算" align="center" prop="isLinearTransfer">
<el-table-column label="地址类型" align="center" prop="attributeType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_1_OR_0" :value="scope.row.isLinearTransfer" />
<dict-tag :type="DICT_TYPE.MES_DATA_TYPE" :value="scope.row.attributeType" />
</template>
</el-table-column>
<el-table-column label="数据类型" align="center" prop="dataType">
<el-table-column label="读写方式" align="center" prop="ioType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_DEVICE_DATA_TYPE" :value="scope.row.dataType" />
<dict-tag :type="DICT_TYPE.IOT_ATTRIBUTE_IO_TYPE" :value="scope.row.ioType" />
</template>
</el-table-column>
<el-table-column label="单位" align="center" prop="unit" />
<el-table-column label="输出类型" align="center" prop="outDataType" />
<el-table-column label="精度" align="center" prop="siemensFieldPrecision" />
<el-table-column label="站号" align="center" prop="modbusSlaveId" />
<el-table-column label="寄存器地址" align="center" prop="modbusFieldAddress" />
<el-table-column label="寄存器类型" align="center" prop="modbusAddressType" />
<el-table-column label="个数" align="center" prop="modbusFieldSize" />
<el-table-column label="缩放因子" align="center" prop="modbusFieldPrecision" />
<el-table-column label="字节顺序" align="center" prop="modbusFieldOrder" />
<el-table-column label="mqtt进制类型" align="center" prop="sourceDataType" />
<el-table-column label="结果进制类型" align="center" prop="transferDataType">
<el-table-column label="数据类型" align="center" prop="dataType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_DEVICE_DATA_TRANSFER_TYPE" :value="scope.row.transferDataType" />
<dict-tag :type="DICT_TYPE.IOT_DEVICE_DATA_TYPE" :value="scope.row.dataType" />
</template>
</el-table-column>
<el-table-column label="系数" align="center" prop="factor" />
<el-table-column label="网关" align="center" prop="gatewayId" />
<el-table-column label="组织设备id" align="center" prop="orgId" />
<el-table-column label="类型描述" align="center" prop="dataTypeRemark" />
<el-table-column label="单位" align="center" prop="dataUnit" />
<el-table-column label="计算公式" align="center" prop="dataFormula" />
<el-table-column label="告警" align="center" prop="alertId" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="启用" align="center" prop="isEnable" >
<el-table-column label="是否启用" align="center" prop="isEnable">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
</template>
@ -54,9 +44,10 @@
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
width="170px"
fixed="right"
/>
<el-table-column label="操作" align="center" fixed="right" width="150">
<el-table-column label="操作" align="center" width="150px" fixed="right">
<template #default="scope">
<el-button
link

@ -8,7 +8,6 @@
:inline="true"
label-width="68px"
>
<el-form-item label="设备编号" prop="deviceCode">
<el-input
v-model="queryParams.deviceCode"
@ -27,32 +26,16 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="设备类型" prop="deviceType">
<el-select
@change="handleQuery"
v-model="queryParams.deviceType"
placeholder="请选择设备类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_DEVICE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="已下发" prop="isUpload">
<el-form-item label="状态" prop="status">
<el-select
@change="handleQuery"
v-model="queryParams.isUpload"
placeholder="请选择是否已下发"
v-model="queryParams.status"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_1_OR_0)"
v-for="dict in getStrDictOptions(DICT_TYPE.IOT_GATEWAY_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
@ -60,15 +43,6 @@
</el-select>
</el-form-item>
<el-form-item label="组织设备id" prop="orgId">
<el-input
v-model="queryParams.orgId"
placeholder="请输入组织设备id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
@ -78,22 +52,18 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-select
v-model="queryParams.isEnable"
placeholder="请选择是否启用"
clearable
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
>
<el-option
v-for="dict in getBoolDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
@ -128,56 +98,49 @@
highlight-current-row
@current-change="handleCurrentChange"
>
<el-table-column label="ID" align="center" prop="id" />
<el-table-column label="设备编号" align="center" prop="deviceCode" min-width="120px" />
<el-table-column label="设备名称" align="center" prop="deviceName" min-width="120px" />
<el-table-column label="设备类型" align="center" prop="deviceType" >
<el-table-column label="设备编号" align="center" prop="deviceCode" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="设备类型" align="center" prop="deviceType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_DEVICE_TYPE" :value="scope.row.deviceType" />
</template>
</el-table-column>
<el-table-column label="已下发" align="center" prop="isUpload">
<el-table-column label="状态" align="center" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_1_OR_0" :value="scope.row.isUpload" />
<dict-tag :type="DICT_TYPE.IOT_GATEWAY_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="网关" align="center" prop="gatewayId" />
<el-table-column label="组织设备" align="center" prop="orgId" />
<el-table-column label="读主题" align="center" prop="readTopic" />
<el-table-column label="写主题" align="center" prop="writeTopic" />
<el-table-column label="网关id" align="center" prop="gatewayId" />
<!-- <el-table-column label="设备品牌id" align="center" prop="deviceBrandId" />-->
<el-table-column label="离线间隔" align="center" prop="offLineDuration" />
<el-table-column
label="最后上线时间"
align="center"
prop="lastOnlineTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="数采类型" align="center" prop="deviceUseType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.IOT_DEVICE_USE_TYPE" :value="scope.row.deviceUseType" />
</template>
</el-table-column>
<el-table-column label="机台" align="center" prop="orgMachineId" />
<el-table-column label="是否启用" align="center" prop="isEnable" >
<el-table-column label="是否启用" align="center" prop="isEnable">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
width="170px"
fixed="right"
/>
<el-table-column label="操作" align="center" fixed="right" width="150">
<el-table-column label="操作" align="center" fixed="right" width="150px">
<template #default="scope">
<el-button
link
type="primary"
@click="handlePushDevice( scope.row.id)"
v-hasPermi="['iot:device:update']"
>
下发
</el-button>
<el-button
link
type="warning"
@click="openForm('update', scope.row.id)"
v-hasPermi="['iot:device:update']"
>
@ -216,7 +179,7 @@
</template>
<script setup lang="ts">
import {getStrDictOptions, DICT_TYPE, getBoolDictOptions} from '@/utils/dict'
import { getStrDictOptions, getBoolDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { DeviceApi, DeviceVO } from '@/api/iot/device'
@ -235,34 +198,19 @@ const total = ref(0) // 列表的总页数
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
deviceConfigId: undefined,
deviceCode: undefined,
deviceName: undefined,
deviceType: undefined,
siemensSeries: undefined,
siemensConnectParam: undefined,
readCronType: undefined,
readRepeatValue: undefined,
readRepeatUnit: undefined,
readCron: undefined,
writeCronType: undefined,
writeRepeatValue: undefined,
writeRepeatUnit: undefined,
writeCron: undefined,
localPersistent: undefined,
uploadRate: undefined,
rateCount: undefined,
modbusProtocol: undefined,
modbusPattern: undefined,
portName: undefined,
modbusConnectParam: undefined,
modbusReadAddrGap: undefined,
isUpload: undefined,
status: undefined,
readTopic: undefined,
writeTopic: undefined,
gatewayId: undefined,
orgId: undefined,
deviceBrandId: undefined,
offLineDuration: undefined,
lastOnlineTime: [],
remark: undefined,
isEnable: undefined,
createTime: [],
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
@ -296,18 +244,7 @@ const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 下发操作 */
const handlePushDevice = async (id: number) => {
try {
//
await message.confirm("确定要下发该设备到网关吗?")
//
await DeviceApi.pushDevice(id)
message.success("下发完成!")
//
await getList()
} catch {}
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {

Loading…
Cancel
Save