Browse Source

add mixratio

zhangweicheng 7 years ago
parent
commit
87be0431d2

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

@@ -17,6 +17,7 @@ let glj_type_util = require('../../../public/cache/std_glj_type_util');
 let mongoose = require('mongoose');
 let ration = mongoose.model('ration');
 
+
 const ProjectModel = require('../../pm/models/project_model').project;
 class GLJController extends BaseController {
 
@@ -227,10 +228,46 @@ class GLJController extends BaseController {
             responseData.err = 1;
             responseData.msg = error;
         }
-
         response.json(responseData);
     }
 
+
+    //添加组成物
+    async addMixRatio(request,response){
+
+        let result={
+            error:0
+        };
+        try {
+            let data = request.body.data;
+            data = JSON.parse(data);
+            let gljList = data.gljList, parentInfo = data.parentInfo,mixRatios = [];
+            let projectGljModel = new GLJListModel();
+            let mixRatioModel = new MixRatioModel();
+            for(let g of gljList){
+                let newProjectGLJ = await projectGljModel.addList(g,parentInfo.unit_price_file_id);
+                let mixRatio = {
+                    glj_id:newProjectGLJ.glj_id,
+                    consumption:0,
+                    unit_price_file_id:parentInfo.unit_price_file_id,
+                    connect_key:parentInfo.connect_key,
+                    type: newProjectGLJ.type,
+                    code: newProjectGLJ.code,
+                    specs:newProjectGLJ.specs,
+                    name:newProjectGLJ.name,
+                    unit:newProjectGLJ.unit
+                };
+                newProjectGLJ.ratio_data = await mixRatioModel.add(mixRatio);
+                mixRatios.push(newProjectGLJ);
+            }
+            result.data = mixRatios;
+        }catch (err){
+            logger.err(err);
+            result.error=1;
+            result.message = err.message;
+        }
+        response.json(result);
+    }
     /**
      * 获取项目与单价文件对应的数据
      *

+ 1 - 3
modules/glj/models/glj_list_model.js

@@ -417,7 +417,7 @@ class GLJListModel extends BaseModel {
                     };
                     newMixRatioData.push(tem);
                 }
-                mixInsertResult= mixRatioModel.add(newMixRatioData);
+                mixInsertResult= await mixRatioModel.add(newMixRatioData);
             }
         }
         return gljData;
@@ -771,8 +771,6 @@ class GLJListModel extends BaseModel {
             let u_index = this.getIndex(tmp,['code','name','specs','unit','type'])
             unitPriceData[u_index] = tmp;
         }
-
-
         return [gljData,mixRatioData,unitPriceData];
 
     }

+ 1 - 0
modules/glj/routes/glj_router.js

@@ -17,6 +17,7 @@ router.post('/getData', gljController.init, gljController.getGljList);
 router.post('/update', gljController.init, gljController.updateData);
 router.post('/get-ratio', gljController.init, gljController.getRatio);
 router.post('/delete-ratio', gljController.init, gljController.deleteMixRatio);
+router.post('/add-ratio', gljController.init, gljController.addMixRatio);
 router.post('/get-project-info', gljController.init, gljController.getProjectInfo);
 router.post('/change-file', gljController.init, gljController.changeUnitPriceFile);
 router.post('/checkUnitFileName', gljController.init, gljController.checkUnitFileName);

+ 0 - 2
web/building_saas/main/html/main.html

@@ -1346,8 +1346,6 @@
 
 
             $(document).ready(function(){
-                console.log(1 - 1);
-                console.log(1 - 1);
                 //createTree();
               /*  document.onkeydown=keydown;
                 function keydown(e){

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

@@ -151,7 +151,7 @@ let calcTools = {
         if (this.isRationCategory(treeNode)) {
             if (treeNode.data.type != rationType.volumePrice) {
                 treeNode.data.gljList = projectObj.project.ration_glj.getGljArrByRation(treeNode.data);
-            };
+            }
         }
         else if (this.isBill(treeNode)){
             let nodeQ = this.uiNodeQty(treeNode);

+ 56 - 4
web/building_saas/main/js/models/project_glj.js

@@ -283,8 +283,7 @@ ProjectGLJ.prototype.updatePrice = function (recode, updateField, newval,from,cb
             gljs.push(glj);
             let nodes = me.getImpactRationNodes(gljs);//取到因为改变工料机价格而受影响的定额
             projectObj.project.calcProgram.calcRationsAndSave(nodes);//触发计算程序
-            socket.emit('unitFileChangeNotify', JSON.stringify(data));
-            projectObj.project.markUpdateProject({projectID:projectObj.project.ID(),'unitFileID':socketObject.getUnitFileRoomID()},"unitFile");
+            projectGljObject.onUnitFileChange(data);
             if(cb){
                 cb(gljs);
             }
@@ -344,8 +343,7 @@ ProjectGLJ.prototype.batchUpdatePrice = function (changeInfo,callback) {
             let nodes = me.getImpactRationNodes(gljs);//取到因为改变工料机价格而受影响的定额
             projectObj.project.calcProgram.calcRationsAndSave(nodes);//触发计算程序
             gljOprObj.showRationGLJSheetData();
-            socket.emit('unitFileChangeNotify', JSON.stringify(gljs));
-            projectObj.project.markUpdateProject({projectID:projectObj.project.ID(),'unitFileID':socketObject.getUnitFileRoomID()},"unitFile");
+            projectGljObject.onUnitFileChange(gljs);
             if(callback){
                 callback(gljs);
             }
@@ -412,6 +410,60 @@ ProjectGLJ.prototype.changeFile = function (changeData,callback) {
     });
 };
 
+ProjectGLJ.prototype.addMixRatio = function(selections,callback){
+    let gljList = [],allGLJ = gljOprObj.AllRecode;
+    $("#glj_tree_div").modal('hide');
+    if(selections.length == 0) {
+        return;
+    }
+    for(let glj of allGLJ){
+        let i_key = gljOprObj.getIndex(glj, gljLibKeyArray);
+        if(_.includes(selections,i_key)){
+            let pglj = {
+                project_id: projectObj.project.ID(),
+                glj_id: glj.ID,
+                name: glj.name,
+                code: glj.code,
+                original_code: glj.code,
+                unit: glj.unit,
+                specs: glj.specs,
+                base_price: glj.basePrice,
+                market_price: glj.basePrice,
+                shortName: glj.shortName,
+                type: glj.gljType,
+                adjCoe: glj.adjCoe,
+                from:'std',
+                repositoryId:glj.repositoryId,
+                materialType:glj.materialType,
+                materialCoe:glj.materialCoe,
+            };
+            if (glj.hasOwnProperty("compilationId")) {
+                pglj.from = "cpt";
+                if (glj.code.indexOf('-') != -1) {//这条工料机是用户通过修改名称、规格、型号等保存到补充工料机库的
+                    pglj.original_code = glj.code.split('-')[0];//取-前的编号作为原始编号
+                }
+            }
+            gljList.push(pglj);
+        }
+    }
+    gljList = _.sortByAll(gljList, ['type', 'code']);
+    if(gljList.length == 0) return;
+    let praentInfo = {
+        unit_price_file_id:projectObj.project.property.unitPriceFile.id,
+        connect_key:gljOprObj.getIndex(projectGljObject.selectedProjectGLJ,gljKeyArray)
+    };
+    $.bootstrapLoading.start();
+    CommonAjax.post("/glj/add-ratio", {gljList:gljList,parentInfo:praentInfo}, function (data) {
+        $.bootstrapLoading.end();
+        if(callback){
+            callback(data);
+        }
+    }, function () {
+        $.bootstrapLoading.end();
+    });
+
+}
+
 ProjectGLJ.prototype.checkUnitFileName = function(newVal,callback){
     let property = projectInfoObj.projectInfo.property;
     let data = {

+ 26 - 14
web/building_saas/main/js/views/glj_view.js

@@ -943,6 +943,8 @@ var gljOprObj = {
         }
         if ($('#actionType').val() == 'replace' || $('#actionType').val() == 'm_replace') {
             me.filterLibGLJByType();
+        }else if($('#actionType').val() == 'addMix'){
+            projectGljObject.filterLibGLJForMixRatio();
         }
         //文本筛选
         let searchStr = $('#gljSearchKeyword').val();
@@ -964,7 +966,7 @@ var gljOprObj = {
         }
     },
     setGLJSelection: function (args, newVal) {
-        if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert') {
+        if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert'|| $('#actionType').val() == 'addMix') {
             this.addGLJsSelection(args, newVal);
         } else {
             this.replaceGLJSelection(args, newVal);
@@ -1363,23 +1365,31 @@ $(function () {
             gljOprObj.gljLibSheet.name('glj_lib');
         }
         gljOprObj.gljLibSheetData = gljOprObj.AllRecode;
-        var selected = null;
-        if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert') {
+        let selections = [],selectMap = {};
+        if ($('#actionType').val() == 'add' || $('#actionType').val() == 'insert') {//插入,添加
             gljOprObj.GLJSelection = [];
-        } else {
-            selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
+        } else if($('#actionType').val() =='m_replace' || $('#actionType').val() == 'replace'){//替换、批量替换
+            let selected = gljOprObj.sheetData[gljContextMenu.selectedRow];
             var connect_key = gljOprObj.getIndex(selected, gljKeyArray);
             gljOprObj.GLJSelection = [connect_key];
+            selectMap[connect_key] = true;
             gljOprObj.filterLibGLJByType();
-        }
-
-        if (selected != null) {
-            var s_key = gljOprObj.getIndex(selected, gljLibKeyArray);
-            var r = _.find(gljOprObj.gljLibSheetData, function (item) {
-                var item_key = gljOprObj.getIndex(item, gljKeyArray);
-                return s_key == item_key;
-            });
-            r ? r.select = 1 : "";
+        }else if($('#actionType').val() =='addMix'){//添加组成物
+            gljOprObj.GLJSelection = [];
+            projectGljObject.filterLibGLJForMixRatio();
+            /*selections = projectGljObject.mixRatioData;  添加组成物的时候先不选中
+            gljOprObj.GLJSelection = [];
+            for(let s of selections){
+                let s_key = gljOprObj.getIndex(s, gljKeyArray);
+                selectMap[s_key] = true;
+                gljOprObj.GLJSelection.push(s_key);
+            }*/
+        }
+        for(let item of gljOprObj.gljLibSheetData){
+            let item_key = gljOprObj.getIndex(item, gljLibKeyArray);
+            if(selectMap[item_key]){
+                item.select = 1 ;
+            }
         }
         gljOprObj.showLibGLJSheetData();
     });
@@ -1424,6 +1434,8 @@ $(function () {
             gljOprObj.doReplaceGLJ();
         } else if ($('#actionType').val() == 'm_replace') {//批量替换工料机
             gljOprObj.doMReplaceGLJ();
+        }else if($('#actionType').val() == 'addMix'){
+            projectGljObject.addMixRatio();
         }
     })
 

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

@@ -1370,7 +1370,7 @@ $(function () {
             return;
         }
         me.calcInstallationFee(function () {
-
+            gljOprObj.refreshView();
         });
     });
     $('#btn_reset_to_default').click(function (){

+ 97 - 34
web/building_saas/main/js/views/project_glj_view.js

@@ -137,6 +137,46 @@ projectGljObject={
     getUsedTenderInfo:function() {
         return projectGljObject.usedTenderList.join("<br>");
     },
+    filterLibGLJForMixRatio:function () {
+        let me = this;
+        if(me.selectedProjectGLJ){
+            let showTypes = [];
+            let materialArr = [202, 203, 204];//混凝土、砂浆、配合比,
+            if(me.selectedProjectGLJ.type == gljType.MAIN_MATERIAL){//对于主材,只显示没有组成物并且除了自已的主材
+                showTypes = [gljType.MAIN_MATERIAL];
+            }else if(_.includes(materialArr,me.selectedProjectGLJ.type)){//混凝土、砂浆、配合比
+                showTypes = [gljType.GENERAL_MATERIAL];
+            }else if(me.selectedProjectGLJ.type == gljType.GENERAL_MACHINE){//机械类型可添加机械组成物、机上人工
+                showTypes = [gljType.MACHINE_COMPOSITION,gljType.MACHINE_LABOUR];
+            }
+            gljOprObj.gljLibSheetData = _.filter(gljOprObj.gljLibSheetData, function (item) {
+                if(me.selectedProjectGLJ.type == gljType.MAIN_MATERIAL){
+                    let p_index = gljOprObj.getIndex(me.selectedProjectGLJ,gljKeyArray);
+                    let i_index = gljOprObj.getIndex(item,gljLibKeyArray);
+                    return item.gljType == gljType.MAIN_MATERIAL &&item.component.length == 0 && p_index!=i_index
+                }else {
+                    return _.includes(showTypes,item.gljType);
+                }
+            });
+        }
+    },
+    addMixRatio:function () {
+        let me = this, projectGLJ = projectObj.project.projectGLJ;
+        for(let mix of me.mixRatioData){
+            let m_key = gljOprObj.getIndex(mix, gljKeyArray);
+            let t_index = gljOprObj.GLJSelection.indexOf(m_key);
+            t_index != -1?gljOprObj.GLJSelection.splice(t_index,1):'';
+        }
+        projectGLJ.addMixRatio(gljOprObj.GLJSelection,function (mixRatios) {
+            me.showMixRatioData();//这里添加的组成物的消耗量默认都是0,所以对父工料机的价格不会有影响,不用触发计算
+            projectGLJ.loadData(function () {
+                me.showProjectGljData();
+                gljOprObj.showRationGLJSheetData();
+                me.onUnitFileChange(me.selectedProjectGLJ);
+            });
+
+        });
+    },
     showMixRatioData:function () {
         let me = this,gljId = null,gljType = null;
         let sheet = me.projectGljSpread.getActiveSheet();
@@ -219,7 +259,7 @@ projectGljObject={
         }
         if(dataCode=='basePrice'||dataCode=='marketPrice'||dataCode=='supply'){//有组成物时,市场单价、定额价、供货方式不能修改
             if (data.ratio_data  && data.ratio_data.length > 0){
-               return false;
+                return false;
             }
             if(dataCode=='basePrice'&&data.is_add!=1){//如果不是新增,定额价不可修改。
                 return false;
@@ -227,7 +267,7 @@ projectGljObject={
         }
         if(dataCode == 'supply_quantity'){
             if (data.supply != 1) {// 如果为部分甲供则甲供数量需要可编辑,其它的都不能编辑
-               return false;
+                return false;
             }
         }
         if(dataCode == 'materialCoe'){//三材类别为空时,三材系数应只读,不允许输入。
@@ -270,7 +310,7 @@ projectGljObject={
             changeInfo.push({row:c.row,col:c.col,value:value});
             if(me.projectGljEditChecking(c.row,c.col)==false){//如果不能编辑
                 canChange = false;
-             }
+            }
             if (canChange==true&&!me.checkData(c.col,me.projectGljSetting,value)) {
                 alert('输入的数据类型不对,请重新输入!');
                 canChange = false;
@@ -279,7 +319,7 @@ projectGljObject={
         if(canChange == false){//恢复原来的值
             info.sheetName =="materialTreeSheet"?me.showMaterialTreeData():me.showProjectGljData();
         }else if(info.sheetName =="projectGljSheet"){
-             me.batchUpdatePrice(changeInfo);
+            me.batchUpdatePrice(changeInfo);
         }
     },
     batchUpdatePrice(changeInfo){
@@ -564,11 +604,12 @@ projectGljObject={
         let prow = parentSheet.getActiveRowIndex();//取父机械或组成物的下标
         let prowData = parentSheet.name() == 'projectGljSheet'?me.projectGljSheetData[prow]:me.materialTree.items[prow].data;
         composition.updateConsumption(updateData,recode,prowData.id,function (sid) {
-           /* if(parentSheet.name() == 'projectGljSheet'){ 之前是单行刷新,父工料机与组成物对应的工料机分开刷,发现这样比整个刷新慢所以先整个刷新,当以后数据量大的时候再测试
-                me.refreshProjectGljRowByID(sid);
-            }*/
+            /* if(parentSheet.name() == 'projectGljSheet'){ 之前是单行刷新,父工料机与组成物对应的工料机分开刷,发现这样比整个刷新慢所以先整个刷新,当以后数据量大的时候再测试
+             me.refreshProjectGljRowByID(sid);
+             }*/
             projectObj.project.projectGLJ.calcQuantity();
             me.refreshParentData(prow,prowData.id,sid);
+            me.onUnitFileChange(recode);
         });
     },
     refreshParentData:function (row,pid,sid) {
@@ -613,10 +654,15 @@ projectGljObject={
         if(updateNodes.length>0){
             projectObj.project.calcProgram.calcRationsAndSave(updateNodes,function () {
                 projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
+                installationFeeObj.calcInstallationFee();//计算安装增加费
             });
         }
         gljOprObj.refreshView();
     },
+    onUnitFileChange:function (data) {
+        socket.emit('unitFileChangeNotify', JSON.stringify(data));
+        projectObj.project.markUpdateProject({projectID:projectObj.project.ID(),'unitFileID':socketObject.getUnitFileRoomID()},"unitFile");
+    },
     deleteMixRatio:function (row) {
         let me = this, deleteRecode = me.mixRatioData[row];
         let consumption = deleteRecode.consumption;
@@ -628,6 +674,7 @@ projectGljObject={
         projectObj.project.composition.deleteComposition(updateData,deleteRecode,prowData.id,function () {
             me.refreshParentData(prow,prowData.id);
             me.mixRatioSheet.deleteRows(row,1);
+            me.onUnitFileChange(deleteRecode);
         });
     },
     getCompositionSumPrice : function(scene, affectRow, newValue = 0) {
@@ -692,7 +739,6 @@ projectGljObject={
             value= scMathUtil.roundForObj(value,getDecimal('glj.unitPrice'));//修改市场价和修改定额价时需要重新记算很多受影响的树节点,现在改成与定字额工料机那里调相同的方法。
             let editField = dataCode === 'basePrice'?"base_price":"market_price";
             projectObj.project.projectGLJ.updatePrice(recode,editField,value,'pg',callback);
-
         }else {
             let extend = {};
             // 如果是供货方式则需要处理数据
@@ -754,6 +800,22 @@ projectGljObject={
         }
         return result;
     },
+    getProjectGLJSelected:function () {
+        let me = projectGljObject;
+        let sheet = me.projectGljSpread.getActiveSheet();
+        let selectedProjectGLJ = null;
+        if(sheet.name() == 'projectGljSheet'){//projectGljSheet/materialSheet 工料机汇总和三材汇总表
+            let sel = me.projectGljSheet.getSelections()[0];
+            if(sel.row != -1 && me.projectGljSheetData.length>sel.row){
+                selectedProjectGLJ = me.projectGljSheetData[sel.row]
+            }
+        }else if(sheet.name() == 'materialTreeSheet' ){
+            if(me.materialTree.selected){
+                selectedProjectGLJ = me.materialTree.selected.data;
+            }
+        }
+        return selectedProjectGLJ;
+    },
     initRightClick : function() {
         let activeSheet = this.mixRatioSheet;
         let me = this;
@@ -780,11 +842,12 @@ projectGljObject={
                     name: '添加',
                     icon: 'fa-sign-in',
                     disabled: function () {
-                        return me.rightClickTarget.row === undefined;
+                        let projectGLJ = projectGljObject.getProjectGLJSelected();
+                        return !_.includes(compositionTypes,projectGLJ.type);
                     },
                     callback: function (key, opt) {
-                        let row = me.rightClickTarget.row;
-                        console.log(row);
+                        me.selectedProjectGLJ = projectGljObject.getProjectGLJSelected();
+                        getGLJData('addMix');
                     }
                 }
             }
@@ -808,12 +871,12 @@ projectGljObject={
     },
     calcPartASupplyFeeByProjectGLJs: function (projectGLJsArr) {
         for (let pGLJ of projectGLJsArr){
-              if (pGLJ.supply == supplyType.BFJG){
-                  let rations = calcTools.getRationsByProjectGLJ(pGLJ.id);
-                  projectObj.project.calcProgram.calcNodesAndSave(rations, function () {
-                      projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
-                  });
-              }
+            if (pGLJ.supply == supplyType.BFJG){
+                let rations = calcTools.getRationsByProjectGLJ(pGLJ.id);
+                projectObj.project.calcProgram.calcNodesAndSave(rations, function () {
+                    projectObj.mainController.refreshTreeNode(projectObj.project.mainTree.roots);
+                });
+            }
         }
     },
     checkUnitFileName:function (name,callback) {
@@ -875,23 +938,23 @@ $(function () {
         me.refreshDataSheet();
         loadProjectGljSize();
     });
-  /*  $('#ration_link').on('shown.bs.tab', function (e) {
-        let me = projectGljObject;
-        me.showTag='ration';
-        me.showProjectGljData();
-    });
-    $('#mix_ratio_link').on('shown.bs.tab', function (e) {
-        let me = projectGljObject;
-        me.showTag='mixRatio';
-        me.showProjectGljData();
-        me.initMixRatio();
-    });
-    $('#machine_ratio_link').on('shown.bs.tab', function (e) {
-        let me = projectGljObject;
-        me.showTag='machine';
-        me.showProjectGljData();
-        me.initMixRatio();
-    });*/
+    /*  $('#ration_link').on('shown.bs.tab', function (e) {
+     let me = projectGljObject;
+     me.showTag='ration';
+     me.showProjectGljData();
+     });
+     $('#mix_ratio_link').on('shown.bs.tab', function (e) {
+     let me = projectGljObject;
+     me.showTag='mixRatio';
+     me.showProjectGljData();
+     me.initMixRatio();
+     });
+     $('#machine_ratio_link').on('shown.bs.tab', function (e) {
+     let me = projectGljObject;
+     me.showTag='machine';
+     me.showProjectGljData();
+     me.initMixRatio();
+     });*/
     $('#pop-used-list').popover({
             placement: "bottom",
             html: true,