| src/api/basicData/storageAttachment.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/equipmentManagement/upkeep/add.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/equipmentManagement/upkeep/fileList.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/equipmentManagement/upkeep/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/equipmentManagement/upkeep/maintain.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/inspectionUpload/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/basicData/storageAttachment.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ // é件页颿¥å£ import request from '@/utils/request' // éä»¶æ¥è¯¢ export function attachmentList(query) { return request({ url: '/storageAttachment/list', method: 'get', params: query }) } // éä»¶æ°å¢ export function createAttachment(data) { return request({ url: '/storageAttachment/add', method: 'post', data }) } // éä»¶å é¤ export function deleteAttachment(data) { return request({ url: '/storageAttachment/delete', method: 'delete', data }) } src/pages/equipmentManagement/upkeep/add.vue
@@ -60,6 +60,11 @@ placeholder="请è¾å ¥ä¿å »é¡¹ç®" clearable /> </u-form-item> <u-form-item label="éä»¶å¾ç" prop="storageBlobDTOs" border-bottom> <CommonUpload v-model="form.storageBlobDTOs" /> </u-form-item> <!-- æäº¤æé® --> <view class="footer-btns"> <u-button class="cancel-btn" @@ -87,6 +92,7 @@ import { ref, computed, onMounted, onUnmounted } from "vue"; import { onShow } from "@dcloudio/uni-app"; import PageHeader from "@/components/PageHeader.vue"; import CommonUpload from "@/components/CommonUpload.vue"; import { getDeviceLedger } from "@/api/equipmentManagement/ledger"; import { addUpkeep, @@ -152,6 +158,7 @@ maintenancePlanTime: dayjs().format("YYYY-MM-DD"), // 计åä¿å »æ¥æ maintenancePerson: undefined, // ä¿å »äºº machineryCategory: undefined, // ä¿å »é¡¹ç® storageBlobDTOs: [], // éä»¶å¾ç }); // å 载设å¤å表 @@ -178,6 +185,7 @@ ); form.value.maintenancePerson = data.maintenancePerson; form.value.machineryCategory = data.machineryCategory; form.value.storageBlobDTOs = data.storageBlobVOs || []; // 设置设å¤åç§°æ¾ç¤º const device = deviceOptions.value.find( item => item.id === data.deviceLedgerId @@ -197,6 +205,8 @@ // æ«æäºç»´ç åè½ const startScan = () => { processScanResult(""); return; if (isScanning.value) { showToast("æ£å¨æ«æä¸ï¼è¯·ç¨å..."); return; @@ -241,7 +251,7 @@ // å¤çæ«ç ç»æå¹¶å¹é è®¾å¤ const processScanResult = scanResult => { const deviceId = getDeviceIdByRegExp(scanResult); const matchedDevice = deviceOptions.value.find(item => item.id == deviceId); const matchedDevice = deviceOptions.value.find(item => item.id == 4); if (matchedDevice) { // æ¾å°å¹é ç设å¤ï¼èªå¨å¡«å @@ -314,7 +324,8 @@ const id = getPageId(); // åå¤æäº¤æ°æ® const submitData = { ...form.value }; const submitData = { ...form.value, status: 0 }; // ç¡®ä¿æ¥ææ ¼å¼æ£ç¡® if ( submitData.maintenancePlanTime && src/pages/equipmentManagement/upkeep/fileList.vue
@@ -8,7 +8,7 @@ <view v-if="fileList.length > 0" class="file-list"> <view v-for="(file, index) in fileList" :key="file.id || index" :key="file.storageAttachmentId || file.id || index" class="file-item"> <!-- æä»¶å¾æ --> <!-- <view class="file-icon" @@ -19,7 +19,7 @@ </view> --> <!-- æä»¶ä¿¡æ¯ --> <view class="file-info"> <text class="file-name">{{ file.name }}</text> <text class="file-name">{{ file.originalFilename || file.name }}</text> <!-- <text class="file-meta">{{ formatFileSize(file.fileSize) }} · {{ file.uploadTime || file.createTime }}</text> --> </view> <!-- æä½æé® --> @@ -65,15 +65,16 @@ <script setup> import { ref, onMounted } from "vue"; import { onLoad } from "@dcloudio/uni-app"; import PageHeader from "@/components/PageHeader.vue"; import config from "@/config"; import { getToken } from "@/utils/auth"; // import { saveAs } from "file-saver"; import { listMaintenanceTaskFiles, addMaintenanceTaskFile, delMaintenanceTaskFile, } from "@/api/equipmentManagement/upkeep"; attachmentList, createAttachment, deleteAttachment, } from "@/api/basicData/storageAttachment"; import { blobValidate } from "@/utils/ruoyi"; // éä»¶å表 @@ -214,21 +215,27 @@ // const fileType = fileName.split(".").pop(); // 3. æé ä¿åæä»¶ä¿¡æ¯çåæ° const saveData = { name: fileName, deviceMaintenanceId: upkeepId.value, url: res.data.tempPath || "", application: "file", recordType: recordType.value, recordId: upkeepId.value, storageBlobDTOs: [ { name: fileName, url: res.data.url || res.data.previewURL || res.data.tempPath || "", ...res.data, }, ], }; console.log(saveData, "ä¿åæä»¶ä¿¡æ¯åæ°"); // 4. è°ç¨ addRuleFile æ¥å£ä¿åæä»¶ä¿¡æ¯ addMaintenanceTaskFile(saveData) // 4. è°ç¨ createAttachment æ¥å£ä¿åæä»¶ä¿¡æ¯ createAttachment(saveData) .then(addRes => { if (addRes.code === 200) { // 5. æ·»å å°æä»¶å表 const newFile = { ...addRes.data, uploadTime: new Date().toLocaleString(), }; // fileList.value.push(newFile); // 5. å·æ°å表 getFileList(); showToast("ä¸ä¼ æå"); } else { @@ -257,20 +264,32 @@ }; // ä¸è½½æä»¶ const downloadFile = file => { var url = config.baseUrl + "/common/download?fileName=" + encodeURIComponent(file.url) + "&delete=true"; console.log(url, "url"); let url = file.downloadURL || file.previewURL || file.url; if (!url) { showToast("æä»¶å°åæ æ"); return; } // 妿䏿¯å®æ´çURLï¼åæ¼æ¥ if (!url.startsWith("http")) { url = config.baseUrl + "/common/download?fileName=" + encodeURIComponent(url) + "&delete=true"; } console.log(url, "ä¸è½½å°å"); uni.showLoading({ title: "æ£å¨ä¸è½½...", mask: true }); uni .downloadFile({ url: url, responseType: "blob", header: { Authorization: "Bearer " + getToken() }, }) .then(res => { uni.hideLoading(); let osType = uni.getStorageSync("deviceInfo").osName; let filePath = res.tempFilePath; if (osType === "ios") { @@ -280,7 +299,6 @@ success: res => {}, fail: err => { console.log("uni.openDocument--fail"); reject(err); }, }); } else { @@ -290,10 +308,8 @@ uni.showToast({ icon: "none", mask: true, title: "æä»¶å·²ä¿åï¼Android/data/uni.UNI720216F/apps/__UNI__720216F/" + fileRes.savedFilePath, //ä¿åè·¯å¾ duration: 3000, title: "æä»¶å·²ä¸è½½å¹¶å°è¯æå¼", duration: 2000, }); setTimeout(() => { //æå¼ææ¡£æ¥ç @@ -305,24 +321,12 @@ }, fail: err => { console.log("uni.save--fail"); reject(err); }, }); } // const isBlob = blobValidate(res.data); // if (isBlob) { // const blob = new Blob([res.data], { type: "text/plain" }); // const url = URL.createObjectURL(blob); // const downloadLink = document.getElementById("downloadLink"); // downloadLink.href = url; // downloadLink.download = file.name; // downloadLink.click(); // showToast("ä¸è½½æå"); // } else { // showToast("ä¸è½½å¤±è´¥"); // } }) .catch(err => { uni.hideLoading(); console.error("ä¸è½½å¤±è´¥:", err); showToast("ä¸è½½å¤±è´¥"); }); @@ -335,7 +339,7 @@ content: `ç¡®å®è¦å é¤éä»¶ "${file.name}" åï¼`, success: res => { if (res.confirm) { deleteFile(file.id, index); deleteFile(file.storageAttachmentId || file.id, index); } }, }); @@ -348,7 +352,7 @@ mask: true, }); delMaintenanceTaskFile([fileId]) deleteAttachment([fileId]) .then(res => { uni.hideLoading(); if (res.code === 200) { @@ -372,37 +376,48 @@ icon: "none", }); }; const rulesRegulationsManagementId = ref(""); const upkeepId = ref(""); const recordType = ref(""); // 页é¢å è½½æ¶è·ååæ° onLoad(options => { if (options.recordId) { upkeepId.value = options.recordId; } else { upkeepId.value = uni.getStorageSync("upkeepId"); } if (options.recordType) { recordType.value = options.recordType; } else { recordType.value = "device_maintenance"; // é»è®¤å ¼å®¹ } getFileList(); }); // 页é¢å è½½æ¶ onMounted(() => { // ä» API è·åéä»¶å表 // 仿¬å°åå¨è·å rulesRegulationsManagementId rulesRegulationsManagementId.value = uni.getStorageSync( "rulesRegulationsManagement" ); upkeepId.value = uni.getStorageSync("upkeepId"); getFileList(); // getFileList(); // onLoad ä¸å·²ç»è°ç¨äº }); // è·åéä»¶å表 const getFileList = () => { if (!upkeepId.value) return; uni.showLoading({ title: "å è½½ä¸...", mask: true, }); listMaintenanceTaskFiles({ current: 1, size: 100, deviceMaintenanceId: upkeepId.value, rulesRegulationsManagementId: upkeepId.value, attachmentList({ recordType: recordType.value, recordId: upkeepId.value, }) .then(res => { uni.hideLoading(); if (res.code === 200) { fileList.value = res.data.records || []; fileList.value = res.data || []; } else { showToast("è·åéä»¶å表失败"); } src/pages/equipmentManagement/upkeep/index.vue
@@ -80,7 +80,8 @@ </view> <view class="detail-row"> <text class="detail-label">ä¿å »ç»æ</text> <view class="detail-value"> <text class="detail-value">{{ item.maintenanceResult || '-' }}</text> <!-- <view class="detail-value"> <u-tag v-if="item.maintenanceResult === 1" type="success" size="mini"> @@ -92,7 +93,7 @@ ç»´ä¿® </u-tag> <text v-if="item.maintenanceResult === undefined || item.maintenanceResult === null">-</text> </view> </view> --> </view> </view> <!-- æé®åºå --> @@ -206,10 +207,8 @@ }; // æ°å¢éä»¶ - 跳转å°éä»¶é¡µé¢ const addFile = id => { // ä½¿ç¨æ¬å°åå¨ä¼ éid uni.setStorageSync("upkeepId", id); uni.navigateTo({ url: "/pages/equipmentManagement/upkeep/fileList", url: `/pages/equipmentManagement/upkeep/fileList?recordId=${id}&recordType=device_maintenance`, }); }; src/pages/equipmentManagement/upkeep/maintain.vue
@@ -100,81 +100,9 @@ <!-- ä¸ä¼ éä»¶ --> <u-form-item v-if="form.status == '1'" label="ä¿å »éä»¶" prop="storageBlobDTOs" border-bottom> <view class="simple-upload-area"> <view class="upload-buttons"> <u-button type="primary" @click="chooseMedia('image')" :loading="uploading" :disabled="uploadFiles.length >= uploadConfig.limit" :customStyle="{ marginRight: '10px', flex: 1 }"> <u-icon name="camera" size="18" color="#fff" style="margin-right: 5px;"></u-icon> {{ uploading ? 'ä¸ä¼ ä¸...' : 'æç §' }} </u-button> <!-- <u-button type="success" @click="chooseMedia('video')" :loading="uploading" :disabled="uploadFiles.length >= uploadConfig.limit" :customStyle="{ flex: 1 }"> <uni-icons type="videocam" name="videocam" size="18" color="#fff" style="margin-right: 5px;"></uni-icons> {{ uploading ? 'ä¸ä¼ ä¸...' : 'æè§é¢' }} </u-button> --> </view> <!-- ä¸ä¼ è¿åº¦ --> <view v-if="uploading" class="upload-progress"> <u-line-progress :percentage="uploadProgress" :showText="true" activeColor="#409eff"></u-line-progress> </view> <!-- ä¸ä¼ çæä»¶å表 --> <view v-if="uploadFiles.length > 0" class="file-list"> <view v-for="(file, index) in uploadFiles" :key="index" class="file-item"> <view class="file-preview-container"> <!-- {{formatFileUrl(file.url)}} --> <image v-if="file.type === 'image' || isImageFile(file)" :src="formatFileUrl(file.url || file.tempFilePath || file.path || file.downloadUrl)" class="file-preview" mode="aspectFill" /> <view v-else-if="file.type === 'video'" class="video-preview"> <uni-icons type="videocam" name="videocam" size="18" color="#fff" style="margin-right: 5px;"></uni-icons> <text class="video-text">è§é¢</text> </view> <!-- å é¤æé® --> <view class="delete-btn" @click="removeFile(index)"> <u-icon name="close" size="12" color="#fff"></u-icon> </view> </view> <view class="file-info"> <text class="file-name">{{ file.bucketFilename || file.name || (file.type === 'image' ? 'å¾ç' : 'è§é¢') }}</text> <text class="file-size">{{ formatFileSize(file.size) }}</text> </view> </view> </view> <view v-if="uploadFiles.length === 0" class="empty-state"> <text>è¯·éæ©è¦ä¸ä¼ çä¿å »å¾ç</text> </view> </view> <CommonUpload v-model="form.storageBlobDTOs" /> </u-form-item> <!-- æäº¤æé® --> <view class="footer-btns"> @@ -235,6 +163,7 @@ import { ref, onMounted, reactive } from "vue"; import { onShow } from "@dcloudio/uni-app"; import PageHeader from "@/components/PageHeader.vue"; import CommonUpload from "@/components/CommonUpload.vue"; import { addMaintenance } from "@/api/equipmentManagement/upkeep"; import { getSparePartsList } from "@/api/equipmentManagement/repair"; import useUserStore from "@/store/modules/user"; @@ -275,7 +204,6 @@ const sparePartsQtyRaw = ref(""); // æä»¶ä¸ä¼ ç¸å ³ const uploadFiles = ref([]); const uploading = ref(false); const uploadProgress = ref(0); const number = ref(0); @@ -316,6 +244,7 @@ maintenanceResult: undefined, // ä¿å »ç»æ maintenanceActuallyTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // å®é ä¿å »æ¥æï¼åªæ¾ç¤ºæ¥æï¼ sparePartsIds: undefined, // 设å¤å¤ä»¶ID storageBlobDTOs: [], // ä¿å »éä»¶ }); // æ¸ é¤è¡¨åæ ¡éªç¶æ @@ -330,6 +259,7 @@ maintenanceResult: undefined, maintenanceActuallyTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), sparePartsIds: [], storageBlobDTOs: [], }; maintenancestatusText.value = ""; selectedSpareParts.value = []; @@ -374,7 +304,11 @@ } else if (form.value.maintenanceResult === undefined) { isValid = false; errorMessage = "è¯·éæ©ä¿å »ç»æ"; } else if (uploadFiles.value.length === 0 && form.value.status == "1") { } else if ( (!form.value.storageBlobDTOs || form.value.storageBlobDTOs.length === 0) && form.value.status == "1" ) { isValid = false; errorMessage = "请ä¸ä¼ ä¿å »ç §ç"; } @@ -436,7 +370,6 @@ const submitData = { ...form.value, imagesFile: form.value.status == "1" ? uploadFiles.value : [], sparePartsIds: spareIds.length ? spareIds.join(",") : "", sparePartsQty: spareIds.length ? spareIds.map(pid => sparePartQtyMap?.[pid] ?? 1).join(",") @@ -605,7 +538,7 @@ // éç½®éæ©çå¤ä»¶ selectedSpareParts.value = []; // éç½®ä¸ä¼ çæä»¶ uploadFiles.value = []; form.value.storageBlobDTOs = []; uploading.value = false; uploadProgress.value = 0; maintenancestatusText.value = ""; @@ -655,8 +588,10 @@ sparePartsIds.value = itemData.sparePartsIds; // å¡«å éä»¶æ°æ® if (itemData.files && itemData.files.length > 0) { uploadFiles.value = itemData.files.map(file => ({ if (itemData.storageBlobVOs && itemData.storageBlobVOs.length > 0) { form.value.storageBlobDTOs = itemData.storageBlobVOs; } else if (itemData.files && itemData.files.length > 0) { form.value.storageBlobDTOs = itemData.files.map(file => ({ id: file.id, name: file.name || file.bucketFilename || file.originalFilename, url: file.url || file.downloadUrl, @@ -668,7 +603,7 @@ size: file.size || file.byteSize, })); } else if (itemData.uploadFiles && itemData.uploadFiles.length > 0) { uploadFiles.value = itemData.uploadFiles.map(file => ({ form.value.storageBlobDTOs = itemData.uploadFiles.map(file => ({ id: file.id, name: file.name || file.bucketFilename || file.originalFilename, url: file.url || file.downloadUrl || file.tempFilePath || file.path, src/pages/inspectionUpload/index.vue
@@ -84,7 +84,7 @@ size="small" type="primary" inverted></uni-tag> <uni-tag v-else="" <uni-tag v-else text="æªå·¡æ£" size="small" type="warning" @@ -494,8 +494,6 @@ icon: "error", }); }; </script> <style scoped>