testCalc.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. /**
  2. * Created by Tony on 2017/6/21.
  3. */
  4. var test = require('tape');
  5. var calcUtil = require('../../public/calc_util');
  6. let dummyFee = [
  7. {
  8. "ID" : 1,
  9. "ParentID" : null,
  10. "name" : "企业管理费",
  11. "rate" : null,
  12. "memo" : null
  13. },
  14. {
  15. "ID" : 2,
  16. "ParentID" : 1,
  17. "name" : "建筑工程",
  18. "rate" : null,
  19. "memo" : null
  20. },
  21. {
  22. "ID" : 3,
  23. "ParentID" : 2,
  24. "name" : "一类工程",
  25. "rate" : 16.03,
  26. "memo" : null
  27. },
  28. {
  29. "ID" : 4,
  30. "ParentID" : 2,
  31. "name" : "二类工程",
  32. "rate" : 14.95,
  33. "memo" : null
  34. },
  35. {
  36. "ID" : 5,
  37. "ParentID" : 2,
  38. "name" : "三类工程",
  39. "rate" : 12.47,
  40. "memo" : null
  41. },
  42. {
  43. "ID" : 6,
  44. "ParentID" : 2,
  45. "name" : "四类工程",
  46. "rate" : 9.3,
  47. "memo" : null
  48. },
  49. {
  50. "ID" : 7,
  51. "ParentID" : 1,
  52. "name" : "市政工程",
  53. "rate" : null,
  54. "memo" : null
  55. },
  56. {
  57. "ID" : 8,
  58. "ParentID" : 7,
  59. "name" : "一类工程",
  60. "rate" : 16.33,
  61. "memo" : null
  62. },
  63. {
  64. "ID" : 9,
  65. "ParentID" : 7,
  66. "name" : "二类工程",
  67. "rate" : 15,
  68. "memo" : null
  69. },
  70. {
  71. "ID" : 10,
  72. "ParentID" : 7,
  73. "name" : "三类工程",
  74. "rate" : 12.5,
  75. "memo" : null
  76. },
  77. {
  78. "ID" : 11,
  79. "ParentID" : 7,
  80. "name" : "四类工程",
  81. "rate" : 9.5,
  82. "memo" : null
  83. },
  84. {
  85. "ID" : 12,
  86. "ParentID" : 1,
  87. "name" : "机械土石方",
  88. "rate" : 15.5,
  89. "memo" : null
  90. },
  91. {
  92. "ID" : 13,
  93. "ParentID" : 1,
  94. "name" : "仿古建筑工程",
  95. "rate" : 12,
  96. "memo" : null
  97. },
  98. {
  99. "ID" : 14,
  100. "ParentID" : 1,
  101. "name" : "建筑修缮工程",
  102. "rate" : 12.47,
  103. "memo" : null
  104. },
  105. {
  106. "ID" : 15,
  107. "ParentID" : 1,
  108. "name" : "炉窑砌筑工程",
  109. "rate" : null,
  110. "memo" : null
  111. },
  112. {
  113. "ID" : 16,
  114. "ParentID" : 15,
  115. "name" : "一类工程",
  116. "rate" : 14.25,
  117. "memo" : null
  118. },
  119. {
  120. "ID" : 17,
  121. "ParentID" : 15,
  122. "name" : "二类工程",
  123. "rate" : 12.47,
  124. "memo" : null
  125. },
  126. {
  127. "ID" : 18,
  128. "ParentID" : 15,
  129. "name" : "三类工程",
  130. "rate" : 10.8,
  131. "memo" : null
  132. },
  133. {
  134. "ID" : 19,
  135. "ParentID" : 15,
  136. "name" : "四类工程",
  137. "rate" : null,
  138. "memo" : null
  139. },
  140. {
  141. "ID" : 20,
  142. "ParentID" : null,
  143. "name" : "规费",
  144. "rate" : null,
  145. "memo" : null
  146. },
  147. {
  148. "ID" : 21,
  149. "ParentID" : 20,
  150. "name" : "建筑工程",
  151. "rate" : 4.87,
  152. "memo" : null
  153. },
  154. {
  155. "ID" : 22,
  156. "ParentID" : 20,
  157. "name" : "市政工程",
  158. "rate" : 3.61,
  159. "memo" : null
  160. },
  161. {
  162. "ID" : 23,
  163. "ParentID" : 20,
  164. "name" : "机械土石方",
  165. "rate" : 2.15,
  166. "memo" : null
  167. },
  168. {
  169. "ID" : 24,
  170. "ParentID" : 20,
  171. "name" : "仿古建筑工程",
  172. "rate" : 2.84,
  173. "memo" : null
  174. },
  175. {
  176. "ID" : 25,
  177. "ParentID" : 20,
  178. "name" : "建筑修缮工程",
  179. "rate" : 2.84,
  180. "memo" : null
  181. },
  182. {
  183. "ID" : 26,
  184. "ParentID" : 20,
  185. "name" : "炉窑砌筑工程",
  186. "rate" : 3.61,
  187. "memo" : null
  188. },
  189. {
  190. "ID" : 27,
  191. "ParentID" : null,
  192. "name" : "利润",
  193. "rate" : null,
  194. "memo" : null
  195. },
  196. {
  197. "ID" : 28,
  198. "ParentID" : 27,
  199. "name" : "建筑工程",
  200. "rate" : null,
  201. "memo" : null
  202. },
  203. {
  204. "ID" : 29,
  205. "ParentID" : 28,
  206. "name" : "一类工程",
  207. "rate" : 8.73,
  208. "memo" : null
  209. },
  210. {
  211. "ID" : 30,
  212. "ParentID" : 28,
  213. "name" : "二类工程",
  214. "rate" : 6.94,
  215. "memo" : null
  216. }
  217. ]
  218. let dummyCalcTpl = {
  219. calType: 3,
  220. calTypeName: "测试用_重庆",
  221. compiledSeq: [],
  222. calcItems: [{
  223. code: "1",
  224. name: "基价直接工程费",
  225. dispExpr: "1.1+1.2+1.3+1.4",
  226. expression: "@('1.1') + @('1.2') + @('1.3') + @('1.4')",
  227. compiledExpr: "",
  228. statement: "基价人工费+基价材料费+基价机械费+未计价材料费"
  229. },{
  230. code: "1.1",
  231. name: "基价人工费",
  232. dispExpr: "1.1.1+1.1.2",
  233. expression: "@('1.1.1') + @('1.1.2')",
  234. compiledExpr: "",
  235. statement: "定额基价人工费+定额人工单价(基价)调整"
  236. },{
  237. code: "1.1.1",
  238. name: "定额基价人工费",
  239. dispExpr: "定额基价人工费",
  240. //expression: "base('定额基价人工费')",
  241. expression: "base('定额基价人工费').toFixed(2)",
  242. compiledExpr: "",
  243. statement: "定额基价人工费"
  244. },{
  245. code: "1.1.2",
  246. name: "定额人工单价(基价)调整",
  247. dispExpr: "1.1.1*[1.89-1]",
  248. expression: "@('1.1.1') * fee('3')",
  249. compiledExpr: "",
  250. statement: "定额基价人工费*[定额人工单价(基价)调整系数-1]"
  251. },{
  252. code: "1.2",
  253. name: "基价材料费",
  254. dispExpr: "定额基价材料费",
  255. expression: "base('定额基价材料费')",
  256. compiledExpr: "",
  257. statement: "定额基价材料费"
  258. },{
  259. code: "1.3",
  260. name: "基价机械费",
  261. dispExpr: "1.3.1+1.3.2",
  262. expression: "@('1.3.1') + @('1.3.2')",
  263. compiledExpr: "",
  264. statement: "定额基价机械费+定额机上人工单价(基价)调整"
  265. },{
  266. code: "1.3.1",
  267. name: "定额基价机械费",
  268. dispExpr: "定额基价机械费",
  269. expression: "base('定额基价机械费')",
  270. compiledExpr: "",
  271. statement: "定额基价机械费"
  272. },{
  273. code: "1.3.1.1",
  274. name: "其中:定额基价机上人工费",
  275. dispExpr: "定额基价机上人工费",
  276. expression: "base('定额基价机上人工费')",
  277. compiledExpr: "",
  278. statement: "定额基价机上人工费"
  279. },{
  280. code: "1.3.2",
  281. name: "定额人工单价(基价)调整",
  282. dispExpr: "1.3.1.1*[1.89-1]",
  283. expression: "@('1.3.1.1') * fee('30')",
  284. compiledExpr: "",
  285. statement: "定额基价人工费*[定额人工单价(基价)调整系数-1]"
  286. },{
  287. code: "1.4",
  288. name: "未计价材料费",
  289. dispExpr: "主材费+设备费",
  290. expression: "base('主材费') + base('设备费')",
  291. compiledExpr: "",
  292. statement: "主材费+设备费"
  293. },{
  294. code: "2",
  295. name: "企业管理费",
  296. dispExpr: "1.1.1",
  297. expression: "@('1.1.1')",
  298. compiledExpr: "",
  299. statement: "定额基价人工费"
  300. },{
  301. code: "3",
  302. name: "利润",
  303. dispExpr: "1.1.1",
  304. expression: "@('1.1.1')",
  305. compiledExpr: "",
  306. statement: "定额基价人工费"
  307. },{
  308. code: "4",
  309. name: "风险因素",
  310. dispExpr: "",
  311. expression: "0",
  312. compiledExpr: "",
  313. statement: ""
  314. },{
  315. code: "5",
  316. name: "人材机价差",
  317. dispExpr: "5.1+5.2+5.3",
  318. expression: "@('5.1') + @('5.2') + @('5.3')",
  319. compiledExpr: "",
  320. statement: "人工费价差+材料费价差+机械费价差"
  321. },{
  322. code: "5.1",
  323. name: "人工费价差",
  324. dispExpr: "信息价或市场价格-调整后的定额人工费(基价)",
  325. expression: "base('市场价格人工费') - base('定额基价人工费(调整后)')",
  326. compiledExpr: "",
  327. statement: "市场价格人工费-调整后的定额人工费(基价)"
  328. },{
  329. code: "5.2",
  330. name: "材料费价差",
  331. dispExpr: "信息价或市场价格-定额基价材料费",
  332. expression: "base('市场价格材料费') - base('定额基价材料费(调整后)')",
  333. compiledExpr: "",
  334. statement: "市场价格材料费-定额基价材料费"
  335. },{
  336. code: "5.3",
  337. name: "机械费价差",
  338. dispExpr: "信息价或市场价格-调整后的定额基价机械费(基价)",
  339. expression: "base('市场价格机械费') - base('定额基价机械费(调整后)')",
  340. compiledExpr: "",
  341. statement: "市场价格机械费-调整后的定额基价机械费(基价)"
  342. },{
  343. code: "6",
  344. name: "综合单价",
  345. dispExpr: "1+2+3+4+5",
  346. expression: "@('1') + @('2') + @('3') + @('4') + @('5')",
  347. compiledExpr: "",
  348. statement: "基价直接工程费+企业管理费+利润+风险因素+人材机价差"
  349. }
  350. ]
  351. };
  352. let dummyRation = {
  353. "sectionId" : 76,
  354. "ID" : 15,
  355. "code" : "AA0001",
  356. "name" : "人工挖土方",
  357. "unit" : "100m3",
  358. "basePrice" : 840.84,
  359. "caption" : "人工挖土方",
  360. "feeType" : 2,
  361. "rationGljList" : [
  362. {
  363. "glj" : {
  364. "repositoryId" : 3,
  365. "ID" : 17,
  366. "code" : "00010201",
  367. "name" : "土石方综合工日",
  368. "specs" : null,
  369. "unit" : "工日",
  370. "basePrice" : 22,
  371. "gljDistType" : "人工",
  372. "gljType" : 2
  373. },
  374. "consumeAmt" : 38.22,
  375. "proportion" : 0
  376. },{
  377. "glj": {
  378. "repositoryId" : 3,
  379. "ID" : 68,
  380. "code" : "85030207",
  381. "name" : "履带式起重机",
  382. "specs" : "50t",
  383. "unit" : "台班",
  384. "basePrice" : 1194.05,
  385. "gljDistType" : "机械",
  386. "gljType" : 64
  387. },
  388. "consumeAmt" : 1.22,
  389. "proportion" : 0
  390. },{
  391. "glj": {
  392. "repositoryId" : 3,
  393. "ID" : 200,
  394. "code" : "36290101",
  395. "name" : "水",
  396. "specs" : "",
  397. "unit" : "m3",
  398. "basePrice" : 2,
  399. "gljDistType" : "材料",
  400. "gljType" : 6
  401. },
  402. "consumeAmt" : 9.2,
  403. "proportion" : 0
  404. }
  405. ],
  406. "rationRepId" : 3
  407. }
  408. /*
  409. test('计算式测试', function(t){
  410. calcUtil.init(dummyCalcTpl, dummyFee);
  411. calcUtil.compile();
  412. calcUtil.calculate(dummyRation);
  413. for (let idx of dummyCalcTpl.compiledSeq) {
  414. let item = dummyCalcTpl.calcItems[idx];
  415. console.log('code: ' + item.code + ' | expression: ' + item.compiledExpr + ' | result: ' + item.execRst);
  416. }
  417. t.pass('just pass for calculation initialization!');
  418. t.end();
  419. })
  420. /*/
  421. let cnt = 100000;
  422. test('极限计算式测试:' + cnt + '次', function(t){
  423. let dt0 = new Date();
  424. calcUtil.init(dummyCalcTpl, dummyFee);
  425. calcUtil.compile();
  426. let exRlist = [];
  427. let rStr = JSON.stringify(dummyRation);
  428. for (let i = 0; i < cnt; i++) {
  429. exRlist.push(JSON.parse(rStr));
  430. }
  431. let dt1 = new Date();
  432. for (let i = 0; i < cnt; i++) {
  433. calcUtil.calculate(exRlist[i]);
  434. }
  435. let dt2 = new Date();
  436. console.log("准备对象时间(毫秒): " + (dt1 - dt0));
  437. console.log("总计算时间(毫秒): " + (dt2 - dt1));
  438. console.log("总测试时间(毫秒): " + (dt2 - dt0));
  439. t.pass('just pass for calculation initialization!');
  440. t.end();
  441. })
  442. //*/