|
@@ -0,0 +1,164 @@
|
|
|
+/**
|
|
|
+ * Created by Tony on 2017/6/21.
|
|
|
+ */
|
|
|
+let calcBaseCodeCollection = ["定额基价材料费", "定额基价机械费", "定额基价人工费"
|
|
|
+ , "定额基价人工费(调整后)", "定额基价材料费(调整后)", "定额基价机械费(调整后)"
|
|
|
+ , "市场价格人工费", "市场价格材料费", "市场价格机械费"
|
|
|
+ , "定额基价机上人工费", "主材费", "设备费"
|
|
|
+];
|
|
|
+
|
|
|
+let executeObj = {
|
|
|
+ currentTpl : null,
|
|
|
+ currentRationItem: null,
|
|
|
+ currentFeeRateFile: null,
|
|
|
+ at: function(code) {
|
|
|
+ let me = executeObj,
|
|
|
+ rst = 0;
|
|
|
+ rst = me.currentTpl.compileAssistantObj[code].execRst;
|
|
|
+ return rst;
|
|
|
+ },
|
|
|
+ base: function(calcBaseCode) {
|
|
|
+ let me = executeObj, rst = -1,
|
|
|
+ idx = 10 + calcBaseCodeCollection.indexOf(calcBaseCode);
|
|
|
+ if (idx >= 0) {
|
|
|
+ //
|
|
|
+ } else {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ rst = idx; //暂时返回值,测试用
|
|
|
+ return rst;
|
|
|
+ },
|
|
|
+ fee: function(feeID) {
|
|
|
+ let me = executeObj, rst = -1;
|
|
|
+ //
|
|
|
+ //rst = parseInt(feeID); //暂时返回值,测试用
|
|
|
+ rst = 0.89;
|
|
|
+ return rst;
|
|
|
+ },
|
|
|
+ factor: function(factorCode) {
|
|
|
+ let me = executeObj;
|
|
|
+ //
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+class calculation {
|
|
|
+ init(calcTpl, calFee){
|
|
|
+ let me = this;
|
|
|
+ me.calcTpl = calcTpl;
|
|
|
+ me.calFee = calFee;
|
|
|
+ me.hasCompiled = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ compile(){
|
|
|
+ let me = this;
|
|
|
+ me.hasCompiled = false;
|
|
|
+ me.errs = [];
|
|
|
+ let private_extract_code = function(str, idx){
|
|
|
+ let rst = '', lBracket = 0, rBracket = 0, firstIdx = idx, lastIdx = 0;
|
|
|
+ for (let i = idx; i < str.length; i++) {
|
|
|
+ if (str[i] === '(') {
|
|
|
+ lBracket++;
|
|
|
+ if (lBracket == 1) firstIdx = i + 1;
|
|
|
+ }
|
|
|
+ if (str[i] === ')') {
|
|
|
+ rBracket++;
|
|
|
+ if (lBracket == rBracket) {
|
|
|
+ lastIdx = i - 1;
|
|
|
+ if (lastIdx > firstIdx) {
|
|
|
+ if (str[firstIdx] === "'") firstIdx++;
|
|
|
+ if (str[lastIdx] !== "'") lastIdx++;
|
|
|
+ if (lastIdx > firstIdx) {
|
|
|
+ rst = str.slice(firstIdx, lastIdx);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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 = expr.indexOf('@(', 0);
|
|
|
+ while (idx >= 0) {
|
|
|
+ let code = private_extract_code(expr, idx);
|
|
|
+ //console.log('提取code: ' + code);
|
|
|
+ if (code.length > 0) {
|
|
|
+ let subItem = me.compileAssistantObj[code];
|
|
|
+ if (subItem) {
|
|
|
+ if (subItem.code !== item.code) {
|
|
|
+ private_parse_ref(subItem, me.compileAssistantObj[code + "_idx"]);
|
|
|
+ } else {
|
|
|
+ me.errs.push("There exists the self refer code: " + code);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ me.errs.push("There exists the invalid code by which could not find the item: " + code);
|
|
|
+ console.log('invalid code: ' + code);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ idx = expr.indexOf('@(', idx + code.length + 3);
|
|
|
+ }
|
|
|
+ if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
|
|
|
+ //console.log('the code ready to push: ' + item.code);
|
|
|
+ me.calcTpl.compiledSeq.push(itemIdx);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ let private_setup_seq = function(item, itemIdx){
|
|
|
+ if (me.calcTpl.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];
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ if (me.calcTpl && me.calcTpl.calcItems && me.calcTpl.calcItems.length > 0) {
|
|
|
+ me.calcTpl.compiledSeq = [];
|
|
|
+ me.compileAssistantObj = {};
|
|
|
+ //1. first round -> prepare
|
|
|
+ for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
|
|
|
+ let item = me.calcTpl.calcItems[i];
|
|
|
+ me.compileAssistantObj[item.code] = item;
|
|
|
+ me.compileAssistantObj[item.code + "_idx"] = i;
|
|
|
+ }
|
|
|
+ //2. second round -> go!
|
|
|
+ for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
|
|
|
+ private_setup_seq(me.calcTpl.calcItems[i], i);
|
|
|
+ }
|
|
|
+ if (me.errs.length == 0) {
|
|
|
+ private_compile_items();
|
|
|
+ if (me.errs.length == 0) me.hasCompiled = true;
|
|
|
+ } else {
|
|
|
+ console.log('errors: ' + me.errs.toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //console.log(me.compileAssistantObj);
|
|
|
+ //console.log(me.calcTpl.compiledSeq);
|
|
|
+ };
|
|
|
+ calculate( $RATION){
|
|
|
+ let me = this;
|
|
|
+ if ($RATION && me.hasCompiled) {
|
|
|
+ let $CE = executeObj;
|
|
|
+ $CE.currentRationItem = $RATION;
|
|
|
+ $CE.currentTpl = me;
|
|
|
+ for (let idx of me.calcTpl.compiledSeq) {
|
|
|
+ let item = me.calcTpl.calcItems[idx];
|
|
|
+ item.execRst = eval(item.compiledExpr);
|
|
|
+ }
|
|
|
+ for (let idx of me.calcTpl.compiledSeq) {
|
|
|
+ let item = me.calcTpl.calcItems[idx];
|
|
|
+ console.log('code: ' + item.code + ' | expression: ' + item.compiledExpr + ' | result: ' + item.execRst);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+module.exports = new calculation();
|