浏览代码

单项删除

zhangweicheng 7 年之前
父节点
当前提交
1ac73ba71d

+ 54 - 1
modules/main/controllers/bills_controller.js

@@ -3,6 +3,7 @@
  */
 var billsData = require('../models/bills');
 let ProjectsData = require('../../pm/models/project_model').project;
+let logger = require("../../../logs/log_helper").logger;
 //统一回调函数
 var callback = function(req, res, err, message, data){
     res.json({error: err, message: message, data: data});
@@ -73,6 +74,58 @@ module.exports = {
         const message = !result || !projectResult ? '修改失败' : '修改成功';
         const err = !result || !projectResult ? 1 : 0;
         callback(request, response, err, message, null);
+    },
+    singleDelete:async function(req, res){
+        let result={
+            error:0
+        }
+        try {
+            let data = req.body.data;
+            data = JSON.parse(data);
+            let tasks = generateSingleDeleteTasks(data);
+            let resultData= await billsData.model.bulkWrite(tasks);
+            result.data=resultData;
+        }catch (err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        res.json(result);
     }
 
-};
+};
+
+
+function  generateSingleDeleteTasks(data) {
+    let tasks=[];
+    let updateData = data.updateData;
+    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
+                    }
+                }
+            };
+            tasks.push(task);
+        }else {
+            let task={
+                updateOne:{
+                    filter:{
+                        ID:key,
+                        projectID:data.projectID
+                    },
+                    update:updateData[key]
+                }
+            };
+            tasks.push(task);
+        }
+    }
+    return tasks;
+}

+ 2 - 0
modules/main/routes/bills_route.js

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

+ 1 - 1
modules/ration_glj/facade/glj_calculate_facade.js

@@ -110,7 +110,7 @@ async function calculateQuantityPerGLJ(glj,index,coeList,assList,adjustState,noN
                 result.doc.customQuantity = glj.customQuantity;
             }
             let customerCoe = _.last(coeList);
-            if(customerCoe.isAdjust==1){
+            if(customerCoe&&customerCoe.isAdjust==1){
                 quantity = calculateQuantityByCustomerCoes(quantity,customerCoe,glj);
             }
             result.doc.quantity =scMathUtil.roundToString(quantity,decimal);

+ 30 - 0
public/web/id_tree.js

@@ -583,6 +583,36 @@ var idTree = {
             }
             return success;
         };
+        Tree.prototype.singleDelete = function (node) {//删除本身不删除子项
+            let that = this;
+            let success = false;
+            delete that.nodes[that.prefix + node.getID()];//删除本身
+            if(node.children.length>0){
+                if(node.preSibling){//子项变成前兄弟的子项
+                    for(let c of node.children){
+                        node.preSibling.addChild(c);
+                    }
+                }else if(node.nextSibling){//没有前兄弟,有后兄弟
+                    let oldChild = node.parent.children;
+                    node.parent.children = [];
+                    for(let c of node.children){
+                        node.parent.addChild(c);
+                    }
+                    for(let oc of oldChild){
+                        node.parent.addChild(oc);
+                    }
+                }else {//都没有的情况
+                    for(let c of node.children){
+                        node.parent.addChild(c);
+                    }
+                }
+                tools.sortTreeItems(this);
+                success = true;
+            }
+            return success;
+        };
+
+
         Tree.prototype.getDeleteData = function (node) {
             var data = [];
             var addUpdateDataForDelete = function (datas, nodes) {

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

@@ -54,6 +54,18 @@ var TREE_SHEET_CONTROLLER = {
                 }
             }
         };
+        controller.prototype.singleDelete = function () {//只删除当前节点,不删除子节点
+            var that = this, sels = this.sheet.getSelections();
+            if (this.tree.selected) {
+                if (this.tree.singleDelete(this.tree.selected)) {
+                    TREE_SHEET_HELPER.massOperationSheet(this.sheet, function () {
+                        that.sheet.deleteRows(sels[0].row,1);
+                        that.setTreeSelected(that.tree.items[sels[0].row]);
+                    });
+                }
+            }
+        };
+
         controller.prototype.deleteNode = function (node,next) {
             var that = this;
             if (node){

+ 25 - 0
web/building_saas/main/html/main.html

@@ -764,6 +764,31 @@
             </div>
         </div>
     </div>
+
+    <!--弹出 是否删除所选行窗口-->
+    <div class="modal fade" id="delete_row" 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">
+                    <div class="form-group">
+                        <label id="delete_showinfo">确认要删除当前选中行吗?</label>
+                    </div>
+                </div>
+                <div class="modal-footer" style="justify-content: center">
+                    <button type="button" class="btn btn-primary"  data-dismiss="modal" id="deleteY" >是</button>
+                    <button type="button" class="btn btn-primary"  data-dismiss="modal" id="deleteN" >否</button>
+                    <button type="button" class="btn btn-secondary" data-dismiss="modal" id="deleteCancel">取消</button>
+                </div>
+            </div>
+        </div>
+    </div>
+
         <!-- JS. -->
         <script type="text/javascript" src="/lib/spreadjs/sheets/gc.spread.sheets.all.10.0.1.min.js"></script>
 

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

@@ -236,6 +236,64 @@ var Bills = {
             return this.tree.delete(node);
         };
 
+        bills.prototype.singleDeleteBills=function(node,controller){
+            let updateData = {};
+            let updateNode={};
+            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++){
+                            updateData[node.children[i].data.ID]={
+                                ParentID:node.preSibling.data.ID
+                            };
+                            updateNode[node.children[i].data.ID]=node.children[i];
+                        }
+                    }else {//没有前兄弟,则子项升一级
+                        let parent = node.nextSibling.parent;
+                        for(let i=0;i<node.children.length;i++){
+                            if(i == node.children.length-1&&node.nextSibling){//最后一个子项,在有后兄弟的情况下,作为后兄弟的前兄弟
+                                updateData[node.children[i].data.ID]={
+                                    ParentID:parent.data.ID,
+                                    NextSiblingID:node.nextSibling.data.ID
+                                };
+                            }else {
+                                updateData[node.children[i].data.ID]={
+                                    ParentID:parent.data.ID
+                                };
+                            }
+                            updateNode[node.children[i].data.ID]=node.children[i];
+                        }
+                    }
+                }
+                $.bootstrapLoading.start();
+                CommonAjax.post("/bills/singleDelete", {updateData:updateData,projectID:node.data.projectID,user_id:userID}, function () {
+                    controller.singleDelete();//删除树节点
+                    me.tree.singleDelete(node);
+                    //更新缓存
+                    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];
+                        }
+                    }
+                    $.bootstrapLoading.end();
+                }, function () {
+                    $.bootstrapLoading.end();
+                });
+            }
+
+        };
         bills.prototype.upMoveBills = function (node) {
             var upMoveData = node.getUpMoveData();
             project.pushNow('upMoveBills', this.getSourceType(), tools.coverseTreeUpdateData(upMoveData, this.project.ID()));
@@ -403,17 +461,24 @@ var Bills = {
         };
         bills.prototype.getRootNode = function (node) {
             if(node.parent){
-                return this.getRootNode(node.parent)
+                return this.getRootNode(node.parent);
             }else {
-                return node
+                return node;
             }
         };
         bills.prototype.isFBFX = function (node) {//判读是否属于分部分项
            let rootNode = this.getRootNode(node);
             if(isFlag(rootNode.data)&&rootNode.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){
-                return true
+                return true;
+            }else {
+                return false;
+            }
+        };
+        bills.prototype.isEngineeringCost = function (node) {//判断这个节点是否是工程造价节点
+            if(isFlag(node.data)&&node.data.flagsIndex.fixed.flag==fixedFlag.ENGINEERINGCOST){
+                return true;
             }else {
-                return false
+                return false;
             }
         };
         return new bills(project);

+ 39 - 1
web/building_saas/main/js/models/cache_tree.js

@@ -363,8 +363,15 @@ var cacheTree = {
         };
         Tree.prototype.delete = function (node) {
             var success = false;
+            var me = this;
+            var removeNodes = function (node) {
+                delete me.nodes[me.prefix + node.getID()];
+                for(let ch of node.children){
+                    removeNodes(ch);
+                }
+            };
             if (node) {
-                delete this.nodes[this.prefix + node.getID()];
+                removeNodes(node);
                 if (node.preSibling) {
                     node.preSibling.setNextSibling(node.nextSibling);
                 } else if (node.nextSibling) {
@@ -380,6 +387,37 @@ var cacheTree = {
             }
             return success;
         };
+        Tree.prototype.singleDelete = function (node) {//只删除当前节点,不删除子节点
+            var success = false;
+            var me = this;
+            if(node){
+                delete me.nodes[me.prefix + node.getID()];
+                if(node.children.length>0){
+                    if(node.preSibling){//子项变成前兄弟的子项
+                        for(let c of node.children){
+                            node.preSibling.addChild(c);
+                        }
+                    }else if(node.nextSibling){//没有前兄弟,有后兄弟
+                        let oldChild = node.parent.children;
+                        node.parent.children = [];
+                        for(let c of node.children){
+                            node.parent.addChild(c);
+                        }
+                        for(let oc of oldChild){
+                            node.parent.addChild(oc);
+                        }
+                    }else {//都没有的情况
+                        for(let c of node.children){
+                            node.parent.addChild(c);
+                        }
+                    }
+                    this.sortTreeItems();
+                    success = true;
+                }
+            }
+            return success;
+
+        };
         return new Tree(owner);
     }
 };

+ 83 - 25
web/building_saas/main/js/views/project_view.js

@@ -66,9 +66,11 @@ var projectObj = {
         let canDelete = function (node) {
             if (selected) {
                 if (selected.sourceType === that.project.Bills.getSourceType()) {
-                    if(selected.data.type == billType.DXFY&&selected.data.isAdd!=1){
+                    if(selected.data.type == billType.DXFY&&selected.data.isAdd!=1){//如果
                         return false;
                     }
+                }if(selected.sourceType === that.project.ration_glj.getSourceType()){
+                    return false;
                 }
                 return true;
             } else {
@@ -713,7 +715,7 @@ var projectObj = {
             calc = null;
         }*/
         projectObj.project.calcProgram.calcAndSave(node);
-    },
+},
     // 计算全部清单
 /*    calculateAll: function () {
         let calc = new BillsCalcHelper(this.project);
@@ -840,29 +842,7 @@ $('#insert').click(function () {
     cbTools.refreshFormulaNodes();
 });
 $('#delete').click(function () {
-    var controller = projectObj.mainController, project = projectObj.project;
-    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();
-        }else if(selected.sourceType==ModuleNames.ration_glj){
-            project.ration_glj.updataOrdelete(selected.source);
-        };
-        if(parent){
-            projectObj.converseCalculateBills(parent);
-        }
-    };
-
-    cbTools.refreshFormulaNodes();
+    $("#delete_row").modal({show:true});//弹出删除提示框;
 });
 $('#upLevel').click(function () {
     var controller = projectObj.mainController, project = projectObj.project;
@@ -1061,3 +1041,81 @@ $('#property_ok').click(function () {
         });
     }
 });
+
+$('#delete_row').on('shown.bs.modal', function (e) {
+    var controller = projectObj.mainController, project = projectObj.project;
+    var selected = controller.tree.selected, parent = selected.parent;
+    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 = "取消";
+    }
+    $('#delete_showinfo').text(showinfo);
+    showN==true? $('#deleteN').show():$('#deleteN').hide();
+    $('#deleteCancel').text(cancelText);
+});
+
+$('#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;
+                 }
+             }
+         }
+     }
+     cbTools.refreshFormulaNodes();
+});
+
+$('#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;
+        if(preNode){//有前兄弟
+            if(preNode.children.length>0&&preNode.children[0].data.type != selected.children[0].data.type){//并且前兄弟子项和焦点行子项类别不同。
+                alert("删除分部会导致分部和分项同级,不允许该操作!");
+                return;
+            }
+        }else if(nextNode){
+            if(nextNode.data.type != selected.children[0].data.type){
+                alert("删除分部会导致分部和分项同级,不允许该操作! ");
+                return;
+            }
+        }
+        project.Bills.singleDeleteBills(selected,controller);
+
+
+    }
+
+
+
+
+
+
+});