2025-07-17 21:31:12 +08:00
|
|
|
|
<template>
|
2025-07-26 14:03:16 +08:00
|
|
|
|
<el-card class="border border-[var(--el-border-color-light)] rounded-8px" shadow="never">
|
2025-07-28 23:25:54 +08:00
|
|
|
|
<!-- TODO @puhui999:触发器还是多个。。。每个触发器里面有事件类型 + 附加条件组(最好文案上,和阿里 iot 保持相对一致) -->
|
2025-07-17 21:31:12 +08:00
|
|
|
|
<template #header>
|
2025-07-28 21:38:27 +08:00
|
|
|
|
<div class="flex items-center gap-8px">
|
|
|
|
|
|
<Icon icon="ep:lightning" class="text-[var(--el-color-primary)] text-18px" />
|
|
|
|
|
|
<span class="text-16px font-600 text-[var(--el-text-color-primary)]">触发器配置</span>
|
|
|
|
|
|
<el-tag size="small" type="info">场景触发器</el-tag>
|
2025-07-17 21:31:12 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
2025-07-28 21:38:27 +08:00
|
|
|
|
<div class="p-16px space-y-16px">
|
|
|
|
|
|
<!-- 触发事件类型选择 -->
|
|
|
|
|
|
<el-form-item label="触发事件类型" required>
|
|
|
|
|
|
<el-select
|
|
|
|
|
|
:model-value="trigger.type"
|
|
|
|
|
|
@update:model-value="(value) => updateTriggerType(value)"
|
|
|
|
|
|
@change="onTriggerTypeChange"
|
|
|
|
|
|
placeholder="请选择触发事件类型"
|
|
|
|
|
|
class="w-full"
|
|
|
|
|
|
>
|
|
|
|
|
|
<el-option
|
|
|
|
|
|
v-for="option in triggerTypeOptions"
|
|
|
|
|
|
:key="option.value"
|
|
|
|
|
|
:label="option.label"
|
|
|
|
|
|
:value="option.value"
|
|
|
|
|
|
/>
|
|
|
|
|
|
</el-select>
|
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 设备触发配置 -->
|
|
|
|
|
|
<DeviceTriggerConfig
|
|
|
|
|
|
v-if="isDeviceTrigger(trigger.type)"
|
|
|
|
|
|
:model-value="trigger"
|
|
|
|
|
|
@update:model-value="updateTrigger"
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 定时触发配置 -->
|
2025-07-28 23:25:54 +08:00
|
|
|
|
<!-- TODO @puhui999:这里要不 v-else 好了? -->
|
2025-07-28 21:38:27 +08:00
|
|
|
|
<TimerTriggerConfig
|
|
|
|
|
|
v-if="trigger.type === TriggerTypeEnum.TIMER"
|
|
|
|
|
|
:model-value="trigger.cronExpression"
|
|
|
|
|
|
@update:model-value="updateTriggerCronExpression"
|
|
|
|
|
|
/>
|
2025-07-17 21:31:12 +08:00
|
|
|
|
</div>
|
|
|
|
|
|
</el-card>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
|
|
|
import { useVModel } from '@vueuse/core'
|
|
|
|
|
|
import DeviceTriggerConfig from '../configs/DeviceTriggerConfig.vue'
|
|
|
|
|
|
import TimerTriggerConfig from '../configs/TimerTriggerConfig.vue'
|
2025-07-18 23:55:51 +08:00
|
|
|
|
import {
|
|
|
|
|
|
TriggerFormData,
|
|
|
|
|
|
IotRuleSceneTriggerTypeEnum as TriggerTypeEnum
|
2025-07-17 21:31:12 +08:00
|
|
|
|
} from '@/api/iot/rule/scene/scene.types'
|
|
|
|
|
|
|
|
|
|
|
|
/** 触发器配置组件 */
|
|
|
|
|
|
defineOptions({ name: 'TriggerSection' })
|
|
|
|
|
|
|
2025-07-28 23:25:54 +08:00
|
|
|
|
// TODO @puhui999:下面的 Props、Emits 可以合并到变量那;
|
2025-07-17 21:31:12 +08:00
|
|
|
|
interface Props {
|
2025-07-28 21:38:27 +08:00
|
|
|
|
trigger: TriggerFormData
|
2025-07-17 21:31:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
interface Emits {
|
2025-07-28 21:38:27 +08:00
|
|
|
|
(e: 'update:trigger', value: TriggerFormData): void
|
2025-07-17 21:31:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const props = defineProps<Props>()
|
|
|
|
|
|
const emit = defineEmits<Emits>()
|
|
|
|
|
|
|
2025-07-28 21:38:27 +08:00
|
|
|
|
const trigger = useVModel(props, 'trigger', emit)
|
2025-07-28 16:45:43 +08:00
|
|
|
|
|
|
|
|
|
|
// 触发器类型选项
|
2025-07-28 23:25:54 +08:00
|
|
|
|
// TODO @puhui999:/Users/yunai/Java/yudao-ui-admin-vue3/src/views/iot/utils/constants.ts
|
2025-07-28 16:45:43 +08:00
|
|
|
|
const triggerTypeOptions = [
|
|
|
|
|
|
{
|
|
|
|
|
|
value: TriggerTypeEnum.DEVICE_STATE_UPDATE,
|
|
|
|
|
|
label: '设备状态变更'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
value: TriggerTypeEnum.DEVICE_PROPERTY_POST,
|
|
|
|
|
|
label: '设备属性上报'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
value: TriggerTypeEnum.DEVICE_EVENT_POST,
|
|
|
|
|
|
label: '设备事件上报'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
value: TriggerTypeEnum.DEVICE_SERVICE_INVOKE,
|
|
|
|
|
|
label: '设备服务调用'
|
|
|
|
|
|
},
|
|
|
|
|
|
{
|
|
|
|
|
|
value: TriggerTypeEnum.TIMER,
|
|
|
|
|
|
label: '定时触发'
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
2025-07-17 21:31:12 +08:00
|
|
|
|
|
|
|
|
|
|
// 工具函数
|
2025-07-28 23:25:54 +08:00
|
|
|
|
// TODO @puhui999:/Users/yunai/Java/yudao-ui-admin-vue3/src/views/iot/utils/constants.ts
|
2025-07-17 21:31:12 +08:00
|
|
|
|
const isDeviceTrigger = (type: number) => {
|
2025-07-28 16:45:43 +08:00
|
|
|
|
const deviceTriggerTypes = [
|
2025-07-17 21:31:12 +08:00
|
|
|
|
TriggerTypeEnum.DEVICE_STATE_UPDATE,
|
|
|
|
|
|
TriggerTypeEnum.DEVICE_PROPERTY_POST,
|
|
|
|
|
|
TriggerTypeEnum.DEVICE_EVENT_POST,
|
|
|
|
|
|
TriggerTypeEnum.DEVICE_SERVICE_INVOKE
|
2025-07-28 16:45:43 +08:00
|
|
|
|
] as number[]
|
|
|
|
|
|
return deviceTriggerTypes.includes(type)
|
2025-07-17 21:31:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 事件处理
|
2025-07-28 21:38:27 +08:00
|
|
|
|
const updateTriggerType = (type: number) => {
|
|
|
|
|
|
trigger.value.type = type
|
|
|
|
|
|
onTriggerTypeChange(type)
|
2025-07-17 21:31:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-28 23:25:54 +08:00
|
|
|
|
// TODO @puhui999:updateTriggerDeviceConfig
|
2025-07-28 21:38:27 +08:00
|
|
|
|
const updateTrigger = (newTrigger: TriggerFormData) => {
|
|
|
|
|
|
trigger.value = newTrigger
|
2025-07-17 21:31:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-28 23:25:54 +08:00
|
|
|
|
// TODO @puhui999:updateTriggerCronConfig
|
2025-07-28 21:38:27 +08:00
|
|
|
|
const updateTriggerCronExpression = (cronExpression?: string) => {
|
|
|
|
|
|
trigger.value.cronExpression = cronExpression
|
2025-07-17 21:31:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-28 21:38:27 +08:00
|
|
|
|
const onTriggerTypeChange = (type: number) => {
|
2025-07-17 21:31:12 +08:00
|
|
|
|
// 清理不相关的配置
|
|
|
|
|
|
if (type === TriggerTypeEnum.TIMER) {
|
2025-07-28 21:38:27 +08:00
|
|
|
|
trigger.value.productId = undefined
|
|
|
|
|
|
trigger.value.deviceId = undefined
|
|
|
|
|
|
trigger.value.identifier = undefined
|
|
|
|
|
|
trigger.value.operator = undefined
|
|
|
|
|
|
trigger.value.value = undefined
|
|
|
|
|
|
trigger.value.mainCondition = undefined
|
|
|
|
|
|
trigger.value.conditionGroup = undefined
|
|
|
|
|
|
if (!trigger.value.cronExpression) {
|
|
|
|
|
|
trigger.value.cronExpression = '0 0 12 * * ?'
|
2025-07-17 21:31:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2025-07-28 21:38:27 +08:00
|
|
|
|
trigger.value.cronExpression = undefined
|
2025-07-17 21:31:12 +08:00
|
|
|
|
if (type === TriggerTypeEnum.DEVICE_STATE_UPDATE) {
|
2025-07-28 21:38:27 +08:00
|
|
|
|
trigger.value.mainCondition = undefined
|
|
|
|
|
|
trigger.value.conditionGroup = undefined
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 设备属性、事件、服务触发需要条件配置
|
|
|
|
|
|
if (!trigger.value.mainCondition) {
|
|
|
|
|
|
trigger.value.mainCondition = undefined // 等待用户配置
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!trigger.value.conditionGroup) {
|
|
|
|
|
|
trigger.value.conditionGroup = undefined // 可选的条件组
|
|
|
|
|
|
}
|
2025-07-17 21:31:12 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
</script>
|