| | |
| | | /** |
| | | * 采购申请导入组件 |
| | | * 功能:用于导入采购申请数据 |
| | | * 调用方式:通过事件 'importPurchaseApply' -> 'openImportPurchaseApplyModal' 触发 |
| | | */ |
| | | (function (vc) { |
| | | var $that = this; |
| | | vc.extends({ |
| | | data: { |
| | | importPurchaseApplyInfo: { |
| | |
| | | excelTemplate: '' |
| | | } |
| | | }, |
| | | /** |
| | | * 初始化事件 |
| | | * 功能:绑定事件监听器 |
| | | */ |
| | | _initEvent: function () { |
| | | vc.on('importPurchaseApply', 'openImportPurchaseApplyModal', function () { |
| | | $('#importPurchaseApplyModel').modal('show'); |
| | | $that.resetImportForm(); |
| | | }); |
| | | console.log('采购申请导入组件事件初始化'); |
| | | // 监听打开导入模态框事件 |
| | | vc.on('importPurchaseApply', 'openImportPurchaseApplyModal', |
| | | function () { |
| | | console.log('打开采购申请导入模态框'); |
| | | // 打开模态框前重置文件输入框和表单数据 |
| | | document.getElementById('excelTemplate').value = ''; |
| | | vc.component.importPurchaseApplyInfo.excelTemplate = ''; |
| | | console.log('重置文件输入框和表单数据'); |
| | | $('#importPurchaseApplyModel').modal('show'); |
| | | console.log('模态框已显示'); |
| | | }); |
| | | |
| | | // 监听模态框关闭事件,重置表单 |
| | | $('#importPurchaseApplyModel').on('hidden.bs.modal', function () { |
| | | $that.resetImportForm(); |
| | | $('#importPurchaseApplyModel').on('hidden.bs.modal', function (e) { |
| | | console.log('模态框关闭,重置表单'); |
| | | vc.component.resetImportForm(); |
| | | }); |
| | | }, |
| | | methods: { |
| | | /** |
| | | * 表单验证 |
| | | * 功能:验证导入表单数据 |
| | | * @returns {boolean} 验证是否通过 |
| | | */ |
| | | importPurchaseApplyValidate() { |
| | | return vc.validate.validate({ |
| | | importPurchaseApplyInfo: $that.importPurchaseApplyInfo |
| | | importPurchaseApplyInfo: vc.component.importPurchaseApplyInfo |
| | | }, { |
| | | 'importPurchaseApplyInfo.communityId': [{ |
| | | limit: "required", |
| | |
| | | }] |
| | | }); |
| | | }, |
| | | // 重置导入表单 |
| | | /** |
| | | * 重置导入表单 |
| | | * 功能:重置表单数据和文件输入框 |
| | | */ |
| | | resetImportForm() { |
| | | $that.importPurchaseApplyInfo = { |
| | | vc.component.importPurchaseApplyInfo = { |
| | | communityId: vc.getCurrentCommunity().communityId, |
| | | excelTemplate: '' |
| | | }; |
| | | // 重置文件输入框 |
| | | var fileInput = document.getElementById('excelTemplate'); |
| | | if (fileInput) { |
| | | fileInput.value = ''; |
| | | } |
| | | document.getElementById('excelTemplate').value = ''; |
| | | console.log('导入表单已重置'); |
| | | }, |
| | | /** |
| | | * 文件选择处理 |
| | | * 功能:处理文件选择事件,更新文件信息 |
| | | * @param {Event} e 文件选择事件 |
| | | */ |
| | | getExcelTemplate: function (e) { |
| | | if (e.target.files && e.target.files[0]) { |
| | | $that.importPurchaseApplyInfo.excelTemplate = e.target.files[0]; |
| | | console.log('选择的文件:', $that.importPurchaseApplyInfo.excelTemplate); |
| | | vc.component.importPurchaseApplyInfo.excelTemplate = e.target.files[0]; |
| | | console.log('选择的文件:', vc.component.importPurchaseApplyInfo.excelTemplate); |
| | | } else { |
| | | $that.importPurchaseApplyInfo.excelTemplate = ''; |
| | | vc.component.importPurchaseApplyInfo.excelTemplate = ''; |
| | | console.log('未选择文件'); |
| | | } |
| | | }, |
| | | /** |
| | | * 重置文件输入框 |
| | | * 功能:重置文件输入框,确保选择同一个文件时能触发change事件 |
| | | */ |
| | | resetFileInput() { |
| | | console.log('重置文件输入框'); |
| | | let fileInput = document.getElementById('excelTemplate'); |
| | | fileInput.value = ''; |
| | | fileInput.click(); |
| | | }, |
| | | /** |
| | | * 导入数据 |
| | | * 功能:执行采购申请数据导入 |
| | | */ |
| | | _importData: function () { |
| | | if (!$that.importPurchaseApplyValidate()) { |
| | | console.log('开始执行导入数据'); |
| | | // 验证表单 |
| | | if (!vc.component.importPurchaseApplyValidate()) { |
| | | console.log('验证失败:', vc.validate.errInfo); |
| | | vc.toast(vc.validate.errInfo); |
| | | return; |
| | | } |
| | | // 导入数据 |
| | | if (!$that.checkFileType($that.importPurchaseApplyInfo.excelTemplate.name.split('.')[1])) { |
| | | console.log('验证通过'); |
| | | |
| | | // 验证文件类型 |
| | | if (!vc.component.checkFileType(vc.component.importPurchaseApplyInfo.excelTemplate.name.split('.')[1])) { |
| | | console.log('文件类型验证失败'); |
| | | vc.toast('不是有效的Excel格式'); |
| | | return; |
| | | } |
| | | // 使用实际的userId,如果没有则使用默认值 |
| | | console.log('文件类型验证通过'); |
| | | |
| | | // 验证文件大小 |
| | | if (!vc.component.checkFileSize(vc.component.importPurchaseApplyInfo.excelTemplate.size)) { |
| | | console.log('文件大小验证失败'); |
| | | vc.toast('Excel文件大小不能超过20M'); |
| | | return; |
| | | } |
| | | console.log('文件大小验证通过'); |
| | | |
| | | // 获取用户ID,添加异常处理 |
| | | let userId = '-1'; |
| | | try { |
| | | // 尝试从不同来源获取userId |
| | | let userInfo = vc.getData('userInfo'); |
| | | if (userInfo && userInfo.userId) { |
| | | userId = userInfo.userId; |
| | | } else { |
| | | // 尝试从localStorage直接获取 |
| | | // 尝试从localStorage获取 |
| | | let localUserInfo = JSON.parse(window.localStorage.getItem('userInfo')); |
| | | if (localUserInfo && localUserInfo.userId) { |
| | | userId = localUserInfo.userId; |
| | |
| | | console.error('获取userId失败:', e); |
| | | } |
| | | console.log('使用的userId:', userId); |
| | | |
| | | // 构建表单数据,与房产导入保持一致 |
| | | var param = new FormData(); |
| | | param.append("uploadFile", $that.importPurchaseApplyInfo.excelTemplate); // 添加Excel文件 |
| | | param.append('communityId', $that.importPurchaseApplyInfo.communityId); // 添加小区ID |
| | | param.append('importAdapt', "importPurchaseApply"); // 指定使用的导入适配器 |
| | | param.append('userId', userId); // 添加userId参数 |
| | | param.append('USER-ID', userId); // 添加USER-ID参数(大写形式),与房产导入保持一致 |
| | | |
| | | // 上传文件并处理响应,与房产导入保持一致 |
| | | // 构建表单数据 |
| | | let param = new FormData(); |
| | | param.append("uploadFile", vc.component.importPurchaseApplyInfo.excelTemplate); |
| | | param.append('communityId', vc.getCurrentCommunity().communityId); |
| | | param.append('userId', userId); |
| | | param.append('USER-ID', userId); |
| | | param.append('importAdapt', "importPurchaseApply"); |
| | | |
| | | console.log('准备发送导入请求'); |
| | | // 发送文件上传请求 |
| | | vc.http.upload( |
| | | 'assetImport', // 模块名 |
| | | 'importData', // 方法名 |
| | | param, // 参数 |
| | | { |
| | | // 移除emulateJSON,避免与Content-Type冲突 |
| | | 'assetImport', |
| | | 'importData', |
| | | param, { |
| | | headers: { |
| | | "Content-Type": "multipart/form-data" |
| | | } |
| | | }, |
| | | function(json, res) { |
| | | // 成功回调 |
| | | console.log('导入请求成功响应:', json); // 打印完整的响应数据到console |
| | | function (json, res) { |
| | | console.log('导入请求成功响应:', json); |
| | | let _json = JSON.parse(json); |
| | | console.log('解析后的响应数据:', _json); // 打印解析后的响应数据到console |
| | | console.log('解析后的响应数据:', _json); |
| | | if (_json.code == 0) { |
| | | // 导入成功 |
| | | vc.toast("处理成功"); |
| | | console.log('导入成功,logId:', _json.data.logId); // 打印logId到console |
| | | $('#importPurchaseApplyModel').modal('hide'); // 关闭模态框 |
| | | console.log('导入成功,logId:', _json.data.logId); |
| | | $('#importPurchaseApplyModel').modal('hide'); |
| | | // 跳转到导入日志详情页面 |
| | | vc.jumpToPage('/#/pages/property/assetImportLogDetail?logId=' + _json.data.logId + '&logType=importPurchaseApply'); |
| | | return; |
| | | } |
| | | // 导入失败,显示错误信息 |
| | | console.log('导入失败,错误信息:', _json.msg); // 打印失败错误信息到console |
| | | // 确保错误信息有意义,避免显示"数据有误: null" |
| | | // 处理错误信息 |
| | | let errorMsg = _json.msg; |
| | | if (!errorMsg || errorMsg === null || errorMsg === undefined || errorMsg.includes('null') || errorMsg.includes('undefined')) { |
| | | errorMsg = '导入失败,请检查数据格式是否正确,或联系管理员查看详细日志'; |
| | | } |
| | | // 优化错误信息显示,替换不友好的后端错误 |
| | | if (errorMsg.includes('sheet 未找到') || errorMsg.includes('excel sheet')) { |
| | | errorMsg = '导入失败:未找到正确的sheet,请确保Excel文件中包含名称为"登记表"的sheet,且名称正确无空格'; |
| | | } |
| | | console.log('导入失败,错误信息:', errorMsg); |
| | | vc.toast(errorMsg, 10000); |
| | | }, |
| | | function(errInfo, error) { |
| | | // 失败回调 |
| | | console.log('请求失败处理,原始错误信息:', errInfo); // 打印原始错误信息到console |
| | | console.log('请求失败,错误对象:', error); // 打印完整的错误对象到console |
| | | // 确保错误信息有意义,避免显示"null"或空错误 |
| | | function (errInfo, error) { |
| | | console.log('请求失败处理,原始错误信息:', errInfo); |
| | | console.log('请求失败,错误对象:', error); |
| | | // 处理网络错误 |
| | | let errorMsg = errInfo; |
| | | if (!errorMsg || errorMsg === null || errorMsg === undefined || errorMsg.trim() === '') { |
| | | errorMsg = '导入失败,请检查文件格式或网络连接,或联系管理员'; |
| | | } |
| | | // 优化网络错误信息 |
| | | if (errorMsg.includes('SocketException') || errorMsg.includes('timeout') || errorMsg.includes('Network Error')) { |
| | | errorMsg = '导入失败:网络连接异常,请检查网络连接或稍后重试'; |
| | | } |
| | | console.log('最终显示的错误信息:', errorMsg); // 打印最终显示的错误信息到console |
| | | console.log('最终显示的错误信息:', errorMsg); |
| | | vc.toast(errorMsg, 10000); |
| | | // 关闭模态框 |
| | | $('#importPurchaseApplyModel').modal('hide'); |
| | | }); |
| | | }, |
| | | /** |
| | | * 检查文件类型 |
| | | * 功能:验证文件是否为Excel格式 |
| | | * @param {string} fileType 文件扩展名 |
| | | * @returns {boolean} 是否为有效Excel格式 |
| | | */ |
| | | checkFileType: function(fileType) { |
| | | const acceptTypes = ['xlsx', 'xls']; |
| | | for (var i = 0; i < acceptTypes.length; i++) { |
| | |
| | | } |
| | | } |
| | | return false; |
| | | }, |
| | | /** |
| | | * 检查文件大小 |
| | | * 功能:验证文件大小是否在限制范围内 |
| | | * @param {number} fileSize 文件大小(字节) |
| | | * @returns {boolean} 文件大小是否在限制范围内 |
| | | */ |
| | | checkFileSize: function(fileSize) { |
| | | const MAX_SIZE = 20 * 1024 * 1024; // 20MB |
| | | if (fileSize > MAX_SIZE) { |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | } |
| | | }); |
| | | console.log('采购申请导入组件注册完成'); |
| | | })(window.vc); |