【功能完善】IoT: 规则场景监听器相关组件

This commit is contained in:
puhui999
2025-03-20 18:46:59 +08:00
parent 14ffb6483f
commit 9389cf8863
3 changed files with 53 additions and 38 deletions

View File

@ -2,12 +2,12 @@ import request from '@/config/axios'
// IoT 规则场景(场景联动) VO // IoT 规则场景(场景联动) VO
export interface RuleSceneVO { export interface RuleSceneVO {
id: number // 场景编号 id?: number // 场景编号
name: string // 场景名称 name?: string // 场景名称
description: string // 场景描述 description?: string // 场景描述
status: number // 场景状态 status?: number // 场景状态
triggers: string // 触发器数组 triggers?: any[] // 触发器数组
actions: string // 执行器数组 actions?: any[] // 执行器数组
} }
// IoT 规则场景(场景联动) API // IoT 规则场景(场景联动) API

View File

@ -1,5 +1,5 @@
<template> <template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="70%"> <Dialog :title="dialogTitle" v-model="dialogVisible" width="1080px">
<el-form <el-form
ref="formRef" ref="formRef"
:model="formData" :model="formData"
@ -33,12 +33,18 @@
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-divider content-position="left">触发器配置</el-divider> <el-divider content-position="left">触发器配置</el-divider>
<device-listener v-model="formData.triggers" /> <device-listener
v-for="(trigger, index) in formData.triggers"
:model-value="trigger"
:key="index"
class="mb-10px"
/>
<el-text class="ml-10px!" type="primary" @click="addTrigger">添加触发器</el-text>
</el-col> </el-col>
<el-col :span="24"> <el-col :span="24">
<el-divider content-position="left">执行动作配置</el-divider> <el-divider content-position="left">执行动作配置</el-divider>
<el-form-item label="执行器数组" prop="actionConfigs"> <el-form-item label="执行器数组" prop="actionConfigs">
<el-input v-model="formData.actions" placeholder="请输入执行器数组" /> <!-- <el-input v-model="formData.actions" placeholder="请输入执行器数组" />-->
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -64,14 +70,10 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') // 弹窗的标题 const dialogTitle = ref('') // 弹窗的标题
const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用 const formLoading = ref(false) // 表单的加载中1修改时的数据加载2提交的按钮禁用
const formType = ref('') // 表单的类型create - 新增update - 修改 const formType = ref('') // 表单的类型create - 新增update - 修改
const formData = ref({ const formData = ref<RuleSceneVO>({
id: undefined, status: 0,
name: undefined, triggers: []
description: undefined, } as RuleSceneVO)
status: undefined,
triggers: undefined,
actions: undefined
})
const formRules = reactive({ const formRules = reactive({
name: [{ required: true, message: '场景名称不能为空', trigger: 'blur' }], name: [{ required: true, message: '场景名称不能为空', trigger: 'blur' }],
status: [{ required: true, message: '场景状态不能为空', trigger: 'blur' }], status: [{ required: true, message: '场景状态不能为空', trigger: 'blur' }],
@ -80,6 +82,10 @@ const formRules = reactive({
}) })
const formRef = ref() // 表单 Ref const formRef = ref() // 表单 Ref
const addTrigger = () => {
formData.value.triggers?.push({})
}
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (type: string, id?: number) => { const open = async (type: string, id?: number) => {
dialogVisible.value = true dialogVisible.value = true
@ -125,13 +131,9 @@ const submitForm = async () => {
/** 重置表单 */ /** 重置表单 */
const resetForm = () => { const resetForm = () => {
formData.value = { formData.value = {
id: undefined, status: 0,
name: undefined, triggers: []
description: undefined, } as RuleSceneVO
status: undefined,
triggers: undefined,
actions: undefined
}
formRef.value?.resetFields() formRef.value?.resetFields()
} }
</script> </script>

View File

@ -20,6 +20,8 @@
<span class="mr-10px">设备</span> <span class="mr-10px">设备</span>
<el-button type="primary">选择设备</el-button> <el-button type="primary">选择设备</el-button>
</div> </div>
<!-- 添加规则 -->
<el-button class="device-listener-delete" type="danger" circle :icon="Delete" size="small" />
</div> </div>
<div class="device-listener-condition flex p-10px"> <div class="device-listener-condition flex p-10px">
<div class="flex flex-col items-center justify-center mr-10px h-a"> <div class="flex flex-col items-center justify-center mr-10px h-a">
@ -32,38 +34,35 @@
/> />
</el-select> </el-select>
</div> </div>
<div class="flex items-center flex-wrap"> <div class="">
<DeviceListenerCondition <DeviceListenerCondition
v-for="i in 2" v-for="(conditionParameter, index) in conditionParameters"
:key="i" :key="index"
v-model="conditionParameter" :model-value="conditionParameter"
@update:model-value="(val) => (conditionParameters[index] = val)"
class="mb-10px last:mb-0" class="mb-10px last:mb-0"
/> />
</div> </div>
<div class="flex flex-col items-center justify-center mr-10px h-a"> <div class="flex flex-1 flex-col items-center justify-center mr-10px h-a">
<!-- 添加规则 --> <!-- 添加规则 -->
<el-button type="primary" circle :icon="Plus" size="small" /> <el-button type="primary" circle :icon="Plus" size="small" @click="addConditionParameter" />
</div> </div>
</div> </div>
<!-- 新增条件按钮 -->
<div class="mt-4">
<el-button type="primary"> 新增监听器 </el-button>
</div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { Plus } from '@element-plus/icons-vue' import { Delete, Plus } from '@element-plus/icons-vue'
import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict' import { DICT_TYPE, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
import { ref } from 'vue' import { ref } from 'vue'
import DeviceListenerCondition from './DeviceListenerCondition.vue' import DeviceListenerCondition from './DeviceListenerCondition.vue'
import { IotRuleSceneTriggerConditionParameter } from '@/api/iot/rule/scene/scene.types'
/** 场景联动之监听器组件 */ /** 场景联动之监听器组件 */
defineOptions({ name: 'DeviceListener' }) defineOptions({ name: 'DeviceListener' })
defineProps<{ defineProps<{
modelValue: any[] modelValue: any
}>() }>()
const emit = defineEmits(['update:modelValue']) const emit = defineEmits(['update:modelValue'])
@ -71,13 +70,27 @@ const emit = defineEmits(['update:modelValue'])
// 添加响应式变量 // 添加响应式变量
const triggerType = ref() const triggerType = ref()
const messageType = ref('property') const messageType = ref('property')
const conditionParameter = ref({}) const conditionParameters = ref<IotRuleSceneTriggerConditionParameter[]>([])
const addConditionParameter = () => {
conditionParameters.value?.push({} as IotRuleSceneTriggerConditionParameter)
}
onMounted(() => {
addConditionParameter()
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.device-listener { .device-listener {
.device-listener-header { .device-listener-header {
position: relative;
background-color: #eff3f7; background-color: #eff3f7;
.device-listener-delete {
position: absolute;
top: auto;
right: 33px;
bottom: auto;
}
} }
.device-listener-condition { .device-listener-condition {