calc_util.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /**
  2. * Created by Tony on 2017/6/21.
  3. */
  4. let calcBaseCodeCollection = ["定额基价人工费", "定额基价材料费", "定额基价机械费"
  5. , "定额基价人工费(调整后)", "定额基价材料费(调整后)", "定额基价机械费(调整后)"
  6. , "市场价格人工费", "市场价格材料费", "市场价格机械费"
  7. , "定额基价机上人工费", "主材费", "设备费"
  8. ];
  9. let dummyCalcBaseCodeTypeCollection = [[2], [6], [64]
  10. , [], [], []
  11. , [], [], []
  12. , [], [], []
  13. ];
  14. let executeObj = {
  15. currentTpl : null,
  16. currentRationItem: null,
  17. currentFeeRateFile: null,
  18. at: function(code) {
  19. let me = executeObj,
  20. rst = 0;
  21. rst = me.currentTpl.compileAssistantObj[code].execRst;
  22. return rst;
  23. },
  24. base: function(calcBaseCode) {
  25. let me = executeObj, rst = 0,
  26. idx = calcBaseCodeCollection.indexOf(calcBaseCode);
  27. if (idx >= 0) {
  28. if (dummyCalcBaseCodeTypeCollection[idx].length > 0) {
  29. let tmpSum = 0;
  30. for (let glj of me.currentRationItem.rationGljList) {
  31. if (dummyCalcBaseCodeTypeCollection[idx].indexOf(glj["glj"]["gljType"]) >= 0) {
  32. tmpSum += glj["glj"]["basePrice"] * glj["consumeAmt"];
  33. }
  34. }
  35. rst = tmpSum;
  36. } else {
  37. //rst = 10 + idx; //随便给个数
  38. }
  39. }
  40. //rst = idx; //暂时返回值,测试用
  41. return rst;
  42. },
  43. fee: function(feeID) {
  44. let me = executeObj, rst = 0;
  45. /*
  46. for (let fee of me.currentFeeRateFile) {
  47. if (fee.ID == feeID) {
  48. rst = fee.rate;
  49. break;
  50. }
  51. }
  52. /*/
  53. if (me.compiledFeeRateFile["fee_" + feeID]) rst = me.compiledFeeRateFile["fee_" + feeID].rate;
  54. //*/
  55. return rst;
  56. },
  57. factor: function(factorCode) {
  58. let me = executeObj;
  59. let rst = 0.89; //暂时固定输出,测试用
  60. return rst;
  61. }
  62. };
  63. class calculation {
  64. init(calcTpl, calFee){
  65. let me = this;
  66. me.calcTpl = calcTpl;
  67. me.calFee = calFee;
  68. me.hasCompiled = false;
  69. };
  70. compile(){
  71. let me = this;
  72. me.hasCompiled = false;
  73. me.errs = [];
  74. let private_extract_code = function(str, idx){
  75. let rst = '', lBracket = 0, rBracket = 0, firstIdx = idx, lastIdx = 0;
  76. for (let i = idx; i < str.length; i++) {
  77. if (str[i] === '(') {
  78. lBracket++;
  79. if (lBracket == 1) firstIdx = i + 1;
  80. }
  81. if (str[i] === ')') {
  82. rBracket++;
  83. if (lBracket == rBracket) {
  84. lastIdx = i - 1;
  85. if (lastIdx > firstIdx) {
  86. if (str[firstIdx] === "'") firstIdx++;
  87. if (str[lastIdx] !== "'") lastIdx++;
  88. if (lastIdx > firstIdx) {
  89. rst = str.slice(firstIdx, lastIdx);
  90. }
  91. }
  92. break;
  93. }
  94. }
  95. }
  96. return rst;
  97. };
  98. let private_parse_ref = function(item, itemIdx){
  99. let expr = item.expression.split('at(').join('@(');
  100. item.expression = expr;
  101. //console.log('expression: ' + expr);
  102. let idx = expr.indexOf('@(', 0);
  103. while (idx >= 0) {
  104. let code = private_extract_code(expr, idx);
  105. //console.log('提取code: ' + code);
  106. if (code.length > 0) {
  107. let subItem = me.compileAssistantObj[code];
  108. if (subItem) {
  109. if (subItem.code !== item.code) {
  110. private_parse_ref(subItem, me.compileAssistantObj[code + "_idx"]);
  111. } else {
  112. me.errs.push("There exists the self refer code: " + code);
  113. }
  114. } else {
  115. me.errs.push("There exists the invalid code by which could not find the item: " + code);
  116. console.log('invalid code: ' + code);
  117. }
  118. }
  119. idx = expr.indexOf('@(', idx + code.length + 3);
  120. }
  121. if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
  122. //console.log('the code ready to push: ' + item.code);
  123. me.calcTpl.compiledSeq.push(itemIdx);
  124. }
  125. };
  126. let private_setup_seq = function(item, itemIdx){
  127. if (me.calcTpl.compiledSeq.indexOf(itemIdx) < 0) {
  128. private_parse_ref(item, itemIdx);
  129. }
  130. };
  131. let private_compile_items = function() {
  132. for (let idx of me.calcTpl.compiledSeq) {
  133. let item = me.calcTpl.calcItems[idx];
  134. item.compiledExpr = item.expression.split('@(').join('$CE.at(');
  135. item.compiledExpr = item.compiledExpr.split('base(').join('$CE.base(');
  136. item.compiledExpr = item.compiledExpr.split('fee(').join('$CE.fee(');
  137. item.compiledExpr = item.compiledExpr.split('factor(').join('$CE.factor(');
  138. //console.log(item.compiledExpr);
  139. }
  140. };
  141. let private_comile_feeFile = function() {
  142. if (me.calFee) {
  143. me.compiledFee = {};
  144. for (let fee of me.calFee) {
  145. me.compiledFee["fee_" + fee.ID] = fee;
  146. }
  147. }
  148. };
  149. if (me.calcTpl && me.calcTpl.calcItems && me.calcTpl.calcItems.length > 0) {
  150. me.calcTpl.compiledSeq = [];
  151. me.compileAssistantObj = {};
  152. //1. first round -> prepare
  153. private_comile_feeFile();
  154. for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
  155. let item = me.calcTpl.calcItems[i];
  156. me.compileAssistantObj[item.code] = item;
  157. me.compileAssistantObj[item.code + "_idx"] = i;
  158. }
  159. //2. second round -> go!
  160. for (let i = 0; i < me.calcTpl.calcItems.length; i++) {
  161. private_setup_seq(me.calcTpl.calcItems[i], i);
  162. }
  163. if (me.errs.length == 0) {
  164. private_compile_items();
  165. if (me.errs.length == 0) me.hasCompiled = true;
  166. } else {
  167. console.log('errors: ' + me.errs.toString());
  168. }
  169. }
  170. //console.log(me.compileAssistantObj);
  171. //console.log(me.calcTpl.compiledSeq);
  172. };
  173. calculate( $RATION){
  174. let me = this;
  175. if ($RATION && me.hasCompiled) {
  176. let $CE = executeObj;
  177. $CE.currentRationItem = $RATION;
  178. $CE.currentTpl = me;
  179. $CE.currentFeeRateFile = me.calFee;
  180. $CE.compiledFeeRateFile = me.compiledFee;
  181. for (let idx of me.calcTpl.compiledSeq) {
  182. let item = me.calcTpl.calcItems[idx];
  183. item.execRst = eval(item.compiledExpr);
  184. }
  185. }
  186. }
  187. }
  188. module.exports = new calculation();