DeviceAttrModelNumberDataSpecs.vue 3.8 KB

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