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/inputs/ValueInput.vue |  266 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 266 insertions(+), 0 deletions(-)

diff --git a/src/views/iot/rule/scene/form/inputs/ValueInput.vue b/src/views/iot/rule/scene/form/inputs/ValueInput.vue
new file mode 100644
index 0000000..40548bd
--- /dev/null
+++ b/src/views/iot/rule/scene/form/inputs/ValueInput.vue
@@ -0,0 +1,266 @@
+<!-- 鍊艰緭鍏ョ粍浠� -->
+<template>
+  <div class="w-full min-w-0">
+    <!-- 甯冨皵鍊奸�夋嫨 -->
+    <el-select
+      v-if="propertyType === IoTDataSpecsDataTypeEnum.BOOL"
+      v-model="localValue"
+      placeholder="璇烽�夋嫨甯冨皵鍊�"
+      class="w-full!"
+    >
+      <el-option label="鐪� (true)" value="true" />
+      <el-option label="鍋� (false)" value="false" />
+    </el-select>
+
+    <!-- 鏋氫妇鍊奸�夋嫨 -->
+    <el-select
+      v-else-if="propertyType === IoTDataSpecsDataTypeEnum.ENUM && enumOptions.length > 0"
+      v-model="localValue"
+      placeholder="璇烽�夋嫨鏋氫妇鍊�"
+      class="w-full!"
+    >
+      <el-option
+        v-for="option in enumOptions"
+        :key="option.value"
+        :label="option.label"
+        :value="option.value"
+      />
+    </el-select>
+
+    <!-- 鑼冨洿杈撳叆 (between 鎿嶄綔绗�) -->
+    <div
+      v-else-if="operator === IotRuleSceneTriggerConditionParameterOperatorEnum.BETWEEN.value"
+      class="w-full! flex items-center gap-8px"
+    >
+      <el-input
+        v-model="rangeStart"
+        :type="getInputType()"
+        placeholder="鏈�灏忓��"
+        @input="handleRangeChange"
+        class="flex-1 min-w-0"
+        style="width: auto !important"
+      />
+      <span class="text-12px text-[var(--el-text-color-secondary)] whitespace-nowrap">鑷�</span>
+      <el-input
+        v-model="rangeEnd"
+        :type="getInputType()"
+        placeholder="鏈�澶у��"
+        @input="handleRangeChange"
+        class="flex-1 min-w-0"
+      />
+    </div>
+
+    <!-- 鍒楄〃杈撳叆 (in 鎿嶄綔绗�) -->
+    <div
+      v-else-if="operator === IotRuleSceneTriggerConditionParameterOperatorEnum.IN.value"
+      class="w-full!"
+    >
+      <el-input v-model="localValue" placeholder="璇疯緭鍏ュ�煎垪琛紝鐢ㄩ�楀彿鍒嗛殧" class="w-full!">
+        <template #suffix>
+          <el-tooltip content="澶氫釜鍊肩敤閫楀彿鍒嗛殧锛屽锛�1,2,3" placement="top">
+            <Icon
+              icon="ep:question-filled"
+              class="text-[var(--el-text-color-placeholder)] cursor-help"
+            />
+          </el-tooltip>
+        </template>
+      </el-input>
+      <div v-if="listPreview.length > 0" class="mt-8px flex items-center gap-6px flex-wrap">
+        <span class="text-12px text-[var(--el-text-color-secondary)]">瑙f瀽缁撴灉锛�</span>
+        <el-tag v-for="(item, index) in listPreview" :key="index" size="small" class="m-0">
+          {{ item }}
+        </el-tag>
+      </div>
+    </div>
+
+    <!-- 鏃ユ湡鏃堕棿杈撳叆 -->
+    <el-date-picker
+      v-else-if="propertyType === IoTDataSpecsDataTypeEnum.DATE"
+      v-model="dateValue"
+      type="datetime"
+      placeholder="璇烽�夋嫨鏃ユ湡鏃堕棿"
+      format="YYYY-MM-DD HH:mm:ss"
+      value-format="YYYY-MM-DD HH:mm:ss"
+      @change="handleDateChange"
+      class="w-full!"
+    />
+
+    <!-- 鏁板瓧杈撳叆 -->
+    <el-input-number
+      v-else-if="isNumericType()"
+      v-model="numberValue"
+      :precision="getPrecision()"
+      :step="getStep()"
+      :min="getMin()"
+      :max="getMax()"
+      placeholder="璇疯緭鍏ユ暟鍊�"
+      @change="handleNumberChange"
+      class="w-full!"
+    />
+
+    <!-- 鏂囨湰杈撳叆 -->
+    <el-input
+      v-else
+      v-model="localValue"
+      :type="getInputType()"
+      :placeholder="getPlaceholder()"
+      class="w-full!"
+    >
+      <template #suffix>
+        <el-tooltip
+          v-if="propertyConfig?.unit"
+          :content="`鍗曚綅锛�${propertyConfig.unit}`"
+          placement="top"
+        >
+          <span class="text-12px text-[var(--el-text-color-secondary)] px-4px">
+            {{ propertyConfig.unit }}
+          </span>
+        </el-tooltip>
+      </template>
+    </el-input>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { useVModel } from '@vueuse/core'
+import {
+  IoTDataSpecsDataTypeEnum,
+  IotRuleSceneTriggerConditionParameterOperatorEnum
+} from '@/views/iot/utils/constants'
+
+/** 鍊艰緭鍏ョ粍浠� */
+defineOptions({ name: 'ValueInput' })
+
+interface Props {
+  modelValue?: string
+  propertyType?: string
+  operator?: string
+  propertyConfig?: any
+}
+
+interface Emits {
+  (e: 'update:modelValue', value: string): void
+}
+
+const props = defineProps<Props>()
+const emit = defineEmits<Emits>()
+
+const localValue = useVModel(props, 'modelValue', emit, {
+  defaultValue: ''
+})
+
+const rangeStart = ref('') // 鑼冨洿寮�濮嬪��
+const rangeEnd = ref('') // 鑼冨洿缁撴潫鍊�
+const dateValue = ref('') // 鏃ユ湡鍊�
+const numberValue = ref<number>() // 鏁板瓧鍊�
+
+/** 璁$畻灞炴�э細鏋氫妇閫夐」 */
+const enumOptions = computed(() => {
+  if (props.propertyConfig?.enum) {
+    return props.propertyConfig.enum.map((item: any) => ({
+      label: item.name || item.label || item.value,
+      value: item.value
+    }))
+  }
+  return []
+})
+
+/** 璁$畻灞炴�э細鍒楄〃棰勮 */
+const listPreview = computed(() => {
+  if (
+    props.operator === IotRuleSceneTriggerConditionParameterOperatorEnum.IN.value &&
+    localValue.value
+  ) {
+    return localValue.value
+      .split(',')
+      .map((item) => item.trim())
+      .filter((item) => item)
+  }
+  return []
+})
+
+/** 鍒ゆ柇鏄惁涓烘暟瀛楃被鍨� */
+const isNumericType = () => {
+  return [
+    IoTDataSpecsDataTypeEnum.INT,
+    IoTDataSpecsDataTypeEnum.FLOAT,
+    IoTDataSpecsDataTypeEnum.DOUBLE
+  ].includes((props.propertyType || '') as any)
+}
+
+/** 鑾峰彇杈撳叆妗嗙被鍨� */
+const getInputType = () => {
+  switch (props.propertyType) {
+    case IoTDataSpecsDataTypeEnum.INT:
+    case IoTDataSpecsDataTypeEnum.FLOAT:
+    case IoTDataSpecsDataTypeEnum.DOUBLE:
+      return 'number'
+    default:
+      return 'text'
+  }
+}
+
+/** 鑾峰彇鍗犱綅绗︽枃鏈� */
+const getPlaceholder = () => {
+  const typeMap = {
+    [IoTDataSpecsDataTypeEnum.TEXT]: '璇疯緭鍏ュ瓧绗︿覆',
+    [IoTDataSpecsDataTypeEnum.INT]: '璇疯緭鍏ユ暣鏁�',
+    [IoTDataSpecsDataTypeEnum.FLOAT]: '璇疯緭鍏ユ诞鐐规暟',
+    [IoTDataSpecsDataTypeEnum.DOUBLE]: '璇疯緭鍏ュ弻绮惧害鏁�',
+    [IoTDataSpecsDataTypeEnum.STRUCT]: '璇疯緭鍏� JSON 鏍煎紡鏁版嵁',
+    [IoTDataSpecsDataTypeEnum.ARRAY]: '璇疯緭鍏ユ暟缁勬牸寮忔暟鎹�'
+  }
+  return typeMap[props.propertyType || ''] || '璇疯緭鍏ュ��'
+}
+
+/** 鑾峰彇鏁板瓧绮惧害 */
+const getPrecision = () => {
+  return props.propertyType === IoTDataSpecsDataTypeEnum.INT ? 0 : 2
+}
+
+/** 鑾峰彇鏁板瓧姝ラ暱 */
+const getStep = () => {
+  return props.propertyType === IoTDataSpecsDataTypeEnum.INT ? 1 : 0.1
+}
+
+/** 鑾峰彇鏈�灏忓�� */
+const getMin = () => {
+  return props.propertyConfig?.min || undefined
+}
+
+/** 鑾峰彇鏈�澶у�� */
+const getMax = () => {
+  return props.propertyConfig?.max || undefined
+}
+
+/** 澶勭悊鑼冨洿鍙樺寲浜嬩欢 */
+const handleRangeChange = () => {
+  if (rangeStart.value && rangeEnd.value) {
+    localValue.value = `${rangeStart.value},${rangeEnd.value}`
+  } else {
+    localValue.value = ''
+  }
+}
+
+/** 澶勭悊鏃ユ湡鍙樺寲浜嬩欢 */
+const handleDateChange = (value: string) => {
+  localValue.value = value || ''
+}
+
+/** 澶勭悊鏁板瓧鍙樺寲浜嬩欢 */
+const handleNumberChange = (value: number | undefined) => {
+  localValue.value = value?.toString() || ''
+}
+
+/** 鐩戝惉鎿嶄綔绗﹀彉鍖� */
+watch(
+  () => props.operator,
+  () => {
+    localValue.value = ''
+    rangeStart.value = ''
+    rangeEnd.value = ''
+    dateValue.value = ''
+    numberValue.value = undefined
+  }
+)
+</script>

--
Gitblit v1.8.0