ledger_bwtz.js 12 KB

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