DeviceControlConfig.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <!-- 设备控制配置组件 -->
  2. <!-- TODO @puhui999:貌似没生效~~~ -->
  3. <template>
  4. <div class="flex flex-col gap-16px">
  5. <!-- 产品和设备选择 -->
  6. <ProductDeviceSelector
  7. v-model:product-id="action.productId"
  8. v-model:device-id="action.deviceId"
  9. @change="handleDeviceChange"
  10. />
  11. <!-- 控制参数配置 -->
  12. <div v-if="action.productId && action.deviceId" class="space-y-16px">
  13. <el-form-item label="控制参数" required>
  14. <el-input
  15. v-model="paramsJson"
  16. type="textarea"
  17. :rows="4"
  18. placeholder="请输入JSON格式的控制参数"
  19. @input="handleParamsChange"
  20. />
  21. </el-form-item>
  22. <!-- 参数示例 -->
  23. <div class="mt-12px">
  24. <el-alert title="参数格式示例" type="info" :closable="false" show-icon>
  25. <template #default>
  26. <div class="space-y-8px">
  27. <p class="m-0 text-14px text-[var(--el-text-color-primary)]">属性设置示例:</p>
  28. <pre class="m-0 p-8px bg-[var(--el-fill-color-light)] rounded-4px text-12px text-[var(--el-text-color-regular)] overflow-x-auto"><code>{ "temperature": 25, "power": true }</code></pre>
  29. <p class="m-0 text-14px text-[var(--el-text-color-primary)]">服务调用示例:</p>
  30. <pre class="m-0 p-8px bg-[var(--el-fill-color-light)] rounded-4px text-12px text-[var(--el-text-color-regular)] overflow-x-auto"><code>{ "method": "restart", "params": { "delay": 5 } }</code></pre>
  31. </div>
  32. </template>
  33. </el-alert>
  34. </div>
  35. </div>
  36. <!-- 验证结果 -->
  37. <div v-if="validationMessage" class="mt-16px">
  38. <el-alert
  39. :title="validationMessage"
  40. :type="isValid ? 'success' : 'error'"
  41. :closable="false"
  42. show-icon
  43. />
  44. </div>
  45. </div>
  46. </template>
  47. <script setup lang="ts">
  48. import { useVModel } from '@vueuse/core'
  49. import ProductDeviceSelector from '../selectors/ProductDeviceSelector.vue'
  50. import { ActionFormData } from '@/api/iot/rule/scene/scene.types'
  51. /** 设备控制配置组件 */
  52. defineOptions({ name: 'DeviceControlConfig' })
  53. interface Props {
  54. modelValue: ActionFormData
  55. }
  56. interface Emits {
  57. (e: 'update:modelValue', value: ActionFormData): void
  58. (e: 'validate', result: { valid: boolean; message: string }): void
  59. }
  60. const props = defineProps<Props>()
  61. const emit = defineEmits<Emits>()
  62. const action = useVModel(props, 'modelValue', emit)
  63. // 状态
  64. const paramsJson = ref('')
  65. const validationMessage = ref('')
  66. const isValid = ref(true)
  67. // 事件处理
  68. const handleDeviceChange = ({ productId, deviceId }: { productId?: number; deviceId?: number }) => {
  69. action.value.productId = productId
  70. action.value.deviceId = deviceId
  71. updateValidationResult()
  72. }
  73. const handleParamsChange = () => {
  74. try {
  75. if (paramsJson.value.trim()) {
  76. action.value.params = JSON.parse(paramsJson.value)
  77. } else {
  78. action.value.params = {}
  79. }
  80. updateValidationResult()
  81. } catch (error) {
  82. isValid.value = false
  83. validationMessage.value = 'JSON格式错误'
  84. emit('validate', { valid: false, message: validationMessage.value })
  85. }
  86. }
  87. const updateValidationResult = () => {
  88. // 基础验证
  89. if (!action.value.productId || !action.value.deviceId) {
  90. isValid.value = false
  91. validationMessage.value = '请选择产品和设备'
  92. emit('validate', { valid: false, message: validationMessage.value })
  93. return
  94. }
  95. if (!action.value.params || Object.keys(action.value.params).length === 0) {
  96. isValid.value = false
  97. validationMessage.value = '请配置控制参数'
  98. emit('validate', { valid: false, message: validationMessage.value })
  99. return
  100. }
  101. // 验证通过
  102. isValid.value = true
  103. validationMessage.value = '设备控制配置验证通过'
  104. emit('validate', { valid: true, message: validationMessage.value })
  105. }
  106. // 初始化
  107. onMounted(() => {
  108. if (action.value.params) {
  109. paramsJson.value = JSON.stringify(action.value.params, null, 2)
  110. }
  111. updateValidationResult()
  112. })
  113. // 监听参数变化
  114. watch(
  115. () => action.value.params,
  116. (newParams) => {
  117. if (newParams && typeof newParams === 'object') {
  118. paramsJson.value = JSON.stringify(newParams, null, 2)
  119. }
  120. },
  121. { deep: true }
  122. )
  123. </script>
  124. <style scoped>
  125. :deep(.example-content code) {
  126. font-family: 'Courier New', monospace;
  127. color: var(--el-color-primary);
  128. }
  129. </style>