From 7a0ffb0048adeda9ebfbca1d0b525eb224c173e3 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期五, 29 八月 2025 17:00:16 +0800 Subject: [PATCH] 修改组件 --- src/pages/equipmentManagement/repair/add.vue | 157 +++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 119 insertions(+), 38 deletions(-) diff --git a/src/pages/equipmentManagement/repair/add.vue b/src/pages/equipmentManagement/repair/add.vue index 7b865c0..d48202d 100644 --- a/src/pages/equipmentManagement/repair/add.vue +++ b/src/pages/equipmentManagement/repair/add.vue @@ -16,7 +16,11 @@ readonly @click="showDevicePicker" clearable - /> + > + <template #right-icon> + <van-icon name="scan" @click.stop="startScan" class="scan-icon" /> + </template> + </van-field> <van-field v-model="form.deviceModel" label="瑙勬牸鍨嬪彿" @@ -86,7 +90,7 @@ </template> <script setup> -import { ref, computed, onMounted } from 'vue'; +import { ref, computed, onMounted, onUnmounted } from 'vue'; import { onShow } from '@dcloudio/uni-app'; import PageHeader from '@/components/PageHeader.vue'; import { getDeviceLedger } from '@/api/equipmentManagement/ledger'; @@ -110,6 +114,10 @@ // 璁惧閫夐」 const deviceOptions = ref([]); const deviceNameText = ref(''); + +// 鎵爜鐩稿叧鐘舵�� +const isScanning = ref(false); +const scanTimer = ref(null); // 琛ㄥ崟楠岃瘉瑙勫垯 const formRules = { @@ -204,6 +212,108 @@ clearValidate(); }; +// 鎵弿浜岀淮鐮佸姛鑳� +const startScan = () => { + if (isScanning.value) { + showToast('姝e湪鎵弿涓紝璇风◢鍊�...'); + return; + } + + // 璋冪敤uni-app鐨勬壂鐮丄PI + uni.scanCode({ + scanType: ['qrCode', 'barCode'], + success: (res) => { + handleScanResult(res.result); + }, + fail: (err) => { + console.error('鎵爜澶辫触:', err); + showToast('鎵爜澶辫触锛岃閲嶈瘯'); + } + }); +}; + +// 澶勭悊鎵爜缁撴灉 +const handleScanResult = (scanResult) => { + if (!scanResult) { + showToast('鎵爜缁撴灉涓虹┖'); + return; + } + + isScanning.value = true; + showToast('鎵爜鎴愬姛锛�3绉掑悗鑷姩濉厖璁惧淇℃伅'); + + // 3绉掑悗澶勭悊鎵爜缁撴灉 + scanTimer.value = setTimeout(() => { + processScanResult(scanResult); + isScanning.value = false; + }, 3000); +}; + +// 澶勭悊鎵爜缁撴灉骞跺尮閰嶈澶� +const processScanResult = (scanResult) => { + // 鍦ㄨ澶囧垪琛ㄤ腑鏌ユ壘鍖归厤鐨勮澶� + // 鍋囪浜岀淮鐮佸唴瀹规槸璁惧鍚嶇О鎴栬澶囩紪鍙� + const matchedDevice = deviceOptions.value.find(device => + device.deviceName === scanResult || + device.deviceCode === scanResult || + device.id.toString() === scanResult + ); + + if (matchedDevice) { + // 鎵惧埌鍖归厤鐨勮澶囷紝鑷姩濉厖 + form.value.deviceLedgerId = matchedDevice.id; + deviceNameText.value = matchedDevice.deviceName; + form.value.deviceModel = matchedDevice.deviceModel; + showToast('璁惧淇℃伅宸茶嚜鍔ㄥ~鍏�'); + } else { + // 鏈壘鍒板尮閰嶇殑璁惧 + showToast('鏈壘鍒板尮閰嶇殑璁惧锛岃鎵嬪姩閫夋嫨'); + } +}; + +// 鏄剧ず璁惧閫夋嫨鍣� +const showDevicePicker = () => { + showDevice.value = true; +}; + +// 纭璁惧閫夋嫨 +const onDeviceConfirm = ({ selectedValues, selectedOptions }) => { + form.value.deviceLedgerId = selectedOptions[0].value; + devicePickerValue.value = selectedValues; + showDevice.value = false; + setDeviceModel(selectedOptions[0].value); +}; + +// 鏄剧ず鏃ユ湡閫夋嫨鍣� +const showDatePicker = () => { + showDate.value = true; +}; + +// 纭鏃ユ湡閫夋嫨 +const onDateConfirm = ({ selectedValues }) => { + form.value.repairTime = selectedValues.join('-'); + currentDate.value = selectedValues; + showDate.value = false; +}; + +onShow(() => { + // 椤甸潰鏄剧ず鏃惰幏鍙栧弬鏁� + getPageParams(); +}); + +onMounted(() => { + // 椤甸潰鍔犺浇鏃惰幏鍙栬澶囧垪琛ㄥ拰鍙傛暟 + loadDeviceName(); + getPageParams(); +}); + +// 缁勪欢鍗歌浇鏃舵竻鐞嗗畾鏃跺櫒 +onUnmounted(() => { + if (scanTimer.value) { + clearTimeout(scanTimer.value); + } +}); + // 鎻愪氦琛ㄥ崟 const sendForm = async () => { try { @@ -262,42 +372,6 @@ const options = currentPage.options; return options.id; }; - -// 鏄剧ず璁惧閫夋嫨鍣� -const showDevicePicker = () => { - showDevice.value = true; -}; - -// 纭璁惧閫夋嫨 -const onDeviceConfirm = ({ selectedValues, selectedOptions }) => { - form.value.deviceLedgerId = selectedOptions[0].value; - devicePickerValue.value = selectedValues; - showDevice.value = false; - setDeviceModel(selectedOptions[0].value); -}; - -// 鏄剧ず鏃ユ湡閫夋嫨鍣� -const showDatePicker = () => { - showDate.value = true; -}; - -// 纭鏃ユ湡閫夋嫨 -const onDateConfirm = ({ selectedValues }) => { - form.value.repairTime = selectedValues.join('-'); - currentDate.value = selectedValues; - showDate.value = false; -}; - -onShow(() => { - // 椤甸潰鏄剧ず鏃惰幏鍙栧弬鏁� - getPageParams(); -}); - -onMounted(() => { - // 椤甸潰鍔犺浇鏃惰幏鍙栬澶囧垪琛ㄥ拰鍙傛暟 - loadDeviceName(); - getPageParams(); -}); </script> <style scoped lang="scss"> @@ -353,4 +427,11 @@ font-size: 12px; color: #888; } + +.scan-icon { + color: #1989fa; + font-size: 18px; + margin-left: 8px; + cursor: pointer; +} </style> \ No newline at end of file -- Gitblit v1.9.3