|
|
@@ -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&>Rate!=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&>Rate == 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&<Rate==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;
|