From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目
---
src/views/iot/rule/scene/form/selectors/OperatorSelector.vue | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 264 insertions(+), 0 deletions(-)
diff --git a/src/views/iot/rule/scene/form/selectors/OperatorSelector.vue b/src/views/iot/rule/scene/form/selectors/OperatorSelector.vue
new file mode 100644
index 0000000..df98de6
--- /dev/null
+++ b/src/views/iot/rule/scene/form/selectors/OperatorSelector.vue
@@ -0,0 +1,264 @@
+<!-- 鎿嶄綔绗﹂�夋嫨鍣ㄧ粍浠� -->
+<template>
+ <div class="w-full">
+ <el-select
+ v-model="localValue"
+ placeholder="璇烽�夋嫨鎿嶄綔绗�"
+ @change="handleChange"
+ class="w-full"
+ >
+ <el-option
+ v-for="operator in availableOperators"
+ :key="operator.value"
+ :label="operator.label"
+ :value="operator.value"
+ >
+ <div class="flex items-center justify-between w-full py-4px">
+ <div class="flex items-center gap-8px">
+ <div class="text-14px font-500 text-[var(--el-text-color-primary)]">
+ {{ operator.label }}
+ </div>
+ <div
+ class="text-12px text-[var(--el-color-primary)] bg-[var(--el-color-primary-light-9)] px-6px py-2px rounded-4px font-mono"
+ >
+ {{ operator.symbol }}
+ </div>
+ </div>
+ <div class="text-12px text-[var(--el-text-color-secondary)]">
+ {{ operator.description }}
+ </div>
+ </div>
+ </el-option>
+ </el-select>
+ </div>
+</template>
+
+<script setup lang="ts">
+import { useVModel } from '@vueuse/core'
+import {
+ IotRuleSceneTriggerConditionParameterOperatorEnum,
+ IoTDataSpecsDataTypeEnum
+} from '@/views/iot/utils/constants'
+
+/** 鎿嶄綔绗﹂�夋嫨鍣ㄧ粍浠� */
+defineOptions({ name: 'OperatorSelector' })
+
+const props = defineProps<{
+ modelValue?: string
+ propertyType?: string
+}>()
+
+const emit = defineEmits<{
+ (e: 'update:modelValue', value: string): void
+ (e: 'change', value: string): void
+}>()
+
+const localValue = useVModel(props, 'modelValue', emit)
+
+// 鍩轰簬鏋氫妇鐨勬搷浣滅瀹氫箟
+const allOperators = [
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.EQUALS.name,
+ symbol: '=',
+ description: '鍊煎畬鍏ㄧ浉绛夋椂瑙﹀彂',
+ example: 'temperature = 25',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.TEXT,
+ IoTDataSpecsDataTypeEnum.BOOL,
+ IoTDataSpecsDataTypeEnum.ENUM
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_EQUALS.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_EQUALS.name,
+ symbol: '鈮�',
+ description: '鍊间笉鐩哥瓑鏃惰Е鍙�',
+ example: 'power != false',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.TEXT,
+ IoTDataSpecsDataTypeEnum.BOOL,
+ IoTDataSpecsDataTypeEnum.ENUM
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN.name,
+ symbol: '>',
+ description: '鍊煎ぇ浜庢寚瀹氬�兼椂瑙﹀彂',
+ example: 'temperature > 30',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.DATE
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.GREATER_THAN_OR_EQUALS.name,
+ symbol: '鈮�',
+ description: '鍊煎ぇ浜庢垨绛変簬鎸囧畾鍊兼椂瑙﹀彂',
+ example: 'humidity >= 80',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.DATE
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN.name,
+ symbol: '<',
+ description: '鍊煎皬浜庢寚瀹氬�兼椂瑙﹀彂',
+ example: 'temperature < 10',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.DATE
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.LESS_THAN_OR_EQUALS.name,
+ symbol: '鈮�',
+ description: '鍊煎皬浜庢垨绛変簬鎸囧畾鍊兼椂瑙﹀彂',
+ example: 'battery <= 20',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.DATE
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.IN.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.IN.name,
+ symbol: '鈭�',
+ description: '鍊煎湪鎸囧畾鍒楄〃涓椂瑙﹀彂',
+ example: 'status in [1,2,3]',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.TEXT,
+ IoTDataSpecsDataTypeEnum.ENUM
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_IN.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_IN.name,
+ symbol: '鈭�',
+ description: '鍊间笉鍦ㄦ寚瀹氬垪琛ㄤ腑鏃惰Е鍙�',
+ example: 'status not in [1,2,3]',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.TEXT,
+ IoTDataSpecsDataTypeEnum.ENUM
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN.name,
+ symbol: '鈯�',
+ description: '鍊煎湪鎸囧畾鑼冨洿鍐呮椂瑙﹀彂',
+ example: 'temperature between 20,30',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.DATE
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_BETWEEN.name,
+ symbol: '鈯�',
+ description: '鍊间笉鍦ㄦ寚瀹氳寖鍥村唴鏃惰Е鍙�',
+ example: 'temperature not between 20,30',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.DATE
+ ]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.LIKE.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.LIKE.name,
+ symbol: '鈮�',
+ description: '瀛楃涓插尮閰嶆寚瀹氭ā寮忔椂瑙﹀彂',
+ example: 'message like "%error%"',
+ supportedTypes: [IoTDataSpecsDataTypeEnum.TEXT]
+ },
+ {
+ value: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_NULL.value,
+ label: IotRuleSceneTriggerConditionParameterOperatorEnum.NOT_NULL.name,
+ symbol: '鈮犫垍',
+ description: '鍊奸潪绌烘椂瑙﹀彂',
+ example: 'data not null',
+ supportedTypes: [
+ IoTDataSpecsDataTypeEnum.INT,
+ IoTDataSpecsDataTypeEnum.FLOAT,
+ IoTDataSpecsDataTypeEnum.DOUBLE,
+ IoTDataSpecsDataTypeEnum.TEXT,
+ IoTDataSpecsDataTypeEnum.BOOL,
+ IoTDataSpecsDataTypeEnum.ENUM,
+ IoTDataSpecsDataTypeEnum.DATE
+ ]
+ }
+]
+
+// 璁$畻灞炴�э細鍙敤鐨勬搷浣滅
+const availableOperators = computed(() => {
+ if (!props.propertyType) {
+ return allOperators
+ }
+ return allOperators.filter((op) =>
+ (op.supportedTypes as any[]).includes(props.propertyType || '')
+ )
+})
+
+// 璁$畻灞炴�э細褰撳墠閫変腑鐨勬搷浣滅
+const selectedOperator = computed(() => {
+ return allOperators.find((op) => op.value === localValue.value)
+})
+
+/**
+ * 澶勭悊閫夋嫨鍙樺寲浜嬩欢
+ * @param value 閫変腑鐨勬搷浣滅鍊�
+ */
+const handleChange = (value: string) => {
+ emit('change', value)
+}
+
+/** 鐩戝惉灞炴�х被鍨嬪彉鍖� */
+watch(
+ () => props.propertyType,
+ () => {
+ // 濡傛灉褰撳墠閫夋嫨鐨勬搷浣滅涓嶆敮鎸佹柊鐨勫睘鎬х被鍨嬶紝鍒欐竻绌洪�夋嫨
+ if (
+ localValue.value &&
+ selectedOperator.value &&
+ !(selectedOperator.value.supportedTypes as any[]).includes(props.propertyType || '')
+ ) {
+ localValue.value = ''
+ }
+ }
+)
+</script>
+
+<style scoped>
+:deep(.el-select-dropdown__item) {
+ height: auto;
+ padding: 8px 20px;
+}
+</style>
--
Gitblit v1.8.0