config.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import { isEmpty } from '@/utils/is'
  2. /** dataSpecs 数值型数据结构 */
  3. export interface DataSpecsNumberDataVO {
  4. dataType: 'int' | 'float' | 'double' // 数据类型,取值为 INT、FLOAT 或 DOUBLE
  5. max: string // 最大值,必须与 dataType 设置一致,且为 STRING 类型
  6. min: string // 最小值,必须与 dataType 设置一致,且为 STRING 类型
  7. step: string // 步长,必须与 dataType 设置一致,且为 STRING 类型
  8. precise?: string // 精度,当 dataType 为 FLOAT 或 DOUBLE 时可选
  9. defaultValue?: string // 默认值,可选
  10. unit: string // 单位的符号
  11. unitName: string // 单位的名称
  12. }
  13. /** dataSpecs 枚举型数据结构 */
  14. export interface DataSpecsEnumOrBoolDataVO {
  15. dataType: 'enum' | 'bool'
  16. defaultValue?: string // 默认值,可选
  17. name: string // 枚举项的名称
  18. value: number | undefined // 枚举值
  19. }
  20. /** 属性值的数据类型 */
  21. export const DataSpecsDataType = {
  22. INT: 'int',
  23. FLOAT: 'float',
  24. DOUBLE: 'double',
  25. ENUM: 'enum',
  26. BOOL: 'bool',
  27. TEXT: 'text',
  28. DATE: 'date',
  29. STRUCT: 'struct',
  30. ARRAY: 'array'
  31. } as const
  32. /** 物体模型数据类型配置项 */
  33. export const dataTypeOptions = [
  34. { value: DataSpecsDataType.INT, label: '整数型' },
  35. { value: DataSpecsDataType.FLOAT, label: '单精度浮点型' },
  36. { value: DataSpecsDataType.DOUBLE, label: '双精度浮点型' },
  37. { value: DataSpecsDataType.ENUM, label: '枚举型' },
  38. { value: DataSpecsDataType.BOOL, label: '布尔型' },
  39. { value: DataSpecsDataType.TEXT, label: '文本型' },
  40. { value: DataSpecsDataType.DATE, label: '时间型' },
  41. { value: DataSpecsDataType.STRUCT, label: '结构体' },
  42. { value: DataSpecsDataType.ARRAY, label: '数组' }
  43. ]
  44. /** 获得物体模型数据类型配置项名称 */
  45. export const getDataTypeOptionsLabel = (value: string) => {
  46. if (isEmpty(value)) {
  47. return value
  48. }
  49. const dataType = dataTypeOptions.find((option) => option.value === value)
  50. return dataType && `${dataType.value}(${dataType.label})`
  51. }
  52. // 设备属性模型访问模式枚举类
  53. export const DeviceAttrModelAccessMode = {
  54. READ_WRITE: {
  55. label: '读写',
  56. value: 'rw'
  57. },
  58. READ_ONLY: {
  59. label: '只读',
  60. value: 'r'
  61. }
  62. } as const
  63. // 设备属性模型 是否必填 枚举类
  64. export const DeviceAttrModelRequired = {
  65. REQUIRED: {
  66. label: '必填',
  67. value: 1
  68. },
  69. NOT_REQUIRED: {
  70. label: '非必填',
  71. value: 0
  72. }
  73. } as const
  74. /** 公共校验规则 */
  75. export const DeviceAttrModelFormRules = {
  76. name: [
  77. { required: true, message: '属性名称不能为空', trigger: 'blur' },
  78. {
  79. pattern: /^[\u4e00-\u9fa5a-zA-Z0-9][\u4e00-\u9fa5a-zA-Z0-9\-_/\.]{0,29}$/,
  80. message:
  81. '支持中文、大小写字母、日文、数字、短划线、下划线、斜杠和小数点,必须以中文、英文或数字开头,不超过 30 个字符',
  82. trigger: 'blur'
  83. }
  84. ],
  85. type: [{ required: true, message: '数据类型不能为空', trigger: 'blur' }],
  86. code: [
  87. { required: true, message: '标识符不能为空', trigger: 'blur' },
  88. {
  89. pattern: /^[a-zA-Z0-9_]{1,50}$/,
  90. message: '支持大小写字母、数字和下划线,不超过 50 个字符',
  91. trigger: 'blur'
  92. },
  93. {
  94. validator: (_: any, value: string, callback: any) => {
  95. const reservedKeywords = ['set', 'get', 'post', 'property', 'event', 'time', 'value']
  96. if (reservedKeywords.includes(value)) {
  97. callback(
  98. new Error(
  99. 'set, get, post, property, event, time, value 是系统保留字段,不能用于标识符定义'
  100. )
  101. )
  102. } else if (/^\d+$/.test(value)) {
  103. callback(new Error('标识符不能是纯数字'))
  104. } else {
  105. callback()
  106. }
  107. },
  108. trigger: 'blur'
  109. }
  110. ],
  111. 'selectOptions.dataSpecs.childDataType': [{ required: true, message: '元素类型不能为空' }],
  112. 'selectOptions.dataSpecs.size': [
  113. { required: true, message: '元素个数不能为空' },
  114. {
  115. validator: (_: any, value: any, callback: any) => {
  116. if (isEmpty(value)) {
  117. callback(new Error('元素个数不能为空'))
  118. return
  119. }
  120. if (isNaN(Number(value))) {
  121. callback(new Error('元素个数必须是数字'))
  122. return
  123. }
  124. callback()
  125. },
  126. trigger: 'blur'
  127. }
  128. ],
  129. 'selectOptions.dataSpecs.length': [
  130. { required: true, message: '请输入文本字节长度', trigger: 'blur' },
  131. {
  132. validator: (_: any, value: any, callback: any) => {
  133. if (isEmpty(value)) {
  134. callback(new Error('文本长度不能为空'))
  135. return
  136. }
  137. if (isNaN(Number(value))) {
  138. callback(new Error('文本长度必须是数字'))
  139. return
  140. }
  141. callback()
  142. },
  143. trigger: 'blur'
  144. }
  145. ],
  146. 'selectOptions.accessMode': [{ required: true, message: '请选择读写类型', trigger: 'change' }]
  147. }
  148. /** 校验布尔值名称 */
  149. export const validateBoolName = (_: any, value: string, callback: any) => {
  150. if (isEmpty(value)) {
  151. callback(new Error('布尔值名称不能为空'))
  152. return
  153. }
  154. // 检查开头字符
  155. if (!/^[\u4e00-\u9fa5a-zA-Z0-9]/.test(value)) {
  156. callback(new Error('布尔值名称必须以中文、英文字母或数字开头'))
  157. return
  158. }
  159. // 检查整体格式
  160. if (!/^[\u4e00-\u9fa5a-zA-Z0-9][a-zA-Z0-9\u4e00-\u9fa5_-]*$/.test(value)) {
  161. callback(new Error('布尔值名称只能包含中文、英文字母、数字、下划线和短划线'))
  162. return
  163. }
  164. // 检查长度(一个中文算一个字符)
  165. if (value.length > 20) {
  166. callback(new Error('布尔值名称长度不能超过 20 个字符'))
  167. return
  168. }
  169. callback()
  170. }