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