Selaa lähdekoodia

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

chenshilong 7 vuotta sitten
vanhempi
commit
df519524d6

+ 1 - 0
modules/all_models/bills.js

@@ -57,6 +57,7 @@ let billsSchema = new Schema({
     flags: [subSchema.flagsSchema],
     installationKey:String,//用来记录安装增加费的关联字段
     deleteInfo: deleteSchema,
+    isEstimate:{type: Number,default:0},       // 1 true 0 false 是否暂估
     remark:String
 });
 

+ 1 - 1
modules/glj/controllers/glj_controller.js

@@ -101,7 +101,7 @@ class GLJController extends BaseController {
             let model = null;
             switch (modelString) {
                 case 'glj':
-                    if (extend !== '') {
+                    if (extend&&extend !== '') {
                         extend = JSON.parse(extend);
                         for (let code in extend) {
                             updateData[code] = extend[code];

+ 14 - 10
modules/reports/rpt_component/jpc_flow_tab.js

@@ -124,6 +124,7 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.dispValueIdxLst = [];
         me.page_seg_map = [];
         me.disp_fields_idx = [];
+        me.disp_fields_ex_idx = [];
         me.seg_sum_fields_idx = [];
         me.seg_sum_tab_fields = [];
         me.page_sum_fields_idx = [];
@@ -373,6 +374,9 @@ JpcFlowTabSrv.prototype.createNew = function(){
         me.paging_option = option||JV.PAGING_OPTION_NORMAL;
         let CURRENT_FLOW_INFO = (me.isEx)?JV.NODE_FLOW_INFO_EX:JV.NODE_FLOW_INFO;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, me.isEx);
+        if (followTabEx) {
+            JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[JV.NODE_FLOW_INFO_EX][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_ex_idx, true);
+        }
         if (me.paging_option === JV.PAGING_OPTION_INFINITY) {
             rst = me.segments.length;
             let pageStatus = [true, true, false, true, true, true, false, false];
@@ -768,20 +772,20 @@ JpcFlowTabSrv.prototype.createNew = function(){
                         }
                     }
                     if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE) {
-                        for (let i = 0; i < tab_fields_ex.length; i++) {
-                            let tab_field = tab_fields_ex[i];
-                            let data_field = null;
-                            if (me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX) {
-                                data_field = data_details_ex[me.disp_fields_idx[i]];
+                        for (let idx_ex = 0; idx_ex < tab_fields_ex.length; idx_ex++) {
+                            let tab_fieldex = tab_fields_ex[idx_ex];
+                            let data_fieldex = null;
+                            if (me.disp_fields_ex_idx[idx_ex] !== JV.BLANK_FIELD_INDEX) {
+                                data_fieldex = data_details_ex[me.disp_fields_ex_idx[idx_ex]];
                             } else {
-                                data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
-                                if (data_field) {
-                                    data_field = data_field[JV.PROP_AD_HOC_DATA];
+                                data_fieldex = JE.F(tab_fieldex[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                                if (data_fieldex) {
+                                    data_fieldex = data_fieldex[JV.PROP_AD_HOC_DATA];
                                 }
                             }
-                            if (!(tab_field[JV.PROP_HIDDEN])) {
+                            if (!(tab_fieldex[JV.PROP_HIDDEN])) {
                                 if (contentValuesIdx[rowIdx][0] === JV.TYPE_FOLLOW_MODE && contentValuesIdx[rowIdx][1] === JV.DISPLAY_VAL_TYPE_NORMAL) {
-                                    rst.push(me.outputTabField(band, tab_field, data_field, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
+                                    rst.push(me.outputTabField(band, tab_fieldex, data_fieldex, contentValuesIdx[rowIdx][2], -1, contentValuesIdx.length, rowIdx, 1, 0, unitFactor, true, controls, multiColIdx));
                                 }
                             }
                         }

+ 4 - 2
modules/reports/util/rpt_construct_data_util.js

@@ -1006,8 +1006,10 @@ function ext_getPropertyByForeignId(foreignIdVal, adHocIdKey, propKey, dftValIfN
         if (foreignIdVal instanceof Array) {
             for (let idVal of foreignIdVal) {
                 isFound = false;
-                for (let i = 0; i < dtObj.data.length; i++) {
-                    let item = (dtObj.data[i]._doc)?dtObj.data[i]._doc:dtObj.data[i];
+                let dataArr = dtObj.data;
+                if (dtObj.moduleName === "projectGLJ") dataArr = dtObj.data.gljList;
+                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) {

+ 2 - 2
test/unit/reports/test_tpl_09.js

@@ -58,7 +58,7 @@ test('测试 - 测试模板啦: ', function (t) {
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
                 try {
-                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.jsp");
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject_建筑09表.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();
@@ -72,7 +72,7 @@ test('测试 - 测试模板啦: ', function (t) {
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
-                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/rptPageResult.jsp");
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/rptPageResult_建筑09表.jsp");
                     } else {
                         console.log("oh! no pages were created!");
                     }

+ 4 - 3
test/unit/reports/test_tpl_09_1.js

@@ -58,8 +58,9 @@ test('测试 - 测试模板啦: ', function (t) {
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
                 try {
-                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject.jsp");
+                    // fsUtil.writeObjToFile(rawDataObj, "D:/GitHome/ConstructionCost/tmp/rptTplRawDataObject_建筑09-1表.jsp");
                     let tplData = rptDataUtil.assembleData(rawDataObj);
+                    // fsUtil.writeObjToFile(tplData, "D:/GitHome/ConstructionCost/tmp/rptTplAssembledData_建筑09-1表.jsp");
                     //it's time to build the report!!!
                     let printCom = JpcEx.createNew();
                     rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_PAGE_SIZE] = pagesize;
@@ -70,7 +71,7 @@ test('测试 - 测试模板啦: ', function (t) {
                     let maxPages = printCom.totalPages;
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties);
                     if (pageRst) {
-                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult.jsp");
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_建筑09-1表.jsp");
                     } else {
                         console.log("oh! no pages were created!");
                     }
@@ -131,7 +132,7 @@ test('close the connection', function (t) {
         mongoose.disconnect();
         t.pass('closing db connection');
         t.end();
-    }, 3000);
+    }, 1000);
     // mongoose.disconnect();
     // t.pass('closing db connection');
     // t.end();

+ 33 - 6
web/building_saas/main/js/models/project_glj.js

@@ -445,12 +445,21 @@ ProjectGLJ.prototype.changeIsEvaluate=function (id){
         gljs.push(glj);
         let nodes = projectGLJ.getImpactRationNodes(gljs);//取到因为改变工料机价格而受影响的定额
         //更新对应的工料机类型的定额
-        let ration =_.find(projectObj.project.Ration.datas,{'type':rationType.gljRation,'projectGLJID':glj.id});
-        if(ration){
-            ration.isEstimate =glj.is_evaluate?1:0;
-            let ration_node = projectObj.project.mainTree.getNodeByID(ration.ID);
-            ration_node?projectObj.mainController.refreshTreeNode([ration_node]):"";
+        let rations =_.filter(projectObj.project.Ration.datas,{'type':rationType.gljRation,'projectGLJID':glj.id});
+        let ration_nodes = [];
+        for(r of rations){
+            if(r){
+                r.isEstimate =glj.is_evaluate?1:0;
+                let ration_node = projectObj.project.mainTree.getNodeByID(r.ID);
+                ration_node?ration_nodes.push(ration_node):'';
+            }
+        }
+        let ration_glj_nodes = projectGLJ.getMainAndEquGLJNodeByID(glj.id);//取显示在造价书界面上的主材和设备节点
+        for(rg of ration_glj_nodes){
+            rg.data.isEstimate =glj.is_evaluate?1:0;
+            ration_nodes.push(rg);
         }
+        ration_nodes.length>0?projectObj.mainController.refreshTreeNode(ration_nodes):"";
         projectObj.project.calcProgram.calcRationsAndSave(nodes);//触发计算程序
         return gljs;
     }
@@ -477,10 +486,19 @@ ProjectGLJ.prototype.refreshTreeNodePriceIfNeed = function (data) {
             }
         })
         projectObj.mainController.refreshTreeNode(nodes);
-
     }
 }
 
+ProjectGLJ.prototype.getMainAndEquGLJNodeByID = function (id) {//通过ID取显示到主树上的主材和设备节点
+    let nodes = [];
+    if(projectInfoObj.projectInfo.property.displaySetting.disPlayMainMaterial == true){
+         nodes = _.filter(projectObj.project.mainTree.items, function (tem) {
+            return tem.sourceType == ModuleNames.ration_glj && tem.data.projectGLJID == id
+        })
+    }
+    return nodes;
+};
+
 //根据工料机,取得所有受影响的定额节点
 ProjectGLJ.prototype.getImpactRationNodes = function (gljs) {
     let nodes = [];
@@ -509,6 +527,8 @@ ProjectGLJ.prototype.getImpactRationNodes = function (gljs) {
     }
     return nodes;
 };
+
+
 ProjectGLJ.prototype.refreshRationGLJPrice = function (glj) {
     for (let ration_glj of gljOprObj.sheetData) {
         if (ration_glj.projectGLJID == glj.id) {
@@ -651,6 +671,13 @@ ProjectGLJ.prototype.getMarketPrice = function (glj) {
     }
 }
 
+ProjectGLJ.prototype.isEstimateType = function(type){
+    let typeString = type + "";
+    if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料、主材、设备类型才显示是否暂估
+       return type;
+    }
+    return false;
+};
 
 ProjectGLJ.prototype.getShortNameByID = function (ID) {
     let gljTypeMap = this.datas.constData.gljTypeMap;

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

@@ -701,8 +701,7 @@ var ration_glj = {
                 var mixRatioMap = projectGLJData.mixRatioMap;
                 var glj = _.find(projectGljs, {'id': ration.projectGLJID});
                 if (glj) {
-                    let typeString = glj.type + "";
-                    if (typeString.indexOf("2") != -1) {//只有材料类型才显示是否暂估
+                    if(projectObj.project.projectGLJ.isEstimateType(glj.type)){
                         ration.isEstimate = glj.is_evaluate;
                     }
                     ration = gljOprObj.setGLJPrice(ration,glj);

+ 2 - 4
web/building_saas/main/js/views/glj_view.js

@@ -946,8 +946,7 @@ var gljOprObj = {
             for (var i = 0; i < ration_gljs.length; i++) {
                 var glj = _.find(projectGljs, {'id': ration_gljs[i].projectGLJID});
                 if (glj) {
-                    let typeString = ration_gljs[i].type + "";
-                    if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料类型才显示是否暂估
+                    if(projectObj.project.projectGLJ.isEstimateType(ration_gljs[i].type )){
                         ration_gljs[i].isEstimate = glj.is_evaluate;
                     }
                     ration_gljs[i].shortName =projectObj.project.projectGLJ.getShortNameByID(ration_gljs[i].type);
@@ -1052,8 +1051,7 @@ var gljOprObj = {
                 isAdd: pg.unit_price.is_add,
                 GLJID: pg.glj_id
             };
-            let typeString = pg.type + "";
-            if (typeString.startsWith("2")||typeString=='4'||typeString=='5') {//只有材料类型才显示是否暂估
+            if(projectObj.project.projectGLJ.isEstimateType(pg.type)){
                 tem.isEstimate =  pg.is_evaluate;
             }
             this.setGLJPrice(tem,pg);

+ 6 - 0
web/building_saas/main/js/views/main_tree_col.js

@@ -267,6 +267,12 @@ let MainTreeCol = {
         isSubcontract: function (node){
             if (calcTools.isRationCategory(node))
                 return new GC.Spread.Sheets.CellTypes.CheckBox();
+        },
+        isEstimate:function (node) {
+            //只对分项、补项、材料(包括混凝土等)、主材、设备有效
+            if(MainTreeCol.readOnly.glj(node)||(calcTools.isGljRation(node)&&projectObj.project.projectGLJ.isEstimateType(node.data.subType))||(MainTreeCol.readOnly.bills(node)&&(node.data.type == billType.BX||node.data.type == billType.FX))){
+                return new GC.Spread.Sheets.CellTypes.CheckBox();
+            }
         }
     },
     editChecking:function(node){

+ 39 - 9
web/building_saas/main/js/views/project_view.js

@@ -373,20 +373,24 @@ var projectObj = {
             };*/
         }
     },
-    updateRemark : function (node,value) {
-        console.log(value);
-        if(node.data.remark == value){
+    updateNodeField : function (node,value,filedID,callback) {
+        if(node.data[filedID] == value){
             return;
         }
         let data =  {
             type:node.sourceType,
             data:{
-                ID:node.data.ID,
-                remark:value
+                ID:node.data.ID
             }
         };
+        data.data[filedID] = value;
+        $.bootstrapLoading.start();
         projectObj.project.updateNodes([data],function () {
-            node.data.remark = value;
+            node.data[filedID] = value;
+            if(callback){
+                callback();
+            }
+            $.bootstrapLoading.end();
         })
     },
     updateCellValue: function (node, value, colSetting,editingText) {
@@ -394,7 +398,7 @@ var projectObj = {
         if(node.sourceType==project.ration_glj.getSourceType()){
             project.ration_glj.updateFromMainSpread(value,node,fieldName);
         }else if(fieldName === 'remark'){
-            projectObj.updateRemark(node,value);
+            projectObj.updateNodeField(node,value,'remark');
         }  else if(calcTools.isGljRation(node)){
             gljOprObj.updateRationTypeGLJ(value,node,fieldName);
         } else if (value !== calcFees.getFee(node.data, fieldName)||fieldName == 'quantity') {//工程量需要进行转换,所以做特殊处理
@@ -1030,10 +1034,36 @@ var projectObj = {
  },
 
     onButtonClick: function (e, info) {
+        let colSetting = projectObj.mainController.setting.cols[info.col];
         let node = projectObj.project.mainTree.items[info.row];
-        if (node.data.isSubcontract) node.data.isSubcontract = false
+        let fieldName = colSetting.data.field;
+        if(fieldName == "isSubcontract"){
+            projectObj.onSubcontractClick(node);
+        }else if(fieldName == "isEstimate"){
+            projectObj.onIsEstimateClick(node,info);
+        }
+    },
+    onIsEstimateClick: function(node,info){
+        let checkboxValue = info.sheet.getCell(info.row, info.col).value();
+        let cell = info.sheet.getCell(info.row, info.col), newval = 0;
+        if (checkboxValue) {
+            newval = 0;
+            cell.value(newval);
+        } else {
+            newval = 1;
+            cell.value(newval);
+        }
+        if(MainTreeCol.readOnly.bills(node)){
+            projectObj.updateNodeField(node,newval,'isEstimate');
+        }else if(node.data.projectGLJID){//更新的是定额类型的工料机或者是显示在造价书页面的主材、设备
+            console.log(node);
+            let updateData = {id: node.data.projectGLJID, field: 'is_evaluate', value: newval};
+            projectObj.project.projectGLJ.pGljUpdate(updateData);
+        }
+    },
+    onSubcontractClick:function (node) {//点击分包费checkbox
+        if (node.data.isSubcontract) node.data.isSubcontract = false;
         else node.data.isSubcontract = true;
-
         node.changed = true;
         projectObj.project.calcProgram.calcAndSave(node);
     },