ledger_bwtz.js 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. 'use strict';
  2. /**
  3. *
  4. *
  5. * @author Mai
  6. * @date
  7. * @version
  8. */
  9. $(document).ready(() => {
  10. let xmjSearch;
  11. autoFlashHeight();
  12. const xmjSpread = SpreadJsObj.createNewSpread($('#xmj-spread')[0]);
  13. const xmjSheet = xmjSpread.getActiveSheet();
  14. sjsSettingObj.setFxTreeStyle(xmjSpreadSetting, sjsSettingObj.FxTreeStyle.jz);
  15. if (thousandth) sjsSettingObj.setTpThousandthFormat(xmjSpreadSetting);
  16. SpreadJsObj.initSheet(xmjSheet, xmjSpreadSetting);
  17. const unitSpread = SpreadJsObj.createNewSpread($('#unit-spread')[0]);
  18. const unitSheet = unitSpread.getActiveSheet();
  19. if (thousandth) sjsSettingObj.setTpThousandthFormat(xmjSpreadSetting);
  20. SpreadJsObj.initSheet(unitSheet, unitSpreadSetting);
  21. const unitTreeObj = {
  22. loadCurUnitData: function () {
  23. const node = SpreadJsObj.getSelectObject(xmjSheet);
  24. SpreadJsObj.resetTopAndSelect(unitSheet);
  25. if (node && node.unitTree) {
  26. SpreadJsObj.loadSheetData(unitSheet, SpreadJsObj.DataType.Tree, node.unitTree);
  27. } else {
  28. SpreadJsObj.initSheet(unitSheet, unitSpreadSetting);
  29. }
  30. }
  31. };
  32. xmjSpread.bind(spreadNS.Events.SelectionChanged, function (e, info) {
  33. unitTreeObj.loadCurUnitData();
  34. });
  35. postData(window.location.pathname + '/load', {}, function (result) {
  36. const setting = {
  37. id: 'ledger_id',
  38. pid: 'ledger_pid',
  39. order: 'order',
  40. level: 'level',
  41. rootId: -1,
  42. fullPath: 'full_path',
  43. };
  44. const xmjTree = createNewPathTree('base', setting);
  45. xmjTree.loadDatas(result);
  46. for (const n of xmjTree.nodes) {
  47. if (n.unitTreeData) {
  48. n.unitTree = createNewPathTree('base', setting);
  49. n.unitTree.loadDatas(n.unitTreeData);
  50. }
  51. }
  52. SpreadJsObj.loadSheetData(xmjSheet, SpreadJsObj.DataType.Tree, xmjTree);
  53. unitTreeObj.loadCurUnitData();
  54. });
  55. $.subMenu({
  56. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  57. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  58. key: 'menu.1.0.0',
  59. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  60. callback: function (info) {
  61. if (info.mini) {
  62. $('.panel-title').addClass('fluid');
  63. $('#sub-menu').removeClass('panel-sidebar');
  64. } else {
  65. $('.panel-title').removeClass('fluid');
  66. $('#sub-menu').addClass('panel-sidebar');
  67. }
  68. autoFlashHeight();
  69. xmjSpread.refresh();
  70. unitSpread.refresh();
  71. }
  72. });
  73. // 加载上下窗口resizer
  74. $.divResizer({
  75. select: '#main-resize',
  76. callback: function () {
  77. xmjSpread.refresh();
  78. let bcontent = $(".bcontent-wrap") ? $(".bcontent-wrap").height() : 0;
  79. $(".sp-wrap").height(bcontent-30);
  80. unitSpread.refresh();
  81. }
  82. });
  83. $.divResizer({
  84. select: '#right-spr',
  85. callback: function () {
  86. xmjSpread.refresh();
  87. unitSpread.refresh();
  88. if (xmjSearch) {
  89. xmjSearch.spread.refresh();
  90. }
  91. }
  92. });
  93. $('a', '.side-menu').bind('click', function (e) {
  94. e.preventDefault();
  95. const tab = $(this), tabPanel = $(tab.attr('content'));
  96. const showSideTools = function (show) {
  97. const left = $('#left-view'), right = $('#right-view'), parent = left.parent();
  98. if (show) {
  99. right.show();
  100. autoFlashHeight();
  101. /**
  102. * right.show()后, parent被撑开成2倍left.height, 导致parent.width减少了10px
  103. * 第一次left.width调整后,parent的缩回left.height, 此时parent.width又增加了10px
  104. * 故需要通过最终的parent.width再计算一次left.width
  105. *
  106. * Q: 为什么不通过先计算left.width的宽度,以避免计算两次left.width?
  107. * A: 右侧工具栏不一定显示,当右侧工具栏显示过一次后,就必须使用parent和right来计算left.width
  108. *
  109. */
  110. //left.css('width', parent.width() - right.outerWidth());
  111. //left.css('width', parent.width() - right.outerWidth());
  112. const percent = 100 - right.outerWidth() /parent.width() * 100;
  113. left.css('width', percent + '%');
  114. } else {
  115. left.width(parent.width());
  116. right.hide();
  117. }
  118. };
  119. // 展开工具栏、切换标签
  120. if (!tab.hasClass('active')) {
  121. const close = $('.active', '#side-menu').length === 0;
  122. $('a', '#side-menu').removeClass('active');
  123. tab.addClass('active');
  124. $('.tab-content .tab-pane').removeClass('active');
  125. tabPanel.addClass('active');
  126. showSideTools(tab.hasClass('active'));
  127. if (tab.attr('content') === '#search' && !xmjSearch) {
  128. if (!xmjSearch) {
  129. xmjSearch = $.billsSearch({
  130. selector: '#search',
  131. searchSpread: xmjSpread,
  132. searchRangeStr: '项目节编号/名称',
  133. resultSpreadSetting: {
  134. cols: [
  135. {title: '项目节编号', field: 'code', hAlign: 0, width: 120, formatter: '@', readOnly: true},
  136. {title: '名称', field: 'name', width: 150, hAlign: 0, formatter: '@', readOnly: true},
  137. {title: '单位', field: 'unit', width: 50, hAlign: 1, formatter: '@', readOnly: true},
  138. {title: '台账金额', field: 'total_price', hAlign: 2, width: 80, readOnly: true},
  139. ],
  140. emptyRows: 0,
  141. headRows: 1,
  142. headRowHeight: [32],
  143. headColWidth: [30],
  144. defaultRowHeight: 21,
  145. headerFont: '12px 微软雅黑',
  146. font: '12px 微软雅黑',
  147. selectedBackColor: '#fffacd',
  148. },
  149. afterLocated: function () {
  150. unitTreeObj.loadCurUnitData();
  151. }
  152. });
  153. }
  154. xmjSearch.spread.refresh();
  155. }
  156. } else { // 收起工具栏
  157. tab.removeClass('active');
  158. tabPanel.removeClass('active');
  159. showSideTools(tab.hasClass('active'));
  160. }
  161. xmjSpread.refresh();
  162. unitSpread.refresh();
  163. });
  164. // 显示层次
  165. (function (select, sheet) {
  166. $(select).click(function () {
  167. const tag = $(this).attr('tag');
  168. const tree = sheet.zh_tree;
  169. if (!tree) return;
  170. switch (tag) {
  171. case "1":
  172. case "2":
  173. case "3":
  174. case "4":
  175. case "5":
  176. tree.expandByLevel(parseInt(tag));
  177. SpreadJsObj.refreshTreeRowVisible(sheet);
  178. break;
  179. case "last":
  180. tree.expandByCustom(() => { return true; });
  181. SpreadJsObj.refreshTreeRowVisible(sheet);
  182. break;
  183. }
  184. });
  185. })('a[name=showLevel]', xmjSheet);
  186. $('#exportBwtz').click(function () {
  187. const data = [];
  188. const setting = {
  189. cols: [
  190. {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 100, formatter: '@'},
  191. {title: '清单编号', colSpan: '1', rowSpan: '2', field: 'b_code', hAlign: 0, width: 70, formatter: '@'},
  192. {title: '名称', colSpan: '1', rowSpan: '2', field: 'name', hAlign: 0, width: 300, formatter: '@'},
  193. {title: '单位', colSpan: '1', rowSpan: '2', field: 'unit', hAlign: 1, width: 60, formatter: '@'},
  194. {title: '单价', colSpan: '1', rowSpan: '2', field: 'unit_price', hAlign: 2, width: 80, type: 'Number'},
  195. {title: '台账|数量', colSpan: '2|1', rowSpan: '1|1', field: 'quantity', hAlign: 2, width: 80, type: 'Number'},
  196. {title: '|金额', colSpan: '|1', rowSpan: '|1', field: 'total_price', hAlign: 2, width: 80, type: 'Number'},
  197. {title: '图(册)号', colSpan: '1', rowSpan: '2', field: 'drawing_code', hAlign: 0, width: 100, formatter: '@'},
  198. {title: '备注', colSpan: '1', rowSpan: '2', field: 'memo', hAlign: 0, width: 100, formatter: '@'},
  199. ],
  200. headRows: 2,
  201. headRowHeight: [25, 25],
  202. defaultRowHeight: 21,
  203. headerFont: 'bold 10px 微软雅黑',
  204. font: '10px 微软雅黑'
  205. };
  206. if (!xmjSheet.zh_tree) return;
  207. for (const node of xmjSheet.zh_tree.nodes) {
  208. data.push({
  209. code: node.code, b_code: node.b_code, name: node.name, unit: node.unit,
  210. unit_price: node.unit_price, quantity: node.quantity, total_price: node.total_price,
  211. drawing_code: node.drawing_code, memo: node.memo
  212. });
  213. if (node.unitTree) {
  214. for (const unitNode of node.unitTree.nodes) {
  215. data.push({
  216. code: unitNode.code, b_code: unitNode.b_code,
  217. name: unitNode.pos_name ? unitNode.pos_name : unitNode.name, unit: unitNode.unit,
  218. unit_price: unitNode.unit_price, quantity: unitNode.quantity, total_price: unitNode.total_price,
  219. drawing_code: unitNode.drawing_code_merge, memo: unitNode.memo_merge
  220. });
  221. }
  222. }
  223. }
  224. SpreadExcelObj.exportSimpleXlsxSheet(setting, data, $('h2')[0].innerHTML + "-部位台账.xlsx");
  225. });
  226. });