Sfoglia il codice sorgente

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

zhongzewei 7 anni fa
parent
commit
d77c0300bc

+ 1 - 1
modules/pm/models/project_model.js

@@ -49,7 +49,7 @@ ProjectsDAO.prototype.getUserProjects = async function (userId, compilation, cal
                 'compilation': compilation,
                 'deleteInfo': null
             }, {'userID': userId, 'compilation': compilation, 'deleteInfo.deleted': {'$in': [null, false]}}]
-        }, '-_id -property');
+        }, '-_id');
         let projIDs= [];
         let projIndex = {};
         for(let proj of projects){

+ 23 - 10
modules/reports/util/rpt_construct_data_util.js

@@ -32,6 +32,9 @@ class Rpt_Common{
         }
         for (let i = 0; i < maxLen; i++) {
             let value = ((i < val1.length)?val1[i]:val1[minLen - 1]) * ((i < val2.length)?val2[i]:val2[minLen - 1]);
+            if (value === null || value === undefined) {
+                value = '0';
+            }
             if (fixFormat) value = value.toFixed(fixFormat);
             rst.push(value);
         }
@@ -252,6 +255,7 @@ class Rpt_Data_Extractor {
 
 }
 
+//小数位数依据单位来调整(如吨、公斤的精度要求就不同)
 function getUnitDecimal(unitDecimalArr) {
     let rst = {"default_decimal": 2};
     if (unitDecimalArr) {
@@ -476,7 +480,7 @@ function moveRationData(rationData, rawDataObj) {
                 copyItem.rationID = rationItem.ID;
                 copyItem.rationItemQuantity = 1;
                 copyItem.quantity = 1;
-                copyItem.specialType_quantity = rationItem.quantity;
+                // copyItem.specialType_quantity = rationItem.quantity;
                 copyItem.name = rationItem.name;
                 if (rationItem.code) {
                     copyItem.code = rationItem.ID + "_" + rationItem.code;
@@ -490,7 +494,6 @@ function moveRationData(rationData, rawDataObj) {
                 copyItem.shortName = rationItem.shortName;
                 copyItem.billsItemID = rationItem.billsItemID;
                 copyItem.type = rationItem.subType;
-                // copyItem.repositoryId = rationItem.?;
                 if (rationItem.projectGLJID) {
                     copyItem.projectGLJID = rationItem.projectGLJID;
                 } else {
@@ -500,17 +503,12 @@ function moveRationData(rationData, rawDataObj) {
                     dummyPrjItem.id = dummyPRJID;
                     dummyPRJID++;
                     dummyPrjItem.unit_price = {};
-                    // dummyPrjItem.unit_price.base_price = 0;
-                    // dummyPrjItem.unit_price.market_price = 0;
                     dummyPrjItem.unit_price.base_price = 0;
-                    dummyPrjItem.unit_price.market_price = rationItem["marketUnitFee"];
+                    dummyPrjItem.unit_price.market_price = (rationItem["marketUnitFee"])?rationItem["marketUnitFee"]:0;
                     dummyPrjItem.quantity = 0;
                     dummyPrjItem.is_evaluate = 0;
                     prjGljData.data.gljList.push(dummyPrjItem);
                 }
-                // copyItem.adjCoe = rationItem.?;
-                // copyItem.from = rationItem.?;
-                // copyItem.createType = rationItem.?;
                 rationGljData.data.push(copyItem);
             }
         }
@@ -684,7 +682,8 @@ function sortData(sourceData, sortCfg, prjData) {
     }
     switch (sortType) {
         case "tree":
-            rst = treeUtil.buildTreeNodeDirectly(tempRstArr);
+            let addLevel = true;
+            rst = treeUtil.buildTreeNodeDirectly(tempRstArr, addLevel);
             let newTopArr = [];
             if (sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES] && sortCfg[JV.PROP_FILTER_TOP_BILLS_NODES].length > 0) {
                 for (let topItem of rst) {
@@ -775,6 +774,7 @@ function setupFunc(obj, prop, ownRawObj) {
     obj[prop].getPropertyByForeignId = ext_getPropertyByForeignId;
     obj[prop].getArrayItemByKey = ext_getArrayItemByKey;
     obj[prop].getPropertyByFlag = ext_getPropertyByFlag;
+    obj[prop].getBlank = ext_getBlank;
     if (prop === projectConst.CALC_PROGRAM) obj[prop].getCalcProperty = ext_getCalcProperty;
     if (prop === projectConst.FEERATE) obj[prop].getFeeRate = ext_getFeeRate;
 }
@@ -1051,6 +1051,19 @@ function ext_getArrayItemByKey(arrayKey, itemKey, itemKeyValue, itemRstKey){
     }
 }
 
+function ext_getBlank(dftVal) {
+    let rst = [], parentObj = this;
+    let dtObj = parentObj["myOwnRawDataObj"];
+    if (dtObj) {
+        for (let i = 0; i < dtObj.data.length; i++) {
+            if (dftVal !== null && dftVal !== undefined) {
+                rst.push(dftVal)
+            } else rst.push('');
+        }
+    }
+    return rst;
+}
+
 function ext_getPropertyByFlag(flagVal, rstKey, dftValIfEmpty) {
     let rst = [], parentObj = this;
     let dtObj = parentObj["myOwnRawDataObj"];
@@ -1092,6 +1105,7 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
     let rst = [], parentObj = this;
     let IdKey = (adHocIdKey)?adHocIdKey:"ID";
     let dtObj = parentObj["myOwnRawDataObj"];
+    let splitPKey = propKey.split(".");
     if (foreignIdVal !== null && foreignIdVal !== undefined) {
         let isFound = false;
         if (foreignIdVal instanceof Array) {
@@ -1102,7 +1116,6 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
                 for (let i = 0; i < dataArr.length; i++) {
                     let item = (dataArr[i]._doc)?dataArr[i]._doc:dataArr[i];
                     if (item[IdKey] === idVal) {
-                        let splitPKey = propKey.split(".");
                         if (splitPKey.length > 1) {
                             let rstP = null;
                             for (let i = 0; i < splitPKey.length; i++) {

+ 8 - 7
public/web/treeDataHelper.js

@@ -1,12 +1,12 @@
 /**
  * Created by Tony on 2017/1/23.
  */
-const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1;
+const NODE_ID = "ID", P_ID = "ParentID", NEXT_ID = "NextSiblingID", ADHOC_PRE_ID="Previous_ID", CHILDREN_NODE = "items", SUB_ID = "sub_ids", EMPTY_ID_VAL = -1, TREE_LEVEL = 'treeLevel';
 
 let tree_Data_Helper = {
-    buildTreeNodeDirectly: function(data) {
+    buildTreeNodeDirectly: function(data, addLevel) {
         let topArr = [], rst = [], tmpNodes = {}, prefix = "id_";
-        let private_getTopNode = function (idArr) {
+        let private_getStartNode = function (idArr) {
             let tmpNodeRst = null;
             for (let i = 0; i < idArr.length; i++) {
                 if (parseInt(tmpNodes[prefix + idArr[i]][ADHOC_PRE_ID]) === EMPTY_ID_VAL) {
@@ -16,8 +16,8 @@ let tree_Data_Helper = {
             }
             return tmpNodeRst;
         };
-        let private_buildNodeData = function(parentItem, idArr) {
-            let iter = [], nextNode = private_getTopNode(idArr);
+        let private_buildNodeData = function(parentItem, idArr, treeLevel) {
+            let iter = [], nextNode = private_getStartNode(idArr);
             while (nextNode !== null && nextNode !== undefined ) {
                 if (parentItem) {
                     parentItem[CHILDREN_NODE].push(nextNode);
@@ -25,10 +25,11 @@ let tree_Data_Helper = {
                     rst.push(nextNode);
                 }
                 iter.push(nextNode);
+                if (addLevel) nextNode[TREE_LEVEL] = treeLevel;
                 nextNode = tmpNodes[prefix + nextNode[NEXT_ID]];
             }
             for (let i = 0; i < iter.length; i++) {
-                private_buildNodeData(iter[i], iter[i][SUB_ID]);
+                private_buildNodeData(iter[i], iter[i][SUB_ID], (treeLevel + 1));
             }
         };
 
@@ -51,7 +52,7 @@ let tree_Data_Helper = {
                 tmpNodes[prefix + data[i][P_ID]][SUB_ID].push(data[i][NODE_ID]);
             }
         }
-        private_buildNodeData(null, topArr);
+        private_buildNodeData(null, topArr, 0);
         //try to release and return
         tmpNodes = null;
         topArr.length = 0;

+ 20 - 18
web/building_saas/main/js/models/fee_rate.js

@@ -381,28 +381,30 @@ var FeeRate = {
         };
 
         FeeRate.prototype.updateFeeRateFromCalc=function (value,editInfo) {
-            var value= number_util.checkNumberValue(value,getDecimal("feeRate"));
-            if(value){
-                if(editInfo.calcItem.feeRateID){
-                    var rate = this.getFeeRateByID(editInfo.calcItem.feeRateID);
-                    if(rate!=undefined){
-                        this.updateFeeRateByCalc(rate,value);
-                        return;
-                    }
-                }
-                editInfo.calcItem.feeRate=value;
-                editInfo.calcItem.feeRateID=null;
-                var data={'projectID': projectObj.project.ID(),'templatesID': editInfo.template.ID,'calcItem': editInfo.calcItem};
-                calcProgramManage.saveCalcItem(data,function (result) {
-                    project.calcProgram.compileAllTemps();
-                    project.calcProgram.calcAllNodesAndSave();
+            if(value != null){
+                value= number_util.checkNumberValue(value,getDecimal("feeRate"));
+                if(value == null) {
                     calcProgramManage.refreshDetailSheet();
                     $.bootstrapLoading.end();
-                })
-            }else {
+                }
+            }
+            if(editInfo.calcItem.feeRateID && value!= null){
+                var rate = this.getFeeRateByID(editInfo.calcItem.feeRateID);
+                if(rate!=undefined){
+                    this.updateFeeRateByCalc(rate,value);
+                    return;
+                }
+            }
+            editInfo.calcItem.feeRate=value;
+            editInfo.calcItem.feeRateID=null;
+            var data={'projectID': projectObj.project.ID(),'templatesID': editInfo.template.ID,'calcItem': editInfo.calcItem};
+            calcProgramManage.saveCalcItem(data,function (result) {
+                project.calcProgram.compileAllTemps();
+                project.calcProgram.calcAllNodesAndSave();
                 calcProgramManage.refreshDetailSheet();
                 $.bootstrapLoading.end();
-            }
+            })
+
         };
         FeeRate.prototype.updateFeeRateByCalc=function (rate,value) {
             var me=this;

+ 1 - 1
web/building_saas/main/js/models/quantity_detail.js

@@ -525,7 +525,7 @@ var quantity_detail = {
                     if(node.data.contain!=0){
                        let billQuantity = scMathUtil.roundForObj(node.parent.data.quantity,getDecimal("quantity",node.parent));
                        let temValue = scMathUtil.roundForObj(value*times,getDecimal("quantity",node));
-                        node.data.contain = scMathUtil.roundForObj(temValue/billQuantity,getDecimal("process"));
+                       billQuantity!=0?node.data.contain = scMathUtil.roundForObj(temValue/billQuantity,getDecimal("process")):'';
                     }
                 }
             }

+ 1 - 1
web/building_saas/main/js/models/ration.js

@@ -417,7 +417,7 @@ var Ration = {
                    }
                 }
                 project.projectGLJ.loadData(function () {
-                    gljOprObj.showDataIfRationSelect(projectObj.project.mainTree.selected);
+                    gljOprObj.showDataIfRationSelect(projectObj.project.mainTree.selected,"-111111111");//这里第二个参数是为了使改前和改后selectedID不一样,删除了的话下方的定额工料机不会刷新
                     project.calcProgram.calcRationsAndSave(refershNodes);
                     projectObj.mainController.refreshTreeNode(refershNodes, true);
                     $.bootstrapLoading.end();

+ 16 - 3
web/building_saas/main/js/views/calc_program_manage.js

@@ -58,6 +58,7 @@ let calcProgramManage = {
 
         me.mainSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onMainEnterCell);
         me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.ValueChanged, me.onDetailValueChanged);
+        me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.RangeChanged, me.onRangeChanged);
         me.detailSpread.getSheet(0).bind(GC.Spread.Sheets.Events.EnterCell, me.onDetailEnterCell);
 
         let mSheet = me.mainSpread.getSheet(0);
@@ -83,6 +84,18 @@ let calcProgramManage = {
         sheetCommonObj.showData(dSheet, me.detailSetting, dData);
         me.detailSpread.resumePaint();
     },
+    onRangeChanged:function (sender,args) {
+        let me = calcProgramManage;
+        let editInfo= me.getSelectionInfo();
+        let dataCode = me.detailSetting.header[args.col].dataCode;
+        if (args.action == GC.Spread.Sheets.RangeChangedAction.clear&&args.changedCells.length == 1) {//清除操作
+            if (dataCode == 'feeRate') {
+                $.bootstrapLoading.start();
+                projectObj.project.FeeRate.updateFeeRateFromCalc(null, editInfo);
+            }
+        }
+
+    },
     onDetailValueChanged: function(sender, args) {
         $.bootstrapLoading.start();
         let me = calcProgramManage;
@@ -94,13 +107,13 @@ let calcProgramManage = {
             projectObj.project.FeeRate.updateFeeRateFromCalc(args.newValue, editInfo);
             $.bootstrapLoading.end();
             return;
-        };
+        }
 
         if (dataCode == 'displayFieldName') {
             if (curCalcItem.displayFieldName == args.newValue) {
                 $.bootstrapLoading.end();
                 return;
-            };
+            }
 
             if (analyzer.fieldNameIsUsed(me.getSelectionInfo().template, args.newValue)){
                 let sheet = me.detailSpread.getActiveSheet();
@@ -110,7 +123,7 @@ let calcProgramManage = {
                 $.bootstrapLoading.end();
                 alert(`“${args.newValue}” 已被其它行使用,不允许重复选择!`);
                 return;
-            };
+            }
 
             curCalcItem.fieldName = projectObj.project.calcProgram.compiledFeeTypeMaps[args.newValue];
         }

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

@@ -364,6 +364,9 @@ var projectObj = {
         if (node.sourceType === project.Bills.getSourceType()) {
             this.updateBillsCode(node, value);   // 新清单不适合实时计算,下面套什么还不能确定,无数量计算也无意义
         } else if (node.sourceType === project.Ration.getSourceType()) {
+            if(value && typeof(value) == 'string'){//小写转换成大写
+                value = value.toUpperCase();
+            }
             project.Ration.updateRationCodes([{'node':node,value:value}]);
           //  this.updateRationCode(node, value);  // 新套定额适合实时计算
             // 这里因异步问题暂时缺少工料机价格。该过程移到:ration_glj.js的refreshAfterSave方法中。
@@ -921,7 +924,39 @@ var projectObj = {
                     callback: function () {
                         project.calcProgram.calcAllNodesAndSave();
                     }
-                }
+                }/*,
+                "spr2":'--------',
+                "copyBlock": {
+                    name: '复制整块',
+                    icon: 'fa-copy',
+                    disabled: function () {
+                        let selected = project.mainTree.selected;
+                        if(selected.sourceType == project.Bills.getSourceType() && selected.data.type == billType.DXFY){//焦点行是大项费用则无效;
+                            return true;
+                        }
+                        if(selected.sourceType == project.ration_glj.getSourceType()){// 焦点行是定额下的主材设备则无效;
+                            return true;
+                        }
+                        return false;
+                    },
+                    callback: function () {
+                        $.bootstrapLoading.start();
+                        let selected = project.mainTree.selected;
+                        setTimeout(function () {
+                            BlockController.copyBlock(selected);
+                            $.bootstrapLoading.end();
+                        },100)
+
+                    }
+                },
+                "spr2":'--------',
+                "pasteBlock": {
+                    name: '粘贴整块',
+                    icon: 'fa-paste',
+                    callback: function () {
+
+                    }
+                }*/
             }
         });
     },
@@ -1830,6 +1865,4 @@ $(function () {
             spread?spread.focus():'';
         }
     }
-
-
 });

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

@@ -43,7 +43,7 @@ const projTreeObj = {
             {name: '工程造价', dataCode: 'engineeringCost', width: 170, vAlign: 'center', hAlign: 'right'},
             {name: '单价文件', dataCode: 'unitPriceFile', width: 250, vAlign: 'center', hAlign: 'left'},
             {name: '费率文件', dataCode: 'feeRateFile', width: 250, vAlign: 'center', hAlign: 'left'},
-            {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'left'}
+            {name: '创建日期', dataCode: 'createDateTime', width: 170, vAlign: 'center', hAlign: 'center'}
         ],
         //选中行颜色
         style: {