sr_info.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. 'use strict';
  2. const AddRela = function (setting) {
  3. const tsObj = {
  4. setting,
  5. tenderSpread: null,
  6. tenderSheet: null,
  7. resultSpread: null,
  8. resultSheet: null,
  9. tenderSourceTree: null,
  10. trArray: [],
  11. _rebuildStageSelect: function () {
  12. const getItems = function (data) {
  13. if (!data) return [];
  14. const items = [];
  15. for (let i = 1; i <= data.stageCount; i++) {
  16. items.push({value: i, text: `第${i}期`});
  17. }
  18. return items;
  19. };
  20. for (let i = 0; i < tsObj.resultSheet.getRowCount(); i++) {
  21. const cellType2 = new spreadNS.CellTypes.ComboBox().itemHeight(10).editorValueType(spreadNS.CellTypes.EditorValueType.value).items(getItems(tsObj.trArray[i]));
  22. tsObj.resultSheet.getCell(i, 1).cellType(cellType2);
  23. }
  24. },
  25. _addTender: function (tender) {
  26. const tr = tsObj.trArray.find(x => { return x.tid === tender.tid; });
  27. const t = {tid: tender.tid, name: tender.name, stageCount: tender.stageCount};
  28. if (!tr) tsObj.trArray.push(t);
  29. return t;
  30. },
  31. _removeTender: function (tender) {
  32. const gri = tsObj.trArray.findIndex(function (x, i, arr) {
  33. return x.tid === tender.tid;
  34. });
  35. if (gri >= 0) tsObj.trArray.splice(gri, 1);
  36. },
  37. reloadResultData: function () {
  38. SpreadJsObj.reLoadSheetData(tsObj.resultSheet);
  39. this._rebuildStageSelect();
  40. },
  41. asButtonClicked: function (e, info) {
  42. if (!info.sheet.zh_setting) return;
  43. const col = info.sheet.zh_setting.cols[info.col];
  44. if (col.field !== 'selected') return;
  45. const node = SpreadJsObj.getSelectObject(info.sheet);
  46. node.selected = !node.selected;
  47. if (node.children && node.children.length > 0) {
  48. const posterity = tsObj.tenderSourceTree.getPosterity(node);
  49. for (const p of posterity) {
  50. p.selected = node.selected;
  51. if (!p.children || p.children.length === 0){
  52. if (p.selected) {
  53. tsObj._addTender(p);
  54. } else {
  55. tsObj._removeTender(p);
  56. }
  57. }
  58. }
  59. SpreadJsObj.reLoadRowData(info.sheet, info.row, posterity.length + 1);
  60. } else {
  61. if (node.selected) {
  62. if (tsObj.trArray.length > 0) {
  63. const orgTender = tsObj.tenderSourceTree.nodes.find(x => { return x.tid === tsObj.trArray[0].tid});
  64. orgTender.selected = false;
  65. tsObj._removeTender(orgTender);
  66. SpreadJsObj.reLoadRowData(info.sheet, tsObj.tenderSourceTree.getNodeIndex(orgTender), 1);
  67. }
  68. tsObj._addTender(node);
  69. } else {
  70. tsObj._removeTender(node);
  71. }
  72. SpreadJsObj.reLoadRowData(info.sheet, info.row, 1);
  73. }
  74. tsObj.reloadResultData();
  75. },
  76. arEditEnded: function (e, info) {
  77. const data = SpreadJsObj.getSelectObject(info.sheet);
  78. const col = info.sheet.zh_setting.cols[info.col];
  79. data[col.field] = info.sheet.getValue(info.row, info.col);
  80. },
  81. initTenderSelect: function () {
  82. if (this.tenderSpread) return;
  83. this.tenderSpread = SpreadJsObj.createNewSpread($('#ar-source-spread')[0]);
  84. this.tenderSheet = this.tenderSpread.getActiveSheet();
  85. SpreadJsObj.initSheet(this.tenderSheet, {
  86. cols: [
  87. {title: '选择', field: 'selected', hAlign: 1, width: 40, formatter: '@', cellType: 'checkbox'},
  88. {title: '名称', field: 'name', hAlign: 0, width: 180, formatter: '@', cellType: 'tree'},
  89. {title: '期数', field: 'phase', hAlign: 1, width: 60, formatter: '@'},
  90. {title: '审批状态', field: 'status', hAlign: 1, width: 60, formatter: '@'}
  91. ],
  92. emptyRows: 0,
  93. headRows: 1,
  94. headRowHeight: [32],
  95. defaultRowHeight: 21,
  96. headerFont: '12px 微软雅黑',
  97. font: '12px 微软雅黑',
  98. headColWidth: [0],
  99. selectedBackColor: '#fffacd',
  100. readOnly: true,
  101. });
  102. this.resultSpread = SpreadJsObj.createNewSpread($('#ar-result-spread')[0]);
  103. this.resultSheet = this.resultSpread.getActiveSheet();
  104. const resultSpreadSetting = {
  105. cols: [
  106. {title: '名称', colSpan: '1', rowSpan: '1', field: 'name', hAlign: 0, width: 180, formatter: '@', readOnly: true},
  107. {title: '可选期', colSpan: '1', rowSpan: '1', field: 'stage', hAlign: 0, width: 60},
  108. ],
  109. emptyRows: 0,
  110. headRows: 1,
  111. headRowHeight: [32],
  112. defaultRowHeight: 21,
  113. headerFont: '12px 微软雅黑',
  114. font: '12px 微软雅黑',
  115. headColWidth: [],
  116. getColor: function (sheet, data, row, col, defaultColor) {
  117. if (data) {
  118. return data.invalid ? '#ddd' : defaultColor;
  119. } else {
  120. return defaultColor;
  121. }
  122. }
  123. };
  124. SpreadJsObj.initSheet(this.resultSheet, resultSpreadSetting);
  125. this.tenderSpread.bind(spreadNS.Events.ButtonClicked, tsObj.asButtonClicked);
  126. this.resultSpread.bind(spreadNS.Events.EditEnded, tsObj.arEditEnded);
  127. postData(`/sp/${spid}/list/load2`, { type: 'stage' }, function (data) {
  128. tsObj.tenderSourceTree = Tender2Tree.convert(data.category, data.tenders, data.ledgerAuditConst, data.stageAuditConst);
  129. SpreadJsObj.loadSheetData(tsObj.tenderSheet, SpreadJsObj.DataType.Tree, tsObj.tenderSourceTree);
  130. SpreadJsObj.loadSheetData(tsObj.resultSheet, SpreadJsObj.DataType.Data, tsObj.trArray);
  131. });
  132. $('#add-rela-form').submit(function (e) {
  133. if (tsObj.trArray.length === 0 || !tsObj.trArray[0].stage) {
  134. e.preventDefault();
  135. } else {
  136. $('[name=ar_tid]').val(tsObj.trArray[0].tid);
  137. $('[name=ar_sorder]').val(tsObj.trArray[0].stage);
  138. }
  139. });
  140. // $('#add-rela-ok').click(function () {
  141. // if (tsObj.trArray.length > 0) {
  142. // postData(window.location.pathname + '/add', tsObj.trArray[0], result => {
  143. // tsObj.setting.afterLoad(result);
  144. // $('#add-rela').modal('hide');
  145. // });
  146. // } else {
  147. // $('#add-rela').modal('hide');
  148. // }
  149. // });
  150. }
  151. };
  152. $('#add-rela').on('shown.bs.modal', () => {
  153. tsObj.initTenderSelect();
  154. tsObj.trArray.length = 0;
  155. });
  156. const showSelect = function () {
  157. $('#add-rela-hint').hide();
  158. tsObj.trArray = [];
  159. $('#add-rela').modal('show');
  160. };
  161. return { showSelect }
  162. };
  163. $(document).ready(() => {
  164. autoFlashHeight();
  165. const addRela = AddRela();
  166. $.subMenu({
  167. menu: '#sub-menu', miniMenu: '#sub-mini-menu', miniMenuList: '#mini-menu-list',
  168. toMenu: '#to-menu', toMiniMenu: '#to-mini-menu',
  169. key: 'menu.1.0.0',
  170. miniHint: '#sub-mini-hint', hintKey: 'menu.hint.1.0.1',
  171. callback: function (info) {
  172. if (info.mini) {
  173. $('.panel-title').addClass('fluid');
  174. $('#sub-menu').removeClass('panel-sidebar');
  175. } else {
  176. $('.panel-title').removeClass('fluid');
  177. $('#sub-menu').addClass('panel-sidebar');
  178. }
  179. autoFlashHeight();
  180. }
  181. });
  182. $.divResizer({
  183. select: '#revise-right-spr',
  184. });
  185. // 展开收起标准清单
  186. $('a', '#side-menu').bind('click', function (e) {
  187. e.preventDefault();
  188. const tab = $(this), tabPanel = $(tab.attr('content'));
  189. const showSideTools = function (show) {
  190. const left = $('#left-view'), right = $('#right-view'), parent = left.parent();
  191. if (show) {
  192. right.show();
  193. autoFlashHeight();
  194. /**
  195. * right.show()后, parent被撑开成2倍left.height, 导致parent.width减少了10px
  196. * 第一次left.width调整后,parent的缩回left.height, 此时parent.width又增加了10px
  197. * 故需要通过最终的parent.width再计算一次left.width
  198. *
  199. * Q: 为什么不通过先计算left.width的宽度,以避免计算两次left.width?
  200. * A: 右侧工具栏不一定显示,当右侧工具栏显示过一次后,就必须使用parent和right来计算left.width
  201. *
  202. */
  203. //left.css('width', parent.width() - right.outerWidth());
  204. //left.css('width', parent.width() - right.outerWidth());
  205. const percent = 100 - right.outerWidth() /parent.width() * 100;
  206. left.css('width', percent + '%');
  207. } else {
  208. left.width(parent.width());
  209. right.hide();
  210. }
  211. };
  212. // 展开工具栏、切换标签
  213. if (!tab.hasClass('active')) {
  214. const close = $('.active', '#side-menu').length === 0;
  215. $('a', '#side-menu').removeClass('active');
  216. tab.addClass('active');
  217. $('.tab-content .tab-pane').removeClass('active');
  218. tabPanel.addClass('active');
  219. showSideTools(tab.hasClass('active'));
  220. } else {// 收起工具栏
  221. tab.removeClass('active');
  222. tabPanel.removeClass('active');
  223. showSideTools(tab.hasClass('active'));
  224. }
  225. });
  226. $('#sr-add').click(addRela.showSelect);
  227. $('[name=sr-del]').click(function() {
  228. $('[name=srid]', '#del-rela').val(this.getAttribute('srid'));
  229. $('#del-rela').modal('show');
  230. })
  231. });