calc_util.js 7.0 KB

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