contract_index.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. $(document).ready(function() {
  2. autoFlashHeight();
  3. const projectTreeObj = (function(setting){
  4. const ProjectTree = createNewPathTree('revise', setting.treeSetting);
  5. ProjectTree.loadDatas(setting.source);
  6. treeCalc.calculateAll(ProjectTree);
  7. const TableObj = $(setting.table);
  8. let tenderTreeShowLevel;
  9. const Utils = {
  10. getProgressHtml: function(total, yf, title = '') {
  11. if (total) {
  12. let yfP = ZhCalc.mul(ZhCalc.div(yf, total, 2), 100, 0);
  13. let other = Math.max(ZhCalc.sub(total, yf), 0);
  14. let otherP = Math.max(100 - yfP, 0);
  15. const html = '<div class="progress">' +
  16. '<div class="progress-bar bg-success" style="width: ' + yfP + '%;" data-placement="bottom" data-toggle="tooltip" data-original-title="'+ title + ':¥' + (yf || 0) + '">' + yfP + '%</div>' +
  17. '<div class="progress-bar bg-gray" style="width: ' + otherP + '%;" data-placement="bottom" data-toggle="tooltip" data-original-title="未完成:¥' + (other || 0) + '">' + otherP + '%</div>' +
  18. '</div>';
  19. return html;
  20. } else {
  21. return '';
  22. }
  23. },
  24. getRowTdHtml: function (node, tree) {
  25. const html = [];
  26. // 名称
  27. html.push('<td width="20%" class="in-' + node.tree_level + '">');
  28. if (node.is_folder) {
  29. if (node.children.length > 0) {
  30. html.push('<span onselectstart="return false" style="{-moz-user-select:none}" class="fold-switch mr-1" title="收起" id="'+ node.id +'"><i class="fa fa-minus-square-o"></i></span> <i class="fa fa-folder-o"></i> ', node.name);
  31. } else {
  32. html.push('<i class="fa fa-folder-o"></i> ', node.name);
  33. }
  34. } else {
  35. html.push(`<span class="text-muted mr-2">${tree.isLastSibling(node) ? '└' : '├'}</span>`);
  36. html.push('<a href="/sp/' + spid +'/contract/tender/'+ node.id +'/detail" name="name" id="' + node.id + '">', node.name, '</a>');
  37. }
  38. html.push('</td>');
  39. // 创建时间
  40. if (node.is_folder) {
  41. html.push(`<td class="text-center"></td>`);
  42. } else {
  43. html.push(`<td class="text-center">${moment(node.create_time).format('YYYY-MM-DD')}</td>`);
  44. }
  45. html.push(`<td class="text-center">${node.expenses_count || ''}</td>
  46. <td class="text-right">${node.expenses_total_price || ''}</td>
  47. <td>
  48. ${Utils.getProgressHtml(node.expenses_total_price, node.expenses_yf_price, '累计应付')}
  49. </td>
  50. <td class="text-center">${node.income_count || ''}</td>
  51. <td class="text-right">${node.income_total_price || ''}</td>
  52. <td>
  53. ${Utils.getProgressHtml(node.income_total_price, node.income_yf_price, '累计应回')}
  54. </td>`);
  55. // 操作
  56. if (is_admin) {
  57. html.push(`<td class="text-center">`);
  58. if (!node.is_folder) {
  59. html.push(`<a href="javascript:void(0);" data-toggle="modal" data-stid="${node.id}" class="btn btn-sm btn-outline-primary get-audits"> 成员管理</a>`);
  60. }
  61. html.push('</td>');
  62. }
  63. return html.join('');
  64. },
  65. getNodeTrHtml: function (node, tree) {
  66. const html = [];
  67. html.push(`<tr tree_id="${node.id}" draggable="true">`);
  68. html.push(Utils.getRowTdHtml(node, tree));
  69. html.push(`</tr>`);
  70. return html.join('');
  71. },
  72. reloadTable: function () {
  73. const html = [];
  74. for (const node of ProjectTree.nodes) {
  75. html.push(Utils.getNodeTrHtml(node, ProjectTree));
  76. }
  77. TableObj.html(html.join(''));
  78. },
  79. getSelectNode: function() {
  80. const selectId = $('tr.table-active').attr('tree_id');
  81. return selectId ? ProjectTree.getItems(selectId) : null;
  82. },
  83. getSelectNodeId: function() {
  84. const selectId = $('tr.table-active').attr('tree_id');
  85. return selectId || setting.treeSetting.rootId;
  86. },
  87. refreshTreeTable: function(result) {
  88. ProjectTree.loadDatas(result);
  89. if (ProjectTree.nodes.length > 0 && $('#no-project').length > 0) window.location.reload();
  90. Utils.reloadTable();
  91. },
  92. refreshRow: function(result) {
  93. const refreshData = ProjectTree.loadPostData(result);
  94. if (!refreshData.update) return;
  95. for (const u of refreshData.update) {
  96. $(`tr[tree_id=${u.id}]`).html(Utils.getRowTdHtml(u, ProjectTree));
  97. }
  98. },
  99. expandByLevel: function(level){
  100. ProjectTree.expandByLevel(level);
  101. for (const node of ProjectTree.nodes) {
  102. const tr = $(`tr[tree_id=${node.id}]`);
  103. if (node.expanded) {
  104. $('.fold-switch', tr).html(`<i class="fa fa-minus-square-o"></i>`);
  105. } else {
  106. $('.fold-switch', tr).html(`<i class="fa fa-plus-square-o"></i>`);
  107. }
  108. if (node.visible) {
  109. tr.show();
  110. } else {
  111. tr.hide();
  112. }
  113. }
  114. }
  115. };
  116. Utils.reloadTable();
  117. $('body').on('click', 'tr[tree_id]', function() {
  118. if ($(this).hasClass('table-active')) {
  119. $(this).removeClass('table-active');
  120. } else {
  121. $('tr[tree_id].table-active').removeClass('table-active');
  122. $(this).addClass('table-active');
  123. }
  124. // Utils.refreshAddButton();
  125. });
  126. $('body').on('dragstart', 'tr[tree_id]', function(e) {
  127. Utils.dragNode = ProjectTree.getItems(e.target.getAttribute('tree_id'));
  128. });
  129. $('body').on('drop', 'tr[tree_id]', function(e) {
  130. Utils.dropNode = ProjectTree.getItems(e.currentTarget.getAttribute('tree_id'));
  131. // Utils.dropTo();
  132. });
  133. $('body').on('dragover', 'tr[tree_id]', function(e) {
  134. const parent = ProjectTree.getItems(e.currentTarget.getAttribute('tree_id'));
  135. return !parent || !parent.is_folder || parent.tree_level > 3 || parent.id === Utils.dragNode.id;
  136. });
  137. $('body').on('click', '.fold-switch', function() {
  138. const id = this.getAttribute('id');
  139. const node = ProjectTree.getItems(id);
  140. ProjectTree.setExpanded(node, !node.expanded);
  141. const posterity = ProjectTree.getPosterity(node);
  142. if (node.expanded) {
  143. $(this).html(`<i class="fa fa-minus-square-o"></i>`);
  144. } else {
  145. $(this).html(`<i class="fa fa-plus-square-o"></i>`);
  146. }
  147. for (const p of posterity) {
  148. if (p.visible) {
  149. $(`tr[tree_id=${p.id}]`).show();
  150. } else {
  151. $(`tr[tree_id=${p.id}]`).hide();
  152. }
  153. }
  154. });
  155. const getChildrenLevel = function (node) {
  156. let iLevel = node.tree_level || 1;
  157. if (node.children && node.children.length > 0) {
  158. for (const c of node.children) {
  159. iLevel = Math.max(iLevel, getChildrenLevel(c));
  160. }
  161. }
  162. return iLevel;
  163. };
  164. tenderTreeShowLevel = $.cs_showLevel({
  165. selector: '#show-level',
  166. levels: [
  167. {
  168. type: 'sort', count: 5, visible_count: function () {
  169. return ProjectTree.children.map(getChildrenLevel).reduce((x, y) => { return Math.max(x, y); }, 0) - 1;
  170. }
  171. },
  172. {
  173. type: 'last', title: '最底层', visible: function () {
  174. const count = ProjectTree.children.map(getChildrenLevel).reduce((x, y) => { return Math.max(x, y); }, 0) - 1;
  175. return count > 0;
  176. }
  177. },
  178. ],
  179. showLevel: function (tag) {
  180. switch (tag) {
  181. case "1":
  182. case "2":
  183. case "3":
  184. case "4":
  185. case "5":
  186. Utils.expandByLevel(parseInt(tag));
  187. break;
  188. case "last":
  189. Utils.expandByLevel(20);
  190. break;
  191. default: return;
  192. }
  193. }
  194. });
  195. tenderTreeShowLevel.initShowLevel();
  196. tenderTreeShowLevel.refreshMenuVisible();
  197. return { ProjectTree, TableObj, ...Utils };
  198. })({
  199. treeSetting: { id: 'id', pid: 'tree_pid', level: 'tree_level', order: 'tree_order', rootId: '-1',
  200. keys: ['id', 'project_id'],
  201. calcFields: ['expenses_count', 'expenses_total_price', 'expenses_yf_price', 'income_count', 'income_total_price', 'income_yf_price'],
  202. },
  203. source: projectList,
  204. table: '#projectList',
  205. });
  206. });