ThingModelNumberDataSpecs.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <el-form-item label="取值范围">
  3. <div class="flex items-center justify-between">
  4. <el-form-item
  5. :rules="[
  6. { required: true, message: '最小值不能为空' },
  7. { validator: validateMin, trigger: 'blur' }
  8. ]"
  9. class="mb-0"
  10. prop="property.dataSpecs.min"
  11. >
  12. <el-input v-model="dataSpecs.min" placeholder="请输入最小值" />
  13. </el-form-item>
  14. <span class="mx-2">~</span>
  15. <el-form-item
  16. :rules="[
  17. { required: true, message: '最大值不能为空' },
  18. { validator: validateMax, trigger: 'blur' }
  19. ]"
  20. class="mb-0"
  21. prop="property.dataSpecs.max"
  22. >
  23. <el-input v-model="dataSpecs.max" placeholder="请输入最大值" />
  24. </el-form-item>
  25. </div>
  26. </el-form-item>
  27. <el-form-item
  28. :rules="[
  29. { required: true, message: '步长不能为空' },
  30. { validator: validateStep, trigger: 'blur' }
  31. ]"
  32. label="步长"
  33. prop="property.dataSpecs.step"
  34. >
  35. <el-input v-model="dataSpecs.step" placeholder="请输入步长" />
  36. </el-form-item>
  37. <el-form-item
  38. :rules="[{ required: true, message: '请选择单位' }]"
  39. label="单位"
  40. prop="property.dataSpecs.unit"
  41. >
  42. <el-select
  43. :model-value="dataSpecs.unit ? dataSpecs.unitName + '-' + dataSpecs.unit : ''"
  44. filterable
  45. placeholder="请选择单位"
  46. style="width: 240px"
  47. @change="unitChange"
  48. >
  49. <el-option
  50. v-for="(item, index) in UnifyUnitSpecsDTO"
  51. :key="index"
  52. :label="item.Name + '-' + item.Symbol"
  53. :value="item.Name + '-' + item.Symbol"
  54. />
  55. </el-select>
  56. </el-form-item>
  57. </template>
  58. <script lang="ts" setup>
  59. import { useVModel } from '@vueuse/core'
  60. import { UnifyUnitSpecsDTO } from '@/views/iot/utils/constants'
  61. import { DataSpecsNumberDataVO } from '../config'
  62. /** 数值型的 dataSpecs 配置组件 */
  63. defineOptions({ name: 'ThingModelNumberDataSpecs' })
  64. const props = defineProps<{ modelValue: any }>()
  65. const emits = defineEmits(['update:modelValue'])
  66. const dataSpecs = useVModel(props, 'modelValue', emits) as Ref<DataSpecsNumberDataVO>
  67. /** 单位发生变化时触发 */
  68. const unitChange = (UnitSpecs: string) => {
  69. const [unitName, unit] = UnitSpecs.split('-')
  70. dataSpecs.value.unitName = unitName
  71. dataSpecs.value.unit = unit
  72. }
  73. /** 校验最小值 */
  74. const validateMin = (_: any, __: any, callback: any) => {
  75. const min = Number(dataSpecs.value.min)
  76. const max = Number(dataSpecs.value.max)
  77. if (isNaN(min)) {
  78. callback(new Error('请输入有效的数值'))
  79. return
  80. }
  81. if (max !== undefined && !isNaN(max) && min >= max) {
  82. callback(new Error('最小值必须小于最大值'))
  83. return
  84. }
  85. callback()
  86. }
  87. /** 校验最大值 */
  88. const validateMax = (_: any, __: any, callback: any) => {
  89. const min = Number(dataSpecs.value.min)
  90. const max = Number(dataSpecs.value.max)
  91. if (isNaN(max)) {
  92. callback(new Error('请输入有效的数值'))
  93. return
  94. }
  95. if (min !== undefined && !isNaN(min) && max <= min) {
  96. callback(new Error('最大值必须大于最小值'))
  97. return
  98. }
  99. callback()
  100. }
  101. /** 校验步长 */
  102. const validateStep = (_: any, __: any, callback: any) => {
  103. const step = Number(dataSpecs.value.step)
  104. if (isNaN(step)) {
  105. callback(new Error('请输入有效的数值'))
  106. return
  107. }
  108. if (step <= 0) {
  109. callback(new Error('步长必须大于0'))
  110. return
  111. }
  112. const min = Number(dataSpecs.value.min)
  113. const max = Number(dataSpecs.value.max)
  114. if (!isNaN(min) && !isNaN(max) && step > max - min) {
  115. callback(new Error('步长不能大于最大值和最小值的差值'))
  116. return
  117. }
  118. callback()
  119. }
  120. </script>
  121. <style lang="scss" scoped>
  122. :deep(.el-form-item) {
  123. .el-form-item {
  124. margin-bottom: 0;
  125. }
  126. }
  127. </style>