setAttr.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <template>
  2. <el-dialog title="设置属性" v-model="visiable" width="600px" append-to-body>
  3. <el-form :model="data" ref="queryRef" label-width="68px">
  4. <el-form-item label="属性标识" prop="key">
  5. <el-input v-model="data.key" disabled placeholder="请输入属性标识" clearable />
  6. </el-form-item>
  7. <el-form-item label="属性名称" prop="name">
  8. <el-input v-model="data.name" disabled placeholder="请输入属性名称" clearable />
  9. </el-form-item>
  10. <el-form-item label="数据类型" prop="type">
  11. <el-select v-model="data.valueType.type" placeholder="请选择数据类型" disabled style="width: 100%;">
  12. <el-option-group v-for="group in typeData" :key="group.label" :label="group.label">
  13. <el-option v-for="item in group.options" :key="item.type" :label="item.title" :value="item.type" />
  14. </el-option-group>
  15. </el-select>
  16. </el-form-item>
  17. <el-form-item label="属性值" prop="value">
  18. <template v-if="['int', 'long', 'float', 'double', 'date'].includes(data.valueType.type)">
  19. <el-input type="number" v-model.number="data.value" placeholder="请输入属性值" clearable>
  20. <template v-if="data.valueType.unit" #append>{{ data.valueType.unit }}</template>
  21. </el-input>
  22. </template>
  23. <template v-else-if="['enum'].includes(data.valueType.type)">
  24. <el-select v-model="data.value" clearable style="wdith: 100% !important;">
  25. <el-option v-for="item in data.valueType.elements" :key="item.value" :value="item.value" :label="item.text"></el-option>
  26. </el-select>
  27. </template>
  28. <template v-else>
  29. <el-input v-model="data.value" placeholder="请输入属性值" clearable>
  30. <template v-if="data.valueType.unit" #append>{{ data.valueType.unit }}</template>
  31. </el-input>
  32. </template>
  33. </el-form-item>
  34. </el-form>
  35. <template #footer>
  36. <span class="dialog-footer">
  37. <el-button @click="visiable = false" size="default">取 消</el-button>
  38. <el-button type="primary" @click="onSubmit" size="default" :loading="loading">设 置</el-button>
  39. </span>
  40. </template>
  41. </el-dialog>
  42. </template>
  43. <script lang="ts" setup>
  44. import { reactive, ref } from 'vue';
  45. import api from '/@/api/device';
  46. import { ElMessage } from 'element-plus';
  47. const props = defineProps({
  48. deviceKey: String,
  49. })
  50. const visiable = ref(false)
  51. const loading = ref(false)
  52. const typeData = ref<any[]>([])
  53. const form = {
  54. "key": "",
  55. "name": "",
  56. "accessMode": 0,
  57. "valueType": {
  58. "type": "",
  59. "unit": "",
  60. "elements": [],
  61. },
  62. "value": ""
  63. }
  64. const data = reactive({
  65. ...form
  66. })
  67. api.product.getDataType({ status: -1 }).then((res: any) => {
  68. const datat = Object.values(res.dataType) as any;
  69. datat.forEach((item: any, index: number) => {
  70. if (index == 0) {
  71. datat[index]['label'] = '基础类型';
  72. datat[index]['options'] = item;
  73. } else {
  74. datat[index]['label'] = '扩展类型';
  75. datat[index]['options'] = item;
  76. }
  77. });
  78. typeData.value = datat || [];
  79. });
  80. function show(row: any) {
  81. Object.assign(data, row)
  82. visiable.value = true
  83. }
  84. function onSubmit() {
  85. if (!data.value) return ElMessage('请先输入属性值!')
  86. loading.value = true
  87. api.product.propertySet({
  88. deviceKey: props.deviceKey,
  89. params: {
  90. [data.key]: data.value
  91. }
  92. }).then(() => {
  93. Object.assign(data, { ...form })
  94. visiable.value = false
  95. ElMessage.success('操作成功')
  96. }).finally(() => loading.value = false)
  97. }
  98. defineExpose({ show })
  99. </script>
  100. <style lang="scss" scoped></style>