ledger_bwtz.js 13 KB

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