src/pages.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/equipmentManagement/upkeep/add.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/equipmentManagement/upkeep/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/equipmentManagement/upkeep/maintain.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/pages/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/pages.json
@@ -328,6 +328,27 @@ "navigationStyle": "custom" } } { "path": "pages/equipmentManagement/upkeep/index", "style": { "navigationBarTitleText": "设å¤ä¿å »", "navigationStyle": "custom" } }, { "path": "pages/equipmentManagement/upkeep/add", "style": { "navigationBarTitleText": "æ°å¢ä¿å »è®¡å", "navigationStyle": "custom" } }, { "path": "pages/equipmentManagement/upkeep/maintain", "style": { "navigationBarTitleText": "ç»´ä¿®ä¿å »", "navigationStyle": "custom" } } ], "subPackages": [ { src/pages/equipmentManagement/upkeep/add.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,413 @@ <template> <view class="upkeep-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.maintenancePlanTime" label="计åä¿å »æ¥æ" placeholder="è¯·éæ©è®¡åä¿å »æ¥æ" :rules="formRules.maintenancePlanTime" 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="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 { addUpkeep, editUpkeep, getUpkeepById } from '@/api/equipmentManagement/upkeep'; 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: "è¯·éæ©è®¾å¤åç§°" }], maintenancePlanTime: [{ required: true, trigger: "change", message: "è¯·éæ©è®¡åä¿å »æ¥æ" }], }; // ä½¿ç¨ ref 声æè¡¨åæ°æ® const form = ref({ deviceLedgerId: undefined, // 设å¤ID deviceModel: undefined, // è§æ ¼åå· maintenancePlanTime: dayjs().format("YYYY-MM-DD"), // 计åä¿å »æ¥æ }); // 设å¤éæ©å¨å 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 getUpkeepById(id); if (code == 200) { form.value.deviceLedgerId = data.deviceLedgerId; form.value.deviceModel = data.deviceModel; form.value.maintenancePlanTime = dayjs(data.maintenancePlanTime).format("YYYY-MM-DD"); // 设置设å¤åç§°æ¾ç¤º 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, maintenancePlanTime: dayjs().format("YYYY-MM-DD"), }; deviceNameText.value = ''; }; const resetFormAndValidate = () => { resetForm(); clearValidate(); }; // æ«æäºç»´ç åè½ const startScan = () => { if (isScanning.value) { showToast('æ£å¨æ«æä¸ï¼è¯·ç¨å...'); return; } // è°ç¨uni-appçæ«ç API 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.maintenancePlanTime = 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 }; // ç¡®ä¿æ¥ææ ¼å¼æ£ç¡® if (submitData.maintenancePlanTime && !submitData.maintenancePlanTime.includes(':')) { submitData.maintenancePlanTime = submitData.maintenancePlanTime + ' 00:00:00'; } const { code } = id ? await editUpkeep({ id: id, ...submitData }) : await addUpkeep(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; // æ ¹æ®æ¯å¦æidåæ°æ¥å¤ææ¯æ°å¢è¿æ¯ç¼è¾ 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"> .upkeep-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> src/pages/equipmentManagement/upkeep/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,438 @@ <template> <view class="device-upkeep"> <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> <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="upkeep-list" v-if="upkeepList.length > 0"> <view v-for="(item, index) in upkeepList" :key="index"> <view class="upkeep-item" @click="toggleSelection(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.maintenancePlanTime) || '-' }}</text> </view> <view class="detail-row"> <text class="detail-label">å½å ¥äºº</text> <text class="detail-value">{{ item.createUserName || '-' }}</text> </view> <view class="detail-row"> <text class="detail-label">å½å ¥æ¥æ</text> <text class="detail-value">{{ formatDateTime(item.createTime) || '-' }}</text> </view> <view class="detail-row"> <text class="detail-label">å®é ä¿å »äºº</text> <text class="detail-value">{{ item.maintenanceActuallyName || '-' }}</text> </view> <view class="detail-row"> <text class="detail-label">å®é ä¿å »æ¥æ</text> <text class="detail-value">{{ formatDateTime(item.maintenanceActuallyTime) || '-' }}</text> </view> <view class="detail-row"> <text class="detail-label">ä¿å »ç»æ</text> <view class="detail-value"> <van-tag v-if="item.maintenanceResult === 1" type="success"> å®å¥½ </van-tag> <van-tag v-if="item.maintenanceResult === 0" type="danger"> ç»´ä¿® </van-tag> <text v-if="item.maintenanceResult === undefined || item.maintenanceResult === null">-</text> </view> </view> </view> <!-- æé®åºå --> <view class="action-buttons"> <van-button type="primary" size="small" class="action-btn" @click.stop="edit(item.id)" > ç¼è¾ </van-button> <van-button type="warning" size="small" class="action-btn" :disabled="item.status === 1" @click.stop="addMaintain(item.id)" > ä¿å » </van-button> <van-button type="danger" size="small" plain class="action-btn" @click.stop="delUpkeepByIds(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="addPlan" /> </view> </template> <script setup> import { ref, onMounted } from 'vue' import { onShow } from '@dcloudio/uni-app' import PageHeader from '@/components/PageHeader.vue' import { getUpkeepPage, delUpkeep } from '@/api/equipmentManagement/upkeep' import useUserStore from "@/store/modules/user" import { showToast } from 'vant'; import dayjs from "dayjs" const userStore = useUserStore() // æç´¢å ³é®è¯ const searchKeyword = ref('') // 设å¤ä¿å »æ°æ® const upkeepList = ref([]) // å¤éå表 const multipleList = ref([]) // è¿åä¸ä¸é¡µ const goBack = () => { uni.navigateBack() } // æ ¼å¼åæ¥æ const formatDate = (dateStr) => { if (!dateStr) return '' return dayjs(dateStr).format("YYYY-MM-DD") } // æ ¼å¼åæ¥ææ¶é´ const formatDateTime = (dateStr) => { if (!dateStr) return '' return dayjs(dateStr).format("YYYY-MM-DD HH:mm:ss") } // æ¥è¯¢å表 const getList = () => { const params = { current: -1, size: -1, deviceName: searchKeyword.value || undefined } getUpkeepPage(params) .then((res) => { // 妿res.data䏿¯æ°ç»ï¼è®¾ç½®ä¸ºç©ºæ°ç» upkeepList.value = res.records || res.data?.records || [] }) .catch(() => { showToast('è·åæ°æ®å¤±è´¥') }) } // åæ¢éæ©ç¶æ const toggleSelection = (item) => { const index = multipleList.value.findIndex(selected => selected.id === item.id) if (index > -1) { multipleList.value.splice(index, 1) } else { multipleList.value.push(item) } } // æ£æ¥æ¯å¦å·²éæ© const isSelected = (item) => { return multipleList.value.some(selected => selected.id === item.id) } // æ°å¢ä¿å » - 跳转å°ä¿å »é¡µé¢ const addMaintain = (id) => { if (!id && multipleList.value.length !== 1) { showToast('è¯·éæ©ä¸æ¡è®°å½') return } const targetId = id || multipleList.value[0].id uni.navigateTo({ url: `/pages/equipmentManagement/upkeep/maintain?id=${targetId}` }) } // æ°å¢è®¡å - è·³è½¬å°æ°å¢é¡µé¢ const addPlan = () => { uni.navigateTo({ url: '/pages/equipmentManagement/upkeep/add' }) } // ç¼è¾ - 跳转å°add页é¢ï¼éè¿idåºåæ°å¢è¿æ¯ç¼è¾ const edit = (id) => { if (!id) return uni.navigateTo({ url: `/pages/equipmentManagement/upkeep/add?id=${id}` }) } // å é¤ä¿å »æ°æ® const delUpkeepByIds = async (ids) => { const deleteIds = Array.isArray(ids) ? ids : [ids] if (deleteIds.length === 0) { showToast('è¯·éæ©è¦å é¤çè®°å½') return } uni.showModal({ title: 'è¦å', content: '确认å é¤ä¿å »æ°æ®, æ¤æä½ä¸å¯é?', confirmText: 'ç¡®å®', cancelText: 'åæ¶', success: async (res) => { if (!res.confirm) return try { // é个å é¤ for (const id of deleteIds) { const response = await delUpkeep(id) if (response.code !== 200) { showToast('å é¤å¤±è´¥') return } } showToast('å 餿å') multipleList.value = [] getList() } catch (e) { showToast('å é¤å¤±è´¥') } } }) } onMounted(() => { getList() }) onShow(() => { getList() }) </script> <style scoped lang="scss"> .u-divider { margin: 0 !important; } .device-upkeep { 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; } .action-section { padding: 10px 20px; background: #ffffff; border-bottom: 1px solid #f0f0f0; } .action-buttons { display: flex; gap: 8px; justify-content: flex-start; } .upkeep-list { padding: 20px; } .upkeep-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; } .checkbox-wrapper { display: flex; align-items: center; } .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: 80px; } .detail-value { font-size: 12px; color: #000000; text-align: right; flex: 1; margin-left: 16px; display: flex; justify-content: flex-end; align-items: center; } .detail-value.highlight { color: #2979ff; font-weight: 500; } .no-data { padding: 40px 0; text-align: center; color: #999; } .upkeep-item .action-buttons { display: flex; gap: 8px; padding: 0 0 16px 0; justify-content: space-between; } .action-btn { flex: 1; } </style> src/pages/equipmentManagement/upkeep/maintain.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,298 @@ <template> <view class="upkeep-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.maintenanceActuallyName" label="å®é ä¿å »äºº" placeholder="请è¾å ¥å®é ä¿å »äºº" :rules="formRules.maintenanceActuallyName" required clearable /> <van-field v-model="form.maintenanceActuallyTime" label="å®é ä¿å »æ¥æ" placeholder="è¯·éæ©å®é ä¿å »æ¥æ" :rules="formRules.maintenanceActuallyTime" required readonly @click="showDatePicker" clearable /> <van-field v-model="maintenanceResultText" label="ä¿å »ç»æ" placeholder="è¯·éæ©ä¿å »ç»æ" :rules="formRules.maintenanceResult" required readonly @click="showResultPicker" 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> <!-- ä¿å »ç»æéæ©å¨ --> <van-popup v-model:show="showResult" position="bottom"> <van-picker :model-value="resultPickerValue" :columns="resultColumns" @confirm="onResultConfirm" @cancel="showResult = 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 { addMaintenance } from '@/api/equipmentManagement/upkeep'; 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 showResult = ref(false); const currentDate = ref([new Date().getFullYear(), new Date().getMonth() + 1, new Date().getDate()]); const resultPickerValue = ref([]); const maintenanceResultText = ref(''); // ä¿å »ç»æé项 const resultColumns = [ { text: 'å®å¥½', value: 1 }, { text: 'ç»´ä¿®', value: 0 } ]; // 表åéªè¯è§å const formRules = { maintenanceActuallyName: [{ required: true, trigger: "blur", message: "请è¾å ¥å®é ä¿å »äºº" }], maintenanceActuallyTime: [{ required: true, trigger: "change", message: "è¯·éæ©å®é ä¿å »æ¥æ" }], maintenanceResult: [{ required: true, trigger: "change", message: "è¯·éæ©ä¿å »ç»æ" }], }; // ä½¿ç¨ ref 声æè¡¨åæ°æ® const form = ref({ maintenanceActuallyName: userStore.nickName || '', // é»è®¤ä½¿ç¨å½åç¨æ·æµç§° maintenanceResult: undefined, // ä¿å »ç»æ maintenanceActuallyTime: dayjs().format("YYYY-MM-DD"), // å®é ä¿å »æ¥æï¼åªæ¾ç¤ºæ¥æï¼ }); // æ¸ é¤è¡¨åæ ¡éªç¶æ const clearValidate = () => { // Vant4ä¸ä¸éè¦æå¨æ¸ é¤éªè¯ç¶æï¼éç½®è¡¨åæ¶ä¼èªå¨æ¸ é¤ // formRef.value?.clearValidate(); // å é¤è¿è¡ }; // éç½®è¡¨åæ°æ®åæ ¡éªç¶æ const resetForm = () => { form.value = { maintenanceActuallyName: userStore.nickName || '', maintenanceResult: undefined, maintenanceActuallyTime: dayjs().format("YYYY-MM-DD"), }; maintenanceResultText.value = ''; }; const resetFormAndValidate = () => { resetForm(); // clearValidate(); // å é¤è¿è¡ï¼Vant4ä¼èªå¨å¤ç }; // æäº¤è¡¨å 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; } // åå¤æäº¤æ°æ®ï¼maintenanceActuallyTime å ä¸å½åæ¶åç§ const submitData = { ...form.value }; if (submitData.maintenanceActuallyTime && !submitData.maintenanceActuallyTime.includes(':')) { // 妿 maintenanceActuallyTime åªå 嫿¥æï¼æ·»å å½åæ¶åç§ submitData.maintenanceActuallyTime = submitData.maintenanceActuallyTime + ' ' + dayjs().format('HH:mm:ss'); } const { code } = await addMaintenance({ 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.maintenanceActuallyTime = selectedValues.join('-'); currentDate.value = selectedValues; showDate.value = false; }; // æ¾ç¤ºä¿å »ç»æéæ©å¨ const showResultPicker = () => { showResult.value = true; }; // 确认ä¿å »ç»æéæ© const onResultConfirm = ({ selectedValues, selectedOptions }) => { form.value.maintenanceResult = selectedOptions[0].value; maintenanceResultText.value = selectedOptions[0].text; resultPickerValue.value = selectedValues; showResult.value = false; }; // åå§åè¡¨åæ°æ® const initForm = () => { // 设置ä¿å »äººä¸ºå½åç¨æ·æµç§° form.value.maintenanceActuallyName = userStore.nickName || ''; // 设置å½åæ¥æï¼åªå å«å¹´ææ¥ï¼ form.value.maintenanceActuallyTime = 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"> .upkeep-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> src/pages/index.vue
@@ -370,6 +370,11 @@ url: '/pages/equipmentManagement/repair/index' }); break; case '设å¤ä¿å »': uni.navigateTo({ url: '/pages/equipmentManagement/upkeep/index' }); break; default: uni.showToast({ title: `ç¹å»äº${item.label}`,