123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- import { isEmpty } from '@/utils/is'
- /** dataSpecs 数值型数据结构 */
- export interface DataSpecsNumberDataVO {
- dataType: 'int' | 'float' | 'double' // 数据类型,取值为 INT、FLOAT 或 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 DataSpecsEnumOrBoolDataVO {
- dataType: 'enum' | 'bool'
- defaultValue?: string // 默认值,可选
- name: string // 枚举项的名称
- value: number | undefined // 枚举值
- }
- /** 属性值的数据类型 */
- export const DataSpecsDataType = {
- INT: 'int',
- FLOAT: 'float',
- DOUBLE: 'double',
- ENUM: 'enum',
- BOOL: 'bool',
- TEXT: 'text',
- DATE: 'date',
- STRUCT: 'struct',
- ARRAY: 'array'
- } as const
- /** 物体模型数据类型配置项 */
- export const dataTypeOptions = [
- { value: DataSpecsDataType.INT, label: '整数型' },
- { value: DataSpecsDataType.FLOAT, label: '单精度浮点型' },
- { value: DataSpecsDataType.DOUBLE, label: '双精度浮点型' },
- { value: DataSpecsDataType.ENUM, label: '枚举型' },
- { value: DataSpecsDataType.BOOL, label: '布尔型' },
- { value: DataSpecsDataType.TEXT, label: '文本型' },
- { value: DataSpecsDataType.DATE, label: '时间型' },
- { value: DataSpecsDataType.STRUCT, label: '结构体' },
- { value: DataSpecsDataType.ARRAY, label: '数组' }
- ]
- /** 获得物体模型数据类型配置项名称 */
- export const getDataTypeOptionsLabel = (value: string) => {
- if (isEmpty(value)) {
- return value
- }
- const dataType = dataTypeOptions.find((option) => option.value === value)
- return dataType && `${dataType.value}(${dataType.label})`
- }
- // 设备属性模型访问模式枚举类
- export const DeviceAttrModelAccessMode = {
- READ_WRITE: {
- label: '读写',
- value: 'rw'
- },
- READ_ONLY: {
- label: '只读',
- value: 'r'
- }
- } as const
- // 设备属性模型 是否必填 枚举类
- export const DeviceAttrModelRequired = {
- REQUIRED: {
- label: '必填',
- value: 1
- },
- NOT_REQUIRED: {
- label: '非必填',
- value: 0
- }
- } as const
- /** 公共校验规则 */
- export const DeviceAttrModelFormRules = {
- 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' }],
- code: [
- { 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'
- }
- ],
- 'selectOptions.dataSpecs.childDataType': [{ required: true, message: '元素类型不能为空' }],
- 'selectOptions.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'
- }
- ],
- 'selectOptions.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'
- }
- ],
- 'selectOptions.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()
- }
|