浏览代码

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

zhongzewei 7 年之前
父节点
当前提交
76249936cf

+ 15 - 0
Dockerfile_pp

@@ -0,0 +1,15 @@
+FROM costbase:latest
+
+WORKDIR /home/ConstructionCost
+
+RUN git pull http://192.168.1.12:3000/SmartCost/ConstructionCost master
+
+RUN cnpm install
+
+RUN gulp build
+
+EXPOSE 6060
+
+ENV NODE_ENV=pp
+
+ENTRYPOINT babel-node server.js

+ 1 - 0
config/config.js

@@ -2,6 +2,7 @@ module.exports = {
     current: {server: "192.168.1.184", port: "60666",redis:{server:'192.168.1.184',port:'6379',pwd:'smartCost'}},
     local: {server: "localhost", port: "27017"},
     qa: {server: "192.168.1.184", port: "60666"},
+    pp:{server: "172.18.111.228", port: "27017"},
     prod: {server: "", port: ""},
     redis_local:{server:'127.0.0.1',port:'6379',pwd:'smartCost'},
     redis_qa:{server:'192.168.1.184',port:'6379',pwd:'smartCost'},

+ 87 - 12
modules/reports/util/rpt_construct_data_util.js

@@ -143,6 +143,36 @@ class Rpt_Data_Extractor {
         pri_setup_filter(JV.NODE_DETAIL_FIELDS);
         pri_setup_filter(JV.NODE_MASTER_FIELDS_EX);
         pri_setup_filter(JV.NODE_DETAIL_FIELDS_EX);
+        if (tpl[JV.NODE_MAP_DATA_HANDLE_INFO] && tpl[JV.NODE_MAP_DATA_HANDLE_INFO].length > 0) {
+            for (let preHandle of tpl[JV.NODE_MAP_DATA_HANDLE_INFO]) {
+                if (rst.indexOf(preHandle[JV.PROP_DATA_KEY]) < 0) {
+                    rst.push(preHandle[JV.PROP_DATA_KEY]);
+                }
+                if (preHandle[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_FILTER) {
+                    if (preHandle[JV.PROP_FILTER_KEYS]) {
+                        for (let filter of preHandle[JV.PROP_FILTER_KEYS]) {
+                            if (filter[JV.PROP_FILTER_COMPARE_OBJ] && rst.indexOf(filter[JV.PROP_FILTER_COMPARE_OBJ]) < 0) {
+                                rst.push(filter[JV.PROP_FILTER_COMPARE_OBJ]);
+                            }
+                        }
+                    }
+                } else if (preHandle[JV.PROP_HANDLE_TYPE] === JV.PROP_HANDLE_TYPE_SUM) {
+                    if (preHandle[JV.PROP_SUM_GROUP_KEYS]) {
+                        for (let grpKey of preHandle[JV.PROP_SUM_GROUP_KEYS]) {
+                            if (grpKey.seeking_parent && rst.indexOf(grpKey.seeking_parent) < 0) {
+                                rst.push(grpKey.seeking_parent);
+                            }
+                        }
+                    }
+                } else if (preHandle[JV.PROP_PARENT_CHILD_SORT_KEY] && preHandle[JV.PROP_PARENT_CHILD_SORT_KEY].length > 0) {
+                    for (let item of preHandle[JV.PROP_PARENT_CHILD_SORT_KEY]) {
+                        if (rst.indexOf(item[JV.PROP_PARENT_DATA_KEY]) < 0) {
+                            rst.push(item[JV.PROP_PARENT_DATA_KEY]);
+                        }
+                    }
+                }
+            }
+        }
         if (rst.length === 0) {
             rst.push(projectConst.RATION_ASS);
         }
@@ -279,41 +309,69 @@ function filterData(sourceData, handleCfg, prjData) {
             tempRstArr.push(item);
         }
     }
-    let private_chkVal = function (src, dest, compStr) {
+    let private_chkVal = function (src, compVal, compStr) {
         let rst = true;
         switch (compStr) {
             case "==" :
-                rst = (src == dest);
+                rst = (src == compVal);
                 break;
             case "===" :
-                rst = (src === dest);
+                rst = (src === compVal);
                 break;
             case ">" :
-                rst = (src > dest);
+                rst = (src > compVal);
                 break;
             case ">=" :
-                rst = (src >= dest);
+                rst = (src >= compVal);
                 break;
             case "<" :
-                rst = (src < dest);
+                rst = (src < compVal);
                 break;
             case "<=" :
-                rst = (src <= dest);
+                rst = (src <= compVal);
                 break;
             case "!=" :
-                rst = (src != dest);
+                rst = (src != compVal);
                 break;
             case "!==" :
-                rst = (src !== dest);
+                rst = (src !== compVal);
+                break;
+            case "in" :
+                if (compVal instanceof Array) {
+                    rst = compVal.indexOf(src) >= 0;
+                } else {
+                    //string,需要转类型
+                    let newCv = JSON.parse(compVal);
+                    if (newCv instanceof Array) {
+                        rst = newCv.indexOf(src) >= 0;
+                    } else {
+                        rst = false;
+                    }
+                }
+                break;
+            case "not in":
+                if (compVal instanceof Array) {
+                    rst = compVal.indexOf(src) < 0;
+                } else {
+                    //string,需要转类型
+                    let newCv = JSON.parse(compVal);
+                    if (newCv instanceof Array) {
+                        rst = newCv.indexOf(src) < 0;
+                    } else {
+                        rst = true;
+                    }
+                }
                 break;
             default:
                 rst = true;
         }
         return rst;
     };
+    let compareObj = {};
     for (let item of tempRstArr) {
         let compRst = true;
         let curComparePrjData = null;
+        let startIdx = 0;
         for (let cfg of handleCfg[JV.PROP_FILTER_KEYS]) {
             if (cfg[JV.PROP_FILTER_COMPARE_VAL]) {
                 //比较key值
@@ -323,11 +381,28 @@ function filterData(sourceData, handleCfg, prjData) {
                 if (!curComparePrjData) {
                     curComparePrjData = getModuleDataByKey(prjData, cfg[JV.PROP_FILTER_COMPARE_OBJ]);
                 }
-                for (let data of curComparePrjData.data) {
-                    compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
-                    if (compRst) break;
+                if (cfg[JV.PROP_FILTER_CONDITION] === "in" || cfg[JV.PROP_FILTER_CONDITION] === "not in") {
+                    let compareArr = null;
+                    if (!compareObj.hasOwnProperty(cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString())) {
+                        compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()] = [];
+                        compareArr = compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()];
+                        for (let data of curComparePrjData.data) {
+                            if (compareArr.indexOf(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]) < 0) {
+                                compareArr.push(data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]]);
+                            }
+                        }
+                    } else {
+                        compareArr = compareObj[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY] + startIdx.toString()];
+                    }
+                    compRst = private_chkVal(item[cfg.key], compareArr, cfg[JV.PROP_FILTER_CONDITION]);
+                } else {
+                    for (let data of curComparePrjData.data) {
+                        compRst = private_chkVal(item[cfg.key], data[cfg[JV.PROP_FILTER_COMPARE_OBJ_KEY]], cfg[JV.PROP_FILTER_CONDITION]);
+                        if (compRst) break;
+                    }
                 }
             }
+            startIdx++;
         }
         if (compRst) {
             rstArr.push(item);

+ 4 - 1
public/web/sheet/sheet_common.js

@@ -40,7 +40,10 @@ var sheetCommonObj = {
 
         sheet.showRowOutline(false);
         me.buildHeader(sheet, setting);
-        if (rowCount > 0) sheet.setRowCount(rowCount);
+        if (rowCount > 0)
+            sheet.setRowCount(rowCount)
+        else
+            sheet.setRowCount(1);
         sheet.resumeEvent();
         sheet.resumePaint();
     },

+ 17 - 32
web/building_saas/main/js/models/calc_program.js

@@ -438,35 +438,12 @@ let treeNodeTools = {
     orderFormulaNodes: function (nodesArr) {
         let orderArr = [];
 
-        function getNodesByExp(expression){
-            // for test --------------
-            function getNode(name) {
-                for (let node of projectObj.project.mainTree.items){
-                    if (node.data.name == name)
-                        return node;
-                };
-            };
-
-            if (expression.hasSubStr("{措施项目费}")){
-                let node = getNode('措施项目');
-                return [node];
-            }
-
-            else if (expression.hasSubStr("{技术措施项目费}")){
-                let node = getNode('1.技术措施项目');
-                return [node];
-            }
-            // -------------------------------
-
-            return [];
-        };
-
         function recursionNode(nodes) {
             for (let node of nodes){
                 if (orderArr.includes(node)) continue;    // 已排过序的节点则跳过
 
                 if (node.data.calcBase){
-                    let subNodes = getNodesByExp(node.data.calcBase);
+                    let subNodes = cbTools.getNodesByExp(node.data.calcBase);
                     recursionNode(subNodes);
                 };
 
@@ -519,6 +496,7 @@ let treeNodeTools = {
             treeNode.data.fees.push(fee);
             treeNode.data.feesIndex[fieldName] = fee;
         };
+        treeNode.changed = true;
     },
 
     getCalcType(treeNode) {
@@ -955,14 +933,21 @@ class CalcProgram {
             let tf = (me.project.property.billsCalcMode === leafBillGetFeeType.rationPrice) ? (b * f / 100).toDecimal(decimalObj.bills.totalPrice) : (uf * q).toDecimal(decimalObj.bills.totalPrice);
             let ttf = tf;
 
-            delete treeNode.data.fees;    // 直接删掉再新增,不用一个个费判断更新,效率更高。
-            delete treeNode.data.feesIndex;
-            treeNodeTools.initFeeField(treeNode, 'common');
-            treeNode.data.feesIndex.common.unitFee = uf;
-            treeNode.data.feesIndex.common.totalFee = tf;
-            treeNode.data.feesIndex.common.tenderUnitFee = tuf;
-            treeNode.data.feesIndex.common.tenderTotalFee = ttf;
-            treeNode.changed = true;
+            if (treeNode.data.feesIndex && treeNode.data.feesIndex.common){
+                if (treeNode.data.feesIndex.common.unitFee != uf ||
+                    treeNode.data.feesIndex.common.totalFee != tf ||
+                    treeNode.data.feesIndex.common.tenderUnitFee != tuf ||
+                    treeNode.data.feesIndex.common.tenderTotalFee != ttf ){
+                    delete treeNode.data.fees;    // 直接删掉再新增。从其它计算方式切换到公式计算方式,会多出其它的费(不光是common)所以这里直接删掉,不用一个个费判断更新,效率更高。
+                    delete treeNode.data.feesIndex;
+                    treeNodeTools.initFeeField(treeNode, 'common');
+                    treeNode.data.feesIndex.common.unitFee = uf;
+                    treeNode.data.feesIndex.common.totalFee = tf;
+                    treeNode.data.feesIndex.common.tenderUnitFee = tuf;
+                    treeNode.data.feesIndex.common.tenderTotalFee = ttf;
+                    treeNode.changed = true;
+                }
+            };
             treeNode.data.calcTemplate = {"calcItems": []};
         }
         // 定额或叶子清单自己的计算程序计算

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

@@ -411,7 +411,22 @@ var Ration = {
             project.calcProgram.calcAndSave(node);
             projectObj.mainController.refreshTreeNode(node.children);//刷新子工料机树节点总消耗量
         };
-        
+        ration.prototype.addRationChecking=function(selected){
+            if (selected) {// Vincent, 2018-01-02
+                if(selected.sourceType === project.Ration.getSourceType()){ // 焦点行是定额/量价/工料机,有效显示。
+                    return false;
+                }else if(selected.sourceType === project.Bills.getSourceType()){
+                    if(selected.data.type == billType.FX){//焦点行是分项,有效显示。
+                        return false
+                    }
+                    if(selected.data.type == billType.BILL && selected.source.children.length === 0){//焦点行是清单,且没有子项,有效显示。
+                        return false
+                    }
+                }
+            }
+            return true;
+        };
+
         return new ration(project);
     }
 };

+ 1 - 1
web/building_saas/main/js/views/glj_view.js

@@ -397,7 +397,7 @@ var gljOprObj = {
     },
     onCheckBoxClick: function (sender, args) {
         let selected = projectObj.project.mainTree.selected;
-        if(selected.sourceType == ModuleNames.ration_glj||(selected.sourceType == ModuleNames.ration&&selected.data.type==rationType.gljRation)){//选中的是工料机时不可编辑
+        if(selected.sourceType == ModuleNames.ration_glj){//选中的是工料机时不可编辑
             return ;
         }
         var checkboxValue = args.sheet.getCell(args.row, args.col).value();

+ 28 - 22
web/building_saas/main/js/views/project_view.js

@@ -582,19 +582,7 @@ var projectObj = {
                     icon: 'fa-sign-in',
                     disabled: function () {
                         var selected = project.mainTree.selected;
-                        if (selected) {// Vincent, 2018-01-02
-                            if(selected.sourceType === project.Ration.getSourceType()){ // 焦点行是定额/量价/工料机,有效显示。
-                                return false;
-                            }else if(selected.sourceType === project.Bills.getSourceType()){
-                               if(selected.data.type == billType.FX){//焦点行是分项,有效显示。
-                                  return false
-                               }
-                               if(selected.data.type == billType.BILL && selected.source.children.length === 0){//焦点行是清单,且没有子项,有效显示。
-                                    return false
-                               }
-                            }
-                        }
-                        return true;
+                        return project.Ration.addRationChecking(selected);  // Vincent, 2018-01-02
                     },
                     callback: function (key, opt) {
                         ProjectController.addRation(project, controller, rationType.ration);
@@ -613,16 +601,18 @@ var projectObj = {
                     icon: 'fa-sign-in',
                     disabled: function () {
                         var selected = project.mainTree.selected;
-                        if (selected) {
-                            if (            // CSL, 2017-11-28
-                            selected.sourceType === project.Ration.getSourceType() ||
-                            (selected.sourceType === project.Bills.getSourceType() && selected.source.children.length === 0)
-                            ) return false
-                            else return true
-                        } else return true
+                        return project.Ration.addRationChecking(selected);  // Vincent, 2018-01-02
                     },
                     callback: function (key, opt) {
                         ProjectController.addRation(project, controller, rationType.volumePrice);
+                    },
+                    visible: function(key, opt){
+                        var selected = project.mainTree.selected;
+                        if(selected.sourceType == ModuleNames.bills&&selected.data.type == billType.DXFY){
+                            return false
+                        }else {
+                            return true
+                        }
                     }
                 },
                 "insertGLJ": {
@@ -630,11 +620,27 @@ var projectObj = {
                     icon: 'fa-sign-in',
                     disabled: function () {
                         var selected = project.mainTree.selected;
-                        var readOnly = MainTreeCol.readOnly;
-                        return readOnly.billsParent(selected)||(readOnly.bills(selected)&&!readOnly.forCalcBase(selected))||readOnly.glj(selected);
+                        return project.Ration.addRationChecking(selected);  // Vincent, 2018-01-02
                     },
                     callback: function (key, opt) {
+                        var selected = project.mainTree.selected;
+                        if(selected.sourceType == ModuleNames.bills){
+                            if(selected.data.type == billType.FX||selected.data.type ==billType.BILL){
+                                if(selected.data.calcBase&&selected.data.calcBase!=""){
+                                    alert("当前有基数计算不能插入子项。");
+                                    return;
+                                }
+                            }
+                        }
                         getGLJData('insert');// ProjectController.addRation(project, controller, rationType.volumePrice);
+                    },
+                    visible: function(key, opt){
+                        var selected = project.mainTree.selected;
+                        if(selected.sourceType == ModuleNames.bills&&selected.data.type == billType.DXFY){
+                            return false
+                        }else {
+                            return true
+                        }
                     }
                 },
                 "spr1": '--------',