瀏覽代碼

fix: 优化压缩附件的功能逻辑

lanjianrong 3 年之前
父節點
當前提交
a5ee64b269

+ 11 - 3
app/controller/ledger_controller.js

@@ -1023,8 +1023,12 @@ module.exports = app => {
          * @param {Object} ctx - 全局上下文
          */
         async downloadZip(ctx) {
+            const responseData = {
+                err: 0,
+                msg: '',
+            };
             try {
-                const fileIds = JSON.parse(ctx.request.query.fileIds);
+                const { fileIds = [] } = JSON.parse(ctx.request.body.data);
                 const zipFilename = `${ctx.tender.data.name}-台账分解-附件.zip`;
                 const time = Date.now();
                 const zipPath = `app/public/upload/${ctx.tender.id}/ledger/fu_jian_zip${time}.zip`;
@@ -1052,8 +1056,12 @@ module.exports = app => {
                         fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
                     }
                 });
-            } catch (error) {
-                this.log(error);
+            } catch (err) {
+                this.log(err);
+                this.setMessage(err.toString(), this.messageType.ERROR);
+                responseData.err = 1;
+                responseData.msg = err.toString();
+                ctx.body = responseData;
             }
         }
     }

+ 43 - 0
app/public/js/global.js

@@ -365,6 +365,49 @@ const postDataWithFileProgress = function (url, formData, successCallback, error
     });
 }
 
+const postCompressFile = function (url, data, successCallback, errorCallBack) {
+  $.ajax({
+      type:"POST",
+      url: url,
+      data: {'data': JSON.stringify(data)},
+      // dataType: 'blob',
+      cache: false,
+      timeout: 60000,
+      xhrFields: {
+        responseType: 'blob'
+      },
+      beforeSend: function(xhr) {
+          let csrfToken = Cookies.get('csrfToken_j');
+          xhr.setRequestHeader('x-csrf-token', csrfToken);
+      },
+      success: function(result){
+          // if (result.err === 0) {
+          //     if (successCallback) {
+          //         successCallback(result.data);
+          //     }
+          // } else if (result.err === 2) {
+          //     toastr.error('error: ' + result.msg);
+          //     setTimeout(function () {
+          //         window.location.href = '/login';
+          //     },1000);
+          // } else {
+          //     toastr.error('error: ' + result.msg);
+          //     if (errorCallBack) {
+          //         errorCallBack(result.msg);
+          //     }
+          // }
+          if (successCallback) {
+            successCallback(result)
+          }
+      },
+      error: function(jqXHR, textStatus, errorThrown){
+          toastr.error('error: ' + textStatus + " " + errorThrown);
+          if (errorCallBack) {
+              errorCallBack();
+          }
+      }
+  });
+}
 /**
  * 获取url中参数
  * @param variable

+ 17 - 3
app/public/js/ledger.js

@@ -3649,11 +3649,25 @@ $(document).ready(function() {
           fileId && fileIds.push(fileId);
       });
 
+      
       if (fileIds.length) {
-          const url = `/tender/${tender.id}/ledger/compresse/file?fileIds=${JSON.stringify(fileIds)}`;
-          $('#zipDown').attr('href', url);
-          console.log(url);
+        if (fileIds.length > 8) {
+          return toastr.warning(`最大允许8个文件(当前${fileIds.length}个)`)
+        }
+        toastr.success('正在进行压缩文件......')
+        $(this).attr('disabled', "true")
+        const btn = $(this)
+        postCompressFile(`/tender/${tender.id}/ledger/compresse/file`, {fileIds}, function(result) {
+          toastr.success('压缩文件成功,即将开始下载')
+          btn.removeAttr('disabled')
+          console.log(btn);
+          const href = window.URL.createObjectURL(result)
+          $('#zipDown').attr('href', href);
+          $('#zipDown').attr('download', `${tender.name}-台账分解-附件.zip`);
           $("#zipDown")[0].click();
+        })
+          // const url = `/tender/${tender.id}/ledger/compresse/file?fileIds=${JSON.stringify(fileIds)}`;
+          // console.log(url);
       }
   });
 

+ 1 - 1
app/router.js

@@ -179,7 +179,7 @@ module.exports = app => {
     app.post('/tender/:id/ledger/delete/file', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.deleteFile');
     app.post('/tender/:id/ledger/save/file', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.saveFile');
     app.post('/tender/:id/ledger/check/file', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.checkFile');
-    app.get('/tender/:id/ledger/compresse/file', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.downloadZip');
+    app.post('/tender/:id/ledger/compresse/file', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerController.downloadZip');
 
     // 台账审批相关
     app.get('/tender/:id/ledger/audit', sessionAuth, tenderCheck, uncheckTenderCheck, 'ledgerAuditController.index');

+ 4 - 4
app/service/ledger_att.js

@@ -111,7 +111,7 @@ module.exports = app => {
                 const outputPath = fs.createWriteStream(path.resolve(this.app.baseDir, zipPath));
 
                 outputPath.on('error', err => {
-                    reject(err);
+                    return reject(err);
                 });
                 ziparchiver.pipe(outputPath);
                 files.forEach(item => {
@@ -123,19 +123,19 @@ module.exports = app => {
                     if (err.code === 'ENOENT') {
                         console.warn('stat故障和其他非阻塞错误');
                     }
-                    reject(err);
+                    return reject(err);
 
                 });
 
                 // 存档出错
                 ziparchiver.on('error', function(err) {
                     console.log(err);
-                    reject(err);
+                    return reject(err);
                 });
 
                 ziparchiver.finalize();
                 outputPath.on('close', () => {
-                    resolve(ziparchiver.pointer());
+                    return resolve(ziparchiver.pointer());
                 });
             });
         }

+ 4 - 4
app/service/stage_att.js

@@ -115,7 +115,7 @@ module.exports = app => {
                 const outputPath = fs.createWriteStream(path.resolve(this.app.baseDir, zipPath));
 
                 outputPath.on('error', err => {
-                    reject(err);
+                    return reject(err);
                 });
                 ziparchiver.pipe(outputPath);
                 files.forEach(item => {
@@ -127,19 +127,19 @@ module.exports = app => {
                     if (err.code === 'ENOENT') {
                         console.warn('stat故障和其他非阻塞错误');
                     }
-                    reject(err);
+                    return reject(err);
 
                 });
 
                 // 存档出错
                 ziparchiver.on('error', function(err) {
                     console.log(err);
-                    reject(err);
+                    return reject(err);
                 });
 
                 ziparchiver.finalize();
                 outputPath.on('close', () => {
-                    resolve(ziparchiver.pointer());
+                    return resolve(ziparchiver.pointer());
                 });
             });
         }

+ 1 - 1
app/view/ledger/explode.ejs

@@ -165,7 +165,7 @@
                                   <a class="nav-link" data-toggle="tab" href="#syfujian" role="tab" fujian-content="syfujian">所有附件</a>
                               </li>
                               <li class="nav-item ml-auto pt-1">
-                                  <a href="javascript:void(0);" id="bach-download" class="btn btn-sm btn-primary" type="curr">批量下载</a>
+                                  <button  id="bach-download" class="btn btn-sm btn-primary" type="curr">批量下载</button>
                                   <!--所有附件 翻页-->
                                   <span id="showPage" style="display: none"><a href="javascript:void(0);" class="page-select ml-3" content="pre"><i class="fa fa-chevron-left"></i></a> <span id="currentPage">1</span>/<span id="totalPage">10</span> <a href="javascript:void(0);" class="page-select mr-3" content="next"><i class="fa fa-chevron-right"></i></a></span>
                                   <% if (!ctx.tender.isTourist || (ctx.tender.isTourist && ctx.tender.touristPermission.file)) { %>