From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/api/iot/thingmodel/index.ts |  301 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 301 insertions(+), 0 deletions(-)

diff --git a/src/api/iot/thingmodel/index.ts b/src/api/iot/thingmodel/index.ts
new file mode 100644
index 0000000..bcf9e07
--- /dev/null
+++ b/src/api/iot/thingmodel/index.ts
@@ -0,0 +1,301 @@
+import request from '@/config/axios'
+import { isEmpty } from '@/utils/is'
+
+/**
+ * IoT 浜у搧鐗╂ā鍨�
+ */
+export interface ThingModelData {
+  id?: number // 鐗╂ā鍨嬪姛鑳界紪鍙�
+  identifier?: string // 鍔熻兘鏍囪瘑
+  name?: string // 鍔熻兘鍚嶇О
+  description?: string // 鍔熻兘鎻忚堪
+  productId?: number // 浜у搧缂栧彿
+  productKey?: string // 浜у搧鏍囪瘑
+  dataType: string // 鏁版嵁绫诲瀷锛屼笌 dataSpecs 鐨� dataType 淇濇寔涓�鑷�
+  type: number // 鍔熻兘绫诲瀷
+  property: ThingModelProperty // 灞炴��
+  event?: ThingModelEvent // 浜嬩欢
+  service?: ThingModelService // 鏈嶅姟
+}
+
+/**
+ * ThingModelProperty 绫诲瀷
+ */
+export interface ThingModelProperty {
+  [key: string]: any
+}
+
+/**
+ * ThingModelEvent 绫诲瀷
+ */
+export interface ThingModelEvent {
+  [key: string]: any
+}
+
+/**
+ * ThingModelService 绫诲瀷
+ */
+export interface ThingModelService {
+  [key: string]: any
+}
+
+/** dataSpecs 鏁板�煎瀷鏁版嵁缁撴瀯 */
+export interface DataSpecsNumberData {
+  dataType: 'int' | 'float' | 'double' // 鏁版嵁绫诲瀷锛屽彇鍊间负 INT銆丗LOAT 鎴� DOUBLE
+  max: string // 鏈�澶у�硷紝蹇呴』涓� dataType 璁剧疆涓�鑷达紝涓斾负 STRING 绫诲瀷
+  min: string // 鏈�灏忓�硷紝蹇呴』涓� dataType 璁剧疆涓�鑷达紝涓斾负 STRING 绫诲瀷
+  step: string // 姝ラ暱锛屽繀椤讳笌 dataType 璁剧疆涓�鑷达紝涓斾负 STRING 绫诲瀷
+  precise?: string // 绮惧害锛屽綋 dataType 涓� FLOAT 鎴� DOUBLE 鏃跺彲閫�
+  defaultValue?: string // 榛樿鍊硷紝鍙��
+  unit: string // 鍗曚綅鐨勭鍙�
+  unitName: string // 鍗曚綅鐨勫悕绉�
+}
+
+/** dataSpecs 鏋氫妇鍨嬫暟鎹粨鏋� */
+export interface DataSpecsEnumOrBoolData {
+  dataType: 'enum' | 'bool'
+  defaultValue?: string // 榛樿鍊硷紝鍙��
+  name: string // 鏋氫妇椤圭殑鍚嶇О
+  value: number | undefined // 鏋氫妇鍊�
+}
+
+/** 鐗╂ā鍨婽SL鍝嶅簲鏁版嵁缁撴瀯 */
+export interface IotThingModelTSLResp {
+  productId: number
+  productKey: string
+  properties: ThingModelProperty[]
+  events: ThingModelEvent[]
+  services: ThingModelService[]
+}
+
+/** 鐗╂ā鍨嬪睘鎬� */
+export interface ThingModelProperty {
+  identifier: string
+  name: string
+  accessMode: string
+  required?: boolean
+  dataType: string
+  description?: string
+  dataSpecs?: ThingModelProperty
+  dataSpecsList?: ThingModelProperty[]
+}
+
+/** 鐗╂ā鍨嬩簨浠� */
+export interface ThingModelEvent {
+  identifier: string
+  name: string
+  required?: boolean
+  type: string
+  description?: string
+  outputParams?: ThingModelParam[]
+  method?: string
+}
+
+/** 鐗╂ā鍨嬫湇鍔� */
+export interface ThingModelService {
+  identifier: string
+  name: string
+  required?: boolean
+  callType: string
+  description?: string
+  inputParams?: ThingModelParam[]
+  outputParams?: ThingModelParam[]
+  method?: string
+}
+
+/** 鐗╂ā鍨嬪弬鏁� */
+export interface ThingModelParam {
+  identifier: string
+  name: string
+  direction: string
+  paraOrder?: number
+  dataType: string
+  dataSpecs?: ThingModelProperty
+  dataSpecsList?: ThingModelProperty[]
+}
+
+/** 鏁板�煎瀷鏁版嵁瑙勮寖 */
+export interface ThingModelNumericDataSpec {
+  dataType: 'int' | 'float' | 'double'
+  max: string
+  min: string
+  step: string
+  precise?: string
+  defaultValue?: string
+  unit?: string
+  unitName?: string
+}
+
+/** 甯冨皵/鏋氫妇鍨嬫暟鎹鑼� */
+export interface ThingModelBoolOrEnumDataSpecs {
+  dataType: 'bool' | 'enum'
+  name: string
+  value: number
+}
+
+/** 鏂囨湰/鏃堕棿鍨嬫暟鎹鑼� */
+export interface ThingModelDateOrTextDataSpecs {
+  dataType: 'text' | 'date'
+  length?: number
+  defaultValue?: string
+}
+
+/** 鏁扮粍鍨嬫暟鎹鑼� */
+export interface ThingModelArrayDataSpecs {
+  dataType: 'array'
+  size: number
+  childDataType: string
+  dataSpecsList?: ThingModelProperty[]
+}
+
+/** 缁撴瀯浣撳瀷鏁版嵁瑙勮寖 */
+export interface ThingModelStructDataSpecs {
+  dataType: 'struct'
+  identifier: string
+  name: string
+  accessMode: string
+  required?: boolean
+  childDataType: string
+  dataSpecs?: ThingModelProperty
+  dataSpecsList?: ThingModelProperty[]
+}
+
+// IoT 浜у搧鐗╂ā鍨� API
+export const ThingModelApi = {
+  // 鏌ヨ浜у搧鐗╂ā鍨嬪垎椤�
+  getThingModelPage: async (params: any) => {
+    return await request.get({ url: `/iot/thing-model/page`, params })
+  },
+
+  // 鑾峰緱浜у搧鐗╂ā鍨嬪垪琛�
+  getThingModelList: async (params: any) => {
+    return await request.get({ url: `/iot/thing-model/list`, params })
+  },
+
+  // 鑾峰緱浜у搧鐗╂ā鍨� TSL
+  getThingModelTSLByProductId: async (productId: number) => {
+    return await request.get({
+      url: `/iot/thing-model/get-tsl?productId=${productId}`
+    })
+  },
+
+  // 鏌ヨ浜у搧鐗╂ā鍨嬭鎯�
+  getThingModel: async (id: number) => {
+    return await request.get({ url: `/iot/thing-model/get?id=` + id })
+  },
+
+  // 鏂板浜у搧鐗╂ā鍨�
+  createThingModel: async (data: ThingModelData) => {
+    return await request.post({ url: `/iot/thing-model/create`, data })
+  },
+
+  // 淇敼浜у搧鐗╂ā鍨�
+  updateThingModel: async (data: ThingModelData) => {
+    return await request.put({ url: `/iot/thing-model/update`, data })
+  },
+
+  // 鍒犻櫎浜у搧鐗╂ā鍨�
+  deleteThingModel: async (id: number) => {
+    return await request.delete({ url: `/iot/thing-model/delete?id=` + id })
+  }
+}
+
+/** 鍏叡鏍¢獙瑙勫垯 */
+export const ThingModelFormRules = {
+  name: [
+    { required: true, message: '鍔熻兘鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' },
+    {
+      pattern: /^[\u4e00-\u9fa5a-zA-Z0-9][\u4e00-\u9fa5a-zA-Z0-9\-_/\.]{0,29}$/,
+      message:
+        '鏀寔涓枃銆佸ぇ灏忓啓瀛楁瘝銆佹棩鏂囥�佹暟瀛椼�佺煭鍒掔嚎銆佷笅鍒掔嚎銆佹枩鏉犲拰灏忔暟鐐癸紝蹇呴』浠ヤ腑鏂囥�佽嫳鏂囨垨鏁板瓧寮�澶达紝涓嶈秴杩� 30 涓瓧绗�',
+      trigger: 'blur'
+    }
+  ],
+  type: [{ required: true, message: '鍔熻兘绫诲瀷涓嶈兘涓虹┖', trigger: 'blur' }],
+  identifier: [
+    { required: true, message: '鏍囪瘑绗︿笉鑳戒负绌�', trigger: 'blur' },
+    {
+      pattern: /^[a-zA-Z0-9_]{1,50}$/,
+      message: '鏀寔澶у皬鍐欏瓧姣嶃�佹暟瀛楀拰涓嬪垝绾匡紝涓嶈秴杩� 50 涓瓧绗�',
+      trigger: 'blur'
+    },
+    {
+      validator: (_: any, value: string, callback: any) => {
+        const reservedKeywords = ['set', 'get', 'post', 'property', 'event', 'time', 'value']
+        if (reservedKeywords.includes(value)) {
+          callback(
+            new Error(
+              'set, get, post, property, event, time, value 鏄郴缁熶繚鐣欏瓧娈碉紝涓嶈兘鐢ㄤ簬鏍囪瘑绗﹀畾涔�'
+            )
+          )
+        } else if (/^\d+$/.test(value)) {
+          callback(new Error('鏍囪瘑绗︿笉鑳芥槸绾暟瀛�'))
+        } else {
+          callback()
+        }
+      },
+      trigger: 'blur'
+    }
+  ],
+  'property.dataSpecs.childDataType': [{ required: true, message: '鍏冪礌绫诲瀷涓嶈兘涓虹┖' }],
+  'property.dataSpecs.size': [
+    { required: true, message: '鍏冪礌涓暟涓嶈兘涓虹┖' },
+    {
+      validator: (_: any, value: any, callback: any) => {
+        if (isEmpty(value)) {
+          callback(new Error('鍏冪礌涓暟涓嶈兘涓虹┖'))
+          return
+        }
+        if (isNaN(Number(value))) {
+          callback(new Error('鍏冪礌涓暟蹇呴』鏄暟瀛�'))
+          return
+        }
+        callback()
+      },
+      trigger: 'blur'
+    }
+  ],
+  'property.dataSpecs.length': [
+    { required: true, message: '璇疯緭鍏ユ枃鏈瓧鑺傞暱搴�', trigger: 'blur' },
+    {
+      validator: (_: any, value: any, callback: any) => {
+        if (isEmpty(value)) {
+          callback(new Error('鏂囨湰闀垮害涓嶈兘涓虹┖'))
+          return
+        }
+        if (isNaN(Number(value))) {
+          callback(new Error('鏂囨湰闀垮害蹇呴』鏄暟瀛�'))
+          return
+        }
+        callback()
+      },
+      trigger: 'blur'
+    }
+  ],
+  'property.accessMode': [{ required: true, message: '璇烽�夋嫨璇诲啓绫诲瀷', trigger: 'change' }]
+}
+
+/** 鏍¢獙甯冨皵鍊煎悕绉� */
+export const validateBoolName = (_: 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()
+}

--
Gitblit v1.8.0