unit_compare.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. $(document).ready(() => {
  10. const spreadNS = GC.Spread.Sheets;
  11. const spread = SpreadJsObj.createNewSpread($('.sjs-height-1')[0]);
  12. const sheet = spread.getActiveSheet();
  13. const hCenter = spreadNS.HorizontalAlign.center;
  14. const vCenter = spreadNS.VerticalAlign.center;
  15. const compareObj = {
  16. cacheList: [],
  17. sortNodeData: function (data) {
  18. data.sort(function (a, b) {
  19. if (a.code > b.code) {
  20. return 1;
  21. } else if (a.code < b.code) {
  22. return -1;
  23. } else {
  24. return 0;
  25. }
  26. });
  27. },
  28. showCompareData: function () {
  29. const cols = compareObj.cols, colsName = compareObj.colsName;
  30. const colCount = colsName.length;
  31. function loadNode (node, row) {
  32. sheet.getCell(row, compareObj.cols.code).text(node.code).wordWrap(true).vAlign(vCenter);
  33. sheet.getCell(row, compareObj.cols.name).text(node.name).wordWrap(true).vAlign(vCenter);
  34. sheet.getRange(row, 0, 1, colCount).backColor('#dae5ee');
  35. sheet.autoFitRow(row);
  36. }
  37. function loadIndex(index, row) {
  38. for (const colName of colsName) {
  39. if (colName === 'averageIndex') {
  40. const aver = Number((index.sumValue / index.sumCount).toFixed(2));
  41. sheet.getCell(row, cols[colName]).value(aver).wordWrap(true).vAlign(vCenter);
  42. } else if (index[colName]) {
  43. sheet.getCell(row, cols[colName]).value(index[colName]).wordWrap(true).vAlign(vCenter);
  44. }
  45. }
  46. sheet.autoFitRow(row);
  47. }
  48. SpreadJsObj.beginMassOperationSheet(sheet);
  49. let iRow = 2;
  50. sheet.setRowCount(2);
  51. console.log(compareObj.showData);
  52. for (const sd of compareObj.showData) {
  53. sheet.addRows(iRow, 1);
  54. loadNode(sd, iRow);
  55. iRow += 1;
  56. for (const index of sd.children) {
  57. sheet.addRows(iRow, 1);
  58. loadIndex(index, iRow);
  59. iRow += 1;
  60. }
  61. }
  62. SpreadJsObj.endMassOperationSheet(sheet);
  63. },
  64. initXMatchCompareHeader: function (data) {
  65. const cols = {}, colsName = [];
  66. const indexColCount = data.selects.length + 1;
  67. SpreadJsObj.beginMassOperationSheet(sheet);
  68. const spans = sheet.getSpans();
  69. for (const span of spans) {
  70. sheet.removeSpan(span.row, span.col);
  71. }
  72. sheet.setColumnCount(6 + indexColCount);
  73. sheet.setRowCount(2);
  74. sheet.frozenRowCount(2);
  75. colsName.push('code');
  76. cols.code = 0;
  77. sheet.getCell(0, cols.code).text('指标编号').hAlign(hCenter).vAlign(vCenter);
  78. sheet.addSpan(0, cols.code, 2, 1);
  79. sheet.setColumnWidth(cols.code, 80);
  80. colsName.push('name');
  81. cols.name = 1;
  82. sheet.getCell(0, cols.name).text('项目或费用名称').hAlign(hCenter).vAlign(vCenter);
  83. sheet.addSpan(0, cols.name, 2, 1);
  84. sheet.setColumnWidth(cols.name, 220);
  85. colsName.push('unit1');
  86. cols.unit1 = 2;
  87. colsName.push('unit2');
  88. cols.unit2 = 3;
  89. sheet.getCell(0, cols.unit1).text('指标单位').hAlign(hCenter).vAlign(vCenter);
  90. sheet.addSpan(0, cols.unit1, 2, 2);
  91. sheet.setColumnWidth(cols.unit1, 65);
  92. sheet.setColumnWidth(cols.unit2, 65);
  93. if (data.selects.length > 0) {
  94. sheet.getCell(0, cols.unit2+1).text('经济指标').hAlign(hCenter).vAlign(vCenter);
  95. sheet.addSpan(0, cols.unit2+1, 1, indexColCount - 1);
  96. for (let i = 0, iLen = indexColCount - 1; i < iLen; i++) {
  97. const colName = 'bills_xid' + (data.selects[i].id > 0 ? '_' + data.selects[i].id : '');
  98. colsName.push(colName);
  99. cols[colName] = 4+i;
  100. sheet.getCell(1, cols[colName]).text(data.selects[i].id > 0 ? data.selects[i].name : '其他')
  101. .hAlign(hCenter).vAlign(vCenter).wordWrap(true);
  102. sheet.setColumnWidth(cols[colName], 150);
  103. }
  104. colsName.push('averageIndex');
  105. cols.averageIndex = 4 + indexColCount - 1;
  106. sheet.getCell(0, cols.averageIndex).text('平均指标').hAlign(hCenter).vAlign(vCenter);
  107. sheet.addSpan(0, cols.averageIndex, 2, 1);
  108. sheet.setColumnWidth(cols.averageIndex, 100);
  109. }
  110. colsName.push('rule');
  111. cols.rule = 4 + indexColCount;
  112. sheet.getCell(0, cols.rule).text('计算规则').hAlign(hCenter).vAlign(vCenter);
  113. sheet.addSpan(0, cols.rule, 2, 1);
  114. sheet.setColumnWidth(cols.rule, 300);
  115. colsName.push('memo');
  116. cols.memo = 5 + indexColCount;
  117. sheet.getCell(0, cols.memo).text('备注').hAlign(hCenter).vAlign(vCenter);
  118. sheet.addSpan(0, cols.memo, 2, 1);
  119. sheet.setColumnWidth(cols.memo, 100);
  120. sheet.autoFitRow(0);
  121. sheet.autoFitRow(1);
  122. compareObj.colsName = colsName;
  123. compareObj.cols = cols;
  124. SpreadJsObj.endMassOperationSheet(sheet);
  125. },
  126. sortXMatchCompareData: function (data) {
  127. function findNode(data, src, xid) {
  128. for (const node of data) {
  129. const field = xid > 0 ? 'bills_xid_' + xid : 'bills_xid';
  130. if (node.code === src.code && node.name === src.name && node[field] === src[field]) {
  131. return node;
  132. }
  133. }
  134. return null;
  135. }
  136. function findIndex(data, src) {
  137. for (const index of data) {
  138. if (index.code === src.code && index.name === src.name) {
  139. return index;
  140. }
  141. }
  142. return null;
  143. }
  144. const result = [];
  145. for (const select of compareObj.data.selects) {
  146. const searchData = data.filter(function (x) { return x.bills_xid === select.id});
  147. for (const sd of searchData) {
  148. let sortNode = findNode(result, sd, select.id);
  149. if (!sortNode) {
  150. sortNode = {
  151. code: sd.code,
  152. name: sd.name,
  153. children: [],
  154. };
  155. result.push(sortNode);
  156. }
  157. if (select.id > 0) {
  158. sortNode['bills_xid_' + select.id] = sd.bills_xid;
  159. } else {
  160. sortNode['bills_xid'] = sd.bills_xid;
  161. }
  162. for (const index of sd.children) {
  163. let sortIndex = findIndex(sortNode.children, index);
  164. if (!sortIndex) {
  165. sortIndex = {
  166. code: index.code,
  167. name: index.name,
  168. unit1: index.unit1,
  169. unit2: index.unit2,
  170. sumValue: 0,
  171. sumCount: 0,
  172. rule: index.rule,
  173. memo: index.memo,
  174. };
  175. sortNode.children.push(sortIndex)
  176. }
  177. if (select.id > 0) {
  178. sortIndex['bills_xid_' + select.id] = index.value;
  179. } else {
  180. sortIndex['bills_xid'] = index.value;
  181. }
  182. sortIndex.sumValue += index.value;
  183. sortIndex.sumCount += 1;
  184. }
  185. }
  186. }
  187. compareObj.sortNodeData(result);
  188. return result;
  189. },
  190. loadXMatchCompareData(data) {
  191. compareObj.initXMatchCompareHeader(compareObj.data);
  192. compareObj.showData = compareObj.sortXMatchCompareData(data);
  193. compareObj.showCompareData();
  194. },
  195. initCommonCompareHeader: function () {
  196. const cols = {}, colsName = [];
  197. SpreadJsObj.beginMassOperationSheet(sheet);
  198. const spans = sheet.getSpans();
  199. for (const span of spans) {
  200. sheet.removeSpan(span.row, span.col);
  201. }
  202. sheet.setColumnCount(7);
  203. sheet.setRowCount(2);
  204. sheet.frozenRowCount(2);
  205. colsName.push('code');
  206. cols.code = 0;
  207. sheet.getCell(0, cols.code).text('指标编号').hAlign(hCenter).vAlign(vCenter);
  208. sheet.addSpan(0, cols.code, 2, 1);
  209. sheet.setColumnWidth(cols.code, 80);
  210. colsName.push('name');
  211. cols.name = 1;
  212. sheet.getCell(0, cols.name).text('项目或费用名称').hAlign(hCenter).vAlign(vCenter);
  213. sheet.addSpan(0, cols.name, 2, 1);
  214. sheet.setColumnWidth(cols.name, 220);
  215. colsName.push('unit1');
  216. cols.unit1 = 2;
  217. colsName.push('unit2');
  218. cols.unit2 = 3;
  219. sheet.getCell(0, cols.unit1).text('指标单位').hAlign(hCenter).vAlign(vCenter);
  220. sheet.addSpan(0, cols.unit1, 2, 2);
  221. sheet.setColumnWidth(cols.unit1, 65);
  222. sheet.setColumnWidth(cols.unit2, 65);
  223. colsName.push('value');
  224. cols.name = 4;
  225. sheet.getCell(0, cols.name).text('经济指标').hAlign(hCenter).vAlign(vCenter);
  226. sheet.addSpan(0, cols.name, 2, 1);
  227. sheet.setColumnWidth(cols.name, 220);
  228. colsName.push('rule');
  229. cols.rule = 5;
  230. sheet.getCell(0, cols.rule).text('计算规则').hAlign(hCenter).vAlign(vCenter);
  231. sheet.addSpan(0, cols.rule, 2, 1);
  232. sheet.setColumnWidth(cols.rule, 300);
  233. colsName.push('memo');
  234. cols.memo = 6;
  235. sheet.getCell(0, cols.memo).text('备注').hAlign(hCenter).vAlign(vCenter);
  236. sheet.addSpan(0, cols.memo, 2, 1);
  237. sheet.setColumnWidth(cols.memo, 100);
  238. compareObj.colsName = colsName;
  239. compareObj.cols = cols;
  240. SpreadJsObj.endMassOperationSheet(sheet);
  241. },
  242. loadCommonCompareData(data) {
  243. compareObj.initCommonCompareHeader();
  244. compareObj.sortNodeData(data);
  245. this.showData = data;
  246. compareObj.showCompareData();
  247. },
  248. loadCompareData: function (data) {
  249. compareObj.resultData = data;
  250. if (compareObj.data.xMatch) {
  251. compareObj.loadXMatchCompareData(data);
  252. } else {
  253. compareObj.loadCommonCompareData(data);
  254. }
  255. },
  256. load: function () {
  257. postData(window.location.pathname + '/search', compareObj.data, function (result) {
  258. compareObj.lastData = compareObj.data;
  259. $('#select-lib').text(compareObj.data.lib_name + ': ' + compareObj.data.name);
  260. compareObj.loadCompareData(result);
  261. if (compareObj.data.xMatch) {
  262. $('#select-data').modal('hide');
  263. } else {
  264. $('#generate-data').modal('hide');
  265. }
  266. });
  267. },
  268. generateXList: function (arr) {
  269. $('#select-title').text('选择对比项 —— ' + compareObj.data.lib_name + ': ' + compareObj.data.name);
  270. const html = [];
  271. for (const r of arr) {
  272. html.push('<tr>');
  273. html.push('<td class="text-center">', "<input x-data='" + JSON.stringify({id: r.bills_xid, name: r.name, code: r.code}) + "' type='checkbox'>", '</td>');
  274. html.push('<td>', r.code, '</td>');
  275. html.push('<td>', r.bills_xid === -1 ? '其他' : r.name, '</td>');
  276. html.push('<td class="text-center">', r.units, '</td>');
  277. html.push('<td class="text-right">', r.dgn_quantity1, '</td>');
  278. html.push('<td class="text-right">', r.dgn_quantity2, '</td>');
  279. html.push('<td class="text-right">', r.dgn_price, '</td>');
  280. html.push('<td class="text-right">', r.total_price, '</td>');
  281. html.push('</tr>');
  282. }
  283. $('#x-list').html(html.join(''));
  284. $('#select-data').modal('show');
  285. $('#generate-data').modal('hide');
  286. },
  287. loadParentNode: function () {
  288. const history = compareObj.cacheList.find(function (l) {
  289. return l.lib_id === compareObj.data.lib_id && l.className === compareObj.data.className;
  290. });
  291. if (!history) {
  292. postData(window.location.pathname + '/parent', compareObj.data, function (result) {
  293. compareObj.cacheList.push({lib_id: compareObj.data.lib_id, className: compareObj.data.className, xList: result});
  294. compareObj.generateXList(result);
  295. });
  296. } else {
  297. compareObj.generateXList(history.xList);
  298. }
  299. },
  300. };
  301. compareObj.initCommonCompareHeader();
  302. $('#generate-data').modal('show');
  303. $('.dropdown-item').click(function () {
  304. $('#btnGroupDrop1').text($(this).text()).attr('data', $(this).attr('data'));
  305. if ($('#hint1').attr('hint-type') === 'dy') {
  306. $('#hint1').hide();
  307. }
  308. });
  309. $('input[type=radio]').bind('click', function () {
  310. $('input[type=radio]').parent().parent().addClass('table-secondary');
  311. if (this.checked) {
  312. $(this).parent().parent().removeClass('table-secondary');
  313. }
  314. if ($('#hint1').attr('hint-type') === 'bd') {
  315. $('#hint1').hide();
  316. }
  317. });
  318. $('#next').click(function () {
  319. const dy = $('#btnGroupDrop1').attr('data');
  320. if (!dy) {
  321. $('#hint1').attr('hint-type', 'dy').html('未选择单元指标类型').show();
  322. return;
  323. }
  324. const bd = $('input[type=radio]:checked')[0];
  325. if (!bd) {
  326. $('#hint1').attr('hint-type', 'bd').html('未选择造价文件').show();
  327. return;
  328. }
  329. compareObj.data = JSON.parse(dy);
  330. const lib_data = JSON.parse(bd.getAttribute('lib-data'));
  331. compareObj.data.lib_id = lib_data.id;
  332. compareObj.data.lib_name = lib_data.filename;
  333. if (compareObj.data.xMatch) {
  334. compareObj.loadParentNode();
  335. } else {
  336. compareObj.load();
  337. }
  338. });
  339. $('#search-x').click(function () {
  340. const keyword = $('#x-keyword').val();
  341. if (keyword === '') return;
  342. const tr = $('tr', '#x-list');
  343. tr.removeClass('table-warning');
  344. for (const r of tr) {
  345. const name = r.children[2].innerText;
  346. if (name.indexOf(keyword) >= 0) {
  347. $('#hint2').hide();
  348. r.classList.add('table-warning');
  349. return;
  350. }
  351. }
  352. $('#hint2').html('未能搜索到匹配项').show();
  353. });
  354. $('#select').click(function () {
  355. if (compareObj.data.xMatch) {
  356. if (!compareObj.lastData || compareObj.lastData.lib_id !== compareObj.data.lib_id || compareObj.lastData.name !== compareObj.data.name) {
  357. compareObj.loadParentNode();
  358. } else {
  359. $('#select-data').modal('show');
  360. }
  361. }
  362. });
  363. $('#select-ok').click(function () {
  364. const select = $('input[type=checkbox]:checked');
  365. if (select.length === 0) {
  366. $('#hint2').html('未选择对比项').show();
  367. return;
  368. }
  369. compareObj.data.selects = [];
  370. for (const s of select) {
  371. compareObj.data.selects.push(JSON.parse(s.getAttribute('x-data')));
  372. }
  373. compareObj.load();
  374. });
  375. });