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/thingmodel/dataSpecs/ThingModelEnumDataSpecs.vue |  160 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 160 insertions(+), 0 deletions(-)

diff --git a/src/views/iot/thingmodel/dataSpecs/ThingModelEnumDataSpecs.vue b/src/views/iot/thingmodel/dataSpecs/ThingModelEnumDataSpecs.vue
new file mode 100644
index 0000000..71d4778
--- /dev/null
+++ b/src/views/iot/thingmodel/dataSpecs/ThingModelEnumDataSpecs.vue
@@ -0,0 +1,160 @@
+<!-- dataType锛歟num 鏁扮粍绫诲瀷 -->
+<template>
+  <el-form-item
+    :rules="[{ required: true, validator: validateEnumList, trigger: 'change' }]"
+    label="鏋氫妇椤�"
+  >
+    <div class="flex flex-col">
+      <div class="flex items-center">
+        <span class="flex-1"> 鍙傛暟鍊� </span>
+        <span class="flex-1"> 鍙傛暟鎻忚堪 </span>
+      </div>
+      <div
+        v-for="(item, index) in dataSpecsList"
+        :key="index"
+        class="flex items-center justify-between mb-5px"
+      >
+        <el-form-item
+          :prop="`property.dataSpecsList[${index}].value`"
+          :rules="[
+            { required: true, message: '鏋氫妇鍊间笉鑳戒负绌�' },
+            { validator: validateEnumValue, trigger: 'blur' }
+          ]"
+          class="flex-1 mb-0"
+        >
+          <el-input v-model="item.value" placeholder="璇疯緭鍏ユ灇涓惧��,濡�'0'" />
+        </el-form-item>
+        <span class="mx-2">~</span>
+        <el-form-item
+          :prop="`property.dataSpecsList[${index}].name`"
+          :rules="[
+            { required: true, message: '鏋氫妇鎻忚堪涓嶈兘涓虹┖' },
+            { validator: validateEnumName, trigger: 'blur' }
+          ]"
+          class="flex-1 mb-0"
+        >
+          <el-input v-model="item.name" placeholder="瀵硅鏋氫妇椤圭殑鎻忚堪" />
+        </el-form-item>
+        <el-button class="ml-10px" link type="primary" @click="deleteEnum(index)">鍒犻櫎</el-button>
+      </div>
+      <el-button link type="primary" @click="addEnum">+娣诲姞鏋氫妇椤�</el-button>
+    </div>
+  </el-form-item>
+</template>
+
+<script lang="ts" setup>
+import { useVModel } from '@vueuse/core'
+import { isEmpty } from '@/utils/is'
+import { IoTDataSpecsDataTypeEnum } from '@/views/iot/utils/constants'
+import { DataSpecsEnumOrBoolData } from '@/api/iot/thingmodel'
+
+/** 鏋氫妇鍨嬬殑 dataSpecs 閰嶇疆缁勪欢 */
+defineOptions({ name: 'ThingModelEnumDataSpecs' })
+
+const props = defineProps<{ modelValue: any }>()
+const emits = defineEmits(['update:modelValue'])
+const dataSpecsList = useVModel(props, 'modelValue', emits) as Ref<DataSpecsEnumOrBoolData[]>
+const message = useMessage()
+
+/** 娣诲姞鏋氫妇椤� */
+const addEnum = () => {
+  dataSpecsList.value.push({
+    dataType: IoTDataSpecsDataTypeEnum.ENUM,
+    name: '', // 鏋氫妇椤圭殑鍚嶇О
+    value: undefined // 鏋氫妇鍊�
+  })
+}
+
+/** 鍒犻櫎鏋氫妇椤� */
+const deleteEnum = (index: number) => {
+  if (dataSpecsList.value.length === 1) {
+    message.warning('鑷冲皯闇�瑕佷竴涓灇涓鹃」')
+    return
+  }
+  dataSpecsList.value.splice(index, 1)
+}
+
+/** 鏍¢獙鏋氫妇鍊� */
+const validateEnumValue = (_: any, value: any, callback: any) => {
+  if (isEmpty(value)) {
+    callback(new Error('鏋氫妇鍊间笉鑳戒负绌�'))
+    return
+  }
+  if (isNaN(Number(value))) {
+    callback(new Error('鏋氫妇鍊煎繀椤绘槸鏁板瓧'))
+    return
+  }
+  // 妫�鏌ユ灇涓惧�兼槸鍚﹂噸澶�
+  const values = dataSpecsList.value.map((item) => item.value)
+  if (values.filter((v) => v === value).length > 1) {
+    callback(new Error('鏋氫妇鍊间笉鑳介噸澶�'))
+    return
+  }
+  callback()
+}
+
+/** 鏍¢獙鏋氫妇鎻忚堪 */
+const validateEnumName = (_: any, value: string, callback: any) => {
+  if (isEmpty(value)) {
+    callback(new Error('鏋氫妇鎻忚堪涓嶈兘涓虹┖'))
+    return
+  }
+  // 妫�鏌ュ紑澶村瓧绗�
+  if (!/^[\u4e00-\u9fa5a-zA-Z0-9]/.test(value)) {
+    callback(new Error('鏋氫妇鎻忚堪蹇呴』浠ヤ腑鏂囥�佽嫳鏂囧瓧姣嶆垨鏁板瓧寮�澶�'))
+    return
+  }
+  // 妫�鏌ユ暣浣撴牸寮�
+  if (!/^[\u4e00-\u9fa5a-zA-Z0-9][a-zA-Z0-9\u4e00-\u9fa5_-]*$/.test(value)) {
+    callback(new Error('鏋氫妇鎻忚堪鍙兘鍖呭惈涓枃銆佽嫳鏂囧瓧姣嶃�佹暟瀛椼�佷笅鍒掔嚎鍜岀煭鍒掔嚎'))
+    return
+  }
+  // 妫�鏌ラ暱搴︼紙涓�涓腑鏂囩畻涓�涓瓧绗︼級
+  if (value.length > 20) {
+    callback(new Error('鏋氫妇鎻忚堪闀垮害涓嶈兘瓒呰繃20涓瓧绗�'))
+    return
+  }
+  callback()
+}
+
+/** 鏍¢獙鏁翠釜鏋氫妇鍒楄〃 */
+const validateEnumList = (_: any, __: any, callback: any) => {
+  if (isEmpty(dataSpecsList.value)) {
+    callback(new Error('璇疯嚦灏戞坊鍔犱竴涓灇涓鹃」'))
+    return
+  }
+
+  // 妫�鏌ユ槸鍚﹀瓨鍦ㄧ┖鍊�
+  const hasEmptyValue = dataSpecsList.value.some(
+    (item) => isEmpty(item.value) || isEmpty(item.name)
+  )
+  if (hasEmptyValue) {
+    callback(new Error('瀛樺湪鏈~鍐欑殑鏋氫妇鍊兼垨鎻忚堪'))
+    return
+  }
+
+  // 妫�鏌ユ灇涓惧�兼槸鍚﹂兘鏄暟瀛�
+  const hasInvalidNumber = dataSpecsList.value.some((item) => isNaN(Number(item.value)))
+  if (hasInvalidNumber) {
+    callback(new Error('瀛樺湪闈炴暟瀛楃殑鏋氫妇鍊�'))
+    return
+  }
+
+  // 妫�鏌ユ槸鍚︽湁閲嶅鐨勬灇涓惧��
+  const values = dataSpecsList.value.map((item) => item.value)
+  const uniqueValues = new Set(values)
+  if (values.length !== uniqueValues.size) {
+    callback(new Error('瀛樺湪閲嶅鐨勬灇涓惧��'))
+    return
+  }
+  callback()
+}
+</script>
+
+<style lang="scss" scoped>
+:deep(.el-form-item) {
+  .el-form-item {
+    margin-bottom: 0;
+  }
+}
+</style>

--
Gitblit v1.8.0