Browse Source

回收站清除功能

zhongzewei 7 years ago
parent
commit
33325b45db

+ 34 - 0
modules/pm/controllers/pm_controller.js

@@ -13,6 +13,8 @@ let fee_rate_facade = require("../../fee_rates/facade/fee_rates_facade");
 let billsModel = require('../../main/models/bills').model;
 let rationsModel = require('../../main/models/ration').model;
 let projectModel = mongoose.model('projects');
+let unitPriceFileModel = mongoose.model('unit_price_file');
+let feeRateFileModel = mongoose.model('fee_rate_file');
 let asyncTool = require('async');
 
 //统一回调函数
@@ -353,5 +355,37 @@ module.exports = {
         ProjectsData.recGC(userID, nodes, function (err, msg, data) {
             callback(request, response, err, msg, data);
         });
+    },
+
+    delGC: async function(request, response){
+        let data = JSON.parse(request.body.data);
+        let delDatas = data.delDatas;
+        let bulkProjs = [], bulkUFs = [], bulkFFs = [];
+        try{
+            for(let data of delDatas){
+                if(data.updateType === 'Project'){
+                    bulkProjs.push({deleteOne: {filter: {ID: data.ID}}});
+                }
+                else if(data.updateType === fileType.unitPriceFile){
+                    bulkUFs.push({deleteOne: {filter: {id: data.ID}}});
+                }
+                else{
+                    bulkFFs.push({deleteOne: {filter: {ID: data.ID}}});
+                }
+            }
+            if(bulkProjs.length > 0){
+                await projectModel.bulkWrite(bulkProjs);
+            }
+            if(bulkUFs.length > 0){
+                await unitPriceFileModel.bulkWrite(bulkUFs);
+            }
+            if(bulkFFs.length > 0){
+                await feeRateFileModel.bulkWrite(bulkFFs);
+            }
+            callback(request, response, 0, 'success', null);
+        }
+        catch(err){
+            callback(request, response, 1, err, null);
+        }
     }
 };

+ 1 - 0
modules/pm/routes/pm_route.js

@@ -48,6 +48,7 @@ module.exports = function (app) {
     //GC
     pmRouter.post('/getGCDatas', pmController.getGCDatas);
     pmRouter.post('/recGC', pmController.recGC);
+    pmRouter.post('/delGC', pmController.delGC);
 
     app.use('/pm/api', pmRouter);
 };

+ 45 - 0
web/building_saas/pm/html/project-management-Recycle.html

@@ -31,6 +31,25 @@
         </div>
     </div>
 </div>
+<!--弹出清除项目-->
+<div class="modal fade" id="delPoj" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">清除 <i class="fa fa-cubes"></i> 建设项目</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript:void(0);" class="btn btn-primary" data-dismiss="modal" id="delPojBtn">确定</a>
+            </div>
+        </div>
+    </div>
+</div>
 <!--弹出恢复文件-->
 <div class="modal fade" id="reFile" data-backdrop="static">
     <div class="modal-dialog" role="document">
@@ -57,3 +76,29 @@
         </div>
     </div>
 </div>
+<!--弹出清除文件-->
+<div class="modal fade" id="delFile" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">恢复单价文件</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body modal-fixed-height">
+                <p>勾选需要恢复的文件,点“确定”按钮,确认从回收站中恢复。</p>
+                <table class="table table-hover table-sm mb-5">
+                    <thead><tr><th>名称</th><th>删除时间</th><th>勾选</th></tr></thead>
+                    <tbody>
+                    <tr><td>XX单价文件</td><td>2017-11-01<br>12:11:43</td><td><input type="checkbox"></td></tr>
+                    </tbody>
+                </table>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+                <a href="javascript:void(0);" class="btn btn-primary" id="delFileBtn" data-dismiss="modal">确定</a>
+            </div>
+        </div>
+    </div>
+</div>

+ 257 - 48
web/building_saas/pm/js/pm_gc.js

@@ -174,9 +174,12 @@ const gcTreeObj = {
             {name: '工程列表', dataCode: 'name', width: 800, vAlign: 'center', hAlign: 'left'},
             {name: '删除日期', dataCode: 'deleteDateTime', width: 170, vAlign: 'center', hAlign: 'left'},
             {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'left'},
-            {name: '恢复', dataCode: 'recovery', width: 170, vAlign: 'center', hAlign: 'left'},
-            {name: '单价文件', dataCode: 'unitPriceFile', width: 170, vAlign: 'center', hAlign: 'left'},
-            {name: '费率文件', dataCode: 'feeRateFile', width: 170, vAlign: 'center', hAlign: 'left'}
+            {name: '恢复', dataCode: 'recovery', width: 100, vAlign: 'center', hAlign: 'left'},
+            {name: '清除', dataCode: 'delete', width: 100, vAlign: 'center', hAlign: 'left'},
+            {name: '单价文件', dataCode: 'unitPriceFile', width: 100, vAlign: 'center', hAlign: 'left'},
+            {name: '单价文件-清除', dataCode: 'unitPriceFile_delete', width: 100, vAlign: 'center', hAlign: 'left'},
+            {name: '费率文件', dataCode: 'feeRateFile', width: 100, vAlign: 'center', hAlign: 'left'},
+            {name: '费率文件-清除', dataCode: 'feeRateFile_delete', width: 100, vAlign: 'center', hAlign: 'left'}
         ],
         //选中行颜色
         style: {
@@ -221,8 +224,15 @@ const gcTreeObj = {
             sheet.setColumnCount(headers.length);
             sheet.setRowHeight(0, 40, GC.Spread.Sheets.SheetArea.colHeader);
             for(let i = 0, len = headers.length; i < len; i++){
-                sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
                 sheet.setColumnWidth(i, headers[i].width, GC.Spread.Sheets.SheetArea.colHeader);
+                if(headers[i].dataCode === 'unitPriceFile' || headers[i].dataCode === 'feeRateFile'){
+                    //合并列
+                    sheet.addSpan(0, i, 1, 2, GC.Spread.Sheets.SheetArea.colHeader);
+                }
+                if(headers[i].dataCode === 'unitPriceFile_delete' || headers[i].dataCode === 'feeRateFile_delete'){
+                    continue;
+                }
+                sheet.setValue(0, i, headers[i].name, GC.Spread.Sheets.SheetArea.colHeader);
             }
         };
         me.renderSheetFuc(sheet, fuc);
@@ -304,29 +314,49 @@ const gcTreeObj = {
         me.initSelection(args.newSelections[0], args.oldSelections[0]);
     },
     //点击恢复列,弹出恢复项目窗口
-    recoveryProj: function (node) {
+    oprProj: function (modalId, node) {
         let tenderNodes = m_getTenders(node);
-        $('#rePoj .modal-header').empty();
-        $('p', '#rePoj .modal-body').remove();
-        $('#rePoj .modal-header').html(v_getTitle(node));
-        $('#rePoj .modal-body').html(v_getMoBody(node, tenderNodes));
-        $('#rePoj').modal('show');
+        let type = modalId === '#rePoj' ? 'recovery' : 'delete';
+        $(`${modalId} .modal-header`).empty();
+        $('p', `${modalId} .modal-body`).remove();
+        $(`${modalId} .modal-header`).html(v_getTitle(type, node));
+        $(`${modalId} .modal-body`).html(v_getMoBody(type, node, tenderNodes));
+        $(`${modalId}`).modal('show');
     },
     //点击单价文件恢复,弹出恢复单价文件窗口
     recoveryUnitPrc: function (node) {
         let unitPriceFiles = node.data.unitPriceFiles;
+        let tenders = m_getTenders(node);
         $('#reFile h5').text('恢复单价文件');
         $('tr', '#reFile tbody').remove();
-        $('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles));
+        $('#reFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles, tenders, 'recovery'));
         $('#reFile').modal('show');
     },
     recoveryFeeRate: function (node) {
         let feeRateFiles = node.data.feeRateFiles;
+        let tenders = m_getTenders(node);
         $('#reFile h5').text('恢复费率文件');
         $('tr', '#reFile tbody').remove();
-        $('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles));
+        $('#reFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles, tenders, 'recovery'));
         $('#reFile').modal('show');
     },
+    //点击单价文件清除,弹出清除单价文件窗口
+    deleteUnitPrc: function (node) {
+        let unitPriceFiles = node.data.unitPriceFiles;
+        let tenders = m_getTenders(node);
+        $('#delFile h5').text('清除单价文件');
+        $('tr', '#delFile tbody').remove();
+        $('#delFile tbody').html(v_getFiles(fileType.unitPriceFile, unitPriceFiles, tenders, 'delete'));
+        $('#delFile').modal('show');
+    },
+    deleteFeeRate: function (node) {
+        let feeRateFiles = node.data.feeRateFiles;
+        let tenders = m_getTenders(node);
+        $('#delFile h5').text('清除费率文件');
+        $('tr', '#delFile tbody').remove();
+        $('#delFile tbody').html(v_getFiles(fileType.feeRateFile, feeRateFiles, tenders, 'delete'));
+        $('#delFile').modal('show');
+    },
     getTreeNodeCell: function (tree) {
         let indent = 20;
         let levelIndent = -5;
@@ -517,20 +547,35 @@ const gcTreeObj = {
                 zoom = hitinfo.sheet.zoom();
             let textLength = this.getAutoFitWidth(value, text, acStyle, zoom, {sheet: hitinfo.sheet, row: hitinfo.row, col: hitinfo.col, sheetArea: GC.Spread.Sheets.SheetArea.viewport});
             if(hitinfo.x - hitinfo.cellRect.x > 0 && hitinfo.x - hitinfo.cellRect.x < textLength){
+                //恢复
                 if(dataCode === 'recovery'){
-                    gcTreeObj.recoveryProj(node);
+                    gcTreeObj.oprProj('#rePoj', node);
+                }
+                //清除
+                else if(dataCode === 'delete'){
+                    gcTreeObj.oprProj('#delPoj', node)
                 }
+                //恢复单价文件
                 else if(dataCode === 'unitPriceFile'){
                     gcTreeObj.recoveryUnitPrc(node);
                 }
+                //清除单价文件
+                else if(dataCode === 'unitPriceFile_delete'){
+                    gcTreeObj.deleteUnitPrc(node);
+                }
+                //恢复费率文件
                 else if(dataCode === 'feeRateFile'){
                     gcTreeObj.recoveryFeeRate(node);
                 }
+                //清除费率文件
+                else if(dataCode === 'feeRateFile_delete'){
+                    gcTreeObj.deleteFeeRate(node);
+                }
             }
         };
         MyBaseCell.prototype.processMouseMove = function (hitInfo) {
             let dataCode = gcTreeObj.setting.header[hitInfo.col]['dataCode'];
-            if(dataCode === 'recovery' || dataCode === 'unitPriceFile' || dataCode === 'feeRateFile'){
+            if(dataCode === 'recovery' || dataCode === 'delete' || dataCode === 'unitPriceFile' || dataCode === 'unitPriceFile_delete' || dataCode === 'feeRateFile' || dataCode === 'feeRateFile_delete'){
                 let sheet = hitInfo.sheet;
                 let div = sheet.getParent().getHost();
                 let canvasId = div.id + "vp_vp";
@@ -569,16 +614,31 @@ const gcTreeObj = {
                 value = '恢复';
             }
         }
+        else if(dataCode === 'delete'){
+            if(deleted(node)){
+                value = '清除';
+            }
+        }
         else if(dataCode === 'unitPriceFile'){
             if(node.data.projType === projectType.project && node.data.unitPriceFiles !== undefined && node.data.unitPriceFiles.length > 0){
                 value = '恢复';
             }
         }
+        else if(dataCode === 'unitPriceFile_delete'){
+            if(node.data.projType === projectType.project && node.data.unitPriceFiles !== undefined && node.data.unitPriceFiles.length > 0){
+                value = '清除';
+            }
+        }
         else if(dataCode === 'feeRateFile'){
             if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){
                 value = '恢复';
             }
         }
+        else if(dataCode === 'feeRateFile_delete'){
+            if(node.data.projType === projectType.project && node.data.feeRateFiles !== undefined && node.data.feeRateFiles.length > 0){
+                value = '清除';
+            }
+        }
         else {
             value = node.data[dataCode] ? node.data[dataCode] : '';
         }
@@ -644,7 +704,9 @@ $(document).ready(function () {
         projTreeObj.tree = null;
     });
     e_recFiles($('#reFileBtn'));
+    e_delFiles($('#delFileBtn'));
     e_recProj($('#rePojBtn'));
+    e_delProj($('#delPojBtn'));
 });
 
 function gc_init(){
@@ -664,9 +726,9 @@ function gc_init(){
 }
 
 //项目恢复模态框标题
-function v_getTitle(node){
+function v_getTitle(type, node){
     let html = '';
-    html += '<h5 class="modal-title">恢复 ';
+    html += type === 'recovery' ? '<h5 class="modal-title">恢复 ' : '<h5 class="modal-title">清除 ';
     if(node.data.projType === projectType.project){
         html += '<i class="fa fa-cubes"></i>建设项目</h5>';
     }
@@ -681,48 +743,73 @@ function v_getTitle(node){
 }
 
 //项目恢复模态框主体
-function v_getMoBody(oprNode, nodes){
+function v_getMoBody(type, oprNode, nodes){
     let html = '';
-    if(oprNode.data.projType === projectType.tender){
-        decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
-        let recName = oprNode.data.name + decDate;
-        html += '<p>恢复后将重命名为 <b>' + recName + '</b></p>';
-    }
-    else {
-        if(oprNode.data.projType === projectType.project){
-            html += '<p><i class="fa fa-cubes"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
-        }
-        else if(oprNode.data.projType === projectType.engineering){
-            html += '<p><i class="fa fa-cube"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
+    if(type === 'recovery'){
+        if(oprNode.data.projType === projectType.tender){
+            decDate = '(' + new Date().Format('MM-dd hh:mm:ss') + '恢复)';
+            let recName = oprNode.data.name + decDate;
+            html += '<p>恢复后将重命名为 <b>' + recName + '</b></p>';
         }
-        html += ('<p>');
-        for(let i = 0, len = nodes.length; i < len; i++){
-            let recName = nodes[i].data.name + '(' + new Date().Format('MM-dd hh:mm:ss') +'恢复)';
-            html += '<b>' + recName + '</b>、';
+        else {
+            if(oprNode.data.projType === projectType.project){
+                html += '<p><i class="fa fa-cubes"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
+            }
+            else if(oprNode.data.projType === projectType.engineering){
+                html += '<p><i class="fa fa-cube"></i> ' + oprNode.data.name + '下的单位工程都将恢复都将恢复,恢复后将重命名为</p>';
+            }
+            html += ('<p>');
+            for(let i = 0, len = nodes.length; i < len; i++){
+                let recName = nodes[i].data.name + '(' + new Date().Format('MM-dd hh:mm:ss') +'恢复)';
+                html += '<b>' + recName + '</b>、';
+            }
+            html = html.slice(0, html.length - 1);
+            html += ('</p>');
         }
-        html = html.slice(0, html.length - 1);
-        html += ('</p>');
-    }
 
-    html += ('<p>点“确定”按钮,确认从回收站中恢复</p>');
+        html += ('<p>点“确定”按钮,确认从回收站中恢复</p>');
+    }
+    else{
+        html += ('<p>点“确定”按钮,确认清除数据</p>');
+    }
     return html;
 }
 
 //单价、费率文件恢复弹出框数据
-function v_getFiles(type, files){
+function v_getFiles(type, files, tenders, opr = null){
     let html = '';
+    function hasTheFile(tenders, fileId, fileType){
+        for(let tender of tenders){
+            let fileAttr = fileType === 'UnitPriceFile' ? 'unitPriceFile' : 'feeFile';
+            if(tender.data.property[fileAttr]['id'] == fileId){
+                return true;
+            }
+        }
+        return false;
+    }
     for(let i = 0, len = files.length; i < len; i ++){
         let recName = type === fileType.unitPriceFile ?  files[i].name + '单价文件' : files[i].name + '费率文件';
         let fileId = type === fileType.unitPriceFile ? files[i].id : files[i].ID;
         let recTimeA = formatDate(new Date(files[i].deleteInfo.deleteDateTime), 'yyyy-MM-dd');
         let recTimeB = formatDate(new Date(files[i].deleteInfo.deleteDateTime), 'HH:mm:ss');
-        html += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
+        if(opr && opr === 'delete'){
+            //还被引用,不可删除
+            if(hasTheFile(tenders, fileId, type)){
+                html += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input disabled name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
+            }
+            else {
+                html += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
+            }
+        }
+        else{
+            html += '<tr><td>'+ recName +'</td><td>' + recTimeA + '<br>' + recTimeB + '</td><td><input name="fileItems" type="checkbox" fileId = "' + fileId + '" fileType = "' + type + '"></td></tr>';
+        }
     }
     return html;
 }
 
-//恢复单价、费率文件后前端显示变化
-function v_recFiles(project, fileIds, type){
+//恢复或清除单价、费率文件后前端显示变化
+function v_refreshFiles(project, fileIds, type){
     let projFiles;
     if(type === fileType.unitPriceFile){
         projFiles = project.data.unitPriceFiles;
@@ -767,14 +854,16 @@ function v_removeNode(node){
     }
 }
 
-function v_refreshNode(node){
-    if(deleted(node)){
-        delete node.data.deleteInfo;
+function v_refreshNode(node, recovery = true){
+    if(recovery){
+        if(deleted(node)){
+            delete node.data.deleteInfo;
+        }
     }
     gcTreeObj.refreshNodeData(node);
     let parent = node.parent || null;
     if(parent && parent.data !== undefined){
-        v_refreshNode(parent);
+        v_refreshNode(parent, recovery);
     }
 }
 
@@ -930,6 +1019,49 @@ function m_getRecDatas(oprNode){
     return rst;
 }
 
+//获取清除的额数据
+function m_getDelDatas(oprNode){
+    let rst = [];
+    if(!oprNode){
+        return rst;
+    }
+    function getChild(node){
+        rst.push({updateType: 'Project', ID: node.data.ID});
+        if(node.children.length > 0){
+            for(let child of node.children){
+                getChild(child);
+            }
+        }
+    }
+    getChild(oprNode);
+    //父节点只有一个单位工程,则清除此单位工程的时候,父节点也清除,(建设项目单价、费率文件存在时不清除)
+    if(oprNode.data.projType === projectType.tender){
+        let eng = oprNode.parent, proj = null;
+        if(eng && deleted(eng)){
+            proj = eng.parent;
+            rst.push({updateType: 'Project', ID: eng.data.ID});
+        }
+        if(proj && deleted(proj) && fileEmpty(proj)){
+            rst.push({updateType: 'Project', ID: proj.data.ID})
+        }
+    }
+    else if(oprNode.data.projType === projectType.engineering){
+        let proj = oprNode.parent;
+        if(proj && deleted(proj) && fileEmpty(proj)){
+            rst.push({updateType: 'Project', ID: proj.data.ID});
+        }
+    }
+    else if(oprNode.data.projType === projectType.project){
+        for(let uf of oprNode.data.unitPriceFiles){
+            rst.push({updateType: fileType.unitPriceFile, ID: uf.id});
+        }
+        for(let ff of oprNode.data.feeRateFiles){
+            rst.push({updateType: fileType.feeRateFile, ID: ff.ID});
+        }
+    }
+    return rst;
+}
+
 //获得勾选的单价、费率文件的id
 function m_getFilesObjs(nodes){
     let rst = [];
@@ -989,7 +1121,7 @@ function e_recFiles(btn){
         function caller(){
             //front
             if(recIds.length > 0){
-                v_recFiles(selected, recIds, type);
+                v_refreshFiles(selected, recIds, type);
                 if(deleted(selected)){
                     delete selected.data.deleteInfo;
                 }
@@ -1004,6 +1136,39 @@ function e_recFiles(btn){
     });
 }
 
+//点击单价、费率文件的清除操作(确认)
+function e_delFiles(btn){
+    btn.bind('click', function () {
+        let selected = gcTreeObj.tree.selected;//project
+        let delObjs = m_getFilesObjs($('[name = "fileItems"]:checked'));
+        let type = $('[name = "fileItems"]:checked').attr('fileType');
+        let delDatas = [];
+        let delIds = [];
+        for(let delObj of delObjs){
+            delIds.push(delObj.id);
+            delDatas.push({updateType: type, ID: delObj.id});
+        }
+        //此操作造成了建设项目的文件为空,则清除建设项目
+        if(fileWillEmpty(selected, delIds, type)){
+            delDatas.push({updateType: 'Project', ID: selected.data.ID});
+        }
+        if(delDatas.length > 0){
+            //backend
+            a_delGC(delDatas, caller);
+            //front
+            function caller(){
+                v_refreshFiles(selected, delIds, type);
+                if(fileEmpty(selected) && selected.children.length === 0){
+                    gcTreeObj.remove(selected);
+                }
+                else {
+                    gcTreeObj.refreshNodeData(selected);
+                }
+            }
+        }
+    });
+}
+
 //点击项目下的恢复操作(确认)
 function e_recProj(btn){
     btn.bind('click', function () {
@@ -1018,14 +1183,30 @@ function e_recProj(btn){
             let project = m_project(selected);
             if(project){
                 if(fileObj[fileType.unitPriceFile].length > 0){
-                    v_recFiles(project, fileObj[fileType.unitPriceFile], fileType.unitPriceFile);
+                    v_refreshFiles(project, fileObj[fileType.unitPriceFile], fileType.unitPriceFile);
                 }
                 if(fileObj[fileType.feeRateFile].length > 0){
-                    v_recFiles(project, fileObj[fileType.feeRateFile], fileType.feeRateFile);
+                    v_refreshFiles(project, fileObj[fileType.feeRateFile], fileType.feeRateFile);
                 }
             }
             v_removeNode(selected);
-            v_refreshNode(selected);
+            v_refreshNode(selected, true);
+        }
+    });
+}
+
+function e_delProj(btn){
+    btn.bind('click', function () {
+        let selected  = gcTreeObj.tree.selected;
+        //backend
+        let delDatas = m_getDelDatas(selected);
+        if(delDatas.length > 0){
+            a_delGC(delDatas, caller);
+        }
+        //front
+        function caller() {
+            v_removeNode(selected);
+            v_refreshNode(selected, false);
         }
     });
 }
@@ -1046,6 +1227,14 @@ function a_rec(nodes, callback){
     });
 }
 
+function a_delGC(delDatas, callback){
+    CommonAjax.post('/pm/api/delGC', {user_id: userID, delDatas: delDatas}, function(rstData){
+        if(callback){
+            callback();
+        }
+    })
+}
+
 //去除重名,回收站不处理重名,只保证恢复到项目管理中不出现重名
 function deWeightName(datas){
     let rst = [];
@@ -1114,6 +1303,26 @@ function fIsExist(files, id, type){
     return isExist;
 }
 
+//删除的文件是否会导致建设项目不再存有文件
+function fileWillEmpty(proj, delIds, type){
+    let ufs = proj.data.unitPriceFiles,
+        ffs = proj.data.feeRateFiles;
+    let theFiles = type === fileType.unitPriceFile ? ufs : ffs;
+        otherFiles = type === fileType.unitPriceFile ? ffs : ufs;
+    let uniqIds = Array.from(new Set(delIds));
+    if(theFiles.length === delIds.length){
+        for(let id of uniqIds){
+            if(!fIsExist(theFiles, id, type)){
+                return false;
+            }
+        }
+    }
+    if(otherFiles.length === 0){
+        return true;
+    }
+    return false;
+}
+
 function getRecFileObj(files){
     let rst = Object.create(null);
     let rst_UF = [], rst_FF = [];

+ 1 - 1
web/building_saas/pm/js/pm_newMain.js

@@ -362,7 +362,7 @@ const projTreeObj = {
                             $(".slide-sidebar").animate({width: "0"}).removeClass("open")// 关闭处理
                         }
                     });
-                }, 100);
+                }, 500);
             }
             //单项文件,进入造价书界面
             else if(node.data.projType === projectType.tender && withingClickArea()){