浏览代码

Merge branch 'master' of http://smartcost.f3322.net:3000/SmartCost/ConstructionCost

zhongzewei 7 年之前
父节点
当前提交
fe071360dd

+ 1 - 1
public/web/tree_sheet/tree_sheet_controller.js

@@ -67,6 +67,7 @@ var TREE_SHEET_CONTROLLER = {
                         }
                         that.sheet.deleteRows(sels[0].row, rowCount);
                         that.setTreeSelected(that.tree.items[sels[0].row]);
+                        that.sheet.setSelection(sels[0].row,sels[0].col,1,sels[0].colCount);
                     });
                     cbTools.refreshFormulaNodes();
                 }
@@ -96,7 +97,6 @@ var TREE_SHEET_CONTROLLER = {
                     cbTools.refreshFormulaNodes();
                 }
             }
-
         };
         controller.prototype.upLevel = function () {
             var that = this;

+ 0 - 3
web/building_saas/main/js/models/bills.js

@@ -520,9 +520,6 @@ var Bills = {
                     project.ration_glj.updataOrdelete(selected.source);
                 }
                 if(parent){
-                    if(parent.children.length==0&&parent.data.feesIndex&&parent.data.feesIndex.common){
-                        parent.data.feesIndex.common.unitFee = 0;
-                    }
                     projectObj.converseCalculateBills(parent);
                 }else { //删除的是大项费用要重新计算工程造价节点
                     project.Bills.calcEngineeringCostNode(controller);

+ 36 - 23
web/building_saas/main/js/models/calc_program.js

@@ -507,7 +507,7 @@ let treeNodeTools = {
             return treeNodeCalcType.ctRationCalcProgram;
         }
         else if (this.isNullBill(treeNode)){
-            return treeNodeCalcType.ctCommonUnitFee;
+            return treeNodeCalcType.ctNull;
         }
         else if (this.isLeafBill(treeNode)) {
             if (treeNode.children && treeNode.children.length > 0){
@@ -827,7 +827,6 @@ class CalcProgram {
                 for (let glj of treeNode.data.gljList) {
                     if (eTypes.indexOf(glj.type) >= 0) {
                         if (glj.isEstimate){
-                            'code','name','specs','unit','type'
                             GLJObjs.push({code: glj.code, name: glj.name, specs: glj.specs, unit: glj.unit, type: glj.type,
                                 quantity: glj.quantity, marketPrice: glj.marketPrice});
                         }
@@ -877,17 +876,29 @@ class CalcProgram {
         };
 
         // 删掉多余的费用。例如:从其它计算方式切换到公式计算方式,会多出其它的费(不光是common)
-        function deleteUselessFees(treeNode){
-            let reserveArr = treeNodeTools.isTotalCostBill(treeNode)? ['common', 'estimate']:['common'];
-            if (treeNode.data.fees && treeNode.data.fees.length > 0){
-                let feesArr = treeNode.data.fees;
-                for (let i = 0; i < feesArr.length; i++) {
-                    if (!reserveArr.includes(feesArr[i].fieldName)) {
-                        delete treeNode.data.feesIndex[feesArr[i].fieldName];
-                        feesArr.splice(i, 1);
+        function deleteUselessFees(treeNode, fieldNameArr){
+            if (fieldNameArr){   // 用于计算程序没有绑定的费用类别,不要同步到清单,而清单因为以前计算过该类别又有值,需删除。如切换取费类别,旧费要清掉。
+                for (var i = 0; i < treeNode.data.fees.length; i++) {
+                    let fee = treeNode.data.fees[i];
+                    if (!fieldNameArr.includes(fee.fieldName)){
+                        treeNode.data.fees.splice(i, 1);
+                        delete treeNode.data.feesIndex[fee.fieldName];
                         treeNode.changed = true;
                     }
                 }
+            }
+            else{   // 总造价清单只留common, estimate两个费用类别。其它公式清单只留common。
+                let reserveArr = treeNodeTools.isTotalCostBill(treeNode)? ['common', 'estimate']:['common'];
+                if (treeNode.data.fees && treeNode.data.fees.length > 0){
+                    let feesArr = treeNode.data.fees;
+                    for (let i = 0; i < feesArr.length; i++) {
+                        if (!reserveArr.includes(feesArr[i].fieldName)) {
+                            delete treeNode.data.feesIndex[feesArr[i].fieldName];
+                            feesArr.splice(i, 1);
+                            treeNode.changed = true;
+                        }
+                    }
+                };
             };
         };
 
@@ -964,22 +975,17 @@ class CalcProgram {
             };
             treeNode.data.calcTemplate = {"calcItems": rst};
         }
-        // 叶子清单的手工综合单价计算
-        else if (treeNode.calcType == treeNodeCalcType.ctCommonUnitFee){
+        // 叶子清单无子结点、无公式计算(啥都没有时)
+        else if (treeNode.calcType == treeNodeCalcType.ctNull){
             delete treeNode.data.gljList;
             if (treeNode.data.calcBase) treeNode.data.calcBase = null;  // 不能直接删除该属性,否则无法冲掉库中已存储的值
             if (treeNode.data.calcBaseValue) treeNode.data.calcBaseValue = null;  // 不能直接删除该属性,否则无法冲掉库中已存储的值
             if (treeNode.data.programID) treeNode.data.programID = null;
-
-            let uf = (treeNode.data.feesIndex && treeNode.data.feesIndex.common && treeNode.data.feesIndex.common.unitFee) ? treeNode.data.feesIndex.common.unitFee : 0;
-            uf = uf.toDecimal(decimalObj.bills.unitPrice);
-            let tuf = (treeNode.data.feesIndex && treeNode.data.feesIndex.common && treeNode.data.feesIndex.common.tenderUnitFee) ? treeNode.data.feesIndex.common.tenderUnitFee : 0;
-            tuf = tuf.toDecimal(decimalObj.bills.unitPrice);
-            let q = treeNode.data.quantity ? treeNode.data.quantity : 0;
-            let tf = (uf * q).toDecimal(decimalObj.bills.totalPrice);
-            let ttf = (tuf * q).toDecimal(decimalObj.bills.totalPrice);
-            deleteUselessFees(treeNode);
-            treeNodeTools.checkFeeField(treeNode, {'fieldName': 'common', 'unitFee': uf, 'totalFee': tf});
+            if (treeNode.data.fees && treeNode.data.fees.length > 0){
+                treeNode.data.fees = null;
+                treeNode.data.feesIndex = null;
+                treeNode.changed = true;
+            }
             treeNode.data.calcTemplate = {"calcItems": []};
         }
         // 叶子清单公式计算
@@ -1015,6 +1021,7 @@ class CalcProgram {
         }
         // 定额或叶子清单自己的计算程序计算
         else{
+            let fnArr = [];
             if (treeNode.calcType == treeNodeCalcType.ctRationCalcProgram) {
                 if (treeNode.data.type == rationType.volumePrice){
                     delete treeNode.data.gljList;
@@ -1029,6 +1036,7 @@ class CalcProgram {
                     treeNode.data.gljList = me.project.ration_glj.getGljArrByRation(treeNode.data.ID);
                     // 计算程序里没有暂估费的计算规则,会漏掉,所以这里要专门算。
                     calcEstimateFee(treeNode);
+                    fnArr.push('estimate');
                 };
 
                 if (treeNode.data.programID == undefined){
@@ -1045,6 +1053,7 @@ class CalcProgram {
 
                 // 叶子清单自己的计算程序计算,其暂估费也要汇总算。
                 calcEstimateFee(treeNode);
+                fnArr.push('estimate');
             };
 
             let template = me.compiledTemplates[treeNode.data.programID];
@@ -1071,8 +1080,12 @@ class CalcProgram {
                     else quantity = parseFloat(quantity).toDecimal(decimalObj.decimal('quantity', treeNode));
                     calcItem.totalFee = (calcItem.unitFee * quantity).toDecimal(decimalObj.decimal('totalPrice', treeNode));
 
-                    treeNodeTools.checkFeeField(treeNode, calcItem);
+                    if (calcItem.fieldName) {
+                        fnArr.push(calcItem.fieldName);
+                        treeNodeTools.checkFeeField(treeNode, calcItem);
+                    };
                 };
+                deleteUselessFees(treeNode, fnArr);
             };
         };
 

+ 2 - 1
web/building_saas/main/js/models/main_consts.js

@@ -75,7 +75,8 @@ const treeNodeCalcType = {
     ctGatherRationsFees: 3,     // 汇总定额的各个费
     ctGatherBillsFees: 4,       // 汇总清单的各个费
     ctCalcBaseValue: 5,
-    ctCommonUnitFee: 6
+    ctNull: 6
+    // ctCommonUnitFee: 6       // 树结点的手工输入综合单价的方式已废弃,现综合单价只读,引入市场单价。
 };
 
 const calcAllType = {

+ 1 - 0
web/building_saas/main/js/views/calc_program_manage.js

@@ -87,6 +87,7 @@ let calcProgramManage = {
             projectObj.project.FeeRate.updateFeeRateFromCalc(args.editingText,editInfo);
         }else {
             if(me.detailSetting.header[args.col].dataCode == 'displayFieldName'){
+                if (editInfo.calcItem.displayFieldName == args.editingText) return;
                 editInfo.calcItem.fieldName = projectObj.project.calcProgram.compiledFeeTypeMaps[args.editingText];
                 editInfo.calcItem.displayFieldName = args.editingText;    // 这句不入库,仅用于切换后再切换回来时界面正确显示
             };

+ 8 - 1
web/building_saas/main/js/views/main_tree_col.js

@@ -149,7 +149,14 @@ let MainTreeCol = {
             return MainTreeCol.readOnly.non_bills(node) || MainTreeCol.readOnly.billsParent(node) || MainTreeCol.readOnly.leafBillsWithDetail(node)
         },
         forQuantity: function (node) {
-            return MainTreeCol.readOnly.glj(node) || MainTreeCol.readOnly.billsParent(node)
+            if(node.sourceType === projectObj.project.Bills.getSourceType()){
+                if(node.data.type==billType.DXFY||node.data.type==billType.FB||(node.data.type==billType.BILL&&MainTreeCol.readOnly.billsParent(node))){//大项费用、分部、清单父项行,工程量只读。
+                    return true;
+                }
+            }else if(MainTreeCol.readOnly.glj(node)){
+                return true;
+            }
+            return false;
         },
         forMarketPrice: function (node) {
             return MainTreeCol.readOnly.bills(node) ||

+ 71 - 19
web/building_saas/main/js/views/project_view.js

@@ -41,37 +41,89 @@ var projectObj = {
             }
         };
         let selected = tree.selected, that = projectObj;
+
         let canUpLevel = function (node) {
-            if (selected && selected.depth() > 1 && selected.canUpLevel()) {
-                if (selected.sourceType === that.project.Bills.getSourceType()) {
-                    return (!selected.nextSibling) || (selected.children.length === 0) || (selected.source.children.length > 0);
-                } else {
+            if(!node){
+                return false;
+            }
+            if(node.depth()<=1){//焦点行是树结构的第一/二层节点,灰显。
+                return false;
+            }
+            if(node.sourceType !== that.project.Bills.getSourceType()){//焦点行是定额/量价/工料机,灰显。
+                return false;
+            }else {
+                if(node.data.type == billType.FX){//是分项,灰显。
                     return false;
                 }
-            } else {
-                return false;
+                if(node.data.type == billType.FB&&node.nextSibling&&node.children.length>0){//焦点行是分部有后兄弟,有子项.
+                     if(node.children[0].data.type==billType.FX){ //焦点行子项是分项
+                         return false;
+                     }
+                }
+                if(node.data.type == billType.BILL &&node.nextSibling){//焦点行是清单有后兄弟
+                    if(node.data.calcBase&&node.data.calcBase!=""){//有基数计算
+                        return false;
+                    }
+                    if(node.children.length>0&&node.children[0].sourceType !== that.project.Bills.getSourceType()){//有子项,并且子项不是清单
+                        return false;
+                    }
+                }
             }
+            return true;
         };
         let canDownLevel = function (node) {
-            if (selected && selected.depth() > 0 && selected.canDownLevel()) {
-                if (selected.sourceType === that.project.Bills.getSourceType()) {
-                    return (selected.preSibling.children.length === 0) || (selected.preSibling.source.children.length > 0);
-                } else {
+            if(!node){
+                return false;
+            }
+            if(node.depth()==0){//焦点行是树结构的第一层节点,灰显。
+                return false;
+            }
+            if(node.sourceType !== that.project.Bills.getSourceType()) {//焦点行是定额/量价/工料机,灰显。
+                return false;
+            }else {
+                if(node.data.type == billType.FX){//是分项,灰显。
                     return false;
                 }
-            } else {
-                return false;
+                if(!node.preSibling){//无前兄弟,灰显
+                    return false;
+                }else if(node.preSibling.data.calcBase&&node.preSibling.data.calcBase!=""){//前兄弟有基数计算
+                    return false
+                }
+                if(node.preSibling.children.length>0){//前兄弟有子项,子项是分项,灰显。
+                    if(node.data.type==billType.FB&&node.preSibling.children[0].data.type==billType.FX){//焦点行是分部前兄弟有子项,子项是分项,灰显。
+                        return false;
+                    }
+                    if(node.data.type==billType.BILL&&node.preSibling.children[0].sourceType !== that.project.Bills.getSourceType()){//焦点行是清单,子项不是清单
+                        return false
+                    }
+                }
             }
+            return true;
         };
-
-
-
+        let canUpMove = function (node) {
+            if(node&&node.preSibling){//有前兄弟
+                if(node.sourceType==that.project.Bills.getSourceType()&&node.data.type == billType.DXFY&&node.data.isAdd!==1){
+                    return false;
+                }
+                return true
+            }
+            return false
+        };
+        let canDownMove = function (node) {
+            if(node&&node.nextSibling){
+                if(node.sourceType==that.project.Bills.getSourceType()&&node.data.type == billType.DXFY&&node.data.isAdd!==1){
+                    return false;
+                }
+                return true;
+            }
+            return false
+        };
+        
         setButtonValid(ifCanDelete(), $('#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(canUpMove(selected) , $('#upMove'));
+        setButtonValid(canDownMove(selected), $('#downMove'));
     },
     checkCommonField: function (editingText, colSetting) {
         let value;
@@ -957,7 +1009,7 @@ $('#upLevel').click(function () {
     if (selected && selected.sourceType === project.Bills.getSourceType()) {
         project.Bills.upLevelBills(selected.source);
         controller.upLevel();
-        projectObj.converseCalculateBills(orgParent);
+        projectObj.project.calcProgram.calcBillsAndSave([selected,orgParent]);
     }
 });
 $('#downLevel').click(function () {