From c58665039ce8b7c895ed4f1000ff4cf525a92085 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期三, 27 八月 2025 16:28:21 +0800 Subject: [PATCH] 1.设备保养开发联调 --- src/pages/equipmentManagement/repair/add.vue | 437 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 437 insertions(+), 0 deletions(-) diff --git a/src/pages/equipmentManagement/repair/add.vue b/src/pages/equipmentManagement/repair/add.vue new file mode 100644 index 0000000..d48202d --- /dev/null +++ b/src/pages/equipmentManagement/repair/add.vue @@ -0,0 +1,437 @@ +<template> + <view class="repair-add"> + <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 --> + <PageHeader :title="operationType === 'edit' ? '缂栬緫鎶ヤ慨' : '鏂板鎶ヤ慨'" @back="goBack" /> + + <!-- 琛ㄥ崟鍐呭 --> + <van-form @submit="sendForm" ref="formRef" label-width="110px" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center"> + <!-- 鍩烘湰淇℃伅 --> + <van-cell-group title="鍩烘湰淇℃伅" inset> + <van-field + v-model="deviceNameText" + label="璁惧鍚嶇О" + placeholder="璇烽�夋嫨璁惧鍚嶇О" + :rules="formRules.deviceLedgerId" + required + 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="瑙勬牸鍨嬪彿" + placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" + readonly + clearable + /> + <van-field + v-model="form.repairTime" + label="鎶ヤ慨鏃ユ湡" + placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡" + :rules="formRules.repairTime" + required + readonly + @click="showDatePicker" + clearable + /> + <van-field + v-model="form.repairName" + label="鎶ヤ慨浜�" + placeholder="璇疯緭鍏ユ姤淇汉" + :rules="formRules.repairName" + required + clearable + /> + <van-field + v-model="form.remark" + label="鏁呴殰鐜拌薄" + type="textarea" + rows="3" + placeholder="璇疯緭鍏ユ晠闅滅幇璞�" + :rules="formRules.remark" + required + clearable + maxlength="200" + show-word-limit + /> + </van-cell-group> + + <!-- 鎻愪氦鎸夐挳 --> + <view class="footer-btns"> + <van-button class="cancel-btn" @click="goBack">鍙栨秷</van-button> + <van-button class="save-btn" native-type="submit" form-type="submit" :loading="loading">淇濆瓨</van-button> + </view> + </van-form> + + <!-- 璁惧閫夋嫨鍣� --> + <van-popup v-model:show="showDevice" position="bottom"> + <van-picker + :model-value="devicePickerValue" + :columns="deviceColumns" + @confirm="onDeviceConfirm" + @cancel="showDevice = false" + /> + </van-popup> + + <!-- 鏃ユ湡閫夋嫨鍣� --> + <van-popup v-model:show="showDate" position="bottom"> + <van-date-picker + v-model="currentDate" + title="閫夋嫨鏃ユ湡" + @confirm="onDateConfirm" + @cancel="showDate = false" + /> + </van-popup> + </view> +</template> + +<script setup> +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'; +import { addRepair, editRepair, getRepairById } from '@/api/equipmentManagement/repair'; +import dayjs from "dayjs"; +import { showToast } from 'vant'; + +defineOptions({ + name: "璁惧鎶ヤ慨琛ㄥ崟", +}); + +// 琛ㄥ崟寮曠敤 +const formRef = ref(null); +const operationType = ref('add'); +const loading = ref(false); +const showDevice = ref(false); +const devicePickerValue = ref([]); +const showDate = ref(false); +const currentDate = ref([new Date().getFullYear(), new Date().getMonth() + 1, new Date().getDate()]); + +// 璁惧閫夐」 +const deviceOptions = ref([]); +const deviceNameText = ref(''); + +// 鎵爜鐩稿叧鐘舵�� +const isScanning = ref(false); +const scanTimer = ref(null); + +// 琛ㄥ崟楠岃瘉瑙勫垯 +const formRules = { + deviceLedgerId: [{ required: true, trigger: "change", message: "璇烽�夋嫨璁惧鍚嶇О" }], + repairTime: [{ required: true, trigger: "change", message: "璇烽�夋嫨鎶ヤ慨鏃ユ湡" }], + repairName: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ姤淇汉" }], + remark: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ晠闅滅幇璞�" }], +}; + +// 浣跨敤 ref 澹版槑琛ㄥ崟鏁版嵁 +const form = ref({ + deviceLedgerId: undefined, // 璁惧ID + deviceModel: undefined, // 瑙勬牸鍨嬪彿 + repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡 + repairName: undefined, // 鎶ヤ慨浜� + remark: undefined, // 鏁呴殰鐜拌薄 +}); + +// 璁惧閫夋嫨鍣ㄥ垪 +const deviceColumns = computed(() => { + return deviceOptions.value.map(item => ({ + text: item.deviceName, + value: item.id + })); +}); + +// 鍔犺浇璁惧鍒楄〃 +const loadDeviceName = async () => { + try { + const { data } = await getDeviceLedger(); + deviceOptions.value = data || []; + } catch (e) { + showToast('鑾峰彇璁惧鍒楄〃澶辫触'); + } +}; + +// 璁剧疆璁惧瑙勬牸鍨嬪彿 +const setDeviceModel = (id) => { + const option = deviceOptions.value.find((item) => item.id === id); + if (option) { + form.value.deviceModel = option.deviceModel; + deviceNameText.value = option.deviceName; + } +}; + +// 鍔犺浇琛ㄥ崟鏁版嵁锛堢紪杈戞ā寮忥級 +const loadForm = async (id) => { + if (id) { + operationType.value = 'edit'; + try { + const { code, data } = await getRepairById(id); + if (code == 200) { + form.value.deviceLedgerId = data.deviceLedgerId; + form.value.deviceModel = data.deviceModel; + form.value.repairTime = data.repairTime; + form.value.repairName = data.repairName; + form.value.remark = data.remark; + // 璁剧疆璁惧鍚嶇О鏄剧ず + const device = deviceOptions.value.find(item => item.id === data.deviceLedgerId); + if (device) { + deviceNameText.value = device.deviceName; + } + } + } catch (e) { + showToast('鑾峰彇璇︽儏澶辫触'); + } + } else { + // 鏂板妯″紡 + operationType.value = 'add'; + } +}; + +// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵�� +const clearValidate = () => { + formRef.value?.clearValidate(); +}; + +// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬� +const resetForm = () => { + form.value = { + deviceLedgerId: undefined, + deviceModel: undefined, + repairTime: dayjs().format("YYYY-MM-DD"), + repairName: undefined, + remark: undefined, + }; + deviceNameText.value = ''; +}; + +const resetFormAndValidate = () => { + resetForm(); + 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 { + // 鎵嬪姩楠岃瘉琛ㄥ崟 + await formRef.value?.validate(); + + loading.value = true; + const id = getPageId(); + + // 鍑嗗鎻愪氦鏁版嵁 + const submitData = { ...form.value }; + + const { code } = id + ? await editRepair({ id: id, ...submitData }) + : await addRepair(submitData); + + if (code == 200) { + showToast(`${id ? "缂栬緫" : "鏂板"}鎶ヤ慨鎴愬姛`); + setTimeout(() => { + uni.navigateBack(); + }, 1500); + } else { + loading.value = false; + } + } catch (e) { + loading.value = false; + showToast('琛ㄥ崟楠岃瘉澶辫触'); + } +}; + +// 杩斿洖涓婁竴椤� +const goBack = () => { + uni.navigateBack(); +}; + +// 鑾峰彇椤甸潰鍙傛暟 +const getPageParams = () => { + const pages = getCurrentPages(); + const currentPage = pages[pages.length - 1]; + const options = currentPage.options; + + // 鏍规嵁鏄惁鏈塱d鍙傛暟鏉ュ垽鏂槸鏂板杩樻槸缂栬緫 + if (options.id) { + // 缂栬緫妯″紡锛岃幏鍙栬鎯� + loadForm(options.id); + } else { + // 鏂板妯″紡 + loadForm(); + } +}; + +// 鑾峰彇椤甸潰ID +const getPageId = () => { + const pages = getCurrentPages(); + const currentPage = pages[pages.length - 1]; + const options = currentPage.options; + return options.id; +}; +</script> + +<style scoped lang="scss"> +.repair-add { + min-height: 100vh; + background: #f8f9fa; + padding-bottom: 5rem; +} + +.footer-btns { + position: fixed; + left: 0; + right: 0; + bottom: 0; + background: #fff; + display: flex; + justify-content: space-around; + align-items: center; + padding: 0.75rem 0; + box-shadow: 0 -0.125rem 0.5rem rgba(0,0,0,0.05); + z-index: 1000; +} + +.cancel-btn { + font-weight: 400; + font-size: 1rem; + color: #FFFFFF; + width: 6.375rem; + background: #C7C9CC; + box-shadow: 0 0.25rem 0.625rem 0 rgba(3,88,185,0.2); + border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; +} + +.save-btn { + font-weight: 400; + font-size: 1rem; + color: #FFFFFF; + width: 14rem; + background: linear-gradient( 140deg, #00BAFF 0%, #006CFB 100%); + box-shadow: 0 0.25rem 0.625rem 0 rgba(3,88,185,0.2); + border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; +} + +// 鍝嶅簲寮忚皟鏁� +@media (max-width: 768px) { + .submit-section { + padding: 12px; + } +} + +.tip-text { + padding: 4px 16px 0 16px; + 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