From bd0958c54934298f130e477a53e86367ee80e347 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期三, 27 八月 2025 15:43:45 +0800 Subject: [PATCH] 1.设备报修开发联调 --- src/pages/index.vue | 5 src/pages.json | 21 + src/pages/equipmentManagement/repair/maintain.vue | 267 ++++++++++++++ src/pages/equipmentManagement/repair/index.vue | 377 ++++++++++++++++++++ src/pages/equipmentManagement/repair/add.vue | 356 +++++++++++++++++++ 5 files changed, 1,026 insertions(+), 0 deletions(-) diff --git a/src/pages.json b/src/pages.json index 955b869..293d591 100644 --- a/src/pages.json +++ b/src/pages.json @@ -306,6 +306,27 @@ "navigationBarTitleText": "璁惧鍙拌处璇︽儏", "navigationStyle": "custom" } + }, + { + "path": "pages/equipmentManagement/repair/index", + "style": { + "navigationBarTitleText": "璁惧鎶ヤ慨", + "navigationStyle": "custom" + } + }, + { + "path": "pages/equipmentManagement/repair/add", + "style": { + "navigationBarTitleText": "鏂板璁惧鎶ヤ慨", + "navigationStyle": "custom" + } + }, + { + "path": "pages/equipmentManagement/repair/maintain", + "style": { + "navigationBarTitleText": "璁惧缁翠慨", + "navigationStyle": "custom" + } } ], "subPackages": [ diff --git a/src/pages/equipmentManagement/repair/add.vue b/src/pages/equipmentManagement/repair/add.vue new file mode 100644 index 0000000..7b865c0 --- /dev/null +++ b/src/pages/equipmentManagement/repair/add.vue @@ -0,0 +1,356 @@ +<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 + /> + <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 } 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 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 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; +}; + +// 鏄剧ず璁惧閫夋嫨鍣� +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"> +.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; +} +</style> \ No newline at end of file diff --git a/src/pages/equipmentManagement/repair/index.vue b/src/pages/equipmentManagement/repair/index.vue new file mode 100644 index 0000000..0662172 --- /dev/null +++ b/src/pages/equipmentManagement/repair/index.vue @@ -0,0 +1,377 @@ +<template> + <view class="device-repair"> + <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 --> + <PageHeader title="璁惧鎶ヤ慨" @back="goBack" /> + + <!-- 鎼滅储鍖哄煙 --> + <view class="search-filter-section"> + <view class="search-bar"> + <view class="search-input"> + <input + class="search-text" + placeholder="璇疯緭鍏ヨ澶囧悕绉�" + v-model="searchKeyword" + confirm-type="search" + @confirm="getList" + /> + </view> + <view class="filter-button" @click="getList"> + <up-icon name="search" size="24" color="#999"></up-icon> + </view> + </view> + </view> + + <!-- 璁惧鎶ヤ慨鍒楄〃 --> + <view class="repair-list" v-if="repairList.length > 0"> + <view v-for="(item, index) in repairList" :key="index"> + <view class="repair-item"> + <view class="item-header"> + <view class="item-left"> + <view class="document-icon"> + <up-icon name="file-text" size="16" color="#ffffff"></up-icon> + </view> + <text class="item-id">璁惧鍚嶇О锛歿{ item.deviceName }}</text> + </view> + <view class="status-tag"> + <van-tag v-if="item.status === 1" type="success">瀹岀粨</van-tag> + <van-tag v-if="item.status === 0" type="danger">寰呯淮淇�</van-tag> + </view> + </view> + <up-divider></up-divider> + + <view class="item-details"> + <view class="detail-row"> + <text class="detail-label">瑙勬牸鍨嬪彿</text> + <text class="detail-value">{{ item.deviceModel || '-' }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">鎶ヤ慨鏃ユ湡</text> + <text class="detail-value">{{ formatDate(item.repairTime) || '-' }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">鎶ヤ慨浜�</text> + <text class="detail-value">{{ item.repairName || '-' }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">鏁呴殰鐜拌薄</text> + <text class="detail-value">{{ item.remark || '-' }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">缁翠慨浜�</text> + <text class="detail-value">{{ item.maintenanceName || '-' }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">缁翠慨缁撴灉</text> + <text class="detail-value">{{ item.maintenanceResult || '-' }}</text> + </view> + <view class="detail-row"> + <text class="detail-label">缁翠慨鏃ユ湡</text> + <text class="detail-value">{{ formatDate(item.maintenanceTime) || '-' }}</text> + </view> + </view> + + <!-- 鎸夐挳鍖哄煙 --> + <view class="action-buttons"> + <van-button + type="primary" + size="small" + class="action-btn" + @click="edit(item.id)" + > + 缂栬緫 + </van-button> + <van-button + type="warning" + size="small" + class="action-btn" + :disabled="item.status === 1" + @click="addMaintain(item.id)" + > + 鏂板缁翠慨 + </van-button> + <van-button + type="danger" + size="small" + plain + class="action-btn" + @click="delRepairByIds(item.id)" + > + 鍒犻櫎 + </van-button> + </view> + </view> + </view> + </view> + + <view v-else class="no-data"> + <text>鏆傛棤璁惧鎶ヤ慨鏁版嵁</text> + </view> + + <!-- 娴姩姘旀场鎸夐挳 --> + <van-floating-bubble + axis="xy" + icon="plus" + @click="addRepair" + /> + </view> +</template> + +<script setup> +import { ref, onMounted } from 'vue' +import { onShow } from '@dcloudio/uni-app' +import PageHeader from '@/components/PageHeader.vue' +import { getRepairPage, delRepair } from '@/api/equipmentManagement/repair' +import useUserStore from "@/store/modules/user" +import { showToast } from 'vant'; + +const userStore = useUserStore() + +// 鎼滅储鍏抽敭璇� +const searchKeyword = ref('') + +// 璁惧鎶ヤ慨鏁版嵁 +const repairList = ref([]) + +// 杩斿洖涓婁竴椤� +const goBack = () => { + uni.navigateBack() +} + +// 鏍煎紡鍖栨棩鏈� +const formatDate = (dateStr) => { + if (!dateStr) return '' + const date = new Date(dateStr) + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` +} + +// 鏌ヨ鍒楄〃 +const getList = () => { + const params = { + current: -1, + size: -1, + deviceName: searchKeyword.value || undefined + } + getRepairPage(params) + .then((res) => { + repairList.value = res.records || res.data?.records || [] + }) + .catch(() => { + showToast('鑾峰彇鏁版嵁澶辫触') + }) +} + +// 鏂板缁翠慨 - 璺宠浆鍒扮淮淇〉闈� +const addMaintain = (id) => { + if (!id) { + showToast('鍙傛暟閿欒') + return + } + uni.navigateTo({ + url: `/pages/equipmentManagement/repair/maintain?id=${id}` + }) +} + +// 鏂板鎶ヤ慨 - 璺宠浆鍒版姤淇〉闈� +const addRepair = () => { + uni.navigateTo({ + url: '/pages/equipmentManagement/repair/add' + }) +} + +// 缂栬緫 - 璺宠浆鍒癮dd椤甸潰锛岄�氳繃id鍖哄垎鏂板杩樻槸缂栬緫 +const edit = (id) => { + if (!id) return + uni.navigateTo({ + url: `/pages/equipmentManagement/repair/add?id=${id}` + }) +} + +// 鍒犻櫎鎶ヤ慨鏁版嵁 +const delRepairByIds = async (ids) => { + uni.showModal({ + title: '璀﹀憡', + content: '纭鍒犻櫎鎶ヤ慨鏁版嵁, 姝ゆ搷浣滀笉鍙��?', + confirmText: '纭畾', + cancelText: '鍙栨秷', + success: async (res) => { + if (!res.confirm) return + try { + const response = await delRepair(ids) + if (response.code === 200) { + showToast('鍒犻櫎鎴愬姛') + getList() + } else { + showToast('鍒犻櫎澶辫触') + } + } catch (e) { + showToast('鍒犻櫎澶辫触') + } + } + }) +} + +onMounted(() => { + getList() +}) + +onShow(() => { + getList() +}) +</script> + +<style scoped lang="scss"> +.u-divider { + margin: 0 !important; +} + +.device-repair { + min-height: 100vh; + background: #f8f9fa; + position: relative; + padding-bottom: 80px; +} + +.search-filter-section { + padding: 10px 20px; + background: #ffffff; +} + +.search-bar { + display: flex; + align-items: center; + gap: 12px; +} + +.search-input { + flex: 1; + background: #f5f5f5; + border-radius: 24px; + padding: 10px 16px; + display: flex; + align-items: center; + gap: 8px; +} + +.search-text { + flex: 1; + font-size: 14px; + color: #333; + background: transparent; + border: none; + outline: none; +} + +.search-text::placeholder { + color: #999; +} + +.filter-button { + width: 40px; + height: 40px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; +} + +.repair-list { + padding: 20px; +} + +.repair-item { + background: #ffffff; + border-radius: 12px; + margin-bottom: 16px; + overflow: hidden; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); + padding: 0 16px; +} + +.item-header { + padding: 16px 0; + display: flex; + align-items: center; + justify-content: space-between; +} + +.item-left { + display: flex; + align-items: center; + gap: 8px; +} + +.document-icon { + width: 24px; + height: 24px; + background: #2979ff; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; +} + +.item-id { + font-size: 14px; + color: #333; + font-weight: 500; +} + +.status-tag { + display: flex; + align-items: center; +} + +.item-details { + padding: 16px 0; +} + +.detail-row { + display: flex; + align-items: flex-end; + justify-content: space-between; + margin-bottom: 8px; + + &:last-child { + margin-bottom: 0; + } +} + +.detail-label { + font-size: 12px; + color: #777777; + min-width: 60px; +} + +.detail-value { + font-size: 12px; + color: #000000; + text-align: right; + flex: 1; + margin-left: 16px; +} + +.detail-value.highlight { + color: #2979ff; + font-weight: 500; +} + +.no-data { + padding: 40px 0; + text-align: center; + color: #999; +} + +.action-buttons { + display: flex; + gap: 8px; + padding: 0 0 16px 0; + justify-content: space-between; +} + +.action-btn { + flex: 1; +} +</style> \ No newline at end of file diff --git a/src/pages/equipmentManagement/repair/maintain.vue b/src/pages/equipmentManagement/repair/maintain.vue new file mode 100644 index 0000000..64d08cb --- /dev/null +++ b/src/pages/equipmentManagement/repair/maintain.vue @@ -0,0 +1,267 @@ +<template> + <view class="repair-maintain"> + <!-- 浣跨敤閫氱敤椤甸潰澶撮儴缁勪欢 --> + <PageHeader title="鏂板缁翠慨" @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="form.maintenanceName" + label="缁翠慨浜�" + placeholder="璇疯緭鍏ョ淮淇汉" + :rules="formRules.maintenanceName" + required + clearable + /> + <van-field + v-model="form.maintenanceResult" + label="缁翠慨缁撴灉" + type="textarea" + rows="3" + placeholder="璇疯緭鍏ョ淮淇粨鏋�" + :rules="formRules.maintenanceResult" + required + clearable + maxlength="200" + show-word-limit + /> + <van-field + v-model="form.maintenanceTime" + label="缁翠慨鏃ユ湡" + placeholder="璇烽�夋嫨缁翠慨鏃ユ湡" + :rules="formRules.maintenanceTime" + required + readonly + @click="showDatePicker" + clearable + /> + </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="showDate" position="bottom"> + <van-date-picker + v-model="currentDate" + title="閫夋嫨鏃ユ湡" + @confirm="onDateConfirm" + @cancel="showDate = false" + /> + </van-popup> + </view> +</template> + +<script setup> +import { ref, onMounted } from 'vue'; +import { onShow } from '@dcloudio/uni-app'; +import PageHeader from '@/components/PageHeader.vue'; +import { addMaintain } from '@/api/equipmentManagement/repair'; +import useUserStore from "@/store/modules/user"; +import dayjs from "dayjs"; +import { showToast } from 'vant'; + +defineOptions({ + name: "璁惧缁翠慨琛ㄥ崟", +}); + +const userStore = useUserStore(); + +// 琛ㄥ崟寮曠敤 +const formRef = ref(null); +const loading = ref(false); +const showDate = ref(false); +const currentDate = ref([new Date().getFullYear(), new Date().getMonth() + 1, new Date().getDate()]); + +// 琛ㄥ崟楠岃瘉瑙勫垯 +const formRules = { + maintenanceName: [{ required: true, trigger: "blur", message: "璇疯緭鍏ョ淮淇汉" }], + maintenanceResult: [{ required: true, trigger: "blur", message: "璇疯緭鍏ョ淮淇粨鏋�" }], + maintenanceTime: [{ required: true, trigger: "change", message: "璇烽�夋嫨缁翠慨鏃ユ湡" }], +}; + +// 浣跨敤 ref 澹版槑琛ㄥ崟鏁版嵁 +const form = ref({ + maintenanceName: userStore.nickName || '', // 榛樿浣跨敤褰撳墠鐢ㄦ埛鏄电О + maintenanceResult: undefined, // 缁翠慨缁撴灉 + maintenanceTime: dayjs().format("YYYY-MM-DD"), // 缁翠慨鏃ユ湡锛堝彧鏄剧ず鏃ユ湡锛� +}); + +// 娓呴櫎琛ㄥ崟鏍¢獙鐘舵�� +const clearValidate = () => { + // Vant4涓笉闇�瑕佹墜鍔ㄦ竻闄ら獙璇佺姸鎬侊紝閲嶇疆琛ㄥ崟鏃朵細鑷姩娓呴櫎 + // formRef.value?.clearValidate(); // 鍒犻櫎杩欒 +}; + +// 閲嶇疆琛ㄥ崟鏁版嵁鍜屾牎楠岀姸鎬� +const resetForm = () => { + form.value = { + maintenanceName: userStore.nickName || '', + maintenanceResult: undefined, + maintenanceTime: dayjs().format("YYYY-MM-DD"), + }; +}; + +const resetFormAndValidate = () => { + resetForm(); + // clearValidate(); // 鍒犻櫎杩欒锛孷ant4浼氳嚜鍔ㄥ鐞� +}; + +// 鎻愪氦琛ㄥ崟 +const sendForm = async () => { + try { + // 浣跨敤Vant4鐨勬纭獙璇佹柟寮� + formRef.value?.validate().then(() => { + // 楠岃瘉閫氳繃 + submitFormData(); + }).catch((errors) => { + // 楠岃瘉澶辫触 + showToast('璇峰~鍐欏畬鏁翠俊鎭�'); + }); + } catch (e) { + showToast('琛ㄥ崟楠岃瘉澶辫触'); + } +}; + +// 鎻愪氦琛ㄥ崟鏁版嵁 +const submitFormData = async () => { + try { + loading.value = true; + const id = getPageId(); + + if (!id) { + showToast('鍙傛暟閿欒'); + loading.value = false; + return; + } + + // 鍑嗗鎻愪氦鏁版嵁锛宮aintenanceTime 鍔犱笂褰撳墠鏃跺垎绉� + const submitData = { ...form.value }; + if (submitData.maintenanceTime && !submitData.maintenanceTime.includes(':')) { + // 濡傛灉 maintenanceTime 鍙寘鍚棩鏈燂紝娣诲姞褰撳墠鏃跺垎绉� + submitData.maintenanceTime = submitData.maintenanceTime + ' ' + dayjs().format('HH:mm:ss'); + } + + const { code } = await addMaintain({ id: id, ...submitData }); + + if (code == 200) { + showToast('鏂板缁翠慨鎴愬姛'); + resetFormAndValidate(); + setTimeout(() => { + uni.navigateBack(); + }, 1500); + } else { + loading.value = false; + } + } catch (e) { + loading.value = false; + showToast('鎿嶄綔澶辫触'); + } +}; + +// 杩斿洖涓婁竴椤� +const goBack = () => { + uni.navigateBack(); +}; + +// 鑾峰彇椤甸潰ID +const getPageId = () => { + const pages = getCurrentPages(); + const currentPage = pages[pages.length - 1]; + const options = currentPage.options; + return options.id; +}; + +// 鏄剧ず鏃ユ湡閫夋嫨鍣� +const showDatePicker = () => { + showDate.value = true; +}; + +// 纭鏃ユ湡閫夋嫨 +const onDateConfirm = ({ selectedValues }) => { + // 鍙繚瀛樺勾鏈堟棩锛屼笉鍖呭惈鏃跺垎绉� + form.value.maintenanceTime = selectedValues.join('-'); + currentDate.value = selectedValues; + showDate.value = false; +}; + +// 鍒濆鍖栬〃鍗曟暟鎹� +const initForm = () => { + // 璁剧疆缁翠慨浜轰负褰撳墠鐢ㄦ埛鏄电О + form.value.maintenanceName = userStore.nickName || ''; + // 璁剧疆褰撳墠鏃ユ湡锛堝彧鍖呭惈骞存湀鏃ワ級 + form.value.maintenanceTime = dayjs().format('YYYY-MM-DD'); + currentDate.value = [new Date().getFullYear(), new Date().getMonth() + 1, new Date().getDate()]; +}; + +onShow(() => { + // 椤甸潰鏄剧ず鏃跺垵濮嬪寲琛ㄥ崟 + initForm(); +}); + +onMounted(() => { + // 椤甸潰鍔犺浇鏃跺垵濮嬪寲琛ㄥ崟 + initForm(); +}); +</script> + +<style scoped lang="scss"> +.repair-maintain { + 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; +} +</style> \ No newline at end of file diff --git a/src/pages/index.vue b/src/pages/index.vue index b15d3bd..451f561 100644 --- a/src/pages/index.vue +++ b/src/pages/index.vue @@ -365,6 +365,11 @@ url: '/pages/equipmentManagement/ledger/index' }); break; + case '璁惧鎶ヤ慨': + uni.navigateTo({ + url: '/pages/equipmentManagement/repair/index' + }); + break; default: uni.showToast({ title: `鐐瑰嚮浜�${item.label}`, -- Gitblit v1.9.3