Przeglądaj źródła

fix: 设备编辑对话框状态字段绑定修正

- 状态字段绑定从 state.ruleForm.status 改为 state.ruleForm.state,与后端字段对齐
- 字典选项通过 Session 读取,与列表页 WashDevice.status 字典一致
skyline 4 dni temu
rodzic
commit
61f1eb7e77
1 zmienionych plików z 44 dodań i 13 usunięć
  1. 44 13
      admin-web/src/views/admin/station/device/dialog.vue

+ 44 - 13
admin-web/src/views/admin/station/device/dialog.vue

@@ -10,7 +10,8 @@
         draggable
         destroy-on-close
         :close-on-click-modal="false"
-        align-center>
+        align-center
+        @open="onDialogOpen">
       <el-form
           inline
           :model="state.ruleForm"
@@ -56,18 +57,20 @@
           </el-input>
         </el-form-item>
         <el-form-item label="状态" prop="state" class="wd350">
-          <ext-d-select type="WashDevice.status" v-model="state.ruleForm.status" class="wd200"></ext-d-select>
+          <el-select v-model="state.ruleForm.state" clearable placeholder="请选择" class="wd200">
+            <el-option v-for="item in getStatusOptions()" :key="item.value" :label="item.name" :value="item.value" />
+          </el-select>
         </el-form-item>
 
         <el-form-item label="是否有泡沫" prop="hasFoam" class="wd250">
-          <ext-d-select type="WashDevice.foam" v-model="state.ruleForm.hasFoam" class="wd200"></ext-d-select>
+          <el-switch v-model="state.ruleForm.hasFoam" active-text="有" inactive-text="无" />
         </el-form-item>
         <el-form-item label="是否有水" prop="hasWater" class="wd250">
-          <ext-d-select type="WashDevice.water" v-model="state.ruleForm.hasWater" class="wd200"></ext-d-select>
+          <el-switch v-model="state.ruleForm.hasWater" active-text="有" inactive-text="无" />
         </el-form-item>
 
         <el-form-item label="是否支持PA" prop="hasPa" class="wd250">
-          <ext-d-select type="yes_no" v-model="state.ruleForm.hasPa" class="wd200"></ext-d-select>
+          <el-switch v-model="state.ruleForm.hasPa" active-text="是" inactive-text="否" />
         </el-form-item>
 
         <el-form-item label="板载温度" prop="temperatureChip" class="wd350">
@@ -119,11 +122,11 @@
 </template>
 
 <script setup lang="ts" name="WashDeviceDialog">
-import {defineAsyncComponent, reactive, onMounted, ref} from 'vue';
+import {defineAsyncComponent, reactive, ref} from 'vue';
 import {Msg} from "/@/utils/message";
 import {$body, $get} from "/@/utils/request";
 import u from '/@/utils/u'
-import ExtDSelect from "/@/components/form/ExtDSelect.vue";
+import {Session} from "/@/utils/storage";
 import ExtSelect from "/@/components/form/ExtSelect.vue";
 
 
@@ -150,17 +153,32 @@ const initState = () => ({
 // 定义变量内容
 const state = reactive(initState());
 
+// 状态字典选项,直接从 Session 读取,避免 ext-d-select 组件挂载时序问题
+const getStatusOptions = (): any[] => {
+  const dicts = Session.get('dicts')
+  return dicts?.['WashDevice.status'] || []
+}
+
+// 暂存打开参数,等弹窗动画完成后再加载
+let pendingAction = ''
+let pendingRow: any = null
+
+// 弹窗打开后(动画完成、DOM 就绪)加载数据
+const onDialogOpen = () => {
+  if (pendingAction !== 'add' && pendingRow?.id) {
+    loadData(pendingRow.id)
+  } else if (pendingAction === 'add') {
+    state.ruleForm = { id: null, ...pendingRow }
+  }
+}
 
 // 打开弹窗
 const open = (action: string = 'add', row: any) => {
+  pendingAction = action
+  pendingRow = row
   state.dialog.title = u.dialog.actions[action].title + "『洗车设备』"
   state.dialog.submitTxt = u.dialog.actions[action].btn + "『洗车设备』"
   state.dialog.isShowDialog = true;
-  if (action !== 'add') {
-    loadData(row.id);
-  } else {
-    state.ruleForm = Object.assign(state.ruleForm, row);
-  }
 };
 // 关闭弹窗
 const onClose = () => {
@@ -195,10 +213,23 @@ const handleFormChange = (formData: any) => {
   //console.log(formData)
 }
 
+// 将后端 boolean 字段(int 0/1 或 string "0"/"1")转为前端 boolean
+const BOOL_FIELDS = ['hasFoam', 'hasWater', 'hasPa'] as const
+
+const normalizeBooleans = (data: Record<string, any>) => {
+  BOOL_FIELDS.forEach((key) => {
+    const v = data[key]
+    if (v === undefined || v === null) return
+    if (typeof v === 'boolean') return
+    data[key] = typeof v === 'number' ? v !== 0 : v === '1' || v === 'true'
+  })
+}
+
 // 初始化数据
 const loadData = (id: number) => {
   $get(`washDevice/detail/${id}`).then((res: any) => {
-    state.ruleForm = res;
+    normalizeBooleans(res)
+    state.ruleForm = res
   })
 }