|
@@ -1,80 +1,56 @@
|
|
|
/**
|
|
|
* Created by Tony on 2017/6/21.
|
|
|
+ * Modified by CSL, 2017-08-01
|
|
|
*/
|
|
|
-let calcBaseCodeCollection = ["定额基价人工费", "定额基价材料费", "定额基价机械费"
|
|
|
- , "定额基价人工费(调整后)", "定额基价材料费(调整后)", "定额基价机械费(调整后)"
|
|
|
- , "市场价格人工费", "市场价格材料费", "市场价格机械费"
|
|
|
- , "定额基价机上人工费", "主材费", "设备费"
|
|
|
-];
|
|
|
-let dummyCalcBaseCodeTypeCollection = [[2], [6], [64]
|
|
|
- , [], [], []
|
|
|
- , [], [], []
|
|
|
- , [], [], []
|
|
|
-];
|
|
|
|
|
|
let executeObj = {
|
|
|
- currentTpl : null,
|
|
|
- currentRationItem: null,
|
|
|
- currentFeeRateFile: null,
|
|
|
+ ration: null,
|
|
|
at: function(ID) {
|
|
|
let me = executeObj,
|
|
|
rst = 0;
|
|
|
- rst = me.currentTpl.compileAssistantObj[ID].unitFee;
|
|
|
+ rst = me.ration.data.calcTemplate.compiledTemplate[ID].unitFee;
|
|
|
rst = parseFloat(rst);
|
|
|
return rst;
|
|
|
},
|
|
|
- base: function(calcBaseCode) {
|
|
|
+ base: function(calcBaseName) {
|
|
|
let me = executeObj, rst = 0,
|
|
|
- idx = calcBaseCodeCollection.indexOf(calcBaseCode);
|
|
|
- if (idx >= 0) {
|
|
|
- if (dummyCalcBaseCodeTypeCollection[idx].length > 0) {
|
|
|
- let tmpSum = 0;
|
|
|
- for (let glj of me.currentRationItem.data.gljList) {
|
|
|
- if (dummyCalcBaseCodeTypeCollection[idx].indexOf(glj["type"]) >= 0) {
|
|
|
- tmpSum += glj["basePrice"] * glj["quantity"];
|
|
|
- }
|
|
|
- }
|
|
|
- rst = tmpSum;
|
|
|
- } else {
|
|
|
- //rst = 10 + idx; //随便给个数
|
|
|
- }
|
|
|
- }
|
|
|
- //rst = idx; //暂时返回值,测试用
|
|
|
- return rst;
|
|
|
- },
|
|
|
- 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;
|
|
|
- //*/
|
|
|
+ base = getRationCalcBase(calcBaseName);
|
|
|
+
|
|
|
+ if (base != null) {
|
|
|
+ let price = 0, tmpSum = 0;
|
|
|
+ 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"];}
|
|
|
+ else if (base.calcType == budgetCalc){price = glj["marketPrice"];}
|
|
|
+ else if (base.calcType == diffCalc){price = glj["marketPrice"] - glj["adjustPrice"];};
|
|
|
+ };
|
|
|
+ tmpSum = tmpSum + glj["quantity"] * price;
|
|
|
+ glj = null;
|
|
|
+ };
|
|
|
+ rst = tmpSum;
|
|
|
+ };
|
|
|
return rst;
|
|
|
- },
|
|
|
- factor: function(factorCode) {
|
|
|
+ }
|
|
|
+/* factor: function(factorID) {
|
|
|
let me = executeObj;
|
|
|
- let rst = 0.89; //暂时固定输出,测试用
|
|
|
+ let rst = 7.77;
|
|
|
return rst;
|
|
|
- }
|
|
|
+ }*/
|
|
|
};
|
|
|
|
|
|
-class calculation {
|
|
|
- init(calcTpl, calFee){
|
|
|
+class Calculation {
|
|
|
+/* init(template, feeRates){
|
|
|
let me = this;
|
|
|
- me.calcTpl = calcTpl;
|
|
|
- me.calFee = calFee;
|
|
|
+ me.template = template;
|
|
|
+ me.feeRates = feeRates;
|
|
|
me.hasCompiled = false;
|
|
|
- };
|
|
|
+ };*/
|
|
|
|
|
|
- compile(){
|
|
|
+ compile(template, feeRates, labourCoes){
|
|
|
let me = this;
|
|
|
- me.hasCompiled = false;
|
|
|
- me.errs = [];
|
|
|
+ template.hasCompiled = false;
|
|
|
+ template.errs = [];
|
|
|
|
|
|
let private_extract_ID = function(str, idx){
|
|
|
let rst = '', lBracket = 0, rBracket = 0, firstIdx = idx, lastIdx = 0;
|
|
@@ -101,92 +77,134 @@ 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);
|
|
|
if (ID.length > 0) {
|
|
|
- let subItem = me.compileAssistantObj[ID];
|
|
|
+ let subItem = template.compiledTemplate[ID];
|
|
|
if (subItem) {
|
|
|
if (subItem.ID !== item.ID) {
|
|
|
- private_parse_ref(subItem, me.compileAssistantObj[ID + "_idx"]);
|
|
|
+ private_parse_ref(subItem, template.compiledTemplate[ID + "_idx"]);
|
|
|
} else {
|
|
|
- me.errs.push("There exists the self refer ID: " + ID);
|
|
|
+ template.errs.push("There exists the self refer ID: " + ID);
|
|
|
}
|
|
|
} else {
|
|
|
- me.errs.push("There exists the invalid ID by which could not find the item: " + ID);
|
|
|
+ template.errs.push("There exists the invalid ID by which could not find the item: " + ID);
|
|
|
console.log('invalid ID: ' + ID);
|
|
|
}
|
|
|
}
|
|
|
idx = item.expression.indexOf('@(', idx + ID.length + 3);
|
|
|
}
|
|
|
- if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
- me.calcTpl.compiledSeq.push(itemIdx);
|
|
|
+ if (template.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
+ template.compiledSeq.push(itemIdx);
|
|
|
}
|
|
|
};
|
|
|
let private_setup_seq = function(item, itemIdx){
|
|
|
- if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
+ if (template.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 template.compiledSeq) {
|
|
|
+ let item = template.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);
|
|
|
+ //item.compiledExpr = item.compiledExpr.split('rate(').join('$CE.rate(');
|
|
|
+ //item.compiledExpr = item.compiledExpr.split('factor(').join('$CE.factor(');
|
|
|
+ if (item.labourCoeID){
|
|
|
+ let lc = me.compiledLabourCoes["LabourCoe_" + item.labourCoeID].coe;
|
|
|
+ item.dispExpr = item.dispExpr.replace(/L/gi, lc.toString());
|
|
|
+ item.compiledExpr = item.compiledExpr.replace(/L/gi, lc.toString());
|
|
|
+ }
|
|
|
}
|
|
|
};
|
|
|
- let private_comile_feeFile = function() {
|
|
|
- if (me.calFee) {
|
|
|
- me.compiledFee = {};
|
|
|
- for (let fee of me.calFee) {
|
|
|
- me.compiledFee["fee_" + fee.ID] = fee;
|
|
|
+ let private_compile_feeFile = function() {
|
|
|
+ if (feeRates) {
|
|
|
+ me.compiledFeeRate = {};
|
|
|
+ for (let rate of feeRates) {
|
|
|
+ me.compiledFeeRate["feeRate_" + rate.ID] = rate;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let private_compile_labourCoeFile = function() {
|
|
|
+ if (labourCoes) {
|
|
|
+ me.compiledLabourCoes = {};
|
|
|
+ for (let coe of labourCoes) {
|
|
|
+ me.compiledLabourCoes["LabourCoe_" + coe.ID] = coe;
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- if (me.calcTpl && me.calcTpl.calcItems && me.calcTpl.calcItems.length > 0) {
|
|
|
- me.calcTpl.compiledSeq = [];
|
|
|
- me.compileAssistantObj = {};
|
|
|
+ if (template && template.calcItems && template.calcItems.length > 0) {
|
|
|
+ template.compiledSeq = [];
|
|
|
+ template.compiledTemplate = {};
|
|
|
//1. first round -> prepare
|
|
|
- private_comile_feeFile();
|
|
|
- for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
|
|
|
- let item = me.calcTpl.calcItems[i];
|
|
|
- me.compileAssistantObj[item.ID] = item;
|
|
|
- me.compileAssistantObj[item.ID + "_idx"] = i;
|
|
|
+ private_compile_feeFile();
|
|
|
+ private_compile_labourCoeFile();
|
|
|
+ for (let i = 0; i < template.calcItems.length; i++) {
|
|
|
+ let item = template.calcItems[i];
|
|
|
+ template.compiledTemplate[item.ID] = item;
|
|
|
+ template.compiledTemplate[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 < template.calcItems.length; i++) {
|
|
|
+ private_setup_seq(template.calcItems[i], i);
|
|
|
}
|
|
|
- if (me.errs.length == 0) {
|
|
|
+ if (template.errs.length == 0) {
|
|
|
private_compile_items();
|
|
|
- if (me.errs.length == 0) me.hasCompiled = true;
|
|
|
+ template.hasCompiled = true;
|
|
|
} else {
|
|
|
- console.log('errors: ' + me.errs.toString());
|
|
|
+ console.log('errors: ' + template.errs.toString());
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
- calculate( $RATION){
|
|
|
+
|
|
|
+ calculate($RATION){ // 参数$RATION也可以是清单
|
|
|
let me = this;
|
|
|
- if ($RATION && me.hasCompiled) {
|
|
|
+ let template = $RATION.data.calcTemplate;
|
|
|
+
|
|
|
+ if ($RATION && template.hasCompiled) {
|
|
|
let $CE = executeObj;
|
|
|
- $CE.currentRationItem = $RATION;
|
|
|
- $CE.currentTpl = me;
|
|
|
- $CE.currentFeeRateFile = me.calFee;
|
|
|
- $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
|
|
|
+ $CE.ration = $RATION;
|
|
|
+
|
|
|
+ if (!$RATION.fees) {
|
|
|
+ $RATION.fees = [];
|
|
|
+ $RATION.feesIndex = {};
|
|
|
+ };
|
|
|
+
|
|
|
+ for (let idx of template.compiledSeq) {
|
|
|
+ let calcItem = template.calcItems[idx];
|
|
|
+
|
|
|
+ let feeRate = 100; // 100%
|
|
|
+ // 下面三项用于界面显示。
|
|
|
+ if (calcItem.feeRateID) {
|
|
|
+ feeRate = me.compiledFeeRate["feeRate_" + calcItem.feeRateID].rate;
|
|
|
+ calcItem.feeRate = feeRate;
|
|
|
+ };
|
|
|
+ calcItem.unitFee = eval(calcItem.compiledExpr) * feeRate * 0.01; // 如果eval()对清单树有影响,就换成小麦的Expression对象再试
|
|
|
+ calcItem.totalFee = calcItem.unitFee * 3; // AAAAAA 测试值,因目前定额无数量(保存不上) $RATION.data.Quantity
|
|
|
+
|
|
|
+ // 费用同步到定额
|
|
|
+ // 引入小麦的字段检测后,快速切换定额出现计算卡顿现象,过多的循环造成。这里把她的代码拆出来,减少微循环。
|
|
|
+ if (!$RATION.feesIndex[calcItem.fieldName]){
|
|
|
+ let fee = {
|
|
|
+ 'fieldName': calcItem.fieldName,
|
|
|
+ 'unitFee': calcItem.unitFee,
|
|
|
+ 'totalFee': calcItem.totalFee,
|
|
|
+ 'tenderUnitFee': 0,
|
|
|
+ 'tenderTotalFee': 0
|
|
|
+ };
|
|
|
+ $RATION.fees.push(fee);
|
|
|
+ $RATION.feesIndex[calcItem.fieldName] = fee;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ $RATION.feesIndex[calcItem.fieldName].unitFee = calcItem.unitFee;
|
|
|
+ $RATION.feesIndex[calcItem.fieldName].totalFee = calcItem.totalFee;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
//module.exports = new calculation();
|