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;