ソースを参照

update delete

zhangweicheng 7 年 前
コミット
027c653820

+ 101 - 23
modules/main/controllers/bills_controller.js

@@ -1,9 +1,15 @@
 /**
  * Created by jimiz on 2017/4/7.
  */
+let mongoose = require('mongoose');
 var billsData = require('../models/bills');
+let ration_model = require('../models/ration');
 let ProjectsData = require('../../pm/models/project_model').project;
 let logger = require("../../../logs/log_helper").logger;
+let quantity_detail = require("../facade/quantity_detail_facade");
+let ration_glj = mongoose.model('ration_glj');
+let ration_coe = mongoose.model('ration_coe');
+
 //统一回调函数
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
@@ -84,6 +90,8 @@ module.exports = {
             data = JSON.parse(data);
             let tasks = generateSingleDeleteTasks(data);
             let resultData= await billsData.model.bulkWrite(tasks);
+            //删除工程量明细
+            await quantity_detail.deleteByQuery({projectID: data.projectID, billID: data.ID}) ;
             result.data=resultData;
         }catch (err){
             logger.err(err);
@@ -91,41 +99,111 @@ module.exports = {
             result.message = err.message;
         }
         res.json(result);
+    },
+    multiDelete:async function(req, res){
+        let result={
+            error:0
+        };
+        try {
+            let data = req.body.data;
+            data = JSON.parse(data);
+            result.data=await doBillsOrRationsDelete(data);
+        }catch (err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
     }
 
 };
 
+async function doBillsOrRationsDelete(data) {
+    let billTask = [];
+    let deleteBillIDs = [];
+    let rationTask=[];
+    let deleteRationIDs=[];
+    let qd_query=null;
+    let sub_query=null;
+    if(data['bills']){
+        billTask = generateUpdateTasks(data['bills'],data.projectID,data.user_id);
+        for(let b_key in data['bills']){
+            if(data['bills'][b_key]===true){
+                deleteBillIDs.push(b_key+'');
+            }
+        }
+        if(deleteBillIDs.length>0){
+            qd_query={projectID: data.projectID, billID: {"$in": deleteBillIDs}};
+        }
+    }
+    if(data['ration']){
+        rationTask = generateUpdateTasks(data['ration'],data.projectID,data.user_id);
+        for(let r_key in data['ration']){
+            if(data['ration'][r_key]===true){
+                deleteRationIDs.push(r_key+'');
+            }
+        }
+        if(deleteRationIDs.length>0){
+            if(qd_query==null){//说明没删除清单
+                qd_query={projectID: data.projectID, rationID: {"$in": deleteRationIDs}};
+            }else {
+                qd_query={
+                    "$or":[
+                        {projectID: data.projectID, billID: {"$in": deleteBillIDs}},
+                        {projectID: data.projectID, rationID: {"$in": deleteRationIDs}}
+                    ]
+                }
+            }
+            sub_query={projectID: data.projectID, rationID: {"$in": deleteRationIDs}};
+        }
+    }
+    //先删除工程量明细
+    if(qd_query!=null){
+        await quantity_detail.deleteByQuery(qd_query) ;
+    }
+    if(sub_query!=null){
+        await ration_coe.deleteMany(sub_query);//删除附注条件
+        await ration_glj.deleteMany(sub_query);//删除定额工料机
+    }
+    if(rationTask.length>0){
+        await  ration_model.model.bulkWrite(rationTask);//删除定额
+    }
+    if(billTask.length>0){
+        await billsData.model.bulkWrite(billTask);//删除清单
+    }
+    return 'success';
+}
+
+
 
 function  generateSingleDeleteTasks(data) {
-    let tasks=[];
     let updateData = data.updateData;
+    updateData[data.ID]=true;
+    let tasks = generateUpdateTasks(updateData,data.projectID,data.user_id);
+    return tasks;
+}
+
+function  generateUpdateTasks(data,projectID,user_id) {
+    let tasks=[];
+    let updateData = data;
+    let deleteInfo={deleted: true, deleteDateTime: new Date(), deleteBy: user_id};
     for(let key in updateData){
-        if(updateData[key]==true){
-            let deleteInfo={deleted: true, deleteDateTime: new Date(), deleteBy: data.user_id};
-            let task={
-                updateOne:{
-                    filter:{
-                        ID:key,
-                        projectID:data.projectID
-                    },
-                    update:{
-                        deleteInfo:deleteInfo
-                    }
+        let task={
+            updateOne:{
+                filter:{
+                    ID:key,
+                    projectID:projectID
                 }
+            }
+        };
+        if(updateData[key]===true){
+            task.updateOne.update={
+                deleteInfo:deleteInfo
             };
-            tasks.push(task);
         }else {
-            let task={
-                updateOne:{
-                    filter:{
-                        ID:key,
-                        projectID:data.projectID
-                    },
-                    update:updateData[key]
-                }
-            };
-            tasks.push(task);
+            task.updateOne.update=updateData[key];
         }
+        tasks.push(task);
     }
     return tasks;
 }

+ 6 - 1
modules/main/facade/quantity_detail_facade.js

@@ -28,7 +28,8 @@ module.exports={
     updateRegex:updateRegex,
     insertRecode:insertRecode,
     deleteRecode:deleteRecode,
-    swapRow:swapRow
+    swapRow:swapRow,
+    deleteByQuery:deleteByQuery
 };
 
 let operationMap={
@@ -543,6 +544,10 @@ function deleteByBill(data) {
     }
 }
 
+async function deleteByQuery(query) {
+   return await  quantity_detail_model.deleteMany(query);
+}
+
 function quantityEditChecking(doc,type,functions) {
     if(doc.updateType == commonConsts.UT_UPDATE&&doc.updateData.hasOwnProperty('isFromDetail')&&doc.updateData.isFromDetail==0) {
         if(type=='bills'){

+ 3 - 1
modules/main/routes/bills_route.js

@@ -12,8 +12,10 @@ module.exports = function (app) {
     billsRouter.post('/updateCharacterContent', billsController.updateCharacterContent);//特征及内容更新 zhong 2017-9-1
     // 批量更新bill数据
     billsRouter.post('/updateBill', billsController.updateBill);
-    //按条件更新清单
+    //删除单个清单,不删除子项
     billsRouter.post('/singleDelete',billsController.singleDelete);
+    billsRouter.post('/multiDelete',billsController.multiDelete);
+
     app.use('/bills', billsRouter);
 };
 

+ 13 - 1
public/web/id_tree.js

@@ -558,6 +558,19 @@ var idTree = {
         };
 
         Tree.prototype.delete = function (node) {
+            var success = false;
+            success=this.cascadeRemove(node);
+            tools.sortTreeItems(this);
+            return success;
+        };
+        Tree.prototype.m_delete=function(nodes){
+            for(let node of nodes){
+                this.cascadeRemove(node);
+            }
+            tools.sortTreeItems(this);
+            return true;
+        };
+        Tree.prototype.cascadeRemove = function (node){
             var success = false, that = this;
             var deleteIdIndex = function (nodes) {
                 nodes.forEach(function (node) {
@@ -578,7 +591,6 @@ var idTree = {
                 } else {
                     this.roots.splice(node.siblingIndex(), 1);
                 }
-                tools.sortTreeItems(this);
                 success = true;
             }
             return success;

+ 16 - 0
public/web/tree_sheet/tree_sheet_controller.js

@@ -56,6 +56,22 @@ var TREE_SHEET_CONTROLLER = {
                 }
             }
         };
+        controller.prototype.m_delete = function (nodes) {//删除选中的多行节点
+            var that = this, sels = this.sheet.getSelections();
+            if (this.tree.selected) {
+                if (this.tree.m_delete(nodes)) {
+                    TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
+                        let rowCount = 0;
+                        for(let node of nodes){
+                            rowCount = rowCount+node.posterityCount() + 1;
+                        }
+                        that.sheet.deleteRows(sels[0].row, rowCount);
+                        that.setTreeSelected(that.tree.items[sels[0].row]);
+                    });
+                    cbTools.refreshFormulaNodes();
+                }
+            }
+        };
         controller.prototype.singleDelete = function () {//只删除当前节点,不删除子节点
             var that = this, sels = this.sheet.getSelections();
             if (this.tree.selected) {

+ 138 - 4
web/building_saas/main/js/models/bills.js

@@ -236,19 +236,19 @@ var Bills = {
             return this.tree.delete(node);
         };
 
-        bills.prototype.singleDeleteBills=function(node,controller){
+        bills.prototype.singleDeleteBills=function(node,controller){//只删除选中的分部,不删除其子项
             let updateData = {};
             let updateNode={};
+            let newParent=null;
             let me = this;
             if(node){
-                updateData[node.data.ID]=true;
                 if(node.children.length>0){//有子项
                     if(node.preSibling){//有前兄弟,则子项变成前兄弟的子项
                         if(node.preSibling.children.length>0){//前兄弟有子项,
                             let preNode = node.preSibling.children[node.preSibling.children.length-1];
                             updateData[preNode.data.ID]={
                                 NextSiblingID:node.children[0].data.ID
-                            }
+                            };
                             updateNode[preNode.data.ID] = preNode;
                         }
                         for(let i=0;i<node.children.length;i++){
@@ -257,6 +257,7 @@ var Bills = {
                             };
                             updateNode[node.children[i].data.ID]=node.children[i];
                         }
+                        newParent=node.preSibling;
                     }else {//没有前兄弟,则子项升一级
                         let parent = node.nextSibling.parent;
                         for(let i=0;i<node.children.length;i++){
@@ -272,10 +273,11 @@ var Bills = {
                             }
                             updateNode[node.children[i].data.ID]=node.children[i];
                         }
+                        newParent=parent;
                     }
                 }
                 $.bootstrapLoading.start();
-                CommonAjax.post("/bills/singleDelete", {updateData:updateData,projectID:node.data.projectID,user_id:userID}, function () {
+                CommonAjax.post("/bills/singleDelete", {updateData:updateData,projectID:node.data.projectID,user_id:userID,ID:node.data.ID}, function () {
                     controller.singleDelete();//删除树节点
                     me.tree.singleDelete(node);
                     //更新缓存
@@ -287,6 +289,7 @@ var Bills = {
                             updateNode[n_key].data[u_key] =updateDoc[u_key];
                         }
                     }
+                    project.calcProgram.calcAndSave(newParent);
                     $.bootstrapLoading.end();
                 }, function () {
                     $.bootstrapLoading.end();
@@ -481,6 +484,137 @@ var Bills = {
                 return false;
             }
         };
+        bills.prototype.calcEngineeringCostNode=function(controller){
+            let roots =  controller.tree.roots;
+            for(let root of roots){
+                if(project.Bills.isEngineeringCost(root)==true){
+                    project.calcProgram.calcAndSave(root);
+                    break;
+                }
+            }
+        };
+        bills.prototype.deleteSelectedNode=function(){//删除选中单行时的节点
+            let controller = projectObj.mainController, project = projectObj.project;
+            let selected = controller.tree.selected, parent = selected.parent;
+            if (selected) {
+                if (selected.sourceType === project.Bills.getSourceType()) {
+                    if (cbTools.isUsedByFormula(selected)){
+                        alert('该清单行被其它公式结点引用,不允许删除!');
+                        return;
+                    }
+                    project.Bills.deleteBills(selected.source);
+                    controller.delete();
+                } else if (selected.sourceType === project.Ration.getSourceType()) {
+                    project.Ration.delete(selected.source);
+                    controller.delete();
+                }else if(selected.sourceType==ModuleNames.ration_glj){
+                    project.ration_glj.updataOrdelete(selected.source);
+                }
+                if(parent){
+                    projectObj.converseCalculateBills(parent);
+                }else { //删除的是大项费用要重新计算工程造价节点
+                    project.Bills.calcEngineeringCostNode(controller);
+                }
+            }
+        };
+        bills.prototype.deleteSelectedNodes=function() {//删除选中多行时的节点
+            let controller = projectObj.mainController, project = projectObj.project;
+            let selected = controller.tree.selected, parent = selected.parent;
+            let me = this;
+            let idTreeMap = {};
+            let mainTreeMap = {};
+            let mainNodes = [];
+            let idTreeNodes=[];
+            let updateData={};
+            let selection = projectObj.mainSpread.getActiveSheet().getSelections()[0];
+            for(let i =0;i<selection.rowCount;i++){
+                let tem_node = controller.tree.items[selection.row+i];
+                if(i==0){//第一个直接添加;
+                    mainTreeMap[tem_node.getID()] = tem_node;
+                    mainNodes.push(tem_node);
+                    if(tem_node.sourceType == project.Bills.getSourceType()){
+                        idTreeMap[tem_node.source.getID()] = tem_node;
+                        idTreeNodes.push(tem_node);
+                    }
+                }else {
+                    this.setNodeToMapAndArray(tem_node,mainTreeMap,mainNodes);
+                    if(tem_node.sourceType == project.Bills.getSourceType()){
+                        this.setNodeToMapAndArray(tem_node,idTreeMap,idTreeNodes,true);
+                    }
+                }
+            }
+            let updateNodes = [];//需要删除的所有节点;
+            let billsUpdate={};
+            let rationUpdate = {};
+            let updateBill = false;
+            let updateRation = false;
+            for(let m_node of mainNodes){
+                if(m_node.sourceType == project.Bills.getSourceType()){
+                    if(m_node.preSibling){
+                        billsUpdate[m_node.preSibling.data.ID] = {
+                            NextSiblingID:m_node.nextSibling?m_node.nextSibling.data.ID:-1
+                        };
+                        updateBill=true;
+                    }
+                }
+                updateNodes.push(m_node);
+                controller.tree.getAllSubNode(m_node,updateNodes);
+            }
+            for(let u_node of updateNodes){
+                if(u_node.sourceType == project.Bills.getSourceType()){
+                    billsUpdate[u_node.data.ID] = true;
+                    updateBill=true;
+                }
+                if(u_node.sourceType == project.Ration.getSourceType()){
+                    rationUpdate[u_node.data.ID] = true;
+                    updateRation = true;
+                }
+            }
+            updateBill==true?updateData['bills']=billsUpdate:'';
+            updateRation==true?updateData['ration']=rationUpdate:'';
+            updateData.projectID = selected.data.projectID;
+            updateData.user_id = userID;
+            $.bootstrapLoading.start();
+            CommonAjax.post("/bills/multiDelete", updateData, function () {
+                controller.m_delete(mainNodes);//删除树节点
+                me.tree.m_delete(idTreeNodes);
+
+              /*  //更新缓存
+                console.log(updateNode);
+                _.remove(me.datas,{'ID':node.data.ID});
+                for(let n_key in updateNode){
+                    let updateDoc =  updateData[n_key];
+                    for(let u_key in updateDoc){
+                        updateNode[n_key].data[u_key] =updateDoc[u_key];
+                    }
+                }
+                project.calcProgram.calcAndSave(newParent);*/
+                $.bootstrapLoading.end();
+            }, function () {
+                $.bootstrapLoading.end();
+            });
+
+
+
+        };
+        bills.prototype.setNodeToMapAndArray=function (node,map,array,billType) {
+            let nodeID = billType ==true?node.source.getID():node.getID();
+            if(map[nodeID]==undefined||map[nodeID]==null){
+                newMap(node,node.parent,map,array)
+            }
+            function newMap(node,parent,map,array) {
+                let nodeID = billType ==true?node.source.getID():node.getID();
+                if(parent==null){//说明已经是最顶层了
+                    map[nodeID]=node;
+                    array.push(node);
+                }else {
+                    let parentID = billType == true?parent.source.getID():parent.getID();
+                    if(map[parentID]==undefined||map[parentID]==null){
+                        newMap(node,parent.parent,map,array);
+                    }
+                }
+            }
+        };
         return new bills(project);
     }
 };

+ 23 - 3
web/building_saas/main/js/models/cache_tree.js

@@ -363,6 +363,12 @@ var cacheTree = {
         };
         Tree.prototype.delete = function (node) {
             var success = false;
+            success=this.cascadeRemove(node);
+            this.sortTreeItems();
+            return success;
+        };
+        Tree.prototype.cascadeRemove = function (node) {
+            var success = false;
             var me = this;
             var removeNodes = function (node) {
                 delete me.nodes[me.prefix + node.getID()];
@@ -382,11 +388,19 @@ var cacheTree = {
                 } else {
                     this.roots.splice(node.siblingIndex(), 1);
                 }
-                this.sortTreeItems();
                 success = true;
             }
             return success;
         };
+
+        Tree.prototype.m_delete = function (nodes) {//删除多个节点,级联删除
+            for(let node of nodes){
+                this.cascadeRemove(node);
+            }
+            this.sortTreeItems();
+            return true;
+        };
+
         Tree.prototype.singleDelete = function (node) {//只删除当前节点,不删除子节点
             var success = false;
             var me = this;
@@ -415,9 +429,15 @@ var cacheTree = {
                     success = true;
                 }
             }
-            return success;
-
+            return success
+        };
+        Tree.prototype.getAllSubNode = function (node,nodeArray) {
+          for(let c of node.children){
+              nodeArray.push(c);
+              this.getAllSubNode(c,nodeArray);
+          }
         };
+        
         return new Tree(owner);
     }
 };

+ 73 - 62
web/building_saas/main/js/views/project_view.js

@@ -63,13 +63,14 @@ var projectObj = {
                 return false;
             }
         };
-        let canDelete = function (node) {
-            if (selected) {
-                if (selected.sourceType === that.project.Bills.getSourceType()) {
-                    if(selected.data.type == billType.DXFY&&selected.data.isAdd!=1){//如果
+        let canDelete = function (node,m_selection) {
+            if (node) {
+                if (node.sourceType === that.project.Bills.getSourceType()) {
+                    if(node.data.type == billType.DXFY&&node.data.isAdd!=1){
                         return false;
                     }
-                }if(selected.sourceType === that.project.ration_glj.getSourceType()){
+                }
+                if(m_selection!=true&&node.sourceType === that.project.ration_glj.getSourceType()){//多选的时候不做这一项判断
                     return false;
                 }
                 return true;
@@ -77,11 +78,29 @@ var projectObj = {
                 return false;
             }
         };
+        let canDelete_m = function (selection) {
+            for(let i =0;i<selection.rowCount;i++){
+                if(i==0&&tree.items[selection.row].sourceType === that.project.ration_glj.getSourceType()){
+                    return false
+                }
+                if(canDelete(tree.items[selection.row+i],true)==false){
+                    return false
+                }
+            }
+            return true
+        };
+
+        let selections = projectObj.mainSpread.getActiveSheet().getSelections();
+        if(selections[0].rowCount==1){//选中单行
+            setButtonValid(canDelete(selected), $('#delete'));
+        }else {
+            setButtonValid(canDelete_m(selections[0]), $('#delete'));
+        }
         setButtonValid(canUpLevel(selected), $('#upLevel'));
         setButtonValid(canDownLevel(selected), $('#downLevel'));
         setButtonValid(selected && (selected.depth() > 0) && selected.canUpMove(), $('#upMove'));
         setButtonValid(selected && (selected.depth() > 0) && selected.canDownMove(), $('#downMove'));
-        setButtonValid(canDelete(selected), $('#delete'));
+
     },
     checkCommonField: function (editingText, colSetting) {
         let value;
@@ -662,21 +681,7 @@ var projectObj = {
                         return !selected;
                     },
                     callback: function () {
-                        var selected = controller.tree.selected, parent = selected.parent;
-                        if (selected) {
-                            if (selected.sourceType === project.Bills.getSourceType()) {
-                                if (cbTools.isUsedByFormula(selected)){
-                                    alert('该清单行被其它公式结点引用,不允许删除!');
-                                    return;
-                                };
-                                project.Bills.deleteBills(selected.source);
-                                controller.delete();
-                            } else if (selected.sourceType === project.Ration.getSourceType()) {
-                                project.Ration.delete(selected.source);
-                                controller.delete();
-                            };
-                            projectObj.converseCalculateBills(parent);
-                        }
+                        $("#delete_row").modal({show:true});//弹出删除提示框;
                     }
                 },
                 "spr2":'--------',
@@ -1040,51 +1045,57 @@ $('#delete_row').on('shown.bs.modal', function (e) {
     var showinfo = "确认要删除当前选中行吗?";
     var showN = false;
     var cancelText = "否";
-    if(selected.sourceType == project.Bills.getSourceType()&&selected.data.type==billType.FB&&selected.children.length>0){
-         showinfo = "是否删除其下的子项?";
-         showN = true;
-         cancelText = "取消";
+    if(selected.sourceType == project.Bills.getSourceType()&&selected.data.type==billType.FB&&selected.children.length>0){//选中的是分部,并且有子项
+        if(isSingleSelect()||selectionChecking()){
+            showinfo = "是否删除其下的子项?";
+            showN = true;
+            cancelText = "取消";
+        }
     }
     $('#delete_showinfo').text(showinfo);
     showN==true? $('#deleteN').show():$('#deleteN').hide();
     $('#deleteCancel').text(cancelText);
+
+    function selectionChecking() {
+        let selection = projectObj.mainSpread.getActiveSheet().getSelections()[0];
+        let mainTreeMap = {};
+        for(let i =0;i<selection.rowCount;i++){
+            let tem_node = controller.tree.items[selection.row+i];
+            if(i==0){//第一个直接添加;
+                mainTreeMap[tem_node.getID()] = tem_node;
+            }else {
+                project.Bills.setNodeToMap(tem_node,mainTreeMap);
+            }
+        }
+        let nodes = changeMapToArray(mainTreeMap);
+        if(nodes.length==1){
+            return true
+        }
+        return false;
+    }
 });
 
+function changeMapToArray(map) {
+    let newArray = [];
+    for(let key in map){
+        newArray.push(map[key]);
+    }
+    return newArray;
+}
+
+
 $('#deleteY').click(function () { //正常删除,级联删除子项
-     let controller = projectObj.mainController, project = projectObj.project;
-     let selected = controller.tree.selected, parent = selected.parent;
-     if (selected) {
-         if (selected.sourceType === project.Bills.getSourceType()) {
-             if (cbTools.isUsedByFormula(selected)){
-                 alert('该清单行被其它公式结点引用,不允许删除!');
-                 return;
-             }
-             project.Bills.deleteBills(selected.source);
-             controller.delete();
-         } else if (selected.sourceType === project.Ration.getSourceType()) {
-             project.Ration.delete(selected.source);
-             controller.delete();
-         }else if(selected.sourceType==ModuleNames.ration_glj){
-            project.ration_glj.updataOrdelete(selected.source);
-         }
-         if(parent){
-             projectObj.converseCalculateBills(parent);
-         }else { //删除的是大项费用要重新计算工程造价节点
-             let roots =  controller.tree.roots;
-             for(let root of roots){
-                 if(project.Bills.isEngineeringCost(root)==true){
-                     project.calcProgram.calcAndSave(root);
-                     break;
-                 }
-             }
-         }
-     }
+    let project = projectObj.project;
+    if(isSingleSelect()){
+        project.Bills.deleteSelectedNode();
+    }else {
+        project.Bills.deleteSelectedNodes();
+    }
 });
 
 $('#deleteN').click(function () {//不删除子项
     let controller = projectObj.mainController, project = projectObj.project;
     let selected = controller.tree.selected, parent = selected.parent;
-    let updateData = {};
     if(selected){
         let preNode = selected.preSibling;
         let nextNode = selected.nextSibling;
@@ -1100,13 +1111,13 @@ $('#deleteN').click(function () {//不删除子项
             }
         }
         project.Bills.singleDeleteBills(selected,controller);
-
-
     }
+});
 
-
-
-
-
-
-});
+function isSingleSelect() {//是否选中造价书中的单行
+    let selections = projectObj.mainSpread.getActiveSheet().getSelections();
+    if(selections[0].rowCount==1){
+        return true;
+    }
+    return false;
+}