Browse Source

阶段进度,提供上传大文件功能

MaiXinRong 2 months ago
parent
commit
78e4296d2d

+ 1 - 1
app/base/base_controller.js

@@ -33,7 +33,7 @@ class BaseController extends Controller {
                     ctx.menu = menuList.budget;
                 }
             }
-            menuList.info.display = ctx.subProject.openInfo || false;
+            menuList.info.display = ctx.subProject.page_show.openInfo || false;
             menuList.datacollect.display = ctx.subProject.showDataCollect || false;
             menuList.file.display = ctx.subProject.page_show.openFile || false;
             menuList.contract.display = ctx.subProject.page_show.openContract || false;

+ 32 - 0
app/controller/sub_proj_controller.js

@@ -441,6 +441,38 @@ module.exports = app => {
             }
         }
 
+        async uploadBigFile(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                if (!data.type || !data.rela_id || !data.fileInfo) throw '缺少参数';
+
+                let result;
+                const fileInfo = path.parse(data.fileInfo.filename);
+                switch(data.type) {
+                    case 'begin':
+                        const create_time = Date.parse(new Date()) / 1000;
+                        result = {
+                            filename: `sp/progress/${ctx.subProject.id}/${ctx.moment().format('YYYYMMDD')}/${create_time + '_' + fileInfo.ext}`,
+                        };
+                        result.filepath = ctx.app.config.fujianOssFolder + result.filename;
+                        result.oss = await ctx.helper.getOssToken(ctx.app.fujianOss);
+                        break;
+                    case 'end':
+                        const user = await ctx.service.projectAccount.getDataById(ctx.session.sessionUser.accountId);
+                        const uploadFiles = [{
+                            filepath: data.filepath, rela_id: data.rela_id,
+                            filename: fileInfo.name, fileext: fileInfo.ext, filesize: data.fileInfo.filesize,
+                        }];
+                        result = await ctx.service.subProjFile.addFiles(ctx.subProject.id, ctx.request.url.split('/')[3], uploadFiles, user);
+                        break;
+                }
+                ctx.body = {err: 0, msg: '', data: result };
+            } catch (error) {
+                ctx.log(error);
+                ctx.body = this.ajaxErrorBody(error, '上传附件失败,请重试');
+            }
+        }
+
         async deleteFile(ctx) {
             try{
                 const data = JSON.parse(ctx.request.body.data);

+ 39 - 1
app/public/js/shares/tools_att.js

@@ -25,7 +25,8 @@
             '        <li class="nav-item ml-auto pt-1">\n' +
             '            <a href="javascript:void(0);" id="batch-download" class="btn btn-sm btn-primary" type="curr">批量下载</a>\n' +
             '            <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="att-cur-page">1</span>/<span id="att-total-page">10</span> <a href="javascript:void(0);" class="page-select mr-3" content="next"><i class="fa fa-chevron-right"></i></a></span>\n' +
-            (setting.readOnly ? '' : '            <a href="#upload" data-toggle="modal" data-target="#upload"  class="btn btn-sm btn-outline-primary ml-3">上传</a>\n') +
+            (setting.readOnly ? '' : '            <a href="#upload" data-toggle="modal" data-target="#upload"  class="btn btn-sm btn-outline-primary ml-2">上传</a>\n') +
+            (setting.readOnly || !setting.bigValid ? '' : '            <a href="#add-big-file" data-toggle="modal" data-target="#add-big-file"  class="btn btn-sm btn-outline-primary ml-2">上传大文件</a>\n') +
             '        </li>\n' +
             '    </ul>\n' +
             '</div>\n' +
@@ -233,6 +234,43 @@
             });
             $('#upload-file').val('');
         });
+        $('#add-big-file').on('show.bs.modal', function() {
+            $('#upload-big-file-hint').hide();
+            $('#upload-big-file')[0].value = '';
+            if ($('#add-big-file-ok').hasClass('btn-warning')) $('#add-big-file-ok').removeClass('btn-warning').addClass('btn-primary');
+        });
+        $('#add-big-file-ok').click(() => {
+            if (!curNode) {
+                toastr.error('请先选择台账节点');
+                return false;
+            }
+            const input = $('#upload-big-file');
+            const file = input[0].files[0];
+            if (file.size > 500 * 1024 * 1024) {
+                toastr.error('上传文件大小超过500MB。');
+                return false;
+            }
+            const fileext = '.' + file.name.toLowerCase().split('.').splice(-1)[0];
+            if (whiteList.indexOf(fileext) === -1) {
+                toastr.error('仅支持office文档、图片、压缩包格式,请勿上传' + fileext + '格式文件。');
+                return false;
+            }
+            const data = {};
+            data[setting.masterKey] = curNode[setting.key];
+            AliOss.uploadBigFile(file, setting.uploadBigUrl, data,
+                { progressObj: $('#upload-big-file-progress'), resumeObj: $('#add-big-file-resume'), stopObj: $('#add-big-file-stop') },
+                function(result) {
+                    result.forEach(d => {
+                        d.node = curNode;
+                        allAtts.push(d);
+                        _addToNodeIndex(d, true);
+                    });
+                    refreshAllAttHtml();
+                    refreshCurAttHtml();
+                    $('#upload-big-file').val('');
+                    $('#add-big-file').modal('hide');
+                });
+        });
         $('body').on('click', 'a[name=att-locate]', function () {
             const fid = this.getAttribute('file-id');
             const att = findFile(allAtts, fid);

+ 2 - 0
app/public/js/sp_progress.js

@@ -496,9 +496,11 @@ $(document).ready(() => {
         masterKey: 'rela_id',
         uploadUrl: 'progress/file/upload',
         deleteUrl: 'progress/file/delete',
+        uploadBigUrl: 'progress/file/upload/big',
         checked: false,
         zipName: `阶段进度-附件.zip`,
         readOnly: readOnly,
+        bigValid: true,
         fileIdType: 'string',
         fileInfo: {
             user_name: 'user_name',

+ 1 - 0
app/router.js

@@ -249,6 +249,7 @@ module.exports = app => {
     app.get('/sp/:id/progress', sessionAuth, subProjectCheck, 'subProjController.progress');
     app.post('/sp/:id/progress/update', sessionAuth, subProjectCheck, 'subProjController.progressUpdate');
     app.post('/sp/:id/progress/file/upload', sessionAuth, subProjectCheck, 'subProjController.uploadFile');
+    app.post('/sp/:id/progress/file/upload/big', sessionAuth, subProjectCheck, 'subProjController.uploadBigFile');
     app.post('/sp/:id/progress/file/delete', sessionAuth, subProjectCheck, 'subProjController.deleteFile');
     // 推进记录
     app.get('/sp/:id/push', sessionAuth, subProjectCheck, 'subProjController.push');

+ 27 - 1
app/view/sub_proj/progress_modal.ejs

@@ -1,2 +1,28 @@
 <% include ../shares/delete_hint_modal.ejs %>
-<% include ../shares/upload_att.ejs %>
+<% include ../shares/upload_att.ejs %>
+<div class="modal fade" id="add-big-file" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">上传附件</h5>
+            </div>
+            <div class="modal-body">
+                <div class="form-group text-danger" style="display: none" id="upload-big-file-hint">
+                </div>
+                <div class="form-group">
+                    <label for="formGroupExampleInput">文件大小限制:500MB,支持<span data-toggle="tooltip" data-placement="bottom" title="" data-original-title="doc,docx,xls,xlsx,ppt,pptx,pdf">office等文档格式</span>、<span data-toggle="tooltip" data-placement="bottom" title="" data-original-title="jpg,png,bmp">图片格式</span>、<span data-toggle="tooltip" data-placement="bottom" title="" data-original-title="rar,zip">压缩包格式</span></label>
+                    <input type="file" class="" id="upload-big-file">
+                </div>
+                <div class="form-group progress">
+                    <div id="upload-big-file-progress" class="progress-bar" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"></div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-primary btn-sm" id="add-big-file-stop" style="display: none">暂停</button>
+                <button type="button" class="btn btn-primary btn-sm" id="add-big-file-resume" style="display: none">重新上传</button>
+                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">关闭</button>
+                <button type="button" class="btn btn-primary btn-sm" id="add-big-file-ok">确认</button>
+            </div>
+        </div>
+    </div>
+</div>