|
@@ -1,26 +1,14 @@
|
|
|
/**
|
|
|
* Created by Tony on 2017/6/21.
|
|
|
*/
|
|
|
-/*let calcBaseCodeCollection = ["定额基价人工费", "定额基价材料费", "定额基价机械费"
|
|
|
- , "定额基价人工费(调整后)", "定额基价材料费(调整后)", "定额基价机械费(调整后)"
|
|
|
- , "市场价格人工费", "市场价格材料费", "市场价格机械费"
|
|
|
- , "定额基价机上人工费", "主材费", "设备费"
|
|
|
-];
|
|
|
-
|
|
|
-let dummyCalcBaseCodeTypeCollection = [[2], [6], [64]
|
|
|
- , [], [], []
|
|
|
- , [], [], []
|
|
|
- , [], [], []
|
|
|
-];*/
|
|
|
-
|
|
|
let executeObj = {
|
|
|
- currentTpl : null,
|
|
|
- currentRationItem: null,
|
|
|
- currentFeeRateFile: null,
|
|
|
+ calculation : null,
|
|
|
+ ration: null,
|
|
|
+ feeRate: null,
|
|
|
at: function(ID) {
|
|
|
let me = executeObj,
|
|
|
rst = 0;
|
|
|
- rst = me.currentTpl.compileAssistantObj[ID].unitFee;
|
|
|
+ rst = me.calculation.compileAssistantObj[ID].unitFee;
|
|
|
rst = parseFloat(rst);
|
|
|
return rst;
|
|
|
},
|
|
@@ -30,7 +18,7 @@ let executeObj = {
|
|
|
|
|
|
if (base != null) {
|
|
|
let price = 0, tmpSum = 0;
|
|
|
- for (let glj of me.currentRationItem.data.gljList) {
|
|
|
+ for (let glj of me.ration.data.gljList) {
|
|
|
if (base.gljTypes.indexOf(glj.type) >= 0) {
|
|
|
if (base.calcType == baseCalc){ price = glj["basePrice"];}
|
|
|
else if (base.calcType == adjustCalc){price = glj["adjustPrice"];}
|
|
@@ -46,16 +34,7 @@ let executeObj = {
|
|
|
},
|
|
|
fee: function(feeID) {
|
|
|
let me = executeObj, rst = 0;
|
|
|
- /*
|
|
|
- for (let fee of me.currentFeeRateFile) {
|
|
|
- if (fee.ID == feeID) {
|
|
|
- rst = fee.rate;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- /*/
|
|
|
if (me.compiledFeeRateFile["fee_" + feeID]) rst = me.compiledFeeRateFile["fee_" + feeID].rate;
|
|
|
- //*/
|
|
|
return rst;
|
|
|
},
|
|
|
factor: function(factorCode) {
|
|
@@ -65,11 +44,11 @@ let executeObj = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-class calculation {
|
|
|
- init(calcTpl, calFee){
|
|
|
+class Calculation {
|
|
|
+ init(calcTemplate, feeRate){
|
|
|
let me = this;
|
|
|
- me.calcTpl = calcTpl;
|
|
|
- me.calFee = calFee;
|
|
|
+ me.calcTemplate = calcTemplate;
|
|
|
+ me.feeRate = feeRate;
|
|
|
me.hasCompiled = false;
|
|
|
};
|
|
|
|
|
@@ -103,9 +82,6 @@ class calculation {
|
|
|
return rst;
|
|
|
};
|
|
|
let private_parse_ref = function(item, itemIdx){
|
|
|
- //let expr = item.expression.split('at(').join('@(');
|
|
|
- //item.expression = expr;
|
|
|
- //console.log('expression: ' + expr);
|
|
|
let idx = item.expression.indexOf('@(', 0);
|
|
|
while (idx >= 0) {
|
|
|
let ID = private_extract_ID(item.expression, idx);
|
|
@@ -124,47 +100,46 @@ class calculation {
|
|
|
}
|
|
|
idx = item.expression.indexOf('@(', idx + ID.length + 3);
|
|
|
}
|
|
|
- if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
- me.calcTpl.compiledSeq.push(itemIdx);
|
|
|
+ if (me.calcTemplate.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
+ me.calcTemplate.compiledSeq.push(itemIdx);
|
|
|
}
|
|
|
};
|
|
|
let private_setup_seq = function(item, itemIdx){
|
|
|
- if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
+ if (me.calcTemplate.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
private_parse_ref(item, itemIdx);
|
|
|
}
|
|
|
};
|
|
|
let private_compile_items = function() {
|
|
|
- for (let idx of me.calcTpl.compiledSeq) {
|
|
|
- let item = me.calcTpl.calcItems[idx];
|
|
|
+ for (let idx of me.calcTemplate.compiledSeq) {
|
|
|
+ let item = me.calcTemplate.calcItems[idx];
|
|
|
item.compiledExpr = item.expression.split('@(').join('$CE.at(');
|
|
|
item.compiledExpr = item.compiledExpr.split('base(').join('$CE.base(');
|
|
|
item.compiledExpr = item.compiledExpr.split('fee(').join('$CE.fee(');
|
|
|
item.compiledExpr = item.compiledExpr.split('factor(').join('$CE.factor(');
|
|
|
- //console.log(item.compiledExpr);
|
|
|
}
|
|
|
};
|
|
|
let private_comile_feeFile = function() {
|
|
|
- if (me.calFee) {
|
|
|
+ if (me.feeRate) {
|
|
|
me.compiledFee = {};
|
|
|
- for (let fee of me.calFee) {
|
|
|
+ for (let fee of me.feeRate) {
|
|
|
me.compiledFee["fee_" + fee.ID] = fee;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- if (me.calcTpl && me.calcTpl.calcItems && me.calcTpl.calcItems.length > 0) {
|
|
|
- me.calcTpl.compiledSeq = [];
|
|
|
+ if (me.calcTemplate && me.calcTemplate.calcItems && me.calcTemplate.calcItems.length > 0) {
|
|
|
+ me.calcTemplate.compiledSeq = [];
|
|
|
me.compileAssistantObj = {};
|
|
|
//1. first round -> prepare
|
|
|
private_comile_feeFile();
|
|
|
- for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
|
|
|
- let item = me.calcTpl.calcItems[i];
|
|
|
+ for (let i = 0; i < me.calcTemplate.calcItems.length; i++) {
|
|
|
+ let item = me.calcTemplate.calcItems[i];
|
|
|
me.compileAssistantObj[item.ID] = item;
|
|
|
me.compileAssistantObj[item.ID + "_idx"] = i;
|
|
|
}
|
|
|
//2. second round -> go!
|
|
|
- for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
|
|
|
- private_setup_seq(me.calcTpl.calcItems[i], i);
|
|
|
+ for (let i = 0; i < me.calcTemplate.calcItems.length; i++) {
|
|
|
+ private_setup_seq(me.calcTemplate.calcItems[i], i);
|
|
|
}
|
|
|
if (me.errs.length == 0) {
|
|
|
private_compile_items();
|
|
@@ -174,21 +149,34 @@ class calculation {
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
- calculate( $RATION){
|
|
|
+ calculate($RATION){ // 参数$RATION也可以是清单
|
|
|
let me = this;
|
|
|
if ($RATION && me.hasCompiled) {
|
|
|
let $CE = executeObj;
|
|
|
- $CE.currentRationItem = $RATION;
|
|
|
- $CE.currentTpl = me;
|
|
|
- $CE.currentFeeRateFile = me.calFee;
|
|
|
+ $CE.ration = $RATION;
|
|
|
+ $CE.calculation = me;
|
|
|
+ $CE.feeRate = me.feeRate;
|
|
|
$CE.compiledFeeRateFile = me.compiledFee;
|
|
|
- for (let idx of me.calcTpl.compiledSeq) {
|
|
|
- let item = me.calcTpl.calcItems[idx];
|
|
|
- item.unitFee = eval(item.compiledExpr);
|
|
|
- item.totalFee = item.unitFee * 3; // AAAAA 5为测试值 $RATION.data.Quantity
|
|
|
+
|
|
|
+ if (!$RATION.fees) {
|
|
|
+ $RATION.fees = [];
|
|
|
+ $RATION.feesIndex = {};
|
|
|
+ };
|
|
|
+
|
|
|
+ for (let idx of me.calcTemplate.compiledSeq) {
|
|
|
+ let calcItem = me.calcTemplate.calcItems[idx];
|
|
|
+
|
|
|
+ // 这两项用于界面显示。
|
|
|
+ calcItem.unitFee = eval(calcItem.compiledExpr); // AAAAA 如果eval()对清单树有影响,就换成小麦的Expression对象再试
|
|
|
+ calcItem.totalFee = calcItem.unitFee * 3; // AAAAA 测试值,因目前定额无数量(保存不上) $RATION.data.Quantity
|
|
|
+
|
|
|
// 费用同步到定额
|
|
|
- $RATION.feesIndex[item.type].unitFee = item.unitFee;
|
|
|
- $RATION.feesIndex[item.type].totalFee = item.totalFee;
|
|
|
+ // 引入小麦的字段检测后,快速切换定额出现计算卡顿现象,过多的循环造成。这里把她的代码拆出来,减少微循环。
|
|
|
+ if (!$RATION.feesIndex[calcItem.type]){
|
|
|
+ calcFees.addFee($RATION, calcItem.type);
|
|
|
+ };
|
|
|
+ $RATION.feesIndex[calcItem.type].unitFee = calcItem.unitFee;
|
|
|
+ $RATION.feesIndex[calcItem.type].totalFee = calcItem.totalFee;
|
|
|
}
|
|
|
}
|
|
|
}
|