config.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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: 'int32 (整数型)' },
  35. { value: DataSpecsDataType.FLOAT, label: 'float (单精度浮点型)' },
  36. { value: DataSpecsDataType.DOUBLE, label: 'double (双精度浮点型)' },
  37. { value: DataSpecsDataType.ENUM, label: 'enum(枚举型)' },
  38. { value: DataSpecsDataType.BOOL, label: 'bool (布尔型)' },
  39. { value: DataSpecsDataType.TEXT, label: 'text (文本型)' },
  40. { value: DataSpecsDataType.DATE, label: 'date (时间型)' },
  41. { value: DataSpecsDataType.STRUCT, label: 'struct (结构体)' },
  42. { value: DataSpecsDataType.ARRAY, label: 'array (数组)' }
  43. ]
  44. /** 获得物体模型数据类型配置项名称 */
  45. export const getDataTypeOptionsLabel = (value: string) => {
  46. return dataTypeOptions.find((option) => option.value === value)?.label
  47. }
  48. /** 公共校验规则 */
  49. export const ThingModelFormRules = {
  50. name: [
  51. { required: true, message: '功能名称不能为空', trigger: 'blur' },
  52. {
  53. pattern: /^[\u4e00-\u9fa5a-zA-Z0-9][\u4e00-\u9fa5a-zA-Z0-9\-_/\.]{0,29}$/,
  54. message:
  55. '支持中文、大小写字母、日文、数字、短划线、下划线、斜杠和小数点,必须以中文、英文或数字开头,不超过 30 个字符',
  56. trigger: 'blur'
  57. }
  58. ],
  59. type: [{ required: true, message: '功能类型不能为空', trigger: 'blur' }],
  60. identifier: [
  61. { required: true, message: '标识符不能为空', trigger: 'blur' },
  62. {
  63. pattern: /^[a-zA-Z0-9_]{1,50}$/,
  64. message: '支持大小写字母、数字和下划线,不超过 50 个字符',
  65. trigger: 'blur'
  66. },
  67. {
  68. validator: (_: any, value: string, callback: any) => {
  69. const reservedKeywords = ['set', 'get', 'post', 'property', 'event', 'time', 'value']
  70. if (reservedKeywords.includes(value)) {
  71. callback(
  72. new Error(
  73. 'set, get, post, property, event, time, value 是系统保留字段,不能用于标识符定义'
  74. )
  75. )
  76. } else if (/^\d+$/.test(value)) {
  77. callback(new Error('标识符不能是纯数字'))
  78. } else {
  79. callback()
  80. }
  81. },
  82. trigger: 'blur'
  83. }
  84. ],
  85. 'property.dataSpecs.childDataType': [{ required: true, message: '元素类型不能为空' }],
  86. 'property.dataSpecs.size': [
  87. { required: true, message: '元素个数不能为空' },
  88. {
  89. validator: (_: any, value: any, callback: any) => {
  90. if (isEmpty(value)) {
  91. callback(new Error('元素个数不能为空'))
  92. return
  93. }
  94. if (isNaN(Number(value))) {
  95. callback(new Error('元素个数必须是数字'))
  96. return
  97. }
  98. callback()
  99. },
  100. trigger: 'blur'
  101. }
  102. ]
  103. }