Преглед на файлове

perf:【IoT 物联网】场景联动目录结构优化

puhui999 преди 8 месеца
родител
ревизия
8549399ae8
променени са 29 файла, в които са добавени 37 реда и са изтрити 50 реда
  1. 36 49
      src/views/iot/rule/scene/components/RuleSceneForm.vue
  2. 0 0
      src/views/iot/rule/scene/form/configs/AlertConfig.vue
  3. 0 0
      src/views/iot/rule/scene/form/configs/ConditionConfig.vue
  4. 0 0
      src/views/iot/rule/scene/form/configs/ConditionGroupConfig.vue
  5. 0 0
      src/views/iot/rule/scene/form/configs/DeviceControlConfig.vue
  6. 0 0
      src/views/iot/rule/scene/form/configs/DeviceTriggerConfig.vue
  7. 0 0
      src/views/iot/rule/scene/form/configs/TimerTriggerConfig.vue
  8. 0 0
      src/views/iot/rule/scene/form/inputs/CronBuilder.vue
  9. 0 0
      src/views/iot/rule/scene/form/inputs/CronInput.vue
  10. 0 0
      src/views/iot/rule/scene/form/inputs/DescriptionInput.vue
  11. 0 0
      src/views/iot/rule/scene/form/inputs/NameInput.vue
  12. 0 0
      src/views/iot/rule/scene/form/inputs/StatusRadio.vue
  13. 0 0
      src/views/iot/rule/scene/form/inputs/ValueInput.vue
  14. 0 0
      src/views/iot/rule/scene/form/previews/ActionPreview.vue
  15. 0 0
      src/views/iot/rule/scene/form/previews/ConfigPreview.vue
  16. 0 0
      src/views/iot/rule/scene/form/previews/NextExecutionPreview.vue
  17. 0 0
      src/views/iot/rule/scene/form/previews/TriggerPreview.vue
  18. 0 0
      src/views/iot/rule/scene/form/previews/ValidationResult.vue
  19. 0 0
      src/views/iot/rule/scene/form/sections/ActionSection.vue
  20. 0 0
      src/views/iot/rule/scene/form/sections/BasicInfoSection.vue
  21. 0 0
      src/views/iot/rule/scene/form/sections/PreviewSection.vue
  22. 0 0
      src/views/iot/rule/scene/form/sections/TriggerSection.vue
  23. 0 0
      src/views/iot/rule/scene/form/selectors/ActionTypeSelector.vue
  24. 0 0
      src/views/iot/rule/scene/form/selectors/OperatorSelector.vue
  25. 0 0
      src/views/iot/rule/scene/form/selectors/ProductDeviceSelector.vue
  26. 0 0
      src/views/iot/rule/scene/form/selectors/PropertySelector.vue
  27. 0 0
      src/views/iot/rule/scene/form/selectors/TriggerTypeSelector.vue
  28. 0 0
      src/views/iot/rule/scene/form/selectors/types.ts
  29. 1 1
      src/views/iot/rule/scene/index.vue

+ 36 - 49
src/views/iot/rule/scene/components/RuleSceneForm.vue

@@ -1,5 +1,4 @@
 <!-- IoT场景联动规则表单 - 主表单组件 -->
-<!-- TODO @puhui999:要不搞个 form 目录,不用 components;保持和别的模块风格一致哈; -->
 <template>
   <el-drawer
     v-model="drawerVisible"
@@ -37,21 +36,9 @@
       </el-form>
     </div>
 
-    <!-- 抽屉底部操作栏 -->
-    <!-- TODO @puhui999:这个按钮逻辑,和别的模块一致 -->
     <template #footer>
-      <div class="absolute bottom-0 left-0 right-0 flex justify-end gap-16px p-16px px-20px bg-[var(--el-bg-color)] border-t border-[var(--el-border-color-light)] shadow-[0_-2px_8px_rgba(0,0,0,0.1)]">
-        <el-button @click="handleClose" size="large">取消</el-button>
-        <el-button
-          type="primary"
-          @click="handleSubmit"
-          :loading="submitLoading"
-          :disabled="!canSubmit"
-          size="large"
-        >
-          {{ isEdit ? '更新' : '创建' }}
-        </el-button>
-      </div>
+      <el-button :disabled="submitLoading" type="primary" @click="handleSubmit">确 定</el-button>
+      <el-button @click="handleClose">取 消</el-button>
     </template>
   </el-drawer>
 </template>
@@ -65,7 +52,7 @@ import PreviewSection from './sections/PreviewSection.vue'
 import { RuleSceneFormData, IotRuleScene } from '@/api/iot/rule/scene/scene.types'
 import { getBaseValidationRules } from '../utils/validation'
 import { transformFormToApi, transformApiToForm, createDefaultFormData } from '../utils/transform'
-import { handleValidationError, showSuccess, withErrorHandling } from '../utils/errorHandler'
+import { ElMessage } from 'element-plus'
 
 /** IoT 场景联动规则表单 - 主表单组件 */
 defineOptions({ name: 'RuleSceneForm' })
@@ -98,7 +85,7 @@ const actionValidation = ref({ valid: true, message: '' })
 
 // 计算属性
 const isEdit = computed(() => !!props.ruleScene?.id)
-const drawerTitle = computed(() => (isEdit.value ? '编辑场景联动规则' : '新增场景联动规则')) // TODO @puhui999:这个风格,和别的模块一致;
+const drawerTitle = computed(() => (isEdit.value ? '编辑场景联动规则' : '新增场景联动规则'))
 
 const canSubmit = computed(() => {
   return (
@@ -132,49 +119,49 @@ const handleValidate = async () => {
     }
 
     validationResult.value = { valid: true, message: '验证通过' }
-    showSuccess('规则验证通过')
+    ElMessage.success('规则验证通过')
     return true
   } catch (error: any) {
     const message = error.message || '表单验证失败'
     validationResult.value = { valid: false, message }
-    await handleValidationError(message, 'rule-scene-form')
+    ElMessage.error(message)
     return false
   }
 }
 
-// TODO @puhui999:参考下别的模块,不用这么复杂哈;
 const handleSubmit = async () => {
-  const result = await withErrorHandling(
-    async () => {
-      // 验证表单
-      const isValid = await handleValidate()
-      if (!isValid) {
-        throw new Error('表单验证失败')
-      }
-
-      // 转换数据格式
-      const apiData = transformFormToApi(formData.value)
-
-      // 这里应该调用API保存数据
-      console.log('提交数据:', apiData)
-
-      // 模拟API调用
-      await new Promise((resolve) => setTimeout(resolve, 1000))
-
-      return apiData
-    },
-    {
-      loadingKey: 'rule-scene-submit',
-      loadingText: isEdit.value ? '更新中...' : '创建中...',
-      context: 'rule-scene-form',
-      showSuccess: true,
-      successMessage: isEdit.value ? '更新成功' : '创建成功'
-    }
-  )
+  // 校验表单
+  if (!formRef.value) return
+  const valid = await formRef.value.validate()
+  if (!valid) return
+
+  // 验证触发器和执行器
+  if (!triggerValidation.value.valid) {
+    ElMessage.error(triggerValidation.value.message)
+    return
+  }
+  if (!actionValidation.value.valid) {
+    ElMessage.error(actionValidation.value.message)
+    return
+  }
+
+  // 提交请求
+  submitLoading.value = true
+  try {
+    // 转换数据格式
+    const apiData = transformFormToApi(formData.value)
+
+    // 这里应该调用API保存数据
+    console.log('提交数据:', apiData)
+
+    // 模拟API调用
+    await new Promise((resolve) => setTimeout(resolve, 1000))
 
-  if (result) {
+    ElMessage.success(isEdit.value ? '更新成功' : '创建成功')
+    drawerVisible.value = false
     emit('success')
-    handleClose()
+  } finally {
+    submitLoading.value = false
   }
 }
 

src/views/iot/rule/scene/components/configs/AlertConfig.vue → src/views/iot/rule/scene/form/configs/AlertConfig.vue


src/views/iot/rule/scene/components/configs/ConditionConfig.vue → src/views/iot/rule/scene/form/configs/ConditionConfig.vue


src/views/iot/rule/scene/components/configs/ConditionGroupConfig.vue → src/views/iot/rule/scene/form/configs/ConditionGroupConfig.vue


src/views/iot/rule/scene/components/configs/DeviceControlConfig.vue → src/views/iot/rule/scene/form/configs/DeviceControlConfig.vue


src/views/iot/rule/scene/components/configs/DeviceTriggerConfig.vue → src/views/iot/rule/scene/form/configs/DeviceTriggerConfig.vue


src/views/iot/rule/scene/components/configs/TimerTriggerConfig.vue → src/views/iot/rule/scene/form/configs/TimerTriggerConfig.vue


src/views/iot/rule/scene/components/inputs/CronBuilder.vue → src/views/iot/rule/scene/form/inputs/CronBuilder.vue


src/views/iot/rule/scene/components/inputs/CronInput.vue → src/views/iot/rule/scene/form/inputs/CronInput.vue


src/views/iot/rule/scene/components/inputs/DescriptionInput.vue → src/views/iot/rule/scene/form/inputs/DescriptionInput.vue


src/views/iot/rule/scene/components/inputs/NameInput.vue → src/views/iot/rule/scene/form/inputs/NameInput.vue


src/views/iot/rule/scene/components/inputs/StatusRadio.vue → src/views/iot/rule/scene/form/inputs/StatusRadio.vue


src/views/iot/rule/scene/components/inputs/ValueInput.vue → src/views/iot/rule/scene/form/inputs/ValueInput.vue


src/views/iot/rule/scene/components/previews/ActionPreview.vue → src/views/iot/rule/scene/form/previews/ActionPreview.vue


src/views/iot/rule/scene/components/previews/ConfigPreview.vue → src/views/iot/rule/scene/form/previews/ConfigPreview.vue


src/views/iot/rule/scene/components/previews/NextExecutionPreview.vue → src/views/iot/rule/scene/form/previews/NextExecutionPreview.vue


src/views/iot/rule/scene/components/previews/TriggerPreview.vue → src/views/iot/rule/scene/form/previews/TriggerPreview.vue


src/views/iot/rule/scene/components/previews/ValidationResult.vue → src/views/iot/rule/scene/form/previews/ValidationResult.vue


src/views/iot/rule/scene/components/sections/ActionSection.vue → src/views/iot/rule/scene/form/sections/ActionSection.vue


src/views/iot/rule/scene/components/sections/BasicInfoSection.vue → src/views/iot/rule/scene/form/sections/BasicInfoSection.vue


src/views/iot/rule/scene/components/sections/PreviewSection.vue → src/views/iot/rule/scene/form/sections/PreviewSection.vue


src/views/iot/rule/scene/components/sections/TriggerSection.vue → src/views/iot/rule/scene/form/sections/TriggerSection.vue


src/views/iot/rule/scene/components/selectors/ActionTypeSelector.vue → src/views/iot/rule/scene/form/selectors/ActionTypeSelector.vue


src/views/iot/rule/scene/components/selectors/OperatorSelector.vue → src/views/iot/rule/scene/form/selectors/OperatorSelector.vue


src/views/iot/rule/scene/components/selectors/ProductDeviceSelector.vue → src/views/iot/rule/scene/form/selectors/ProductDeviceSelector.vue


src/views/iot/rule/scene/components/selectors/PropertySelector.vue → src/views/iot/rule/scene/form/selectors/PropertySelector.vue


src/views/iot/rule/scene/components/selectors/TriggerTypeSelector.vue → src/views/iot/rule/scene/form/selectors/TriggerTypeSelector.vue


src/views/iot/rule/scene/components/selectors/types.ts → src/views/iot/rule/scene/form/selectors/types.ts


+ 1 - 1
src/views/iot/rule/scene/index.vue

@@ -248,7 +248,7 @@
 
 <script setup lang="ts">
 import { ContentWrap } from '@/components/ContentWrap'
-import RuleSceneForm from './components/RuleSceneForm.vue'
+import RuleSceneForm from './form/RuleSceneForm.vue'
 import { IotRuleScene } from '@/api/iot/rule/scene/scene.types'
 import { getRuleSceneSummary } from './utils/transform'
 import { formatDate } from '@/utils/formatTime'