Bläddra i källkod

feat: 定位在分项时,允许右键“插入分部”。

zhangweicheng 4 år sedan
förälder
incheckning
b143eb7b9e

+ 0 - 1
web/building_saas/main/js/controllers/block_controller.js

@@ -4,7 +4,6 @@
 let BlockController = {
     datas:[],
     disabelCopyRightClick:function(){
-        console.log("right clicked")
         if (projectReadOnly) {
             return true;
         }

+ 40 - 2
web/building_saas/main/js/controllers/project_controller.js

@@ -216,9 +216,9 @@ ProjectController = {
         if (!project || !sheetController) { return null; }
         this.addSpecialBill(project, sheetController,null, project.mainTree.selected.nextSibling,true,billType.DXFY);
     },
-    addFB:function(project, sheetController) {//添加分部
+    addFB:function(project, sheetController,node) {//添加分部
         if (!project || !sheetController) { return null; }
-        let selected = project.mainTree.selected;
+        let selected =node|| project.mainTree.selected;
         if(selected.parent==null&&isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){//选中的是分部分项,则插入做为最后一个子项
             return this.addSpecialBill(project, sheetController,selected, null,true,billType.FB);
         }
@@ -227,6 +227,44 @@ ProjectController = {
         }
 
     },
+    addFXParent:async function(node){
+        let datas = [];
+        //let parent = node.parent.parent;
+        let newBills = {
+            'ID':uuid.v1(),
+            'isAdd':1,
+            'type':billType.FB,
+            'projectID':node.data.projectID
+        }
+        if(node.preSibling){//有前兄弟 在当前分项和前兄弟中间新增一行“分部”空行,空行作为分项的父项,原父项变为空行的前兄弟。
+            let changeParent = false;
+            newBills.ParentID = node.parent.parent?node.parent.parent.getID():-1;
+            newBills.NextSiblingID = node.parent.data.NextSiblingID;
+            datas.push({type:ModuleNames.bills,data:newBills,action:"add",preSiblingID:node.parent.data.ID});
+            datas.push({type:ModuleNames.bills,data:{'ID':node.parent.getID(),'NextSiblingID':newBills.ID}})
+            for(let c of node.parent.children){
+                if(c.data.ID == node.data.ID) changeParent = true
+                if(changeParent) datas.push({type:ModuleNames.bills,data:{'ID':c.getID(),'ParentID':newBills.ID}})
+            }
+
+        }else{//没有前兄弟,在当前分项和父项中间新增一行“分部”空行,空行作为分项的父项,原父项变为空行的父项。当前分项/补项的所有兄弟都跟着移动。
+            newBills.ParentID = node.parent.getID();
+            newBills.NextSiblingID = -1;
+            datas.push({type:ModuleNames.bills,data:newBills,action:"add"});
+            for(let c of node.parent.children){
+                datas.push({type:ModuleNames.bills,data:{'ID':c.getID(),'ParentID':newBills.ID}})
+            }
+        }
+        if(datas.length > 0){
+             let nodes = await projectObj.project.syncUpdateNodesAndRefresh(datas);
+             //重新计算
+            cbTools.refreshFormulaNodes();
+            projectObj.project.calcProgram.calcNodesAndSave(nodes);
+            projectObj.mainController.setTreeSelected(projectObj.project.mainTree.getNodeByID(newBills.ID));
+        }
+
+    },
+
     addFX:function(project, sheetController) {//添加分项
         if (!project || !sheetController) { return null; }
         let selected = project.mainTree.selected;

+ 39 - 6
web/building_saas/main/js/models/project.js

@@ -1,3 +1,4 @@
+
 /**
  * Created by Mai on 2017/4/1.
  */
@@ -542,10 +543,19 @@ var PROJECT = {
             })
         };
 
+        project.prototype.updateParentNode = function(node,parentID,addNodeDatas){
+            addNodeDatas.push({type:node.sourceType,data:node.data,parentID:parentID});
+            for(let c of node.children){
+                this.updateParentNode(c,node.getID(),addNodeDatas);
+            }
+            
+        };
+
         project.prototype.updateNodesCache =function (datas) {
             let refreshNode = [];
             let reclacQuantity = false;
             let deleteNode=[],addNodeDatas=[];
+            let changeParentIDMap = {};
             for(let d of datas){
                 let temObj = null;
                 if(d.type == ModuleNames.bills || d.type == ModuleNames.ration){//如果是树节点类型,直接取树节点更新
@@ -567,6 +577,12 @@ var PROJECT = {
                                 temObj = temNode.data;
                                 if(gljUtil.isDef(d.data.quantity))reclacQuantity = true;
                                 refreshNode.push(temNode);
+                                if(d.data.ParentID){//更新了父节点-相当于删了再添加
+                                    changeParentIDMap[temNode.data.ParentID] = true;
+                                   deleteNode.push(temNode);
+                                   this.updateParentNode(temNode,d.data.ParentID,addNodeDatas);
+                                } 
+
                             }
                         }
                     }
@@ -590,22 +606,38 @@ var PROJECT = {
 
             //对树节点的操作并删除、添加清单、删除添加定额、删除对应的定额工料机缓存
             TREE_SHEET_HELPER.massOperationSheet(projectObj.mainController.sheet, function () {
-                deleteTreeNodes(deleteNode);
-                addNewNodes(addNodeDatas,refreshNode);
+                let rationsDatas=[];
+                let billsDatas=[];
+                for(let a of addNodeDatas){
+                    if(a.type == ModuleNames.bills)  billsDatas.push(a);
+                    if(a.type == ModuleNames.ration)  rationsDatas.push(a);
+                }
+                deleteTreeNodes(deleteNode);     
+                addNewNodes(billsDatas,refreshNode);
+                addNewNodes(rationsDatas,refreshNode);
             });
 
+            for(let pID in changeParentIDMap){
+              let pnode =  this.mainTree.getNodeByID(pID);
+              getNextRefreshNode(pnode,refreshNode);
+            }
 
             if(reclacQuantity) this.projectGLJ.calcQuantity();
             return refreshNode;
 
 
-
+            function getNextRefreshNode(node,refreshNode){
+                if(node.nextSibling){
+                    refreshNode.push(node.nextSibling)
+                    getNextRefreshNode(node.nextSibling,refreshNode)
+                } 
+            };
 
             function deleteTreeNodes(deleteNodes) {
                 let controller = projectObj.mainController, project = projectObj.project;
                 let Bill = project.Bills, Ration = project.Ration;
                 for(let rd of deleteNodes){
-                    controller.sheet.deleteRows(rd.serialNo(),1);
+                    controller.sheet.deleteRows(rd.serialNo(),rd.posterityCount + 1);
                     controller.tree.delete(rd);
                     if(rd.sourceType == Bill.getSourceType()) Bill.tree.delete(rd.source);
                 }
@@ -616,11 +648,12 @@ var PROJECT = {
                 let newAddNode = [];
                 for(let nr of newDatas){
                     let nextID = -1;
+                    let parentID = nr.parentID || (nr.data && nr.data.ParentID || -1);
                     let preNode = projectObj.project.mainTree.getNodeByID(nr.preSiblingID);
                     if(preNode) nextID = preNode.getNextSiblingID();
-                    let newNode = projectObj.project.mainTree.insert(nr.parentID, nextID, nr.data.ID);
+                    let newNode = projectObj.project.mainTree.insert(parentID, nextID, nr.data.ID);
                     if(nr.type == ModuleNames.bills){
-                        let newSource = Bill.tree.insertByData(nr.data, nr.ParentID, nextID, true);
+                        let newSource = Bill.tree.insertByData(nr.data, parentID, nextID, true);
                         newNode.source = newSource;
                     }else {
                         newNode.source = nr.data;

+ 4 - 3
web/building_saas/main/js/models/ration.js

@@ -539,10 +539,10 @@ var Ration = {
                 updateBillsOprRation();
             }
         };
-        ration.prototype.insertVolumePrice = function(type){
+        ration.prototype.insertVolumePrice = function(type,ext){
             this.addNewRation(null,rationType.volumePrice,function (newNode) {//插入人工不需要自动定位到编号列
                 projectObj.selectColAndFocus(newNode,null);
-            },true,type);
+            },true,type,true,ext);
         };
         // 已经有数据,更新前端缓存及节点,不进行通信
         ration.prototype.addNewDataSimply = function (newData) {
@@ -570,7 +570,7 @@ var Ration = {
                 projectObj.project.ration_glj.deleteByRation(node.data);
             });
         };
-        ration.prototype.addNewRation = function (itemQuery,rationType,callback=null,isEmpty=false,priceType,needCalcAndSave=true) {//priceType 是量价类型
+        ration.prototype.addNewRation = function (itemQuery,rationType,callback=null,isEmpty=false,priceType,needCalcAndSave=true,ext) {//priceType 是量价类型
             console.log('addNewRation');
             let me = this;
             let project = projectObj.project, sheetController = projectObj.mainController;
@@ -617,6 +617,7 @@ var Ration = {
                     let billsNode = project.mainTree.getNodeByID(billItemID);
                     needInstall = project.Bills.isFBFX(billsNode);//在分部分项插入的定额才需要定额安装增加费
                 }
+                if(ext) gljUtil.setProperty(newData,ext);
                 $.bootstrapLoading.start();
                 CommonAjax.post("/ration/addNewRation",{projectID:me.project.ID(),itemQuery:itemQuery,newData:newData,defaultLibID: rationLibObj.getDefaultStdRationLibID(),calQuantity:calQuantity,brUpdate:brUpdate,needInstall:needInstall},function (data) {
                     //更新缓存

+ 36 - 3
web/building_saas/main/js/views/project_view.js

@@ -1273,7 +1273,7 @@ var projectObj = {
                     newData.push({ itemQuery: null, rationType: rationType.ration });
                 }
                 await project.Ration.addMultiRation(newData);
-                projectObj.setActiveCell('quantity', true);
+                projectObj.setActiveCell('code', true);
             } catch (err) {
                 console.log(err);
                 if (!$('hintBox_form').is(':visible')) {
@@ -1322,6 +1322,14 @@ var projectObj = {
                             if(selected.data.type==billType.FB){
                                 return false;
                             }
+                            if(selected.data.type==billType.FX ||  selected.data.type==billType.BX){// 当前定位在分项(包括补项),
+                                if(selected.preSibling){//判断分项有无前兄弟?
+                                    //有,则判断父项的类型是什么,是分部,右键有效显示,点击则按②执行。
+                                   return selected.parent.data.type!==billType.FB
+                                }
+                                return false;// 无,右键有效显示,
+                            }
+
                             if(isFlag(selected.data)&&selected.data.flagsIndex.fixed.flag==fixedFlag.SUB_ENGINERRING){//焦点行是分部分项工程
                                 if(selected.children.length>0){
                                     return selected.children[0].data.type==billType.FX ||selected.children[0].data.type==billType.BX;//焦点行是分部分项工程,且子项是分项或补项
@@ -1333,8 +1341,15 @@ var projectObj = {
                         return true;//除了清单,其它类型都只读
                     },
                     callback: function (key, opt) {
-                        ProjectController.addFB(project, controller);
-                        projectObj.selectColAndFocus(project.mainTree.selected);
+                        let selected = project.mainTree.selected;
+                        if(selected.data.type==billType.FX || selected.data.type==billType.BX){
+                             //添加成分项的父亲
+                             ProjectController.addFXParent(selected);   
+                        }else{//正常添加分部
+                            ProjectController.addFB(project, controller);
+                            projectObj.selectColAndFocus(project.mainTree.selected);
+                        }
+                       
                     },
                     visible: function(key, opt){
                         if(project.mainTree.selected){
@@ -1500,6 +1515,24 @@ var projectObj = {
                         return true;
                     }
                 },
+                "insertMainMaterial": {
+                    name: "按清单名称插入主材",//插入量价不需要自动定位到编号列
+                    icon: 'fa-sign-in',
+                    disabled: function () {
+                        if (projectReadOnly) {
+                            return true;
+                        }
+                        return !project.Ration.canAdd(project.mainTree.selected);
+                    },
+                    callback: function (key, opt) {
+                        //名称取清单名称,单位取清单单位
+                        let selected = project.mainTree.selected;
+                        let billNode = selected;
+                        if(selected.sourceType==project.Ration.getSourceType()) billNode = selected.parent;
+                        let ext = {name:billNode.data.name,unit:billNode.data.unit};
+                        project.Ration.insertVolumePrice(gljType.MAIN_MATERIAL,ext);
+                    },
+                },
                 "spr2": '--------',
                 "calc_installation_fee": {
                     name: "计取安装费用",