Browse Source

feat: 同步修改批量下载至其他模块(计量台账、变更、调差)

lanjianrong 3 năm trước cách đây
mục cha
commit
378f19fd2e

+ 27 - 7
app/controller/change_controller.js

@@ -1138,14 +1138,17 @@ module.exports = app => {
          * @param {Oject} ctx - 全局上下文
          */
         async downloadZip(ctx) {
+            const time = Date.now();
+            const zipPath = `app/public/upload/change/fu_jian_zip${time}.zip`;
+            const responseData = {
+                err: 0,
+                msg: '',
+            };
             try {
-                const fileIds = JSON.parse(ctx.request.query.fileIds);
-                // const { fileIds } = JSON.parse(ctx.request.body.data);
-                // console.log('fileIds', fileIds);
+                // const fileIds = JSON.parse(ctx.request.query.fileIds);
+                const { fileIds = [] } = JSON.parse(ctx.request.body.data);
                 const { name: changeName } = await ctx.service.changeAtt.getChangeName(ctx.params.cid);
                 const zipFilename = `${ctx.tender.data.name}-工程变更-${changeName}-附件.zip`;
-                const time = Date.now();
-                const zipPath = `app/public/upload/change/fu_jian_zip${time}.zip`;
                 const size = await ctx.service.changeAtt.compressedFile(fileIds, zipPath);
 
                 // 解决中文无法下载问题
@@ -1173,8 +1176,25 @@ module.exports = app => {
                         fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
                     }
                 });
-            } catch (error) {
-                this.log(error);
+                // fs的错误不能被try catch捕捉
+                readStream.on('error', err => {
+                    this.log(err);
+                    if (fs.existsSync(path.resolve(this.app.baseDir, zipPath))) {
+                        fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
+                    }
+                    responseData.err = 1;
+                    responseData.msg = err.toString();
+                    ctx.body = responseData;
+                });
+            } catch (err) {
+                this.log(err);
+                if (fs.existsSync(path.resolve(this.app.baseDir, zipPath))) {
+                    fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
+                }
+                this.setMessage(err.toString(), this.messageType.ERROR);
+                responseData.err = 1;
+                responseData.msg = err.toString();
+                ctx.body = responseData;
             }
         }
         /**

+ 28 - 9
app/controller/material_controller.js

@@ -1047,13 +1047,16 @@ module.exports = app => {
          * @param {Object} ctx - 全局上下文
          */
         async downloadZip(ctx) {
+            const zipFilename = `${ctx.tender.data.name}-材料调差-${ctx.params.order}-附件.zip`;
+            const time = Date.now();
+            const zipPath = `app/public/upload/${ctx.tender.id}/tc/fu_jian_zip${time}.zip`;
+            const responseData = {
+                err: 0,
+                msg: '',
+            };
             try {
-                const fileIds = JSON.parse(ctx.request.query.fileIds);
-                // const { fileIds } = JSON.parse(ctx.request.body.data);
-                // console.log('fileIds', fileIds);
-                const zipFilename = `${ctx.tender.data.name}-材料调差-${ctx.params.order}-附件.zip`;
-                const time = Date.now();
-                const zipPath = `app/public/upload/${ctx.tender.id}/tc/fu_jian_zip${time}.zip`;
+                // const fileIds = JSON.parse(ctx.request.query.fileIds);
+                const { fileIds = [] } = JSON.parse(ctx.request.body.data);
                 const size = await ctx.service.materialFile.compressedFile(fileIds, zipPath);
 
                 // 解决中文无法下载问题
@@ -1075,14 +1078,30 @@ module.exports = app => {
                 const readStream = fs.createReadStream(path.join(this.app.baseDir, zipPath));
 
                 ctx.body = readStream;
-                // ctx.body = fs.readFileSync(path.resolve(this.app.baseDir, zipPath));
                 readStream.on('close', () => {
                     if (fs.existsSync(path.resolve(this.app.baseDir, zipPath))) {
                         fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
                     }
                 });
-            } catch (error) {
-                this.log(error);
+                // fs的错误不能被try catch捕捉
+                readStream.on('error', err => {
+                    this.log(err);
+                    if (fs.existsSync(path.resolve(this.app.baseDir, zipPath))) {
+                        fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
+                    }
+                    responseData.err = 1;
+                    responseData.msg = err.toString();
+                    ctx.body = responseData;
+                });
+            } catch (err) {
+                this.log(err);
+                if (fs.existsSync(path.resolve(this.app.baseDir, zipPath))) {
+                    fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
+                }
+                this.setMessage(err.toString(), this.messageType.ERROR);
+                responseData.err = 1;
+                responseData.msg = err.toString();
+                ctx.body = responseData;
             }
         }
     }

+ 28 - 6
app/controller/stage_controller.js

@@ -1574,11 +1574,16 @@ module.exports = app => {
          * @param {Object} ctx - 全局上下文
          */
         async downloadZip(ctx) {
+            const zipFilename = `${ctx.tender.data.name}-计量台账-${ctx.params.order}-附件.zip`;
+            const time = Date.now();
+            const zipPath = `app/public/upload/${ctx.tender.id}/stage/fu_jian_zip${time}.zip`;
+            const responseData = {
+                err: 0,
+                msg: '',
+            };
             try {
-                const fileIds = JSON.parse(ctx.request.query.fileIds);
-                const zipFilename = `${ctx.tender.data.name}-计量台账-${ctx.params.order}-附件.zip`;
-                const time = Date.now();
-                const zipPath = `app/public/upload/${ctx.tender.id}/stage/fu_jian_zip${time}.zip`;
+                const { fileIds = [] } = JSON.parse(ctx.request.body.data);
+                // const fileIds = JSON.parse(ctx.request.query.fileIds);
                 const size = await ctx.service.stageAtt.compressedFile(fileIds, zipPath);
 
                 // 解决中文无法下载问题
@@ -1604,8 +1609,25 @@ module.exports = app => {
                         fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
                     }
                 });
-            } catch (error) {
-                this.log(error);
+                // fs的错误不能被try catch捕捉
+                readStream.on('error', err => {
+                    this.log(err);
+                    if (fs.existsSync(path.resolve(this.app.baseDir, zipPath))) {
+                        fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
+                    }
+                    responseData.err = 1;
+                    responseData.msg = err.toString();
+                    ctx.body = responseData;
+                });
+            } catch (err) {
+                this.log(err);
+                if (fs.existsSync(path.resolve(this.app.baseDir, zipPath))) {
+                    fs.unlinkSync(path.resolve(this.app.baseDir, zipPath));
+                }
+                this.setMessage(err.toString(), this.messageType.ERROR);
+                responseData.err = 1;
+                responseData.msg = err.toString();
+                ctx.body = responseData;
             }
 
         }

+ 25 - 4
app/public/js/change_detail.js

@@ -171,10 +171,31 @@ $(document).ready(() => {
         })
 
         if (fileIds.length) {
-            const tid = $('#tenderId').val()
-            const cid = $('#changeId').val()
-            $('#downloadZip').attr('href', `/tender/${tid}/change/${cid}/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`);
-            $('#downloadZip')[0].click();
+            if (fileIds.length > 10) {
+              return toastr.warning(`最大允许10个文件(当前${fileIds.length}个)`);
+            }
+            const tid = $('#tenderId').val();
+            const cid = $('#changeId').val();
+            
+            toastr.success('正在进行压缩文件...', '', { timeOut: 0, extendedTimeOut: 0});
+            $(this).attr('disabled', "true");
+            const btn = $(this);
+            postCompressFile(`/tender/${tid}/change/${cid}/download/compresse-file`, {fileIds}, function(result) {
+              toastr.clear();
+              toastr.success('压缩文件成功');
+              btn.removeAttr('disabled');
+              const href = window.URL.createObjectURL(result);
+              $('#zipDown').attr('href', href);
+              $('#zipDown').attr('download', `${tenderName}-工程变更-${changeName}-附件.zip`);
+              $("#zipDown")[0].click();
+            }, () => {
+              btn.removeAttr('disabled');
+              toastr.clear();
+              toastr.error('批量下载失败');
+            });
+
+            // $('#downloadZip').attr('href', `/tender/${tid}/change/${cid}/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`);
+            // $('#downloadZip')[0].click();
         }
     });
 

+ 24 - 2
app/public/js/change_information.js

@@ -176,10 +176,32 @@ $(document).ready(() => {
         });
 
         if (fileIds.length) {
+            // const tid = $('#tenderId').val();
+            // const cid = $('#changeId').val();
+            // $('#downloadZip').attr('href', `/tender/${tid}/change/${cid}/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`);
+            // $('#downloadZip')[0].click();
+            if (fileIds.length > 10) {
+              return toastr.warning(`最大允许10个文件(当前${fileIds.length}个)`);
+            }
             const tid = $('#tenderId').val();
             const cid = $('#changeId').val();
-            $('#downloadZip').attr('href', `/tender/${tid}/change/${cid}/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`);
-            $('#downloadZip')[0].click();
+            
+            toastr.success('正在进行压缩文件...', '', { timeOut: 0, extendedTimeOut: 0});
+            $(this).attr('disabled', "true");
+            const btn = $(this);
+            postCompressFile(`/tender/${tid}/change/${cid}/download/compresse-file`, {fileIds}, function(result) {
+              toastr.clear();
+              toastr.success('压缩文件成功');
+              btn.removeAttr('disabled');
+              const href = window.URL.createObjectURL(result);
+              $('#zipDown').attr('href', href);
+              $('#zipDown').attr('download', `${tenderName}-工程变更-${changeName}-附件.zip`);
+              $("#zipDown")[0].click();
+            }, () => {
+              btn.removeAttr('disabled');
+              toastr.clear();
+              toastr.error('批量下载失败');
+            });
         }
     });
 

+ 2 - 1
app/public/js/ledger.js

@@ -3415,8 +3415,9 @@ $(document).ready(function() {
         // if (curAuditor && curAuditor.aid !== cur_uid) {
         //     return toastr.error('当前操作没有权限!');
         // }
-        const files = $('#upload-file')[0].files;
         const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
+        if (!node) return
+        const files = $('#upload-file')[0].files;
         // console.log(node);
         const formData = new FormData();
         formData.append('lid', node.id);

+ 21 - 2
app/public/js/material_file.js

@@ -255,9 +255,28 @@ $(document).ready(function () {
         // console.log('fileIds', fileIds)
 
         if (fileIds.length) {
+            if (fileIds.length > 10) {
+              return toastr.warning(`最大允许10个文件(当前${fileIds.length}个)`)
+            }
+            toastr.success('正在进行压缩文件...', '', { timeOut: 0, extendedTimeOut: 0})
+            $(this).attr('disabled', "true")
+            const btn = $(this)
+            postCompressFile(`/tender/${tid}/measure/material/${order}/file/download/compresse-file`, {fileIds}, function(result) {
+              toastr.clear()
+              toastr.success('压缩文件成功')
+              btn.removeAttr('disabled')
+              const href = window.URL.createObjectURL(result)
+              $('#zipDown').attr('href', href);
+              $('#zipDown').attr('download', `${tender.name}-材料调差-第${order}期-附件.zip`);
+              $("#zipDown")[0].click();
+            }, () => {
+              btn.removeAttr('disabled')
+              toastr.clear()
+              toastr.error('批量下载失败')
+            });
             // postData( `/tender/${tid}/measure/material/${order}/file/download/compresse-file`, { fileIds })
-            $('#downloadZip').attr('href', `/tender/${tid}/measure/material/${order}/file/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`);
-            $('#downloadZip')[0].click();
+            // $('#downloadZip').attr('href', `/tender/${tid}/measure/material/${order}/file/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`);
+            // $('#downloadZip')[0].click();
         }
     });
     function handleFileList(fileList) {

+ 26 - 6
app/public/js/stage.js

@@ -3663,7 +3663,7 @@ $(document).ready(() => {
             }
             if (tab.attr('content') === '#fujian') {
                 const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
-                getNodeList(node.id);
+                node && getNodeList(node.id);
             }
             if (tab.attr('content') === '#zhongjian') {
                 if (!detail) {
@@ -3721,8 +3721,9 @@ $(document).ready(() => {
         // if (curAuditor && curAuditor.aid !== cur_uid) {
         //     return toastr.error('当前操作没有权限!');
         // }
-        const files = $('#upload-file')[0].files;
         const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
+        if (!node) return
+        const files = $('#upload-file')[0].files;
         const formData = new FormData();
         formData.append('lid', node.id);
         for (const file of files) {
@@ -3953,7 +3954,7 @@ $(document).ready(() => {
     // 批量下载
     $('#bach-download').click(function() {
         const fileIds = [];
-        const type = $(this).prop('type');
+        const type = $(this).attr('type');
         let node = ''
         if (type === 'curr') {
             node = '#nodelist-table .check-file:checked'
@@ -3966,9 +3967,28 @@ $(document).ready(() => {
         });
 
         if (fileIds.length) {
-            const url = `/tender/${tender.id}/measure/stage/${stage.order}/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`;
-            $('#zipDown').attr('href', url);
-            $("#zipDown")[0].click();
+            if (fileIds.length > 10) {
+              return toastr.warning(`最大允许10个文件(当前${fileIds.length}个)`)
+            }
+            toastr.success('正在进行压缩文件...', '', { timeOut: 0, extendedTimeOut: 0})
+            $(this).attr('disabled', "true")
+            const btn = $(this)
+            postCompressFile(`/tender/${tender.id}/measure/stage/${stage.order}/download/compresse-file`, {fileIds}, function(result) {
+              toastr.clear()
+              toastr.success('压缩文件成功')
+              btn.removeAttr('disabled')
+              const href = window.URL.createObjectURL(result)
+              $('#zipDown').attr('href', href);
+              $('#zipDown').attr('download', `${tender.name}-计量台账-第${stage.order}期-附件.zip`);
+              $("#zipDown")[0].click();
+            }, () => {
+              btn.removeAttr('disabled')
+              toastr.clear()
+              toastr.error('批量下载失败')
+            });
+            // const url = `/tender/${tender.id}/measure/stage/${stage.order}/download/compresse-file?fileIds=${JSON.stringify(fileIds)}`;
+            // $('#zipDown').attr('href', url);
+            // $("#zipDown")[0].click();
         }
     });
 

+ 3 - 3
app/router.js

@@ -264,7 +264,7 @@ module.exports = app => {
     app.post('/tender/:id/measure/stage/:order/delete/file', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageController.deleteFile');
     app.post('/tender/:id/measure/stage/:order/save/file', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageController.saveFile');
     app.post('/tender/:id/measure/stage/:order/check/file', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageController.checkFile');
-    app.get('/tender/:id/measure/stage/:order/download/compresse-file', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageController.downloadZip');
+    app.post('/tender/:id/measure/stage/:order/download/compresse-file', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageController.downloadZip');
 
     // 中间计量
     app.get('/tender/:id/measure/stage/:order/detail', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'stageController.detail');
@@ -386,7 +386,7 @@ module.exports = app => {
     app.get('/change/download/file/:id', sessionAuth, 'changeController.downloadFile');
     app.post('/change/download/file/:id', sessionAuth, 'changeController.checkFile');
     app.post('/tender/:id/change/:cid/info/file/delete', sessionAuth, 'changeController.deleteFile');
-    app.get('/tender/:id/change/:cid/download/compresse-file', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.downloadZip');
+    app.post('/tender/:id/change/:cid/download/compresse-file', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.downloadZip');
     app.post('/tender/:id/change/delete', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.delete');
     app.post('/tender/:id/change/bills', sessionAuth, tenderCheck, uncheckTenderCheck, 'changeController.bills');
 
@@ -438,7 +438,7 @@ module.exports = app => {
     app.get('/tender/:id/measure/material/:order/file/:fid/download', sessionAuth, tenderCheck, uncheckTenderCheck, 'materialController.downloadFile');
     app.post('/tender/:id/measure/material/:order/file/find', sessionAuth, tenderCheck, uncheckTenderCheck, materialCheck, 'materialController.getCurMatericalFiles');
     app.post('/tender/:id/measure/material/:order/file/delete', sessionAuth, tenderCheck, uncheckTenderCheck, materialCheck, 'materialController.deleteFile');
-    app.get('/tender/:id/measure/material/:order/file/download/compresse-file', sessionAuth, tenderCheck, uncheckTenderCheck, 'materialController.downloadZip');
+    app.post('/tender/:id/measure/material/:order/file/download/compresse-file', sessionAuth, tenderCheck, uncheckTenderCheck, 'materialController.downloadZip');
 
     // 个人账号相关
     app.get('/profile/info', sessionAuth, 'profileController.info');

+ 8 - 8
app/service/material_file.js

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

+ 4 - 4
app/service/stage_att.js

@@ -124,16 +124,16 @@ module.exports = app => {
 
                 // 存档警告
                 ziparchiver.on('warning', function(err) {
-                    if (err.code === 'ENOENT') {
-                        console.warn('stat故障和其他非阻塞错误');
-                    }
+                    // if (err.code === 'ENOENT') {
+                    //     console.warn('stat故障和其他非阻塞错误');
+                    // }
                     return reject(err);
 
                 });
 
                 // 存档出错
                 ziparchiver.on('error', function(err) {
-                    console.log(err);
+                    // console.log(err);
                     return reject(err);
                 });
 

+ 5 - 2
app/view/change/information.ejs

@@ -94,12 +94,13 @@
                         </li>
                         <li class="nav-item ml-auto pt-1" id="fujian_btn" style="display:none;">
                             <!--所有附件 翻页-->
-                            <a href="javascript: void(0);" data-toggle="modal" class="btn btn-sm btn-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</a>
+                            <button  data-toggle="modal" class="btn btn-sm btn-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</button>
+                            <!-- <a href="javascript: void(0);" data-toggle="modal" class="btn btn-sm btn-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</a> -->
                             <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>
                             <% if (auditStatus !== 8 || (auditStatus === 8 && ctx.tender.touristPermission.file)) { %>
                             <a href="#addfujian" data-toggle="modal" class="btn btn-sm btn-light text-primary" data-placement="bottom" title="" data-original-title="上传附件"><i class="fa fa-cloud-upload" aria-hidden="true"></i> 上传附件</a>
                             <% } %>
-                            <a href="" id="downloadZip" style="display: none;" download></a>
+                            <a href="javascript: void(0);" id="zipDown" download style="display: none;"></a>
                         </li>
                     </ul>
                 </div>
@@ -382,12 +383,14 @@
     </div>
 </div>
 <script>
+    const tenderName = '<%- tender.name %>';
     const totalPriceUnit = '<%- tpUnit %>';
     const unitPriceUnit = '<%- upUnit %>';
     const accountId = parseInt('<%- ctx.session.sessionUser.accountId %>');
     const ledgeStatus = '<%- tender.ledger_status %>';
     const ledgerConsts = JSON.parse('<%- JSON.stringify(ledgerConsts) %>');
     const auditStatus = parseInt('<%- auditStatus %>');
+    const changeName = '<%- change.name %>';
     const touristPermission = parseInt('<%- ctx.tender.touristPermission.file %>');
     const auditList = JSON.parse(unescape('<%- escape(JSON.stringify(auditList)) %>'));
     const precision = JSON.parse('<%- JSON.stringify(precision) %>');

+ 4 - 2
app/view/material/file.ejs

@@ -16,8 +16,9 @@
           <% if (material.filePermission) { %>
           <a href="#addfujian" data-toggle="modal" class="btn btn-sm btn-light text-primary" data-toggle="tooltip" data-placement="bottom" title="" data-original-title="添加清单"><i class="fa fa-cloud-upload" aria-hidden="true"></i> 上传附件</a>
           <% } %>
-          <a href="javascript: void(0);" data-toggle="modal" class="btn btn-sm btn-light text-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</a>
-          <a href="" id="downloadZip" style="display: none;" download></a>
+          <button data-toggle="modal" class="btn btn-sm btn-light text-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</button>
+          <!-- <a href="javascript: void(0);" data-toggle="modal" class="btn btn-sm btn-light text-primary" id="bach-download"><i class="fa fa-download "></i> 批量下载</a> -->
+          <a href="javascript: void(0);" id="zipDown" download style="display: none;"></a>
         </div>
         <!-- <div class="d-inline-block">
           <span class="d-flex align-items-center" style="margin-left: 5px;">
@@ -121,5 +122,6 @@
   const mid = '<%- ctx.material.id %>';
   const order = '<%- ctx.material.order %>';
   const fileList = JSON.parse(unescape('<%- escape(JSON.stringify(fileList)) %>'));
+  const tender = JSON.parse(unescape('<%- escape(JSON.stringify(tender)) %>'));
   const whiteList = JSON.parse('<%- JSON.stringify(whiteList) %>');
 </script>

+ 2 - 1
app/view/stage/index.ejs

@@ -274,7 +274,8 @@
                                     <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>
+                                    <!-- <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 && stage.filePermission) { %>