From 826d9082adcf1be22d28c4b7c8221806520fba2a Mon Sep 17 00:00:00 2001 From: "zhonghua.li" Date: Wed, 15 Apr 2026 19:08:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A3=E5=9C=A8=E6=9C=8D=E5=8A=A1=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E8=AE=B0=E5=BD=95=EF=BC=8C=E5=8F=AF=E4=BB=A5=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E9=9F=B3=E9=A2=91=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceListFurniture.vue | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/pages-subpackage/furniture_reception/serviceListFurniture.vue b/pages-subpackage/furniture_reception/serviceListFurniture.vue index 9e256e6..0fb3543 100644 --- a/pages-subpackage/furniture_reception/serviceListFurniture.vue +++ b/pages-subpackage/furniture_reception/serviceListFurniture.vue @@ -55,6 +55,9 @@ 补录 + + {{ isUploading(item.id) ? '上传中' : '上传' }} + 结束 @@ -203,6 +206,7 @@ export default { // 补录相关 showSupplementModal: false, currentSupplementItem: null, + uploadingIds: [], supplementForm: { customerName: "", contact: "", @@ -459,6 +463,158 @@ export default { // 查看服务详情 console.log('查看服务详情', item); }, + isUploading(recordId) { + if (!recordId) return false; + return this.uploadingIds.includes(String(recordId)); + }, + async chooseAndUploadFile(item) { + if (!item || !item.id) { + uni.showToast({ + title: '无法获取服务记录ID', + icon: 'none' + }); + return; + } + if (this.isUploading(item.id)) { + return; + } + const selectedFile = await this.selectUploadFile(); + if (!selectedFile || !selectedFile.path) { + return; + } + await this.uploadFileForRecord(item, selectedFile); + }, + selectUploadFile() { + return new Promise((resolve) => { + const normalizeSelected = (res) => { + const tempFiles = Array.isArray(res?.tempFiles) ? res.tempFiles : []; + if (!tempFiles.length) return null; + const file = tempFiles[0] || {}; + const filePath = file.path || file.tempFilePath || file.url || ''; + const fileName = file.name || filePath.split('/').pop() || `service_file_${Date.now()}`; + if (!filePath) return null; + return { + path: filePath, + name: fileName + }; + }; + const onSuccess = (res) => { + const selected = normalizeSelected(res); + if (!selected) { + uni.showToast({ + title: '未选择有效文件', + icon: 'none' + }); + resolve(null); + return; + } + resolve(selected); + }; + const onFail = (err) => { + const errMsg = err?.errMsg || ''; + if (errMsg.includes('cancel')) { + resolve(null); + return; + } + console.error('选择文件失败:', err); + uni.showToast({ + title: '选择文件失败', + icon: 'none' + }); + resolve(null); + }; + if (typeof uni.chooseMessageFile === 'function') { + uni.chooseMessageFile({ + count: 1, + type: 'file', + success: onSuccess, + fail: onFail + }); + return; + } + if (typeof uni.chooseFile === 'function') { + uni.chooseFile({ + count: 1, + success: onSuccess, + fail: onFail + }); + return; + } + uni.chooseImage({ + count: 1, + success: onSuccess, + fail: onFail + }); + }); + }, + getAuthHeaders() { + let tenantId = ''; + let token = ''; + try { + tenantId = uni.getStorageSync('backend-tenant-id') || ''; + token = uni.getStorageSync('backend-token') || ''; + } catch (e) { + console.error('获取认证信息失败:', e); + } + const headers = {}; + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + if (tenantId) { + headers['X-Tenant-Id'] = tenantId; + } + return headers; + }, + async uploadFileForRecord(item, selectedFile) { + const recordId = String(item.id); + this.uploadingIds = [...this.uploadingIds, recordId]; + try { + uni.showLoading({ + title: '上传中...' + }); + const uploadRes = await uni.uploadFile({ + url: getApiUrl('/api/audioManagement/uploadBluetoothAudio'), + filePath: selectedFile.path, + name: 'file', + formData: { + id: item.id, + customerId: item.customerId || '', + customerName: item.customerName || '', + fileName: selectedFile.name || `service_file_${Date.now()}` + }, + header: this.getAuthHeaders(), + timeout: 60000 + }); + let result = {}; + try { + result = typeof uploadRes?.data === 'string' ? JSON.parse(uploadRes.data) : (uploadRes?.data || {}); + } catch (e) { + result = uploadRes?.data || {}; + } + if (uploadRes?.statusCode === 200 && result?.success !== false) { + uni.showToast({ + title: '上传成功', + icon: 'success' + }); + this.serviceStatusPage.current = 1; + this.fetchServiceStatusList({ force: true }); + return; + } + uni.showToast({ + title: result?.message || '上传失败', + icon: 'none' + }); + } catch (error) { + console.error('上传文件失败:', error); + uni.showToast({ + title: error?.errMsg || error?.message || '上传失败', + icon: 'none' + }); + } finally { + uni.hideLoading(); + this.uploadingIds = this.uploadingIds.filter(id => id !== recordId); + } + }, async finishService(item) { if (!item || !item.id) { uni.showToast({ @@ -1044,6 +1200,15 @@ export default { .service-action-btn--supplement:active { opacity: 0.7; } + + .service-action-btn--upload { + color: #7C3AED; + background-color: transparent; + } + + .service-action-btn--upload:active { + opacity: 0.7; + } .service-status-empty { padding: 48rpx 0;