Parcourir la source

Merge branch '分摊功能' of http://192.168.1.41:3000/SmartCost/YangHuCost into 分摊功能

chenshilong il y a 5 ans
Parent
commit
003b89c4b9

+ 1 - 1
modules/ration_glj/controllers/ration_glj_controller.js

@@ -78,7 +78,7 @@ async function getGLJData(req, res) {
             libData.push({ name: '补充工料机', gljLibId: COMPLEMENTARY_LIB });
             if (gljLibId) { // 替换人材机初始化会触发此条件
                 const orgDefalutLib = libData.find(lib => lib.isDefault);
-                const newDefaultLib = libData.find(lib => lib.gljLibId === +gljLibId);
+                const newDefaultLib = libData.find(lib => lib.gljLibId === gljLibId);
                 if (orgDefalutLib && newDefaultLib) {
                     orgDefalutLib.isDefault = false;
                     newDefaultLib.isDefault = true;

+ 10 - 4
web/building_saas/main/js/models/calc_program.js

@@ -528,13 +528,18 @@ let calcTools = {
             }
             else if (treeNode.data.type == rationType.gljRation){
                 let prc = 0;
-                if (treeNode.data.subType === gljType.EQUIPMENT && calcTools.inBase(baseName, 'SC_SBF'))
-                    prc = gljOprObj.getMarketPrice(treeNode)
+                // if (treeNode.data.subType === gljType.EQUIPMENT && calcTools.inBase(baseName, 'SC_SBF'))
+                //     prc = gljOprObj.getMarketPrice(treeNode)
+                // else
+                //     prc = gljOprObj.getBasePrice(treeNode);
+
+                if (baseName.includes('定额'))
+                    prc = gljOprObj.getBasePrice(treeNode)
                 else
-                    prc = gljOprObj.getBasePrice(treeNode);
+                    prc = treeNode.data.marketUnitFee ? parseFloat(treeNode.data.marketUnitFee).toDecimal(decimalObj.ration.unitPrice) : gljOprObj.getBasePrice(treeNode);
 
                 result = (prc * nodeQ).toDecimal(decimalObj.ration.unitPrice);
-            }
+            };
 
         }
         else if (treeNode.data.subType === gljType.GENERAL_MACHINE && calcTools.inBase(baseName, 'JSRGF')) {
@@ -1769,6 +1774,7 @@ class CalcProgram {
 
     // 清单部分抽取出来,供分摊清单公用。commonCalcType:1 叶子清单汇总定额的费用类别; 2 父清单汇总子清单的费用类别。3: 分摊:叶子清单汇总定额的费用类别。
     innerCalcBill(treeNode, commonCalcType, tender = tenderTypes.ttCalc){
+        let me = this;
         treeNode.data.programID = null;
         calcTools.initFees(treeNode);
         let nodes = [];

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

@@ -924,7 +924,7 @@ ProjectGLJ.prototype.getHighlandFee = function (feeType) {
     return rate*0.01
 };
 
-ProjectGLJ.prototype.calcEachFreightOrPrice = function (temp,type,priceMap) {//
+ProjectGLJ.prototype.calcEachFreightOrPrice = function (temp,type,priceMap,needUpdate=false) {//
     if(temp){
          if(type == "freight" && temp.conveyance !="自办运输") return null;
         let sum =0;
@@ -934,6 +934,7 @@ ProjectGLJ.prototype.calcEachFreightOrPrice = function (temp,type,priceMap) {//
         let decimal = type == "freight"?getDecimal("glj.unitPrice"):getDecimal("glj.unitPriceHasMix");
         //因为材料计算的数据是保存在单价文件里的,有可能存在共享的情况,这样的话就不能用单价文件里的项目工料机ID来匹配,要用5大项匹配
         let pgljMap = {};
+        if(needUpdate==false && (!temp.rations || temp.rations.length == 0))return null;//没有定额时不计算
         for(let pg of this.datas.gljList){
             pgljMap[gljUtil.getIndex(pg)] = pg
         }
@@ -952,7 +953,7 @@ ProjectGLJ.prototype.calcEachFreightOrPrice = function (temp,type,priceMap) {//
         }
         sum = scMathUtil.roundForObj(sum,decimal)+"";
         if(type == "freight"){
-          let exp = `((${expList.join("+")})+${temp.otherFee})x${temp.weightCoe}`
+          let exp = expList.length == 0?`${temp.otherFee}x${temp.weightCoe}`:`((${expList.join("+")})+${temp.otherFee})x${temp.weightCoe}`
           let ndoc = {};
           if(temp.unitFreight != sum) ndoc['unitFreight'] = sum;
           if(temp.exp != exp) ndoc['exp'] = exp;
@@ -999,7 +1000,7 @@ ProjectGLJ.prototype.calcEachFreightOrPrice = function (temp,type,priceMap) {//
             let hs = scMathUtil.roundForObj(tt*hightFeeRate,processDecimal);//(人工定额消耗量*定额价*定额工程量+机械定额消耗量*定额价*定额工程量)*高原取费类别费率
             exp = expList.join("+");
             if(hightFeeRate!=0) exp += `+${tt}x${hightFeeRate*100}%`;
-            if(assFeeRate!=0) exp += '+'+assList.join("+");
+            if(assFeeRate!=0 && assList.length > 0) exp += '+'+assList.join("+");
             result = scMathUtil.roundForObj(as + result,processDecimal);
             result = scMathUtil.roundForObj(hs + result,processDecimal);
             heightFee = hs;
@@ -1769,4 +1770,4 @@ class DivideSetting {
   loadData (datas) {
       this.datas = datas;
   };
-}
+}

+ 76 - 30
web/building_saas/main/js/views/divide_view.js

@@ -85,14 +85,11 @@ let divideObj = {
       if(parentMap[-1]&&parentMap[-1].length>0){
         for(let r of parentMap[-1]){
           r.collapsed = false;
+          setItemsPrice(r);
           datas.push(r)
           if(parentMap[r.ID] && parentMap[r.ID].length > 0){
             for(let c of parentMap[r.ID]){
-              if(c.fees){
-                let commonFee = _.find(c.fees,{"fieldName":"common"})
-                if (commonFee)
-                    c.marketPrice = commonFee.unitFee;
-              }
+              setItemsPrice(c);
               datas.push(c);
             }
           }
@@ -100,6 +97,25 @@ let divideObj = {
       }
       return datas;
     }
+
+    function setItemsPrice(item){
+      if(item.fees){
+        let commonFee = _.find(item.fees,{"fieldName":"common"})
+        if (commonFee){
+          item.marketPrice = commonFee.unitFee;
+          item.marketTotalFee = commonFee.totalFee;
+        }
+          
+      }
+    }
+
+  },
+
+
+  showCalcProgramDatas:function(){
+    if(!$('#divede_calc_nav').hasClass('active')) return;
+    this.divideSubSpread.setActiveSheetIndex(1);
+    //this.rationGLJDatas = getTreeRationGLJDatas();
   },
 
   showRationGLJDatas:function(){
@@ -243,9 +259,9 @@ let divideObj = {
     if(data){
       if(data.itemType == "分摊项"){
         //金额,预算价,取费类别不可编辑
-        if(dataCode =="marketTotalFee" || dataCode =="marketPrice" || dataCode =="programID" ) return false;
+        if(dataCode =="marketTotalFee" || dataCode =="marketUnitFee" || dataCode =="programID" ) return false;
         //有子项时,单价不可编辑
-        if(dataCode =="marketUnitFee"&& _.find(me.divideDatas,{ParentID:data.ID})) return false;
+        if(dataCode =="marketPrice"&& _.find(me.divideDatas,{ParentID:data.ID})) return false;
       }
       if( data.itemType == "量价" && dataCode =="marketTotalFee") return false//量价:“金额”不可编辑。
       if(data.itemType == "定额"){ //定额:“单位”、“单价”、“金额”、“预算价”
@@ -284,6 +300,7 @@ let divideObj = {
     let selected = this.getSelectedItem();
     if(itemType!="分摊项"){//当插入定额或者量价时:
       newItem.ParentID = selected.itemType == "分摊项"?selected.ID:selected.ParentID;
+      newItem.fees = [{fieldName:"common",tenderTotalFee:0,unitFee:0,totalFee:0,tenderUnitFee:0}];
     }
     if(itemType == "定额") newItem.type = rationType.ration;
     if(itemType == "量价"){
@@ -296,19 +313,20 @@ let divideObj = {
     datas.push({type:"add",doc:newItem});
     await this.updateItem(datas);
   },
-  calcBills:function(bills){
+  calcBills:function(bills,deleteMap){
     let divideSetting =  projectObj.project.divide_setting.datas;
     let subNodes = [];
     let item=null;
     for(let c of divideSetting.divideList){
       if(c.ParentID == bills.ID){
+        if(deleteMap && deleteMap[c.ID]) continue;
         this.initFeeIndexs(c);
         subNodes.push({data:c, sourceType:"ration", calcType: 1, updateData:[]});
       } 
       if(c.ID == bills.ID) item = c;
     }
     projectObj.project.calcProgram.innerCalcBill({data:item, sourceType:"bills", calcType: 3, updateData:[],children:subNodes},3);
-    console.log(item)
+    return item;
   },
   initFeeIndexs:function(item){
     item.feesIndex = {};
@@ -327,9 +345,15 @@ let divideObj = {
       for(let s of this.divideDatas){
         if(s.ParentID == selected.ID) subItems.push({type:"delete",ID:s.ID});
       }
+    }else{
+      let deleteMap = {};
+      deleteMap[selected.ID] = true;
+      let item = this.calcBills({ID:selected.ParentID},deleteMap);
+      subItems.push({ID:item.ID,type:'update',doc:{fees:item.fees}});  
     }
     subItems.push({type:"delete",ID:selected.ID,itemType:selected.itemType});
     await this.updateItem(subItems);
+
   },
   getNewSeqs:function(selected,newItem){
     let seq = 1,datas=[],refreshSeq = false;
@@ -394,23 +418,25 @@ let divideObj = {
     if(pEngineer) data.programID = pEngineer;
     data.divideDatas = datas;
     let sel = this.divideSheet.getSelections()[0];
-    this.divideSheet.setSelection(sel.row+1,sel.col,sel.rowCount,sel.colCount);
     await this.updateDivideRation(data);
+    this.divideSheet.setSelection(sel.row+1,sel.col,sel.rowCount,sel.colCount);
 
   },
   updateDivideRation:async function(data){
-    let divideSetting =  projectObj.project.divide_setting.datas
+    let divideSetting =  projectObj.project.divide_setting.datas;
+    let newRation = data;
     try {
       $.bootstrapLoading.start();
       let result = await ajaxPost("/ration/updateDivideRation",data)
       if(data.type=="add"){
         data.divideDatas.push({type:"add",doc:result.ration});
         this.refreshDivideCaches(data.divideDatas);
+        newRation = result.ration;
         if(result.projectGLJList) projectObj.project.projectGLJ.loadNewProjectGLJToCaches(result.projectGLJList,true);   
         if(result.ration_gljs) divideSetting.ration_gljs = divideSetting.ration_gljs.concat(result.ration_gljs);
         if(result.ration_coes) divideSetting.ration_coes = divideSetting.ration_coes.concat(result.ration_coes);
       } 
-      await this.calcDivideItem(data);
+      await this.calcDivideItem(newRation);
     } catch (error) {
       console.log(error)
     }
@@ -419,30 +445,33 @@ let divideObj = {
   },
   calcDivideItem:async function(divide){
     let updateDatas = [];
+    let children =[];
     let divideSetting =  projectObj.project.divide_setting.datas
     if(divide.itemType != "分摊项"){//不是分摊项,调用计算程序
       let parentSum = 0;
       let parent = null;
       projectObj.project.calcProgram.innerCalcRation({data:divide, sourceType:"ration", calcType: 1, updateData:[]});
       if(divide.itemType == "定额"){
-        let comnonFee = _.find(divide.fees,{"fieldName":"common"})
-        if(comnonFee)updateDatas.push({ID:divide.ID,type:'update',doc:{fees:divide.fees,marketUnitFee:comnonFee.unitFee,marketTotalFee:comnonFee.totalFee}});
-       
+        updateDatas.push({ID:divide.ID,type:'update',doc:{fees:divide.fees}});  
       }else{
-        updateDatas.push({ID:divide.ID,type:'update',doc:{fees:divide.fees,marketUnitFee:divide.marketUnitFee,marketTotalFee:divide.marketTotalFee}});
+        updateDatas.push({ID:divide.ID,type:'update',doc:{fees:divide.fees,marketUnitFee:divide.marketUnitFee}});
       } 
-      parentSum = this.getTotolFee(divide);
       for(let c of divideSetting.divideList){
         if(c.ID == divide.ParentID) parent = c;
-        if(c.ParentID == divide.ParentID && c.ID != divide.ID){
-          parentSum = scMathUtil.roundForObj(parentSum+this.getTotolFee(c),getDecimal("process"))
+        if(c.ParentID == divide.ParentID){
+          let t = c.ID != divide.ID?c:divide;
+          this.initFeeIndexs(t);
+          children.push({data:t, sourceType:"ration", calcType: 1, updateData:[]});
         }
       }
-      parentSum = scMathUtil.roundForObj(parentSum,getDecimal("bills.totalPrice"));
-      if(parent && parent.marketTotalFee != parentSum) updateDatas.push({ID:parent.ID,type:'update',doc:{marketTotalFee:parentSum}});; 
+      if(children.length > 0){
+        projectObj.project.calcProgram.innerCalcBill({data:parent, sourceType:"bills", calcType: 3, updateData:[],children:children},3);
+        updateDatas.push({ID:parent.ID,type:'update',doc:{fees:parent.fees}});  
+      } 
+    }else{
+      divide = this.calcBills(divide);
+      updateDatas.push({ID:divide.ID,type:'update',doc:{fees:divide.fees}});  
     }
-
-
     updateDatas.length > 0?await this.updateItem(updateDatas):this.showDatas();
   },
 
@@ -511,14 +540,24 @@ let divideObj = {
     if(recode.itemType == "分摊项"){
       if(dataCode == "quantity"){
         value = scMathUtil.roundForObj(value,3);
-        let tu = scMathUtil.roundForObj(recode.marketUnitFee&&recode.marketUnitFee!=""?recode.marketUnitFee:0,getDecimal("bills.unitPrice"))
-        doc["marketTotalFee"] = scMathUtil.roundForObj(value * tu,getDecimal("bills.totalPrice"))
+        let commonFee = _.find(recode.fees,{"fieldName":"common"})
+        if (commonFee){
+          let tu = scMathUtil.roundForObj(commonFee.unitFee&&commonFee.unitFee!=""?commonFee.unitFee:0,getDecimal("bills.unitPrice"))
+          commonFee.totalFee = scMathUtil.roundForObj(value * tu,getDecimal("bills.totalPrice"));
+          doc["fees"] = recode.fees;
+        }
       }
-      if(dataCode == "marketUnitFee"){
+      if(dataCode == "marketPrice"){
         value = scMathUtil.roundForObj(value,getDecimal("bills.unitPrice"));
-        let tq = scMathUtil.roundForObj(recode.quantity && recode.quantity!=""?recode.quantity:0,3)
-        doc["marketTotalFee"] = scMathUtil.roundForObj(value * tq,getDecimal("bills.totalPrice"))
+        let commonFee = _.find(recode.fees,{"fieldName":"common"})
+        if (commonFee){
+          //let tu = scMathUtil.roundForObj(commonFee.unitFee&&commonFee.unitFee!=""?commonFee.unitFee:0,getDecimal("bills.unitPrice"))
+          commonFee.unitFee = scMathUtil.roundForObj(value,getDecimal("bills.unitPrice"));
+          doc["fees"] = recode.fees;
+        }
+        return {ID:recode.ID,type:'update',doc:doc};
       }
+      
     }
     if(recode.itemType =="定额"&& dataCode == 'quantity'){
       if(value){
@@ -528,7 +567,7 @@ let divideObj = {
       }
     }
 
-    if(recode.itemType =="量价" && dataCode=="marketPrice") dataCode=="marketUnitFee"
+    if(recode.itemType =="量价" && dataCode=="marketPrice") dataCode="marketUnitFee"
     doc[dataCode]=value;
     return {ID:recode.ID,type:'update',doc:doc}
   },
@@ -547,6 +586,8 @@ let divideObj = {
     this.divideSubSheet = this.divideSubSpread.getSheet(0);
     sheetCommonObj.initSheet(this.divideSubSheet, gljCol.ration_glj_setting, 0);
     SheetDataHelper.protectdSheet(this.divideSubSheet);
+    this.calcProgramSheet = this.divideSubSpread.getSheet(1);
+    calcProgramObj.initSheet(this.calcProgramSheet);
   },
   initNavItem(){
     let selected = this.getSelectedItem();
@@ -701,7 +742,7 @@ let divideObj = {
                 },
                 callback: function (key, opt) {  
                   let selected = me.getSelectedItem();
-                  me.calcBills(selected);
+                  console.log(me.calcBills(selected));
                 }
             },
             "removeItem": {
@@ -889,4 +930,9 @@ $('#divide_zmhs_toogle').bind('click',function (){
       $("#divide_hs-nav").click();
   }
    $("#divide_zmhs_toogle").hide();
+});
+
+$('.divideBottom ul li a').bind('click',function () {
+  divideObj.showRationGLJDatas();
+  divideObj.showCalcProgramDatas();
 });

+ 25 - 2
web/building_saas/main/js/views/fee_rate_view.js

@@ -178,7 +178,7 @@ var feeRateObject={
                     sheet.getCell(row, 0).cellType(treeType);
                     visibleMap[data[row].ID] = treeType.collapsed;
                     feeRateObject.setRowVisible(data,row,visibleMap,sheet);
-                } else if (col === 1 && commonUtil.isDef(data[row].originalRate) && data[row].originalRate !== +val) {
+                } else if (col === 1 && this.rateShouldMark(data[row], val)) {
                     sheet.getCell(row, col).foreColor('red');
                 }
             }
@@ -186,6 +186,29 @@ var feeRateObject={
         sheet.resumeEvent();
         sheet.resumePaint();
     },
+    rateShouldMark: function (rateItem, val) {
+        if (!rateItem) {
+            return false;
+        }
+        if (rateItem.rate === null) {
+            return false;
+        }
+        if (rateItem.sum) {
+            return false;
+        }
+        if (rateItem.subFeeRate) {
+            const selectedSubRate = rateItem.subFeeRate.recodes && rateItem.subFeeRate.recodes[0] ?
+                rateItem.subFeeRate.recodes[0].optionList.find(item => item.selected)
+                : null;
+            if (!selectedSubRate) {
+               return false;
+            }
+            const valInMap = rateItem.subFeeRate.valueMaps.find(item => item.ID === selectedSubRate.name);
+            return !!(valInMap && valInMap.value !== +val);
+        } else {
+            return commonUtil.isDef(rateItem.originalRate) && rateItem.originalRate !== +val;
+        }
+    },
     setRowVisible:function (data,row,visibleMap,sheet) {
         sheet.getRange(row , -1, 1, -1).visible(getVisible(data[row].ParentID));//显示或隐藏
         function getVisible(ParentID) {
@@ -542,7 +565,7 @@ var feeRateObject={
                         let col = _.findIndex(me.mainFeeRateSetting.header,{'dataCode':key});
                         me.mainFeeRateSheet.setValue(row, col, u.doc[key]);
                         if(key == 'rate'){
-                            const foreColor = commonUtil.isDef(rateItem.originalRate) && rateItem.originalRate !== +u.doc[key] ? 'red' : 'black';
+                            const foreColor = feeRateObject.rateShouldMark(rateItem, u.doc[key]) ? 'red' : 'black';
                             me.mainFeeRateSheet.getCell(row, col).foreColor(foreColor);
                             feerateInfo.push({rateID:u.rateID,value:u.doc[key]});
                         }

+ 3 - 3
web/building_saas/main/js/views/material_calc_view.js

@@ -455,7 +455,7 @@ materialCalcObj = {
          };
         return newData;
     },
-    getFreightEXP:function(obj,doc){
+    getFreightEXP:function(obj,doc,needUpdate){
       let item = _.clone(obj);
       if(doc) gljUtil.setProperty(item,doc);
       let material = materialCalcObj.getMaterialSelected();
@@ -465,7 +465,7 @@ materialCalcObj = {
       }
       //(单位运价×(1+运距增加率%)+装卸费单价×装卸次数+其它费用)×单位毛重×加权系数
       if(item.conveyance == "自办运输"){
-        let t = projectObj.project.projectGLJ.calcEachFreightOrPrice(item,"freight",{})
+        let t = projectObj.project.projectGLJ.calcEachFreightOrPrice(item,"freight",{},needUpdate);
         return t.doc.exp;
       }
 
@@ -599,7 +599,7 @@ materialCalcObj = {
                         let t_f = me.getSavedFreight(value, material);
                         if (t_f) doc = t_f;
                     }
-                    doc.exp = this.getFreightEXP(recode,doc);                            
+                    doc.exp = this.getFreightEXP(recode,doc,true);                            
                 }
             }
             if (!_.isEmpty(newData)) addDatas.push(newData);

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

@@ -1333,6 +1333,9 @@ var projectObj = {
                         return;
                     }
                     getGLJData('insert');// ProjectController.addRation(project, controller, rationType.volumePrice);
+                  },
+                  visible: function(key, opt){
+                    return false
                   }
                 },
                 "insertLJ": {

+ 17 - 13
web/building_saas/pm/js/pm_newMain.js

@@ -2052,10 +2052,12 @@ $(document).ready(function() {
             rename ? projectData['name'] = rename : '';
             projectMap['copy'] = { document: projectData };
             $("#copy-to-dialog").modal('hide');
-            $.bootstrapLoading.progressStart('拷贝项目', true);
-            $("#progress_modal_body").text('正在拷贝项目,请稍候……');
-            await ajaxPost('/pm/api/copyProjects', {projectMap:projectMap,user_id: userID, tenderCount: 1});
-            await importProcessChecking(null, null, (newProjectData) => handleTenderAfterChecking(newProjectData, projectData));
+            const copyRst = await ajaxPost('/pm/api/copyProjects', {projectMap:projectMap,user_id: userID, tenderCount: 1});
+            if (!copyRst.error) {
+                $.bootstrapLoading.progressStart('拷贝项目', true);
+                $("#progress_modal_body").text('正在拷贝项目,请稍候……');
+                await importProcessChecking(null, null, (newProjectData) => handleTenderAfterChecking(newProjectData, projectData));
+            }
         } catch (err) {
             alert(err);
         }
@@ -2093,15 +2095,17 @@ $(document).ready(function() {
             projectData['name'] = name;
             projectMap['copy'] = { document: projectData };
             //$("#save-as-dialog").modal('hide');
-            $.bootstrapLoading.progressStart('拷贝项目', true);
-            $("#progress_modal_body").text('正在拷贝项目,请稍候……');
-            await ajaxPost('/pm/api/copyProjects', {projectMap:projectMap,user_id: userID, tenderCount: 1});
-            await importProcessChecking(null, null, (newProjectData) => {
-                handleTenderAfterChecking(newProjectData, projectData);
-                if (newProjectData) {
-                    $('#save-as-dialog').modal('hide');
-                }
-            });
+            const copyRst = await ajaxPost('/pm/api/copyProjects', {projectMap:projectMap,user_id: userID, tenderCount: 1});
+            if (!copyRst.error) {
+                $.bootstrapLoading.progressStart('拷贝项目', true);
+                $("#progress_modal_body").text('正在拷贝项目,请稍候……');
+                await importProcessChecking(null, null, (newProjectData) => {
+                    handleTenderAfterChecking(newProjectData, projectData);
+                    if (newProjectData) {
+                        $('#save-as-dialog').modal('hide');
+                    }
+                });
+            }
         } catch (err) {
             alert(err);
         }