From e76f0739e647fe8a7e0e2618914e2faff554b1b7 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期一, 17 十一月 2025 17:33:23 +0800
Subject: [PATCH] 解决冲突

---
 mes-web/src/views/device/DeviceGroupEditDialog.vue |  712 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 712 insertions(+), 0 deletions(-)

diff --git a/mes-web/src/views/device/DeviceGroupEditDialog.vue b/mes-web/src/views/device/DeviceGroupEditDialog.vue
new file mode 100644
index 0000000..57dc0c9
--- /dev/null
+++ b/mes-web/src/views/device/DeviceGroupEditDialog.vue
@@ -0,0 +1,712 @@
+<template>
+  <el-dialog
+    :visible="visible"
+    :title="title"
+    width="70%"
+    :close-on-click-modal="false"
+    @close="handleClose"
+    @update:visible="(val) => emit('update:visible', val)"
+  >
+    <el-form
+      ref="formRef"
+      :model="form"
+      :rules="rules"
+      label-width="120px"
+      class="device-group-form"
+    >
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <!-- 鍩烘湰淇℃伅 -->
+          <el-card shadow="never" class="form-card">
+            <template #header>
+              <div class="card-header">
+                <span>鍩烘湰淇℃伅</span>
+              </div>
+            </template>
+            
+            <el-form-item label="缁勫悕绉�" prop="groupName">
+              <el-input
+                v-model="form.groupName"
+                placeholder="璇疯緭鍏ヨ澶囩粍鍚嶇О"
+                maxlength="50"
+                show-word-limit
+              />
+            </el-form-item>
+            
+            <el-form-item label="缁勭紪鐮�" prop="groupCode">
+              <el-input
+                v-model="form.groupCode"
+                placeholder="璇疯緭鍏ヨ澶囩粍缂栫爜"
+                maxlength="20"
+                :disabled="isEdit"
+                @blur="generateCode"
+              >
+                <template #append>
+                  <el-button @click="generateCode" :disabled="isEdit">
+                    鑷姩鐢熸垚
+                  </el-button>
+                </template>
+              </el-input>
+            </el-form-item>
+            
+            <el-form-item label="缁勭被鍨�" prop="groupType">
+              <el-select v-model="form.groupType" placeholder="閫夋嫨缁勭被鍨�">
+                <el-option label="璁惧缁�" value="璁惧缁�" />
+                <el-option label="绠$悊缁�" value="绠$悊缁�" />
+                <el-option label="鐩戞帶缁�" value="鐩戞帶缁�" />
+                <el-option label="缁存姢缁�" value="缁存姢缁�" />
+              </el-select>
+            </el-form-item>
+            
+            <el-form-item label="鎻忚堪淇℃伅">
+              <el-input
+                v-model="form.description"
+                type="textarea"
+                :rows="4"
+                placeholder="璇疯緭鍏ヨ澶囩粍鎻忚堪淇℃伅"
+                maxlength="200"
+                show-word-limit
+              />
+            </el-form-item>
+            
+            <el-form-item label="鎺掑簭搴忓彿" prop="sortOrder">
+              <el-input-number
+                v-model="form.sortOrder"
+                :min="0"
+                :max="999"
+                placeholder="鎺掑簭搴忓彿"
+              />
+            </el-form-item>
+          </el-card>
+        </el-col>
+        
+        <el-col :span="12">
+          <!-- 閰嶇疆淇℃伅 -->
+          <el-card shadow="never" class="form-card">
+            <template #header>
+              <div class="card-header">
+                <span>閰嶇疆淇℃伅</span>
+              </div>
+            </template>
+            
+            <el-form-item label="缁勭姸鎬�" prop="groupStatus">
+              <el-select v-model="form.groupStatus" placeholder="閫夋嫨缁勭姸鎬�">
+                <el-option label="鍚敤" value="ENABLED" />
+                <el-option label="绂佺敤" value="DISABLED" />
+              </el-select>
+            </el-form-item>
+            
+            <el-form-item label="鏈�澶ц澶囨暟" prop="maxDeviceCount">
+              <el-input-number
+                v-model="form.maxDeviceCount"
+                :min="1"
+                :max="1000"
+                placeholder="鏈�澶ц澶囨暟"
+              />
+              <div class="form-tip">璇ヨ澶囩粍鏈�澶氬彲绠$悊鐨勮澶囨暟閲�</div>
+            </el-form-item>
+            
+            <el-form-item label="蹇冭烦闂撮殧" prop="heartbeatInterval">
+              <el-input-number
+                v-model="form.heartbeatInterval"
+                :min="1"
+                :max="3600"
+                placeholder="蹇冭烦闂撮殧(绉�)"
+              />
+              <div class="form-tip">璁惧涓庤缁勭殑蹇冭烦妫�娴嬮棿闅�</div>
+            </el-form-item>
+            
+            <el-form-item label="杩炴帴瓒呮椂" prop="connectionTimeout">
+              <el-input-number
+                v-model="form.connectionTimeout"
+                :min="1"
+                :max="300"
+                placeholder="杩炴帴瓒呮椂(绉�)"
+              />
+              <div class="form-tip">杩炴帴璇ョ粍璁惧鐨勬渶澶х瓑寰呮椂闂�</div>
+            </el-form-item>
+            
+            <el-form-item label="閲嶈瘯娆℃暟" prop="retryCount">
+              <el-input-number
+                v-model="form.retryCount"
+                :min="0"
+                :max="10"
+                placeholder="閲嶈瘯娆℃暟"
+              />
+              <div class="form-tip">杩炴帴澶辫触鏃剁殑閲嶈瘯娆℃暟</div>
+            </el-form-item>
+          </el-card>
+        </el-col>
+      </el-row>
+      
+      <!-- 鍛婅閰嶇疆 -->
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-card shadow="never" class="form-card">
+            <template #header>
+              <div class="card-header">
+                <span>鍛婅閰嶇疆</span>
+              </div>
+            </template>
+            
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="鍚敤鍛婅" prop="enableAlert">
+                  <el-switch v-model="form.enableAlert" />
+                </el-form-item>
+                
+                <el-form-item label="绂荤嚎鍛婅闃堝��" prop="offlineThreshold">
+                  <el-input-number
+                    v-model="form.offlineThreshold"
+                    :min="1"
+                    :max="100"
+                    placeholder="绂荤嚎璁惧鏁伴噺闃堝��"
+                  />
+                  <div class="form-tip">瓒呰繃姝ら槇鍊兼椂瑙﹀彂绂荤嚎鍛婅</div>
+                </el-form-item>
+                
+                <el-form-item label="鍝嶅簲瓒呮椂闃堝��" prop="responseTimeout">
+                  <el-input-number
+                    v-model="form.responseTimeout"
+                    :min="1"
+                    :max="600"
+                    placeholder="鍝嶅簲瓒呮椂闃堝��(绉�)"
+                  />
+                  <div class="form-tip">璁惧鍝嶅簲鏃堕棿瓒呰繃姝ら槇鍊兼椂鍛婅</div>
+                </el-form-item>
+              </el-col>
+              
+              <el-col :span="12">
+                <el-form-item label="鍛婅閫氱煡鏂瑰紡" prop="alertNotificationMethod">
+                  <el-checkbox-group v-model="form.alertNotificationMethod">
+                    <el-checkbox label="email">閭欢</el-checkbox>
+                    <el-checkbox label="sms">鐭俊</el-checkbox>
+                    <el-checkbox label="wechat">寰俊</el-checkbox>
+                    <el-checkbox label="webhook">Webhook</el-checkbox>
+                  </el-checkbox-group>
+                </el-form-item>
+                
+                <el-form-item label="閫氱煡浜�" prop="notifyUsers">
+                  <el-select
+                    v-model="form.notifyUsers"
+                    multiple
+                    placeholder="閫夋嫨閫氱煡浜哄憳"
+                    style="width: 100%"
+                  >
+                    <el-option label="寮犱笁" value="user1" />
+                    <el-option label="鏉庡洓" value="user2" />
+                    <el-option label="鐜嬩簲" value="user3" />
+                  </el-select>
+                </el-form-item>
+                
+                <el-form-item label="Webhook URL" v-if="form.alertNotificationMethod?.includes('webhook')">
+                  <el-input
+                    v-model="form.webhookUrl"
+                    placeholder="杈撳叆Webhook閫氱煡鍦板潃"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-card>
+        </el-col>
+      </el-row>
+      
+      <!-- 楂樼骇閰嶇疆 -->
+      <el-row :gutter="20">
+        <el-col :span="24">
+          <el-card shadow="never" class="form-card">
+            <template #header>
+              <div class="card-header">
+                <span>楂樼骇閰嶇疆</span>
+                <el-button type="text" @click="showAdvanced = !showAdvanced">
+                  {{ showAdvanced ? '鏀惰捣' : '灞曞紑' }}
+                </el-button>
+              </div>
+            </template>
+            
+            <div v-show="showAdvanced">
+              <el-row :gutter="20">
+                <el-col :span="12">
+                  <el-form-item label="鏁版嵁閲囬泦闂撮殧" prop="dataCollectionInterval">
+                    <el-input-number
+                      v-model="form.dataCollectionInterval"
+                      :min="1"
+                      :max="3600"
+                      placeholder="鏁版嵁閲囬泦闂撮殧(绉�)"
+                    />
+                  </el-form-item>
+                  
+                  <el-form-item label="鏁版嵁淇濆瓨鍛ㄦ湡" prop="dataRetentionPeriod">
+                    <el-input-number
+                      v-model="form.dataRetentionPeriod"
+                      :min="1"
+                      :max="365"
+                      placeholder="鏁版嵁淇濆瓨鍛ㄦ湡(澶�)"
+                    />
+                  </el-form-item>
+                  
+                  <el-form-item label="鏃ュ織绾у埆" prop="logLevel">
+                    <el-select v-model="form.logLevel" placeholder="閫夋嫨鏃ュ織绾у埆">
+                      <el-option label="ERROR" value="ERROR" />
+                      <el-option label="WARN" value="WARN" />
+                      <el-option label="INFO" value="INFO" />
+                      <el-option label="DEBUG" value="DEBUG" />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+                
+                <el-col :span="12">
+                  <el-form-item label="鍚敤鑷姩澶囦唤" prop="enableAutoBackup">
+                    <el-switch v-model="form.enableAutoBackup" />
+                  </el-form-item>
+                  
+                  <el-form-item label="澶囦唤闂撮殧" prop="backupInterval" v-if="form.enableAutoBackup">
+                    <el-input-number
+                      v-model="form.backupInterval"
+                      :min="1"
+                      :max="168"
+                      placeholder="澶囦唤闂撮殧(灏忔椂)"
+                    />
+                  </el-form-item>
+                  
+                  <el-form-item label="鑷畾涔夊弬鏁�">
+                    <el-input
+                      v-model="customParamsText"
+                      type="textarea"
+                      :rows="3"
+                      placeholder="JSON鏍煎紡鑷畾涔夊弬鏁�"
+                      @blur="validateCustomParams"
+                    />
+                    <div class="form-tip">渚嬪: {&quot;key1&quot;: &quot;value1&quot;, &quot;key2&quot;: 123}</div>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </div>
+          </el-card>
+        </el-col>
+      </el-row>
+    </el-form>
+    
+    <!-- 閰嶇疆楠岃瘉缁撴灉 -->
+    <div v-if="validationResult" class="validation-result">
+      <el-alert
+        :title="validationResult.valid ? '閰嶇疆楠岃瘉閫氳繃' : '閰嶇疆楠岃瘉澶辫触'"
+        :type="validationResult.valid ? 'success' : 'error'"
+        :closable="false"
+        show-icon
+      >
+        <template #default>
+          <div v-if="!validationResult.valid">
+            <p v-for="error in validationResult.errors" :key="error" style="margin: 0;">
+              {{ error }}
+            </p>
+          </div>
+          <div v-else>
+            <p style="margin: 0;">鎵�鏈夐厤缃弬鏁伴獙璇侀�氳繃</p>
+          </div>
+        </template>
+      </el-alert>
+    </div>
+    
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="handleClose">鍙栨秷</el-button>
+        <el-button @click="testConfiguration" :loading="testing" :disabled="!form.groupName">
+          娴嬭瘯閰嶇疆
+        </el-button>
+        <el-button type="primary" @click="submit" :loading="saving">
+          {{ isEdit ? '鏇存柊' : '鍒涘缓' }}
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { ref, reactive, computed, watch, nextTick } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { deviceGroupApi } from '@/api/device/deviceManagement'
+
+// Props
+const props = defineProps({
+  visible: {
+    type: Boolean,
+    default: false
+  },
+  data: {
+    type: Object,
+    default: () => null
+  }
+})
+
+// Emits
+const emit = defineEmits(['update:visible', 'success', 'close'])
+
+// 鍝嶅簲寮忔暟鎹�
+const formRef = ref(null)
+const showAdvanced = ref(false)
+const testing = ref(false)
+const saving = ref(false)
+const validationResult = ref(null)
+const customParamsText = ref('')
+
+// 琛ㄥ崟鏁版嵁
+const form = reactive({
+  groupName: '',
+  groupCode: '',
+  groupType: '璁惧缁�',
+  description: '',
+  sortOrder: 0,
+  groupStatus: 'ENABLED',
+  maxDeviceCount: 100,
+  heartbeatInterval: 30,
+  connectionTimeout: 10,
+  retryCount: 3,
+  enableAlert: false,
+  offlineThreshold: 5,
+  responseTimeout: 30,
+  alertNotificationMethod: [],
+  notifyUsers: [],
+  webhookUrl: '',
+  dataCollectionInterval: 5,
+  dataRetentionPeriod: 30,
+  logLevel: 'INFO',
+  enableAutoBackup: false,
+  backupInterval: 24,
+  customParams: {}
+})
+
+// 璁$畻灞炴��
+const isEdit = computed(() => !!props.data)
+const title = computed(() => (isEdit.value ? '缂栬緫璁惧缁�' : '鏂板缓璁惧缁�'))
+
+// 楠岃瘉瑙勫垯
+const rules = {
+  groupName: [
+    { required: true, message: '璇疯緭鍏ヨ澶囩粍鍚嶇О', trigger: 'blur' },
+    { min: 2, max: 50, message: '鍚嶇О闀垮害搴斿湪2-50涓瓧绗︿箣闂�', trigger: 'blur' }
+  ],
+  groupCode: [
+    { required: true, message: '璇疯緭鍏ヨ澶囩粍缂栫爜', trigger: 'blur' },
+    { pattern: /^[A-Z0-9_]+$/, message: '缂栫爜鍙兘鍖呭惈澶у啓瀛楁瘝銆佹暟瀛楀拰涓嬪垝绾�', trigger: 'blur' }
+  ],
+  groupType: [
+    { required: true, message: '璇烽�夋嫨缁勭被鍨�', trigger: 'change' }
+  ],
+  sortOrder: [
+    { type: 'number', min: 0, max: 999, message: '鎺掑簭搴忓彿搴斿湪0-999涔嬮棿', trigger: 'blur' }
+  ],
+  maxDeviceCount: [
+    { type: 'number', min: 1, max: 1000, message: '鏈�澶ц澶囨暟搴斿湪1-1000涔嬮棿', trigger: 'blur' }
+  ],
+  heartbeatInterval: [
+    { type: 'number', min: 1, max: 3600, message: '蹇冭烦闂撮殧搴斿湪1-3600绉掍箣闂�', trigger: 'blur' }
+  ],
+  connectionTimeout: [
+    { type: 'number', min: 1, max: 300, message: '杩炴帴瓒呮椂搴斿湪1-300绉掍箣闂�', trigger: 'blur' }
+  ],
+  retryCount: [
+    { type: 'number', min: 0, max: 10, message: '閲嶈瘯娆℃暟搴斿湪0-10涔嬮棿', trigger: 'blur' }
+  ],
+  offlineThreshold: [
+    { type: 'number', min: 1, max: 100, message: '绂荤嚎鍛婅闃堝�煎簲鍦�1-100涔嬮棿', trigger: 'blur' }
+  ],
+  responseTimeout: [
+    { type: 'number', min: 1, max: 600, message: '鍝嶅簲瓒呮椂闃堝�煎簲鍦�1-600绉掍箣闂�', trigger: 'blur' }
+  ],
+  dataCollectionInterval: [
+    { type: 'number', min: 1, max: 3600, message: '鏁版嵁閲囬泦闂撮殧搴斿湪1-3600绉掍箣闂�', trigger: 'blur' }
+  ],
+  dataRetentionPeriod: [
+    { type: 'number', min: 1, max: 365, message: '鏁版嵁淇濆瓨鍛ㄦ湡搴斿湪1-365澶╀箣闂�', trigger: 'blur' }
+  ],
+  backupInterval: [
+    { type: 'number', min: 1, max: 168, message: '澶囦唤闂撮殧搴斿湪1-168灏忔椂涔嬮棿', trigger: 'blur' }
+  ]
+}
+
+// 鐩戝惉鏁版嵁鍙樺寲
+watch(() => props.visible, (newVal) => {
+  if (newVal) {
+    nextTick(() => {
+      resetForm()
+      if (props.data) {
+        loadFormData()
+      }
+    })
+  }
+})
+
+// 鏂规硶瀹氫箟
+const resetForm = () => {
+  Object.assign(form, {
+    groupName: '',
+    groupCode: '',
+    groupType: '璁惧缁�',
+    description: '',
+    sortOrder: 0,
+    groupStatus: 'ENABLED',
+    maxDeviceCount: 100,
+    heartbeatInterval: 30,
+    connectionTimeout: 10,
+    retryCount: 3,
+    enableAlert: false,
+    offlineThreshold: 5,
+    responseTimeout: 30,
+    alertNotificationMethod: [],
+    notifyUsers: [],
+    webhookUrl: '',
+    dataCollectionInterval: 5,
+    dataRetentionPeriod: 30,
+    logLevel: 'INFO',
+    enableAutoBackup: false,
+    backupInterval: 24,
+    customParams: {}
+  })
+  customParamsText.value = ''
+  validationResult.value = null
+  formRef.value?.clearValidate()
+}
+
+const loadFormData = () => {
+  if (!props.data) return
+  
+  Object.assign(form, {
+    groupName: props.data.groupName || '',
+    groupCode: props.data.groupCode || '',
+    groupType: props.data.groupType || '璁惧缁�',
+    description: props.data.description || '',
+    sortOrder: props.data.sortOrder || 0,
+    groupStatus: props.data.groupStatus || 'ENABLED',
+    maxDeviceCount: props.data.maxDeviceCount || 100,
+    heartbeatInterval: props.data.heartbeatInterval || 30,
+    connectionTimeout: props.data.connectionTimeout || 10,
+    retryCount: props.data.retryCount || 3,
+    enableAlert: props.data.enableAlert || false,
+    offlineThreshold: props.data.offlineThreshold || 5,
+    responseTimeout: props.data.responseTimeout || 30,
+    alertNotificationMethod: props.data.alertNotificationMethod || [],
+    notifyUsers: props.data.notifyUsers || [],
+    webhookUrl: props.data.webhookUrl || '',
+    dataCollectionInterval: props.data.dataCollectionInterval || 5,
+    dataRetentionPeriod: props.data.dataRetentionPeriod || 30,
+    logLevel: props.data.logLevel || 'INFO',
+    enableAutoBackup: props.data.enableAutoBackup || false,
+    backupInterval: props.data.backupInterval || 24,
+    customParams: props.data.customParams || {}
+  })
+  
+  customParamsText.value = JSON.stringify(form.customParams, null, 2)
+}
+
+const generateCode = () => {
+  if (!form.groupName || isEdit.value) return
+  
+  const pinyin = require('pinyin-pro')
+  let code = pinyin.pinyin(form.groupName, {
+    toneType: 'none',
+    type: 'array'
+  }).join('').replace(/[^a-zA-Z0-9]/g, '')
+  
+  code = code.toUpperCase()
+  if (code.length > 0) {
+    form.groupCode = code
+  }
+}
+
+const validateCustomParams = () => {
+  if (!customParamsText.value.trim()) {
+    validationResult.value = { valid: true, errors: [] }
+    return
+  }
+  
+  try {
+    const params = JSON.parse(customParamsText.value)
+    if (typeof params === 'object' && params !== null) {
+      form.customParams = params
+      validationResult.value = { valid: true, errors: [] }
+    } else {
+      throw new Error('鑷畾涔夊弬鏁板繀椤讳负JSON瀵硅薄')
+    }
+  } catch (error) {
+    validationResult.value = {
+      valid: false,
+      errors: [`鑷畾涔夊弬鏁版牸寮忛敊璇�: ${error.message}`]
+    }
+  }
+}
+
+const testConfiguration = async () => {
+  try {
+    testing.value = true
+    
+    // 楠岃瘉琛ㄥ崟
+    await formRef.value.validate()
+    
+    // 楠岃瘉鑷畾涔夊弬鏁�
+    validateCustomParams()
+    
+    if (validationResult.value && !validationResult.value.valid) {
+      ElMessage.error('璇蜂慨姝i厤缃獙璇侀敊璇�')
+      return
+    }
+    
+    const config = {
+      ...form,
+      customParams: form.customParams
+    }
+    
+    const response = await deviceGroupApi.testConfiguration(config)
+    
+    if (response.success) {
+      validationResult.value = { valid: true, errors: [] }
+      ElMessage.success('閰嶇疆娴嬭瘯閫氳繃')
+    } else {
+      validationResult.value = {
+        valid: false,
+        errors: response.errors || ['閰嶇疆娴嬭瘯澶辫触']
+      }
+      ElMessage.error('閰嶇疆娴嬭瘯澶辫触')
+    }
+  } catch (error) {
+    console.error('娴嬭瘯閰嶇疆澶辫触:', error)
+    if (error.message && error.message.includes('楠岃瘉澶辫触')) {
+      ElMessage.error('璇锋鏌ヨ〃鍗曞~鍐欐槸鍚︽纭�')
+    } else {
+      ElMessage.error('娴嬭瘯閰嶇疆澶辫触')
+    }
+  } finally {
+    testing.value = false
+  }
+}
+
+const submit = async () => {
+  try {
+    saving.value = true
+    
+    // 楠岃瘉琛ㄥ崟
+    await formRef.value.validate()
+    
+    // 楠岃瘉鑷畾涔夊弬鏁�
+    validateCustomParams()
+    
+    if (validationResult.value && !validationResult.value.valid) {
+      ElMessage.error('璇蜂慨姝i厤缃獙璇侀敊璇�')
+      return
+    }
+    
+    const config = {
+      ...form,
+      customParams: form.customParams
+    }
+    
+    let response
+    if (isEdit.value) {
+      response = await deviceGroupApi.update(props.data.id, config)
+    } else {
+      response = await deviceGroupApi.create(config)
+    }
+    
+    if (response.success) {
+      ElMessage.success(isEdit.value ? '璁惧缁勬洿鏂版垚鍔�' : '璁惧缁勫垱寤烘垚鍔�')
+      emit('success', isEdit.value ? 'update' : 'create')
+      handleClose()
+    } else {
+      ElMessage.error(response.message || (isEdit.value ? '鏇存柊澶辫触' : '鍒涘缓澶辫触'))
+    }
+  } catch (error) {
+    console.error('淇濆瓨閰嶇疆澶辫触:', error)
+    ElMessage.error(error.message || (isEdit.value ? '鏇存柊澶辫触' : '鍒涘缓澶辫触'))
+  } finally {
+    saving.value = false
+  }
+}
+
+const handleClose = () => {
+  emit('update:visible', false)
+  emit('close')
+}
+
+// 鐩戝惉鑷畾涔夊弬鏁板彉鍖�
+watch(customParamsText, () => {
+  if (showAdvanced.value) {
+    validateCustomParams()
+  }
+})
+</script>
+
+<style scoped>
+.device-group-form {
+  max-height: 60vh;
+  overflow-y: auto;
+  padding-right: 10px;
+}
+
+.form-card {
+  margin-bottom: 20px;
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  font-weight: bold;
+  color: #303133;
+}
+
+.form-tip {
+  font-size: 12px;
+  color: #909399;
+  margin-top: 4px;
+  line-height: 1.4;
+}
+
+.validation-result {
+  margin: 16px 0;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+
+/* 鑷畾涔夋粴鍔ㄦ潯 */
+.device-group-form::-webkit-scrollbar {
+  width: 6px;
+}
+
+.device-group-form::-webkit-scrollbar-track {
+  background: #f1f1f1;
+  border-radius: 3px;
+}
+
+.device-group-form::-webkit-scrollbar-thumb {
+  background: #c0c4cc;
+  border-radius: 3px;
+}
+
+.device-group-form::-webkit-scrollbar-thumb:hover {
+  background: #909399;
+}
+
+/* 琛ㄥ崟鍏冪礌鏍峰紡璋冩暣 */
+:deep(.el-card__body) {
+  padding: 20px;
+}
+
+:deep(.el-form-item) {
+  margin-bottom: 18px;
+}
+
+:deep(.el-input-number) {
+  width: 100%;
+}
+
+:deep(.el-textarea__inner) {
+  font-family: 'Microsoft YaHei', sans-serif;
+}
+
+/* 楂樼骇閰嶇疆灞曞紑鏀惰捣鍔ㄧ敾 */
+.advanced-config {
+  transition: all 0.3s ease;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.8.0