zhangweicheng 6 年 前
コミット
ed7be4c2f7

+ 110 - 2
modules/fee_rates/facade/fee_rates_facade.js

@@ -15,6 +15,7 @@ let template = require('../controllers/feerate_template');
 let logger = require("../../../logs/log_helper").logger;
 const uuidV1 = require('uuid/v1');
 let EngineeringLibModel = require("../../users/models/engineering_lib_model");
+const scMathUtil = require('../../../public/scMathUtil').getUtil();
 
 module.exports={
     save:save,
@@ -256,19 +257,126 @@ async function changeFeeRateStandard(jdata){
     let newFeeRate = {};
     newFeeRate.ID =uuidV1();
     newFeeRate.rates=template.rates;
+    //2019-02-25新需求,养护切换标准后还要设置旧的值到新的费率文件里
+    let subMap = await getAllSubRatesMap(data.feeRateID);
+    let [IDMap,childrenMap] = setRatesByMap(newFeeRate,subMap,data.decimal);
+    sumParentRate(IDMap,childrenMap,data.decimal);
     await feeRateModel.create(newFeeRate);
     let doc={
         libID:data.newLibID,
         libName:template.libName,
         feeRateID: newFeeRate.ID
     };
-    let deleteInfo = {deleted: true, deleteDateTime: new Date(), deleteBy: data.user_id};
     await feeRateFileModel.findOneAndUpdate({ID:data.feeRateFileID,deleteInfo:null},doc);
-    await feeRateModel.findOneAndUpdate({ID:data.feeRateID},{deleteInfo:deleteInfo});
+    await feeRateModel.deleteOne({ID:data.feeRateID});
     doc.rates=newFeeRate.rates;
     return doc;
 }
 
+async function getAllSubRatesMap(feeRateID){
+    let subMap = {};
+    let feeRate = await feeRateModel.findOne({ID:feeRateID});
+    if(feeRate){
+        let rates = feeRate.rates;
+        for(let r of rates){
+           if(r.subFeeRate){
+               for(let p of r.subFeeRate.recodes){
+                   if(subMap[p.name]) continue;
+                   subMap[p.name] = p;
+               }
+           }
+        }
+    }
+    return subMap;
+}
+
+function sumParentRate(IDMap,childrenMap,decimal){
+    for(let ParentID in  childrenMap){
+        if(IDMap[ParentID] && IDMap[ParentID].sum !== true) continue;
+        let childrenList = childrenMap[ParentID];
+        let total = 0;
+        for(let c of childrenList){
+            let tem = c.rate?c.rate:0;
+            tem = scMathUtil.roundForObj(tem,decimal);
+            total = scMathUtil.roundForObj(tem + total,6);
+        }
+        total = scMathUtil.roundForObj(total,decimal);
+        if(IDMap[ParentID])IDMap[ParentID].rate = total;
+    }
+}
+
+function setRatesByMap(newFeeRate,subMap,decimal){
+    let IDMap ={},childrenMap={};
+    for(let r of newFeeRate.rates){
+        IDMap[r.ID] = r;
+        if(r.subFeeRate){
+            for(let p of r.subFeeRate.recodes){
+                let t_p = subMap[p.name];
+                if(t_p){//找到同名的子项
+                    //获取选中的节点
+                    let selected = _.find(t_p.optionList,{"selected":true});
+                    for(let s of p.optionList){
+                        s.selected = selected && selected.name == s.name?true:false;//设置新费率的选中项
+                    }
+                    if(selected){//如果有选中项,则从valueMap中找出值并设置到rate上// ;
+                        let map = _.find(r.subFeeRate.valueMaps,{ID:selected.name});
+                        if(map){
+                            r.rate = map.value;
+                            setSubValue(p,selected.name);
+                        }
+                    }else if(t_p.editable==true){//在原来的选项中没有选中节点则说明是自已输入的,同时要是可编辑的类型,用内插法算值
+                        let ltRate = null;//
+                        let gtRate = null;
+                        for(let v of r.subFeeRate.valueMaps){
+                            if(parseFloat(v.ID)<parseFloat(t_p.value)){
+                                ltRate = v;
+                            }else if( gtRate==null && parseFloat(v.ID)>parseFloat(t_p.value)){
+                                gtRate = v;
+                            }
+                        }
+                        if(ltRate!=null&&gtRate!=null){//已经找到前后的值了
+                            let step = scMathUtil.roundForObj(gtRate.value - ltRate.value,getDecimal("process"))
+                            let total =  parseFloat(gtRate.ID) - parseFloat(ltRate.ID);
+                            r.rate  =getRateByStep(ltRate.value,total,parseFloat(t_p.value) - parseFloat(ltRate.ID),step,decimal);
+                        }else if(ltRate!=null&&gtRate == null){//说明是超出了选项的最大值
+                            let share = parseFloat(t_p.value) - parseFloat(ltRate.ID);//超出了多少
+                            r.rate  = getRateByStep(ltRate.value,p.step,share,p.amount,decimal)
+                        }else if(gtRate!=null&&ltRate==null){//说明是只有一个选项,且这个选项比输入的值大
+                            let step =  parseFloat(gtRate.value)- 0;
+                            r.rate = getRateByStep(0,gtRate.value,parseFloat(t_p.value),step,decimal)
+                        }
+                        if(r.rate!=undefined && r.rate != null){
+                            p.value = t_p.value;
+                            setSubValue(p,t_p.value);
+                        }
+                    }
+                }
+            }
+        }
+        if(r.ParentID&&r.ParentID!=""){
+            childrenMap[r.ParentID]?childrenMap[r.ParentID].push(r):childrenMap[r.ParentID]=[r];
+        }
+    }
+    return [IDMap,childrenMap]
+}
+
+function getRateByStep(ltValue,total,share,step,decimal) { //min值 ,计算值的总区间, 区间中占比,步长--前端也要用到
+    let p = scMathUtil.roundForObj(share/total,6);
+    let a = scMathUtil.roundForObj(step * p,6) ;
+    return scMathUtil.roundForObj(ltValue + a,decimal)
+}
+
+
+function setSubValue(p,name) {//设置综合理程的树节点的子节点的值
+    if(p.subList && p.subList.length > 0){
+        for(let s of p.subList){
+            s.value = Number(name);
+        }
+    }
+}
+
+
+
 async function newFeeRateFile(userId, updateData){
     if(updateData.property !== null){
         let property = updateData.property;

+ 1 - 1
modules/ration_glj/facade/ration_glj_facade.js

@@ -773,7 +773,7 @@ async  function replaceGLJByData(data,compilation) {
 
 async function replaceMixRatio(g,result,unitFileId){
     let newRecodes=[],deleteList = [];
-    if(gljUtil.isConcreteType(g.type)){//相同类型的才能替换,所以判断一个就好了
+    if(gljUtil.isConcreteType(g.type)||gljUtil.isCommercialConcreteType(g.type)){//混凝土大类,商品混凝土属于相同大类,替换前和替换后只判断一个就好了
         let IDMap = {}, projectGLJMap = {},referenceMap={},concreteList=[],newMap={};
         let projectGljModel = new GLJListModel();
         let rationGLJList = await ration_glj.find({'rationID':g.rationID});

+ 5 - 0
public/gljUtil.js

@@ -18,6 +18,7 @@ module.exports = {
     getAdjustPrice:getAdjustPrice,
     getMainType:getMainType,
     isConcreteType:isConcreteType,
+    isCommercialConcreteType:isCommercialConcreteType,
     getIndex:getIndex,
     sortRationGLJ:sortRationGLJ
 };
@@ -57,6 +58,10 @@ function isConcreteType(type) {
     return gljNodeUtil.isConcreteType(type);
 }
 
+function isCommercialConcreteType(type){
+    return gljNodeUtil.isCommercialConcreteType(type);
+}
+
 function sortRationGLJ(type) {
     return gljNodeUtil.sortRationGLJ(type);
 }

+ 4 - 0
public/web/gljUtil.js

@@ -322,6 +322,10 @@ let gljUtil = {
         let concreteType = [gljUtil.gljType.CONCRETE,gljUtil.gljType.MORTAR,gljUtil.gljType.MIX_RATIO];//混凝土大类:混凝土、砂浆,配合比
         return concreteType.indexOf(type)!=-1
     },
+    isCommercialConcreteType:function (type) {
+        let commercialType = [gljUtil.gljType.COMMERCIAL_CONCRETE,gljUtil.gljType.COMMERCIAL_MORTAR];//商品混凝土、商品砂浆
+        return commercialType.indexOf(type)!=-1
+    },
     hasComposition:function (ration_glj,isRationType) {//判断是否有组成物,有则返回true   现在主材类型的工料机也有可能有组成物。
         let type = isRationType==true? ration_glj.subType:ration_glj.type;
         if(gljUtil.notEditType.indexOf(type)!=-1||type==gljType.MAIN_MATERIAL){

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

@@ -337,7 +337,8 @@ var FeeRate = {
                 "newLibID": newVal,
                 "feeRateFileID":feeRate.ID,
                 "feeRateID":feeRate.feeRateID,
-                "user_id":userID
+                "user_id":userID,
+                "decimal":getDecimal("feeRate")
             };
             CommonAjax.post('/feeRates/changeFeeRateStandard', data, function (data) {
                 if (data) {

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

@@ -823,6 +823,7 @@ let ration_glj = {
             }
             oldData.GLJID = glj.ID;
             oldData.name = glj.name;
+            oldData.type = glj.gljType;
             oldData.code = glj.code;
             oldData.original_code = glj.code;
             oldData.unit = glj.unit;
@@ -832,7 +833,7 @@ let ration_glj = {
             oldData.marketPrice = glj.basePrice;
             oldData.repositoryId = glj.repositoryId;
             oldData.materialType = glj.materialType;
-            oldData. materialCoe =  glj.materialCoe;
+            oldData.materialCoe =  glj.materialCoe;
             oldData.grossWeightCoe= glj.grossWeightCoe;
             oldData.purchaseStorageRate = glj.purchaseStorageRate;
             oldData.offSiteTransportLossRate = glj.offSiteTransportLossRate;

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

@@ -580,7 +580,7 @@ var feeRateObject={
                              }else {
                                  o.selected = false;
                              }
-                         }else {//没有匹配上的,直接取值就可以
+                         }else {//没有匹配上的,直接取值就可以(这个是为多参数时用的,但是目前来看,不支持多参数,比较麻烦)
                              if(o.selected == true)  valueArray.push(o.name);
                          }
                      }
@@ -599,7 +599,6 @@ var feeRateObject={
                      }else {//没找到,用内插法或步长算值
                          let ltRate = null;//
                          let gtRate = null;
-                         let lastRate = null;
                          temP.value = scMathUtil.roundForObj(value,getDecimal("feeRate")) ;
                          for(let v of valueMaps){
                             if(parseFloat(v.ID)<parseFloat(value)){
@@ -607,7 +606,6 @@ var feeRateObject={
                             }else if( gtRate==null && parseFloat(v.ID)>parseFloat(value)){
                                 gtRate = v;
                             }
-                            lastRate = v;
                          }
                          if(gljUtil.isDef(ltRate)&&gljUtil.isDef(gtRate)){//已经找到前后的值了
                              let step = scMathUtil.roundForObj(gtRate.value - ltRate.value,getDecimal("process"))
@@ -642,7 +640,7 @@ var feeRateObject={
                 $.bootstrapLoading.end();
             })
         }
-        function getRateByStep(ltValue,total,share,step) { //min值 ,计算值的总区间, 区间中占比,步长
+        function getRateByStep(ltValue,total,share,step) { //min值 ,计算值的总区间, 区间中占比,步长--后端重选标准也要用到
             let p = scMathUtil.roundForObj(share/total,getDecimal("process"));
             let a = scMathUtil.roundForObj(step * p,getDecimal("process")) ;
             return scMathUtil.roundForObj(ltValue + a,getDecimal("feeRate"))

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

@@ -723,6 +723,7 @@ var gljOprObj = {
                     ration_gljs[i].shortName =projectObj.project.projectGLJ.getShortNameByID(ration_gljs[i].type);
                     ration_gljs[i].isAdd = glj.unit_price.is_add;
                     ration_gljs[i]=this.setGLJPrice(ration_gljs[i],glj);//设置工料机价格
+                    delete ration_gljs[i].subList; //置空,再设置
                     let connect_index = this.getIndex(glj, gljKeyArray);
                     if (needRatio==true&&mixRatioMap.hasOwnProperty(connect_index)) {
                         let mixRatios = this.getMixRationShowDatas(mixRatioMap[connect_index], projectGljs);