analysis_excel.test.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. const { app, assert } = require('egg-mock/bootstrap');
  10. const AnalysisExcel = require('../../../app/lib/analysis_excel');
  11. const Xlsx = require('js-xlsx');
  12. const _ = require('lodash');
  13. const mockData = {};
  14. describe('test/app/lib/analysis_excel.test.js', () => {
  15. // 准备测试数据,新增测试标段
  16. before(function* () {
  17. const ctx = app.mockContext();
  18. // 模拟登录session
  19. const postData = {
  20. account: '734406061@qq.com',
  21. project: 'T201711273363',
  22. project_password: 'mai654321',
  23. };
  24. ctx.session = {};
  25. const loginResult = yield ctx.service.projectAccount.accountLogin(postData, 2);
  26. assert(loginResult);
  27. mockData.session = ctx.session;
  28. // 模拟打开标段
  29. mockData.tender = {};
  30. const addData = {
  31. name: 'test_analysis_excel',
  32. category: null,
  33. };
  34. const tenderData = yield ctx.service.tender.getDataByCondition({
  35. user_id: ctx.session.sessionUser.accountId,
  36. name: addData.name,
  37. });
  38. if (tenderData) {
  39. mockData.tender.data = tenderData;
  40. } else {
  41. const addResult = yield ctx.service.tender.add(addData);
  42. assert(addResult);
  43. mockData.tender.data = yield ctx.service.tender.getDataByCondition({
  44. user_id: ctx.session.sessionUser.accountId,
  45. name: addData.name,
  46. });
  47. }
  48. mockData.tender.id = mockData.tender.data.id;
  49. mockData.tender.info = yield ctx.service.tenderInfo.getTenderInfo(mockData.tender.id);
  50. });
  51. it('analysis Test Data', function* () {
  52. const ctx = app.mockContext(mockData);
  53. const analysisExcel = new AnalysisExcel(ctx);
  54. const testData = {
  55. rows: [
  56. ['项目节编号', '清单子目号', '部位明细', '名称', '单位', '清单数量', '设计数量1', '设计数量2', '单价', '合价', '图号', '备注'],
  57. ['1', null, null, '第一部分 建筑安装工程费', '公路公里'],
  58. ['1-1', null, null, '临时工程', '公路公里'],
  59. ['1-1-6', null, null, '临时道路修建、养护与拆除(包括原道路的养护费)'],
  60. [ null, '103-1', null, '临时道路修建、养护与拆除(包括原道路的养护费)', '总额', 1, null, null, 50000 ],
  61. [ '1-1-7', null, null, '临时占地' ],
  62. [ null, '103-2', null, '临时占地', '总额', 1, null, null, 57350 ],
  63. [ '1-1-8', null, null, '临时供电设施' ],
  64. [ null, '103-3-a', null, '设施架设、拆除', '总额', 1, null, null, 638406 ],
  65. [ null, '103-3-b', null, '设施维修', '总额', 1, null, null, 50000 ],
  66. [ '1-1-9', null, null, '电讯设施的提供、维修与拆除' ],
  67. [ null, '103-4', null, '电讯设施的提供、维修与拆除', '总额', 1, null, null, 50000 ],
  68. [ '1-1-10', null, null, '承包人驻地建设' ],
  69. [ null, '104-1', null, '承包人驻地建设', '总额', 1, null, null, 200000 ],
  70. [ '1-2', null, null, '路基工程', 'km' ],
  71. [ '1-2-2', null, null, '挖方', 'm3' ],
  72. [ '1-2-2-1', null, null, '挖土方', 'm3' ],
  73. [ '1-2-2-1-1', null, null, '挖路基土方', 'm3' ],
  74. [ null, '203-1-a', null, ' ', 'm3', null, null, null, 7.53 ],
  75. [ null, null, 1, 'K0+000-K1+000', null, 11619.34375, null, null, null, null, '第二册S-2-1' ],
  76. [ null, null, 2, 'K1+000-K1+800', null, 11619.34375, null, null, null, null, '第二册S-2-1' ],
  77. [ null, null, 3, 'K2+800-K3+004', null, 11619.34375, null, null, null, null, '第二册S-2-1' ],
  78. [ null, null, 4, 'K3+004-K4+040', null, 11619.34375, null, null, null, null, '第二册S-2-1' ],
  79. [ null, null, 5, 'K4+040-K5+000', null, 11619.34375, null, null, null, null, '第二册S-2-1' ],
  80. [ null, null, 6, 'K5+000-K6+000', null, 11619.34375, null, null, null, null, '第二册S-2-1' ],
  81. [ null, null, 7, 'K6+000-K7+000', null, 11619.34375, null, null, null, null, '第二册S-2-1' ],
  82. [ null, null, 8, 'K7+000-K7+700', null, 11619.34375, null, null, null, null, '第二册S-2-1' ],
  83. [ '1-2-2-2', null, null, '挖石方', 'm3' ],
  84. [ '1-2-2-2-1', null, null, '挖软石', 'm3' ],
  85. [ null, '203-1-b', null, '挖石方', 'm3', 105.36, null, null, 16.11 ],
  86. [ '1-3', null, null, '路面工程', 'km' ],
  87. [ '1-4', null, null, '桥梁涵洞工程', 'km' ],
  88. [ '1-6', null, null, '隧道工程', 'km' ],
  89. ],
  90. range: 'A1:L29',
  91. };
  92. const templateData = yield ctx.service.tenderNodeTemplate.getData(true);
  93. const result = analysisExcel.analysisData(testData, templateData);
  94. // 检查插入总量
  95. assert(result.items.length === 72);
  96. assert(result.roots.length === 6);
  97. assert(result.pos.length === 8);
  98. // 检查第一部分子节点排序
  99. const nodes = result.roots[0].children;
  100. assert(nodes[nodes.length - 2].code === '1-6');
  101. assert(nodes[nodes.length - 1].code === '1-10');
  102. // 检查第203-1-a的数量
  103. const xmj = result.codeNodes['1-2-2-1-1'];
  104. const gcl = xmj.children[0];
  105. assert(gcl.quantity === 92954.75);
  106. });
  107. it('Analysis Excel Test Data And Import', function* () {
  108. const ctx = app.mockContext(mockData);
  109. const excelFile = app.baseDir + '/test/app/test_file/导入分项清单EXCEL格式.xls';
  110. const wb = Xlsx.readFile(excelFile);
  111. const name = wb.SheetNames[0];
  112. const sheetData = {
  113. rows: Xlsx.utils.sheet_to_json(wb.Sheets[name], {header: 1}),
  114. merge: wb.Sheets[name]["!merges"],
  115. };
  116. const analysisExcel = new AnalysisExcel(ctx);
  117. const templateData = yield ctx.service.tenderNodeTemplate.getData(true);
  118. const result = analysisExcel.analysisData(sheetData, templateData);
  119. assert(result.items.length === 216);
  120. const xmj = result.codeNodes['1-2-3-1-2'];
  121. const gcl = xmj.children[0];
  122. assert(gcl.quantity === 0);
  123. yield ctx.service.ledger.importExcel(sheetData);
  124. });
  125. it('analysis 渭武12标 Excel', function* () {
  126. const ctx = app.mockContext(mockData);
  127. const excelFile = app.baseDir + '/test/app/test_file/渭武12标.xls';
  128. const wb = Xlsx.readFile(excelFile);
  129. const name = wb.SheetNames[0];
  130. const sheetData = {
  131. rows: Xlsx.utils.sheet_to_json(wb.Sheets[name], {header: 1}),
  132. merge: wb.Sheets[name]["!merges"],
  133. };
  134. yield ctx.service.ledger.importExcel(sheetData);
  135. const count = yield ctx.service.ledger.count({
  136. tender_id: ctx.tender.id
  137. });
  138. assert(count === 2867);
  139. });
  140. });