From 40ff5283d1095971188a1454d0277df5011e5c7a Mon Sep 17 00:00:00 2001 From: hongchao <3228015117@qq.com> Date: Thu, 6 Nov 2025 17:22:45 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=93=E7=AE=97=E5=85=A8=E9=83=A8=E6=89=93?= =?UTF-8?q?=E5=8D=B0=EF=BC=8C=E6=9C=AA=E7=BB=93=E7=AE=97=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?zip=E5=AF=BC=E5=87=BA=EF=BC=8C=E7=9B=98=E7=82=B9=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E7=BC=96=E5=8F=B7=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/request.js | 66 ++++++++++++++----- .../material/cost/component/applyDetail.vue | 32 +++++++-- .../material/cost/component/unreportHome.vue | 1 + .../lease/apply/component/addToolsApply.vue | 2 +- src/views/material/wareHouse/index.vue | 51 +++++++------- 5 files changed, 100 insertions(+), 52 deletions(-) diff --git a/src/utils/request.js b/src/utils/request.js index 6ae46169..42269568 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -228,27 +228,49 @@ export function downloadJson(url, params, filename, config) { // 通用下载方法 export function downloadZip(url, params, filename, config) { - downloadLoadingInstance = Loading.service({ - text: '正在下载数据,请稍候', - spinner: 'el-icon-loading', - background: 'rgba(0, 0, 0, 0.7)', - }) - return service - .post(url, params, { - transformRequest: [ - (params) => { - return params - }, - ], - headers: { 'Content-Type': 'application/json',encryptResponse: false }, - responseType: 'blob', - ...config, + const backgroundMode = config && config.background === true + const showLoading = !(config && config.showLoading === false) && !backgroundMode + const finalAxiosConfig = { + transformRequest: [ + (params) => { + return params + }, + ], + headers: { 'Content-Type': 'application/json', encryptResponse: false }, + responseType: 'blob', + // if background mode and no explicit timeout, extend to 10 minutes + timeout: backgroundMode && !(config && typeof config.timeout === 'number') ? 600000 : undefined, + ...config, + } + + if (showLoading) { + downloadLoadingInstance = Loading.service({ + text: '正在下载数据,请稍候', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)', }) + } else if (backgroundMode) { + Notification.info({ + title: '已开始生成', + message: '批量导出任务已在后台执行,准备就绪后将自动下载。', + duration: 4000, + }) + } + + return service + .post(url, params, finalAxiosConfig) .then(async (data) => { const isBlob = blobValidate(data) if (isBlob) { const blob = new Blob([data]) saveAs(blob, filename) + if (backgroundMode) { + Notification.success({ + title: '导出完成', + message: 'ZIP 文件已准备好,正在开始下载。', + duration: 3000, + }) + } } else { const resText = await data.text() const rspObj = JSON.parse(resText) @@ -256,12 +278,20 @@ export function downloadZip(url, params, filename, config) { errorCode[rspObj.code] || rspObj.msg || errorCode['default'] Message.error(errMsg) } - downloadLoadingInstance.close() + if (showLoading && downloadLoadingInstance) { + downloadLoadingInstance.close() + } }) .catch((r) => { console.error(r) - Message.error('下载文件出现错误,请联系管理员!') - downloadLoadingInstance.close() + if (r && r.message && r.message.includes('timeout')) { + Message.error('导出超时,请减少选择数量或稍后重试') + } else { + Message.error('下载文件出现错误,请联系管理员!') + } + if (showLoading && downloadLoadingInstance) { + downloadLoadingInstance.close() + } }) } export default service diff --git a/src/views/material/cost/component/applyDetail.vue b/src/views/material/cost/component/applyDetail.vue index f668107e..9aa050ee 100644 --- a/src/views/material/cost/component/applyDetail.vue +++ b/src/views/material/cost/component/applyDetail.vue @@ -145,10 +145,10 @@ - - + + + - @@ -178,10 +178,10 @@
- - + + + - @@ -834,7 +834,25 @@ export default { }, methods: { handlePrint() { - this.$refs.remarksPrintRef.print() + // 移除滚动容器的样式,确保所有数据显示 + const tableBodies = document.querySelectorAll('.table-body'); + tableBodies.forEach(body => { + body.style.maxHeight = 'none'; + body.style.overflow = 'visible'; + }); + + // 执行打印 + this.$nextTick(() => { + this.$refs.remarksPrintRef.print(); + + // 打印完成后恢复样式 + setTimeout(() => { + tableBodies.forEach(body => { + body.style.maxHeight = '400px'; + body.style.overflow = 'auto'; + }); + }, 100); + }); }, // 初始化数据 - 统一处理数据解析和API调用 initData() { diff --git a/src/views/material/cost/component/unreportHome.vue b/src/views/material/cost/component/unreportHome.vue index 9bc7e99d..a62284ac 100644 --- a/src/views/material/cost/component/unreportHome.vue +++ b/src/views/material/cost/component/unreportHome.vue @@ -807,6 +807,7 @@ export default { 'material/slt_agreement_info/exportUnsettled', JSON.stringify(param), `未结算批量明细导出_${new Date().getTime()}.zip`, + { background: true, showLoading: false, timeout: 600000 } ) this.$refs.tableRef.clearSelection() diff --git a/src/views/material/lease/apply/component/addToolsApply.vue b/src/views/material/lease/apply/component/addToolsApply.vue index 5f6a2bb9..72f1e9e0 100644 --- a/src/views/material/lease/apply/component/addToolsApply.vue +++ b/src/views/material/lease/apply/component/addToolsApply.vue @@ -438,7 +438,7 @@ export default { }, ], phone: [ - { required: false, message: "联系电话不能为空", trigger: "blur" }, + { required: true, message: "联系电话不能为空", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", diff --git a/src/views/material/wareHouse/index.vue b/src/views/material/wareHouse/index.vue index 0f80229c..7f32ea1e 100644 --- a/src/views/material/wareHouse/index.vue +++ b/src/views/material/wareHouse/index.vue @@ -991,8 +991,8 @@ export default { trigger: 'blur', }, { - pattern: /^[1-9][0-9]*$/, - message: '请输入大于0且不能以0开头的正整数', + pattern: /^[0-9]+[1-9][0-9]*$|^[1-9][0-9]*$|^0+[1-9][0-9]*$/, + message: '请输入有效的数字串(不能只输入0)', }, ], putInType: [ @@ -1137,22 +1137,25 @@ export default { } else { // 根据this.codeForm.num的数量, 往this.codeTableList中添加this.codeForm的数据 for (let i = 0; i < this.codeForm.num; i++) { - // 设备编码: 前缀 拼接 后缀 - let suffix = parseInt(this.codeForm.codeSuffixStart) + i - if (suffix > parseInt(this.codeForm.codeSuffixEnd)) { - suffix = parseInt(this.codeForm.codeSuffixEnd) + // 保留原始格式的前缀长度 + const prefixLength = this.codeForm.codeSuffixStart?.length || 1 + // 计算当前序号,保留原始数字值 + const originalNum = parseInt(this.codeForm.codeSuffixStart) + const currentNum = originalNum + i + + // 格式化序号,保持用户输入的位数 + let suffix = currentNum.toString().padStart(prefixLength, '0') + + // 确保不超过结束值 + if (this.codeForm.codeSuffixEnd) { + const endNum = parseInt(this.codeForm.codeSuffixEnd) + if (currentNum > endNum) { + suffix = endNum.toString().padStart(prefixLength, '0') + } } - suffix = suffix - .toString() - .padStart( - this.codeForm.codeSuffixStart?.length, - '0', - ) - // console.log('🚀 ~ fillCodeForm ~ suffix:', suffix); - suffix = isNaN(suffix) ? '' : suffix - const maCode = `${ - this.codeForm.codePrefix || '' - }${suffix}` + + // 生成设备编码 + const maCode = `${this.codeForm.codePrefix || ''}${suffix}` // 出厂编码 const outFacCode = '' // 生产厂家 @@ -1169,7 +1172,7 @@ export default { // 单价: codeForm.buyPrice const buyPrice = this.codeForm.buyPrice || 0 this.codeTableList.push({ - maCode: this.codeForm.codeSuffixStart * 1 + i, + maCode: maCode, outFacCode, maVender, thisCheckTime, @@ -1198,16 +1201,12 @@ export default { changeSuffixStart(num) { if (isNaN(num)) { this.$message.error('后缀范围请输入数字类型') - this.codeForm.codeSuffixStart = - this.codeForm.codeSuffixStart.replace(/[^\d]/g, '') - } - if ( - isNaN(this.codeForm.codeSuffixStart) || - this.codeForm.codeSuffixStart.includes('.') - ) { - this.$message.error('后缀范围请输入整数类型') this.codeForm.codeSuffixStart = '' } + // 只保留数字字符,允许前导零 + if (num) { + this.codeForm.codeSuffixStart = num.replace(/[^\d]/g, '') + } }, changeSuffixEnd() { if (!this.codeForm.codeSuffixStart) {