|
@@ -10,7 +10,8 @@
|
|
|
draggable
|
|
draggable
|
|
|
destroy-on-close
|
|
destroy-on-close
|
|
|
:close-on-click-modal="false"
|
|
:close-on-click-modal="false"
|
|
|
- align-center>
|
|
|
|
|
|
|
+ align-center
|
|
|
|
|
+ @open="onDialogOpen">
|
|
|
<el-form
|
|
<el-form
|
|
|
inline
|
|
inline
|
|
|
:model="state.ruleForm"
|
|
:model="state.ruleForm"
|
|
@@ -56,18 +57,20 @@
|
|
|
</el-input>
|
|
</el-input>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item label="状态" prop="state" class="wd350">
|
|
<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>
|
|
|
|
|
|
|
|
<el-form-item label="是否有泡沫" prop="hasFoam" class="wd250">
|
|
<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>
|
|
|
<el-form-item label="是否有水" prop="hasWater" class="wd250">
|
|
<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>
|
|
|
|
|
|
|
|
<el-form-item label="是否支持PA" prop="hasPa" class="wd250">
|
|
<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>
|
|
|
|
|
|
|
|
<el-form-item label="板载温度" prop="temperatureChip" class="wd350">
|
|
<el-form-item label="板载温度" prop="temperatureChip" class="wd350">
|
|
@@ -119,11 +122,11 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts" name="WashDeviceDialog">
|
|
<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 {Msg} from "/@/utils/message";
|
|
|
import {$body, $get} from "/@/utils/request";
|
|
import {$body, $get} from "/@/utils/request";
|
|
|
import u from '/@/utils/u'
|
|
import u from '/@/utils/u'
|
|
|
-import ExtDSelect from "/@/components/form/ExtDSelect.vue";
|
|
|
|
|
|
|
+import {Session} from "/@/utils/storage";
|
|
|
import ExtSelect from "/@/components/form/ExtSelect.vue";
|
|
import ExtSelect from "/@/components/form/ExtSelect.vue";
|
|
|
|
|
|
|
|
|
|
|
|
@@ -150,17 +153,32 @@ const initState = () => ({
|
|
|
// 定义变量内容
|
|
// 定义变量内容
|
|
|
const state = reactive(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) => {
|
|
const open = (action: string = 'add', row: any) => {
|
|
|
|
|
+ pendingAction = action
|
|
|
|
|
+ pendingRow = row
|
|
|
state.dialog.title = u.dialog.actions[action].title + "『洗车设备』"
|
|
state.dialog.title = u.dialog.actions[action].title + "『洗车设备』"
|
|
|
state.dialog.submitTxt = u.dialog.actions[action].btn + "『洗车设备』"
|
|
state.dialog.submitTxt = u.dialog.actions[action].btn + "『洗车设备』"
|
|
|
state.dialog.isShowDialog = true;
|
|
state.dialog.isShowDialog = true;
|
|
|
- if (action !== 'add') {
|
|
|
|
|
- loadData(row.id);
|
|
|
|
|
- } else {
|
|
|
|
|
- state.ruleForm = Object.assign(state.ruleForm, row);
|
|
|
|
|
- }
|
|
|
|
|
};
|
|
};
|
|
|
// 关闭弹窗
|
|
// 关闭弹窗
|
|
|
const onClose = () => {
|
|
const onClose = () => {
|
|
@@ -195,10 +213,23 @@ const handleFormChange = (formData: any) => {
|
|
|
//console.log(formData)
|
|
//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) => {
|
|
const loadData = (id: number) => {
|
|
|
$get(`washDevice/detail/${id}`).then((res: any) => {
|
|
$get(`washDevice/detail/${id}`).then((res: any) => {
|
|
|
- state.ruleForm = res;
|
|
|
|
|
|
|
+ normalizeBooleans(res)
|
|
|
|
|
+ state.ruleForm = res
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|