From 4f5d8e28b98957dd2f60f06e6e81929477f4ebf9 Mon Sep 17 00:00:00 2001 From: eight <641137800@qq.com> Date: 星期一, 09 九月 2024 16:49:22 +0800 Subject: [PATCH] 设备管理功能 --- src/api/ecg/devmanage/index.ts | 16 ++ src/views/ecg/devmanage/index.vue | 195 +++++++++++++++++-------------- src/views/ecg/devmanage/DeviceForm.vue | 119 +++++++++++++------ 3 files changed, 204 insertions(+), 126 deletions(-) diff --git a/src/api/ecg/devmanage/index.ts b/src/api/ecg/devmanage/index.ts index 486c4f5..912ca47 100644 --- a/src/api/ecg/devmanage/index.ts +++ b/src/api/ecg/devmanage/index.ts @@ -14,7 +14,12 @@ category: string // 鍒嗙被鍚� brand: string // 鍝佺墝 model: string // 鍨嬪彿 - purchaseDate: Date // 閲囪喘鏃ユ湡 + purchaseDate: number // 閲囪喘鏃ユ湡 +} + +export interface OptionsVO { + label: string + value: string } // 璁惧鍨嬪彿 API @@ -47,6 +52,15 @@ // 瀵煎嚭璁惧鍨嬪彿 Excel exportDevModel: async (params) => { return await request.download({ url: `/ecg/dev-model/export-excel`, params }) + }, + + // + getBrandOption: async (category: string) => { + return await request.get({ url: `/ecg/dev-model/brand-option?category=` + category }) + }, + + getModelOption: async (category: string, brand: string) => { + return await request.get({ url: `/ecg/dev-model/model-option?category=` + category + `&brand=` + brand }) } } diff --git a/src/views/ecg/devmanage/DeviceForm.vue b/src/views/ecg/devmanage/DeviceForm.vue index b57e583..90e165a 100644 --- a/src/views/ecg/devmanage/DeviceForm.vue +++ b/src/views/ecg/devmanage/DeviceForm.vue @@ -1,22 +1,37 @@ <template> <Dialog :title="dialogTitle" v-model="dialogVisible"> <el-form - ref="formRef" - :model="formData" - :rules="formRules" - label-width="100px" - v-loading="formLoading" + ref="formRef" + :model="formData" + :rules="formRules" + label-width="100px" + v-loading="formLoading" > + <el-form-item label="閲囪喘鏃ユ湡" prop="purchaseDate"> + <el-date-picker + v-model="formData.purchaseDate" + type="date" + value-format="x" + placeholder="閫夋嫨閲囪喘鏃ユ湡" + /> + </el-form-item> <el-form-item label="璁惧缂栧彿" prop="devId"> <el-input v-model="formData.devId" placeholder="璇疯緭鍏ヨ澶囩紪鍙�" /> </el-form-item> <el-form-item label="鍒嗙被鍚�" prop="category"> - <el-input v-model="formData.category" placeholder="璇疯緭鍏ュ垎绫诲悕" /> + <el-select v-model="formData.category" placeholder="璇烽�夋嫨鍒嗙被鍚�" @change="categoryChanged"> + <el-option + v-for="dict in categoryOptions" + :key="dict.value as string" + :label="dict.label" + :value="dict.value" + /> + </el-select> </el-form-item> <el-form-item label="鍝佺墝" prop="brand"> - <el-select v-model="formData.brand" placeholder="璇疯緭鍏ュ搧鐗�"> + <el-select v-model="formData.brand" placeholder="璇烽�夋嫨鍝佺墝" @change="brandChanged"> <el-option - v-for="dict in getIntDictOptions(DICT_TYPE.ECG_DEV_BRAND)" + v-for="dict in brandOptions" :key="dict.value" :label="dict.label" :value="dict.value" @@ -24,15 +39,14 @@ </el-select> </el-form-item> <el-form-item label="鍨嬪彿" prop="model"> - <el-input v-model="formData.model" placeholder="璇疯緭鍏ュ瀷鍙�" /> - </el-form-item> - <el-form-item label="閲囪喘鏃ユ湡" prop="purchaseDate"> - <el-date-picker - v-model="formData.purchaseDate" - type="date" - value-format="x" - placeholder="閫夋嫨閲囪喘鏃ユ湡" - /> + <el-select v-model="formData.model" placeholder="璇烽�夋嫨鍨嬪彿"> + <el-option + v-for="dict in modelOptions" + :key="dict.value" + :label="dict.label" + :value="dict.value" + /> + </el-select> </el-form-item> </el-form> <template #footer> @@ -42,8 +56,8 @@ </Dialog> </template> <script setup lang="ts"> -import { DeviceApi, DeviceVO } from '@/api/ecg/devmanage' -import {DICT_TYPE, getIntDictOptions} from "@/utils/dict"; +import {getStrDictOptions, DICT_TYPE, DictDataType} from '@/utils/dict' +import {DeviceApi, DeviceVO, DevModelApi, OptionsVO} from '@/api/ecg/devmanage' /** 璁惧 琛ㄥ崟 */ defineOptions({ name: 'DeviceForm' }) @@ -55,19 +69,15 @@ const dialogTitle = ref('') // 寮圭獥鐨勬爣棰� const formLoading = ref(false) // 琛ㄥ崟鐨勫姞杞戒腑锛�1锛変慨鏀规椂鐨勬暟鎹姞杞斤紱2锛夋彁浜ょ殑鎸夐挳绂佺敤 const formType = ref('') // 琛ㄥ崟鐨勭被鍨嬶細create - 鏂板锛泆pdate - 淇敼 -const formData = ref({ - id: undefined, - devId: undefined, - category: undefined, - brand: undefined, - model: undefined, - purchaseDate: undefined +const formData = ref<DeviceVO>({ + id: 0, + purchaseDate: new Date().getTime(), + devId: '', + category: '', + brand: '', + model: '' }) const formRules = reactive({ - devId: [{ required: true, message: '璁惧缂栧彿涓嶈兘涓虹┖', trigger: 'blur' }], - category: [{ required: true, message: '鍒嗙被鍚嶄笉鑳戒负绌�', trigger: 'blur' }], - brand: [{ required: true, message: '鍝佺墝涓嶈兘涓虹┖', trigger: 'blur' }], - model: [{ required: true, message: '鍨嬪彿涓嶈兘涓虹┖', trigger: 'blur' }] }) const formRef = ref() // 琛ㄥ崟 Ref @@ -77,13 +87,23 @@ dialogTitle.value = t('action.' + type) formType.value = type resetForm() + // 淇敼鏃讹紝璁剧疆鏁版嵁 if (id) { formLoading.value = true try { formData.value = await DeviceApi.getDevice(id) + const bandData = await DevModelApi.getBrandOption(formData.value.category!) + brandOptions.value = bandData + const modelData = await DevModelApi.getModelOption(formData.value.category!, formData.value.brand!) + modelOptions.value = modelData } finally { formLoading.value = false + } + } else { // 鏂板鏃� + if (categoryOptions.value.length !== 0) { + formData.value.category = categoryOptions.value[0].value as string + categoryChanged() } } } @@ -116,13 +136,40 @@ /** 閲嶇疆琛ㄥ崟 */ const resetForm = () => { formData.value = { - id: undefined, - devId: undefined, - category: undefined, - brand: undefined, - model: undefined, - purchaseDate: undefined + id: 0, + purchaseDate: new Date().getTime(), + devId: '', + category: '', + brand: '', + model: '' } formRef.value?.resetFields() } + +const brandOptions = ref<OptionsVO[]>([]) +const modelOptions = ref<OptionsVO[]>([]) + +const categoryChanged = async () => { + const data = await DevModelApi.getBrandOption(formData.value.category!) + brandOptions.value = data + + formData.value.brand = brandOptions.value.length === 0 ? "" : brandOptions.value[0].value + brandChanged() +} + +const brandChanged = async () => { + const data = await DevModelApi.getModelOption(formData.value.category!, formData.value.brand!) + modelOptions.value = data + + formData.value.model = modelOptions.value.length === 0 ? "" : modelOptions.value[0].value +} + +const categoryOptions = ref<DictDataType[]>([]) + +onMounted( async () => { + console.info("onMount DeviceForm...") + const data = await getStrDictOptions(DICT_TYPE.ECG_DEV_CATEGORY) + categoryOptions.value = data +}) + </script> \ No newline at end of file diff --git a/src/views/ecg/devmanage/index.vue b/src/views/ecg/devmanage/index.vue index c30f17b..67649aa 100644 --- a/src/views/ecg/devmanage/index.vue +++ b/src/views/ecg/devmanage/index.vue @@ -2,87 +2,95 @@ <ContentWrap> <!-- 鎼滅储宸ヤ綔鏍� --> <el-form - class="-mb-15px" - :model="queryParams" - ref="queryFormRef" - :inline="true" - label-width="68px" + class="-mb-15px" + :model="queryParams" + ref="queryFormRef" + :inline="true" + label-width="68px" > - <el-form-item label="璁惧缂栧彿" prop="devId"> - <el-input - v-model="queryParams.devId" - placeholder="璇疯緭鍏ヨ澶囩紪鍙�" - clearable - @keyup.enter="handleQuery" - class="!w-240px" - /> - </el-form-item> - <el-form-item label="鍒嗙被鍚�" prop="category"> - <el-input - v-model="queryParams.category" - placeholder="璇疯緭鍏ュ垎绫诲悕" - clearable - @keyup.enter="handleQuery" - class="!w-240px" - /> - </el-form-item> - <el-form-item label="鍝佺墝" prop="brand"> - <el-input - v-model="queryParams.brand" - placeholder="璇疯緭鍏ュ搧鐗�" - clearable - @keyup.enter="handleQuery" - class="!w-240px" - /> - </el-form-item> - <el-form-item label="鍨嬪彿" prop="model"> - <el-input - v-model="queryParams.model" - placeholder="璇疯緭鍏ュ瀷鍙�" - clearable - @keyup.enter="handleQuery" - class="!w-240px" - /> - </el-form-item> <el-form-item label="閲囪喘鏃ユ湡" prop="purchaseDate"> <el-date-picker - v-model="queryParams.purchaseDate" - value-format="YYYY-MM-DD HH:mm:ss" - type="daterange" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" - class="!w-220px" + v-model="queryParams.purchaseDate" + value-format="YYYY-MM-DD HH:mm:ss" + type="daterange" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" + class="!w-220px" /> </el-form-item> <el-form-item label="鍒涘缓鏃堕棿" prop="createTime"> <el-date-picker - v-model="queryParams.createTime" - value-format="YYYY-MM-DD HH:mm:ss" - type="daterange" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" - class="!w-220px" + v-model="queryParams.createTime" + value-format="YYYY-MM-DD HH:mm:ss" + type="daterange" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" + class="!w-220px" /> + </el-form-item> + <el-form-item label="璁惧缂栧彿" prop="devId"> + <el-input + v-model="queryParams.devId" + placeholder="璇疯緭鍏ヨ澶囩紪鍙�" + clearable + @keyup.enter="handleQuery" + class="!w-240px" + /> + </el-form-item> + <el-form-item label="鍒嗙被鍚�" prop="category"> + <el-select + v-model="queryParams.category" + placeholder="璇烽�夋嫨鍒嗙被鍚�" + clearable + class="!w-240px" + > + <el-option + v-for="dict in getStrDictOptions(DICT_TYPE.ECG_DEV_CATEGORY)" + :key="dict.value" + :label="dict.label" + :value="dict.value" + /> + </el-select> + </el-form-item> + <el-form-item label="鍝佺墝" prop="brand"> + <el-select + v-model="queryParams.brand" + placeholder="璇烽�夋嫨鍝佺墝" + clearable + class="!w-240px" + > + <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" /> + </el-select> + </el-form-item> + <el-form-item label="鍨嬪彿" prop="model"> + <el-select + v-model="queryParams.model" + placeholder="璇烽�夋嫨鍨嬪彿" + clearable + class="!w-240px" + > + <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" /> + </el-select> </el-form-item> <el-form-item> <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 鎼滅储</el-button> <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 閲嶇疆</el-button> <el-button - type="primary" - plain - @click="openForm('create')" - v-hasPermi="['ecg:device:create']" + type="primary" + plain + @click="openForm('create')" + v-hasPermi="['ecg:device:create']" > <Icon icon="ep:plus" class="mr-5px" /> 鏂板 </el-button> <el-button - type="success" - plain - @click="handleExport" - :loading="exportLoading" - v-hasPermi="['ecg:device:export']" + type="success" + plain + @click="handleExport" + :loading="exportLoading" + v-hasPermi="['ecg:device:export']" > <Icon icon="ep:download" class="mr-5px" /> 瀵煎嚭 </el-button> @@ -94,33 +102,41 @@ <ContentWrap> <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> <el-table-column label="id" align="center" prop="id" /> - <el-table-column label="璁惧缂栧彿" align="center" prop="devId" /> - <el-table-column label="鍒嗙被鍚�" align="center" prop="category" /> - <el-table-column label="鍝佺墝" align="center" prop="brand" /> + <el-table-column label="閲囪喘鏃ユ湡" align="center" prop="purchaseDate" :formatter="dateFormatter2" width="120px"/> + <el-table-column label="璁惧缂栧彿" align="center" prop="devId" width="100px" /> + <el-table-column label="鍒嗙被鍚�" align="center" prop="category"> + <template #default="scope"> + <dict-tag :type="DICT_TYPE.ECG_DEV_CATEGORY" :value="scope.row.category" /> + </template> + </el-table-column> + <el-table-column label="鍝佺墝" align="center" prop="brand" width="100px"> + <template #default="scope"> + <dict-tag :type="DICT_TYPE.ECG_DEV_BRAND" :value="scope.row.brand" /> + </template> + </el-table-column> <el-table-column label="鍨嬪彿" align="center" prop="model" /> - <el-table-column label="閲囪喘鏃ユ湡" align="center" prop="purchaseDate" /> <el-table-column - label="鍒涘缓鏃堕棿" - align="center" - prop="createTime" - :formatter="dateFormatter" - width="180px" + label="鍒涘缓鏃堕棿" + align="center" + prop="createTime" + :formatter="dateFormatter" + width="180px" /> <el-table-column label="鎿嶄綔" align="center" min-width="120px"> <template #default="scope"> <el-button - link - type="primary" - @click="openForm('update', scope.row.id)" - v-hasPermi="['ecg:device:update']" + link + type="primary" + @click="openForm('update', scope.row.id)" + v-hasPermi="['ecg:device:update']" > 缂栬緫 </el-button> <el-button - link - type="danger" - @click="handleDelete(scope.row.id)" - v-hasPermi="['ecg:device:delete']" + link + type="danger" + @click="handleDelete(scope.row.id)" + v-hasPermi="['ecg:device:delete']" > 鍒犻櫎 </el-button> @@ -129,10 +145,10 @@ </el-table> <!-- 鍒嗛〉 --> <Pagination - :total="total" - v-model:page="queryParams.pageNo" - v-model:limit="queryParams.pageSize" - @pagination="getList" + :total="total" + v-model:page="queryParams.pageNo" + v-model:limit="queryParams.pageSize" + @pagination="getList" /> </ContentWrap> @@ -141,7 +157,8 @@ </template> <script setup lang="ts"> -import { dateFormatter } from '@/utils/formatTime' +import { getStrDictOptions, DICT_TYPE } from '@/utils/dict' +import {dateFormatter, dateFormatter2} from '@/utils/formatTime' import download from '@/utils/download' import { DeviceApi, DeviceVO } from '@/api/ecg/devmanage' import DeviceForm from './DeviceForm.vue' @@ -158,12 +175,12 @@ const queryParams = reactive({ pageNo: 1, pageSize: 10, + purchaseDate: [], + createTime: [], devId: undefined, category: undefined, brand: undefined, - model: undefined, - purchaseDate: [], - createTime: [] + model: undefined }) const queryFormRef = ref() // 鎼滅储鐨勮〃鍗� const exportLoading = ref(false) // 瀵煎嚭鐨勫姞杞戒腑 -- Gitblit v1.9.3