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